aontu 0.45.1 → 0.48.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 (68) hide show
  1. package/dist/aontu.js +5 -0
  2. package/dist/aontu.js.map +1 -1
  3. package/dist/cli.d.ts +9 -0
  4. package/dist/cli.js +203 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/err.js +1 -1
  7. package/dist/err.js.map +1 -1
  8. package/dist/hints.js +1 -0
  9. package/dist/hints.js.map +1 -1
  10. package/dist/lang.d.ts +1 -1
  11. package/dist/lang.js +45 -18
  12. package/dist/lang.js.map +1 -1
  13. package/dist/lsp-server.d.ts +14 -0
  14. package/dist/lsp-server.js +87 -0
  15. package/dist/lsp-server.js.map +1 -0
  16. package/dist/lsp.d.ts +71 -0
  17. package/dist/lsp.js +375 -0
  18. package/dist/lsp.js.map +1 -0
  19. package/dist/tsconfig.tsbuildinfo +1 -1
  20. package/dist/type.d.ts +1 -1
  21. package/dist/unify.js +31 -4
  22. package/dist/unify.js.map +1 -1
  23. package/dist/utility.js +9 -2
  24. package/dist/utility.js.map +1 -1
  25. package/dist/val/BagVal.js +20 -2
  26. package/dist/val/BagVal.js.map +1 -1
  27. package/dist/val/DisjunctVal.js +25 -16
  28. package/dist/val/DisjunctVal.js.map +1 -1
  29. package/dist/val/IntegerVal.js +1 -0
  30. package/dist/val/IntegerVal.js.map +1 -1
  31. package/dist/val/LowerFuncVal.d.ts +1 -1
  32. package/dist/val/LowerFuncVal.js +1 -1
  33. package/dist/val/LowerFuncVal.js.map +1 -1
  34. package/dist/val/MapVal.js +127 -16
  35. package/dist/val/MapVal.js.map +1 -1
  36. package/dist/val/NumberVal.js +7 -2
  37. package/dist/val/NumberVal.js.map +1 -1
  38. package/dist/val/OpBaseVal.d.ts +1 -1
  39. package/dist/val/OpBaseVal.js +1 -1
  40. package/dist/val/OpBaseVal.js.map +1 -1
  41. package/dist/val/ScalarVal.js +3 -1
  42. package/dist/val/ScalarVal.js.map +1 -1
  43. package/dist/val/Val.d.ts +2 -0
  44. package/dist/val/Val.js +16 -1
  45. package/dist/val/Val.js.map +1 -1
  46. package/dist/val/VarVal.js +5 -3
  47. package/dist/val/VarVal.js.map +1 -1
  48. package/package.json +25 -13
  49. package/src/aontu.ts +5 -0
  50. package/src/cli.ts +193 -0
  51. package/src/err.ts +1 -1
  52. package/src/hints.ts +2 -0
  53. package/src/lang.ts +46 -18
  54. package/src/lsp-server.ts +109 -0
  55. package/src/lsp.ts +486 -0
  56. package/src/type.ts +1 -1
  57. package/src/unify.ts +33 -4
  58. package/src/utility.ts +11 -2
  59. package/src/val/BagVal.ts +22 -2
  60. package/src/val/DisjunctVal.ts +27 -18
  61. package/src/val/IntegerVal.ts +1 -0
  62. package/src/val/LowerFuncVal.ts +1 -1
  63. package/src/val/MapVal.ts +138 -23
  64. package/src/val/NumberVal.ts +7 -2
  65. package/src/val/OpBaseVal.ts +1 -1
  66. package/src/val/ScalarVal.ts +3 -1
  67. package/src/val/Val.ts +18 -1
  68. package/src/val/VarVal.ts +6 -4
@@ -0,0 +1,87 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ /* Copyright (c) 2025 Richard Rodger, MIT License */
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ exports.FrameCodec = void 0;
6
+ // Aontu Language Server (stdio).
7
+ //
8
+ // aontu-lsp
9
+ //
10
+ // Speaks LSP over stdio (JSON-RPC with Content-Length framing) and
11
+ // publishes unification diagnostics as `.aontu` files are edited. This
12
+ // binary is intentionally thin: all protocol logic lives in the reusable
13
+ // library ./lsp (LspHandler + computeDiagnostics). See docs/lsp.md for
14
+ // editor configuration.
15
+ const lsp_1 = require("./lsp");
16
+ // A byte-level LSP framing codec: feed it incoming chunks, give it a
17
+ // handler, and it decodes Content-Length frames, dispatches them, and
18
+ // writes framed replies. Kept transport-injectable (write/onExit) so it
19
+ // can be unit-tested without real stdio.
20
+ class FrameCodec {
21
+ constructor(handler, write, onExit) {
22
+ this.handler = handler;
23
+ this.write = write;
24
+ this.onExit = onExit;
25
+ this.buffer = Buffer.alloc(0);
26
+ }
27
+ // Feed a chunk of incoming bytes; processes any complete frames.
28
+ push(chunk) {
29
+ this.buffer = Buffer.concat([this.buffer, chunk]);
30
+ this.drain();
31
+ }
32
+ // Called when the input stream ends.
33
+ end() {
34
+ this.onExit(this.handler.exitCode);
35
+ }
36
+ drain() {
37
+ for (;;) {
38
+ const headerEnd = this.buffer.indexOf('\r\n\r\n');
39
+ if (headerEnd < 0)
40
+ return;
41
+ const header = this.buffer.subarray(0, headerEnd).toString('ascii');
42
+ const match = /Content-Length:\s*(\d+)/i.exec(header);
43
+ if (null == match) {
44
+ // Malformed header block: skip past it and continue.
45
+ this.buffer = this.buffer.subarray(headerEnd + 4);
46
+ continue;
47
+ }
48
+ const length = parseInt(match[1], 10);
49
+ const bodyStart = headerEnd + 4;
50
+ if (this.buffer.length < bodyStart + length)
51
+ return; // need more bytes
52
+ const body = this.buffer.subarray(bodyStart, bodyStart + length).toString('utf8');
53
+ this.buffer = this.buffer.subarray(bodyStart + length);
54
+ let msg;
55
+ try {
56
+ msg = JSON.parse(body);
57
+ }
58
+ catch {
59
+ continue; // ignore unparseable frame
60
+ }
61
+ for (const out of this.handler.handle(msg)) {
62
+ this.send(out);
63
+ }
64
+ if (this.handler.shouldExit) {
65
+ this.onExit(this.handler.exitCode);
66
+ return;
67
+ }
68
+ }
69
+ }
70
+ send(out) {
71
+ const body = Buffer.from(JSON.stringify(out), 'utf8');
72
+ this.write(Buffer.from('Content-Length: ' + body.length + '\r\n\r\n', 'ascii'));
73
+ this.write(body);
74
+ }
75
+ }
76
+ exports.FrameCodec = FrameCodec;
77
+ function main() {
78
+ const handler = new lsp_1.LspHandler();
79
+ const codec = new FrameCodec(handler, (chunk) => process.stdout.write(chunk), (code) => process.exit(code));
80
+ process.stdin.on('data', (chunk) => codec.push(chunk));
81
+ process.stdin.on('end', () => codec.end());
82
+ }
83
+ // Only auto-run when invoked as a program, not when imported by tests.
84
+ if (require.main === module) {
85
+ main();
86
+ }
87
+ //# sourceMappingURL=lsp-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lsp-server.js","sourceRoot":"","sources":["../src/lsp-server.ts"],"names":[],"mappings":"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"}
package/dist/lsp.d.ts ADDED
@@ -0,0 +1,71 @@
1
+ import type { Val } from './type';
2
+ declare const SEVERITY_ERROR = 1;
3
+ declare const SEVERITY_WARNING = 2;
4
+ declare const SEVERITY_INFORMATION = 3;
5
+ declare const SEVERITY_HINT = 4;
6
+ declare const LSP_VERSION = "0.1.0";
7
+ type Position = {
8
+ line: number;
9
+ character: number;
10
+ };
11
+ type Range = {
12
+ start: Position;
13
+ end: Position;
14
+ };
15
+ type Diagnostic = {
16
+ range: Range;
17
+ severity: number;
18
+ code?: string;
19
+ source: string;
20
+ message: string;
21
+ };
22
+ type Message = {
23
+ jsonrpc?: string;
24
+ id?: number | string | null;
25
+ method?: string;
26
+ params?: any;
27
+ };
28
+ type OutMessage = {
29
+ jsonrpc: string;
30
+ id?: number | string | null;
31
+ method?: string;
32
+ params?: any;
33
+ result?: any;
34
+ error?: {
35
+ code: number;
36
+ message: string;
37
+ };
38
+ };
39
+ declare function computeDiagnostics(src: string, opts?: {
40
+ vars?: Record<string, Val>;
41
+ }): Diagnostic[];
42
+ type MarkupContent = {
43
+ kind: 'markdown' | 'plaintext';
44
+ value: string;
45
+ };
46
+ type Hover = {
47
+ contents: MarkupContent;
48
+ range?: Range;
49
+ };
50
+ declare function computeHover(src: string, position: Position): Hover | null;
51
+ type CompletionItem = {
52
+ label: string;
53
+ kind?: number;
54
+ detail?: string;
55
+ };
56
+ declare const COMPLETION_FUNCTION = 3;
57
+ declare const COMPLETION_KEYWORD = 14;
58
+ declare const BUILTIN_FUNCS: string[];
59
+ declare function computeCompletions(): CompletionItem[];
60
+ declare class LspHandler {
61
+ private docs;
62
+ private shutdownOK;
63
+ private exited;
64
+ get shouldExit(): boolean;
65
+ get exitCode(): number;
66
+ doc(uri: string): string | undefined;
67
+ handle(msg: Message): OutMessage[];
68
+ private publish;
69
+ }
70
+ export { computeDiagnostics, computeHover, computeCompletions, LspHandler, LSP_VERSION, BUILTIN_FUNCS, SEVERITY_ERROR, SEVERITY_WARNING, SEVERITY_INFORMATION, SEVERITY_HINT, COMPLETION_FUNCTION, COMPLETION_KEYWORD, };
71
+ export type { Position, Range, Diagnostic, Message, OutMessage, Hover, MarkupContent, CompletionItem, };
package/dist/lsp.js ADDED
@@ -0,0 +1,375 @@
1
+ "use strict";
2
+ /* Copyright (c) 2025 Richard Rodger, MIT License */
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.COMPLETION_KEYWORD = exports.COMPLETION_FUNCTION = exports.SEVERITY_HINT = exports.SEVERITY_INFORMATION = exports.SEVERITY_WARNING = exports.SEVERITY_ERROR = exports.BUILTIN_FUNCS = exports.LSP_VERSION = exports.LspHandler = void 0;
5
+ exports.computeDiagnostics = computeDiagnostics;
6
+ exports.computeHover = computeHover;
7
+ exports.computeCompletions = computeCompletions;
8
+ const aontu_1 = require("./aontu");
9
+ const err_1 = require("./err");
10
+ // LSP DiagnosticSeverity subset.
11
+ const SEVERITY_ERROR = 1;
12
+ exports.SEVERITY_ERROR = SEVERITY_ERROR;
13
+ const SEVERITY_WARNING = 2;
14
+ exports.SEVERITY_WARNING = SEVERITY_WARNING;
15
+ const SEVERITY_INFORMATION = 3;
16
+ exports.SEVERITY_INFORMATION = SEVERITY_INFORMATION;
17
+ const SEVERITY_HINT = 4;
18
+ exports.SEVERITY_HINT = SEVERITY_HINT;
19
+ // Reported to the client in the initialize response.
20
+ const LSP_VERSION = '0.1.0';
21
+ exports.LSP_VERSION = LSP_VERSION;
22
+ // Compute LSP diagnostics for a unit of Aontu source. A valid document —
23
+ // including a non-concrete schema such as `a:string` — returns an empty
24
+ // array; only genuine errors (conflicts, unresolved references, unknown
25
+ // functions, syntax errors) produce diagnostics.
26
+ function computeDiagnostics(src, opts) {
27
+ const aontu = new aontu_1.Aontu();
28
+ let root;
29
+ try {
30
+ const ac = aontu.ctx({ collect: true });
31
+ if (opts?.vars) {
32
+ Object.assign(ac.vars, opts.vars);
33
+ }
34
+ root = aontu.unify(src, { collect: true }, ac);
35
+ }
36
+ catch (err) {
37
+ // Hard parse/syntax failure: report a single diagnostic. jsonic
38
+ // errors may carry 1-based line/col; fall back to the document start.
39
+ return [parseErrorDiagnostic(err)];
40
+ }
41
+ const nils = [];
42
+ walkNils(root, nils, new Set());
43
+ return nils.map(nilToDiagnostic);
44
+ }
45
+ // Walk a unified Val tree collecting every NilVal exactly once. A NilVal
46
+ // in the result always represents an error; valid non-concrete values
47
+ // (scalar kinds, refs, conjuncts) are never NilVals.
48
+ function walkNils(v, out, seen) {
49
+ if (null == v || 'object' !== typeof v || true !== v.isVal)
50
+ return;
51
+ if (seen.has(v))
52
+ return;
53
+ seen.add(v);
54
+ if (v.isNil) {
55
+ out.push(v);
56
+ return;
57
+ }
58
+ const peg = v.peg;
59
+ if (Array.isArray(peg)) {
60
+ for (const c of peg)
61
+ walkNils(c, out, seen);
62
+ }
63
+ else if (null != peg && 'object' === typeof peg) {
64
+ for (const k in peg)
65
+ walkNils(peg[k], out, seen);
66
+ }
67
+ // Spread constraints live off-peg on Map/List Vals.
68
+ const spreadCj = v.spread?.cj;
69
+ if (spreadCj)
70
+ walkNils(spreadCj, out, seen);
71
+ }
72
+ // Convert a NilVal (1-based site row/col) to an LSP diagnostic (0-based
73
+ // line/character).
74
+ function nilToDiagnostic(nil) {
75
+ const row = nil.site?.row ?? -1;
76
+ const col = nil.site?.col ?? -1;
77
+ let start;
78
+ let end;
79
+ if (row >= 1 && col >= 1) {
80
+ start = { line: row - 1, character: col - 1 };
81
+ const len = labelLength(nil);
82
+ end = { line: row - 1, character: col - 1 + len };
83
+ }
84
+ else {
85
+ start = { line: 0, character: 0 };
86
+ end = { line: 0, character: 1 };
87
+ }
88
+ return {
89
+ range: { start, end },
90
+ severity: SEVERITY_ERROR,
91
+ code: nil.why,
92
+ source: 'aontu',
93
+ message: nilMessage(nil),
94
+ };
95
+ }
96
+ // Length (UTF-16 units, like LSP characters) of the offending value's
97
+ // canonical form, used to size the diagnostic range (minimum 1).
98
+ function labelLength(nil) {
99
+ const c = nil.primary?.canon;
100
+ return 'string' === typeof c && c.length > 0 ? c.length : 1;
101
+ }
102
+ // Build the human-readable message. Kept identical to the Go port's
103
+ // NilVal.Message() (go/val.go) so diagnostics match across
104
+ // implementations: "Cannot <attempt> value: X with value: Y\n<hint>".
105
+ function nilMessage(nil) {
106
+ if (nil.msg)
107
+ return nil.msg;
108
+ const attempt = nil.attempt ?? (null == nil.secondary ? 'resolve' : 'unify');
109
+ let msg = 'Cannot ' + attempt + ' value';
110
+ if (null != nil.primary) {
111
+ msg += ': ' + nil.primary.canon;
112
+ if (null != nil.secondary) {
113
+ msg += ' with value: ' + nil.secondary.canon;
114
+ }
115
+ }
116
+ const hint = (0, err_1.getHint)(nil.why, nil.details);
117
+ if (hint) {
118
+ msg += '\n' + hint;
119
+ }
120
+ return msg;
121
+ }
122
+ function parseErrorDiagnostic(err) {
123
+ // jsonic/AontuError may expose 1-based line/col.
124
+ const row = err?.lineNumber ?? err?.row ?? err?.line ?? -1;
125
+ const col = err?.column ?? err?.col ?? -1;
126
+ const start = row >= 1 && col >= 1
127
+ ? { line: row - 1, character: col - 1 }
128
+ : { line: 0, character: 0 };
129
+ return {
130
+ range: { start, end: { line: start.line, character: start.character + 1 } },
131
+ severity: SEVERITY_ERROR,
132
+ code: 'parse',
133
+ source: 'aontu',
134
+ message: ('string' === typeof err?.message ? err.message : String(err)),
135
+ };
136
+ }
137
+ // initialize result: advertise full-text document sync feeding diagnostics.
138
+ function initializeResult() {
139
+ return {
140
+ capabilities: {
141
+ // 1 = TextDocumentSyncKind.Full
142
+ textDocumentSync: 1,
143
+ hoverProvider: true,
144
+ completionProvider: {},
145
+ },
146
+ serverInfo: {
147
+ name: 'aontu-lsp',
148
+ version: LSP_VERSION,
149
+ },
150
+ };
151
+ }
152
+ function publishDiagnosticsMsg(uri, diagnostics) {
153
+ return {
154
+ jsonrpc: '2.0',
155
+ method: 'textDocument/publishDiagnostics',
156
+ params: { uri, diagnostics },
157
+ };
158
+ }
159
+ // Resolve the value under the cursor and describe it. Returns null when
160
+ // the position is not over a value with a known source location. Because
161
+ // hover reads the *unified* tree, a literal shows its resolved value and
162
+ // kind (e.g. a reference target resolves to the value it points at).
163
+ function computeHover(src, position) {
164
+ let root;
165
+ try {
166
+ root = new aontu_1.Aontu().unify(src, { collect: true });
167
+ }
168
+ catch {
169
+ return null;
170
+ }
171
+ const cands = [];
172
+ collectHoverCandidates(root, cands, new Set());
173
+ let best = null;
174
+ for (const c of cands) {
175
+ if (c.line === position.line &&
176
+ c.start <= position.character && position.character < c.end) {
177
+ // Most specific (smallest) span wins.
178
+ if (null == best || (c.end - c.start) < (best.end - best.start))
179
+ best = c;
180
+ }
181
+ }
182
+ if (null == best)
183
+ return null;
184
+ return {
185
+ contents: { kind: 'markdown', value: hoverMarkdown(best.val) },
186
+ range: {
187
+ start: { line: best.line, character: best.start },
188
+ end: { line: best.line, character: best.end },
189
+ },
190
+ };
191
+ }
192
+ function collectHoverCandidates(v, out, seen) {
193
+ if (null == v || 'object' !== typeof v || true !== v.isVal)
194
+ return;
195
+ if (seen.has(v))
196
+ return;
197
+ seen.add(v);
198
+ const row = v.site?.row ?? -1;
199
+ const col = v.site?.col ?? -1;
200
+ let canon = '';
201
+ try {
202
+ canon = v.canon;
203
+ }
204
+ catch {
205
+ canon = '';
206
+ }
207
+ // Hover targets concrete values (scalars, kinds, refs, …), not
208
+ // containers: a map/list source span is not reliably reconstructable
209
+ // from a single site, and the same restriction in the Go port keeps
210
+ // hover behaviour identical across implementations. The walk still
211
+ // recurses into containers below to reach their leaf values. Canon is
212
+ // single-line, so its length approximates the on-line source span.
213
+ if (row >= 1 && col >= 1 && canon.length > 0 && !canon.includes('\n') &&
214
+ !v.isMap && !v.isList) {
215
+ out.push({ val: v, line: row - 1, start: col - 1, end: col - 1 + canon.length });
216
+ }
217
+ const peg = v.peg;
218
+ if (Array.isArray(peg)) {
219
+ for (const c of peg)
220
+ collectHoverCandidates(c, out, seen);
221
+ }
222
+ else if (null != peg && 'object' === typeof peg) {
223
+ for (const k in peg)
224
+ collectHoverCandidates(peg[k], out, seen);
225
+ }
226
+ const spreadCj = v.spread?.cj;
227
+ if (spreadCj)
228
+ collectHoverCandidates(spreadCj, out, seen);
229
+ }
230
+ function hoverMarkdown(val) {
231
+ let canon = '';
232
+ try {
233
+ canon = val.canon;
234
+ }
235
+ catch {
236
+ canon = '';
237
+ }
238
+ return '```aontu\n' + canon + '\n```\n\n' + '*' + valKind(val) + '*';
239
+ }
240
+ // A short human description of a Val's kind, shown under the hover canon.
241
+ function valKind(val) {
242
+ if (val.isNil)
243
+ return 'error';
244
+ if (val.isScalarKind)
245
+ return 'type';
246
+ if (val.isMap)
247
+ return 'map';
248
+ if (val.isList)
249
+ return 'list';
250
+ if (val.isRef)
251
+ return 'reference';
252
+ if (val.isInteger)
253
+ return 'integer';
254
+ if (val.isNumber)
255
+ return 'number';
256
+ if (val.isString)
257
+ return 'string';
258
+ if (val.isBoolean)
259
+ return 'boolean';
260
+ if (val.isScalar)
261
+ return 'scalar';
262
+ return val.constructor.name.replace(/Val$/, '').toLowerCase();
263
+ }
264
+ // LSP CompletionItemKind subset.
265
+ const COMPLETION_FUNCTION = 3;
266
+ exports.COMPLETION_FUNCTION = COMPLETION_FUNCTION;
267
+ const COMPLETION_KEYWORD = 14;
268
+ exports.COMPLETION_KEYWORD = COMPLETION_KEYWORD;
269
+ // The twelve built-in functions. Kept in sync with the engine by
270
+ // `lsp.test.ts`, which asserts each is recognised and no others are.
271
+ const BUILTIN_FUNCS = [
272
+ 'close', 'copy', 'hide', 'key', 'lower', 'move',
273
+ 'open', 'path', 'pref', 'super', 'type', 'upper',
274
+ ];
275
+ exports.BUILTIN_FUNCS = BUILTIN_FUNCS;
276
+ // Scalar-kind and literal keywords.
277
+ const KIND_KEYWORDS = ['string', 'number', 'integer', 'boolean'];
278
+ const LITERAL_KEYWORDS = ['true', 'false', 'null', 'top'];
279
+ // Context-free completion: the built-in functions, scalar-kind keywords
280
+ // and literals. Clients filter by the typed prefix.
281
+ function computeCompletions() {
282
+ const out = [];
283
+ for (const f of BUILTIN_FUNCS) {
284
+ out.push({ label: f, kind: COMPLETION_FUNCTION, detail: 'Aontu built-in function' });
285
+ }
286
+ for (const k of KIND_KEYWORDS) {
287
+ out.push({ label: k, kind: COMPLETION_KEYWORD, detail: 'scalar kind' });
288
+ }
289
+ for (const k of LITERAL_KEYWORDS) {
290
+ out.push({ label: k, kind: COMPLETION_KEYWORD, detail: 'keyword' });
291
+ }
292
+ return out;
293
+ }
294
+ // Transport-agnostic LSP message dispatcher. Consumes decoded JSON-RPC
295
+ // messages and returns the messages to send back, tracking open document
296
+ // text and recomputing diagnostics on open/change/close. Not safe for
297
+ // concurrent use; drive it from a single loop (as the stdio server does).
298
+ class LspHandler {
299
+ constructor() {
300
+ this.docs = new Map();
301
+ this.shutdownOK = false;
302
+ this.exited = false;
303
+ }
304
+ // True once an `exit` notification has been received.
305
+ get shouldExit() { return this.exited; }
306
+ // Process exit code per the LSP spec: 0 if `shutdown` preceded `exit`,
307
+ // else 1.
308
+ get exitCode() { return this.shutdownOK ? 0 : 1; }
309
+ // Current text of an open document, or undefined.
310
+ doc(uri) { return this.docs.get(uri); }
311
+ // Process one incoming message, returning zero or more to send.
312
+ handle(msg) {
313
+ switch (msg.method) {
314
+ case 'initialize':
315
+ return [{ jsonrpc: '2.0', id: msg.id, result: initializeResult() }];
316
+ case 'initialized':
317
+ return [];
318
+ case 'shutdown':
319
+ this.shutdownOK = true;
320
+ return [{ jsonrpc: '2.0', id: msg.id, result: null }];
321
+ case 'exit':
322
+ this.exited = true;
323
+ return [];
324
+ case 'textDocument/didOpen': {
325
+ const td = msg.params?.textDocument;
326
+ if (null == td?.uri)
327
+ return [];
328
+ this.docs.set(td.uri, td.text ?? '');
329
+ return [this.publish(td.uri)];
330
+ }
331
+ case 'textDocument/didChange': {
332
+ const uri = msg.params?.textDocument?.uri;
333
+ const changes = msg.params?.contentChanges;
334
+ if (null == uri || !Array.isArray(changes) || 0 === changes.length)
335
+ return [];
336
+ // Full document sync: the last change holds the entire new text.
337
+ this.docs.set(uri, changes[changes.length - 1].text ?? '');
338
+ return [this.publish(uri)];
339
+ }
340
+ case 'textDocument/didClose': {
341
+ const uri = msg.params?.textDocument?.uri;
342
+ if (null == uri)
343
+ return [];
344
+ this.docs.delete(uri);
345
+ // Clear diagnostics for the closed document.
346
+ return [publishDiagnosticsMsg(uri, [])];
347
+ }
348
+ case 'textDocument/hover': {
349
+ const uri = msg.params?.textDocument?.uri;
350
+ const pos = msg.params?.position;
351
+ const text = null != uri ? this.docs.get(uri) : undefined;
352
+ const hover = (null != text && null != pos) ? computeHover(text, pos) : null;
353
+ return [{ jsonrpc: '2.0', id: msg.id, result: hover }];
354
+ }
355
+ case 'textDocument/completion':
356
+ return [{ jsonrpc: '2.0', id: msg.id, result: computeCompletions() }];
357
+ default:
358
+ // Unknown request (has an id): reply method-not-found. Unknown
359
+ // notification: ignore.
360
+ if (null != msg.id) {
361
+ return [{
362
+ jsonrpc: '2.0',
363
+ id: msg.id,
364
+ error: { code: -32601, message: 'method not found: ' + msg.method },
365
+ }];
366
+ }
367
+ return [];
368
+ }
369
+ }
370
+ publish(uri) {
371
+ return publishDiagnosticsMsg(uri, computeDiagnostics(this.docs.get(uri) ?? ''));
372
+ }
373
+ }
374
+ exports.LspHandler = LspHandler;
375
+ //# sourceMappingURL=lsp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lsp.js","sourceRoot":"","sources":["../src/lsp.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"root":["../src/aontu.ts","../src/ctx.ts","../src/err.ts","../src/hints.ts","../src/lang.ts","../src/site.ts","../src/type.ts","../src/unify.ts","../src/utility.ts","../src/val/bagval.ts","../src/val/booleanval.ts","../src/val/closefuncval.ts","../src/val/conjunctval.ts","../src/val/copyfuncval.ts","../src/val/disjunctval.ts","../src/val/expectval.ts","../src/val/featureval.ts","../src/val/funcbaseval.ts","../src/val/hidefuncval.ts","../src/val/integerval.ts","../src/val/junctionval.ts","../src/val/keyfuncval.ts","../src/val/listval.ts","../src/val/lowerfuncval.ts","../src/val/mapval.ts","../src/val/movefuncval.ts","../src/val/nilval.ts","../src/val/nullval.ts","../src/val/numberval.ts","../src/val/opbaseval.ts","../src/val/openfuncval.ts","../src/val/pathfuncval.ts","../src/val/plusopval.ts","../src/val/preffuncval.ts","../src/val/prefval.ts","../src/val/refval.ts","../src/val/scalarkindval.ts","../src/val/scalarval.ts","../src/val/stringval.ts","../src/val/superfuncval.ts","../src/val/topval.ts","../src/val/typefuncval.ts","../src/val/upperfuncval.ts","../src/val/val.ts","../src/val/varval.ts","../src/val/top.ts","../src/val/valutil.ts"],"version":"6.0.3"}
1
+ {"root":["../src/aontu.ts","../src/cli.ts","../src/ctx.ts","../src/err.ts","../src/hints.ts","../src/lang.ts","../src/lsp-server.ts","../src/lsp.ts","../src/site.ts","../src/type.ts","../src/unify.ts","../src/utility.ts","../src/val/bagval.ts","../src/val/booleanval.ts","../src/val/closefuncval.ts","../src/val/conjunctval.ts","../src/val/copyfuncval.ts","../src/val/disjunctval.ts","../src/val/expectval.ts","../src/val/featureval.ts","../src/val/funcbaseval.ts","../src/val/hidefuncval.ts","../src/val/integerval.ts","../src/val/junctionval.ts","../src/val/keyfuncval.ts","../src/val/listval.ts","../src/val/lowerfuncval.ts","../src/val/mapval.ts","../src/val/movefuncval.ts","../src/val/nilval.ts","../src/val/nullval.ts","../src/val/numberval.ts","../src/val/opbaseval.ts","../src/val/openfuncval.ts","../src/val/pathfuncval.ts","../src/val/plusopval.ts","../src/val/preffuncval.ts","../src/val/prefval.ts","../src/val/refval.ts","../src/val/scalarkindval.ts","../src/val/scalarval.ts","../src/val/stringval.ts","../src/val/superfuncval.ts","../src/val/topval.ts","../src/val/typefuncval.ts","../src/val/upperfuncval.ts","../src/val/val.ts","../src/val/varval.ts","../src/val/top.ts","../src/val/valutil.ts"],"version":"6.0.3"}
package/dist/type.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import * as Fs from 'node:fs';
2
- import { Resolver } from '@jsonic/multisource';
2
+ import { Resolver } from '@tabnas/multisource';
3
3
  import { Val, DONE, SPREAD } from './val/Val';
4
4
  import type { ValMark, ValSpec } from './val/Val';
5
5
  type FST = typeof Fs;
package/dist/unify.js CHANGED
@@ -130,13 +130,39 @@ const unite = (ctx, a, b, whence) => {
130
130
  // because the branch that set `out = X.unify(Y, ctx)` already
131
131
  // ran that Val's own unify logic.
132
132
  if (!out.done && !unified) {
133
- out = out.unify((0, top_1.top)(), te ? ctx.clone({ explain: (0, utility_1.ec)(te, 'ND') }) : ctx);
134
- why += 'T';
133
+ // Once per pass per (Val, path): within a single fixpoint pass
134
+ // nothing external to the subtree changes, so repeating the TOP
135
+ // self-unify — which conjunct folds otherwise trigger once per
136
+ // fold term — is pure re-work, and on large models (hundreds of
137
+ // sibling terms) the repeats trip the MAXCYCLE guard as a false
138
+ // positive. The path is part of the key: a shared Val can
139
+ // resolve path-dependent content differently per location.
140
+ if (undefined !== ctx.cc
141
+ && out._tcc === ctx.cc && out._tpi === ctx.pathidx) {
142
+ why += 't';
143
+ }
144
+ else {
145
+ out = out.unify((0, top_1.top)(), te ? ctx.clone({ explain: (0, utility_1.ec)(te, 'ND') }) : ctx);
146
+ if (!out.done && undefined !== ctx.cc) {
147
+ ;
148
+ out._tcc = ctx.cc;
149
+ out._tpi = ctx.pathidx;
150
+ }
151
+ why += 'T';
152
+ }
135
153
  }
136
154
  }
137
155
  catch (err) {
138
- // TODO: handle unexpected
139
- out = (0, err_1.makeNilErr)(ctx, 'internal', a, b);
156
+ // This catch-all converts an unexpected exception into an 'internal'
157
+ // Nil so one bad node doesn't crash a whole unify. To avoid fully
158
+ // masking regressions, preserve the original error message (and a
159
+ // RangeError flag — i.e. stack overflow from runaway recursion) on
160
+ // the Nil's details so it surfaces in the formatted error rather
161
+ // than vanishing. See err.ts (descErr) for how details render.
162
+ out = (0, err_1.makeNilErr)(ctx, 'internal', a, b, undefined, {
163
+ error: String(err?.message ?? err),
164
+ ...(err instanceof RangeError ? { overflow: true } : {}),
165
+ });
140
166
  }
141
167
  }
142
168
  ctx.explain && (0, utility_1.explainClose)(te, out);
@@ -183,6 +209,7 @@ class Unify {
183
209
  // uctx.seterr(this.err)
184
210
  uctx.err = this.err;
185
211
  uctx.explain = this.explain;
212
+ uctx.snapmap = new Map();
186
213
  const explain = null == ctx?.explain ? undefined : ctx?.explain;
187
214
  const te = explain && (0, utility_1.explainOpen)(uctx, explain, 'root', res);
188
215
  // NOTE: if true === res.done already, then this loop never needs to run.