@plurnk/plurnk-schemes 1.3.12 → 1.4.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 (71) hide show
  1. package/README.md +25 -14
  2. package/SPEC.md +311 -75
  3. package/dist/DefaultRead.d.ts +8 -4
  4. package/dist/DefaultRead.d.ts.map +1 -1
  5. package/dist/DefaultRead.js +37 -13
  6. package/dist/DefaultRead.js.map +1 -1
  7. package/dist/Manifest.d.ts +6 -0
  8. package/dist/Manifest.d.ts.map +1 -0
  9. package/dist/Manifest.js +115 -0
  10. package/dist/Manifest.js.map +1 -0
  11. package/dist/Matcher.d.ts +5 -6
  12. package/dist/Matcher.d.ts.map +1 -1
  13. package/dist/Matcher.js +51 -59
  14. package/dist/Matcher.js.map +1 -1
  15. package/dist/MimetypeClassifier.d.ts +1 -1
  16. package/dist/MimetypeClassifier.d.ts.map +1 -1
  17. package/dist/MimetypeClassifier.js +11 -15
  18. package/dist/MimetypeClassifier.js.map +1 -1
  19. package/dist/NetworkAddress.d.ts +13 -0
  20. package/dist/NetworkAddress.d.ts.map +1 -0
  21. package/dist/NetworkAddress.js +43 -0
  22. package/dist/NetworkAddress.js.map +1 -0
  23. package/dist/OutputScheme.d.ts.map +1 -1
  24. package/dist/OutputScheme.js +5 -6
  25. package/dist/OutputScheme.js.map +1 -1
  26. package/dist/PacketSections.d.ts +6 -0
  27. package/dist/PacketSections.d.ts.map +1 -0
  28. package/dist/PacketSections.js +42 -0
  29. package/dist/PacketSections.js.map +1 -0
  30. package/dist/PathMimetype.js +9 -9
  31. package/dist/PathMimetype.js.map +1 -1
  32. package/dist/Results.d.ts +29 -8
  33. package/dist/Results.d.ts.map +1 -1
  34. package/dist/Results.js +102 -44
  35. package/dist/Results.js.map +1 -1
  36. package/dist/SchemeDiscovery.d.ts +2 -0
  37. package/dist/SchemeDiscovery.d.ts.map +1 -1
  38. package/dist/SchemeDiscovery.js +40 -42
  39. package/dist/SchemeDiscovery.js.map +1 -1
  40. package/dist/SchemeResolver.d.ts.map +1 -1
  41. package/dist/SchemeResolver.js +4 -5
  42. package/dist/SchemeResolver.js.map +1 -1
  43. package/dist/Slicer.d.ts +36 -14
  44. package/dist/Slicer.d.ts.map +1 -1
  45. package/dist/Slicer.js +330 -362
  46. package/dist/Slicer.js.map +1 -1
  47. package/dist/Summarize.js +3 -3
  48. package/dist/Summarize.js.map +1 -1
  49. package/dist/ctx.d.ts +60 -60
  50. package/dist/ctx.d.ts.map +1 -1
  51. package/dist/edit-receipt.d.ts +39 -0
  52. package/dist/edit-receipt.d.ts.map +1 -0
  53. package/dist/edit-receipt.js +2 -0
  54. package/dist/edit-receipt.js.map +1 -0
  55. package/dist/handler.d.ts +7 -8
  56. package/dist/handler.d.ts.map +1 -1
  57. package/dist/handler.js +4 -2
  58. package/dist/handler.js.map +1 -1
  59. package/dist/index.d.ts +13 -5
  60. package/dist/index.d.ts.map +1 -1
  61. package/dist/index.js +6 -0
  62. package/dist/index.js.map +1 -1
  63. package/dist/packet.d.ts +2 -3
  64. package/dist/packet.d.ts.map +1 -1
  65. package/dist/packet.js +2 -20
  66. package/dist/packet.js.map +1 -1
  67. package/dist/types.d.ts +3 -11
  68. package/dist/types.d.ts.map +1 -1
  69. package/dist/types.js +1 -7
  70. package/dist/types.js.map +1 -1
  71. package/package.json +10 -8
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PacketSections.d.ts","sourceRoot":"","sources":["../src/PacketSections.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAKtD,MAAM,CAAC,OAAO,OAAO,cAAc;;IAC/B,MAAM,CAAC,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,SAA0B,GAAG,kBAAkB,EAAE,CAY3F;CAuBJ"}
@@ -0,0 +1,42 @@
1
+ const FIELDS = ["name", "slot", "header", "content"];
2
+ const FIELD_NAMES = new Set(FIELDS);
3
+ export default class PacketSections {
4
+ static assertDrafts(value, subject = "packet section drafts") {
5
+ if (!Array.isArray(value))
6
+ throw new TypeError(`${subject} must be an array`);
7
+ const names = new Set();
8
+ for (let index = 0; index < value.length; index += 1) {
9
+ const section = PacketSections.#assertDraft(value[index], `${subject}[${index}]`);
10
+ if (names.has(section.name)) {
11
+ throw new TypeError(`${subject} has duplicate section name '${section.name}'`);
12
+ }
13
+ names.add(section.name);
14
+ }
15
+ return value;
16
+ }
17
+ static #assertDraft(value, subject) {
18
+ if (value === null || typeof value !== "object" || Array.isArray(value)) {
19
+ throw new TypeError(`${subject} must be an object`);
20
+ }
21
+ const section = value;
22
+ const missing = FIELDS.find((field) => !Object.hasOwn(section, field));
23
+ if (missing !== undefined)
24
+ throw new TypeError(`${subject} is missing field '${missing}'`);
25
+ const unexpected = Object.keys(section).find((field) => !FIELD_NAMES.has(field));
26
+ if (unexpected !== undefined)
27
+ throw new TypeError(`${subject} has unexpected field '${unexpected}'`);
28
+ if (typeof section.name !== "string" || section.name.length === 0) {
29
+ throw new TypeError(`${subject}.name must be a non-empty string`);
30
+ }
31
+ if (section.slot !== "system" && section.slot !== "user") {
32
+ throw new TypeError(`${subject}.slot must be system or user`);
33
+ }
34
+ if (section.header !== null && typeof section.header !== "string") {
35
+ throw new TypeError(`${subject}.header must be a string or null`);
36
+ }
37
+ if (typeof section.content !== "string")
38
+ throw new TypeError(`${subject}.content must be a string`);
39
+ return value;
40
+ }
41
+ }
42
+ //# sourceMappingURL=PacketSections.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PacketSections.js","sourceRoot":"","sources":["../src/PacketSections.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
- // Path-extension mimetype resolver for entry schemes per plurnk-grammar
2
- // 0.14.0 §Paths: "Path suffix (`.json`, `.md`, `.txt`, etc.) declares
3
- // mimetype; absent suffix defers to scheme default."
1
+ // Path-extension mimetype resolver for entry schemes ({§path-extension-mimetype}):
2
+ // a path suffix (`.json`, `.md`, `.txt`, etc.) declares the
3
+ // mimetype; an absent suffix defers to the scheme default.
4
4
  //
5
5
  // Plurnk-service implements this uniformly across entry schemes: a
6
6
  // pathname's extension drives the effective mimetype (via the sibling
@@ -9,15 +9,15 @@
9
9
  //
10
10
  // This makes structural ops (`<L>` item-index, matcher dialect dispatch)
11
11
  // fire correctly without content-sniffing: a model writing JSON to
12
- // `known://users.json` opts into JSON treatment via the `.json` suffix,
13
- // while `known://notes` (no suffix) stays at Known's default of
12
+ // `notes:///users.json` opts into JSON treatment via the `.json` suffix,
13
+ // while `notes:///scratch` (no suffix) stays at that scheme's default of
14
14
  // `text/markdown`.
15
15
  //
16
16
  // Consistent across:
17
- // - known://users.json → application/json
18
- // - known://notes.md → text/markdown
19
- // - known://config.yaml → application/yaml
20
- // - known://users → scheme default (text/markdown for Known)
17
+ // - notes:///users.json → application/json
18
+ // - notes:///scratch.md → text/markdown
19
+ // - notes:///config.yaml → application/yaml
20
+ // - notes:///scratch → scheme default
21
21
  import MimetypeClassifier from "./MimetypeClassifier.js";
22
22
  export default class PathMimetype {
23
23
  // Extract the suffix (everything after the last dot in the last segment)
@@ -1 +1 @@
1
- {"version":3,"file":"PathMimetype.js","sourceRoot":"","sources":["../src/PathMimetype.ts"],"names":[],"mappings":"AAAA,wEAAwE;AACxE,sEAAsE;AACtE,qDAAqD;AACrD,EAAE;AACF,mEAAmE;AACnE,sEAAsE;AACtE,uEAAuE;AACvE,gDAAgD;AAChD,EAAE;AACF,yEAAyE;AACzE,mEAAmE;AACnE,wEAAwE;AACxE,gEAAgE;AAChE,mBAAmB;AACnB,EAAE;AACF,qBAAqB;AACrB,gDAAgD;AAChD,6CAA6C;AAC7C,gDAAgD;AAChD,wEAAwE;AAGxE,OAAO,kBAAkB,MAAM,yBAAyB,CAAC;AAEzD,MAAM,CAAC,OAAO,OAAO,YAAY;IAC7B,yEAAyE;IACzE,wDAAwD;IACxD,MAAM,CAAC,gBAAgB,CAAC,QAAgB;QACpC,MAAM,SAAS,GAAG,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QAC5C,MAAM,WAAW,GAAG,SAAS,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;QAChF,MAAM,OAAO,GAAG,WAAW,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QAC7C,IAAI,OAAO,IAAI,CAAC;YAAE,OAAO,EAAE,CAAC,CAAE,iDAAiD;QAC/E,OAAO,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAE,2BAA2B;IACnE,CAAC;IAED,2CAA2C;IAC3C,uEAAuE;IACvE,uEAAuE;IACvE,kCAAkC;IAClC,oEAAoE;IACpE,wEAAwE;IACxE,MAAM,CAAC,KAAK,CAAC,OAAO,CAChB,QAAgB,EAChB,aAAqB,EACrB,SAAgC;QAEhC,MAAM,GAAG,GAAG,YAAY,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QACpD,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YAC5C,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;YACjD,IAAI,QAAQ,KAAK,IAAI;gBAAE,OAAO,kBAAkB,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QACjF,CAAC;QACD,OAAO,aAAa,CAAC;IACzB,CAAC;CACJ"}
1
+ {"version":3,"file":"PathMimetype.js","sourceRoot":"","sources":["../src/PathMimetype.ts"],"names":[],"mappings":"AAAA,mFAAmF;AACnF,4DAA4D;AAC5D,2DAA2D;AAC3D,EAAE;AACF,mEAAmE;AACnE,sEAAsE;AACtE,uEAAuE;AACvE,gDAAgD;AAChD,EAAE;AACF,yEAAyE;AACzE,mEAAmE;AACnE,yEAAyE;AACzE,yEAAyE;AACzE,mBAAmB;AACnB,EAAE;AACF,qBAAqB;AACrB,iDAAiD;AACjD,8CAA8C;AAC9C,iDAAiD;AACjD,+CAA+C;AAG/C,OAAO,kBAAkB,MAAM,yBAAyB,CAAC;AAEzD,MAAM,CAAC,OAAO,OAAO,YAAY;IAC7B,yEAAyE;IACzE,wDAAwD;IACxD,MAAM,CAAC,gBAAgB,CAAC,QAAgB;QACpC,MAAM,SAAS,GAAG,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QAC5C,MAAM,WAAW,GAAG,SAAS,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;QAChF,MAAM,OAAO,GAAG,WAAW,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QAC7C,IAAI,OAAO,IAAI,CAAC;YAAE,OAAO,EAAE,CAAC,CAAE,iDAAiD;QAC/E,OAAO,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAE,2BAA2B;IACnE,CAAC;IAED,2CAA2C;IAC3C,uEAAuE;IACvE,uEAAuE;IACvE,kCAAkC;IAClC,oEAAoE;IACpE,wEAAwE;IACxE,MAAM,CAAC,KAAK,CAAC,OAAO,CAChB,QAAgB,EAChB,aAAqB,EACrB,SAAgC;QAEhC,MAAM,GAAG,GAAG,YAAY,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QACpD,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YAC5C,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;YACjD,IAAI,QAAQ,KAAK,IAAI;gBAAE,OAAO,kBAAkB,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QACjF,CAAC;QACD,OAAO,aAAa,CAAC;IACzB,CAAC;CACJ"}
package/dist/Results.d.ts CHANGED
@@ -1,12 +1,24 @@
1
- import type { LogCoordinate, TelemetryEvent } from "@plurnk/plurnk-grammar";
2
- export type { TelemetryEvent };
1
+ import { InvalidOperationResultError, type ProblemDetails } from "@plurnk/plurnk-contracts";
2
+ import type { TextRegion } from "@plurnk/plurnk-contracts";
3
+ export type { ProblemDetails };
4
+ export { InvalidOperationResultError };
5
+ export interface ScopeNormalization {
6
+ readonly requested: readonly [number, number, number];
7
+ readonly canonical: readonly [number, number, number, number];
8
+ }
3
9
  export interface SchemeResult {
4
10
  readonly status: number;
5
- readonly error?: unknown;
11
+ readonly problem?: ProblemDetails;
12
+ readonly scopeNormalizations?: ReadonlyArray<ScopeNormalization>;
13
+ readonly error?: never;
6
14
  readonly [field: string]: unknown;
7
15
  }
8
16
  export interface SchemeResultBase extends SchemeResult {
9
- readonly error?: TelemetryEvent;
17
+ readonly problem?: ProblemDetails;
18
+ }
19
+ export interface MatchEvidence {
20
+ readonly path?: string;
21
+ readonly region?: TextRegion;
10
22
  }
11
23
  export interface EntryResult extends SchemeResultBase {
12
24
  readonly shape: "entry";
@@ -15,7 +27,8 @@ export interface EntryResult extends SchemeResultBase {
15
27
  readonly content?: string | null;
16
28
  readonly mimetype?: string | null;
17
29
  readonly startLine?: number | null;
18
- readonly matches?: number | null;
30
+ readonly region?: TextRegion;
31
+ readonly matches?: ReadonlyArray<MatchEvidence>;
19
32
  readonly reason?: string;
20
33
  }
21
34
  export interface ProposalResult extends SchemeResultBase {
@@ -29,7 +42,8 @@ export interface PassthroughResult extends SchemeResultBase {
29
42
  readonly content?: string | null;
30
43
  readonly mimetype?: string | null;
31
44
  readonly startLine?: number | null;
32
- readonly matches?: number | null;
45
+ readonly region?: TextRegion;
46
+ readonly matches?: ReadonlyArray<MatchEvidence>;
33
47
  readonly reason?: string;
34
48
  }
35
49
  export default class Results {
@@ -37,7 +51,14 @@ export default class Results {
37
51
  static isProposal(result: SchemeResult): result is ProposalResult;
38
52
  static isPassthrough(result: SchemeResult): result is PassthroughResult;
39
53
  static isErrorStatus(status: number): boolean;
40
- static error(scheme: string, kind: string, message?: string | null, position?: TelemetryEvent["position"]): TelemetryEvent;
41
- static logCoordinate(coordinate: string, op?: string): LogCoordinate;
54
+ static problem(owner: string, code: string, status: number, detail: string, extensions?: Readonly<Record<string, unknown>>): ProblemDetails;
55
+ static failure(owner: string, code: string, status: number, detail: string, fields?: Readonly<Record<string, unknown>>, extensions?: Readonly<Record<string, unknown>>): SchemeResult;
56
+ static assertProblem(problem: unknown): asserts problem is ProblemDetails;
57
+ static assertMatchEvidence(evidence: unknown): MatchEvidence;
58
+ static assertMatchEvidenceList(evidence: unknown): ReadonlyArray<MatchEvidence>;
59
+ static assertReadResult<T extends SchemeResult>(result: T): T;
60
+ static assertScopeNormalizations(value: unknown): ReadonlyArray<ScopeNormalization>;
61
+ static assert<T extends SchemeResult>(result: T): T;
62
+ static attachInstance<T extends SchemeResult>(result: T, instance: string): T;
42
63
  }
43
64
  //# sourceMappingURL=Results.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Results.d.ts","sourceRoot":"","sources":["../src/Results.ts"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAE5E,YAAY,EAAE,cAAc,EAAE,CAAC;AAE/B,MAAM,WAAW,YAAY;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IACzB,QAAQ,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;CACrC;AAED,MAAM,WAAW,gBAAiB,SAAQ,YAAY;IAClD,QAAQ,CAAC,KAAK,CAAC,EAAE,cAAc,CAAC;CACnC;AAED,MAAM,WAAW,WAAY,SAAQ,gBAAgB;IACjD,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,cAAe,SAAQ,gBAAgB;IACpD,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAC3B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,iBAAkB,SAAQ,gBAAgB;IACvD,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC;IAC9B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,CAAC,OAAO,OAAO,OAAO;IACxB,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,IAAI,WAAW,CAE1D;IAED,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,IAAI,cAAc,CAEhE;IAED,MAAM,CAAC,aAAa,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,IAAI,iBAAiB,CAEtE;IAID,MAAM,CAAC,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAE5C;IAMD,MAAM,CAAC,KAAK,CACR,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,EACvB,QAAQ,CAAC,EAAE,cAAc,CAAC,UAAU,CAAC,GACtC,cAAc,CAQhB;IAMD,MAAM,CAAC,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,GAAG,aAAa,CAMnE;CACJ"}
1
+ {"version":3,"file":"Results.d.ts","sourceRoot":"","sources":["../src/Results.ts"],"names":[],"mappings":"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"}
package/dist/Results.js CHANGED
@@ -1,22 +1,5 @@
1
- // Canonical op-result contract for `@plurnk/plurnk-schemes-*` siblings and
2
- // their consumer (plurnk-service). Replaces the per-op result types that
3
- // forked in-tree (plurnk-service `_entry-ops.ts` vs the local redefinitions
4
- // in `File.ts` / `Exec.ts` / `Log.ts`).
5
- //
6
- // SchemeResult expresses the engine's actual universal invariant: every
7
- // handler result has a numeric status and may carry scheme-owned metadata.
8
- // EntryResult, ProposalResult, and PassthroughResult are optional authoring
9
- // aids for schemes that benefit from those conventional shapes; the engine
10
- // does not require or branch on their `shape` discriminator.
11
- //
12
- // Three shapes cover the current set:
13
- // entry — entries + entry_channels backed (known/unknown/skill/plurnk)
14
- // proposal — propose-then-resolve with payload (file/exec)
15
- // passthrough — read-only / coordinate-addressed / network (log, future http)
16
- //
17
- // Error surface: `error` is a grammar `TelemetryEvent` (not a bare string),
18
- // present iff `status >= 400`. The consumer mirrors it into
19
- // `packet.user.telemetry.errors[]` unchanged.
1
+ import { InvalidOperationResultError, Problems, Validator, } from "@plurnk/plurnk-contracts";
2
+ export { InvalidOperationResultError };
20
3
  export default class Results {
21
4
  static isEntry(result) {
22
5
  return "shape" in result && result.shape === "entry";
@@ -27,34 +10,109 @@ export default class Results {
27
10
  static isPassthrough(result) {
28
11
  return "shape" in result && result.shape === "passthrough";
29
12
  }
30
- // A result is an error result iff its status is in the 4xx/5xx range. The
31
- // `error` envelope is expected on those and absent otherwise.
32
13
  static isErrorStatus(status) {
33
14
  return status >= 400;
34
15
  }
35
- // Build a scheme-sourced TelemetryEvent. `source` is `scheme:<name>` per
36
- // the envelope's producer-namespacing convention (grammar TelemetryEvent
37
- // schema). Absent message/position are omitted rather than set to
38
- // undefined so the emitted object matches the wire shape exactly.
39
- static error(scheme, kind, message, position) {
40
- return {
41
- source: `scheme:${scheme}`,
42
- kind,
43
- level: "error",
44
- ...(message === undefined ? {} : { message }),
45
- ...(position === undefined ? {} : { position }),
46
- };
47
- }
48
- // Build a LogCoordinate position pointing at an action's log row. The
49
- // engine knows the coordinate at result-time, so schemes rarely construct
50
- // this directly — it's here for the consumer-side mirror and for schemes
51
- // that surface errors against a known prior coordinate.
52
- static logCoordinate(coordinate, op) {
53
- return {
54
- type: "log-coordinate",
55
- coordinate,
56
- ...(op === undefined ? {} : { op }),
57
- };
16
+ static problem(owner, code, status, detail, extensions = {}) {
17
+ return Problems.create(owner, code, status, detail, extensions);
18
+ }
19
+ static failure(owner, code, status, detail, fields = {}, extensions = {}) {
20
+ return Results.assert({
21
+ ...fields,
22
+ status,
23
+ problem: Results.problem(owner, code, status, detail, extensions),
24
+ });
25
+ }
26
+ static assertProblem(problem) {
27
+ Validator.assertProblemDetails(problem);
28
+ }
29
+ static assertMatchEvidence(evidence) {
30
+ if (evidence === null
31
+ || typeof evidence !== "object"
32
+ || Array.isArray(evidence)) {
33
+ throw new TypeError("invalid match evidence: expected an object");
34
+ }
35
+ const record = evidence;
36
+ const extras = Object.keys(record).filter((key) => key !== "path" && key !== "region");
37
+ if (extras.length > 0) {
38
+ throw new TypeError(`invalid match evidence: unexpected field ${JSON.stringify(extras[0])}`);
39
+ }
40
+ const hasPath = Object.hasOwn(record, "path");
41
+ const hasRegion = Object.hasOwn(record, "region");
42
+ if (!hasPath && !hasRegion) {
43
+ throw new TypeError("invalid match evidence: expected path, region, or both");
44
+ }
45
+ if (hasPath && (typeof record.path !== "string" || record.path.length === 0)) {
46
+ throw new TypeError("invalid match evidence: path must be a non-empty string");
47
+ }
48
+ if (hasRegion)
49
+ Validator.assertTextRegion(record.region);
50
+ return evidence;
51
+ }
52
+ static assertMatchEvidenceList(evidence) {
53
+ if (!Array.isArray(evidence)) {
54
+ throw new TypeError("invalid match evidence list: expected an array");
55
+ }
56
+ for (const item of evidence)
57
+ Results.assertMatchEvidence(item);
58
+ return evidence;
59
+ }
60
+ static assertReadResult(result) {
61
+ const exact = Results.assert(result);
62
+ const record = exact;
63
+ if (Object.hasOwn(record, "region") && record.region !== undefined) {
64
+ Validator.assertTextRegion(record.region);
65
+ }
66
+ if (Object.hasOwn(record, "matches") && record.matches !== undefined) {
67
+ Results.assertMatchEvidenceList(record.matches);
68
+ }
69
+ return exact;
70
+ }
71
+ static assertScopeNormalizations(value) {
72
+ if (!Array.isArray(value) || value.length === 0) {
73
+ throw new TypeError("invalid scope normalizations: expected a non-empty array");
74
+ }
75
+ for (const item of value) {
76
+ if (item === null || typeof item !== "object" || Array.isArray(item)) {
77
+ throw new TypeError("invalid scope normalization: expected an object");
78
+ }
79
+ const record = item;
80
+ const extras = Object.keys(record).filter((key) => key !== "requested" && key !== "canonical");
81
+ if (extras.length > 0) {
82
+ throw new TypeError(`invalid scope normalization: unexpected field ${JSON.stringify(extras[0])}`);
83
+ }
84
+ if (!Object.hasOwn(record, "requested") || !Object.hasOwn(record, "canonical")) {
85
+ throw new TypeError("invalid scope normalization: requested and canonical coordinates are required");
86
+ }
87
+ const { requested, canonical } = record;
88
+ if (!Array.isArray(requested)
89
+ || requested.length !== 3
90
+ || !requested.every(Number.isSafeInteger)) {
91
+ throw new TypeError("invalid scope normalization: requested must contain three safe integers");
92
+ }
93
+ if (!Array.isArray(canonical)
94
+ || canonical.length !== 4
95
+ || !canonical.every(Number.isSafeInteger)) {
96
+ throw new TypeError("invalid scope normalization: canonical must contain four safe integers");
97
+ }
98
+ if (!requested.every((coordinate, index) => canonical[index] === coordinate)) {
99
+ throw new TypeError("invalid scope normalization: canonical coordinates must preserve the requested prefix");
100
+ }
101
+ }
102
+ return value;
103
+ }
104
+ static assert(result) {
105
+ const exact = Validator.assertOperationResult(result);
106
+ if (exact.scopeNormalizations !== undefined) {
107
+ Results.assertScopeNormalizations(exact.scopeNormalizations);
108
+ }
109
+ return exact;
110
+ }
111
+ static attachInstance(result, instance) {
112
+ if (result.problem === undefined)
113
+ return Results.assert(result);
114
+ result.problem.instance = instance;
115
+ return Results.assert(result);
58
116
  }
59
117
  }
60
118
  //# sourceMappingURL=Results.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Results.js","sourceRoot":"","sources":["../src/Results.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,yEAAyE;AACzE,4EAA4E;AAC5E,wCAAwC;AACxC,EAAE;AACF,wEAAwE;AACxE,2EAA2E;AAC3E,4EAA4E;AAC5E,2EAA2E;AAC3E,6DAA6D;AAC7D,EAAE;AACF,sCAAsC;AACtC,+EAA+E;AAC/E,gEAAgE;AAChE,gFAAgF;AAChF,EAAE;AACF,4EAA4E;AAC5E,4DAA4D;AAC5D,8CAA8C;AA8C9C,MAAM,CAAC,OAAO,OAAO,OAAO;IACxB,MAAM,CAAC,OAAO,CAAC,MAAoB;QAC/B,OAAO,OAAO,IAAI,MAAM,IAAI,MAAM,CAAC,KAAK,KAAK,OAAO,CAAC;IACzD,CAAC;IAED,MAAM,CAAC,UAAU,CAAC,MAAoB;QAClC,OAAO,OAAO,IAAI,MAAM,IAAI,MAAM,CAAC,KAAK,KAAK,UAAU,CAAC;IAC5D,CAAC;IAED,MAAM,CAAC,aAAa,CAAC,MAAoB;QACrC,OAAO,OAAO,IAAI,MAAM,IAAI,MAAM,CAAC,KAAK,KAAK,aAAa,CAAC;IAC/D,CAAC;IAED,0EAA0E;IAC1E,8DAA8D;IAC9D,MAAM,CAAC,aAAa,CAAC,MAAc;QAC/B,OAAO,MAAM,IAAI,GAAG,CAAC;IACzB,CAAC;IAED,yEAAyE;IACzE,yEAAyE;IACzE,kEAAkE;IAClE,kEAAkE;IAClE,MAAM,CAAC,KAAK,CACR,MAAc,EACd,IAAY,EACZ,OAAuB,EACvB,QAAqC;QAErC,OAAO;YACH,MAAM,EAAE,UAAU,MAAM,EAAE;YAC1B,IAAI;YACJ,KAAK,EAAE,OAAO;YACd,GAAG,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC;YAC7C,GAAG,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC;SAClD,CAAC;IACN,CAAC;IAED,sEAAsE;IACtE,0EAA0E;IAC1E,yEAAyE;IACzE,wDAAwD;IACxD,MAAM,CAAC,aAAa,CAAC,UAAkB,EAAE,EAAW;QAChD,OAAO;YACH,IAAI,EAAE,gBAAgB;YACtB,UAAU;YACV,GAAG,CAAC,EAAE,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC;SACtC,CAAC;IACN,CAAC;CACJ"}
1
+ {"version":3,"file":"Results.js","sourceRoot":"","sources":["../src/Results.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import type { PackageAttributions } from "@plurnk/plurnk-meta";
1
2
  export interface SchemeInfo {
2
3
  readonly name: string;
3
4
  readonly packageName: string;
@@ -6,6 +7,7 @@ export interface SchemeInfo {
6
7
  }
7
8
  export interface SchemeDiscoveryResult {
8
9
  readonly schemes: ReadonlyArray<SchemeInfo>;
10
+ readonly packageAttributions: PackageAttributions;
9
11
  readonly skipped: ReadonlyArray<string>;
10
12
  }
11
13
  export interface DiscoverOptions {
@@ -1 +1 @@
1
- {"version":3,"file":"SchemeDiscovery.d.ts","sourceRoot":"","sources":["../src/SchemeDiscovery.ts"],"names":[],"mappings":"AA2BA,MAAM,WAAW,UAAU;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAM7B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAM7B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CAAC;CACrD;AAED,MAAM,WAAW,qBAAqB;IAClC,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC;IAC5C,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;CAC3C;AAED,MAAM,WAAW,eAAe;IAC5B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IAC7C,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;CACjC;AAED,MAAM,CAAC,OAAO,OAAO,eAAe;;IAChC,OAAa,QAAQ,CAAC,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,qBAAqB,CAAC,CA8BnF;CAqFJ"}
1
+ {"version":3,"file":"SchemeDiscovery.d.ts","sourceRoot":"","sources":["../src/SchemeDiscovery.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACR,mBAAmB,EAGtB,MAAM,qBAAqB,CAAC;AAyB7B,MAAM,WAAW,UAAU;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAM7B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAG7B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CAAC;CACrD;AAED,MAAM,WAAW,qBAAqB;IAClC,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC;IAC5C,QAAQ,CAAC,mBAAmB,EAAE,mBAAmB,CAAC;IAClD,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;CAC3C;AAED,MAAM,WAAW,eAAe;IAC5B,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IAC7C,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;CACjC;AAOD,MAAM,CAAC,OAAO,OAAO,eAAe;;IAChC,OAAa,QAAQ,CAAC,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,qBAAqB,CAAC,CAqCnF;CAmFJ"}
@@ -6,20 +6,25 @@ export default class SchemeDiscovery {
6
6
  const { signal } = options;
7
7
  const dirs = options.packageDirs ?? await SchemeDiscovery.#defaultPackageDirs(options.cwd ?? process.cwd(), signal);
8
8
  const byName = new Map();
9
+ const packageAttributions = new Map();
9
10
  const skipped = new Set();
10
11
  for (const dir of dirs) {
11
12
  signal?.throwIfAborted();
12
- const infos = await SchemeDiscovery.#readSchemeInfos(dir, signal);
13
- if (infos.length === 0)
13
+ const manifest = await SchemeDiscovery.#readSchemeManifest(dir, signal);
14
+ if (manifest === null)
14
15
  continue;
15
16
  // Host plugin-trust gate: an untrusted third-party package is
16
17
  // discovered but not surfaced for registration — recorded, never
17
- // crashed on. All of a package's schemes share its packageName, so
18
- // one trust check gates the whole package.
19
- if (!Meta.isTrusted(infos[0].packageName)) {
20
- skipped.add(infos[0].packageName);
18
+ // crashed on. Validation of family fields and attribution follows
19
+ // this package-level gate ({§plugin-trust-boundary}).
20
+ if (!Meta.isTrusted(manifest.packageName)) {
21
+ skipped.add(manifest.packageName);
21
22
  continue;
22
23
  }
24
+ const tags = Meta.normalizeAttribution(manifest.plurnk.attribution, manifest.packageName);
25
+ const attribution = SchemeDiscovery.#attributionProjection(manifest.plurnk.attribution, tags);
26
+ const infos = SchemeDiscovery.#readSchemeInfos(manifest, attribution);
27
+ let admitted = false;
23
28
  for (const info of infos) {
24
29
  const existing = byName.get(info.name);
25
30
  // Two packages (or two entries) claiming one scheme prefix is an
@@ -31,14 +36,16 @@ export default class SchemeDiscovery {
31
36
  + `${existing.packageName} and ${info.packageName}`);
32
37
  }
33
38
  byName.set(info.name, info);
39
+ admitted = true;
34
40
  }
41
+ if (admitted && tags.length > 0)
42
+ packageAttributions.set(manifest.packageName, tags);
35
43
  }
36
- return { schemes: [...byName.values()], skipped: [...skipped].sort() };
44
+ return { schemes: [...byName.values()], packageAttributions, skipped: [...skipped].sort() };
37
45
  }
38
46
  // Host plugin-trust gate, read from PLURNK_PLUGINS_TRUSTED_ONLY — the SAME
39
- // env var plurnk-service decides once and every scope-agnostic discovery
40
- // surface enforces (plurnk-service#229). The ~5-line policy is duplicated,
41
- // not shared (can't import across the package boundary), matching execs:
47
+ // env var the host decides once and every scope-agnostic discovery
48
+ // surface enforces through the shared Meta contract ({§plugin-trust-boundary}):
42
49
  // unset / "" / "0" → OFF: every installed package trusted (no regression).
43
50
  // any value → ON: `@plurnk/*` always trusted, plus a comma-separated
44
51
  // allowlist of additionally-trusted package names.
@@ -56,13 +63,10 @@ export default class SchemeDiscovery {
56
63
  static #isAbort(err) {
57
64
  return err instanceof Error && err.name === "AbortError";
58
65
  }
59
- // The SchemeInfo(s) for a package declaring plurnk.kind:"scheme"; [] for
60
- // anything else (non-package dir, non-scheme, no declaration). A package
61
- // declares EITHER `plurnk.schemes: [{ name, export }, …]` (canonical, one
62
- // entry per scheme it owns) OR `plurnk.name: "<scheme>"` (sugar for exactly
63
- // one, default export) — #473. A malformed `plurnk.schemes` is an authoring
64
- // contract violation and fails hard (locality of error), not a silent skip.
65
- static async #readSchemeInfos(dir, signal) {
66
+ // The inert manifest for a package declaring plurnk.kind:"scheme"; null for
67
+ // anything else (non-package dir, non-scheme, no declaration). Family field
68
+ // validation happens only after the package trust gate.
69
+ static async #readSchemeManifest(dir, signal) {
66
70
  let raw;
67
71
  try {
68
72
  raw = await fs.readFile(path.join(dir, "package.json"), { encoding: "utf-8", signal });
@@ -70,34 +74,34 @@ export default class SchemeDiscovery {
70
74
  catch (err) {
71
75
  if (SchemeDiscovery.#isAbort(err))
72
76
  throw err;
73
- return [];
77
+ return null;
74
78
  }
75
79
  let pkg;
76
80
  try {
77
81
  pkg = JSON.parse(raw);
78
82
  }
79
83
  catch {
80
- return [];
84
+ return null;
81
85
  }
82
86
  if (typeof pkg !== "object" || pkg === null)
83
- return [];
87
+ return null;
84
88
  const record = pkg;
85
89
  const plurnk = record.plurnk;
86
90
  if (typeof plurnk !== "object" || plurnk === null)
87
- return [];
91
+ return null;
88
92
  const plurnkRec = plurnk;
89
- // is-or-includes (#483): a package owning more than one capability family
90
- // declares `kind: ["exec", "scheme"]`; the string form stays as the
91
- // single-kind sugar. A scanner accepts a package whose kind IS or
92
- // INCLUDES its own.
93
- const kind = plurnkRec.kind;
94
- const isScheme = kind === "scheme" || (Array.isArray(kind) && kind.includes("scheme"));
95
- if (!isScheme)
96
- return [];
93
+ if (!Meta.declaresKind(plurnkRec, "scheme"))
94
+ return null;
97
95
  if (typeof record.name !== "string" || record.name === "")
98
- return [];
99
- const packageName = record.name;
100
- const attribution = SchemeDiscovery.#attribution(plurnkRec.attribution);
96
+ return null;
97
+ return { packageName: record.name, plurnk: plurnkRec };
98
+ }
99
+ // The SchemeInfo(s) for an admitted package. A package
100
+ // declares EITHER `plurnk.schemes: [{ name, export }, …]` (canonical, one
101
+ // entry per scheme it owns) OR `plurnk.name: "<scheme>"` (sugar for exactly
102
+ // one, default export). A malformed `plurnk.schemes` is an authoring
103
+ // contract violation and fails hard (locality of error), not a silent skip.
104
+ static #readSchemeInfos({ packageName, plurnk: plurnkRec }, attribution) {
101
105
  // Only carry the key when credit is actually present — an absent
102
106
  // attribution leaves the property off entirely (not `undefined`).
103
107
  const withAttr = (info) => attribution === undefined ? info : { ...info, attribution };
@@ -122,16 +126,10 @@ export default class SchemeDiscovery {
122
126
  }
123
127
  return [];
124
128
  }
125
- // Pass `plurnk.attribution` through verbatim when it's a string or an array
126
- // of strings; anything else (number, object, mixed array) is not credit and
127
- // is dropped to undefined. No deeper validation — the reservation policy
128
- // lives in the consumer.
129
- static #attribution(value) {
130
- if (typeof value === "string")
131
- return value;
132
- if (Array.isArray(value) && value.every((v) => typeof v === "string"))
133
- return value;
134
- return undefined;
129
+ static #attributionProjection(raw, tags) {
130
+ if (raw === undefined || raw === null)
131
+ return undefined;
132
+ return typeof raw === "string" ? raw : [...tags];
135
133
  }
136
134
  }
137
135
  //# sourceMappingURL=SchemeDiscovery.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"SchemeDiscovery.js","sourceRoot":"","sources":["../src/SchemeDiscovery.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"SchemeDiscovery.js","sourceRoot":"","sources":["../src/SchemeDiscovery.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"SchemeResolver.d.ts","sourceRoot":"","sources":["../src/SchemeResolver.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAkB,MAAM,YAAY,CAAC;AAM5D,MAAM,CAAC,OAAO,OAAO,cAAc;IAM/B,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,KAAK,EAAE,SAAS,GAAG,GAAG,CAAC,MAAM,CAAC,CAenF;CACJ"}
1
+ {"version":3,"file":"SchemeResolver.d.ts","sourceRoot":"","sources":["../src/SchemeResolver.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,MAAM,CAAC,OAAO,OAAO,cAAc;IAM/B,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,KAAK,EAAE,SAAS,GAAG,GAAG,CAAC,MAAM,CAAC,CAcnF;CACJ"}
@@ -1,15 +1,16 @@
1
1
  // Active-scheme resolution under a given loop's flags. Schemes opt into
2
2
  // flag affinity via `manifest.flags`; absence = always active.
3
+ import Manifest from "./Manifest.js";
3
4
  export default class SchemeResolver {
4
5
  // Given a map of scheme name → handler instance and the active loop's flags,
5
6
  // return the set of scheme names eligible to dispatch. Schemes without
6
7
  // `manifest.flags` are always active; `excludedInAsk` filters under
7
- // `mode === "ask"`, and `requiresWeb` / `requiresInteraction` / `proposes`
8
- // filter under the corresponding `no*` flag.
8
+ // `mode === "ask"`, and `requiresWeb` / `requiresInteraction` filter under
9
+ // the corresponding environmental-authority flag. {§manifest-flag-affinity}
9
10
  static forLoop(handlers, flags) {
10
11
  const active = new Set();
11
12
  for (const [name, handler] of handlers.entries()) {
12
- const affinity = handler.constructor.manifest?.flags;
13
+ const affinity = Manifest.of(handler, name).flags;
13
14
  if (affinity === undefined) {
14
15
  active.add(name);
15
16
  continue;
@@ -20,8 +21,6 @@ export default class SchemeResolver {
20
21
  continue;
21
22
  if (flags.noInteraction && affinity.requiresInteraction)
22
23
  continue;
23
- if (flags.noProposals && affinity.proposes)
24
- continue;
25
24
  active.add(name);
26
25
  }
27
26
  return active;
@@ -1 +1 @@
1
- {"version":3,"file":"SchemeResolver.js","sourceRoot":"","sources":["../src/SchemeResolver.ts"],"names":[],"mappings":"AAAA,wEAAwE;AACxE,+DAA+D;AAQ/D,MAAM,CAAC,OAAO,OAAO,cAAc;IAC/B,6EAA6E;IAC7E,uEAAuE;IACvE,oEAAoE;IACpE,2EAA2E;IAC3E,6CAA6C;IAC7C,MAAM,CAAC,OAAO,CAAC,QAAqC,EAAE,KAAgB;QAClE,MAAM,MAAM,GAAG,IAAI,GAAG,EAAU,CAAC;QACjC,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC;YAC/C,MAAM,QAAQ,GAAI,OAA8B,CAAC,WAAW,CAAC,QAAQ,EAAE,KAAK,CAAC;YAC7E,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;gBACzB,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBACjB,SAAS;YACb,CAAC;YACD,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK,IAAI,QAAQ,CAAC,aAAa;gBAAE,SAAS;YAC7D,IAAI,KAAK,CAAC,KAAK,IAAI,QAAQ,CAAC,WAAW;gBAAE,SAAS;YAClD,IAAI,KAAK,CAAC,aAAa,IAAI,QAAQ,CAAC,mBAAmB;gBAAE,SAAS;YAClE,IAAI,KAAK,CAAC,WAAW,IAAI,QAAQ,CAAC,QAAQ;gBAAE,SAAS;YACrD,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACrB,CAAC;QACD,OAAO,MAAM,CAAC;IAClB,CAAC;CACJ"}
1
+ {"version":3,"file":"SchemeResolver.js","sourceRoot":"","sources":["../src/SchemeResolver.ts"],"names":[],"mappings":"AAAA,wEAAwE;AACxE,+DAA+D;AAE/D,OAAO,QAAQ,MAAM,eAAe,CAAC;AAGrC,MAAM,CAAC,OAAO,OAAO,cAAc;IAC/B,6EAA6E;IAC7E,uEAAuE;IACvE,oEAAoE;IACpE,2EAA2E;IAC3E,4EAA4E;IAC5E,MAAM,CAAC,OAAO,CAAC,QAAqC,EAAE,KAAgB;QAClE,MAAM,MAAM,GAAG,IAAI,GAAG,EAAU,CAAC;QACjC,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC;YAC/C,MAAM,QAAQ,GAAG,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC;YAClD,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;gBACzB,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBACjB,SAAS;YACb,CAAC;YACD,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK,IAAI,QAAQ,CAAC,aAAa;gBAAE,SAAS;YAC7D,IAAI,KAAK,CAAC,KAAK,IAAI,QAAQ,CAAC,WAAW;gBAAE,SAAS;YAClD,IAAI,KAAK,CAAC,aAAa,IAAI,QAAQ,CAAC,mBAAmB;gBAAE,SAAS;YAClE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACrB,CAAC;QACD,OAAO,MAAM,CAAC;IAClB,CAAC;CACJ"}