@skenora/tooling 0.1.2

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 (44) hide show
  1. package/README.md +32 -0
  2. package/bin/skenora-mcp-http.mjs +131 -0
  3. package/bin/skenora-mcp.mjs +50 -0
  4. package/bin/skenora.mjs +388 -0
  5. package/dist/doctor.d.ts +3 -0
  6. package/dist/doctor.d.ts.map +1 -0
  7. package/dist/doctor.js +109 -0
  8. package/dist/doctor.js.map +1 -0
  9. package/dist/examples.d.ts +26 -0
  10. package/dist/examples.d.ts.map +1 -0
  11. package/dist/examples.js +207 -0
  12. package/dist/examples.js.map +1 -0
  13. package/dist/index.d.ts +8 -0
  14. package/dist/index.d.ts.map +1 -0
  15. package/dist/index.js +7 -0
  16. package/dist/index.js.map +1 -0
  17. package/dist/mcp-http.d.ts +16 -0
  18. package/dist/mcp-http.d.ts.map +1 -0
  19. package/dist/mcp-http.js +279 -0
  20. package/dist/mcp-http.js.map +1 -0
  21. package/dist/mcp.d.ts +79 -0
  22. package/dist/mcp.d.ts.map +1 -0
  23. package/dist/mcp.js +817 -0
  24. package/dist/mcp.js.map +1 -0
  25. package/dist/resources.d.ts +24 -0
  26. package/dist/resources.d.ts.map +1 -0
  27. package/dist/resources.js +141 -0
  28. package/dist/resources.js.map +1 -0
  29. package/dist/wgsl.d.ts +42 -0
  30. package/dist/wgsl.d.ts.map +1 -0
  31. package/dist/wgsl.js +133 -0
  32. package/dist/wgsl.js.map +1 -0
  33. package/package.json +53 -0
  34. package/resources/docs/diagnostics.md +16 -0
  35. package/resources/docs/overview.md +26 -0
  36. package/resources/docs/runtime-probe.md +17 -0
  37. package/resources/examples/gallery.json +1818 -0
  38. package/resources/examples/invalid-scene.json +9 -0
  39. package/resources/examples/valid-scene.json +69 -0
  40. package/resources/llms-full.txt +52 -0
  41. package/resources/llms.txt +19 -0
  42. package/resources/manifest.json +97 -0
  43. package/resources/schemas/example-manifest.schema.json +454 -0
  44. package/resources/schemas/scene-check-report.schema.json +36 -0
package/dist/doctor.js ADDED
@@ -0,0 +1,109 @@
1
+ import { createSkenoraDiagnostic, finalizeSkenoraDiagnostics, } from "@skenora/contracts";
2
+ export function createDoctorReport(probe) {
3
+ const diagnostics = [];
4
+ const runtime = detectRuntime();
5
+ const parsedProbe = validateProbe(probe, diagnostics);
6
+ if (!parsedProbe) {
7
+ diagnostics.push(createSkenoraDiagnostic({
8
+ code: "doctor-browser-probe-required",
9
+ severity: "warning",
10
+ stage: "environment",
11
+ message: "Package and static checks cannot prove that a browser GPU backend renders correctly",
12
+ recoverable: true,
13
+ repair: "In a browser, load a SceneDocument and call await renderer.probe(); then pass that JSON report to `skenora doctor --probe-report <file>`.",
14
+ }));
15
+ }
16
+ const allDiagnostics = finalizeSkenoraDiagnostics([
17
+ ...diagnostics,
18
+ ...(parsedProbe?.diagnostics ?? []),
19
+ ]);
20
+ return Object.freeze({
21
+ version: 1,
22
+ verdict: parsedProbe?.verdict ?? "unverified",
23
+ environment: Object.freeze({
24
+ runtime,
25
+ ...(typeof process === "undefined"
26
+ ? {}
27
+ : { nodeVersion: process.version }),
28
+ ...(typeof navigator === "undefined"
29
+ ? {}
30
+ : { userAgent: navigator.userAgent }),
31
+ }),
32
+ ...(parsedProbe === undefined ? {} : { probe: parsedProbe }),
33
+ diagnostics: allDiagnostics,
34
+ });
35
+ }
36
+ function validateProbe(input, diagnostics) {
37
+ if (input === undefined)
38
+ return undefined;
39
+ if (!isRecord(input) ||
40
+ input.version !== 1 ||
41
+ !isRecord(input.evidence) ||
42
+ !isRecord(input.backend) ||
43
+ !Array.isArray(input.diagnostics) ||
44
+ !input.diagnostics.every(isDiagnostic) ||
45
+ typeof input.startedAt !== "string" ||
46
+ typeof input.finishedAt !== "string" ||
47
+ typeof input.evidence.renderAttempted !== "boolean" ||
48
+ typeof input.evidence.renderCompleted !== "boolean" ||
49
+ typeof input.evidence.readbackAttempted !== "boolean" ||
50
+ typeof input.evidence.readbackCompleted !== "boolean") {
51
+ diagnostics.push(invalidProbe("Runtime probe report has an invalid shape"));
52
+ return undefined;
53
+ }
54
+ if (input.verdict !== "healthy" &&
55
+ input.verdict !== "unhealthy" &&
56
+ input.verdict !== "unverified") {
57
+ diagnostics.push(invalidProbe("Runtime probe verdict is invalid"));
58
+ return undefined;
59
+ }
60
+ if (input.verdict === "healthy" &&
61
+ (input.evidence.renderCompleted !== true ||
62
+ input.evidence.readbackCompleted !== true)) {
63
+ diagnostics.push(createSkenoraDiagnostic({
64
+ code: "doctor-probe-evidence-mismatch",
65
+ stage: "environment",
66
+ message: "A healthy runtime probe must include completed render and readback evidence",
67
+ recoverable: false,
68
+ repair: "Discard this report and run renderer.probe() again.",
69
+ }));
70
+ return undefined;
71
+ }
72
+ try {
73
+ return structuredClone(input);
74
+ }
75
+ catch {
76
+ diagnostics.push(invalidProbe("Runtime probe report is not cloneable data"));
77
+ return undefined;
78
+ }
79
+ }
80
+ function invalidProbe(message) {
81
+ return createSkenoraDiagnostic({
82
+ code: "doctor-probe-invalid",
83
+ stage: "environment",
84
+ message,
85
+ recoverable: true,
86
+ repair: "Supply the unmodified JSON returned by RuntimeSession.probe().",
87
+ });
88
+ }
89
+ function detectRuntime() {
90
+ if (typeof window !== "undefined" && typeof navigator !== "undefined")
91
+ return "browser";
92
+ if (typeof process !== "undefined" && process.versions.node)
93
+ return "node";
94
+ return "unknown";
95
+ }
96
+ function isRecord(value) {
97
+ return value !== null && typeof value === "object" && !Array.isArray(value);
98
+ }
99
+ function isDiagnostic(value) {
100
+ return (isRecord(value) &&
101
+ value.version === 1 &&
102
+ typeof value.code === "string" &&
103
+ (value.severity === "error" ||
104
+ value.severity === "warning" ||
105
+ value.severity === "info") &&
106
+ typeof value.stage === "string" &&
107
+ typeof value.message === "string");
108
+ }
109
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../src/doctor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import { type SkenoraExampleManifest, type SkenoraExampleMode, type SkenoraExampleTier } from "@skenora/contracts";
2
+ export interface InstalledSkenoraExampleSource {
3
+ readonly path: string;
4
+ readonly mediaType: string;
5
+ readonly sha256: string;
6
+ readonly bytes: number;
7
+ }
8
+ export interface InstalledSkenoraExample {
9
+ readonly manifest: SkenoraExampleManifest;
10
+ readonly sources: readonly InstalledSkenoraExampleSource[];
11
+ }
12
+ export interface InstalledSkenoraExampleContent extends InstalledSkenoraExampleSource {
13
+ readonly encoding: "utf8" | "base64";
14
+ readonly content: string;
15
+ }
16
+ export interface SkenoraInstalledExampleSearchOptions {
17
+ readonly mode?: SkenoraExampleMode;
18
+ readonly tier?: SkenoraExampleTier;
19
+ readonly tag?: string;
20
+ readonly limit?: number;
21
+ }
22
+ export declare function listInstalledSkenoraExamples(options?: SkenoraInstalledExampleSearchOptions): Promise<readonly InstalledSkenoraExample[]>;
23
+ export declare function searchInstalledSkenoraExamples(query: string, options?: SkenoraInstalledExampleSearchOptions): Promise<readonly InstalledSkenoraExample[]>;
24
+ export declare function getInstalledSkenoraExample(id: string): Promise<InstalledSkenoraExample>;
25
+ export declare function getInstalledSkenoraExampleSource(id: string, path: string): Promise<InstalledSkenoraExampleContent>;
26
+ //# sourceMappingURL=examples.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"examples.d.ts","sourceRoot":"","sources":["../src/examples.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,KAAK,sBAAsB,EAC3B,KAAK,kBAAkB,EACvB,KAAK,kBAAkB,EACxB,MAAM,oBAAoB,CAAC;AAG5B,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,QAAQ,EAAE,sBAAsB,CAAC;IAC1C,QAAQ,CAAC,OAAO,EAAE,SAAS,6BAA6B,EAAE,CAAC;CAC5D;AAED,MAAM,WAAW,8BAA+B,SAAQ,6BAA6B;IACnF,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,QAAQ,CAAC;IACrC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,oCAAoC;IACnD,QAAQ,CAAC,IAAI,CAAC,EAAE,kBAAkB,CAAC;IACnC,QAAQ,CAAC,IAAI,CAAC,EAAE,kBAAkB,CAAC;IACnC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAwBD,wBAAsB,4BAA4B,CAChD,OAAO,GAAE,oCAAyC,GACjD,OAAO,CAAC,SAAS,uBAAuB,EAAE,CAAC,CAS7C;AAED,wBAAsB,8BAA8B,CAClD,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,oCAAyC,GACjD,OAAO,CAAC,SAAS,uBAAuB,EAAE,CAAC,CAuC7C;AAED,wBAAsB,0BAA0B,CAC9C,EAAE,EAAE,MAAM,GACT,OAAO,CAAC,uBAAuB,CAAC,CAGlC;AAED,wBAAsB,gCAAgC,CACpD,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,8BAA8B,CAAC,CAezC"}
@@ -0,0 +1,207 @@
1
+ import { createHash } from "node:crypto";
2
+ import { Buffer } from "node:buffer";
3
+ import { parseSkenoraExampleManifest, } from "@skenora/contracts";
4
+ import { getToolingResource, loadToolingManifest } from "./resources.js";
5
+ let bundlePromise;
6
+ export async function listInstalledSkenoraExamples(options = {}) {
7
+ const bundle = await loadExampleBundle();
8
+ const limit = normalizeLimit(options.limit);
9
+ return detach(bundle.examples
10
+ .filter(({ manifest }) => matchesOptions(manifest, options))
11
+ .slice(0, limit)
12
+ .map(toInstalledExample));
13
+ }
14
+ export async function searchInstalledSkenoraExamples(query, options = {}) {
15
+ const bundle = await loadExampleBundle();
16
+ const normalized = query.trim().toLocaleLowerCase();
17
+ const limit = normalizeLimit(options.limit);
18
+ const ranked = bundle.examples
19
+ .filter(({ manifest }) => matchesOptions(manifest, options))
20
+ .map((example) => {
21
+ const { manifest } = example;
22
+ const sourceText = example.sources
23
+ .filter((source) => isTextMediaType(source.mediaType))
24
+ .map((source) => Buffer.from(source.contentBase64, "base64")
25
+ .toString("utf8")
26
+ .toLocaleLowerCase())
27
+ .join("\n");
28
+ const score = (manifest.id === normalized
29
+ ? 32
30
+ : manifest.id.includes(normalized)
31
+ ? 16
32
+ : 0) +
33
+ (manifest.title.toLocaleLowerCase().includes(normalized) ? 8 : 0) +
34
+ (manifest.tags.some((tag) => tag.includes(normalized)) ? 4 : 0) +
35
+ (manifest.description.toLocaleLowerCase().includes(normalized)
36
+ ? 2
37
+ : 0) +
38
+ (sourceText.includes(normalized) ? 1 : 0);
39
+ return { example, score };
40
+ })
41
+ .filter(({ score }) => !normalized || score > 0)
42
+ .sort((left, right) => right.score - left.score ||
43
+ left.example.manifest.id.localeCompare(right.example.manifest.id))
44
+ .slice(0, limit)
45
+ .map(({ example }) => toInstalledExample(example));
46
+ return detach(ranked);
47
+ }
48
+ export async function getInstalledSkenoraExample(id) {
49
+ const example = await findExample(id);
50
+ return detach(toInstalledExample(example));
51
+ }
52
+ export async function getInstalledSkenoraExampleSource(id, path) {
53
+ if (!isSafeRelativePath(path))
54
+ throw new Error("Unsafe example source path");
55
+ const example = await findExample(id);
56
+ const source = example.sources.find((candidate) => candidate.path === path);
57
+ if (!source)
58
+ throw new Error(`Unknown source for ${id}: ${path}`);
59
+ const bytes = Buffer.from(source.contentBase64, "base64");
60
+ const textual = isTextMediaType(source.mediaType);
61
+ return detach({
62
+ path: source.path,
63
+ mediaType: source.mediaType,
64
+ sha256: source.sha256,
65
+ bytes: bytes.byteLength,
66
+ encoding: textual ? "utf8" : "base64",
67
+ content: textual ? bytes.toString("utf8") : source.contentBase64,
68
+ });
69
+ }
70
+ async function findExample(id) {
71
+ const bundle = await loadExampleBundle();
72
+ const example = bundle.examples.find((candidate) => candidate.manifest.id === id);
73
+ if (!example)
74
+ throw new Error(`Unknown Skenora example: ${id}`);
75
+ return example;
76
+ }
77
+ async function loadExampleBundle() {
78
+ bundlePromise ??= Promise.all([
79
+ getToolingResource("examples.gallery"),
80
+ loadToolingManifest(),
81
+ ]).then(([resource, toolingManifest]) => {
82
+ const input = JSON.parse(resource.text);
83
+ if (!isRecord(input) || input.schema !== "skenora.example-gallery-bundle")
84
+ throw new Error("Invalid installed Skenora example gallery schema");
85
+ if (input.version !== 1 ||
86
+ input.packageVersion !== toolingManifest.packageVersion ||
87
+ !Array.isArray(input.examples) ||
88
+ !isSha256(input.aggregateSha256))
89
+ throw new Error("Unsupported installed Skenora example gallery");
90
+ const ids = new Set();
91
+ const examples = input.examples.map((value, index) => {
92
+ if (!isRecord(value) || !Array.isArray(value.sources))
93
+ throw new Error(`Invalid installed example at index ${index}`);
94
+ const manifest = parseSkenoraExampleManifest(value.manifest);
95
+ if (ids.has(manifest.id))
96
+ throw new Error(`Duplicate installed example: ${manifest.id}`);
97
+ ids.add(manifest.id);
98
+ const manifestAggregate = sha256(JSON.stringify({ ...manifest, aggregateSha256: "" }));
99
+ if (manifestAggregate !== manifest.aggregateSha256)
100
+ throw new Error(`Example manifest integrity failed: ${manifest.id}`);
101
+ const sources = value.sources.map((source, sourceIndex) => validateSource(manifest, source, sourceIndex));
102
+ if (sources.length !== manifest.files.length)
103
+ throw new Error(`Example file count mismatch: ${manifest.id}`);
104
+ return deepFreeze({ manifest, sources });
105
+ });
106
+ const withoutAggregate = {
107
+ schema: input.schema,
108
+ version: input.version,
109
+ packageVersion: input.packageVersion,
110
+ examples: input.examples,
111
+ aggregateSha256: "",
112
+ };
113
+ if (sha256(JSON.stringify(withoutAggregate)) !== input.aggregateSha256)
114
+ throw new Error("Installed Skenora example gallery integrity failed");
115
+ return deepFreeze({
116
+ schema: "skenora.example-gallery-bundle",
117
+ version: 1,
118
+ packageVersion: input.packageVersion,
119
+ examples,
120
+ aggregateSha256: input.aggregateSha256,
121
+ });
122
+ });
123
+ return bundlePromise;
124
+ }
125
+ function validateSource(manifest, input, index) {
126
+ if (!isRecord(input))
127
+ throw new Error(`Invalid example source at index ${index}`);
128
+ const path = requireString(input.path, "source path");
129
+ const mediaType = requireString(input.mediaType, "source media type");
130
+ const hash = requireString(input.sha256, "source sha256");
131
+ const contentBase64 = requireString(input.contentBase64, "source content");
132
+ if (!isSafeRelativePath(path) || !isSha256(hash))
133
+ throw new Error(`Invalid example source metadata: ${manifest.id}/${path}`);
134
+ const bytes = Buffer.from(contentBase64, "base64");
135
+ if (sha256(bytes) !== hash)
136
+ throw new Error(`Example source integrity failed: ${manifest.id}/${path}`);
137
+ const file = manifest.files.find((candidate) => candidate.path === path);
138
+ if (!file ||
139
+ file.sha256 !== hash ||
140
+ file.mediaType !== mediaType ||
141
+ file.bytes !== bytes.byteLength)
142
+ throw new Error(`Example manifest/source mismatch: ${manifest.id}/${path}`);
143
+ return deepFreeze({ path, mediaType, sha256: hash, contentBase64 });
144
+ }
145
+ function toInstalledExample(value) {
146
+ return {
147
+ manifest: value.manifest,
148
+ sources: value.sources.map((source) => ({
149
+ path: source.path,
150
+ mediaType: source.mediaType,
151
+ sha256: source.sha256,
152
+ bytes: Buffer.from(source.contentBase64, "base64").byteLength,
153
+ })),
154
+ };
155
+ }
156
+ function matchesOptions(manifest, options) {
157
+ return ((options.mode === undefined || manifest.mode === options.mode) &&
158
+ (options.tier === undefined || manifest.tier === options.tier) &&
159
+ (options.tag === undefined || manifest.tags.includes(options.tag)));
160
+ }
161
+ function normalizeLimit(value) {
162
+ if (value === undefined)
163
+ return 100;
164
+ if (!Number.isInteger(value) || value < 1 || value > 100)
165
+ throw new Error("Example limit must be an integer in 1..100");
166
+ return value;
167
+ }
168
+ function isTextMediaType(value) {
169
+ return (value.startsWith("text/") ||
170
+ value === "application/json" ||
171
+ value === "application/schema+json");
172
+ }
173
+ function isSafeRelativePath(value) {
174
+ return (value.length > 0 &&
175
+ !value.startsWith("/") &&
176
+ !value.includes("\\") &&
177
+ !value.split("/").includes("..") &&
178
+ !value.split("/").includes(""));
179
+ }
180
+ function requireString(value, label) {
181
+ if (typeof value !== "string" || !value)
182
+ throw new Error(`Invalid ${label}`);
183
+ return value;
184
+ }
185
+ function isSha256(value) {
186
+ return typeof value === "string" && /^[a-f0-9]{64}$/u.test(value);
187
+ }
188
+ function sha256(value) {
189
+ const hash = createHash("sha256");
190
+ hash.update(value);
191
+ return hash.digest("hex");
192
+ }
193
+ function isRecord(value) {
194
+ return value !== null && typeof value === "object" && !Array.isArray(value);
195
+ }
196
+ function detach(value) {
197
+ return deepFreeze(structuredClone(value));
198
+ }
199
+ function deepFreeze(value) {
200
+ if (value && typeof value === "object" && !Object.isFrozen(value)) {
201
+ Object.freeze(value);
202
+ for (const child of Object.values(value))
203
+ deepFreeze(child);
204
+ }
205
+ return value;
206
+ }
207
+ //# sourceMappingURL=examples.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"examples.js","sourceRoot":"","sources":["../src/examples.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export * from "./resources.js";
2
+ export * from "./examples.js";
3
+ export * from "./doctor.js";
4
+ export * from "./mcp.js";
5
+ export * from "./mcp-http.js";
6
+ export { checkSceneInput } from "@skenora/scene-plan";
7
+ export type { SceneCheckInputKind, SceneCheckOptions, SceneCheckReport, SceneCheckRequirement, SceneCheckSummary, } from "@skenora/scene-plan";
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,OAAO,CAAC;AACtB,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,YAAY,EACV,mBAAmB,EACnB,iBAAiB,EACjB,gBAAgB,EAChB,qBAAqB,EACrB,iBAAiB,GAClB,MAAM,qBAAqB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,7 @@
1
+ export * from "./resources.js";
2
+ export * from "./examples.js";
3
+ export * from "./doctor.js";
4
+ export * from "./mcp.js";
5
+ export * from "./mcp-http.js";
6
+ export { checkSceneInput } from "@skenora/scene-plan";
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,OAAO,CAAC;AACtB,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { type SkenoraMcpPrincipal, type SkenoraMcpServer } from "./mcp.js";
2
+ export interface SkenoraMcpHttpOptions {
3
+ readonly path?: string;
4
+ readonly allowedHosts?: readonly string[];
5
+ readonly allowedOrigins?: readonly string[];
6
+ readonly maxBodyBytes?: number;
7
+ readonly authenticate?: (request: Request) => SkenoraMcpPrincipal | null | Promise<SkenoraMcpPrincipal | null>;
8
+ readonly authorizationMetadataUrl?: string;
9
+ }
10
+ export type SkenoraMcpHttpHandler = (request: Request) => Promise<Response>;
11
+ /**
12
+ * Creates a fetch-compatible MCP 2026-07-28 HTTP handler. It does not open a
13
+ * socket, own an Editor, or implement an authorization server.
14
+ */
15
+ export declare function createSkenoraMcpHttpHandler(server: SkenoraMcpServer, options?: SkenoraMcpHttpOptions): SkenoraMcpHttpHandler;
16
+ //# sourceMappingURL=mcp-http.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-http.d.ts","sourceRoot":"","sources":["../src/mcp-http.ts"],"names":[],"mappings":"AAAA,OAAO,EAML,KAAK,mBAAmB,EACxB,KAAK,gBAAgB,EACtB,MAAM,OAAO,CAAC;AAEf,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1C,QAAQ,CAAC,cAAc,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5C,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,YAAY,CAAC,EAAE,CACtB,OAAO,EAAE,OAAO,KACb,mBAAmB,GAAG,IAAI,GAAG,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC,CAAC;IACtE,QAAQ,CAAC,wBAAwB,CAAC,EAAE,MAAM,CAAC;CAC5C;AAED,MAAM,MAAM,qBAAqB,GAAG,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;AAI5E;;;GAGG;AACH,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,gBAAgB,EACxB,OAAO,GAAE,qBAA0B,GAClC,qBAAqB,CA0IvB"}