@plurnk/plurnk-contracts 1.10.0 → 1.11.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 (66) hide show
  1. package/README.md +2 -3
  2. package/SPEC.md +149 -75
  3. package/dist/plurnk.gemma.gbnf +4 -3
  4. package/dist/plurnk.qwen.gbnf +4 -3
  5. package/dist/schema/CapabilityDescriptor.json +23 -0
  6. package/dist/schema/CapabilityPolicy.json +18 -0
  7. package/dist/schema/CapabilityProjection.json +16 -0
  8. package/dist/schema/CapabilitySelector.json +24 -0
  9. package/dist/schema/ClientStatement.json +10 -2
  10. package/dist/schema/LoopPolicy.json +13 -0
  11. package/dist/schema/MatcherBody.json +8 -8
  12. package/dist/schema/ParsedPath.json +1 -11
  13. package/dist/schema/PlurnkStatement.json +76 -34
  14. package/dist/schema/ProblemProjection.json +38 -0
  15. package/dist/schema/ProposalProjection.json +2 -2
  16. package/dist/schema/ResourceSelection.json +12 -2
  17. package/dist/src/ApplicationPort.d.ts +9 -40
  18. package/dist/src/ApplicationPort.d.ts.map +1 -1
  19. package/dist/src/AstBuilder.d.ts +1 -7
  20. package/dist/src/AstBuilder.d.ts.map +1 -1
  21. package/dist/src/AstBuilder.js +127 -102
  22. package/dist/src/AstBuilder.js.map +1 -1
  23. package/dist/src/CapabilityAdmission.d.ts +9 -0
  24. package/dist/src/CapabilityAdmission.d.ts.map +1 -0
  25. package/dist/src/CapabilityAdmission.js +96 -0
  26. package/dist/src/CapabilityAdmission.js.map +1 -0
  27. package/dist/src/PlurnkErrorStrategy.d.ts.map +1 -1
  28. package/dist/src/PlurnkErrorStrategy.js +51 -1
  29. package/dist/src/PlurnkErrorStrategy.js.map +1 -1
  30. package/dist/src/PlurnkParser.d.ts +4 -1
  31. package/dist/src/PlurnkParser.d.ts.map +1 -1
  32. package/dist/src/PlurnkParser.js +86 -21
  33. package/dist/src/PlurnkParser.js.map +1 -1
  34. package/dist/src/Problems.d.ts +6 -1
  35. package/dist/src/Problems.d.ts.map +1 -1
  36. package/dist/src/Problems.js +34 -0
  37. package/dist/src/Problems.js.map +1 -1
  38. package/dist/src/Validator.d.ts +17 -4
  39. package/dist/src/Validator.d.ts.map +1 -1
  40. package/dist/src/Validator.js +65 -10
  41. package/dist/src/Validator.js.map +1 -1
  42. package/dist/src/generated/plurnkLexer.d.ts +52 -40
  43. package/dist/src/generated/plurnkLexer.d.ts.map +1 -1
  44. package/dist/src/generated/plurnkLexer.js +519 -431
  45. package/dist/src/generated/plurnkLexer.js.map +1 -1
  46. package/dist/src/generated/plurnkParser.d.ts +166 -92
  47. package/dist/src/generated/plurnkParser.d.ts.map +1 -1
  48. package/dist/src/generated/plurnkParser.js +1318 -705
  49. package/dist/src/generated/plurnkParser.js.map +1 -1
  50. package/dist/src/generated/plurnkParserVisitor.d.ts +49 -0
  51. package/dist/src/generated/plurnkParserVisitor.d.ts.map +1 -1
  52. package/dist/src/generated/plurnkParserVisitor.js +42 -0
  53. package/dist/src/generated/plurnkParserVisitor.js.map +1 -1
  54. package/dist/src/index.d.ts +4 -4
  55. package/dist/src/index.d.ts.map +1 -1
  56. package/dist/src/index.js +3 -3
  57. package/dist/src/index.js.map +1 -1
  58. package/dist/src/types.d.ts +3 -2
  59. package/dist/src/types.d.ts.map +1 -1
  60. package/dist/src/types.generated.d.ts +140 -34
  61. package/dist/src/types.generated.d.ts.map +1 -1
  62. package/dist/src/types.js +4 -6
  63. package/dist/src/types.js.map +1 -1
  64. package/package.json +2 -2
  65. package/plurnk.md +58 -44
  66. package/dist/schema/LoopFlags.json +0 -16
@@ -1,4 +1,4 @@
1
- import type { ClientDisplayCapabilities, ClientInteractionProjection, ClientInteractionResolution, EntryReadResult, JsonSchema, LoopFlags, ModelCatalogPage, ModelCatalogQuery, ModelRoute, OperationResult, PlurnkStatement, ProposalProjection, ReasoningPolicy } from "./types.ts";
1
+ import type { CapabilityPolicy, CapabilityProjection, ClientDisplayCapabilities, ClientInteractionProjection, ClientInteractionResolution, EntryReadResult, JsonSchema, LoopPolicy, ModelCatalogPage, ModelCatalogQuery, ModelRoute, OperationResult, PlurnkStatement, ProposalProjection, ReasoningPolicy } from "./types.ts";
2
2
  export type ProposalDecision = "accept" | "reject" | "cancel";
3
3
  export interface ProposalResolution {
4
4
  readonly decision: ProposalDecision;
@@ -78,7 +78,7 @@ export interface ApplicationPort {
78
78
  pendingClientInteractions(workspaceId: number): Promise<ClientInteractionProjection[]>;
79
79
  resolveClientInteraction(interactionId: number, resolution: ClientInteractionResolution): Promise<void>;
80
80
  ensureModelWorker(workspaceId: number, settings?: {
81
- readonly requestUserInput?: boolean;
81
+ readonly capabilities?: CapabilityPolicy;
82
82
  }): Promise<number>;
83
83
  runLoop(args: {
84
84
  readonly workspaceId: number;
@@ -86,7 +86,7 @@ export interface ApplicationPort {
86
86
  readonly prompt: string;
87
87
  readonly source?: string;
88
88
  readonly maxTurns?: number;
89
- readonly flags?: Partial<LoopFlags>;
89
+ readonly policy?: Partial<LoopPolicy>;
90
90
  readonly openPaths?: string[];
91
91
  readonly selector?: string;
92
92
  readonly childSelector?: string | null;
@@ -162,24 +162,6 @@ export interface ApplicationPort {
162
162
  readonly id: number;
163
163
  readonly name: string;
164
164
  }>;
165
- constrain(workspaceId: number, effect: string, glob: string): Promise<{
166
- readonly effect: string;
167
- readonly glob: string;
168
- readonly source: "explicit";
169
- }>;
170
- unconstrain(workspaceId: number, effect: string, glob: string): Promise<{
171
- readonly effect: string;
172
- readonly glob: string;
173
- }>;
174
- listConstraints(workspaceId: number): Promise<Array<{
175
- readonly effect: string;
176
- readonly glob: string;
177
- readonly source: "explicit" | "create";
178
- }>> | Array<{
179
- readonly effect: string;
180
- readonly glob: string;
181
- readonly source: "explicit" | "create";
182
- }>;
183
165
  workspaceDerivationStatus(workspaceId: number): {
184
166
  readonly phase: "preparing" | "indexing" | "complete" | "failed";
185
167
  readonly completed: number;
@@ -188,13 +170,6 @@ export interface ApplicationPort {
188
170
  readonly message: string;
189
171
  readonly level: "info" | "error";
190
172
  } | null;
191
- listMembers(workspaceId: number): Promise<{
192
- readonly members: Array<{
193
- readonly path: string;
194
- readonly effect: string;
195
- }>;
196
- readonly hidden: string[];
197
- }>;
198
173
  look(args: {
199
174
  readonly workspaceId: number;
200
175
  readonly workerId: number;
@@ -221,7 +196,7 @@ export interface ApplicationPort {
221
196
  readonly workspaceId: number;
222
197
  readonly name?: string;
223
198
  readonly settings?: {
224
- readonly requestUserInput?: boolean;
199
+ readonly capabilities?: CapabilityPolicy;
225
200
  };
226
201
  }): Promise<{
227
202
  readonly workerId: number;
@@ -259,20 +234,14 @@ export interface ApplicationPort {
259
234
  readonly policy: ReasoningPolicy;
260
235
  readonly supportedPolicies: readonly ReasoningPolicy[];
261
236
  }>;
262
- readWorkerSettings(args: {
237
+ readWorkerCapabilities(args: {
263
238
  readonly workspaceId: number;
264
239
  readonly workerId: number;
265
- }): Promise<{
266
- readonly requestUserInput: boolean;
267
- }>;
268
- setWorkerSettings(args: {
240
+ }): Promise<CapabilityProjection>;
241
+ setWorkerCapabilities(args: {
269
242
  readonly workspaceId: number;
270
243
  readonly workerId: number;
271
- readonly settings: {
272
- readonly requestUserInput?: boolean;
273
- };
274
- }): Promise<{
275
- readonly requestUserInput: boolean;
276
- }>;
244
+ readonly policy: CapabilityPolicy;
245
+ }): Promise<CapabilityProjection>;
277
246
  }
278
247
  //# sourceMappingURL=ApplicationPort.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ApplicationPort.d.ts","sourceRoot":"","sources":["../../src/ApplicationPort.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ApplicationPort.d.ts","sourceRoot":"","sources":["../../src/ApplicationPort.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import type { ClientStatement, ResourceSelection, ParsedPath, PlurnkStatement, Position } from "./types.ts";
1
+ import type { ClientStatement, ParsedPath, PlurnkStatement, Position } from "./types.ts";
2
2
  import type { ClientStatementContext, StatementContext, MidStatementContext } from "./generated/plurnkParser.ts";
3
3
  import { PlanStatementContext, SendStatementContext } from "./generated/plurnkParser.ts";
4
4
  import PlurnkParseError from "./PlurnkParseError.ts";
@@ -10,12 +10,6 @@ export default class AstBuilder {
10
10
  static takeAdvisories(): PlurnkParseError[];
11
11
  static build(ctx: StatementContext | MidStatementContext | PlanStatementContext | SendStatementContext): PlurnkStatement;
12
12
  static buildClient(ctx: ClientStatementContext): ClientStatement;
13
- /**
14
- * Parse a COPY/MOVE body into its destination target and optional trailing
15
- * scope. The scope is adjacent to the destination it selects:
16
- * `destination.txt<12,5,12,5>`.
17
- */
18
- static parseResourceSelection(raw: string, pos?: Position): ResourceSelection | null;
19
13
  /**
20
14
  * Apply target-slot decomposition without round-tripping through a statement.
21
15
  * Returns null for empty input and throws PlurnkParseError when a scheme URL
@@ -1 +1 @@
1
- {"version":3,"file":"AstBuilder.d.ts","sourceRoot":"","sources":["../../src/AstBuilder.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAIR,eAAe,EAaf,iBAAiB,EACjB,UAAU,EAGV,eAAe,EACf,QAAQ,EAOX,MAAM,YAAY,CAAC;AAEpB,OAAO,KAAK,EAGR,sBAAsB,EAetB,gBAAgB,EAChB,mBAAmB,EAGtB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAIH,oBAAoB,EACpB,oBAAoB,EAIvB,MAAM,6BAA6B,CAAC;AAErC,OAAO,gBAAgB,MAAM,uBAAuB,CAAC;AAMrD,OAAO,QAAQ,OAAO,CAAC;IACnB,SAAgB,KAAK,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC;CACtD;AAUD,MAAM,CAAC,OAAO,OAAO,UAAU;;IAK3B,MAAM,CAAC,cAAc,IAAI,gBAAgB,EAAE,CAI1C;IA+BD,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,gBAAgB,GAAG,mBAAmB,GAAG,oBAAoB,GAAG,oBAAoB,GAAG,eAAe,CA6BvH;IA0BD,MAAM,CAAC,WAAW,CAAC,GAAG,EAAE,sBAAsB,GAAG,eAAe,CAK/D;IA0dD;;;;OAIG;IACH,MAAM,CAAC,sBAAsB,CACzB,GAAG,EAAE,MAAM,EACX,GAAG,GAAE,QAAiC,GACvC,iBAAiB,GAAG,IAAI,CA6B1B;IAED;;;;OAIG;IACH,MAAM,CAAC,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,GAAE,QAAiC,GAAG,UAAU,GAAG,IAAI,CAoCvF;CA2HJ"}
1
+ {"version":3,"file":"AstBuilder.d.ts","sourceRoot":"","sources":["../../src/AstBuilder.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAIR,eAAe,EAcf,UAAU,EAGV,eAAe,EACf,QAAQ,EAOX,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAGR,sBAAsB,EAgBtB,gBAAgB,EAChB,mBAAmB,EAGtB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAKH,oBAAoB,EACpB,oBAAoB,EAIvB,MAAM,6BAA6B,CAAC;AAErC,OAAO,gBAAgB,MAAM,uBAAuB,CAAC;AAMrD,OAAO,QAAQ,OAAO,CAAC;IACnB,SAAgB,KAAK,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC;CACtD;AAWD,MAAM,CAAC,OAAO,OAAO,UAAU;;IAK3B,MAAM,CAAC,cAAc,IAAI,gBAAgB,EAAE,CAI1C;IAuBD,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,gBAAgB,GAAG,mBAAmB,GAAG,oBAAoB,GAAG,oBAAoB,GAAG,eAAe,CA6BvH;IA0BD,MAAM,CAAC,WAAW,CAAC,GAAG,EAAE,sBAAsB,GAAG,eAAe,CAK/D;IAghBD;;;;OAIG;IACH,MAAM,CAAC,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,GAAE,QAAiC,GAAG,UAAU,GAAG,IAAI,CA+BvF;CAsJJ"}
@@ -2,8 +2,7 @@
2
2
  import { ParserRuleContext, TerminalNode } from "antlr4ng";
3
3
  import * as xpath from "xpath";
4
4
  import { JSONPathEnvironment } from "json-p3/dist/json-p3.esm.js";
5
- import { COMBINED_ANCHOR_LINE_DIAGNOSTIC } from "./PlurnkErrorStrategy.js";
6
- import { BodyContext, IdentSignalContext, LineMarkerContext, PlanStatementContext, SendStatementContext, TargetContext, TagSignalContext, BranchSignalContext, } from "./generated/plurnkParser.js";
5
+ import { BodyContext, IdentSignalContext, LineMarkerContext, MetadataContext, PlanStatementContext, SendStatementContext, TargetContext, TagSignalContext, BranchSignalContext, } from "./generated/plurnkParser.js";
7
6
  import { plurnkLexer } from "./generated/plurnkLexer.js";
8
7
  import PlurnkParseError from "./PlurnkParseError.js";
9
8
  import PathSyntax from "./PathSyntax.js";
@@ -18,25 +17,21 @@ export default class AstBuilder {
18
17
  AstBuilder.#advisories = [];
19
18
  return taken;
20
19
  }
21
- // A body that is solely an HTML comment can never be a matcher: it is the annotation the
22
- // model put on the wrong line. Take it as the annotation and say so.
20
+ // A body that is solely an HTML comment can never be a matcher. Preserve it
21
+ // as the operation annotation and report only that deterministic normalization.
23
22
  static #annotationBody(op, delimiter, annotation, raw, position) {
24
23
  if (raw === null)
25
24
  return { annotation, raw };
26
25
  const comment = /^\s*<!--([\s\S]*?)-->\s*$/u.exec(raw);
27
26
  if (comment === null)
28
27
  return { annotation, raw };
29
- AstBuilder.#advisories.push(new PlurnkParseError(position.line, position.column, "parser", `\`## ${op}${delimiter}\` body was only an annotation; it was taken as the annotation and the ${op} ran. An annotation goes on the OP line (\`## ${op}${delimiter} (…) <!-- … -->\`); a ${op} body is a matcher.`, "warning"));
28
+ AstBuilder.#advisories.push(new PlurnkParseError(position.line, position.column, "parser", `The ${op} body contained only an HTML comment; it was applied as the operation annotation.`, "warning"));
30
29
  return { annotation: annotation ?? (comment[1] ?? "").trim(), raw: null };
31
30
  }
32
31
  static #SCHEME_PATTERN = /^[a-z][a-z0-9+.-]*:\/\//i;
33
- static #RESOURCE_SELECTION_TAIL = /(<-?\d+(?:\.\d+)?(?:(?:-|, ?)-?\d+(?:\.\d+)?)*>)(:*)$/;
34
- static #ANCHORED_RESOURCE_SELECTION_TAIL = new RegExp(String.raw `(<(?:-?\d+(?:\.\d+)?|@[0-9A-Za-z]{5})(?:, ?(?:-?\d+(?:\.\d+)?|@[0-9A-Za-z]{5}))*>)` + String.raw `(:*)$`);
35
- static #COMBINED_RESOURCE_SELECTION_TAIL = new RegExp(String.raw `(<(?:-?\d+(?:\.\d+)?|@[0-9A-Za-z]{5}|@[0-9A-Za-z]{5}(?::| )[1-9]\d*)`
36
- + String.raw `(?:, ?(?:-?\d+(?:\.\d+)?|@[0-9A-Za-z]{5}|@[0-9A-Za-z]{5}(?::| )[1-9]\d*))*>)$`);
37
- static #COMBINED_LINE_COORD = /@[0-9A-Za-z]{5}(?::| )[1-9]\d*/;
38
32
  // Compile-only RFC 9535 admission using the runtime's JSONPath engine. {§matcher-prefix-claims}
39
33
  static #JSONPATH = new JSONPathEnvironment();
34
+ static #GRAPH_MATCHER = /^&[<>]?[^\s<>]\S*$/u;
40
35
  static build(ctx) {
41
36
  // The strict turn root attaches the leading PLAN and the terminal SEND as direct
42
37
  // children (not wrapped in `statement`), so dispatch those by type first.
@@ -245,29 +240,37 @@ export default class AstBuilder {
245
240
  }
246
241
  static #buildCopy(ctx) {
247
242
  const position = AstBuilder.#positionOf(ctx);
248
- const slots = AstBuilder.#extractTextTagSlots(ctx.tagOpModifiers(), position);
249
- AstBuilder.#assertAppliedTags(slots.signal, position);
250
- const raw = AstBuilder.#bodyTextOf(ctx);
243
+ const modifier = ctx.transferModifiers();
244
+ const signal = AstBuilder.#tagsFromSignal(AstBuilder.#findFirst(modifier, TagSignalContext));
245
+ AstBuilder.#assertAppliedTags(signal, position);
246
+ const selections = modifier.resourceSelection();
247
+ if (selections.length !== 2)
248
+ throw new Error("COPY grammar did not produce two resource selections");
251
249
  return {
252
250
  op: "COPY",
253
251
  delimiter: AstBuilder.#splitDelimiter(ctx.OPEN_COPY().getText(), "COPY"),
254
252
  annotation: AstBuilder.#annotationOf(ctx),
255
- ...slots,
256
- body: raw === null ? null : AstBuilder.parseResourceSelection(raw, position),
253
+ signal,
254
+ source: AstBuilder.#resourceSelectionFromCtx(selections[0], position),
255
+ destination: AstBuilder.#resourceSelectionFromCtx(selections[1], position),
257
256
  position,
258
257
  };
259
258
  }
260
259
  static #buildMove(ctx) {
261
260
  const position = AstBuilder.#positionOf(ctx);
262
- const slots = AstBuilder.#extractTextTagSlots(ctx.tagOpModifiers(), position);
263
- AstBuilder.#assertAppliedTags(slots.signal, position);
264
- const raw = AstBuilder.#bodyTextOf(ctx);
261
+ const modifier = ctx.transferModifiers();
262
+ const signal = AstBuilder.#tagsFromSignal(AstBuilder.#findFirst(modifier, TagSignalContext));
263
+ AstBuilder.#assertAppliedTags(signal, position);
264
+ const selections = modifier.resourceSelection();
265
+ if (selections.length !== 2)
266
+ throw new Error("MOVE grammar did not produce two resource selections");
265
267
  return {
266
268
  op: "MOVE",
267
269
  delimiter: AstBuilder.#splitDelimiter(ctx.OPEN_MOVE().getText(), "MOVE"),
268
270
  annotation: AstBuilder.#annotationOf(ctx),
269
- ...slots,
270
- body: raw !== null ? AstBuilder.parseResourceSelection(raw, position) : null,
271
+ signal,
272
+ source: AstBuilder.#resourceSelectionFromCtx(selections[0], position),
273
+ destination: AstBuilder.#resourceSelectionFromCtx(selections[1], position),
271
274
  position,
272
275
  };
273
276
  }
@@ -310,6 +313,7 @@ export default class AstBuilder {
310
313
  annotation: AstBuilder.#annotationOf(ctx),
311
314
  signal,
312
315
  target: null,
316
+ metadata: null,
313
317
  lineMarker: null,
314
318
  body: AstBuilder.#requiredBodyTextOf(ctx),
315
319
  position,
@@ -318,15 +322,34 @@ export default class AstBuilder {
318
322
  static #buildPlan(ctx) {
319
323
  const position = AstBuilder.#positionOf(ctx);
320
324
  const slots = AstBuilder.#extractTagSlots(ctx.tagOpModifiers(), position);
325
+ const rejected = [
326
+ slots.signal !== null ? "[signal]" : null,
327
+ slots.target !== null ? "(path)" : null,
328
+ slots.metadata !== null ? "{metadata}" : null,
329
+ slots.lineMarker !== null ? "<scope>" : null,
330
+ ].filter((slot) => slot !== null);
331
+ if (rejected.length > 0) {
332
+ throw new PlurnkParseError(position.line, position.column, "visitor", `PLAN does not accept ${AstBuilder.#joinTerms(rejected)}.`);
333
+ }
321
334
  return {
322
335
  op: "PLAN",
323
336
  delimiter: AstBuilder.#splitDelimiter(ctx.OPEN_PLAN().getText(), "PLAN"),
324
337
  annotation: AstBuilder.#annotationOf(ctx),
325
- ...slots,
338
+ signal: null,
339
+ target: null,
340
+ metadata: null,
341
+ lineMarker: null,
326
342
  body: PlanValue.admit(AstBuilder.#requiredBodyTextOf(ctx)),
327
343
  position,
328
344
  };
329
345
  }
346
+ static #joinTerms(terms) {
347
+ if (terms.length < 2)
348
+ return terms[0] ?? "";
349
+ if (terms.length === 2)
350
+ return `${terms[0]} and ${terms[1]}`;
351
+ return `${terms.slice(0, -1).join(", ")}, and ${terms.at(-1)}`;
352
+ }
330
353
  static #buildKill(ctx) {
331
354
  const position = AstBuilder.#positionOf(ctx);
332
355
  const slots = AstBuilder.#extractIntSlots(ctx, position);
@@ -371,12 +394,14 @@ export default class AstBuilder {
371
394
  return {
372
395
  signal,
373
396
  target: AstBuilder.#targetFromCtx(AstBuilder.#findFirst(ctx, TargetContext), pos),
397
+ metadata: AstBuilder.#metadataFromCtx(ctx),
374
398
  };
375
399
  }
376
400
  static #extractTagSlots(modCtx, pos) {
377
401
  return {
378
402
  signal: AstBuilder.#tagsFromSignal(AstBuilder.#findFirst(modCtx, TagSignalContext)),
379
403
  target: AstBuilder.#targetFromCtx(AstBuilder.#findFirst(modCtx, TargetContext), pos),
404
+ metadata: AstBuilder.#metadataFromCtx(modCtx),
380
405
  lineMarker: AstBuilder.#lineMarkerFromCtx(AstBuilder.#findFirst(modCtx, LineMarkerContext)),
381
406
  };
382
407
  }
@@ -384,6 +409,7 @@ export default class AstBuilder {
384
409
  return {
385
410
  signal: AstBuilder.#tagsFromSignal(AstBuilder.#findFirst(modCtx, TagSignalContext)),
386
411
  target: AstBuilder.#targetFromCtx(AstBuilder.#findFirst(modCtx, TargetContext), pos),
412
+ metadata: AstBuilder.#metadataFromCtx(modCtx),
387
413
  lineMarker: AstBuilder.#textLineMarkerFromCtx(AstBuilder.#findFirst(modCtx, LineMarkerContext)),
388
414
  };
389
415
  }
@@ -391,6 +417,7 @@ export default class AstBuilder {
391
417
  return {
392
418
  signal: AstBuilder.#tagsFromSignal(AstBuilder.#findFirst(modCtx, TagSignalContext)),
393
419
  target: AstBuilder.#targetFromCtx(AstBuilder.#findFirst(modCtx, TargetContext), pos),
420
+ metadata: AstBuilder.#metadataFromCtx(modCtx),
394
421
  lineMarker: AstBuilder.#textLineMarkerFromCtx(AstBuilder.#findFirst(modCtx, LineMarkerContext)),
395
422
  };
396
423
  }
@@ -403,6 +430,7 @@ export default class AstBuilder {
403
430
  return {
404
431
  signal: sig !== null ? Number.parseInt(sig, 10) : null,
405
432
  target: AstBuilder.#targetFromCtx(AstBuilder.#findFirst(ctx, TargetContext), pos),
433
+ metadata: AstBuilder.#metadataFromCtx(ctx),
406
434
  };
407
435
  }
408
436
  // Depth-first search for the first terminal of `tokenType`; returns its text or null.
@@ -437,6 +465,7 @@ export default class AstBuilder {
437
465
  signal: identNode !== null ? identNode.getText() : null,
438
466
  tags,
439
467
  target: AstBuilder.#targetFromCtx(once(TargetContext, "one `(target)`"), pos),
468
+ metadata: AstBuilder.#metadataFromCtx(modCtx),
440
469
  lineMarker: AstBuilder.#lineMarkerFromCtx(once(LineMarkerContext, "one `<scope>`")),
441
470
  };
442
471
  }
@@ -496,6 +525,22 @@ export default class AstBuilder {
496
525
  const text = ctx.TARGET_TEXT().map((token) => token.getText()).join("");
497
526
  return AstBuilder.parsePath(text, pos);
498
527
  }
528
+ static #metadataFromCtx(ctx) {
529
+ const blocks = AstBuilder.#findAll(ctx, MetadataContext);
530
+ return blocks.length === 0
531
+ ? null
532
+ : blocks.map((block) => block.METADATA_TEXT().map((token) => token.getText()).join(""));
533
+ }
534
+ static #resourceSelectionFromCtx(ctx, pos) {
535
+ const target = AstBuilder.#targetFromCtx(AstBuilder.#findFirst(ctx, TargetContext), pos);
536
+ if (target === null)
537
+ throw new Error("resource selection grammar did not produce a target");
538
+ return {
539
+ target,
540
+ metadata: AstBuilder.#metadataFromCtx(ctx),
541
+ lineMarker: AstBuilder.#textLineMarkerFromCtx(AstBuilder.#findFirst(ctx, LineMarkerContext)),
542
+ };
543
+ }
499
544
  static #lineMarkerFromCtx(ctx) {
500
545
  if (ctx === null)
501
546
  return null;
@@ -570,33 +615,6 @@ export default class AstBuilder {
570
615
  // L_MARKER always matches at least one number, so marks is non-empty.
571
616
  return { marks: marks };
572
617
  }
573
- /**
574
- * Parse a COPY/MOVE body into its destination target and optional trailing
575
- * scope. The scope is adjacent to the destination it selects:
576
- * `destination.txt<12,5,12,5>`.
577
- */
578
- static parseResourceSelection(raw, pos = { line: 0, column: 0 }) {
579
- if (raw.length === 0)
580
- return null;
581
- const combinedMarker = AstBuilder.#COMBINED_RESOURCE_SELECTION_TAIL.exec(raw)?.[1];
582
- if (combinedMarker !== undefined && AstBuilder.#COMBINED_LINE_COORD.test(combinedMarker)) {
583
- throw new PlurnkParseError(pos.line, pos.column, "visitor", COMBINED_ANCHOR_LINE_DIAGNOSTIC);
584
- }
585
- const markerMatch = AstBuilder.#ANCHORED_RESOURCE_SELECTION_TAIL.exec(raw)
586
- ?? AstBuilder.#RESOURCE_SELECTION_TAIL.exec(raw);
587
- const markerText = markerMatch?.[1] ?? null;
588
- if ((markerMatch?.[2].length ?? 0) > 0) {
589
- throw new PlurnkParseError(pos.line, pos.column, "visitor", "COPY/MOVE destination scope must end the destination selection; remove the extra `:` after the scope");
590
- }
591
- const pathText = (markerText === null ? raw : raw.slice(0, -markerText.length)).trimEnd();
592
- const target = AstBuilder.parsePath(pathText, pos);
593
- if (target === null)
594
- return null;
595
- return {
596
- target,
597
- lineMarker: markerText === null ? null : AstBuilder.#parseTextLineMarker(markerText),
598
- };
599
- }
600
618
  /**
601
619
  * Apply target-slot decomposition without round-tripping through a statement.
602
620
  * Returns null for empty input and throws PlurnkParseError when a scheme URL
@@ -609,14 +627,10 @@ export default class AstBuilder {
609
627
  if (!AstBuilder.#SCHEME_PATTERN.test(target)) {
610
628
  return { kind: "local", raw: target };
611
629
  }
612
- // Split trailing request metadata before WHATWG decomposition; the addressed
613
- // scheme interprets the preserved ordered pairs. {§path-request-metadata}
614
- const braceIdx = target.indexOf("{");
615
- const urlPart = braceIdx === -1 ? target : target.slice(0, braceIdx);
616
- const headers = braceIdx === -1 ? null : AstBuilder.#splitHeaders(target.slice(braceIdx), pos);
630
+ const protectedTarget = AstBuilder.#protectPathBraces(target);
617
631
  let url;
618
632
  try {
619
- url = new URL(urlPart);
633
+ url = new URL(protectedTarget.value);
620
634
  }
621
635
  catch {
622
636
  throw new PlurnkParseError(pos.line, pos.column, "visitor", "invalid URI in path");
@@ -634,44 +648,40 @@ export default class AstBuilder {
634
648
  password: url.password || null,
635
649
  hostname: url.hostname || null,
636
650
  port: url.port ? Number.parseInt(url.port, 10) : null,
637
- pathname: url.pathname,
651
+ pathname: protectedTarget.restore(url.pathname),
638
652
  query: AstBuilder.#queryFrom(url),
639
653
  fragment: url.hash ? url.hash.slice(1) : null,
640
654
  };
641
- if (headers)
642
- parsed.headers = headers;
643
655
  return parsed;
644
656
  }
645
- // Split a target's trailing `{key: value}` request-metadata region into ordered pairs.
646
- // Each block is one header (the value ends at `}`, so commas inside a value are
647
- // fine); the key is the text before the first `:`, the value the trimmed rest
648
- // (internal colons kept). Fail-hard on a malformed region (stray text, unclosed
649
- // `{`, or a keyless block) — a header slot the scheme can't read is a contract
650
- // violation, not something to swallow.
651
- static #splitHeaders(meta, pos) {
652
- const headers = [];
653
- let i = 0;
654
- while (i < meta.length) {
655
- if (meta[i] !== "{") {
656
- throw new PlurnkParseError(pos.line, pos.column, "visitor", "invalid request metadata: expected a `{name: value}` block");
657
- }
658
- const end = meta.indexOf("}", i + 1);
659
- if (end === -1) {
660
- throw new PlurnkParseError(pos.line, pos.column, "visitor", "invalid request metadata: unclosed `{name: value}` block");
661
- }
662
- const inner = meta.slice(i + 1, end);
663
- const colon = inner.indexOf(":");
664
- if (colon === -1) {
665
- throw new PlurnkParseError(pos.line, pos.column, "visitor", "invalid request metadata: missing `:` separator");
666
- }
667
- const key = inner.slice(0, colon).trim();
668
- if (key.length === 0) {
669
- throw new PlurnkParseError(pos.line, pos.column, "visitor", "invalid request metadata: empty name");
670
- }
671
- headers.push([key, inner.slice(colon + 1).trim()]);
672
- i = end + 1;
657
+ // WHATWG percent-encodes raw braces. Protect only authored path braces while
658
+ // decomposing so brace globs remain distinguishable from authored `%7B`/`%7D`
659
+ // literal path data. Query and fragment spelling remain untouched.
660
+ static #protectPathBraces(target) {
661
+ const authorityStart = target.indexOf("://") + 3;
662
+ const pathStart = target.indexOf("/", authorityStart);
663
+ if (pathStart < 0)
664
+ return { value: target, restore: (pathname) => pathname };
665
+ const queryStart = target.indexOf("?", pathStart);
666
+ const fragmentStart = target.indexOf("#", pathStart);
667
+ const endings = [queryStart, fragmentStart].filter((index) => index >= 0);
668
+ const pathEnd = endings.length === 0 ? target.length : Math.min(...endings);
669
+ const rawPath = target.slice(pathStart, pathEnd);
670
+ if (!/[{}]/u.test(rawPath))
671
+ return { value: target, restore: (pathname) => pathname };
672
+ const sentinels = [];
673
+ for (let codePoint = 0xF0000; sentinels.length < 2; codePoint += 1) {
674
+ const character = String.fromCodePoint(codePoint);
675
+ const encoded = encodeURIComponent(character);
676
+ if (!target.includes(character) && !target.toUpperCase().includes(encoded))
677
+ sentinels.push(encoded);
673
678
  }
674
- return headers;
679
+ const [open, close] = sentinels;
680
+ const protectedPath = rawPath.replaceAll("{", open).replaceAll("}", close);
681
+ return {
682
+ value: target.slice(0, pathStart) + protectedPath + target.slice(pathEnd),
683
+ restore: (pathname) => pathname.replaceAll(open, "{").replaceAll(close, "}"),
684
+ };
675
685
  }
676
686
  static #queryFrom(url) {
677
687
  const queryStart = url.href.indexOf("?");
@@ -683,19 +693,30 @@ export default class AstBuilder {
683
693
  // The leading prefix claims its dialect; failed claimed syntax never falls back
684
694
  // to glob. XPath's `//` is classified before regex `/`. {§matcher-prefix-claims}
685
695
  static #parseMatcherBody(body, pos) {
686
- if (body.startsWith("//")) {
696
+ // At statement EOF ANTLR retains one ordinary terminating line ending in
697
+ // BODY_TEXT; before a following heading the lexer consumes that same EOL as
698
+ // SECTION_END. Normalize the equivalent surfaces before enforcing one line.
699
+ const raw = body.replace(/(?:\r\n|\r|\n)$/u, "");
700
+ const lineCount = raw.split(/\r\n|\r|\n/u).length;
701
+ if (lineCount !== 1) {
702
+ throw new PlurnkParseError(pos.line, pos.column, "visitor", `Matcher body has ${lineCount} lines; expected 1.`);
703
+ }
704
+ if (raw.startsWith("//")) {
687
705
  try {
688
- xpath.parse(body);
706
+ xpath.parse(raw);
689
707
  }
690
708
  catch (e) {
691
709
  throw new PlurnkParseError(pos.line, pos.column, "visitor", `pattern leads with \`//\` but is not a valid xpath selector - ${AstBuilder.#detail(e)}`);
692
710
  }
693
- return { dialect: "xpath", raw: body };
711
+ return { dialect: "xpath", raw };
694
712
  }
695
- if (body.startsWith("/")) {
696
- const regex = AstBuilder.#tryParseSlashRegex(body);
713
+ if (raw.startsWith("/")) {
714
+ const regex = AstBuilder.#tryParseSlashRegex(raw);
697
715
  if (regex.ok)
698
- return { dialect: "regex", raw: body, pattern: regex.pattern, flags: regex.flags };
716
+ return { dialect: "regex", raw, pattern: regex.pattern, flags: regex.flags };
717
+ if (regex.reason === "invalid" && /^[\t ]/u.test(regex.flags)) {
718
+ throw new PlurnkParseError(pos.line, pos.column, "visitor", "Regex matcher has trailing text after its closing `/`; operation modifiers precede the line ending, and the matcher occupies the next line.");
719
+ }
699
720
  const slashRecovery = regex.reason === "invalid"
700
721
  && regex.detail.includes("Invalid flags supplied")
701
722
  ? " - use only ECMAScript flags after the closing `/`; escape a literal `/` inside the pattern as `\\/`"
@@ -703,26 +724,30 @@ export default class AstBuilder {
703
724
  // Quote the offending matcher so a multi-op emission's failure is
704
725
  // unambiguous about WHICH body failed (a correct sibling regex must
705
726
  // not take the blame for a broken one).
706
- const excerpt = body.length > 80 ? `${body.slice(0, 80)}…` : body;
727
+ const excerpt = raw.length > 80 ? `${raw.slice(0, 80)}…` : raw;
707
728
  throw new PlurnkParseError(pos.line, pos.column, "visitor", regex.reason === "unclosed"
708
729
  ? `regex matcher must use \`/pattern/flags\`; this matcher has no closing \`/\`: \`${excerpt}\``
709
730
  : `pattern leads with \`/\` but is not a valid \`/pattern/flags\` regex - ${regex.detail}${slashRecovery}: \`${excerpt}\``);
710
731
  }
711
- if (body.startsWith("$")) {
732
+ if (raw.startsWith("$")) {
712
733
  // Compile-only RFC 9535 admission through the shared json-p3 engine.
713
734
  try {
714
- AstBuilder.#JSONPATH.compile(body);
735
+ AstBuilder.#JSONPATH.compile(raw);
715
736
  }
716
737
  catch (e) {
717
738
  throw new PlurnkParseError(pos.line, pos.column, "visitor", `pattern leads with \`$\` but is not a valid jsonpath - ${AstBuilder.#detail(e)}`);
718
739
  }
719
- return { dialect: "jsonpath", raw: body };
740
+ return { dialect: "jsonpath", raw };
741
+ }
742
+ if (raw.startsWith("~"))
743
+ return { dialect: "semantic", raw };
744
+ if (raw.startsWith("&")) {
745
+ if (!AstBuilder.#GRAPH_MATCHER.test(raw)) {
746
+ throw new PlurnkParseError(pos.line, pos.column, "visitor", "Malformed graph matcher; expected `&symbol`, `&<symbol`, or `&>symbol`.");
747
+ }
748
+ return { dialect: "graph", raw };
720
749
  }
721
- if (body.startsWith("~"))
722
- return { dialect: "semantic", raw: body };
723
- if (body.startsWith("@"))
724
- return { dialect: "graph", raw: body };
725
- return { dialect: "glob", raw: body };
750
+ return { dialect: "glob", raw };
726
751
  }
727
752
  static #detail(e) {
728
753
  return e instanceof Error ? e.message : String(e);
@@ -760,7 +785,7 @@ export default class AstBuilder {
760
785
  new RegExp(pattern, flags);
761
786
  }
762
787
  catch (e) {
763
- return { ok: false, reason: "invalid", detail: AstBuilder.#detail(e) };
788
+ return { ok: false, reason: "invalid", detail: AstBuilder.#detail(e), flags };
764
789
  }
765
790
  return { ok: true, pattern, flags };
766
791
  }