@corenel/ui-kit 0.1.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.
@@ -0,0 +1,218 @@
1
+ /* Monaco language support for .prmd — tokenizer (YAML frontmatter + markdown
2
+ * body + jinja tokens), editor themes matching the app palette, a completion
3
+ * provider fed per-model with TemplateVars, and marker-based diagnostics from
4
+ * lib/templateRefs. Registered once against the app's bundled Monaco instance
5
+ * (lib/monaco.ts). */
6
+ import * as monaco from 'monaco-editor/esm/vs/editor/editor.api';
7
+ import { completionContext, lintTemplateRefs } from './templateRefs';
8
+ import { registerLanguageExtension } from './languages';
9
+ export const PRMD_LANG = 'prmd';
10
+ export const PRMD_THEME_LIGHT = 'prompd-light';
11
+ export const PRMD_THEME_DARK = 'prompd-dark';
12
+ /** Completable vars per model — the provider is global, the vars are not. */
13
+ const modelVars = new WeakMap();
14
+ export function setPrmdTemplateVars(model, vars) {
15
+ modelVars.set(model, vars);
16
+ }
17
+ /** Lint unknown `{{ refs }}` against `known` and surface them as error markers
18
+ * (squiggly + hover message + problems affordances, all native Monaco). */
19
+ export function applyPrmdMarkers(model, known) {
20
+ const diags = lintTemplateRefs(model.getValue(), known.map((v) => v.name));
21
+ monaco.editor.setModelMarkers(model, PRMD_LANG, diags.map((d) => {
22
+ const s = model.getPositionAt(d.start);
23
+ const e = model.getPositionAt(d.end);
24
+ return {
25
+ severity: monaco.MarkerSeverity.Error,
26
+ message: d.message,
27
+ startLineNumber: s.lineNumber,
28
+ startColumn: s.column,
29
+ endLineNumber: e.lineNumber,
30
+ endColumn: e.column,
31
+ };
32
+ }));
33
+ }
34
+ export function clearPrmdMarkers(model) {
35
+ monaco.editor.setModelMarkers(model, PRMD_LANG, []);
36
+ }
37
+ let registered = false;
38
+ export function ensurePrmdLanguage() {
39
+ if (registered)
40
+ return;
41
+ registered = true;
42
+ monaco.languages.register({ id: PRMD_LANG, extensions: ['.prmd'] });
43
+ monaco.languages.setLanguageConfiguration(PRMD_LANG, {
44
+ comments: { blockComment: ['{#', '#}'] },
45
+ brackets: [['{', '}'], ['[', ']'], ['(', ')']],
46
+ autoClosingPairs: [
47
+ { open: '{', close: '}' },
48
+ { open: '[', close: ']' },
49
+ { open: '(', close: ')' },
50
+ { open: '"', close: '"', notIn: ['string'] },
51
+ { open: "'", close: "'", notIn: ['string'] },
52
+ ],
53
+ surroundingPairs: [
54
+ { open: '{', close: '}' },
55
+ { open: '[', close: ']' },
56
+ { open: '(', close: ')' },
57
+ { open: '"', close: '"' },
58
+ { open: "'", close: "'" },
59
+ { open: '*', close: '*' },
60
+ { open: '`', close: '`' },
61
+ ],
62
+ });
63
+ // Frontmatter only at the top of the document (leading blank lines allowed),
64
+ // mirroring the runtime parser: root waits for the first fence or any other
65
+ // content, then commits to @frontmatter or @body for the rest of the file.
66
+ monaco.languages.setMonarchTokensProvider(PRMD_LANG, {
67
+ defaultToken: '',
68
+ tokenizer: {
69
+ root: [
70
+ [/^---\s*$/, { token: 'meta.fence', next: '@frontmatter' }],
71
+ [/^\s+$/, ''],
72
+ [/./, { token: '@rematch', next: '@body' }],
73
+ ],
74
+ frontmatter: [
75
+ [/^---\s*$/, { token: 'meta.fence', next: '@body' }],
76
+ { include: '@jinja' },
77
+ [/(^|\s)#.*$/, 'comment'],
78
+ [/^[ \t]*(?:-[ \t]+)?[\w.-]+(?=\s*:)/, 'type'],
79
+ [/"[^"]*"|'[^']*'/, 'string'],
80
+ [/\b\d+(\.\d+)?\b/, 'number'],
81
+ [/\b(true|false|null)\b/, 'keyword'],
82
+ ],
83
+ body: [
84
+ { include: '@jinja' },
85
+ [/^#{1,6}\s.*$/, 'md.header'],
86
+ [/\*\*[^*]+\*\*/, 'md.bold'],
87
+ [/`[^`]+`/, 'md.code'],
88
+ [/^\s*(?:[-*]|\d+\.)(?=\s)/, 'md.list'],
89
+ ],
90
+ jinja: [
91
+ [/\{#.*?#\}/, 'jinja.comment'],
92
+ [/\{\{.*?\}\}/, 'jinja.var'],
93
+ [/\{%.*?%\}/, 'jinja.tag'],
94
+ ],
95
+ },
96
+ });
97
+ // Palettes mirror the app's highlighter colors (styles/app.css .jv/.jt/.h/...).
98
+ monaco.editor.defineTheme(PRMD_THEME_LIGHT, {
99
+ base: 'vs',
100
+ inherit: true,
101
+ rules: [
102
+ { token: 'meta.fence', foreground: '9aa3af' },
103
+ { token: 'jinja.var', foreground: 'b45309', fontStyle: 'bold' },
104
+ { token: 'jinja.tag', foreground: '6d28d9' },
105
+ { token: 'jinja.comment', foreground: '9aa3af', fontStyle: 'italic' },
106
+ { token: 'md.header', foreground: '2563eb', fontStyle: 'bold' },
107
+ { token: 'md.bold', fontStyle: 'bold' },
108
+ { token: 'md.code', foreground: 'b45309' },
109
+ { token: 'md.list', foreground: '7c3aed' },
110
+ ],
111
+ colors: { 'editor.background': '#f7f8fb' },
112
+ });
113
+ monaco.editor.defineTheme(PRMD_THEME_DARK, {
114
+ base: 'vs-dark',
115
+ inherit: true,
116
+ rules: [
117
+ { token: 'meta.fence', foreground: '6b7280' },
118
+ { token: 'jinja.var', foreground: 'fbbf24', fontStyle: 'bold' },
119
+ { token: 'jinja.tag', foreground: 'c4b5fd' },
120
+ { token: 'jinja.comment', foreground: '6b7280', fontStyle: 'italic' },
121
+ { token: 'md.header', foreground: '93c5fd', fontStyle: 'bold' },
122
+ { token: 'md.bold', fontStyle: 'bold' },
123
+ { token: 'md.code', foreground: 'fbbf24' },
124
+ { token: 'md.list', foreground: 'c4b5fd' },
125
+ ],
126
+ colors: { 'editor.background': '#0a0f1a' },
127
+ });
128
+ monaco.languages.registerCompletionItemProvider(PRMD_LANG, {
129
+ triggerCharacters: ['{', ' '],
130
+ provideCompletionItems(model, position) {
131
+ const vars = modelVars.get(model);
132
+ if (!vars?.length)
133
+ return { suggestions: [] };
134
+ // ' ' is a trigger char, so this runs on every space typed in prose —
135
+ // bail on the current line alone before materializing the whole doc.
136
+ const line = model.getLineContent(position.lineNumber);
137
+ if (!line.includes('{{') && !line.includes('{%'))
138
+ return { suggestions: [] };
139
+ const ctx = completionContext(model.getValue(), model.getOffsetAt(position));
140
+ if (!ctx)
141
+ return { suggestions: [] };
142
+ const start = model.getPositionAt(ctx.start);
143
+ const range = new monaco.Range(start.lineNumber, start.column, position.lineNumber, position.column);
144
+ const closer = ctx.opener === '{{' && !ctx.closed ? ' }}' : '';
145
+ return {
146
+ suggestions: vars.map((v, i) => ({
147
+ label: v.name,
148
+ kind: monaco.languages.CompletionItemKind.Variable,
149
+ detail: v.detail,
150
+ documentation: v.doc,
151
+ insertText: v.name + closer,
152
+ range,
153
+ sortText: String(i).padStart(3, '0'),
154
+ })),
155
+ };
156
+ },
157
+ });
158
+ // Hover over a `{{ param }}` (or `{% … param … %}`) token shows the parameter's
159
+ // type + description — the same per-model vars the completion provider uses, so
160
+ // it covers every declared parameter, not just a fixed set.
161
+ monaco.languages.registerHoverProvider(PRMD_LANG, {
162
+ provideHover(model, position) {
163
+ const vars = modelVars.get(model);
164
+ if (!vars?.length)
165
+ return null;
166
+ const word = model.getWordAtPosition(position);
167
+ if (!word)
168
+ return null;
169
+ const v = vars.find((x) => x.name === word.word);
170
+ if (!v)
171
+ return null;
172
+ // Only when the word actually sits inside a jinja expression on this line —
173
+ // not a prose word that happens to share a parameter's name.
174
+ const line = model.getLineContent(position.lineNumber);
175
+ const start = word.startColumn - 1;
176
+ const end = word.endColumn - 1;
177
+ let inExpr = false;
178
+ for (const m of line.matchAll(/\{\{[\s\S]*?\}\}|\{%[\s\S]*?%\}/g)) {
179
+ const s = m.index ?? 0;
180
+ if (start >= s && end <= s + m[0].length) {
181
+ inExpr = true;
182
+ break;
183
+ }
184
+ }
185
+ if (!inExpr)
186
+ return null;
187
+ const contents = [
188
+ { value: `**${v.name}**${v.detail ? ` — _${v.detail}_` : ''}` },
189
+ ];
190
+ if (v.doc)
191
+ contents.push({ value: v.doc });
192
+ return {
193
+ range: new monaco.Range(position.lineNumber, word.startColumn, position.lineNumber, word.endColumn),
194
+ contents,
195
+ };
196
+ },
197
+ });
198
+ }
199
+ // .prmd is one of corenel's native formats — register it as a default language
200
+ // extension so the language-agnostic editor installs it via the registry, and
201
+ // expose its per-model assist (param completions + unknown-ref markers) so the
202
+ // editor delegates by language id rather than hardcoding prmd.
203
+ registerLanguageExtension({
204
+ id: PRMD_LANG,
205
+ extensions: ['.prmd'],
206
+ register: () => ensurePrmdLanguage(),
207
+ assist: {
208
+ sync(model, assist) {
209
+ const a = (assist ?? null);
210
+ setPrmdTemplateVars(model, a?.vars ?? []);
211
+ if (a?.lint)
212
+ applyPrmdMarkers(model, a.vars);
213
+ else
214
+ clearPrmdMarkers(model);
215
+ },
216
+ },
217
+ });
218
+ //# sourceMappingURL=prmdLanguage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prmdLanguage.js","sourceRoot":"","sources":["../prmdLanguage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,69 @@
1
+ /** One identifier reference found in a template expression (global offsets). */
2
+ export interface TemplateRef {
3
+ name: string;
4
+ start: number;
5
+ end: number;
6
+ }
7
+ /** A completable name: a .prmd parameter or a workflow state field. Shared by
8
+ * the Monaco completion provider and the lightweight textarea popup. */
9
+ export interface TemplateVar {
10
+ name: string;
11
+ /** Short kind/type tag ("string", "param", "node output"). */
12
+ detail?: string;
13
+ /** One-line description (param description / node label). */
14
+ doc?: string;
15
+ }
16
+ /** A reference whose root is not declared anywhere the linter knows about. */
17
+ export interface TemplateDiagnostic {
18
+ name: string;
19
+ start: number;
20
+ end: number;
21
+ message: string;
22
+ }
23
+ /** Offset where the body starts (after the closing frontmatter fence), or 0
24
+ * when there is no frontmatter. Mirrors highlightPrmd's fence detection. */
25
+ export declare function bodyStart(source: string): number;
26
+ /** All identifier references + locally declared names ({% for %}, {% set %})
27
+ * in the template body of `source`. */
28
+ export declare function extractTemplateRefs(source: string): {
29
+ refs: TemplateRef[];
30
+ declared: Set<string>;
31
+ };
32
+ /** References whose root is not in `known`, not locally declared, and not a
33
+ * builtin — the squiggly set. */
34
+ export declare function lintTemplateRefs(source: string, known: Iterable<string>, message?: (name: string) => string): TemplateDiagnostic[];
35
+ /** Where completion applies at `caret`: inside an unclosed-or-closed `{{ }}` /
36
+ * `{% %}` expression on the current line, with the identifier prefix typed so
37
+ * far. Null = no completion here (outside a token, in a filter, after a dot,
38
+ * still inside the tag word, or in the frontmatter). */
39
+ export interface CompletionContext {
40
+ /** Global offset where the prefix starts (replace [start, caret)). */
41
+ start: number;
42
+ prefix: string;
43
+ opener: '{{' | '{%';
44
+ /** Whether the token is already closed later on this line. */
45
+ closed: boolean;
46
+ /** True when the expression before the prefix is empty (just opened a token). */
47
+ atExprStart: boolean;
48
+ }
49
+ export declare function completionContext(source: string, caret: number): CompletionContext | null;
50
+ /** What an editor surface needs for a templated doc: `vars` feeds the `{{ }}`
51
+ * completion provider; `lint` adds error squigglies on unknown references. */
52
+ export interface EditorAssist {
53
+ vars: TemplateVar[];
54
+ lint?: boolean;
55
+ }
56
+ /** Build the editor assistance for a parsed .prmd doc (null for other files).
57
+ * Single source for every editor surface so they can't drift. When the doc
58
+ * declares `inherits:` or `using:`, parameters may come from files the client
59
+ * hasn't resolved (that resolution is backend-side), so the local declared-set
60
+ * is incomplete — completions stay, lint stands down to avoid false errors. */
61
+ export declare function buildPrmdAssist(fileName: string, parsed: {
62
+ params: Array<{
63
+ name: string;
64
+ type?: string;
65
+ description?: string;
66
+ }>;
67
+ meta: Record<string, unknown>;
68
+ }): EditorAssist | null;
69
+ //# sourceMappingURL=templateRefs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templateRefs.d.ts","sourceRoot":"","sources":["../templateRefs.ts"],"names":[],"mappings":"AASA,gFAAgF;AAChF,MAAM,WAAW,WAAW;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE;AAEzE;wEACwE;AACxE,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,8DAA8D;IAC9D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,6DAA6D;IAC7D,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,8EAA8E;AAC9E,MAAM,WAAW,kBAAkB;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE;AAejG;4EAC4E;AAC5E,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAgBhD;AAoCD;uCACuC;AACvC,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,WAAW,EAAE,CAAC;IAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;CAAE,CAqDlG;AAED;iCACiC;AACjC,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,EACvB,OAAO,GAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAoD,GAC9E,kBAAkB,EAAE,CAStB;AAED;;;wDAGwD;AACxD,MAAM,WAAW,iBAAiB;IAChC,sEAAsE;IACtE,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,IAAI,GAAG,IAAI,CAAC;IACpB,8DAA8D;IAC9D,MAAM,EAAE,OAAO,CAAC;IAChB,iFAAiF;IACjF,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI,CA2CzF;AAID;8EAC8E;AAC9E,MAAM,WAAW,YAAY;IAAG,IAAI,EAAE,WAAW,EAAE,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE;AAYrE;;;;+EAI+E;AAC/E,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE;IAAE,MAAM,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,GAC9G,YAAY,GAAG,IAAI,CASrB"}
@@ -0,0 +1,238 @@
1
+ /* Static analysis of the Jinja/Nunjucks template syntax in .prmd bodies and
2
+ * .pdflow node templates — pure string work, no compiler involved. Powers the
3
+ * editor's parameter completions and unknown-reference squigglies. It is a
4
+ * deliberately small approximation of the real engine: identifier ROOTS only
5
+ * (`user.name` references `user`), filters and their arguments are ignored,
6
+ * and `{% for %}` / `{% set %}` declarations count as known everywhere (no
7
+ * block scoping). False negatives are fine; false positives erode trust.
8
+ */
9
+ /** Expression-language words that are never variable references. */
10
+ const KEYWORDS = new Set([
11
+ 'if', 'elif', 'else', 'endif', 'for', 'endfor', 'in', 'and', 'or', 'not', 'is',
12
+ 'set', 'endset', 'true', 'false', 'none', 'null', 'True', 'False', 'None',
13
+ ]);
14
+ /** Names that are always available: Nunjucks globals + the loop variable + the
15
+ * workflow-context names a .prmd legitimately uses when run inside a .pdflow. */
16
+ const BUILTINS = new Set(['loop', 'range', 'cycler', 'joiner', 'input', 'previous_output']);
17
+ const TOKEN_RE = /\{\{[\s\S]*?\}\}|\{%[\s\S]*?%\}|\{#[\s\S]*?#\}/g;
18
+ const IDENT_RE = /[A-Za-z_][A-Za-z0-9_]*/g;
19
+ /** Offset where the body starts (after the closing frontmatter fence), or 0
20
+ * when there is no frontmatter. Mirrors highlightPrmd's fence detection. */
21
+ export function bodyStart(source) {
22
+ const lines = source.split('\n');
23
+ let s1 = -1;
24
+ let offset = 0;
25
+ for (let i = 0; i < lines.length; i++) {
26
+ const isFence = lines[i].trim() === '---';
27
+ offset += lines[i].length + 1;
28
+ if (s1 === -1) {
29
+ if (isFence)
30
+ s1 = i;
31
+ else if (lines[i].trim() !== '')
32
+ return 0; // content before any fence — no frontmatter
33
+ }
34
+ else if (isFence) {
35
+ return Math.min(offset, source.length); // line after the closing fence
36
+ }
37
+ }
38
+ // Unterminated frontmatter is highlighted as YAML to the end — lint nothing.
39
+ return s1 === -1 ? 0 : source.length;
40
+ }
41
+ /** Neutralize whitespace-control dashes (`{%- ... -%}` / `{{- ... -}}`) in a
42
+ * token's inner text, preserving length so offsets stay valid. */
43
+ function stripWsControl(inner) {
44
+ let s = inner;
45
+ if (s.startsWith('-'))
46
+ s = ' ' + s.slice(1);
47
+ if (s.endsWith('-'))
48
+ s = s.slice(0, -1) + ' ';
49
+ return s;
50
+ }
51
+ /** Blank out string literals (preserving length) so identifier scans skip them. */
52
+ function stripStrings(expr) {
53
+ return expr.replace(/'(?:[^'\\]|\\.)*'|"(?:[^"\\]|\\.)*"/g, (m) => ' '.repeat(m.length));
54
+ }
55
+ /** Scan one expression for identifier roots. `base` is the expression's global
56
+ * offset. Attribute accesses (`x.attr`), keywords, and Jinja test names
57
+ * (`x is defined`, `y is not none`) are skipped. */
58
+ function scanExpr(expr, base, out) {
59
+ let clean = stripStrings(expr);
60
+ // `is [not] <test>` — the test word is a test name, not a variable.
61
+ clean = clean.replace(/\bis(\s+not)?\s+[A-Za-z_][A-Za-z0-9_]*/g, (m) => ' '.repeat(m.length));
62
+ IDENT_RE.lastIndex = 0;
63
+ let m;
64
+ while ((m = IDENT_RE.exec(clean))) {
65
+ const name = m[0];
66
+ if (KEYWORDS.has(name))
67
+ continue;
68
+ // Skip attribute access: the previous non-space char is a dot.
69
+ let p = m.index - 1;
70
+ while (p >= 0 && (clean[p] === ' ' || clean[p] === '\t'))
71
+ p--;
72
+ if (p >= 0 && clean[p] === '.')
73
+ continue;
74
+ out.push({ name, start: base + m.index, end: base + m.index + name.length });
75
+ }
76
+ }
77
+ /** All identifier references + locally declared names ({% for %}, {% set %})
78
+ * in the template body of `source`. */
79
+ export function extractTemplateRefs(source) {
80
+ const from = bodyStart(source);
81
+ const refs = [];
82
+ const declared = new Set();
83
+ TOKEN_RE.lastIndex = 0;
84
+ let m;
85
+ while ((m = TOKEN_RE.exec(source))) {
86
+ if (m.index < from)
87
+ continue;
88
+ const raw = m[0];
89
+ if (raw.startsWith('{#'))
90
+ continue;
91
+ if (raw.startsWith('{{')) {
92
+ let expr = stripWsControl(raw.slice(2, -2));
93
+ // Everything from the first filter pipe on is filter territory — skip it
94
+ // (filter args can be refs; missing those is an accepted false negative).
95
+ const pipe = stripStrings(expr).indexOf('|');
96
+ if (pipe >= 0)
97
+ expr = expr.slice(0, pipe);
98
+ scanExpr(expr, m.index + 2, refs);
99
+ continue;
100
+ }
101
+ // {% tag ... %} (whitespace-control dashes neutralized, length preserved)
102
+ const inner = stripWsControl(raw.slice(2, -2));
103
+ const tagMatch = /^\s*([A-Za-z_][A-Za-z0-9_]*)/.exec(inner);
104
+ if (!tagMatch)
105
+ continue;
106
+ const tag = tagMatch[1];
107
+ const afterTag = tagMatch.index + tagMatch[0].length;
108
+ if (tag === 'if' || tag === 'elif') {
109
+ scanExpr(inner.slice(afterTag), m.index + 2 + afterTag, refs);
110
+ }
111
+ else if (tag === 'for') {
112
+ const inAt = stripStrings(inner).search(/\bin\b/);
113
+ if (inAt > afterTag) {
114
+ // loop variables declare names; the iterable is a reference
115
+ for (const v of inner.slice(afterTag, inAt).split(',')) {
116
+ const name = v.trim();
117
+ if (/^[A-Za-z_][A-Za-z0-9_]*$/.test(name))
118
+ declared.add(name);
119
+ }
120
+ scanExpr(inner.slice(inAt + 2), m.index + 2 + inAt + 2, refs);
121
+ }
122
+ }
123
+ else if (tag === 'set') {
124
+ const rest = inner.slice(afterTag);
125
+ const setMatch = /^\s*([A-Za-z_][A-Za-z0-9_]*)\s*=([\s\S]*)$/.exec(rest);
126
+ if (setMatch) {
127
+ declared.add(setMatch[1]);
128
+ const rhsOffset = afterTag + setMatch[0].length - setMatch[2].length;
129
+ scanExpr(setMatch[2], m.index + 2 + rhsOffset, refs);
130
+ }
131
+ else {
132
+ // block form: {% set name %}...{% endset %}
133
+ const blockMatch = /^\s*([A-Za-z_][A-Za-z0-9_]*)\s*$/.exec(rest);
134
+ if (blockMatch)
135
+ declared.add(blockMatch[1]);
136
+ }
137
+ }
138
+ // other tags (else/endif/endfor/endset/...) declare and reference nothing
139
+ }
140
+ return { refs, declared };
141
+ }
142
+ /** References whose root is not in `known`, not locally declared, and not a
143
+ * builtin — the squiggly set. */
144
+ export function lintTemplateRefs(source, known, message = (n) => `"${n}" isn't a declared parameter.`) {
145
+ const knownSet = new Set(known);
146
+ const { refs, declared } = extractTemplateRefs(source);
147
+ const out = [];
148
+ for (const r of refs) {
149
+ if (knownSet.has(r.name) || declared.has(r.name) || BUILTINS.has(r.name))
150
+ continue;
151
+ out.push({ ...r, message: message(r.name) });
152
+ }
153
+ return out;
154
+ }
155
+ export function completionContext(source, caret) {
156
+ if (caret < bodyStart(source))
157
+ return null;
158
+ const lineStart = source.lastIndexOf('\n', caret - 1) + 1;
159
+ const lineEndIdx = source.indexOf('\n', caret);
160
+ const lineEnd = lineEndIdx === -1 ? source.length : lineEndIdx;
161
+ const before = source.slice(lineStart, caret);
162
+ // An unclosed {# before the caret means we're inside a comment — no
163
+ // completion, even when the comment text contains a {{ or {%.
164
+ const ovc = before.lastIndexOf('{#');
165
+ if (ovc !== -1 && !before.slice(ovc + 2).includes('#}'))
166
+ return null;
167
+ const ovv = before.lastIndexOf('{{');
168
+ const ovt = before.lastIndexOf('{%');
169
+ const openerIdx = Math.max(ovv, ovt);
170
+ if (openerIdx === -1)
171
+ return null;
172
+ const opener = openerIdx === ovv ? '{{' : '{%';
173
+ const between = before.slice(openerIdx + 2);
174
+ if (between.includes('}}') || between.includes('%}') || between.includes('#}'))
175
+ return null; // caret is past the token
176
+ let exprStart = openerIdx + 2;
177
+ if (opener === '{%') {
178
+ const tagMatch = /^-?\s*[A-Za-z_][A-Za-z0-9_]*\s/.exec(between);
179
+ if (!tagMatch)
180
+ return null; // still typing the tag word
181
+ exprStart = openerIdx + 2 + tagMatch[0].length;
182
+ }
183
+ else {
184
+ if (between.startsWith('-'))
185
+ exprStart += 1; // {{- whitespace control
186
+ if (stripStrings(between).includes('|'))
187
+ return null; // filter zone
188
+ }
189
+ // identifier prefix immediately before the caret
190
+ let ps = caret;
191
+ while (ps > lineStart + exprStart && /[A-Za-z0-9_]/.test(source[ps - 1]))
192
+ ps--;
193
+ if (/[0-9]/.test(source[ps] ?? ''))
194
+ return null; // prefix can't start with a digit
195
+ let q = ps - 1;
196
+ while (q >= lineStart && (source[q] === ' ' || source[q] === '\t'))
197
+ q--;
198
+ if (q >= lineStart && source[q] === '.')
199
+ return null; // attribute access
200
+ const rest = source.slice(caret, lineEnd);
201
+ const closed = opener === '{{' ? rest.includes('}}') : rest.includes('%}');
202
+ const exprBefore = source.slice(lineStart + exprStart, ps);
203
+ return {
204
+ start: ps,
205
+ prefix: source.slice(ps, caret),
206
+ opener,
207
+ closed,
208
+ atExprStart: exprBefore.trim() === '',
209
+ };
210
+ }
211
+ /** Context names the prompd test runner injects into a `.test.prmd` judge body
212
+ * (see testing/prompd/adapter.ts) — always available regardless of the
213
+ * `parameters:` block, so the editor must not flag them. Mirrors how `input` /
214
+ * `previous_output` are builtins for a .prmd run inside a workflow. */
215
+ const TEST_CONTEXT = [
216
+ { name: 'prompt', detail: 'test context', doc: 'The compiled prompt sent to the model under test.' },
217
+ { name: 'response', detail: 'test context', doc: 'The model response being evaluated.' },
218
+ { name: 'params', detail: 'test context', doc: 'The test case params as a JSON string.' },
219
+ ];
220
+ /** Build the editor assistance for a parsed .prmd doc (null for other files).
221
+ * Single source for every editor surface so they can't drift. When the doc
222
+ * declares `inherits:` or `using:`, parameters may come from files the client
223
+ * hasn't resolved (that resolution is backend-side), so the local declared-set
224
+ * is incomplete — completions stay, lint stands down to avoid false errors. */
225
+ export function buildPrmdAssist(fileName, parsed) {
226
+ if (!/\.prmd$/i.test(fileName))
227
+ return null;
228
+ const external = parsed.meta.inherits != null || parsed.meta.using != null;
229
+ const vars = parsed.params.map((p) => ({ name: p.name, detail: p.type || 'param', doc: p.description }));
230
+ // .test.prmd judge bodies reference the runner-injected prompt/response/params.
231
+ if (/\.test\.prmd$/i.test(fileName)) {
232
+ for (const v of TEST_CONTEXT)
233
+ if (!vars.some((x) => x.name === v.name))
234
+ vars.push(v);
235
+ }
236
+ return { vars, lint: !external };
237
+ }
238
+ //# sourceMappingURL=templateRefs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templateRefs.js","sourceRoot":"","sources":["../templateRefs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ export type Theme = 'dark' | 'light';
2
+ export declare function getTheme(): Theme;
3
+ export declare function applyTheme(t: Theme): void;
4
+ export declare function setTheme(t: Theme): void;
5
+ export declare function initTheme(): void;
6
+ export type EditorControls = 'auto' | 'labels' | 'icons';
7
+ export declare function getEditorControls(): EditorControls;
8
+ export declare function applyEditorControls(v: EditorControls): void;
9
+ export declare function setEditorControls(v: EditorControls): void;
10
+ import type { CompressionMode } from '@corenel/protocol';
11
+ export declare function getCompression(): CompressionMode;
12
+ export declare function setCompression(v: CompressionMode): void;
13
+ export declare function getShowHelp(): boolean;
14
+ export declare function setShowHelp(v: boolean): void;
15
+ //# sourceMappingURL=theme.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../theme.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,KAAK,GAAG,MAAM,GAAG,OAAO,CAAC;AAGrC,wBAAgB,QAAQ,IAAI,KAAK,CAEhC;AACD,wBAAgB,UAAU,CAAC,CAAC,EAAE,KAAK,GAAG,IAAI,CAEzC;AACD,wBAAgB,QAAQ,CAAC,CAAC,EAAE,KAAK,GAAG,IAAI,CAKvC;AACD,wBAAgB,SAAS,IAAI,IAAI,CAGhC;AAKD,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC;AAGzD,wBAAgB,iBAAiB,IAAI,cAAc,CAKlD;AACD,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,cAAc,GAAG,IAAI,CAE3D;AACD,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,cAAc,GAAG,IAAI,CAGzD;AAID,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEzD,wBAAgB,cAAc,IAAI,eAAe,CAKhD;AACD,wBAAgB,cAAc,CAAC,CAAC,EAAE,eAAe,GAAG,IAAI,CAEvD;AAID,wBAAgB,WAAW,IAAI,OAAO,CAErC;AACD,wBAAgB,WAAW,CAAC,CAAC,EAAE,OAAO,GAAG,IAAI,CAE5C"}