@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.
Files changed (72) hide show
  1. package/README.md +2 -3
  2. package/SPEC.md +190 -85
  3. package/dist/conformance/agui-v1.json +5 -5
  4. package/dist/plurnk.gemma.gbnf +4 -3
  5. package/dist/plurnk.qwen.gbnf +4 -3
  6. package/dist/schema/CapabilityDescriptor.json +23 -0
  7. package/dist/schema/CapabilityPolicy.json +18 -0
  8. package/dist/schema/CapabilityProjection.json +16 -0
  9. package/dist/schema/CapabilitySelector.json +24 -0
  10. package/dist/schema/ClientStatement.json +10 -2
  11. package/dist/schema/LoopPolicy.json +13 -0
  12. package/dist/schema/MatcherBody.json +8 -8
  13. package/dist/schema/ParsedPath.json +1 -11
  14. package/dist/schema/PlurnkStatement.json +76 -34
  15. package/dist/schema/ProblemProjection.json +38 -0
  16. package/dist/schema/ProposalProjection.json +2 -2
  17. package/dist/schema/ProviderUsage.json +1 -1
  18. package/dist/schema/ResourceSelection.json +12 -2
  19. package/dist/src/ApplicationPort.d.ts +9 -40
  20. package/dist/src/ApplicationPort.d.ts.map +1 -1
  21. package/dist/src/AstBuilder.d.ts +1 -7
  22. package/dist/src/AstBuilder.d.ts.map +1 -1
  23. package/dist/src/AstBuilder.js +127 -102
  24. package/dist/src/AstBuilder.js.map +1 -1
  25. package/dist/src/CapabilityAdmission.d.ts +9 -0
  26. package/dist/src/CapabilityAdmission.d.ts.map +1 -0
  27. package/dist/src/CapabilityAdmission.js +96 -0
  28. package/dist/src/CapabilityAdmission.js.map +1 -0
  29. package/dist/src/PlurnkErrorStrategy.d.ts +1 -0
  30. package/dist/src/PlurnkErrorStrategy.d.ts.map +1 -1
  31. package/dist/src/PlurnkErrorStrategy.js +140 -1
  32. package/dist/src/PlurnkErrorStrategy.js.map +1 -1
  33. package/dist/src/PlurnkParser.d.ts +4 -1
  34. package/dist/src/PlurnkParser.d.ts.map +1 -1
  35. package/dist/src/PlurnkParser.js +151 -22
  36. package/dist/src/PlurnkParser.js.map +1 -1
  37. package/dist/src/Problems.d.ts +6 -1
  38. package/dist/src/Problems.d.ts.map +1 -1
  39. package/dist/src/Problems.js +34 -0
  40. package/dist/src/Problems.js.map +1 -1
  41. package/dist/src/TagSignal.d.ts.map +1 -1
  42. package/dist/src/TagSignal.js +5 -0
  43. package/dist/src/TagSignal.js.map +1 -1
  44. package/dist/src/Validator.d.ts +18 -4
  45. package/dist/src/Validator.d.ts.map +1 -1
  46. package/dist/src/Validator.js +69 -10
  47. package/dist/src/Validator.js.map +1 -1
  48. package/dist/src/generated/plurnkLexer.d.ts +52 -40
  49. package/dist/src/generated/plurnkLexer.d.ts.map +1 -1
  50. package/dist/src/generated/plurnkLexer.js +519 -431
  51. package/dist/src/generated/plurnkLexer.js.map +1 -1
  52. package/dist/src/generated/plurnkParser.d.ts +165 -92
  53. package/dist/src/generated/plurnkParser.d.ts.map +1 -1
  54. package/dist/src/generated/plurnkParser.js +1336 -722
  55. package/dist/src/generated/plurnkParser.js.map +1 -1
  56. package/dist/src/generated/plurnkParserVisitor.d.ts +49 -0
  57. package/dist/src/generated/plurnkParserVisitor.d.ts.map +1 -1
  58. package/dist/src/generated/plurnkParserVisitor.js +42 -0
  59. package/dist/src/generated/plurnkParserVisitor.js.map +1 -1
  60. package/dist/src/index.d.ts +4 -4
  61. package/dist/src/index.d.ts.map +1 -1
  62. package/dist/src/index.js +3 -3
  63. package/dist/src/index.js.map +1 -1
  64. package/dist/src/types.d.ts +9 -2
  65. package/dist/src/types.d.ts.map +1 -1
  66. package/dist/src/types.generated.d.ts +142 -36
  67. package/dist/src/types.generated.d.ts.map +1 -1
  68. package/dist/src/types.js +4 -6
  69. package/dist/src/types.js.map +1 -1
  70. package/package.json +2 -2
  71. package/plurnk.md +68 -61
  72. 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;;IA8CjE,MAAM,CAAC,qBAAqB,CAAC,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAkB5E;IAsDe,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,CAAC,EAAE,oBAAoB,GAAG,IAAI,CAqB7E;IAEe,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAiB3D;IAEe,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAwB5D;CACJ"}
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 { ClientStatement, ParseResult } from "./types.ts";
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,EAAE,eAAe,EAAa,WAAW,EAA6B,MAAM,YAAY,CAAC;AAsBrG,MAAM,CAAC,OAAO,OAAO,YAAY;;IAG7B,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,CAUvC;IA6FD,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;CA8KJ"}
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"}
@@ -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
- // Parse one PLAN-anchored model turn ending in a disposition SEND. Tolerated
29
- // interstatement TEXT remains an ordered item without language semantics. {§turn-shape}
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 result = PlurnkParser.#run(input, (parser) => parser.document());
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 turn-shape imperative when the
44
- // PLAN-anchored sandwich is broken. PLAN-first takes precedence: with no PLAN we cannot
45
- // judge the terminal SEND (it never reached statement position), so we only direct the
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
- if (structErrors.length === 0)
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
- const anchor = structErrors[0].error;
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
- const fix = !hasPlan
71
- ? "a turn must begin with `# PLAN0`"
72
- : "a turn must end with `## SEND0 [submit code]`";
73
- items.push({ kind: "error", error: new PlurnkParseError(anchor.line, anchor.column, "parser", fix) });
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 === -1)
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
- : `target slot of \`${heading}\` opened at line ${from.line} but never closed - add \`)\``;
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