@plurnk/plurnk-schemes 3.3.0 → 3.3.1

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 (70) hide show
  1. package/README.md +5 -5
  2. package/SPEC.md +119 -745
  3. package/dist/ByteSource.d.ts +13 -0
  4. package/dist/ByteSource.d.ts.map +1 -1
  5. package/dist/ByteSource.js +62 -1
  6. package/dist/ByteSource.js.map +1 -1
  7. package/dist/MessageScheme.js +1 -1
  8. package/dist/MessageScheme.js.map +1 -1
  9. package/dist/MetadataOptions.d.ts +1 -2
  10. package/dist/MetadataOptions.d.ts.map +1 -1
  11. package/dist/MetadataOptions.js +3 -6
  12. package/dist/MetadataOptions.js.map +1 -1
  13. package/dist/MimetypeClassifier.d.ts +5 -0
  14. package/dist/MimetypeClassifier.d.ts.map +1 -1
  15. package/dist/MimetypeClassifier.js +33 -5
  16. package/dist/MimetypeClassifier.js.map +1 -1
  17. package/dist/OutputScheme.js +2 -2
  18. package/dist/OutputScheme.js.map +1 -1
  19. package/dist/PacketSections.d.ts +9 -1
  20. package/dist/PacketSections.d.ts.map +1 -1
  21. package/dist/PacketSections.js +1 -1
  22. package/dist/PacketSections.js.map +1 -1
  23. package/dist/ResourceNames.js +1 -1
  24. package/dist/ResourceNames.js.map +1 -1
  25. package/dist/SchemeDiscovery.d.ts.map +1 -1
  26. package/dist/SchemeDiscovery.js +9 -48
  27. package/dist/SchemeDiscovery.js.map +1 -1
  28. package/dist/Slicer.js +11 -11
  29. package/dist/Slicer.js.map +1 -1
  30. package/dist/Summarize.js +2 -2
  31. package/dist/Summarize.js.map +1 -1
  32. package/dist/ctx.d.ts +2 -3
  33. package/dist/ctx.d.ts.map +1 -1
  34. package/dist/edit-receipt.d.ts +4 -0
  35. package/dist/edit-receipt.d.ts.map +1 -1
  36. package/dist/handler.d.ts +26 -2
  37. package/dist/handler.d.ts.map +1 -1
  38. package/dist/index.d.ts +7 -15
  39. package/dist/index.d.ts.map +1 -1
  40. package/dist/index.js +3 -11
  41. package/dist/index.js.map +1 -1
  42. package/package.json +4 -4
  43. package/dist/FileByteSource.d.ts +0 -9
  44. package/dist/FileByteSource.d.ts.map +0 -1
  45. package/dist/FileByteSource.js +0 -43
  46. package/dist/FileByteSource.js.map +0 -1
  47. package/dist/GeneratedByteSource.d.ts +0 -8
  48. package/dist/GeneratedByteSource.d.ts.map +0 -1
  49. package/dist/GeneratedByteSource.js +0 -21
  50. package/dist/GeneratedByteSource.js.map +0 -1
  51. package/dist/PathMimetype.d.ts +0 -6
  52. package/dist/PathMimetype.d.ts.map +0 -1
  53. package/dist/PathMimetype.js +0 -30
  54. package/dist/PathMimetype.js.map +0 -1
  55. package/dist/edit-statement.d.ts +0 -5
  56. package/dist/edit-statement.d.ts.map +0 -1
  57. package/dist/edit-statement.js +0 -2
  58. package/dist/edit-statement.js.map +0 -1
  59. package/dist/module-slice.d.ts +0 -22
  60. package/dist/module-slice.d.ts.map +0 -1
  61. package/dist/module-slice.js +0 -2
  62. package/dist/module-slice.js.map +0 -1
  63. package/dist/packet.d.ts +0 -10
  64. package/dist/packet.d.ts.map +0 -1
  65. package/dist/packet.js +0 -4
  66. package/dist/packet.js.map +0 -1
  67. package/dist/resource-tree.d.ts +0 -15
  68. package/dist/resource-tree.d.ts.map +0 -1
  69. package/dist/resource-tree.js +0 -2
  70. package/dist/resource-tree.js.map +0 -1
@@ -3,4 +3,17 @@ export interface ByteSource {
3
3
  read(start: number, end: number): Promise<Uint8Array>;
4
4
  nativePath?(): Promise<string | null>;
5
5
  }
6
+ export declare class FileByteSource implements ByteSource {
7
+ #private;
8
+ constructor(locate: () => Promise<string | null>);
9
+ nativePath(): Promise<string | null>;
10
+ size(): Promise<number | null>;
11
+ read(start: number, end: number): Promise<Uint8Array>;
12
+ }
13
+ export declare class GeneratedByteSource implements ByteSource {
14
+ #private;
15
+ constructor(generate: () => Promise<Uint8Array | null>);
16
+ size(): Promise<number | null>;
17
+ read(start: number, end: number): Promise<Uint8Array>;
18
+ }
6
19
  //# sourceMappingURL=ByteSource.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ByteSource.d.ts","sourceRoot":"","sources":["../src/ByteSource.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,UAAU;IACvB,IAAI,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC/B,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IACtD,UAAU,CAAC,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;CACzC"}
1
+ {"version":3,"file":"ByteSource.d.ts","sourceRoot":"","sources":["../src/ByteSource.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,UAAU;IACvB,IAAI,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC/B,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IACtD,UAAU,CAAC,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;CACzC;AAGD,qBAAa,cAAe,YAAW,UAAU;;IAG7C,YAAY,MAAM,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,EAE/C;IAEK,UAAU,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAUzC;IAEK,IAAI,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAGnC;IAEK,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAW1D;CACJ;AAGD,qBAAa,mBAAoB,YAAW,UAAU;;IAIlD,YAAY,QAAQ,EAAE,MAAM,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,EAErD;IAMK,IAAI,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAEnC;IAEK,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAI1D;CACJ"}
@@ -1,2 +1,63 @@
1
- export {};
1
+ import { errnoCode } from "@plurnk/plurnk-contracts";
2
+ import { open, stat } from "node:fs/promises";
3
+ // {§scheme-operation-dispatch} Location and original bytes share their resource owner.
4
+ export class FileByteSource {
5
+ #locate;
6
+ constructor(locate) {
7
+ this.#locate = locate;
8
+ }
9
+ async nativePath() {
10
+ try {
11
+ const file = await this.#locate();
12
+ if (file === null)
13
+ return null;
14
+ if (!(await stat(file)).isFile())
15
+ throw new TypeError("The byte source is not a regular file.");
16
+ return file;
17
+ }
18
+ catch (cause) {
19
+ if (errnoCode(cause) === "ENOENT")
20
+ return null;
21
+ throw cause;
22
+ }
23
+ }
24
+ async size() {
25
+ const file = await this.nativePath();
26
+ return file === null ? null : (await stat(file)).size;
27
+ }
28
+ async read(start, end) {
29
+ const file = await this.nativePath();
30
+ if (file === null)
31
+ throw new Error("The byte source no longer exists.");
32
+ const handle = await open(file, "r");
33
+ try {
34
+ const buffer = Buffer.alloc(end - start + 1);
35
+ const { bytesRead } = await handle.read(buffer, 0, buffer.length, start - 1);
36
+ return buffer.subarray(0, bytesRead);
37
+ }
38
+ finally {
39
+ await handle.close();
40
+ }
41
+ }
42
+ }
43
+ // {§scheme-operation-dispatch} One demand-loaded snapshot, with no native file identity.
44
+ export class GeneratedByteSource {
45
+ #generate;
46
+ #bytes;
47
+ constructor(generate) {
48
+ this.#generate = generate;
49
+ }
50
+ #load() {
51
+ return this.#bytes ??= this.#generate();
52
+ }
53
+ async size() {
54
+ return (await this.#load())?.length ?? null;
55
+ }
56
+ async read(start, end) {
57
+ const bytes = await this.#load();
58
+ if (bytes === null)
59
+ throw new Error("The byte source no longer exists.");
60
+ return bytes.slice(start - 1, end);
61
+ }
62
+ }
2
63
  //# sourceMappingURL=ByteSource.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ByteSource.js","sourceRoot":"","sources":["../src/ByteSource.ts"],"names":[],"mappings":""}
1
+ {"version":3,"file":"ByteSource.js","sourceRoot":"","sources":["../src/ByteSource.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AACrD,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAU9C,uFAAuF;AACvF,MAAM,OAAO,cAAc;IACd,OAAO,CAA+B;IAE/C,YAAY,MAAoC;QAC5C,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;IAC1B,CAAC;IAED,KAAK,CAAC,UAAU;QACZ,IAAI,CAAC;YACD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;YAClC,IAAI,IAAI,KAAK,IAAI;gBAAE,OAAO,IAAI,CAAC;YAC/B,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE;gBAAE,MAAM,IAAI,SAAS,CAAC,wCAAwC,CAAC,CAAC;YAChG,OAAO,IAAI,CAAC;QAChB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,IAAI,SAAS,CAAC,KAAK,CAAC,KAAK,QAAQ;gBAAE,OAAO,IAAI,CAAC;YAC/C,MAAM,KAAK,CAAC;QAChB,CAAC;IACL,CAAC;IAED,KAAK,CAAC,IAAI;QACN,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QACrC,OAAO,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;IAC1D,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,KAAa,EAAE,GAAW;QACjC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QACrC,IAAI,IAAI,KAAK,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;QACxE,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QACrC,IAAI,CAAC;YACD,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC;YAC7C,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;YAC7E,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;QACzC,CAAC;gBAAS,CAAC;YACP,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QACzB,CAAC;IACL,CAAC;CACJ;AAED,yFAAyF;AACzF,MAAM,OAAO,mBAAmB;IACnB,SAAS,CAAmC;IACrD,MAAM,CAAyC;IAE/C,YAAY,QAA0C;QAClD,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;IAC9B,CAAC;IAED,KAAK;QACD,OAAO,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,SAAS,EAAE,CAAC;IAC5C,CAAC;IAED,KAAK,CAAC,IAAI;QACN,OAAO,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,MAAM,IAAI,IAAI,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,KAAa,EAAE,GAAW;QACjC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;QACjC,IAAI,KAAK,KAAK,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;QACzE,OAAO,KAAK,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;IACvC,CAAC;CACJ"}
@@ -11,7 +11,7 @@ export default class MessageScheme {
11
11
  };
12
12
  }
13
13
  async resolveEntryAddress(target, _ctx, access = "read") {
14
- // {§message-immutable} — immutable evidence is neither a reply nor a lifecycle control.
14
+ // {§message-source-scheme} — immutable evidence is neither a reply nor a lifecycle control.
15
15
  if (access === "write")
16
16
  return Results.failure(`scheme:${this.manifest.name}`, "message-immutable", 405, `\`${target.raw}\` is a received message; it cannot be edited, moved or killed.`, {}, { retryable: false });
17
17
  if (target.kind !== "url")
@@ -1 +1 @@
1
- {"version":3,"file":"MessageScheme.js","sourceRoot":"","sources":["../src/MessageScheme.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAA2D,MAAM,0BAA0B,CAAC;AAI/G,OAAO,OAAO,EAAE,EAAqB,MAAM,cAAc,CAAC;AAE1D,yGAAyG;AACzG,MAAM,CAAC,OAAO,OAAO,aAAa;IACrB,QAAQ,CAAiB;IAElC,YAAY,IAAY;QACpB,IAAI,CAAC,QAAQ,GAAG;YACZ,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE;YAClF,cAAc,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,SAAS,CAAC;YAClE,QAAQ,EAAE,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK;SACjF,CAAC;IACN,CAAC;IAED,KAAK,CAAC,mBAAmB,CAAC,MAAkB,EAAE,IAAsB,EAAE,MAAM,GAAqB,MAAM;QACnG,wFAAwF;QACxF,IAAI,MAAM,KAAK,OAAO;YAAE,OAAO,OAAO,CAAC,OAAO,CAC1C,UAAU,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,mBAAmB,EAAE,GAAG,EACxD,KAAK,MAAM,CAAC,GAAG,iEAAiE,EAChF,EAAE,EACF,EAAE,SAAS,EAAE,KAAK,EAAE,CACvB,CAAC;QACF,IAAI,MAAM,CAAC,IAAI,KAAK,KAAK;YAAE,OAAO,IAAI,CAAC;QACvC,OAAO;YACH,SAAS,EAAE,MAAM,CAAC,QAAQ,IAAI,EAAE;YAChC,QAAQ,EAAE,UAAU,CAAC,YAAY,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;SACzG,CAAC;IACN,CAAC;IAED,KAAK,CAAC,qBAAqB,CAAC,OAAyC,EAAE,GAAc;QACjF,OAAO,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACpD,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,UAAyB,EAAE,GAAc;QACvD,OAAO,GAAG,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;IAClC,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,SAAwB,EAAE,GAAc;QAC/C,OAAO,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IACzC,CAAC;CACJ"}
1
+ {"version":3,"file":"MessageScheme.js","sourceRoot":"","sources":["../src/MessageScheme.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAA2D,MAAM,0BAA0B,CAAC;AAI/G,OAAO,OAAO,EAAE,EAAqB,MAAM,cAAc,CAAC;AAE1D,yGAAyG;AACzG,MAAM,CAAC,OAAO,OAAO,aAAa;IACrB,QAAQ,CAAiB;IAElC,YAAY,IAAY;QACpB,IAAI,CAAC,QAAQ,GAAG;YACZ,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE;YAClF,cAAc,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,SAAS,CAAC;YAClE,QAAQ,EAAE,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK;SACjF,CAAC;IACN,CAAC;IAED,KAAK,CAAC,mBAAmB,CAAC,MAAkB,EAAE,IAAsB,EAAE,MAAM,GAAqB,MAAM;QACnG,4FAA4F;QAC5F,IAAI,MAAM,KAAK,OAAO;YAAE,OAAO,OAAO,CAAC,OAAO,CAC1C,UAAU,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,mBAAmB,EAAE,GAAG,EACxD,KAAK,MAAM,CAAC,GAAG,iEAAiE,EAChF,EAAE,EACF,EAAE,SAAS,EAAE,KAAK,EAAE,CACvB,CAAC;QACF,IAAI,MAAM,CAAC,IAAI,KAAK,KAAK;YAAE,OAAO,IAAI,CAAC;QACvC,OAAO;YACH,SAAS,EAAE,MAAM,CAAC,QAAQ,IAAI,EAAE;YAChC,QAAQ,EAAE,UAAU,CAAC,YAAY,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;SACzG,CAAC;IACN,CAAC;IAED,KAAK,CAAC,qBAAqB,CAAC,OAAyC,EAAE,GAAc;QACjF,OAAO,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACpD,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,UAAyB,EAAE,GAAc;QACvD,OAAO,GAAG,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;IAClC,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,SAAwB,EAAE,GAAc;QAC/C,OAAO,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IACzC,CAAC;CACJ"}
@@ -1,13 +1,12 @@
1
1
  import { type SchemeResult } from "./Results.ts";
2
2
  export type MetadataOptionsParsed = {
3
3
  readonly options: Readonly<Record<string, unknown>>;
4
- readonly env?: unknown;
5
4
  readonly lifetime?: unknown;
6
5
  } | {
7
6
  readonly failure: SchemeResult;
8
7
  };
9
8
  export default class MetadataOptions {
10
- static readonly SERVICE_KEYS: readonly ["env", "lifetime"];
9
+ static readonly SERVICE_KEYS: readonly ["lifetime"];
11
10
  static read(blocks: readonly string[] | null | undefined, source: string, extra?: Record<string, unknown>): {
12
11
  elements: unknown[];
13
12
  } | {
@@ -1 +1 @@
1
- {"version":3,"file":"MetadataOptions.d.ts","sourceRoot":"","sources":["../src/MetadataOptions.ts"],"names":[],"mappings":"AAKA,OAAgB,EAAE,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AAE1D,MAAM,MAAM,qBAAqB,GAG3B;IAAE,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,GAC5G;IAAE,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAA;CAAE,CAAC;AAEzC,MAAM,CAAC,OAAO,OAAO,eAAe;IAEhC,MAAM,CAAC,QAAQ,CAAC,YAAY,+BAA+C;IAG3E,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,GAAG,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAAG;QAAE,QAAQ,EAAE,OAAO,EAAE,CAAA;KAAE,GAAG;QAAE,OAAO,EAAE,YAAY,CAAA;KAAE,CAiBlK;IAED,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,GAAG,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAAG,qBAAqB,CAqBrI;CACJ"}
1
+ {"version":3,"file":"MetadataOptions.d.ts","sourceRoot":"","sources":["../src/MetadataOptions.ts"],"names":[],"mappings":"AAKA,OAAgB,EAAE,KAAK,YAAY,EAAE,MAAM,cAAc,CAAC;AAE1D,MAAM,MAAM,qBAAqB,GAG3B;IAAE,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,GACpF;IAAE,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAA;CAAE,CAAC;AAEzC,MAAM,CAAC,OAAO,OAAO,eAAe;IAEhC,MAAM,CAAC,QAAQ,CAAC,YAAY,wBAAwC;IAGpE,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,GAAG,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAAG;QAAE,QAAQ,EAAE,OAAO,EAAE,CAAA;KAAE,GAAG;QAAE,OAAO,EAAE,YAAY,CAAA;KAAE,CAiBlK;IAED,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,GAAG,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAAG,qBAAqB,CAkBrI;CACJ"}
@@ -1,12 +1,12 @@
1
- // {§scheme-metadata-modifier} The heading's `[metadata]` block, read with its
1
+ // {§slot-order} The heading's `[metadata]` block, read with its
2
2
  // brackets, is one JSON array. Object options merge left to right with later
3
3
  // keys winning. The language keeps the inner text opaque; this is the one
4
4
  // reader every owner uses before interpreting its elements,
5
5
  // so malformed content fails the same way everywhere: the owner's 400.
6
6
  import Results, {} from "./Results.js";
7
7
  export default class MetadataOptions {
8
- // {§service-metadata-keys} — the keys every owner's `options` is stripped of.
9
- static SERVICE_KEYS = Object.freeze(["env", "lifetime"]);
8
+ // {§manifest} — the keys every owner's `options` is stripped of.
9
+ static SERVICE_KEYS = Object.freeze(["lifetime"]);
10
10
  // `source` names the owner in the Problem (`executor:metadata`, `http`, …).
11
11
  static read(blocks, source, extra = {}) {
12
12
  const fail = (code, detail) => ({
@@ -42,9 +42,6 @@ export default class MetadataOptions {
42
42
  }
43
43
  Object.assign(options, element);
44
44
  }
45
- // {§matcher-option} — `pattern` is the language's key: the parser lifts it into the
46
- // statement's matcher and leaves the block for its owner, who never interprets it.
47
- delete options.pattern;
48
45
  const reserved = {};
49
46
  for (const key of MetadataOptions.SERVICE_KEYS) {
50
47
  if (!(key in options))
@@ -1 +1 @@
1
- {"version":3,"file":"MetadataOptions.js","sourceRoot":"","sources":["../src/MetadataOptions.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"MetadataOptions.js","sourceRoot":"","sources":["../src/MetadataOptions.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAChE,6EAA6E;AAC7E,0EAA0E;AAC1E,4DAA4D;AAC5D,uEAAuE;AACvE,OAAO,OAAO,EAAE,EAAqB,MAAM,cAAc,CAAC;AAQ1D,MAAM,CAAC,OAAO,OAAO,eAAe;IAChC,iEAAiE;IACjE,MAAM,CAAU,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,UAAU,CAAU,CAAC,CAAC;IAEpE,4EAA4E;IAC5E,MAAM,CAAC,IAAI,CAAC,MAA4C,EAAE,MAAc,EAAE,KAAK,GAA4B,EAAE;QACzG,MAAM,IAAI,GAAG,CAAC,IAAY,EAAE,MAAc,EAA6B,EAAE,CAAC,CAAC;YACvE,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,GAAG,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;SAC1F,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,IAAI,EAAE,CAAC;QAC1B,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;QAC/C,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC,mBAAmB,EAAE,0EAA0E,CAAC,CAAC;QAClI,IAAI,MAAe,CAAC;QACpB,IAAI,CAAC;YACD,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QACxC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,IAAI,CAAC,CAAC,KAAK,YAAY,WAAW,CAAC;gBAAE,MAAM,KAAK,CAAC;YACjD,yFAAyF;YACzF,OAAO,IAAI,CAAC,kBAAkB,EAAE,kCAAkC,CAAC,CAAC;QACxE,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;YAAE,OAAO,IAAI,CAAC,kBAAkB,EAAE,kCAAkC,CAAC,CAAC;QAChG,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;IAChC,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,MAA4C,EAAE,MAAc,EAAE,KAAK,GAA4B,EAAE;QAC1G,MAAM,IAAI,GAAG,eAAe,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;QACzD,IAAI,SAAS,IAAI,IAAI;YAAE,OAAO,IAAI,CAAC;QACnC,MAAM,OAAO,GAA4B,EAAE,CAAC;QAC5C,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClC,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC5E,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,kBAAkB,EAAE,GAAG,EAC7D,gFAAgF,EAAE,EAAE,EAAE,EAAE,GAAG,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;YAChI,CAAC;YACD,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACpC,CAAC;QACD,MAAM,QAAQ,GAA2B,EAAE,CAAC;QAC5C,KAAK,MAAM,GAAG,IAAI,eAAe,CAAC,YAAY,EAAE,CAAC;YAC7C,IAAI,CAAC,CAAC,GAAG,IAAI,OAAO,CAAC;gBAAE,SAAS;YAChC,QAAQ,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;YAC7B,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC;QACxB,CAAC;QACD,OAAO,EAAE,OAAO,EAAE,GAAG,QAAQ,EAAE,CAAC;IACpC,CAAC;CACJ"}
@@ -1,3 +1,4 @@
1
+ import { type Mimetypes } from "@plurnk/plurnk-mimetypes";
1
2
  export declare const TEXT_PRIMITIVE_MIMETYPE = "text/markdown";
2
3
  export default class MimetypeClassifier {
3
4
  static isBinary(mimetype: string): boolean;
@@ -8,4 +9,8 @@ export default class MimetypeClassifier {
8
9
  }): boolean;
9
10
  static normalizeAutoText(mimetype: string | null | undefined): string;
10
11
  }
12
+ export declare class PathMimetype {
13
+ static extractExtension(pathname: string): string;
14
+ static resolve(pathname: string, schemeDefault: string, mimetypes: Mimetypes | undefined): Promise<string>;
15
+ }
11
16
  //# sourceMappingURL=MimetypeClassifier.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"MimetypeClassifier.d.ts","sourceRoot":"","sources":["../src/MimetypeClassifier.ts"],"names":[],"mappings":"AAoBA,eAAO,MAAM,uBAAuB,kBAAkB,CAAC;AAEvD,MAAM,CAAC,OAAO,OAAO,kBAAkB;IAEnC,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEzC;IAKD,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEvC;IAGD,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEvC;IAGD,MAAM,CAAC,oBAAoB,CACvB,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,EACnB,oBAAoB,GAAE;QAAE,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAA;KAA6B,GAC9E,OAAO,CAIT;IAMD,MAAM,CAAC,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAKpE;CACJ"}
1
+ {"version":3,"file":"MimetypeClassifier.d.ts","sourceRoot":"","sources":["../src/MimetypeClassifier.ts"],"names":[],"mappings":"AAUA,OAAO,EAAoB,KAAK,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAU5E,eAAO,MAAM,uBAAuB,kBAAkB,CAAC;AAEvD,MAAM,CAAC,OAAO,OAAO,kBAAkB;IAEnC,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEzC;IAKD,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEvC;IAGD,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEvC;IAGD,MAAM,CAAC,oBAAoB,CACvB,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,EACnB,oBAAoB,GAAE;QAAE,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAA;KAA6B,GAC9E,OAAO,CAIT;IAMD,MAAM,CAAC,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAKpE;CACJ;AAGD,qBAAa,YAAY;IAGrB,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAMhD;IAQD,OAAa,OAAO,CAChB,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,SAAS,GAAG,SAAS,GACjC,OAAO,CAAC,MAAM,CAAC,CAOjB;CACJ"}
@@ -4,7 +4,7 @@
4
4
  // the registry-free surface; a consumer with a configured Mimetypes service
5
5
  // uses Mimetypes.classify() so installed handler declarations remain authoritative.
6
6
  //
7
- // {§mimetype-classifier} What stays local is scheme semantics, not filetype fact:
7
+ // {§network-address} What stays local is scheme semantics, not filetype fact:
8
8
  // isJson - JSON receipt summarization (RFC 6839).
9
9
  // normalizeAutoText — the text-primitive policy (auto-derived text is markdown).
10
10
  import { classifyMimetype } from "@plurnk/plurnk-mimetypes";
@@ -18,21 +18,21 @@ import { classifyMimetype } from "@plurnk/plurnk-mimetypes";
18
18
  // markdown?"
19
19
  export const TEXT_PRIMITIVE_MIMETYPE = "text/markdown";
20
20
  export default class MimetypeClassifier {
21
- // Pure taxonomy for registry-free boundaries (SPEC {§mimetype-classifier}).
21
+ // Pure taxonomy for registry-free boundaries (SPEC {§network-address}).
22
22
  static isBinary(mimetype) {
23
23
  return classifyMimetype(mimetype).binary;
24
24
  }
25
25
  // JSON-family check used by receipt summarization.
26
26
  // Matches application/json plus +json suffix variants per RFC 6839.
27
- // {§mimetype-classifier} Scheme semantics, deliberately NOT delegated.
27
+ // {§network-address} Scheme semantics, deliberately NOT delegated.
28
28
  static isJson(mimetype) {
29
29
  return mimetype === "application/json" || mimetype.endsWith("+json");
30
30
  }
31
- // Exact normalized HTML family used by web acquisition {§html-materialization}.
31
+ // Exact normalized HTML family used by web acquisition {§http-lifecycle}.
32
32
  static isHtml(mimetype) {
33
33
  return mimetype === "text/html" || mimetype === "application/xhtml+xml";
34
34
  }
35
- // {§mimetype-verbatim-transfer}
35
+ // {§network-address}
36
36
  static isTransferCompatible(source, destination, sourceClassification = classifyMimetype(source)) {
37
37
  return source === destination
38
38
  || (!sourceClassification.binary
@@ -49,4 +49,32 @@ export default class MimetypeClassifier {
49
49
  return mimetype;
50
50
  }
51
51
  }
52
+ // {§network-address}: recognized suffixes precede the caller's supplied type.
53
+ export class PathMimetype {
54
+ // Extract the suffix (everything after the last dot in the last segment)
55
+ // from a pathname. Empty if no dot in the last segment.
56
+ static extractExtension(pathname) {
57
+ const lastSlash = pathname.lastIndexOf("/");
58
+ const lastSegment = lastSlash === -1 ? pathname : pathname.slice(lastSlash + 1);
59
+ const lastDot = lastSegment.lastIndexOf(".");
60
+ if (lastDot <= 0)
61
+ return ""; // leading-dot files (".env") aren't an extension
62
+ return lastSegment.slice(lastDot); // includes the leading "."
63
+ }
64
+ // Resolve a pathname → effective mimetype.
65
+ // 1. If the pathname has an extension, query Mimetypes.detect({ ext })
66
+ // and use what comes back (normalized via the text-primitive rule —
67
+ // text/plain → text/markdown).
68
+ // 2. Otherwise (no extension or no Mimetypes service), fall back to
69
+ // `schemeDefault` (typically the scheme manifest's channel default).
70
+ static async resolve(pathname, schemeDefault, mimetypes) {
71
+ const ext = PathMimetype.extractExtension(pathname);
72
+ if (ext.length > 0 && mimetypes !== undefined) {
73
+ const detected = await mimetypes.detect({ ext });
74
+ if (detected !== null)
75
+ return MimetypeClassifier.normalizeAutoText(detected);
76
+ }
77
+ return schemeDefault;
78
+ }
79
+ }
52
80
  //# sourceMappingURL=MimetypeClassifier.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"MimetypeClassifier.js","sourceRoot":"","sources":["../src/MimetypeClassifier.ts"],"names":[],"mappings":"AAAA,sDAAsD;AACtD,EAAE;AACF,8EAA8E;AAC9E,4EAA4E;AAC5E,oFAAoF;AACpF,EAAE;AACF,kFAAkF;AAClF,8DAA8D;AAC9D,mFAAmF;AAEnF,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAE5D,sEAAsE;AACtE,oEAAoE;AACpE,mEAAmE;AACnE,wEAAwE;AACxE,wEAAwE;AACxE,qEAAqE;AACrE,gEAAgE;AAChE,aAAa;AACb,MAAM,CAAC,MAAM,uBAAuB,GAAG,eAAe,CAAC;AAEvD,MAAM,CAAC,OAAO,OAAO,kBAAkB;IACnC,4EAA4E;IAC5E,MAAM,CAAC,QAAQ,CAAC,QAAgB;QAC5B,OAAO,gBAAgB,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC;IAC7C,CAAC;IAED,mDAAmD;IACnD,oEAAoE;IACpE,uEAAuE;IACvE,MAAM,CAAC,MAAM,CAAC,QAAgB;QAC1B,OAAO,QAAQ,KAAK,kBAAkB,IAAI,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IACzE,CAAC;IAED,gFAAgF;IAChF,MAAM,CAAC,MAAM,CAAC,QAAgB;QAC1B,OAAO,QAAQ,KAAK,WAAW,IAAI,QAAQ,KAAK,uBAAuB,CAAC;IAC5E,CAAC;IAED,gCAAgC;IAChC,MAAM,CAAC,oBAAoB,CACvB,MAAc,EACd,WAAmB,EACnB,oBAAoB,GAAiC,gBAAgB,CAAC,MAAM,CAAC;QAE7E,OAAO,MAAM,KAAK,WAAW;eACtB,CAAC,CAAC,oBAAoB,CAAC,MAAM;mBACzB,CAAC,WAAW,KAAK,YAAY,IAAI,WAAW,KAAK,uBAAuB,CAAC,CAAC,CAAC;IAC1F,CAAC;IAED,iEAAiE;IACjE,8DAA8D;IAC9D,wEAAwE;IACxE,2BAA2B;IAC3B,MAAM,CAAC,iBAAiB,CAAC,QAAmC;QACxD,IAAI,QAAQ,KAAK,IAAI,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,EAAE,IAAI,QAAQ,KAAK,YAAY,EAAE,CAAC;YAC9F,OAAO,uBAAuB,CAAC;QACnC,CAAC;QACD,OAAO,QAAQ,CAAC;IACpB,CAAC;CACJ"}
1
+ {"version":3,"file":"MimetypeClassifier.js","sourceRoot":"","sources":["../src/MimetypeClassifier.ts"],"names":[],"mappings":"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"}
@@ -1,11 +1,11 @@
1
- // {§executor-scheme-output} Derive an output-scheme manifest from an executor's
1
+ // {§network-address} Derive an output-scheme manifest from an executor's
2
2
  // per-tag runtime declaration. An
3
3
  // executor authors NO SchemeManifest: its `plurnk.runtimes[]` entry already
4
4
  // carries name / glyph / output-channels, and everything else is the shared
5
5
  // read-only-output default. So the `sh` runtime gets `sh://` for free, and a multi-tag
6
6
  // executor derives a distinct manifest per tag.
7
7
  export default class OutputScheme {
8
- // {§executor-scheme-output}: read-only model access to extension-produced data.
8
+ // {§network-address}: read-only model access to extension-produced data.
9
9
  // Per-call output mimetypes override the declared channel seeds at stream time.
10
10
  static manifestFromRuntime(decl) {
11
11
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"OutputScheme.js","sourceRoot":"","sources":["../src/OutputScheme.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,kCAAkC;AAClC,4EAA4E;AAC5E,4EAA4E;AAC5E,uFAAuF;AACvF,gDAAgD;AAchD,MAAM,CAAC,OAAO,OAAO,YAAY;IAC7B,gFAAgF;IAChF,gFAAgF;IAChF,MAAM,CAAC,mBAAmB,CAAC,IAAiB;QACxC,OAAO;YACH,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,SAAS,EAAE,WAAW;YACtB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,cAAc,EAAE,IAAI,CAAC,cAAc;YACnC,QAAQ,EAAE,MAAM;YAChB,UAAU,EAAE,EAAE;YACd,QAAQ,EAAE,IAAI;YACd,YAAY,EAAE,IAAI;YAClB,YAAY,EAAE,IAAI;YAClB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,MAAM,EAAE,IAAI,CAAC,MAAM;SACtB,CAAC;IACN,CAAC;CACJ"}
1
+ {"version":3,"file":"OutputScheme.js","sourceRoot":"","sources":["../src/OutputScheme.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,kCAAkC;AAClC,4EAA4E;AAC5E,4EAA4E;AAC5E,uFAAuF;AACvF,gDAAgD;AAchD,MAAM,CAAC,OAAO,OAAO,YAAY;IAC7B,yEAAyE;IACzE,gFAAgF;IAChF,MAAM,CAAC,mBAAmB,CAAC,IAAiB;QACxC,OAAO;YACH,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,SAAS,EAAE,WAAW;YACtB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,cAAc,EAAE,IAAI,CAAC,cAAc;YACnC,QAAQ,EAAE,MAAM;YAChB,UAAU,EAAE,EAAE;YACd,QAAQ,EAAE,IAAI;YACd,YAAY,EAAE,IAAI;YAClB,YAAY,EAAE,IAAI;YAClB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,MAAM,EAAE,IAAI,CAAC,MAAM;SACtB,CAAC;IACN,CAAC;CACJ"}
@@ -1,4 +1,12 @@
1
- import type { PacketSectionDraft } from "./packet.ts";
1
+ export interface PacketSectionDraft {
2
+ readonly name: string;
3
+ readonly slot: "system" | "user" | "assistant";
4
+ readonly header: string | null;
5
+ readonly content: string;
6
+ }
7
+ export interface PacketSectionTransformer {
8
+ transformSections(sections: PacketSectionDraft[]): PacketSectionDraft[] | Promise<PacketSectionDraft[]>;
9
+ }
2
10
  export default class PacketSections {
3
11
  #private;
4
12
  static assertDrafts(value: unknown, subject?: string): PacketSectionDraft[];
@@ -1 +1 @@
1
- {"version":3,"file":"PacketSections.d.ts","sourceRoot":"","sources":["../src/PacketSections.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAKtD,MAAM,CAAC,OAAO,OAAO,cAAc;;IAE/B,MAAM,CAAC,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,SAA0B,GAAG,kBAAkB,EAAE,CAG3F;IAeD,MAAM,CAAC,WAAW,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,kBAAkB,CAGtE;CAuBJ"}
1
+ {"version":3,"file":"PacketSections.d.ts","sourceRoot":"","sources":["../src/PacketSections.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,kBAAkB;IAC/B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAC;IAC/C,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,wBAAwB;IACrC,iBAAiB,CAAC,QAAQ,EAAE,kBAAkB,EAAE,GAAG,kBAAkB,EAAE,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAAC;CAC3G;AAKD,MAAM,CAAC,OAAO,OAAO,cAAc;;IAE/B,MAAM,CAAC,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,SAA0B,GAAG,kBAAkB,EAAE,CAG3F;IAeD,MAAM,CAAC,WAAW,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,kBAAkB,CAGtE;CAuBJ"}
@@ -2,7 +2,7 @@ import { isRecord } from "@plurnk/plurnk-contracts";
2
2
  const FIELDS = ["name", "slot", "header", "content"];
3
3
  const FIELD_NAMES = new Set(FIELDS);
4
4
  export default class PacketSections {
5
- // {§scheme-packet-transform} Exact valid drafts preserve their list: the check narrows the value it was given.
5
+ // {§network-address} Exact valid drafts preserve their list: the check narrows the value it was given.
6
6
  static assertDrafts(value, subject = "packet section drafts") {
7
7
  PacketSections.#checkDrafts(value, subject);
8
8
  return value;
@@ -1 +1 @@
1
- {"version":3,"file":"PacketSections.js","sourceRoot":"","sources":["../src/PacketSections.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"PacketSections.js","sourceRoot":"","sources":["../src/PacketSections.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { createHash, randomUUID } from "node:crypto";
2
- // {§resource-publication-names} One allocator per resource collection. A stable
2
+ // {§scheme-operation-dispatch} One allocator per resource collection. A stable
3
3
  // identity lets a live collection reconstruct its paths on subsequent READs.
4
4
  export default class ResourceNames {
5
5
  #used = new Set();
@@ -1 +1 @@
1
- {"version":3,"file":"ResourceNames.js","sourceRoot":"","sources":["../src/ResourceNames.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAErD,gFAAgF;AAChF,6EAA6E;AAC7E,MAAM,CAAC,OAAO,OAAO,aAAa;IACrB,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAEnC,QAAQ,CAAC,IAAa,EAAE,QAAQ,GAAW,UAAU,EAAE;QACnD,MAAM,QAAQ,GAAG,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,EAAE,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;QAClG,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,MAAM,IAAI,GAAG,GAAW,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,OAAO,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACpH,IAAI,SAAS,GAAG,QAAQ,IAAI,IAAI,EAAE,CAAC;QACnC,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC;YAAE,SAAS,GAAG,GAAG,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,QAAQ,GAAG,GAAG,IAAI,EAAE,EAAE,CAAC;QACpG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC1B,OAAO,kBAAkB,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,IAAI,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IACvI,CAAC;CACJ"}
1
+ {"version":3,"file":"ResourceNames.js","sourceRoot":"","sources":["../src/ResourceNames.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAErD,+EAA+E;AAC/E,6EAA6E;AAC7E,MAAM,CAAC,OAAO,OAAO,aAAa;IACrB,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAEnC,QAAQ,CAAC,IAAa,EAAE,QAAQ,GAAW,UAAU,EAAE;QACnD,MAAM,QAAQ,GAAG,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,EAAE,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;QAClG,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,MAAM,IAAI,GAAG,GAAW,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,OAAO,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACpH,IAAI,SAAS,GAAG,QAAQ,IAAI,IAAI,EAAE,CAAC;QACnC,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC;YAAE,SAAS,GAAG,GAAG,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,QAAQ,GAAG,GAAG,IAAI,EAAE,EAAE,CAAC;QACpG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC1B,OAAO,kBAAkB,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,IAAI,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IACvI,CAAC;CACJ"}
@@ -1 +1 @@
1
- {"version":3,"file":"SchemeDiscovery.d.ts","sourceRoot":"","sources":["../src/SchemeDiscovery.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,mBAAmB,EAAwB,MAAM,qBAAqB,CAAC;AAyBrF,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;CAChC;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,CAoCnF;CAoDJ"}
1
+ {"version":3,"file":"SchemeDiscovery.d.ts","sourceRoot":"","sources":["../src/SchemeDiscovery.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,mBAAmB,EAAwB,MAAM,qBAAqB,CAAC;AAyBrF,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;CAChC;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,CA2BnF;CA0BJ"}
@@ -1,29 +1,13 @@
1
1
  import { isRecord } from "@plurnk/plurnk-contracts";
2
- import path from "node:path";
3
2
  import Meta from "@plurnk/plurnk-meta";
4
3
  export default class SchemeDiscovery {
5
4
  static async discover(options = {}) {
6
- const { signal } = options;
7
- const dirs = options.packageDirs ?? await SchemeDiscovery.#defaultPackageDirs(options.cwd ?? process.cwd(), signal);
5
+ const { admitted, skipped } = await Meta.scanKind("scheme", options);
8
6
  const byName = new Map();
9
7
  const packageAttributions = new Map();
10
- const skipped = new Set();
11
- for (const dir of dirs) {
12
- signal?.throwIfAborted();
13
- const manifest = await SchemeDiscovery.#readSchemeManifest(dir, signal);
14
- if (manifest === null)
15
- continue;
16
- // Host extension-trust gate: an untrusted third-party package is
17
- // discovered but not surfaced for registration — recorded, never
18
- // crashed on. Validation of declaration fields and attribution follows
19
- // this package-level gate ({§extension-trust-boundary}).
20
- if (!Meta.isTrusted(manifest.packageName)) {
21
- skipped.add(manifest.packageName);
22
- continue;
23
- }
24
- const tags = Meta.normalizeAttribution(manifest.plurnk.attribution, manifest.packageName);
25
- const infos = SchemeDiscovery.#readSchemeInfos(manifest);
26
- let admitted = false;
8
+ for (const pkg of admitted) {
9
+ const infos = SchemeDiscovery.#readSchemeInfos(pkg);
10
+ let pkgAdmitted = false;
27
11
  for (const info of infos) {
28
12
  const existing = byName.get(info.name);
29
13
  // Two packages (or two entries) claiming one scheme prefix is an
@@ -35,36 +19,13 @@ export default class SchemeDiscovery {
35
19
  + `${existing.packageName} and ${info.packageName}`);
36
20
  }
37
21
  byName.set(info.name, info);
38
- admitted = true;
22
+ pkgAdmitted = true;
23
+ }
24
+ if (pkgAdmitted && pkg.attribution.length > 0) {
25
+ packageAttributions.set(pkg.packageName, pkg.attribution);
39
26
  }
40
- if (admitted && tags.length > 0)
41
- packageAttributions.set(manifest.packageName, tags);
42
27
  }
43
- return { schemes: [...byName.values()], packageAttributions, skipped: [...skipped].toSorted() };
44
- }
45
- // Host extension-trust gate, read from PLURNK_EXTENSIONS_TRUSTED_ONLY — the SAME
46
- // env var the host decides once and every scope-agnostic discovery
47
- // surface enforces through the shared Meta contract ({§extension-trust-boundary}):
48
- // unset / "" / "0" → OFF: every installed package trusted (no regression).
49
- // any value → ON: `@plurnk/*` always trusted, plus a comma-separated
50
- // allowlist of additionally-trusted package names.
51
- // Enumerate every installed package directory — scoped (`@scope/name`) and
52
- // unscoped (`name`) — under `<cwd>/node_modules`. Unreadable dirs are the
53
- // legitimate scan boundary (not-a-package, missing manifest), skipped — not
54
- // a masked contract violation (cf. the matcher's sanctioned node_modules tolerance).
55
- static async #defaultPackageDirs(cwd, signal) {
56
- signal?.throwIfAborted();
57
- const nm = Meta.nearestNodeModules(cwd) ?? path.join(path.resolve(cwd), "node_modules");
58
- return (await Meta.packageDirs(nm)).map((c) => c.dir).toSorted();
59
- }
60
- // The inert manifest for a package declaring plurnk.kind:"scheme" ({§extension-manifest-read});
61
- // null for anything else, including an unnamed package. Declaration field validation happens
62
- // only after the package trust gate. An abort surfaces (locality of error).
63
- static async #readSchemeManifest(dir, signal) {
64
- const manifest = await Meta.readManifest(dir, "scheme", { signal });
65
- if (manifest === null || manifest.packageName === null)
66
- return null;
67
- return { packageName: manifest.packageName, plurnk: manifest.plurnk };
28
+ return { schemes: [...byName.values()], packageAttributions, skipped };
68
29
  }
69
30
  // The SchemeInfo(s) for an admitted package. A package
70
31
  // declares EITHER `plurnk.schemes: [{ name, export }, …]` (canonical, one
@@ -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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"}
package/dist/Slicer.js CHANGED
@@ -19,7 +19,7 @@
19
19
  import { TextCoordinates } from "@plurnk/plurnk-mimetypes";
20
20
  import Results, {} from "./Results.js";
21
21
  export default class Slicer {
22
- // {§read-zero-start} Projection tolerance is separate from the strict mutation algebra.
22
+ // {§slicer-text-algebra} Projection tolerance is separate from the strict mutation algebra.
23
23
  static readScope(marker) {
24
24
  const [first, last] = marker.marks;
25
25
  return marker.marks.length === 2 && first === 0 && Number.isSafeInteger(last) && (last === -1 || last > 0)
@@ -68,7 +68,7 @@ export default class Slicer {
68
68
  return range.total === 0
69
69
  || (range.returned?.[0] === 1 && range.returned[1] === range.total);
70
70
  }
71
- // {§slicer-window} — the positional contract of `lines()` over any 1-based unit whose content
71
+ // {§slicer-text-algebra} — the positional contract of `lines()` over any 1-based unit whose content
72
72
  // is not text in memory (a resource's bytes): the same normalization, extents, sentinels, and
73
73
  // 416s, resolved against a total alone. A null start is a sentinel selection of nothing.
74
74
  static window(marker, total, unit) {
@@ -89,7 +89,7 @@ export default class Slicer {
89
89
  return { error: "An exact text region requires four integer coordinates." };
90
90
  }
91
91
  const resolved = Slicer.#exactRegion(content, marker, body);
92
- // {§text-scope-semantics} — lines and columns count from 1; a refused region holding a zero
92
+ // {§op-shapes} — lines and columns count from 1; a refused region holding a zero
93
93
  // says so as read and is never rebuilt into another region ({§diagnostic-observation}).
94
94
  if (!("error" in resolved) || !marker.marks.includes(0))
95
95
  return resolved;
@@ -97,7 +97,7 @@ export default class Slicer {
97
97
  }
98
98
  static #exactRegion(content, marker, body) {
99
99
  const lines = TextCoordinates.lines(content);
100
- // {§text-scope-semantics} — `-1` is the final addressable endpoint in every form: as a region line it
100
+ // {§op-shapes} — `-1` is the final addressable endpoint in every form: as a region line it
101
101
  // is the end of the content, so `<1,1,-1,1>` is the whole text and `<-1,1,-1,1>` appends; as a column
102
102
  // it is the end of its line, so `<3,1,3,-1>` is line 3 to its end and `<3,-1,3,-1>` appends to it.
103
103
  if (!Slicer.#fourMarks(marker.marks))
@@ -168,7 +168,7 @@ export default class Slicer {
168
168
  }
169
169
  static #lineTextReplacement(content, marker, body) {
170
170
  const lines = TextCoordinates.logicalLines(content);
171
- // {§empty-mutation-scope}: position 1 is writable without inventing a readable line.
171
+ // {§op-shapes}: position 1 is writable without inventing a readable line.
172
172
  if (lines.length === 0 && marker.marks.length === 1 && marker.marks[0] === 1) {
173
173
  return { start: 0, end: 0, body, startLine: 1, endLine: 1 };
174
174
  }
@@ -259,7 +259,7 @@ export default class Slicer {
259
259
  normalization: { requested, canonical },
260
260
  };
261
261
  }
262
- // {§range-starts-at-one} A two-coordinate range never starts at 0. The refusal says so in the
262
+ // {§slicer-text-algebra} A two-coordinate range never starts at 0. The refusal says so in the
263
263
  // range's unit; a line range's recovery shows the working line forms, never a range rebuilt
264
264
  // from the refused one ({§diagnostic-observation}).
265
265
  static #zeroStart(last, unit) {
@@ -302,7 +302,7 @@ export default class Slicer {
302
302
  if (first === 0)
303
303
  return Slicer.#zeroStart(last, unit);
304
304
  // Whole-content `<1,-1>` is valid even on empty content — it selects the entire,
305
- // possibly-empty range ({§empty-mutation-scope}). start>end here yields an empty
305
+ // possibly-empty range ({§op-shapes}). start>end here yields an empty
306
306
  // slice for READ and a full replacement for EDIT.
307
307
  if (totalLines === 0) {
308
308
  if (first === 1 && (last === -1 || last > 0)) {
@@ -314,7 +314,7 @@ export default class Slicer {
314
314
  let m = last;
315
315
  if (m === -1 || m > totalLines)
316
316
  m = totalLines;
317
- // {§text-scope-semantics} — -1 is the only position counted from the end; a `<-N,-1>` start is
317
+ // {§op-shapes} — -1 is the only position counted from the end; a `<-N,-1>` start is
318
318
  // refused with the line extent, never rebuilt into a tail ({§diagnostic-observation}).
319
319
  if (n < -1 && last === -1) {
320
320
  return {
@@ -414,7 +414,7 @@ export default class Slicer {
414
414
  // in RFC 9457 Problem Details instead of emitting a bare 416.
415
415
  static page(items, marker, options = {}) {
416
416
  const total = items.length;
417
- // {§range-extent} An extent holds one or two positions; a request of any other arity is named as written.
417
+ // {§text-region} An extent holds one or two positions; a request of any other arity is named as written.
418
418
  if (marker.marks.length !== 1 && marker.marks.length !== 2) {
419
419
  return Slicer.#failure("range-not-satisfiable", 416, `Result pagination requires one position or an inclusive two-position range; received ${marker.marks.length} positions.`, {}, {
420
420
  requestedPositions: marker.marks,
@@ -524,7 +524,7 @@ export default class Slicer {
524
524
  retryable: false,
525
525
  });
526
526
  }
527
- // {§edit-batch-merges} — evidence-gated resolutions before the conflict check, each
527
+ // {§op-methods-op-dispatch} — evidence-gated resolutions before the conflict check, each
528
528
  // reported on its row: an identical twin is applied once; two insertions at one point
529
529
  // land in authored order; a one-line shared endpoint goes to the body that reproduces
530
530
  // that line (the other region shrinks by one). Everything else stays a refusal.
@@ -613,7 +613,7 @@ export default class Slicer {
613
613
  }
614
614
  }
615
615
  const live = indexed.filter(({ index }) => !dropped.has(index));
616
- // {§edit-batch-receipt} — the whole conflict graph in one receipt: every conflicting
616
+ // {§op-methods-op-dispatch} — the whole conflict graph in one receipt: every conflicting
617
617
  // pair with its relation, and the regions that were clean, so the model knows exactly
618
618
  // what to change and that nothing was applied (#428).
619
619
  const conflicts = [];