@plurnk/plurnk-contracts 1.10.1 → 1.12.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.
- package/README.md +2 -3
- package/SPEC.md +190 -85
- package/dist/conformance/agui-v1.json +5 -5
- package/dist/plurnk.gemma.gbnf +4 -3
- package/dist/plurnk.qwen.gbnf +4 -3
- package/dist/schema/CapabilityDescriptor.json +23 -0
- package/dist/schema/CapabilityPolicy.json +18 -0
- package/dist/schema/CapabilityProjection.json +16 -0
- package/dist/schema/CapabilitySelector.json +24 -0
- package/dist/schema/ClientStatement.json +10 -2
- package/dist/schema/LoopPolicy.json +13 -0
- package/dist/schema/MatcherBody.json +8 -8
- package/dist/schema/ParsedPath.json +1 -11
- package/dist/schema/PlurnkStatement.json +76 -34
- package/dist/schema/ProblemProjection.json +38 -0
- package/dist/schema/ProposalProjection.json +2 -2
- package/dist/schema/ProviderUsage.json +1 -1
- package/dist/schema/ResourceSelection.json +12 -2
- package/dist/src/ApplicationPort.d.ts +9 -40
- package/dist/src/ApplicationPort.d.ts.map +1 -1
- package/dist/src/AstBuilder.d.ts +1 -7
- package/dist/src/AstBuilder.d.ts.map +1 -1
- package/dist/src/AstBuilder.js +127 -102
- package/dist/src/AstBuilder.js.map +1 -1
- package/dist/src/CapabilityAdmission.d.ts +9 -0
- package/dist/src/CapabilityAdmission.d.ts.map +1 -0
- package/dist/src/CapabilityAdmission.js +96 -0
- package/dist/src/CapabilityAdmission.js.map +1 -0
- package/dist/src/PlurnkErrorStrategy.d.ts +1 -0
- package/dist/src/PlurnkErrorStrategy.d.ts.map +1 -1
- package/dist/src/PlurnkErrorStrategy.js +140 -1
- package/dist/src/PlurnkErrorStrategy.js.map +1 -1
- package/dist/src/PlurnkParser.d.ts +4 -1
- package/dist/src/PlurnkParser.d.ts.map +1 -1
- package/dist/src/PlurnkParser.js +151 -22
- package/dist/src/PlurnkParser.js.map +1 -1
- package/dist/src/Problems.d.ts +6 -1
- package/dist/src/Problems.d.ts.map +1 -1
- package/dist/src/Problems.js +34 -0
- package/dist/src/Problems.js.map +1 -1
- package/dist/src/TagSignal.d.ts.map +1 -1
- package/dist/src/TagSignal.js +5 -0
- package/dist/src/TagSignal.js.map +1 -1
- package/dist/src/Validator.d.ts +18 -4
- package/dist/src/Validator.d.ts.map +1 -1
- package/dist/src/Validator.js +69 -10
- package/dist/src/Validator.js.map +1 -1
- package/dist/src/generated/plurnkLexer.d.ts +52 -40
- package/dist/src/generated/plurnkLexer.d.ts.map +1 -1
- package/dist/src/generated/plurnkLexer.js +519 -431
- package/dist/src/generated/plurnkLexer.js.map +1 -1
- package/dist/src/generated/plurnkParser.d.ts +165 -92
- package/dist/src/generated/plurnkParser.d.ts.map +1 -1
- package/dist/src/generated/plurnkParser.js +1336 -722
- package/dist/src/generated/plurnkParser.js.map +1 -1
- package/dist/src/generated/plurnkParserVisitor.d.ts +49 -0
- package/dist/src/generated/plurnkParserVisitor.d.ts.map +1 -1
- package/dist/src/generated/plurnkParserVisitor.js +42 -0
- package/dist/src/generated/plurnkParserVisitor.js.map +1 -1
- package/dist/src/index.d.ts +4 -4
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +3 -3
- package/dist/src/index.js.map +1 -1
- package/dist/src/types.d.ts +9 -2
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/types.generated.d.ts +142 -36
- package/dist/src/types.generated.d.ts.map +1 -1
- package/dist/src/types.js +4 -6
- package/dist/src/types.js.map +1 -1
- package/package.json +2 -2
- package/plurnk.md +68 -61
- package/dist/schema/LoopFlags.json +0 -16
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
// {§capability-policy-matching} — selectors are exact conjunctions. Policy
|
|
2
|
+
// layers remain data; this class is the one deterministic evaluator shared by
|
|
3
|
+
// every consumer.
|
|
4
|
+
export default class CapabilityAdmission {
|
|
5
|
+
static matches(selector, descriptor) {
|
|
6
|
+
if (selector.operation !== undefined && selector.operation !== descriptor.operation)
|
|
7
|
+
return false;
|
|
8
|
+
if (selector.scheme !== undefined && selector.scheme !== descriptor.scheme)
|
|
9
|
+
return false;
|
|
10
|
+
if (selector.runtime !== undefined && selector.runtime !== descriptor.runtime)
|
|
11
|
+
return false;
|
|
12
|
+
if (selector.tool !== undefined && selector.tool !== descriptor.tool)
|
|
13
|
+
return false;
|
|
14
|
+
if (selector.access !== undefined && selector.access !== descriptor.access)
|
|
15
|
+
return false;
|
|
16
|
+
if (selector.traits !== undefined
|
|
17
|
+
&& !selector.traits.every((trait) => descriptor.traits.includes(trait)))
|
|
18
|
+
return false;
|
|
19
|
+
return true;
|
|
20
|
+
}
|
|
21
|
+
static allows(policy, descriptor) {
|
|
22
|
+
if (policy.deny?.some((selector) => CapabilityAdmission.matches(selector, descriptor)) === true)
|
|
23
|
+
return false;
|
|
24
|
+
return policy.only === undefined
|
|
25
|
+
|| policy.only.some((selector) => CapabilityAdmission.matches(selector, descriptor));
|
|
26
|
+
}
|
|
27
|
+
static allowsAcross(policies, descriptor) {
|
|
28
|
+
return policies.every((policy) => CapabilityAdmission.allows(policy, descriptor));
|
|
29
|
+
}
|
|
30
|
+
// Lossless normalization of an intersection into one policy. `only` is an
|
|
31
|
+
// OR-list, so intersecting two lists is their compatible Cartesian product;
|
|
32
|
+
// deny lists simply union.
|
|
33
|
+
static intersect(policies) {
|
|
34
|
+
const deny = CapabilityAdmission.#unique(policies.flatMap((policy) => policy.deny ?? []));
|
|
35
|
+
let only;
|
|
36
|
+
for (const policy of policies) {
|
|
37
|
+
if (policy.only === undefined)
|
|
38
|
+
continue;
|
|
39
|
+
only = only === undefined
|
|
40
|
+
? [...policy.only]
|
|
41
|
+
: only.flatMap((left) => policy.only.flatMap((right) => {
|
|
42
|
+
const merged = CapabilityAdmission.#merge(left, right);
|
|
43
|
+
return merged === null ? [] : [merged];
|
|
44
|
+
}));
|
|
45
|
+
only = CapabilityAdmission.#unique(only);
|
|
46
|
+
}
|
|
47
|
+
return {
|
|
48
|
+
...(only === undefined ? {} : { only }),
|
|
49
|
+
...(deny.length === 0 ? {} : { deny }),
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
static #merge(left, right) {
|
|
53
|
+
const merged = {};
|
|
54
|
+
for (const field of ["operation", "scheme", "runtime", "tool", "access"]) {
|
|
55
|
+
const l = left[field];
|
|
56
|
+
const r = right[field];
|
|
57
|
+
if (l !== undefined && r !== undefined && l !== r)
|
|
58
|
+
return null;
|
|
59
|
+
const value = l ?? r;
|
|
60
|
+
if (value !== undefined)
|
|
61
|
+
merged[field] = value;
|
|
62
|
+
}
|
|
63
|
+
const traits = [...new Set([...(left.traits ?? []), ...(right.traits ?? [])])].toSorted();
|
|
64
|
+
if (traits.length > 0)
|
|
65
|
+
merged.traits = traits;
|
|
66
|
+
return merged;
|
|
67
|
+
}
|
|
68
|
+
static #unique(selectors) {
|
|
69
|
+
const seen = new Set();
|
|
70
|
+
return selectors.filter((selector) => {
|
|
71
|
+
const key = JSON.stringify({
|
|
72
|
+
operation: selector.operation,
|
|
73
|
+
scheme: selector.scheme,
|
|
74
|
+
runtime: selector.runtime,
|
|
75
|
+
tool: selector.tool,
|
|
76
|
+
access: selector.access,
|
|
77
|
+
traits: selector.traits === undefined ? undefined : [...selector.traits].toSorted(),
|
|
78
|
+
});
|
|
79
|
+
if (seen.has(key))
|
|
80
|
+
return false;
|
|
81
|
+
seen.add(key);
|
|
82
|
+
return true;
|
|
83
|
+
}).toSorted((left, right) => CapabilityAdmission.#key(left).localeCompare(CapabilityAdmission.#key(right)));
|
|
84
|
+
}
|
|
85
|
+
static #key(selector) {
|
|
86
|
+
return JSON.stringify({
|
|
87
|
+
operation: selector.operation,
|
|
88
|
+
scheme: selector.scheme,
|
|
89
|
+
runtime: selector.runtime,
|
|
90
|
+
tool: selector.tool,
|
|
91
|
+
access: selector.access,
|
|
92
|
+
traits: selector.traits === undefined ? undefined : [...selector.traits].toSorted(),
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=CapabilityAdmission.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CapabilityAdmission.js","sourceRoot":"","sources":["../../src/CapabilityAdmission.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,6 +4,7 @@ export declare const COMBINED_ANCHOR_LINE_DIAGNOSTIC = "a scope position accepts
|
|
|
4
4
|
export default class PlurnkErrorStrategy extends DefaultErrorStrategy {
|
|
5
5
|
#private;
|
|
6
6
|
static translateLexerMessage(lexer: plurnkLexer, originalMsg: string): string;
|
|
7
|
+
recover(recognizer: Parser, _e: RecognitionException): void;
|
|
7
8
|
reportError(recognizer: Parser, e: RecognitionException): void;
|
|
8
9
|
reportMissingToken(recognizer: Parser): void;
|
|
9
10
|
reportUnwantedToken(recognizer: Parser): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PlurnkErrorStrategy.d.ts","sourceRoot":"","sources":["../../src/PlurnkErrorStrategy.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,oBAAoB,EAIpB,KAAK,MAAM,EACX,KAAK,oBAAoB,EAC5B,MAAM,UAAU,CAAC;AAElB,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAEzD,eAAO,MAAM,+BAA+B,2GACgE,CAAC;AAE7G,MAAM,CAAC,OAAO,OAAO,mBAAoB,SAAQ,oBAAoB;;
|
|
1
|
+
{"version":3,"file":"PlurnkErrorStrategy.d.ts","sourceRoot":"","sources":["../../src/PlurnkErrorStrategy.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,oBAAoB,EAIpB,KAAK,MAAM,EACX,KAAK,oBAAoB,EAC5B,MAAM,UAAU,CAAC;AAElB,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAEzD,eAAO,MAAM,+BAA+B,2GACgE,CAAC;AAE7G,MAAM,CAAC,OAAO,OAAO,mBAAoB,SAAQ,oBAAoB;;IAkDjE,MAAM,CAAC,qBAAqB,CAAC,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAwB5E;IA8He,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE,oBAAoB,GAAG,IAAI,CAoB1E;IAEe,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,CAAC,EAAE,oBAAoB,GAAG,IAAI,CA+B7E;IAEe,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAiB3D;IAEe,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAkC5D;CACJ"}
|
|
@@ -5,11 +5,12 @@ export default class PlurnkErrorStrategy extends DefaultErrorStrategy {
|
|
|
5
5
|
static #OFFENDING_CHAR_RE = /at: '([^']*)'$/;
|
|
6
6
|
static #LEXER_MODE_CONTEXT = {
|
|
7
7
|
DEFAULT_MODE: "before the PLAN heading",
|
|
8
|
-
SLOTS: "in operation heading - expected a space before `[signal]`, `(path)`, or `<scope>`, or a line ending",
|
|
8
|
+
SLOTS: "in operation heading - expected a space before `[signal]`, `(path)`, `{metadata}`, or `<scope>`, or a line ending",
|
|
9
9
|
SIGNAL_TAGS: "in tag signal - expected tag, `,`, or `]`",
|
|
10
10
|
SIGNAL_INT: "in signal - expected a submit code for SEND or a code for KILL, then `]`",
|
|
11
11
|
SIGNAL_IDENT: "in signal - expected executor for EXEC, then `]`",
|
|
12
12
|
TARGET: "in `(path)` slot - expected URI characters or `)`",
|
|
13
|
+
METADATA: "in `{metadata}` modifier - expected single-line scheme content or `}`",
|
|
13
14
|
BODY: "in body",
|
|
14
15
|
};
|
|
15
16
|
static #SLOT_BY_TOKEN = {
|
|
@@ -33,6 +34,8 @@ export default class PlurnkErrorStrategy extends DefaultErrorStrategy {
|
|
|
33
34
|
[plurnkParser.RBRACKET]: "`]` (signal slot closer)",
|
|
34
35
|
[plurnkParser.LPAREN]: "`(` (`(path)` slot opener)",
|
|
35
36
|
[plurnkParser.RPAREN]: "`)` (`(path)` slot closer)",
|
|
37
|
+
[plurnkParser.LBRACE]: "`{` (`{metadata}` modifier opener)",
|
|
38
|
+
[plurnkParser.RBRACE]: "`}` (`{metadata}` modifier closer)",
|
|
36
39
|
[plurnkParser.L_MARKER]: "`<L>` line marker",
|
|
37
40
|
[plurnkParser.BODY_OPEN]: "operation-heading line ending",
|
|
38
41
|
[plurnkParser.SECTION_END]: "next same-lane heading",
|
|
@@ -41,6 +44,7 @@ export default class PlurnkErrorStrategy extends DefaultErrorStrategy {
|
|
|
41
44
|
[plurnkParser.IDENT]: "executor (EXEC signal)",
|
|
42
45
|
[plurnkParser.TAG]: "tag",
|
|
43
46
|
[plurnkParser.TARGET_TEXT]: "path content",
|
|
47
|
+
[plurnkParser.METADATA_TEXT]: "scheme metadata content",
|
|
44
48
|
[plurnkParser.BODY_TEXT]: "body content",
|
|
45
49
|
[plurnkParser.TEXT]: "text before PLAN",
|
|
46
50
|
};
|
|
@@ -57,12 +61,31 @@ export default class PlurnkErrorStrategy extends DefaultErrorStrategy {
|
|
|
57
61
|
// regex and XPath redirect only once the heading has closed a `(target)` — before
|
|
58
62
|
// that, `/` may instead be a target whose `(...)` wrap was omitted. (bench#5 run16/17:
|
|
59
63
|
// the generic message taught models to avoid regex FIND altogether.)
|
|
64
|
+
// A `<…>` slot that opened after its own space is a scope whose CONTENT is wrong —
|
|
65
|
+
// name the shapes the slot admits instead of the spacing rule (#386). A `<` glued to
|
|
66
|
+
// the previous slot keeps the spacing message below.
|
|
67
|
+
if (modeName === "SLOTS" && ch.startsWith("'<") && PlurnkErrorStrategy.#scopeOpenedAfterSpace(lexer)) {
|
|
68
|
+
return `unrecognized scope ${ch} in operation heading - a scope is numeric: \`<L>\`, \`<SL,EL>\`, \`<SL,SC,EL,EC>\`, \`<0>\`, or \`<-1>\`; EXEC's \`<timeout,poll>\` are minutes, e.g. \`<5>\` or \`<5,1>\`; a resource address is never a scope`;
|
|
69
|
+
}
|
|
60
70
|
if (modeName === "SLOTS" && (/^'[$~@]'$/.test(ch)
|
|
61
71
|
|| (ch === "'/'" && PlurnkErrorStrategy.#headingClosedTarget(lexer)))) {
|
|
62
72
|
return `unrecognized character ${ch} in operation heading - a matcher is body content, below the OP heading`;
|
|
63
73
|
}
|
|
64
74
|
return `unrecognized character ${ch} ${context}`;
|
|
65
75
|
}
|
|
76
|
+
// True when the nearest `<` on the current heading line follows a space, i.e. the slot
|
|
77
|
+
// was opened as its own slot rather than glued to the previous one.
|
|
78
|
+
static #scopeOpenedAfterSpace(lexer) {
|
|
79
|
+
const stream = lexer.inputStream;
|
|
80
|
+
for (let i = Math.min(stream.index, stream.size - 1); i >= 0; i -= 1) {
|
|
81
|
+
const char = stream.getTextFromRange(i, i);
|
|
82
|
+
if (char === "\n")
|
|
83
|
+
return false;
|
|
84
|
+
if (char === "<")
|
|
85
|
+
return i > 0 && stream.getTextFromRange(i - 1, i - 1) === " ";
|
|
86
|
+
}
|
|
87
|
+
return false;
|
|
88
|
+
}
|
|
66
89
|
// True when the current heading line already closed a `(...)` target.
|
|
67
90
|
static #headingClosedTarget(lexer) {
|
|
68
91
|
const stream = lexer.inputStream;
|
|
@@ -119,6 +142,102 @@ export default class PlurnkErrorStrategy extends DefaultErrorStrategy {
|
|
|
119
142
|
return null;
|
|
120
143
|
return COMBINED_ANCHOR_LINE_DIAGNOSTIC;
|
|
121
144
|
}
|
|
145
|
+
// {§bare-target-redirect} A `(` on a BARE heading is the prompt written as a slot; BARE
|
|
146
|
+
// takes none, so the same receipt names the body line.
|
|
147
|
+
static #targetSlotMessage(recognizer, tok) {
|
|
148
|
+
if (tok?.type !== plurnkParser.LPAREN)
|
|
149
|
+
return null;
|
|
150
|
+
const stream = recognizer.tokenStream;
|
|
151
|
+
for (let i = tok.tokenIndex - 1; i >= 0; i -= 1) {
|
|
152
|
+
const prior = stream.get(i);
|
|
153
|
+
if (prior.line !== tok.line)
|
|
154
|
+
return null;
|
|
155
|
+
if (prior.type === plurnkParser.OPEN_BARE) {
|
|
156
|
+
const opener = prior.text ?? "## BARE0";
|
|
157
|
+
return `unexpected \`(\` after BARE - BARE takes no \`(path)\`; the prompt is the body: \`${opener}\` then the prompt on the line below`;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
return null;
|
|
161
|
+
}
|
|
162
|
+
// A signed tag lexeme: what belongs in `[+tag]`, never a path.
|
|
163
|
+
static #TAG_LEXEME_RE = /^[+-][^\s/.*?()[\]{}]+(?:,[+-][^\s/.*?()[\]{}]+)*$/;
|
|
164
|
+
// A second `(` on a heading that already closed a `(path)`. When the first slot was a signed
|
|
165
|
+
// tag, the slip is the bracket kind and the blame belongs on the FIRST paren; otherwise the
|
|
166
|
+
// heading simply has one path slot and a matcher belongs beneath it. #425 F2.
|
|
167
|
+
static #secondPathSlotMessage(recognizer, tok) {
|
|
168
|
+
if (tok?.type !== plurnkParser.LPAREN)
|
|
169
|
+
return null;
|
|
170
|
+
const stream = recognizer.tokenStream;
|
|
171
|
+
let closed = false;
|
|
172
|
+
let firstOpen = null;
|
|
173
|
+
let text = "";
|
|
174
|
+
for (let i = tok.tokenIndex - 1; i >= 0; i -= 1) {
|
|
175
|
+
const prior = stream.get(i);
|
|
176
|
+
if (prior.line !== tok.line)
|
|
177
|
+
break;
|
|
178
|
+
if (!closed) {
|
|
179
|
+
if (prior.type === plurnkParser.RPAREN)
|
|
180
|
+
closed = true;
|
|
181
|
+
continue;
|
|
182
|
+
}
|
|
183
|
+
if (prior.type === plurnkParser.TARGET_TEXT) {
|
|
184
|
+
text = `${prior.text ?? ""}${text}`;
|
|
185
|
+
continue;
|
|
186
|
+
}
|
|
187
|
+
if (prior.type === plurnkParser.LPAREN) {
|
|
188
|
+
firstOpen = prior;
|
|
189
|
+
break;
|
|
190
|
+
}
|
|
191
|
+
break;
|
|
192
|
+
}
|
|
193
|
+
if (!closed || firstOpen === null)
|
|
194
|
+
return null;
|
|
195
|
+
if (PlurnkErrorStrategy.#TAG_LEXEME_RE.test(text)) {
|
|
196
|
+
return { at: firstOpen, message: `\`(${text})\` is not a path - a tag rides in the signal slot \`[${text}]\`; \`(...)\` is the one path slot` };
|
|
197
|
+
}
|
|
198
|
+
return { at: tok, message: "a heading takes exactly one `(path)` slot; a pattern belongs in the body beneath the heading" };
|
|
199
|
+
}
|
|
200
|
+
// {§matcher-prefix-claims} "later statements remain recoverable when their boundaries are
|
|
201
|
+
// trustworthy" - a column-0 heading is that boundary. After a statement-level error, the rest
|
|
202
|
+
// of the broken statement (heading line and body) is discarded and parsing resumes at the next
|
|
203
|
+
// heading, so every later statement - the terminal SEND included - is judged on its own.
|
|
204
|
+
static #HEADING_BOUNDARY = new Set([
|
|
205
|
+
plurnkParser.OPEN_PLAN, plurnkParser.OPEN_FIND, plurnkParser.OPEN_READ, plurnkParser.OPEN_EDIT,
|
|
206
|
+
plurnkParser.OPEN_COPY, plurnkParser.OPEN_MOVE, plurnkParser.OPEN_OPEN, plurnkParser.OPEN_FOLD,
|
|
207
|
+
plurnkParser.OPEN_SEND, plurnkParser.OPEN_EXEC, plurnkParser.OPEN_BARE, plurnkParser.OPEN_WORK,
|
|
208
|
+
plurnkParser.OPEN_FORK, plurnkParser.OPEN_KILL, plurnkParser.OPEN_LOOK, plurnkParser.OPEN_BUFF,
|
|
209
|
+
plurnkParser.FENCE_CLOSE,
|
|
210
|
+
]);
|
|
211
|
+
// The entry rules end with EOF; an error raised there means the document expected its end.
|
|
212
|
+
static #ENTRY_RULES = new Set(["document", "log", "statementSeq", "clientStatementSeq"]);
|
|
213
|
+
#lastResyncIndex = -1;
|
|
214
|
+
recover(recognizer, _e) {
|
|
215
|
+
const stream = recognizer.inputStream;
|
|
216
|
+
let current = recognizer.getCurrentToken();
|
|
217
|
+
// The document expected its end and found more: everything after the terminal SEND is
|
|
218
|
+
// the mid-termination error, reported once. Consume through EOF so the lexer finishes
|
|
219
|
+
// and {§send-mid-reservation} rewrites the diagnostic instead of a false "never closed" tail.
|
|
220
|
+
const rule = recognizer.ruleNames[recognizer.context?.ruleIndex ?? -1] ?? "";
|
|
221
|
+
if (PlurnkErrorStrategy.#ENTRY_RULES.has(rule)) {
|
|
222
|
+
while (current.type !== Token.EOF) {
|
|
223
|
+
recognizer.consume();
|
|
224
|
+
current = recognizer.getCurrentToken();
|
|
225
|
+
}
|
|
226
|
+
this.#lastResyncIndex = stream.index;
|
|
227
|
+
return;
|
|
228
|
+
}
|
|
229
|
+
// No progress since the last resync at this position: force one token so the parser
|
|
230
|
+
// cannot loop on a heading it refuses to match.
|
|
231
|
+
if (this.#lastResyncIndex === stream.index && current.type !== Token.EOF) {
|
|
232
|
+
recognizer.consume();
|
|
233
|
+
current = recognizer.getCurrentToken();
|
|
234
|
+
}
|
|
235
|
+
while (current.type !== Token.EOF && !PlurnkErrorStrategy.#HEADING_BOUNDARY.has(current.type)) {
|
|
236
|
+
recognizer.consume();
|
|
237
|
+
current = recognizer.getCurrentToken();
|
|
238
|
+
}
|
|
239
|
+
this.#lastResyncIndex = stream.index;
|
|
240
|
+
}
|
|
122
241
|
reportError(recognizer, e) {
|
|
123
242
|
if (this.inErrorRecoveryMode(recognizer))
|
|
124
243
|
return;
|
|
@@ -128,6 +247,16 @@ export default class PlurnkErrorStrategy extends DefaultErrorStrategy {
|
|
|
128
247
|
recognizer.notifyErrorListeners(targeted, e.offendingToken, e);
|
|
129
248
|
return;
|
|
130
249
|
}
|
|
250
|
+
const destination = PlurnkErrorStrategy.#targetSlotMessage(recognizer, e.offendingToken);
|
|
251
|
+
if (destination !== null) {
|
|
252
|
+
recognizer.notifyErrorListeners(destination, e.offendingToken, e);
|
|
253
|
+
return;
|
|
254
|
+
}
|
|
255
|
+
const secondSlot = PlurnkErrorStrategy.#secondPathSlotMessage(recognizer, e.offendingToken);
|
|
256
|
+
if (secondSlot !== null) {
|
|
257
|
+
recognizer.notifyErrorListeners(secondSlot.message, secondSlot.at, e);
|
|
258
|
+
return;
|
|
259
|
+
}
|
|
131
260
|
const got = PlurnkErrorStrategy.#describeToken(e.offendingToken);
|
|
132
261
|
const expected = PlurnkErrorStrategy.#describeExpected(e);
|
|
133
262
|
let msg;
|
|
@@ -166,6 +295,16 @@ export default class PlurnkErrorStrategy extends DefaultErrorStrategy {
|
|
|
166
295
|
recognizer.notifyErrorListeners(targeted, tok, null);
|
|
167
296
|
return;
|
|
168
297
|
}
|
|
298
|
+
const destination = PlurnkErrorStrategy.#targetSlotMessage(recognizer, tok);
|
|
299
|
+
if (destination !== null) {
|
|
300
|
+
recognizer.notifyErrorListeners(destination, tok, null);
|
|
301
|
+
return;
|
|
302
|
+
}
|
|
303
|
+
const secondSlot = PlurnkErrorStrategy.#secondPathSlotMessage(recognizer, tok);
|
|
304
|
+
if (secondSlot !== null) {
|
|
305
|
+
recognizer.notifyErrorListeners(secondSlot.message, secondSlot.at, null);
|
|
306
|
+
return;
|
|
307
|
+
}
|
|
169
308
|
const got = PlurnkErrorStrategy.#describeToken(tok);
|
|
170
309
|
const expectedTokens = this.getExpectedTokens(recognizer);
|
|
171
310
|
const expectedNames = [...new Set(expectedTokens
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PlurnkErrorStrategy.js","sourceRoot":"","sources":["../../src/PlurnkErrorStrategy.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"PlurnkErrorStrategy.js","sourceRoot":"","sources":["../../src/PlurnkErrorStrategy.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,9 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type ClientStatement, type ParseResult } from "./types.ts";
|
|
2
2
|
export default class PlurnkParser {
|
|
3
3
|
#private;
|
|
4
|
+
static readonly MISSING_PLAN = "No valid leading PLAN was parsed; an empty `# PLAN0` was used.";
|
|
5
|
+
static readonly MISSING_SEND = "No valid terminal SEND was parsed; `## SEND0 [102]` was used.";
|
|
6
|
+
static readonly NO_VALID_OPERATION = "no valid Plurnk operation was found.";
|
|
4
7
|
static parse(input: string): ParseResult;
|
|
5
8
|
static parseStatements(input: string): ParseResult;
|
|
6
9
|
static parseLog(input: string): ParseResult;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PlurnkParser.d.ts","sourceRoot":"","sources":["../../src/PlurnkParser.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"PlurnkParser.d.ts","sourceRoot":"","sources":["../../src/PlurnkParser.ts"],"names":[],"mappings":"AAQA,OAAO,EAEH,KAAK,eAAe,EAEpB,KAAK,WAAW,EAKnB,MAAM,YAAY,CAAC;AAwBpB,MAAM,CAAC,OAAO,OAAO,YAAY;;IAC7B,MAAM,CAAC,QAAQ,CAAC,YAAY,oEAAoE;IAChG,MAAM,CAAC,QAAQ,CAAC,YAAY,mEAAmE;IAC/F,MAAM,CAAC,QAAQ,CAAC,kBAAkB,0CAA0C;IAK5E,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,CAevC;IA6OD,MAAM,CAAC,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,CAEjD;IAMD,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,CAE1C;IAKD,MAAM,CAAC,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,CAAC,eAAe,CAAC,CAM9D;CA+KJ"}
|
package/dist/src/PlurnkParser.js
CHANGED
|
@@ -6,6 +6,7 @@ import PlurnkParseError from "./PlurnkParseError.js";
|
|
|
6
6
|
import PlurnkErrorStrategy from "./PlurnkErrorStrategy.js";
|
|
7
7
|
import RecordingListener from "./RecordingListener.js";
|
|
8
8
|
import TagSignal from "./TagSignal.js";
|
|
9
|
+
import { UNKNOWN_POSITION, } from "./types.js";
|
|
9
10
|
// Statement-bearing contexts the extraction builds into items. `statement` (statementSeq) and
|
|
10
11
|
// `midStatement` (mid-turn ops) each wrap one op; PLAN and the terminal SEND attach as direct
|
|
11
12
|
// `planStatement`/`sendStatement` children of a turn; `clientStatement` wraps one op in the
|
|
@@ -21,29 +22,99 @@ const STATEMENT_RULES = new Set([
|
|
|
21
22
|
// carries tolerated preamble text; `turn` is also the direct child of a fenced
|
|
22
23
|
// document. parseLog contains multiple turnContent siblings, flattened in order.
|
|
23
24
|
const CONTAINER_RULES = new Set([
|
|
25
|
+
plurnkParser.RULE_modelTurnContent,
|
|
26
|
+
plurnkParser.RULE_modelTurn,
|
|
24
27
|
plurnkParser.RULE_turnContent,
|
|
25
28
|
plurnkParser.RULE_turn,
|
|
26
29
|
]);
|
|
27
30
|
export default class PlurnkParser {
|
|
28
|
-
|
|
29
|
-
|
|
31
|
+
static MISSING_PLAN = "No valid leading PLAN was parsed; an empty `# PLAN0` was used.";
|
|
32
|
+
static MISSING_SEND = "No valid terminal SEND was parsed; `## SEND0 [102]` was used.";
|
|
33
|
+
static NO_VALID_OPERATION = "no valid Plurnk operation was found.";
|
|
34
|
+
// Parse one model turn. Canonical PLAN/SEND framing stays strict in teaching and
|
|
35
|
+
// generation; a source operation lets ingestion recover either omitted boundary.
|
|
36
|
+
// Tolerated preamble TEXT remains an ordered item without language semantics. {§turn-shape}
|
|
30
37
|
static parse(input) {
|
|
31
|
-
const
|
|
38
|
+
const tagged = PlurnkParser.#tolerateTagSlots(input);
|
|
39
|
+
const { source, tolerated: scoped } = PlurnkParser.#tolerateScopeSlots(tagged.source);
|
|
40
|
+
const result = PlurnkParser.#run(source, (parser) => parser.document());
|
|
41
|
+
PlurnkParser.#scoldTagSlots(result.items, tagged.tolerated);
|
|
42
|
+
PlurnkParser.#scoldScopeSlots(result.items, scoped);
|
|
32
43
|
// Value-adds layered on ANTLR's diagnostics while the document boundary
|
|
33
44
|
// remains trustworthy. Neither changes what parsed.
|
|
34
45
|
PlurnkParser.#flagMisplacedTarget(result.items);
|
|
35
46
|
if (result.unparsedTail === undefined) {
|
|
36
47
|
PlurnkParser.#imperativeTurnShape(result.items);
|
|
37
48
|
PlurnkParser.#imperativeMidTermination(result.items);
|
|
49
|
+
PlurnkParser.#recoverTurnEnvelope(result.items);
|
|
38
50
|
}
|
|
39
51
|
return result;
|
|
40
52
|
}
|
|
53
|
+
// {§tag-slot-tolerance} — `## OP0 (+tag) (path)`: the tag was written in the path slot ahead
|
|
54
|
+
// of the real path. The heading is read as `[+tag] (path)` — same length, so every later
|
|
55
|
+
// position stays true — and the slip is an error row on the heading (#425 F2, ruled
|
|
56
|
+
// 2026-08-29: tolerate and scold). A heading that already carries a signal is not rewritten.
|
|
57
|
+
static #TAG_SLOT = /^(#{1,2} [A-Z]+[A-Za-z0-9_]*) \(([+-][^\s/.*?()[\]{}]+(?:,[+-][^\s/.*?()[\]{}]+)*)\) \(/;
|
|
58
|
+
static #tolerateTagSlots(input) {
|
|
59
|
+
const tolerated = [];
|
|
60
|
+
const source = input.split("\n").map((text, index) => text.replace(PlurnkParser.#TAG_SLOT, (_, heading, tags) => {
|
|
61
|
+
tolerated.push({ line: index + 1, column: heading.length + 1, tags });
|
|
62
|
+
return `${heading} [${tags}] (`;
|
|
63
|
+
})).join("\n");
|
|
64
|
+
return { source, tolerated };
|
|
65
|
+
}
|
|
66
|
+
static #scoldTagSlots(items, tolerated) {
|
|
67
|
+
for (const { line, column, tags } of tolerated) {
|
|
68
|
+
const scold = {
|
|
69
|
+
kind: "error",
|
|
70
|
+
error: new PlurnkParseError(line, column, "parser", `\`(${tags})\` is not a path - a tag rides in the signal slot \`[${tags}]\`; \`(...)\` is the one path slot. \`[${tags}]\` was used.`),
|
|
71
|
+
};
|
|
72
|
+
const at = items.findIndex((item) => item.kind === "statement" && item.statement.position?.line === line);
|
|
73
|
+
if (at === -1)
|
|
74
|
+
items.push(scold);
|
|
75
|
+
else
|
|
76
|
+
items.splice(at + 1, 0, scold);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
// {§scope-slot-tolerance} — `## COPY0 (worker:///src.md<2,3>)`: the line scope was written inside
|
|
80
|
+
// the path slot. `<` and `>` are not URI characters, so a `<...>` right before a slot's closing
|
|
81
|
+
// paren can only be a scope: the heading is read as `(worker:///src.md) <2,3>` and the slip is a
|
|
82
|
+
// warning advisory after its statement — the statement runs (#442, ruled 2026-08-30: accept with a
|
|
83
|
+
// warning). The rewrite adds one character per slot, so a column on the same heading after the
|
|
84
|
+
// slot is off by that much; lines stay true.
|
|
85
|
+
static #SCOPE_SLOT = /\(([^\s()<>]+)<([^<>()\s]+)>\)/g;
|
|
86
|
+
static #tolerateScopeSlots(input) {
|
|
87
|
+
const tolerated = [];
|
|
88
|
+
const source = input.split("\n").map((text, index) => {
|
|
89
|
+
if (!/^#{1,2} [A-Z]+[A-Za-z0-9_]* /.test(text))
|
|
90
|
+
return text;
|
|
91
|
+
return text.replace(PlurnkParser.#SCOPE_SLOT, (match, path, scope, offset) => {
|
|
92
|
+
tolerated.push({ line: index + 1, column: offset + path.length + 2, scope });
|
|
93
|
+
return `(${path}) <${scope}>`;
|
|
94
|
+
});
|
|
95
|
+
}).join("\n");
|
|
96
|
+
return { source, tolerated };
|
|
97
|
+
}
|
|
98
|
+
static #scoldScopeSlots(items, tolerated) {
|
|
99
|
+
// Each scold splices in right after its statement; reversed, two slips on one heading
|
|
100
|
+
// keep their authored order.
|
|
101
|
+
for (const { line, column, scope } of tolerated.toReversed()) {
|
|
102
|
+
const scold = {
|
|
103
|
+
kind: "error",
|
|
104
|
+
error: new PlurnkParseError(line, column, "parser", `\`<${scope}>\` belongs after the \`(path)\` slot, not inside it - \`(path) <${scope}>\` was used.`, "warning"),
|
|
105
|
+
};
|
|
106
|
+
const at = items.findIndex((item) => item.kind === "statement" && item.statement.position?.line === line);
|
|
107
|
+
if (at === -1)
|
|
108
|
+
items.push(scold);
|
|
109
|
+
else
|
|
110
|
+
items.splice(at + 1, 0, scold);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
41
113
|
// Terminal disposition alphabet. {§waitpid-dispositions} {§wait-obligation-matrix}
|
|
42
114
|
static #DISPOSITIONS = new Set([102, 200, 202, 499]);
|
|
43
|
-
// Replace ANTLR's generic structure errors with the
|
|
44
|
-
// PLAN
|
|
45
|
-
//
|
|
46
|
-
// model to the anchor; a present-PLAN, absent-SEND turn gets the terminator imperative.
|
|
115
|
+
// Replace ANTLR's generic structure errors with the exact envelope default when the
|
|
116
|
+
// canonical PLAN...SEND shape is cleanly incomplete. The parser admits the useful
|
|
117
|
+
// operations and core records this hard diagnostic as the turn's strike. {§turn-shape}
|
|
47
118
|
static #imperativeTurnShape(items) {
|
|
48
119
|
const hasPlan = items.some((i) => i.kind === "statement" && i.statement.op === "PLAN");
|
|
49
120
|
// A mid-comms SEND does not satisfy the terminal requirement.
|
|
@@ -52,14 +123,19 @@ export default class PlurnkParser {
|
|
|
52
123
|
return;
|
|
53
124
|
const isStructErr = (i) => i.kind === "error" && i.error.source === "parser" && i.error.severity === "error";
|
|
54
125
|
const structErrors = items.filter(isStructErr);
|
|
55
|
-
|
|
126
|
+
const statements = items.flatMap((item) => item.kind === "statement" ? [item.statement] : []);
|
|
127
|
+
if (statements.length === 0) {
|
|
128
|
+
const anchor = structErrors[0]?.error;
|
|
129
|
+
// With no operation to retain, the grammar's expected-token cascade is less useful
|
|
130
|
+
// than the exact admission failure. Lexer and visitor diagnostics remain intact.
|
|
131
|
+
const kept = items.filter((item) => !isStructErr(item));
|
|
132
|
+
items.length = 0;
|
|
133
|
+
items.push(...kept, {
|
|
134
|
+
kind: "error",
|
|
135
|
+
error: new PlurnkParseError(anchor?.line ?? 1, anchor?.column ?? 0, "parser", PlurnkParser.NO_VALID_OPERATION),
|
|
136
|
+
});
|
|
56
137
|
return;
|
|
57
|
-
|
|
58
|
-
// Drop the generic parser structure errors (downstream noise from the broken shape);
|
|
59
|
-
// keep statements, text, near-miss warnings, and lexer/visitor errors.
|
|
60
|
-
const kept = items.filter((i) => !isStructErr(i));
|
|
61
|
-
items.length = 0;
|
|
62
|
-
items.push(...kept);
|
|
138
|
+
}
|
|
63
139
|
// Only add the anchor imperative when the shape is CLEANLY incomplete. If a bounded lexer
|
|
64
140
|
// or visitor error is present, the turn derailed within an operation, so the
|
|
65
141
|
// missing PLAN/SEND is a parse artifact, not the real fix - that specific bounded error
|
|
@@ -67,10 +143,63 @@ export default class PlurnkParser {
|
|
|
67
143
|
const hasSpecificError = items.some((i) => i.kind === "error" && i.error.severity === "error" && i.error.source !== "parser");
|
|
68
144
|
if (hasSpecificError)
|
|
69
145
|
return;
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
146
|
+
if (!hasPlan) {
|
|
147
|
+
const position = statements[0]?.position ?? UNKNOWN_POSITION;
|
|
148
|
+
items.push({
|
|
149
|
+
kind: "error",
|
|
150
|
+
error: new PlurnkParseError(position.line, position.column, "parser", PlurnkParser.MISSING_PLAN),
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
if (!hasSend) {
|
|
154
|
+
const position = statements.at(-1)?.position ?? UNKNOWN_POSITION;
|
|
155
|
+
items.push({
|
|
156
|
+
kind: "error",
|
|
157
|
+
error: new PlurnkParseError(position.line, position.column, "parser", PlurnkParser.MISSING_SEND),
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
// A model emission with at least one valid operation remains a useful program when it
|
|
162
|
+
// omits envelope ceremony. Materialize the exact language defaults in the AST; the raw
|
|
163
|
+
// source remains untouched as forensic turnOps evidence. GBNF and parseLog stay strict.
|
|
164
|
+
static #recoverTurnEnvelope(items) {
|
|
165
|
+
const sourceStatements = items.flatMap((item) => item.kind === "statement" ? [item.statement] : []);
|
|
166
|
+
if (sourceStatements.length === 0)
|
|
167
|
+
return;
|
|
168
|
+
const delimiter = sourceStatements[0]?.delimiter || "0";
|
|
169
|
+
const hasPlan = sourceStatements.some(({ op }) => op === "PLAN");
|
|
170
|
+
const hasTerminalSend = sourceStatements.some((statement) => statement.op === "SEND"
|
|
171
|
+
&& typeof statement.signal === "number"
|
|
172
|
+
&& PlurnkParser.#DISPOSITIONS.has(statement.signal));
|
|
173
|
+
if (!hasPlan) {
|
|
174
|
+
const plan = {
|
|
175
|
+
op: "PLAN",
|
|
176
|
+
delimiter,
|
|
177
|
+
annotation: null,
|
|
178
|
+
signal: null,
|
|
179
|
+
target: null,
|
|
180
|
+
metadata: null,
|
|
181
|
+
lineMarker: null,
|
|
182
|
+
body: [],
|
|
183
|
+
position: UNKNOWN_POSITION,
|
|
184
|
+
};
|
|
185
|
+
const firstStatement = items.findIndex((item) => item.kind === "statement");
|
|
186
|
+
items.splice(firstStatement, 0, { kind: "statement", statement: plan });
|
|
187
|
+
}
|
|
188
|
+
if (!hasTerminalSend) {
|
|
189
|
+
const send = {
|
|
190
|
+
op: "SEND",
|
|
191
|
+
delimiter,
|
|
192
|
+
annotation: null,
|
|
193
|
+
signal: 102,
|
|
194
|
+
target: null,
|
|
195
|
+
metadata: null,
|
|
196
|
+
lineMarker: null,
|
|
197
|
+
body: null,
|
|
198
|
+
position: UNKNOWN_POSITION,
|
|
199
|
+
};
|
|
200
|
+
const lastStatement = items.findLastIndex((item) => item.kind === "statement");
|
|
201
|
+
items.splice(lastStatement + 1, 0, { kind: "statement", statement: send });
|
|
202
|
+
}
|
|
74
203
|
}
|
|
75
204
|
// Lift the mid-turn-termination error. A disposition-coded SEND
|
|
76
205
|
// (102/200/202/499) ends the turn, so a following operation is an error.
|
|
@@ -163,9 +292,7 @@ export default class PlurnkParser {
|
|
|
163
292
|
error: new PlurnkParseError(note.line, note.column, "parser", `\`${note.heading}\` body text was on the OP line and was taken as the body; body content goes immediately beneath the OP heading line.`, "warning"),
|
|
164
293
|
};
|
|
165
294
|
const at = items.findIndex((item) => item.kind === "statement" && item.statement.position?.line === note.line);
|
|
166
|
-
if (at
|
|
167
|
-
items.push(advisory);
|
|
168
|
-
else
|
|
295
|
+
if (at !== -1)
|
|
169
296
|
items.splice(at + 1, 0, advisory);
|
|
170
297
|
}
|
|
171
298
|
for (const err of errors) {
|
|
@@ -190,7 +317,9 @@ export default class PlurnkParser {
|
|
|
190
317
|
const heading = lexer.getOpenHeading() || `## ${openTag}`;
|
|
191
318
|
const reason = modeName === "SIGNAL_TAGS" || modeName === "SIGNAL_INT" || modeName === "SIGNAL_IDENT"
|
|
192
319
|
? `signal slot of \`${heading}\` opened at line ${from.line} but never closed - add \`]\``
|
|
193
|
-
:
|
|
320
|
+
: modeName === "METADATA"
|
|
321
|
+
? `metadata modifier of \`${heading}\` opened at line ${from.line} but never closed - add \`}\``
|
|
322
|
+
: `target slot of \`${heading}\` opened at line ${from.line} but never closed - add \`)\``;
|
|
194
323
|
return { from, reason };
|
|
195
324
|
}
|
|
196
325
|
// Mutating ops that require a `(target)` and carry a `[tags]` string-array signal. A null target
|