@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.
- package/README.md +5 -5
- package/SPEC.md +119 -745
- package/dist/ByteSource.d.ts +13 -0
- package/dist/ByteSource.d.ts.map +1 -1
- package/dist/ByteSource.js +62 -1
- package/dist/ByteSource.js.map +1 -1
- package/dist/MessageScheme.js +1 -1
- package/dist/MessageScheme.js.map +1 -1
- package/dist/MetadataOptions.d.ts +1 -2
- package/dist/MetadataOptions.d.ts.map +1 -1
- package/dist/MetadataOptions.js +3 -6
- package/dist/MetadataOptions.js.map +1 -1
- package/dist/MimetypeClassifier.d.ts +5 -0
- package/dist/MimetypeClassifier.d.ts.map +1 -1
- package/dist/MimetypeClassifier.js +33 -5
- package/dist/MimetypeClassifier.js.map +1 -1
- package/dist/OutputScheme.js +2 -2
- package/dist/OutputScheme.js.map +1 -1
- package/dist/PacketSections.d.ts +9 -1
- package/dist/PacketSections.d.ts.map +1 -1
- package/dist/PacketSections.js +1 -1
- package/dist/PacketSections.js.map +1 -1
- package/dist/ResourceNames.js +1 -1
- package/dist/ResourceNames.js.map +1 -1
- package/dist/SchemeDiscovery.d.ts.map +1 -1
- package/dist/SchemeDiscovery.js +9 -48
- package/dist/SchemeDiscovery.js.map +1 -1
- package/dist/Slicer.js +11 -11
- package/dist/Slicer.js.map +1 -1
- package/dist/Summarize.js +2 -2
- package/dist/Summarize.js.map +1 -1
- package/dist/ctx.d.ts +2 -3
- package/dist/ctx.d.ts.map +1 -1
- package/dist/edit-receipt.d.ts +4 -0
- package/dist/edit-receipt.d.ts.map +1 -1
- package/dist/handler.d.ts +26 -2
- package/dist/handler.d.ts.map +1 -1
- package/dist/index.d.ts +7 -15
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -11
- package/dist/index.js.map +1 -1
- package/package.json +4 -4
- package/dist/FileByteSource.d.ts +0 -9
- package/dist/FileByteSource.d.ts.map +0 -1
- package/dist/FileByteSource.js +0 -43
- package/dist/FileByteSource.js.map +0 -1
- package/dist/GeneratedByteSource.d.ts +0 -8
- package/dist/GeneratedByteSource.d.ts.map +0 -1
- package/dist/GeneratedByteSource.js +0 -21
- package/dist/GeneratedByteSource.js.map +0 -1
- package/dist/PathMimetype.d.ts +0 -6
- package/dist/PathMimetype.d.ts.map +0 -1
- package/dist/PathMimetype.js +0 -30
- package/dist/PathMimetype.js.map +0 -1
- package/dist/edit-statement.d.ts +0 -5
- package/dist/edit-statement.d.ts.map +0 -1
- package/dist/edit-statement.js +0 -2
- package/dist/edit-statement.js.map +0 -1
- package/dist/module-slice.d.ts +0 -22
- package/dist/module-slice.d.ts.map +0 -1
- package/dist/module-slice.js +0 -2
- package/dist/module-slice.js.map +0 -1
- package/dist/packet.d.ts +0 -10
- package/dist/packet.d.ts.map +0 -1
- package/dist/packet.js +0 -4
- package/dist/packet.js.map +0 -1
- package/dist/resource-tree.d.ts +0 -15
- package/dist/resource-tree.d.ts.map +0 -1
- package/dist/resource-tree.js +0 -2
- package/dist/resource-tree.js.map +0 -1
package/dist/ByteSource.d.ts
CHANGED
|
@@ -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
|
package/dist/ByteSource.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ByteSource.d.ts","sourceRoot":"","sources":["../src/ByteSource.ts"],"names":[],"mappings":"
|
|
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"}
|
package/dist/ByteSource.js
CHANGED
|
@@ -1,2 +1,63 @@
|
|
|
1
|
-
|
|
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
|
package/dist/ByteSource.js.map
CHANGED
|
@@ -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"}
|
package/dist/MessageScheme.js
CHANGED
|
@@ -11,7 +11,7 @@ export default class MessageScheme {
|
|
|
11
11
|
};
|
|
12
12
|
}
|
|
13
13
|
async resolveEntryAddress(target, _ctx, access = "read") {
|
|
14
|
-
// {§message-
|
|
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,
|
|
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 ["
|
|
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,
|
|
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"}
|
package/dist/MetadataOptions.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
// {§
|
|
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
|
-
// {§
|
|
9
|
-
static SERVICE_KEYS = Object.freeze(["
|
|
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":"AAAA,
|
|
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":"
|
|
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
|
-
// {§
|
|
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 {§
|
|
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
|
-
// {§
|
|
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 {§
|
|
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
|
-
// {§
|
|
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,
|
|
1
|
+
{"version":3,"file":"MimetypeClassifier.js","sourceRoot":"","sources":["../src/MimetypeClassifier.ts"],"names":[],"mappings":"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"}
|
package/dist/OutputScheme.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
// {§
|
|
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
|
-
// {§
|
|
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 {
|
package/dist/OutputScheme.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OutputScheme.js","sourceRoot":"","sources":["../src/OutputScheme.ts"],"names":[],"mappings":"AAAA,
|
|
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"}
|
package/dist/PacketSections.d.ts
CHANGED
|
@@ -1,4 +1,12 @@
|
|
|
1
|
-
|
|
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":"
|
|
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"}
|
package/dist/PacketSections.js
CHANGED
|
@@ -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
|
-
// {§
|
|
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":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"PacketSections.js","sourceRoot":"","sources":["../src/PacketSections.ts"],"names":[],"mappings":"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"}
|
package/dist/ResourceNames.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { createHash, randomUUID } from "node:crypto";
|
|
2
|
-
// {§
|
|
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
|
|
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":"
|
|
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"}
|
package/dist/SchemeDiscovery.js
CHANGED
|
@@ -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 {
|
|
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
|
|
11
|
-
|
|
12
|
-
|
|
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
|
-
|
|
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
|
|
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":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACpD,OAAO,IAAI,MAAM,
|
|
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
|
-
// {§
|
|
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-
|
|
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
|
-
// {§
|
|
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
|
-
// {§
|
|
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
|
-
// {§
|
|
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
|
-
// {§
|
|
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 ({§
|
|
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
|
-
// {§
|
|
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
|
-
// {§
|
|
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
|
-
// {§
|
|
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
|
-
// {§
|
|
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 = [];
|