@ashdev/codex-plugin-metadata-echo 1.35.0 → 1.36.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/dist/index.js +198 -15
- package/dist/index.js.map +3 -3
- package/package.json +2 -2
package/dist/index.js
CHANGED
|
@@ -643,7 +643,7 @@ function createMetadataPlugin(options) {
|
|
|
643
643
|
// package.json
|
|
644
644
|
var package_default = {
|
|
645
645
|
name: "@ashdev/codex-plugin-metadata-echo",
|
|
646
|
-
version: "1.
|
|
646
|
+
version: "1.36.1",
|
|
647
647
|
description: "Echo metadata plugin for testing Codex plugin protocol",
|
|
648
648
|
main: "dist/index.js",
|
|
649
649
|
bin: "dist/index.js",
|
|
@@ -681,7 +681,7 @@ var package_default = {
|
|
|
681
681
|
node: ">=22.0.0"
|
|
682
682
|
},
|
|
683
683
|
dependencies: {
|
|
684
|
-
"@ashdev/codex-plugin-sdk": "^1.
|
|
684
|
+
"@ashdev/codex-plugin-sdk": "^1.36.1"
|
|
685
685
|
},
|
|
686
686
|
devDependencies: {
|
|
687
687
|
"@biomejs/biome": "^2.4.4",
|
|
@@ -694,6 +694,7 @@ var package_default = {
|
|
|
694
694
|
|
|
695
695
|
// src/manifest.ts
|
|
696
696
|
var DEFAULT_MAX_RESULTS = 5;
|
|
697
|
+
var DEFAULT_MAX_PAYLOAD_FILES = 500;
|
|
697
698
|
var manifest = {
|
|
698
699
|
name: "metadata-echo",
|
|
699
700
|
displayName: "Echo Metadata Plugin",
|
|
@@ -717,16 +718,183 @@ var manifest = {
|
|
|
717
718
|
required: false,
|
|
718
719
|
default: DEFAULT_MAX_RESULTS,
|
|
719
720
|
example: 10
|
|
721
|
+
},
|
|
722
|
+
{
|
|
723
|
+
key: "recordPayloads",
|
|
724
|
+
label: "Record Payloads",
|
|
725
|
+
description: "Write each request and its response to JSON files under the plugin's data directory for debugging.",
|
|
726
|
+
type: "boolean",
|
|
727
|
+
required: false,
|
|
728
|
+
default: true
|
|
729
|
+
},
|
|
730
|
+
{
|
|
731
|
+
key: "maxPayloadFiles",
|
|
732
|
+
label: "Max Payload Files",
|
|
733
|
+
description: "Maximum number of recorded payload files to keep; oldest are pruned. Only used when payload recording is enabled.",
|
|
734
|
+
type: "number",
|
|
735
|
+
required: false,
|
|
736
|
+
default: DEFAULT_MAX_PAYLOAD_FILES,
|
|
737
|
+
example: 500
|
|
720
738
|
}
|
|
721
739
|
]
|
|
722
740
|
}
|
|
723
741
|
};
|
|
724
742
|
|
|
743
|
+
// src/recorder.ts
|
|
744
|
+
import { mkdir, readdir, rm, writeFile } from "node:fs/promises";
|
|
745
|
+
import { tmpdir } from "node:os";
|
|
746
|
+
import { join } from "node:path";
|
|
747
|
+
var SECRET_KEY_RE = /token|secret|password|api[-_]?key|credential/i;
|
|
748
|
+
var REDACTED = "[REDACTED]";
|
|
749
|
+
var DEFAULT_MAX_FILES = 500;
|
|
750
|
+
function pad(value, width) {
|
|
751
|
+
return String(value).padStart(width, "0");
|
|
752
|
+
}
|
|
753
|
+
function utcStamp(date) {
|
|
754
|
+
const y = date.getUTCFullYear();
|
|
755
|
+
const mo = pad(date.getUTCMonth() + 1, 2);
|
|
756
|
+
const d = pad(date.getUTCDate(), 2);
|
|
757
|
+
const h = pad(date.getUTCHours(), 2);
|
|
758
|
+
const mi = pad(date.getUTCMinutes(), 2);
|
|
759
|
+
const s = pad(date.getUTCSeconds(), 2);
|
|
760
|
+
return `${y}-${mo}-${d}-${h}-${mi}-${s}`;
|
|
761
|
+
}
|
|
762
|
+
function sanitizeMethod(method) {
|
|
763
|
+
return method.replace(/[^a-z0-9]+/gi, "_").replace(/^_+|_+$/g, "");
|
|
764
|
+
}
|
|
765
|
+
function redactObject(value) {
|
|
766
|
+
if (Array.isArray(value)) {
|
|
767
|
+
return value.map(redactObject);
|
|
768
|
+
}
|
|
769
|
+
if (value && typeof value === "object") {
|
|
770
|
+
const out = {};
|
|
771
|
+
for (const [key, val] of Object.entries(value)) {
|
|
772
|
+
out[key] = SECRET_KEY_RE.test(key) ? REDACTED : redactObject(val);
|
|
773
|
+
}
|
|
774
|
+
return out;
|
|
775
|
+
}
|
|
776
|
+
return value;
|
|
777
|
+
}
|
|
778
|
+
function redactConfig(input) {
|
|
779
|
+
return {
|
|
780
|
+
adminConfig: redactObject(input.adminConfig ?? {}),
|
|
781
|
+
userConfig: redactObject(input.userConfig ?? {})
|
|
782
|
+
};
|
|
783
|
+
}
|
|
784
|
+
var PayloadRecorder = class {
|
|
785
|
+
pluginName;
|
|
786
|
+
enabled;
|
|
787
|
+
maxFiles;
|
|
788
|
+
configSnapshot;
|
|
789
|
+
logger;
|
|
790
|
+
now;
|
|
791
|
+
dir;
|
|
792
|
+
usingFallback;
|
|
793
|
+
seq = 0;
|
|
794
|
+
ready = null;
|
|
795
|
+
constructor(opts) {
|
|
796
|
+
this.pluginName = opts.pluginName;
|
|
797
|
+
this.enabled = opts.enabled ?? true;
|
|
798
|
+
this.maxFiles = opts.maxFiles ?? DEFAULT_MAX_FILES;
|
|
799
|
+
this.configSnapshot = opts.configSnapshot;
|
|
800
|
+
this.logger = opts.logger;
|
|
801
|
+
this.now = opts.now ?? (() => /* @__PURE__ */ new Date());
|
|
802
|
+
if (opts.dataDir) {
|
|
803
|
+
this.dir = join(opts.dataDir, "payloads");
|
|
804
|
+
this.usingFallback = false;
|
|
805
|
+
} else {
|
|
806
|
+
this.dir = join(tmpdir(), `codex-${opts.pluginName}`, "payloads");
|
|
807
|
+
this.usingFallback = true;
|
|
808
|
+
}
|
|
809
|
+
}
|
|
810
|
+
/** Absolute directory payloads are written to (for logging/tests). */
|
|
811
|
+
get directory() {
|
|
812
|
+
return this.dir;
|
|
813
|
+
}
|
|
814
|
+
/** Lazily create the payloads directory once; returns false if unusable. */
|
|
815
|
+
ensureDir() {
|
|
816
|
+
if (!this.ready) {
|
|
817
|
+
this.ready = mkdir(this.dir, { recursive: true }).then(() => {
|
|
818
|
+
if (this.usingFallback) {
|
|
819
|
+
this.logger.warn(`No dataDir provided; recording payloads under temp dir ${this.dir}`);
|
|
820
|
+
} else {
|
|
821
|
+
this.logger.debug(`Recording payloads to ${this.dir}`);
|
|
822
|
+
}
|
|
823
|
+
return true;
|
|
824
|
+
}).catch((err) => {
|
|
825
|
+
const msg = err instanceof Error ? err.message : "unknown error";
|
|
826
|
+
this.logger.warn(`Failed to create payload dir ${this.dir}: ${msg}`);
|
|
827
|
+
return false;
|
|
828
|
+
});
|
|
829
|
+
}
|
|
830
|
+
return this.ready;
|
|
831
|
+
}
|
|
832
|
+
/**
|
|
833
|
+
* Record a request and its response under one shared, sortable basename.
|
|
834
|
+
* Best-effort: never throws.
|
|
835
|
+
*/
|
|
836
|
+
async record(method, request, response) {
|
|
837
|
+
if (!this.enabled) return;
|
|
838
|
+
if (!await this.ensureDir()) return;
|
|
839
|
+
const id = ++this.seq;
|
|
840
|
+
const date = this.now();
|
|
841
|
+
const base = `${utcStamp(date)}-${pad(id, 4)}-${sanitizeMethod(method)}`;
|
|
842
|
+
const iso = date.toISOString();
|
|
843
|
+
await this.writeFile(`${base}-request.json`, {
|
|
844
|
+
timestamp: iso,
|
|
845
|
+
plugin: this.pluginName,
|
|
846
|
+
method,
|
|
847
|
+
direction: "request",
|
|
848
|
+
id,
|
|
849
|
+
config: this.configSnapshot,
|
|
850
|
+
payload: request
|
|
851
|
+
});
|
|
852
|
+
await this.writeFile(`${base}-response.json`, {
|
|
853
|
+
timestamp: iso,
|
|
854
|
+
plugin: this.pluginName,
|
|
855
|
+
method,
|
|
856
|
+
direction: "response",
|
|
857
|
+
id,
|
|
858
|
+
config: this.configSnapshot,
|
|
859
|
+
payload: response
|
|
860
|
+
});
|
|
861
|
+
await this.prune();
|
|
862
|
+
}
|
|
863
|
+
async writeFile(name, envelope) {
|
|
864
|
+
try {
|
|
865
|
+
await writeFile(join(this.dir, name), JSON.stringify(envelope, null, 2), "utf8");
|
|
866
|
+
} catch (err) {
|
|
867
|
+
const msg = err instanceof Error ? err.message : "unknown error";
|
|
868
|
+
this.logger.warn(`Failed to write payload file ${name}: ${msg}`);
|
|
869
|
+
}
|
|
870
|
+
}
|
|
871
|
+
/** Keep at most `maxFiles` files, deleting the oldest (lexical == chrono). */
|
|
872
|
+
async prune() {
|
|
873
|
+
if (this.maxFiles <= 0) return;
|
|
874
|
+
try {
|
|
875
|
+
const files = (await readdir(this.dir)).filter((f) => f.endsWith(".json")).sort();
|
|
876
|
+
const excess = files.length - this.maxFiles;
|
|
877
|
+
if (excess <= 0) return;
|
|
878
|
+
for (const file of files.slice(0, excess)) {
|
|
879
|
+
await rm(join(this.dir, file), { force: true });
|
|
880
|
+
}
|
|
881
|
+
} catch (err) {
|
|
882
|
+
const msg = err instanceof Error ? err.message : "unknown error";
|
|
883
|
+
this.logger.warn(`Failed to prune payload dir ${this.dir}: ${msg}`);
|
|
884
|
+
}
|
|
885
|
+
}
|
|
886
|
+
};
|
|
887
|
+
|
|
725
888
|
// src/index.ts
|
|
726
889
|
var logger = createLogger({ name: "echo", level: "debug" });
|
|
727
890
|
var config = {
|
|
728
891
|
maxResults: DEFAULT_MAX_RESULTS
|
|
729
892
|
};
|
|
893
|
+
var recorder = null;
|
|
894
|
+
async function rec(method, params, response) {
|
|
895
|
+
await recorder?.record(method, params, response);
|
|
896
|
+
return response;
|
|
897
|
+
}
|
|
730
898
|
function encodeExternalId(baseId, query) {
|
|
731
899
|
return `${baseId}::${encodeURIComponent(query)}`;
|
|
732
900
|
}
|
|
@@ -763,14 +931,14 @@ function generateEchoResults(query, maxResults) {
|
|
|
763
931
|
}
|
|
764
932
|
var provider = {
|
|
765
933
|
async search(params) {
|
|
766
|
-
return {
|
|
934
|
+
return rec("metadata/series/search", params, {
|
|
767
935
|
results: generateEchoResults(params.query, config.maxResults)
|
|
768
|
-
};
|
|
936
|
+
});
|
|
769
937
|
},
|
|
770
938
|
async get(params) {
|
|
771
939
|
const { baseId, query } = decodeExternalId(params.externalId);
|
|
772
940
|
const title = query ?? `Echo Series: ${baseId}`;
|
|
773
|
-
return {
|
|
941
|
+
return rec("metadata/series/get", params, {
|
|
774
942
|
externalId: params.externalId,
|
|
775
943
|
externalUrl: `https://echo.example.com/series/${baseId}`,
|
|
776
944
|
title,
|
|
@@ -847,11 +1015,11 @@ var provider = {
|
|
|
847
1015
|
linkType: "purchase"
|
|
848
1016
|
}
|
|
849
1017
|
]
|
|
850
|
-
};
|
|
1018
|
+
});
|
|
851
1019
|
},
|
|
852
1020
|
async match(params) {
|
|
853
1021
|
const normalizedTitle = params.title.toLowerCase().replace(/\s+/g, "-");
|
|
854
|
-
return {
|
|
1022
|
+
return rec("metadata/series/match", params, {
|
|
855
1023
|
match: {
|
|
856
1024
|
externalId: `match-${normalizedTitle}`,
|
|
857
1025
|
title: params.title,
|
|
@@ -873,7 +1041,7 @@ var provider = {
|
|
|
873
1041
|
relevanceScore: 0.6
|
|
874
1042
|
}
|
|
875
1043
|
]
|
|
876
|
-
};
|
|
1044
|
+
});
|
|
877
1045
|
}
|
|
878
1046
|
};
|
|
879
1047
|
function generateBookEchoResults(params, maxResults) {
|
|
@@ -900,14 +1068,14 @@ function generateBookEchoResults(params, maxResults) {
|
|
|
900
1068
|
}
|
|
901
1069
|
var bookProvider = {
|
|
902
1070
|
async search(params) {
|
|
903
|
-
return {
|
|
1071
|
+
return rec("metadata/book/search", params, {
|
|
904
1072
|
results: generateBookEchoResults(params, config.maxResults)
|
|
905
|
-
};
|
|
1073
|
+
});
|
|
906
1074
|
},
|
|
907
1075
|
async get(params) {
|
|
908
1076
|
const { baseId, query } = decodeExternalId(params.externalId);
|
|
909
1077
|
const title = query ?? `Echo Book: ${baseId}`;
|
|
910
|
-
return {
|
|
1078
|
+
return rec("metadata/book/get", params, {
|
|
911
1079
|
externalId: params.externalId,
|
|
912
1080
|
externalUrl: `https://echo.example.com/book/${baseId}`,
|
|
913
1081
|
title,
|
|
@@ -987,13 +1155,13 @@ var bookProvider = {
|
|
|
987
1155
|
linkType: "purchase"
|
|
988
1156
|
}
|
|
989
1157
|
]
|
|
990
|
-
};
|
|
1158
|
+
});
|
|
991
1159
|
},
|
|
992
1160
|
async match(params) {
|
|
993
1161
|
const identifier = params.isbn || params.title;
|
|
994
1162
|
const normalizedId = identifier.toLowerCase().replace(/[\s-]/g, "");
|
|
995
1163
|
const isIsbnMatch = !!params.isbn;
|
|
996
|
-
return {
|
|
1164
|
+
return rec("metadata/book/match", params, {
|
|
997
1165
|
match: {
|
|
998
1166
|
externalId: `match-book-${normalizedId}`,
|
|
999
1167
|
title: params.title,
|
|
@@ -1015,7 +1183,7 @@ var bookProvider = {
|
|
|
1015
1183
|
relevanceScore: 0.5
|
|
1016
1184
|
}
|
|
1017
1185
|
]
|
|
1018
|
-
};
|
|
1186
|
+
});
|
|
1019
1187
|
}
|
|
1020
1188
|
};
|
|
1021
1189
|
createMetadataPlugin({
|
|
@@ -1030,7 +1198,22 @@ createMetadataPlugin({
|
|
|
1030
1198
|
if (maxResults !== void 0) {
|
|
1031
1199
|
config.maxResults = Math.min(Math.max(1, maxResults), 20);
|
|
1032
1200
|
}
|
|
1033
|
-
|
|
1201
|
+
const recordPayloads = params.adminConfig?.recordPayloads !== false;
|
|
1202
|
+
const maxPayloadFiles = typeof params.adminConfig?.maxPayloadFiles === "number" ? params.adminConfig.maxPayloadFiles : DEFAULT_MAX_PAYLOAD_FILES;
|
|
1203
|
+
recorder = new PayloadRecorder({
|
|
1204
|
+
pluginName: manifest.name,
|
|
1205
|
+
dataDir: params.dataDir,
|
|
1206
|
+
enabled: recordPayloads,
|
|
1207
|
+
maxFiles: maxPayloadFiles,
|
|
1208
|
+
configSnapshot: redactConfig({
|
|
1209
|
+
adminConfig: params.adminConfig,
|
|
1210
|
+
userConfig: params.userConfig
|
|
1211
|
+
}),
|
|
1212
|
+
logger
|
|
1213
|
+
});
|
|
1214
|
+
logger.info(
|
|
1215
|
+
`Echo plugin initialized (maxResults: ${config.maxResults}, recordPayloads: ${recordPayloads})`
|
|
1216
|
+
);
|
|
1034
1217
|
}
|
|
1035
1218
|
});
|
|
1036
1219
|
logger.info("Echo plugin started");
|
package/dist/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../node_modules/@ashdev/codex-plugin-sdk/src/types/rpc.ts", "../node_modules/@ashdev/codex-plugin-sdk/src/errors.ts", "../node_modules/@ashdev/codex-plugin-sdk/src/request-context.ts", "../node_modules/@ashdev/codex-plugin-sdk/src/host-rpc.ts", "../node_modules/@ashdev/codex-plugin-sdk/src/logger.ts", "../node_modules/@ashdev/codex-plugin-sdk/src/server.ts", "../node_modules/@ashdev/codex-plugin-sdk/src/storage.ts", "../package.json", "../src/manifest.ts", "../src/index.ts"],
|
|
4
|
-
"sourcesContent": [null, null, null, null, null, null, null, "{\n \"name\": \"@ashdev/codex-plugin-metadata-echo\",\n \"version\": \"1.35.0\",\n \"description\": \"Echo metadata plugin for testing Codex plugin protocol\",\n \"main\": \"dist/index.js\",\n \"bin\": \"dist/index.js\",\n \"type\": \"module\",\n \"files\": [\n \"dist\",\n \"README.md\"\n ],\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/AshDevFr/codex.git\",\n \"directory\": \"plugins/metadata-echo\"\n },\n \"scripts\": {\n \"build\": \"esbuild src/index.ts --bundle --platform=node --target=node22 --format=esm --outfile=dist/index.js --sourcemap --banner:js='#!/usr/bin/env node'\",\n \"dev\": \"npm run build -- --watch\",\n \"clean\": \"rm -rf dist\",\n \"start\": \"node dist/index.js\",\n \"lint\": \"biome check .\",\n \"lint:fix\": \"biome check --write .\",\n \"typecheck\": \"tsc --noEmit\",\n \"test\": \"vitest run --passWithNoTests\",\n \"test:watch\": \"vitest\",\n \"prepublishOnly\": \"npm run lint && npm run build\"\n },\n \"keywords\": [\n \"codex\",\n \"plugin\",\n \"echo\",\n \"testing\"\n ],\n \"author\": \"Codex\",\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=22.0.0\"\n },\n \"dependencies\": {\n \"@ashdev/codex-plugin-sdk\": \"^1.35.0\"\n },\n \"devDependencies\": {\n \"@biomejs/biome\": \"^2.4.4\",\n \"@types/node\": \"^22.0.0\",\n \"esbuild\": \"^0.27.3\",\n \"typescript\": \"^5.9.3\",\n \"vitest\": \"^4.0.18\"\n }\n}\n", "import type { MetadataContentType, PluginManifest } from \"@ashdev/codex-plugin-sdk\";\nimport packageJson from \"../package.json\" with { type: \"json\" };\n\n// Default config values\nexport const DEFAULT_MAX_RESULTS = 5;\n\nexport const manifest = {\n name: \"metadata-echo\",\n displayName: \"Echo Metadata Plugin\",\n version: packageJson.version,\n description:\n \"Test metadata plugin that echoes back search queries (supports both series and book metadata)\",\n author: \"Codex\",\n homepage: \"https://github.com/AshDevFr/codex\",\n protocolVersion: \"1.0\",\n capabilities: {\n // Demonstrates multi-content-type plugin support\n metadataProvider: [\"series\", \"book\"] as MetadataContentType[],\n },\n configSchema: {\n description: \"Configuration options for the Echo test plugin\",\n fields: [\n {\n key: \"maxResults\",\n label: \"Maximum Results\",\n description: \"Maximum number of results to return for search queries (1-20)\",\n type: \"number\" as const,\n required: false,\n default: DEFAULT_MAX_RESULTS,\n example: 10,\n },\n ],\n },\n} as const satisfies PluginManifest & {\n capabilities: { metadataProvider: MetadataContentType[] };\n};\n", "/**\n * Echo Plugin - A minimal plugin for testing the Codex plugin protocol\n *\n * This plugin demonstrates the plugin SDK usage and serves as a protocol\n * validation tool. It echoes back search parameters and provides predictable\n * responses for testing.\n *\n * Supports both series and book metadata to demonstrate multi-content-type plugins.\n */\n\nimport {\n type BookMatchParams,\n type BookMetadataProvider,\n type BookSearchParams,\n createLogger,\n createMetadataPlugin,\n type InitializeParams,\n type MetadataGetParams,\n type MetadataMatchParams,\n type MetadataMatchResponse,\n type MetadataProvider,\n type MetadataSearchParams,\n type MetadataSearchResponse,\n type PluginBookMetadata,\n type PluginSeriesMetadata,\n} from \"@ashdev/codex-plugin-sdk\";\nimport { DEFAULT_MAX_RESULTS, manifest } from \"./manifest.js\";\n\nconst logger = createLogger({ name: \"echo\", level: \"debug\" });\n\n// Plugin configuration (set during initialization)\nconst config = {\n maxResults: DEFAULT_MAX_RESULTS,\n};\n\n// Encode the original query into the externalId so that get() can recover it\n// later. The protocol only passes externalId to get(), so this is how the\n// echo plugin preserves the user-facing title across calls.\nfunction encodeExternalId(baseId: string, query: string): string {\n return `${baseId}::${encodeURIComponent(query)}`;\n}\n\nfunction decodeExternalId(externalId: string): { baseId: string; query: string | null } {\n const sep = externalId.indexOf(\"::\");\n if (sep === -1) {\n return { baseId: externalId, query: null };\n }\n return {\n baseId: externalId.slice(0, sep),\n query: decodeURIComponent(externalId.slice(sep + 2)),\n };\n}\n\n// Generate echo results based on config\nfunction generateEchoResults(query: string, maxResults: number) {\n const results = [];\n const count = Math.min(Math.max(1, maxResults), 20); // Clamp between 1-20\n\n for (let i = 1; i <= count; i++) {\n results.push({\n externalId: encodeExternalId(`echo-${i}`, query),\n title: i === 1 ? `Echo: ${query}` : `Echo Result ${i} for: ${query}`,\n alternateTitles: i === 1 ? [`Echoed Query: ${query}`] : [],\n year: new Date().getFullYear(),\n relevanceScore: Math.max(0.1, 1.0 - (i - 1) * 0.1), // Decreasing relevance\n preview: {\n status: i % 2 === 0 ? \"ongoing\" : \"ended\",\n genres: i === 1 ? [\"Test\", \"Echo\"] : [\"Test\"],\n rating: i === 1 ? 10.0 : undefined,\n description:\n i === 1\n ? `Search query echoed: \"${query}\"`\n : `Result ${i} for testing (maxResults=${count})`,\n },\n });\n }\n\n return results;\n}\n\nconst provider: MetadataProvider = {\n async search(params: MetadataSearchParams): Promise<MetadataSearchResponse> {\n // Echo back the query as search results, respecting maxResults config\n return {\n results: generateEchoResults(params.query, config.maxResults),\n };\n },\n\n async get(params: MetadataGetParams): Promise<PluginSeriesMetadata> {\n // Recover the original search query (if encoded by search()) so we can\n // echo the user-facing title instead of the opaque external ID.\n const { baseId, query } = decodeExternalId(params.externalId);\n const title = query ?? `Echo Series: ${baseId}`;\n\n // Return metadata based on the external ID with all fields populated for testing\n return {\n externalId: params.externalId,\n externalUrl: `https://echo.example.com/series/${baseId}`,\n title,\n alternateTitles: [\n { title, language: \"en\", titleType: \"english\" },\n { title: `${title} (native)`, language: \"ja\", titleType: \"native\" },\n { title: `${title} (romaji)`, language: \"ja-Latn\", titleType: \"romaji\" },\n ],\n summary: `This is the full metadata for \"${title}\" (id: ${baseId}). It includes a detailed description to test summary handling.`,\n status: \"ended\",\n year: 2024,\n\n // Extended metadata fields\n totalVolumeCount: 10,\n language: \"en\",\n ageRating: 13,\n readingDirection: \"ltr\",\n\n // Taxonomy\n genres: [\"Action\", \"Comedy\", \"Test\", \"Echo\"],\n tags: [\"plugin-test\", \"echo\", \"automation\", \"development\"],\n\n // Credits\n authors: [\n { name: \"Echo Author\", role: \"author\" },\n { name: \"Test Writer\", role: \"author\" },\n ],\n artists: [\"Echo Artist\"],\n publisher: \"Echo Publisher\",\n\n // Media\n coverUrl: \"https://picsum.photos/300/450\",\n bannerUrl: \"https://picsum.photos/800/200\",\n\n // Primary rating\n rating: {\n score: 85,\n voteCount: 100,\n source: \"echo\",\n },\n\n // Multiple external ratings for testing aggregation\n externalRatings: [\n {\n score: 85,\n voteCount: 100,\n source: \"echo\",\n },\n {\n score: 92,\n voteCount: 5000,\n source: \"anilist\",\n },\n {\n score: 88,\n voteCount: 2500,\n source: \"mal\",\n },\n ],\n\n // External links\n externalLinks: [\n {\n url: `https://echo.example.com/series/${baseId}`,\n label: \"Echo Provider\",\n linkType: \"provider\",\n },\n {\n url: \"https://official-echo.example.com\",\n label: \"Official Site\",\n linkType: \"official\",\n },\n {\n url: \"https://twitter.com/echo_series\",\n label: \"Twitter\",\n linkType: \"social\",\n },\n {\n url: \"https://store.example.com/echo\",\n label: \"Buy\",\n linkType: \"purchase\",\n },\n ],\n };\n },\n\n async match(params: MetadataMatchParams): Promise<MetadataMatchResponse> {\n // Return a match based on the title\n const normalizedTitle = params.title.toLowerCase().replace(/\\s+/g, \"-\");\n return {\n match: {\n externalId: `match-${normalizedTitle}`,\n title: params.title,\n alternateTitles: [],\n year: params.year,\n relevanceScore: 0.9,\n preview: {\n status: \"ended\",\n genres: [\"Matched\"],\n description: `Matched from title: \"${params.title}\"`,\n },\n },\n confidence: 0.85,\n alternatives: [\n {\n externalId: \"alt-1\",\n title: `Alternative: ${params.title}`,\n alternateTitles: [],\n relevanceScore: 0.6,\n },\n ],\n };\n },\n};\n\n// =============================================================================\n// Book Metadata Provider\n// =============================================================================\n\n// Generate echo results for book search\nfunction generateBookEchoResults(params: BookSearchParams, maxResults: number) {\n const results = [];\n const count = Math.min(Math.max(1, maxResults), 20);\n const searchTerm = params.isbn || params.query || \"unknown\";\n\n for (let i = 1; i <= count; i++) {\n const isIsbnSearch = !!params.isbn;\n results.push({\n externalId: encodeExternalId(`echo-book-${i}`, searchTerm),\n title: i === 1 ? `Echo Book: ${searchTerm}` : `Echo Book Result ${i} for: ${searchTerm}`,\n alternateTitles: i === 1 ? [`Book Query: ${searchTerm}`] : [],\n year: params.year || new Date().getFullYear(),\n relevanceScore: isIsbnSearch ? 1.0 : Math.max(0.1, 1.0 - (i - 1) * 0.1),\n preview: {\n status: i % 2 === 0 ? \"ongoing\" : \"ended\",\n genres: i === 1 ? [\"Test\", \"Echo\", \"Book\"] : [\"Test\", \"Book\"],\n rating: i === 1 ? 9.0 : undefined,\n description:\n i === 1\n ? `Book search ${isIsbnSearch ? \"by ISBN\" : \"by query\"}: \"${searchTerm}\"`\n : `Book result ${i} for testing`,\n },\n });\n }\n\n return results;\n}\n\nconst bookProvider: BookMetadataProvider = {\n async search(params: BookSearchParams): Promise<MetadataSearchResponse> {\n // Echo back the ISBN or query as search results\n return {\n results: generateBookEchoResults(params, config.maxResults),\n };\n },\n\n async get(params: MetadataGetParams): Promise<PluginBookMetadata> {\n // Recover the original search term encoded in the externalId so the title\n // matches what the user saw in search results.\n const { baseId, query } = decodeExternalId(params.externalId);\n const title = query ?? `Echo Book: ${baseId}`;\n\n // Return book metadata based on the external ID with all fields populated for testing\n return {\n externalId: params.externalId,\n externalUrl: `https://echo.example.com/book/${baseId}`,\n title,\n subtitle: \"A Test Subtitle\",\n alternateTitles: [\n { title, language: \"en\", titleType: \"english\" },\n { title: `${title} (native)`, language: \"ja\", titleType: \"native\" },\n ],\n summary: `This is the full book metadata for \"${title}\" (id: ${baseId}). It includes a detailed description to test book metadata handling.`,\n bookType: \"novel\",\n\n // Book-specific fields\n volume: 1,\n pageCount: 320,\n releaseDate: \"2024-01-15\",\n year: 2024,\n\n // ISBN\n isbn: \"978-0-306-40615-7\",\n isbns: [\"978-0-306-40615-7\", \"0-306-40615-2\"],\n\n // Edition/Translation\n edition: \"First Edition\",\n originalTitle: \"Original Echo Title\",\n originalYear: 2023,\n translator: \"Echo Translator\",\n language: \"en\",\n\n // Series position\n seriesPosition: 1.0,\n seriesTotal: 5,\n\n // Taxonomy\n genres: [\"Fiction\", \"Test\", \"Echo\"],\n tags: [\"plugin-test\", \"echo\", \"book-test\"],\n subjects: [\"Testing\", \"Plugin Development\"],\n\n // Authors with roles\n authors: [\n { name: \"Echo Author\", role: \"author\", sortName: \"Author, Echo\" },\n { name: \"Test Writer\", role: \"co_author\", sortName: \"Writer, Test\" },\n { name: \"Echo Editor\", role: \"editor\" },\n ],\n artists: [\"Echo Illustrator\"],\n publisher: \"Echo Publishing House\",\n\n // Media\n coverUrl: \"https://picsum.photos/300/450\",\n covers: [\n { url: \"https://picsum.photos/300/450\", width: 300, height: 450, size: \"medium\" },\n { url: \"https://picsum.photos/600/900\", width: 600, height: 900, size: \"large\" },\n { url: \"https://picsum.photos/150/225\", width: 150, height: 225, size: \"small\" },\n ],\n\n // Ratings\n rating: {\n score: 88,\n voteCount: 500,\n source: \"echo\",\n },\n externalRatings: [\n { score: 88, voteCount: 500, source: \"echo\" },\n { score: 92, voteCount: 10000, source: \"goodreads\" },\n ],\n\n // Awards\n awards: [\n { name: \"Echo Award\", year: 2024, category: \"Best Test Book\", won: true },\n { name: \"Test Prize\", year: 2024, category: \"Excellence in Testing\", won: false },\n ],\n\n // External links\n externalLinks: [\n {\n url: `https://echo.example.com/book/${baseId}`,\n label: \"Echo Provider\",\n linkType: \"provider\",\n },\n {\n url: \"https://goodreads.com/book/echo\",\n label: \"Goodreads\",\n linkType: \"other\",\n },\n {\n url: \"https://amazon.com/echo-book\",\n label: \"Amazon\",\n linkType: \"purchase\",\n },\n ],\n };\n },\n\n async match(params: BookMatchParams): Promise<MetadataMatchResponse> {\n // Return a match based on ISBN (preferred) or title\n const identifier = params.isbn || params.title;\n const normalizedId = identifier.toLowerCase().replace(/[\\s-]/g, \"\");\n const isIsbnMatch = !!params.isbn;\n\n return {\n match: {\n externalId: `match-book-${normalizedId}`,\n title: params.title,\n alternateTitles: [],\n year: params.year,\n relevanceScore: isIsbnMatch ? 1.0 : 0.85,\n preview: {\n status: \"ended\",\n genres: [\"Matched\", \"Book\"],\n description: isIsbnMatch\n ? `Matched by ISBN: ${params.isbn}`\n : `Matched from title: \"${params.title}\"`,\n },\n },\n confidence: isIsbnMatch ? 0.99 : 0.8,\n alternatives: isIsbnMatch\n ? []\n : [\n {\n externalId: \"alt-book-1\",\n title: `Alternative: ${params.title}`,\n alternateTitles: [],\n relevanceScore: 0.5,\n },\n ],\n };\n },\n};\n\n// =============================================================================\n// Plugin Initialization\n// =============================================================================\n\ncreateMetadataPlugin({\n manifest,\n provider, // Series provider\n bookProvider, // Book provider\n logLevel: \"debug\",\n onInitialize(params: InitializeParams) {\n // Read config from initialization params\n const maxResults = params.adminConfig?.maxResults as number | undefined;\n if (maxResults !== undefined) {\n config.maxResults = Math.min(Math.max(1, maxResults), 20); // Clamp 1-20\n }\n logger.info(`Echo plugin initialized (maxResults: ${config.maxResults})`);\n },\n});\n\nlogger.info(\"Echo plugin started\");\n"],
|
|
5
|
-
"mappings": "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",
|
|
3
|
+
"sources": ["../node_modules/@ashdev/codex-plugin-sdk/src/types/rpc.ts", "../node_modules/@ashdev/codex-plugin-sdk/src/errors.ts", "../node_modules/@ashdev/codex-plugin-sdk/src/request-context.ts", "../node_modules/@ashdev/codex-plugin-sdk/src/host-rpc.ts", "../node_modules/@ashdev/codex-plugin-sdk/src/logger.ts", "../node_modules/@ashdev/codex-plugin-sdk/src/server.ts", "../node_modules/@ashdev/codex-plugin-sdk/src/storage.ts", "../package.json", "../src/manifest.ts", "../src/recorder.ts", "../src/index.ts"],
|
|
4
|
+
"sourcesContent": [null, null, null, null, null, null, null, "{\n \"name\": \"@ashdev/codex-plugin-metadata-echo\",\n \"version\": \"1.36.1\",\n \"description\": \"Echo metadata plugin for testing Codex plugin protocol\",\n \"main\": \"dist/index.js\",\n \"bin\": \"dist/index.js\",\n \"type\": \"module\",\n \"files\": [\n \"dist\",\n \"README.md\"\n ],\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/AshDevFr/codex.git\",\n \"directory\": \"plugins/metadata-echo\"\n },\n \"scripts\": {\n \"build\": \"esbuild src/index.ts --bundle --platform=node --target=node22 --format=esm --outfile=dist/index.js --sourcemap --banner:js='#!/usr/bin/env node'\",\n \"dev\": \"npm run build -- --watch\",\n \"clean\": \"rm -rf dist\",\n \"start\": \"node dist/index.js\",\n \"lint\": \"biome check .\",\n \"lint:fix\": \"biome check --write .\",\n \"typecheck\": \"tsc --noEmit\",\n \"test\": \"vitest run --passWithNoTests\",\n \"test:watch\": \"vitest\",\n \"prepublishOnly\": \"npm run lint && npm run build\"\n },\n \"keywords\": [\n \"codex\",\n \"plugin\",\n \"echo\",\n \"testing\"\n ],\n \"author\": \"Codex\",\n \"license\": \"MIT\",\n \"engines\": {\n \"node\": \">=22.0.0\"\n },\n \"dependencies\": {\n \"@ashdev/codex-plugin-sdk\": \"^1.36.1\"\n },\n \"devDependencies\": {\n \"@biomejs/biome\": \"^2.4.4\",\n \"@types/node\": \"^22.0.0\",\n \"esbuild\": \"^0.27.3\",\n \"typescript\": \"^5.9.3\",\n \"vitest\": \"^4.0.18\"\n }\n}\n", "import type { MetadataContentType, PluginManifest } from \"@ashdev/codex-plugin-sdk\";\nimport packageJson from \"../package.json\" with { type: \"json\" };\n\n// Default config values\nexport const DEFAULT_MAX_RESULTS = 5;\nexport const DEFAULT_MAX_PAYLOAD_FILES = 500;\n\nexport const manifest = {\n name: \"metadata-echo\",\n displayName: \"Echo Metadata Plugin\",\n version: packageJson.version,\n description:\n \"Test metadata plugin that echoes back search queries (supports both series and book metadata)\",\n author: \"Codex\",\n homepage: \"https://github.com/AshDevFr/codex\",\n protocolVersion: \"1.0\",\n capabilities: {\n // Demonstrates multi-content-type plugin support\n metadataProvider: [\"series\", \"book\"] as MetadataContentType[],\n },\n configSchema: {\n description: \"Configuration options for the Echo test plugin\",\n fields: [\n {\n key: \"maxResults\",\n label: \"Maximum Results\",\n description: \"Maximum number of results to return for search queries (1-20)\",\n type: \"number\" as const,\n required: false,\n default: DEFAULT_MAX_RESULTS,\n example: 10,\n },\n {\n key: \"recordPayloads\",\n label: \"Record Payloads\",\n description:\n \"Write each request and its response to JSON files under the plugin's data directory for debugging.\",\n type: \"boolean\" as const,\n required: false,\n default: true,\n },\n {\n key: \"maxPayloadFiles\",\n label: \"Max Payload Files\",\n description:\n \"Maximum number of recorded payload files to keep; oldest are pruned. Only used when payload recording is enabled.\",\n type: \"number\" as const,\n required: false,\n default: DEFAULT_MAX_PAYLOAD_FILES,\n example: 500,\n },\n ],\n },\n} as const satisfies PluginManifest & {\n capabilities: { metadataProvider: MetadataContentType[] };\n};\n", "/**\n * Payload Recorder - debug helper for echo plugins.\n *\n * Writes every request and its matching response to paired JSON files under the\n * plugin's host-provided file-storage directory (`InitializeParams.dataDir`), so\n * the host -> plugin protocol traffic can be inspected without trawling the\n * server logs. This is intended for the echo (test/debug) plugins only.\n *\n * Files for one call share a sortable basename and differ only by suffix:\n *\n * {yyyy-MM-dd-HH-mm-ss}-{id}-{method}-request.json\n * {yyyy-MM-dd-HH-mm-ss}-{id}-{method}-response.json\n *\n * Timestamps are UTC + 24-hour + zero-padded, so lexical sort == chronological\n * sort regardless of the server's timezone. `{id}` is a zero-padded monotonic\n * per-process counter that breaks ties within the same second and pairs the two\n * files. Each file is a JSON envelope holding the payload plus a snapshot of the\n * active config (credentials redacted).\n *\n * All filesystem I/O is best-effort: a failure is logged and swallowed so a disk\n * problem never breaks an RPC response.\n *\n * NOTE: this module is intentionally duplicated across the echo plugins to keep\n * the published SDK surface small. Keep the copies in sync.\n */\n\nimport { mkdir, readdir, rm, writeFile } from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\nimport { join } from \"node:path\";\n\n/** Minimal logger contract (compatible with the SDK `Logger`). */\nexport interface RecorderLogger {\n info(message: string): void;\n warn(message: string): void;\n debug(message: string): void;\n}\n\nexport interface PayloadRecorderOptions {\n /** Plugin name, used for the fallback directory and the file envelope. */\n pluginName: string;\n /** Host-provided file-storage directory (`InitializeParams.dataDir`). */\n dataDir?: string;\n /** Whether recording is on (default: true). */\n enabled?: boolean;\n /** Maximum number of files to keep; oldest are pruned (default: 500). */\n maxFiles?: number;\n /** Active config snapshot to embed in each file (should be pre-redacted). */\n configSnapshot: unknown;\n /** Logger for diagnostics. */\n logger: RecorderLogger;\n /** Clock injection for tests (default: `() => new Date()`). */\n now?: () => Date;\n}\n\n/** Keys whose values are dropped from on-disk config snapshots. */\nconst SECRET_KEY_RE = /token|secret|password|api[-_]?key|credential/i;\nconst REDACTED = \"[REDACTED]\";\n\nconst DEFAULT_MAX_FILES = 500;\n\nfunction pad(value: number, width: number): string {\n return String(value).padStart(width, \"0\");\n}\n\n/** Format a date as `yyyy-MM-dd-HH-mm-ss` in UTC. */\nfunction utcStamp(date: Date): string {\n const y = date.getUTCFullYear();\n const mo = pad(date.getUTCMonth() + 1, 2);\n const d = pad(date.getUTCDate(), 2);\n const h = pad(date.getUTCHours(), 2);\n const mi = pad(date.getUTCMinutes(), 2);\n const s = pad(date.getUTCSeconds(), 2);\n return `${y}-${mo}-${d}-${h}-${mi}-${s}`;\n}\n\n/** Replace non-alphanumeric runs with `_` so a method is filename-safe. */\nfunction sanitizeMethod(method: string): string {\n return method.replace(/[^a-z0-9]+/gi, \"_\").replace(/^_+|_+$/g, \"\");\n}\n\n/**\n * Recursively copy a config object, replacing values under secret-like keys\n * with `[REDACTED]`. Arrays and primitives are returned as-is.\n */\nfunction redactObject(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.map(redactObject);\n }\n if (value && typeof value === \"object\") {\n const out: Record<string, unknown> = {};\n for (const [key, val] of Object.entries(value as Record<string, unknown>)) {\n out[key] = SECRET_KEY_RE.test(key) ? REDACTED : redactObject(val);\n }\n return out;\n }\n return value;\n}\n\n/**\n * Build a redacted config snapshot from initialize params. Credentials are\n * never included (they are passed separately, not via config); secret-like\n * config keys are additionally redacted as a defensive measure.\n */\nexport function redactConfig(input: {\n adminConfig?: Record<string, unknown>;\n userConfig?: Record<string, unknown>;\n}): { adminConfig: unknown; userConfig: unknown } {\n return {\n adminConfig: redactObject(input.adminConfig ?? {}),\n userConfig: redactObject(input.userConfig ?? {}),\n };\n}\n\ninterface Envelope {\n timestamp: string;\n plugin: string;\n method: string;\n direction: \"request\" | \"response\";\n id: number;\n config: unknown;\n payload: unknown;\n}\n\nexport class PayloadRecorder {\n private readonly pluginName: string;\n private readonly enabled: boolean;\n private readonly maxFiles: number;\n private readonly configSnapshot: unknown;\n private readonly logger: RecorderLogger;\n private readonly now: () => Date;\n private readonly dir: string;\n private readonly usingFallback: boolean;\n private seq = 0;\n private ready: Promise<boolean> | null = null;\n\n constructor(opts: PayloadRecorderOptions) {\n this.pluginName = opts.pluginName;\n this.enabled = opts.enabled ?? true;\n this.maxFiles = opts.maxFiles ?? DEFAULT_MAX_FILES;\n this.configSnapshot = opts.configSnapshot;\n this.logger = opts.logger;\n this.now = opts.now ?? (() => new Date());\n\n if (opts.dataDir) {\n this.dir = join(opts.dataDir, \"payloads\");\n this.usingFallback = false;\n } else {\n this.dir = join(tmpdir(), `codex-${opts.pluginName}`, \"payloads\");\n this.usingFallback = true;\n }\n }\n\n /** Absolute directory payloads are written to (for logging/tests). */\n get directory(): string {\n return this.dir;\n }\n\n /** Lazily create the payloads directory once; returns false if unusable. */\n private ensureDir(): Promise<boolean> {\n if (!this.ready) {\n this.ready = mkdir(this.dir, { recursive: true })\n .then(() => {\n if (this.usingFallback) {\n this.logger.warn(`No dataDir provided; recording payloads under temp dir ${this.dir}`);\n } else {\n this.logger.debug(`Recording payloads to ${this.dir}`);\n }\n return true;\n })\n .catch((err: unknown) => {\n const msg = err instanceof Error ? err.message : \"unknown error\";\n this.logger.warn(`Failed to create payload dir ${this.dir}: ${msg}`);\n return false;\n });\n }\n return this.ready;\n }\n\n /**\n * Record a request and its response under one shared, sortable basename.\n * Best-effort: never throws.\n */\n async record(method: string, request: unknown, response: unknown): Promise<void> {\n if (!this.enabled) return;\n if (!(await this.ensureDir())) return;\n\n const id = ++this.seq;\n const date = this.now();\n const base = `${utcStamp(date)}-${pad(id, 4)}-${sanitizeMethod(method)}`;\n const iso = date.toISOString();\n\n await this.writeFile(`${base}-request.json`, {\n timestamp: iso,\n plugin: this.pluginName,\n method,\n direction: \"request\",\n id,\n config: this.configSnapshot,\n payload: request,\n });\n await this.writeFile(`${base}-response.json`, {\n timestamp: iso,\n plugin: this.pluginName,\n method,\n direction: \"response\",\n id,\n config: this.configSnapshot,\n payload: response,\n });\n\n await this.prune();\n }\n\n private async writeFile(name: string, envelope: Envelope): Promise<void> {\n try {\n await writeFile(join(this.dir, name), JSON.stringify(envelope, null, 2), \"utf8\");\n } catch (err) {\n const msg = err instanceof Error ? err.message : \"unknown error\";\n this.logger.warn(`Failed to write payload file ${name}: ${msg}`);\n }\n }\n\n /** Keep at most `maxFiles` files, deleting the oldest (lexical == chrono). */\n private async prune(): Promise<void> {\n if (this.maxFiles <= 0) return;\n try {\n const files = (await readdir(this.dir)).filter((f) => f.endsWith(\".json\")).sort();\n const excess = files.length - this.maxFiles;\n if (excess <= 0) return;\n for (const file of files.slice(0, excess)) {\n await rm(join(this.dir, file), { force: true });\n }\n } catch (err) {\n const msg = err instanceof Error ? err.message : \"unknown error\";\n this.logger.warn(`Failed to prune payload dir ${this.dir}: ${msg}`);\n }\n }\n}\n", "/**\n * Echo Plugin - A minimal plugin for testing the Codex plugin protocol\n *\n * This plugin demonstrates the plugin SDK usage and serves as a protocol\n * validation tool. It echoes back search parameters and provides predictable\n * responses for testing.\n *\n * Supports both series and book metadata to demonstrate multi-content-type plugins.\n */\n\nimport {\n type BookMatchParams,\n type BookMetadataProvider,\n type BookSearchParams,\n createLogger,\n createMetadataPlugin,\n type InitializeParams,\n type MetadataGetParams,\n type MetadataMatchParams,\n type MetadataMatchResponse,\n type MetadataProvider,\n type MetadataSearchParams,\n type MetadataSearchResponse,\n type PluginBookMetadata,\n type PluginSeriesMetadata,\n} from \"@ashdev/codex-plugin-sdk\";\nimport { DEFAULT_MAX_PAYLOAD_FILES, DEFAULT_MAX_RESULTS, manifest } from \"./manifest.js\";\nimport { PayloadRecorder, redactConfig } from \"./recorder.js\";\n\nconst logger = createLogger({ name: \"echo\", level: \"debug\" });\n\n// Plugin configuration (set during initialization)\nconst config = {\n maxResults: DEFAULT_MAX_RESULTS,\n};\n\n// Payload recorder (set during initialization)\nlet recorder: PayloadRecorder | null = null;\n\n/** Record a request/response pair (best-effort) and return the response. */\nasync function rec<T>(method: string, params: unknown, response: T): Promise<T> {\n await recorder?.record(method, params, response);\n return response;\n}\n\n// Encode the original query into the externalId so that get() can recover it\n// later. The protocol only passes externalId to get(), so this is how the\n// echo plugin preserves the user-facing title across calls.\nfunction encodeExternalId(baseId: string, query: string): string {\n return `${baseId}::${encodeURIComponent(query)}`;\n}\n\nfunction decodeExternalId(externalId: string): { baseId: string; query: string | null } {\n const sep = externalId.indexOf(\"::\");\n if (sep === -1) {\n return { baseId: externalId, query: null };\n }\n return {\n baseId: externalId.slice(0, sep),\n query: decodeURIComponent(externalId.slice(sep + 2)),\n };\n}\n\n// Generate echo results based on config\nfunction generateEchoResults(query: string, maxResults: number) {\n const results = [];\n const count = Math.min(Math.max(1, maxResults), 20); // Clamp between 1-20\n\n for (let i = 1; i <= count; i++) {\n results.push({\n externalId: encodeExternalId(`echo-${i}`, query),\n title: i === 1 ? `Echo: ${query}` : `Echo Result ${i} for: ${query}`,\n alternateTitles: i === 1 ? [`Echoed Query: ${query}`] : [],\n year: new Date().getFullYear(),\n relevanceScore: Math.max(0.1, 1.0 - (i - 1) * 0.1), // Decreasing relevance\n preview: {\n status: i % 2 === 0 ? \"ongoing\" : \"ended\",\n genres: i === 1 ? [\"Test\", \"Echo\"] : [\"Test\"],\n rating: i === 1 ? 10.0 : undefined,\n description:\n i === 1\n ? `Search query echoed: \"${query}\"`\n : `Result ${i} for testing (maxResults=${count})`,\n },\n });\n }\n\n return results;\n}\n\nconst provider: MetadataProvider = {\n async search(params: MetadataSearchParams): Promise<MetadataSearchResponse> {\n // Echo back the query as search results, respecting maxResults config\n return rec<MetadataSearchResponse>(\"metadata/series/search\", params, {\n results: generateEchoResults(params.query, config.maxResults),\n });\n },\n\n async get(params: MetadataGetParams): Promise<PluginSeriesMetadata> {\n // Recover the original search query (if encoded by search()) so we can\n // echo the user-facing title instead of the opaque external ID.\n const { baseId, query } = decodeExternalId(params.externalId);\n const title = query ?? `Echo Series: ${baseId}`;\n\n // Return metadata based on the external ID with all fields populated for testing\n return rec<PluginSeriesMetadata>(\"metadata/series/get\", params, {\n externalId: params.externalId,\n externalUrl: `https://echo.example.com/series/${baseId}`,\n title,\n alternateTitles: [\n { title, language: \"en\", titleType: \"english\" },\n { title: `${title} (native)`, language: \"ja\", titleType: \"native\" },\n { title: `${title} (romaji)`, language: \"ja-Latn\", titleType: \"romaji\" },\n ],\n summary: `This is the full metadata for \"${title}\" (id: ${baseId}). It includes a detailed description to test summary handling.`,\n status: \"ended\",\n year: 2024,\n\n // Extended metadata fields\n totalVolumeCount: 10,\n language: \"en\",\n ageRating: 13,\n readingDirection: \"ltr\",\n\n // Taxonomy\n genres: [\"Action\", \"Comedy\", \"Test\", \"Echo\"],\n tags: [\"plugin-test\", \"echo\", \"automation\", \"development\"],\n\n // Credits\n authors: [\n { name: \"Echo Author\", role: \"author\" },\n { name: \"Test Writer\", role: \"author\" },\n ],\n artists: [\"Echo Artist\"],\n publisher: \"Echo Publisher\",\n\n // Media\n coverUrl: \"https://picsum.photos/300/450\",\n bannerUrl: \"https://picsum.photos/800/200\",\n\n // Primary rating\n rating: {\n score: 85,\n voteCount: 100,\n source: \"echo\",\n },\n\n // Multiple external ratings for testing aggregation\n externalRatings: [\n {\n score: 85,\n voteCount: 100,\n source: \"echo\",\n },\n {\n score: 92,\n voteCount: 5000,\n source: \"anilist\",\n },\n {\n score: 88,\n voteCount: 2500,\n source: \"mal\",\n },\n ],\n\n // External links\n externalLinks: [\n {\n url: `https://echo.example.com/series/${baseId}`,\n label: \"Echo Provider\",\n linkType: \"provider\",\n },\n {\n url: \"https://official-echo.example.com\",\n label: \"Official Site\",\n linkType: \"official\",\n },\n {\n url: \"https://twitter.com/echo_series\",\n label: \"Twitter\",\n linkType: \"social\",\n },\n {\n url: \"https://store.example.com/echo\",\n label: \"Buy\",\n linkType: \"purchase\",\n },\n ],\n });\n },\n\n async match(params: MetadataMatchParams): Promise<MetadataMatchResponse> {\n // Return a match based on the title\n const normalizedTitle = params.title.toLowerCase().replace(/\\s+/g, \"-\");\n return rec<MetadataMatchResponse>(\"metadata/series/match\", params, {\n match: {\n externalId: `match-${normalizedTitle}`,\n title: params.title,\n alternateTitles: [],\n year: params.year,\n relevanceScore: 0.9,\n preview: {\n status: \"ended\",\n genres: [\"Matched\"],\n description: `Matched from title: \"${params.title}\"`,\n },\n },\n confidence: 0.85,\n alternatives: [\n {\n externalId: \"alt-1\",\n title: `Alternative: ${params.title}`,\n alternateTitles: [],\n relevanceScore: 0.6,\n },\n ],\n });\n },\n};\n\n// =============================================================================\n// Book Metadata Provider\n// =============================================================================\n\n// Generate echo results for book search\nfunction generateBookEchoResults(params: BookSearchParams, maxResults: number) {\n const results = [];\n const count = Math.min(Math.max(1, maxResults), 20);\n const searchTerm = params.isbn || params.query || \"unknown\";\n\n for (let i = 1; i <= count; i++) {\n const isIsbnSearch = !!params.isbn;\n results.push({\n externalId: encodeExternalId(`echo-book-${i}`, searchTerm),\n title: i === 1 ? `Echo Book: ${searchTerm}` : `Echo Book Result ${i} for: ${searchTerm}`,\n alternateTitles: i === 1 ? [`Book Query: ${searchTerm}`] : [],\n year: params.year || new Date().getFullYear(),\n relevanceScore: isIsbnSearch ? 1.0 : Math.max(0.1, 1.0 - (i - 1) * 0.1),\n preview: {\n status: i % 2 === 0 ? \"ongoing\" : \"ended\",\n genres: i === 1 ? [\"Test\", \"Echo\", \"Book\"] : [\"Test\", \"Book\"],\n rating: i === 1 ? 9.0 : undefined,\n description:\n i === 1\n ? `Book search ${isIsbnSearch ? \"by ISBN\" : \"by query\"}: \"${searchTerm}\"`\n : `Book result ${i} for testing`,\n },\n });\n }\n\n return results;\n}\n\nconst bookProvider: BookMetadataProvider = {\n async search(params: BookSearchParams): Promise<MetadataSearchResponse> {\n // Echo back the ISBN or query as search results\n return rec<MetadataSearchResponse>(\"metadata/book/search\", params, {\n results: generateBookEchoResults(params, config.maxResults),\n });\n },\n\n async get(params: MetadataGetParams): Promise<PluginBookMetadata> {\n // Recover the original search term encoded in the externalId so the title\n // matches what the user saw in search results.\n const { baseId, query } = decodeExternalId(params.externalId);\n const title = query ?? `Echo Book: ${baseId}`;\n\n // Return book metadata based on the external ID with all fields populated for testing\n return rec<PluginBookMetadata>(\"metadata/book/get\", params, {\n externalId: params.externalId,\n externalUrl: `https://echo.example.com/book/${baseId}`,\n title,\n subtitle: \"A Test Subtitle\",\n alternateTitles: [\n { title, language: \"en\", titleType: \"english\" },\n { title: `${title} (native)`, language: \"ja\", titleType: \"native\" },\n ],\n summary: `This is the full book metadata for \"${title}\" (id: ${baseId}). It includes a detailed description to test book metadata handling.`,\n bookType: \"novel\",\n\n // Book-specific fields\n volume: 1,\n pageCount: 320,\n releaseDate: \"2024-01-15\",\n year: 2024,\n\n // ISBN\n isbn: \"978-0-306-40615-7\",\n isbns: [\"978-0-306-40615-7\", \"0-306-40615-2\"],\n\n // Edition/Translation\n edition: \"First Edition\",\n originalTitle: \"Original Echo Title\",\n originalYear: 2023,\n translator: \"Echo Translator\",\n language: \"en\",\n\n // Series position\n seriesPosition: 1.0,\n seriesTotal: 5,\n\n // Taxonomy\n genres: [\"Fiction\", \"Test\", \"Echo\"],\n tags: [\"plugin-test\", \"echo\", \"book-test\"],\n subjects: [\"Testing\", \"Plugin Development\"],\n\n // Authors with roles\n authors: [\n { name: \"Echo Author\", role: \"author\", sortName: \"Author, Echo\" },\n { name: \"Test Writer\", role: \"co_author\", sortName: \"Writer, Test\" },\n { name: \"Echo Editor\", role: \"editor\" },\n ],\n artists: [\"Echo Illustrator\"],\n publisher: \"Echo Publishing House\",\n\n // Media\n coverUrl: \"https://picsum.photos/300/450\",\n covers: [\n { url: \"https://picsum.photos/300/450\", width: 300, height: 450, size: \"medium\" },\n { url: \"https://picsum.photos/600/900\", width: 600, height: 900, size: \"large\" },\n { url: \"https://picsum.photos/150/225\", width: 150, height: 225, size: \"small\" },\n ],\n\n // Ratings\n rating: {\n score: 88,\n voteCount: 500,\n source: \"echo\",\n },\n externalRatings: [\n { score: 88, voteCount: 500, source: \"echo\" },\n { score: 92, voteCount: 10000, source: \"goodreads\" },\n ],\n\n // Awards\n awards: [\n { name: \"Echo Award\", year: 2024, category: \"Best Test Book\", won: true },\n { name: \"Test Prize\", year: 2024, category: \"Excellence in Testing\", won: false },\n ],\n\n // External links\n externalLinks: [\n {\n url: `https://echo.example.com/book/${baseId}`,\n label: \"Echo Provider\",\n linkType: \"provider\",\n },\n {\n url: \"https://goodreads.com/book/echo\",\n label: \"Goodreads\",\n linkType: \"other\",\n },\n {\n url: \"https://amazon.com/echo-book\",\n label: \"Amazon\",\n linkType: \"purchase\",\n },\n ],\n });\n },\n\n async match(params: BookMatchParams): Promise<MetadataMatchResponse> {\n // Return a match based on ISBN (preferred) or title\n const identifier = params.isbn || params.title;\n const normalizedId = identifier.toLowerCase().replace(/[\\s-]/g, \"\");\n const isIsbnMatch = !!params.isbn;\n\n return rec<MetadataMatchResponse>(\"metadata/book/match\", params, {\n match: {\n externalId: `match-book-${normalizedId}`,\n title: params.title,\n alternateTitles: [],\n year: params.year,\n relevanceScore: isIsbnMatch ? 1.0 : 0.85,\n preview: {\n status: \"ended\",\n genres: [\"Matched\", \"Book\"],\n description: isIsbnMatch\n ? `Matched by ISBN: ${params.isbn}`\n : `Matched from title: \"${params.title}\"`,\n },\n },\n confidence: isIsbnMatch ? 0.99 : 0.8,\n alternatives: isIsbnMatch\n ? []\n : [\n {\n externalId: \"alt-book-1\",\n title: `Alternative: ${params.title}`,\n alternateTitles: [],\n relevanceScore: 0.5,\n },\n ],\n });\n },\n};\n\n// =============================================================================\n// Plugin Initialization\n// =============================================================================\n\ncreateMetadataPlugin({\n manifest,\n provider, // Series provider\n bookProvider, // Book provider\n logLevel: \"debug\",\n onInitialize(params: InitializeParams) {\n // Read config from initialization params\n const maxResults = params.adminConfig?.maxResults as number | undefined;\n if (maxResults !== undefined) {\n config.maxResults = Math.min(Math.max(1, maxResults), 20); // Clamp 1-20\n }\n\n // Set up payload recording (on by default for this debug plugin)\n const recordPayloads = params.adminConfig?.recordPayloads !== false;\n const maxPayloadFiles =\n typeof params.adminConfig?.maxPayloadFiles === \"number\"\n ? params.adminConfig.maxPayloadFiles\n : DEFAULT_MAX_PAYLOAD_FILES;\n recorder = new PayloadRecorder({\n pluginName: manifest.name,\n dataDir: params.dataDir,\n enabled: recordPayloads,\n maxFiles: maxPayloadFiles,\n configSnapshot: redactConfig({\n adminConfig: params.adminConfig,\n userConfig: params.userConfig,\n }),\n logger,\n });\n\n logger.info(\n `Echo plugin initialized (maxResults: ${config.maxResults}, recordPayloads: ${recordPayloads})`,\n );\n },\n});\n\nlogger.info(\"Echo plugin started\");\n"],
|
|
5
|
+
"mappings": ";;;AA2CO,IAAM,uBAAuB;;EAElC,aAAa;;EAEb,iBAAiB;;EAEjB,kBAAkB;;EAElB,gBAAgB;;EAEhB,gBAAgB;;;;AC5CZ,IAAgB,cAAhB,cAAoC,MAAK;EAEpC;EAET,YAAY,SAAiB,MAAc;AACzC,UAAM,OAAO;AACb,SAAK,OAAO,KAAK,YAAY;AAC7B,SAAK,OAAO;EACd;;;;EAKA,iBAAc;AACZ,WAAO;MACL,MAAM,KAAK;MACX,SAAS,KAAK;MACd,MAAM,KAAK;;EAEf;;;;ACTF,SAAS,yBAAyB;AAElC,IAAM,QAAQ,IAAI,kBAAiB;AAO7B,SAAU,uBACd,kBACA,IAAoB;AAEpB,SAAO,MAAM,IAAI,kBAAkB,EAAE;AACvC;AAQM,SAAU,yBAAsB;AACpC,SAAO,MAAM,SAAQ;AACvB;;;ACZM,IAAO,eAAP,cAA4B,MAAK;EAGnB;EACA;EAHlB,YACE,SACgB,MACA,MAAc;AAE9B,UAAM,OAAO;AAHG,SAAA,OAAA;AACA,SAAA,OAAA;AAGhB,SAAK,OAAO;EACd;;AAOI,IAAO,gBAAP,MAAoB;;;;;EAKhB,SAAS;EACT,kBAAkB,oBAAI,IAAG;EAOzB;;;;;EAMR,YAAY,SAAiB;AAC3B,SAAK,UACH,YACC,CAAC,SAAgB;AAChB,cAAQ,OAAO,MAAM,IAAI;IAC3B;EACJ;;;;;;;;EASA,MAAM,KAAkB,QAAgB,QAAgB;AACtD,UAAM,KAAK,KAAK;AAKhB,UAAM,SAAS,uBAAsB;AACrC,UAAM,UAA0B;MAC9B,SAAS;MACT;MACA;MACA;MACA,GAAI,WAAW,SAAY,EAAE,iBAAiB,OAAM,IAAK,CAAA;;AAG3D,WAAO,IAAI,QAAW,CAAC,SAAS,WAAU;AACxC,WAAK,gBAAgB,IAAI,IAAI;QAC3B,SAAS,CAAC,MAAM,QAAQ,CAAM;QAC9B;OACD;AACD,UAAI;AACF,aAAK,QAAQ,GAAG,KAAK,UAAU,OAAO,CAAC;CAAI;MAC7C,SAAS,KAAK;AACZ,aAAK,gBAAgB,OAAO,EAAE;AAC9B,cAAM,UAAU,eAAe,QAAQ,IAAI,UAAU;AACrD,eAAO,IAAI,aAAa,2BAA2B,OAAO,IAAI,EAAE,CAAC;MACnE;IACF,CAAC;EACH;;;;;;;;EASA,eAAe,MAAY;AACzB,UAAM,UAAU,KAAK,KAAI;AACzB,QAAI,CAAC;AAAS,aAAO;AAErB,QAAI;AACJ,QAAI;AACF,eAAS,KAAK,MAAM,OAAO;IAC7B,QAAQ;AACN,aAAO;IACT;AAEA,UAAM,MAAM;AACZ,QAAI,IAAI,WAAW;AAAW,aAAO;AACrC,UAAM,QAAQ,IAAI;AAClB,QAAI,OAAO,UAAU;AAAU,aAAO;AACtC,QAAI,CAAC,KAAK,gBAAgB,IAAI,KAAK;AAAG,aAAO;AAE7C,UAAM,UAAU,KAAK,gBAAgB,IAAI,KAAK;AAC9C,QAAI,CAAC;AAAS,aAAO;AACrB,SAAK,gBAAgB,OAAO,KAAK;AAEjC,QAAI,WAAW,OAAO,IAAI,OAAO;AAC/B,YAAM,MAAM,IAAI;AAChB,cAAQ,OAAO,IAAI,aAAa,IAAI,SAAS,IAAI,MAAM,IAAI,IAAI,CAAC;IAClE,OAAO;AACL,cAAQ,QAAQ,IAAI,MAAM;IAC5B;AACA,WAAO;EACT;;EAGA,YAAS;AACP,eAAW,CAAC,EAAE,OAAO,KAAK,KAAK,iBAAiB;AAC9C,cAAQ,OAAO,IAAI,aAAa,2BAA2B,EAAE,CAAC;IAChE;AACA,SAAK,gBAAgB,MAAK;EAC5B;;;;AChJF,IAAM,aAAuC;EAC3C,OAAO;EACP,MAAM;EACN,MAAM;EACN,OAAO;;AAeH,IAAO,SAAP,MAAa;EACA;EACA;EACA;EAEjB,YAAY,SAAsB;AAChC,SAAK,OAAO,QAAQ;AACpB,SAAK,WAAW,WAAW,QAAQ,SAAS,MAAM;AAClD,SAAK,aAAa,QAAQ,cAAc;EAC1C;EAEQ,UAAU,OAAe;AAC/B,WAAO,WAAW,KAAK,KAAK,KAAK;EACnC;EAEQ,OAAO,OAAiB,SAAiB,MAAc;AAC7D,UAAM,QAAkB,CAAA;AAExB,QAAI,KAAK,YAAY;AACnB,YAAM,MAAK,oBAAI,KAAI,GAAG,YAAW,CAAE;IACrC;AAEA,UAAM,KAAK,IAAI,MAAM,YAAW,CAAE,GAAG;AACrC,UAAM,KAAK,IAAI,KAAK,IAAI,GAAG;AAC3B,UAAM,KAAK,OAAO;AAElB,QAAI,SAAS,QAAW;AACtB,UAAI,gBAAgB,OAAO;AACzB,cAAM,KAAK,KAAK,KAAK,OAAO,EAAE;AAC9B,YAAI,KAAK,OAAO;AACd,gBAAM,KAAK;EAAK,KAAK,KAAK,EAAE;QAC9B;MACF,WAAW,OAAO,SAAS,UAAU;AACnC,cAAM,KAAK,KAAK,KAAK,UAAU,IAAI,CAAC,EAAE;MACxC,OAAO;AACL,cAAM,KAAK,KAAK,OAAO,IAAI,CAAC,EAAE;MAChC;IACF;AAEA,WAAO,MAAM,KAAK,GAAG;EACvB;EAEQ,IAAI,OAAiB,SAAiB,MAAc;AAC1D,QAAI,KAAK,UAAU,KAAK,GAAG;AAEzB,cAAQ,OAAO,MAAM,GAAG,KAAK,OAAO,OAAO,SAAS,IAAI,CAAC;CAAI;IAC/D;EACF;EAEA,MAAM,SAAiB,MAAc;AACnC,SAAK,IAAI,SAAS,SAAS,IAAI;EACjC;EAEA,KAAK,SAAiB,MAAc;AAClC,SAAK,IAAI,QAAQ,SAAS,IAAI;EAChC;EAEA,KAAK,SAAiB,MAAc;AAClC,SAAK,IAAI,QAAQ,SAAS,IAAI;EAChC;EAEA,MAAM,SAAiB,MAAc;AACnC,SAAK,IAAI,SAAS,SAAS,IAAI;EACjC;;AAMI,SAAU,aAAa,SAAsB;AACjD,SAAO,IAAI,OAAO,OAAO;AAC3B;;;ACvFA,SAAS,uBAAuB;;;AC8E1B,IAAO,eAAP,cAA4B,MAAK;EAGnB;EACA;EAHlB,YACE,SACgB,MACA,MAAc;AAE9B,UAAM,OAAO;AAHG,SAAA,OAAA;AACA,SAAA,OAAA;AAGhB,SAAK,OAAO;EACd;;AAiBI,IAAO,gBAAP,MAAoB;EAChB,SAAS;EACT,kBAAkB,oBAAI,IAAG;EAOzB;;;;;;;EAQR,YAAY,SAAiB;AAC3B,SAAK,UACH,YACC,CAAC,SAAgB;AAChB,cAAQ,OAAO,MAAM,IAAI;IAC3B;EACJ;;;;;;;EAQA,MAAM,IAAI,KAAW;AACnB,WAAQ,MAAM,KAAK,YAAY,eAAe,EAAE,IAAG,CAAE;EACvD;;;;;;;;;EAUA,MAAM,IAAI,KAAa,MAAe,WAAkB;AACtD,UAAM,SAAkC,EAAE,KAAK,KAAI;AACnD,QAAI,cAAc,QAAW;AAC3B,aAAO,YAAY;IACrB;AACA,WAAQ,MAAM,KAAK,YAAY,eAAe,MAAM;EACtD;;;;;;;EAQA,MAAM,OAAO,KAAW;AACtB,WAAQ,MAAM,KAAK,YAAY,kBAAkB,EAAE,IAAG,CAAE;EAC1D;;;;;;EAOA,MAAM,OAAI;AACR,WAAQ,MAAM,KAAK,YAAY,gBAAgB,CAAA,CAAE;EACnD;;;;;;EAOA,MAAM,QAAK;AACT,WAAQ,MAAM,KAAK,YAAY,iBAAiB,CAAA,CAAE;EACpD;;;;;;;EAQA,eAAe,MAAY;AACzB,UAAM,UAAU,KAAK,KAAI;AACzB,QAAI,CAAC;AAAS;AAEd,QAAI;AACJ,QAAI;AACF,eAAS,KAAK,MAAM,OAAO;IAC7B,QAAQ;AAEN;IACF;AAEA,UAAM,MAAM;AAGZ,QAAI,IAAI,WAAW,QAAW;AAE5B;IACF;AAEA,UAAM,KAAK,IAAI;AACf,QAAI,OAAO,UAAa,OAAO;AAAM;AAErC,UAAM,UAAU,KAAK,gBAAgB,IAAI,EAAqB;AAC9D,QAAI,CAAC;AAAS;AAEd,SAAK,gBAAgB,OAAO,EAAqB;AAEjD,QAAI,WAAW,OAAO,IAAI,OAAO;AAC/B,YAAM,MAAM,IAAI;AAChB,cAAQ,OAAO,IAAI,aAAa,IAAI,SAAS,IAAI,MAAM,IAAI,IAAI,CAAC;IAClE,OAAO;AACL,cAAQ,QAAQ,IAAI,MAAM;IAC5B;EACF;;;;EAKA,YAAS;AACP,eAAW,CAAC,EAAE,OAAO,KAAK,KAAK,iBAAiB;AAC9C,cAAQ,OAAO,IAAI,aAAa,0BAA0B,EAAE,CAAC;IAC/D;AACA,SAAK,gBAAgB,MAAK;EAC5B;;;;EAMQ,YAAY,QAAgB,QAAe;AACjD,UAAM,KAAK,KAAK;AAEhB,UAAM,UAA0B;MAC9B,SAAS;MACT;MACA;MACA;;AAGF,WAAO,IAAI,QAAQ,CAAC,SAAS,WAAU;AACrC,WAAK,gBAAgB,IAAI,IAAI,EAAE,SAAS,OAAM,CAAE;AAEhD,UAAI;AACF,aAAK,QAAQ,GAAG,KAAK,UAAU,OAAO,CAAC;CAAI;MAC7C,SAAS,KAAK;AACZ,aAAK,gBAAgB,OAAO,EAAE;AAC9B,cAAM,UAAU,eAAe,QAAQ,IAAI,UAAU;AACrD,eAAO,IAAI,aAAa,2BAA2B,OAAO,IAAI,EAAE,CAAC;MACnE;IACF,CAAC;EACH;;;;ADxNF,SAAS,qBAAqB,QAAiB,QAAgB;AAC7D,MAAI,WAAW,QAAQ,WAAW,QAAW;AAC3C,WAAO,EAAE,OAAO,UAAU,SAAS,qBAAoB;EACzD;AACA,MAAI,OAAO,WAAW,UAAU;AAC9B,WAAO,EAAE,OAAO,UAAU,SAAS,2BAA0B;EAC/D;AAEA,QAAM,MAAM;AACZ,aAAW,SAAS,QAAQ;AAC1B,UAAM,QAAQ,IAAI,KAAK;AACvB,QAAI,UAAU,UAAa,UAAU,MAAM;AACzC,aAAO,EAAE,OAAO,SAAS,GAAG,KAAK,eAAc;IACjD;AACA,QAAI,OAAO,UAAU,UAAU;AAC7B,aAAO,EAAE,OAAO,SAAS,GAAG,KAAK,oBAAmB;IACtD;AACA,QAAI,MAAM,KAAI,MAAO,IAAI;AACvB,aAAO,EAAE,OAAO,SAAS,GAAG,KAAK,mBAAkB;IACrD;EACF;AAEA,SAAO;AACT;AAKA,SAAS,qBAAqB,QAAe;AAC3C,SAAO,qBAAqB,QAAQ,CAAC,OAAO,CAAC;AAC/C;AAKA,SAAS,kBAAkB,QAAe;AACxC,SAAO,qBAAqB,QAAQ,CAAC,YAAY,CAAC;AACpD;AAKA,SAAS,oBAAoB,QAAe;AAC1C,SAAO,qBAAqB,QAAQ,CAAC,OAAO,CAAC;AAC/C;AAKA,SAAS,yBAAyB,QAAe;AAC/C,MAAI,WAAW,QAAQ,WAAW,QAAW;AAC3C,WAAO,EAAE,OAAO,UAAU,SAAS,qBAAoB;EACzD;AACA,MAAI,OAAO,WAAW,UAAU;AAC9B,WAAO,EAAE,OAAO,UAAU,SAAS,2BAA0B;EAC/D;AAEA,QAAM,MAAM;AACZ,QAAM,UAAU,IAAI,SAAS,UAAa,IAAI,SAAS,QAAQ,IAAI,SAAS;AAC5E,QAAM,WAAW,IAAI,UAAU,UAAa,IAAI,UAAU,QAAQ,IAAI,UAAU;AAEhF,MAAI,CAAC,WAAW,CAAC,UAAU;AACzB,WAAO,EAAE,OAAO,cAAc,SAAS,mCAAkC;EAC3E;AAEA,SAAO;AACT;AAKA,SAAS,wBAAwB,QAAe;AAC9C,SAAO,qBAAqB,QAAQ,CAAC,OAAO,CAAC;AAC/C;AAKA,SAAS,mBAAmB,IAA4B,OAAsB;AAC5E,SAAO;IACL,SAAS;IACT;IACA,OAAO;MACL,MAAM,qBAAqB;MAC3B,SAAS,mBAAmB,MAAM,OAAO;MACzC,MAAM,EAAE,OAAO,MAAM,MAAK;;;AAGhC;AA0FA,SAAS,mBAAmB,SAA4B;AACtD,QAAM,EAAE,UAAAA,WAAU,cAAc,WAAW,QAAQ,OAAO,OAAM,IAAK;AACrE,QAAMC,UAAS,aAAa,EAAE,MAAMD,UAAS,MAAM,OAAO,SAAQ,CAAE;AACpE,QAAM,SAAS,QAAQ,GAAG,KAAK,YAAY;AAC3C,QAAM,UAAU,IAAI,cAAa;AACjC,QAAM,UAAU,IAAI,cAAa;AAEjC,EAAAC,QAAO,KAAK,YAAY,MAAM,KAAKD,UAAS,WAAW,KAAKA,UAAS,OAAO,EAAE;AAE9E,QAAM,KAAK,gBAAgB;IACzB,OAAO,QAAQ;IACf,UAAU;GACX;AAED,KAAG,GAAG,QAAQ,CAAC,SAAQ;AACrB,SAAK,WAAW,MAAMA,WAAU,cAAc,QAAQC,SAAQ,SAAS,OAAO;EAChF,CAAC;AAED,KAAG,GAAG,SAAS,MAAK;AAClB,IAAAA,QAAO,KAAK,6BAA6B;AACzC,YAAQ,UAAS;AACjB,YAAQ,UAAS;AACjB,YAAQ,KAAK,CAAC;EAChB,CAAC;AAED,UAAQ,GAAG,qBAAqB,CAAC,UAAS;AACxC,IAAAA,QAAO,MAAM,sBAAsB,KAAK;AACxC,YAAQ,KAAK,CAAC;EAChB,CAAC;AAED,UAAQ,GAAG,sBAAsB,CAAC,WAAU;AAC1C,IAAAA,QAAO,MAAM,uBAAuB,MAAM;EAC5C,CAAC;AACH;AAQA,SAAS,kBAAkB,KAA4B;AACrD,MAAI,IAAI,WAAW;AAAW,WAAO;AACrC,MAAI,IAAI,OAAO,UAAa,IAAI,OAAO;AAAM,WAAO;AACpD,SAAO,YAAY,OAAO,WAAW;AACvC;AAEA,eAAe,WACb,MACAD,WACA,cACA,QACAC,SACA,SACA,SAAsB;AAEtB,QAAM,UAAU,KAAK,KAAI;AACzB,MAAI,CAAC;AAAS;AAMd,MAAI;AACJ,MAAI;AACF,aAAS,KAAK,MAAM,OAAO;EAC7B,QAAQ;EAER;AAEA,MAAI,UAAU,kBAAkB,MAAM,GAAG;AACvC,IAAAA,QAAO,MAAM,gCAAgC,EAAE,IAAI,OAAO,GAAE,CAAE;AAC9D,QAAI,CAAC,QAAQ,eAAe,OAAO,GAAG;AACpC,cAAQ,eAAe,OAAO;IAChC;AACA;EACF;AAEA,MAAI,KAA6B;AAEjC,MAAI;AACF,UAAM,UAAW,UAAU,KAAK,MAAM,OAAO;AAC7C,SAAK,QAAQ;AAEb,IAAAA,QAAO,MAAM,qBAAqB,QAAQ,MAAM,IAAI,EAAE,IAAI,QAAQ,GAAE,CAAE;AAMtE,UAAM,WAAW,MAAM,uBAAuB,QAAQ,IAAI,MACxD,cAAc,SAASD,WAAU,cAAc,QAAQC,SAAQ,SAAS,OAAO,CAAC;AAElF,QAAI,aAAa,MAAM;AACrB,oBAAc,QAAQ;IACxB;EACF,SAAS,OAAO;AACd,QAAI,iBAAiB,aAAa;AAChC,oBAAc;QACZ,SAAS;QACT,IAAI;QACJ,OAAO;UACL,MAAM,qBAAqB;UAC3B,SAAS;;OAEZ;IACH,WAAW,iBAAiB,aAAa;AACvC,oBAAc;QACZ,SAAS;QACT;QACA,OAAO,MAAM,eAAc;OAC5B;IACH,OAAO;AACL,YAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU;AACzD,MAAAA,QAAO,MAAM,kBAAkB,KAAK;AACpC,oBAAc;QACZ,SAAS;QACT;QACA,OAAO;UACL,MAAM,qBAAqB;UAC3B;;OAEH;IACH;EACF;AACF;AAEA,eAAe,cACb,SACAD,WACA,cACA,QACAC,SACA,SACA,SAAsB;AAEtB,QAAM,EAAE,QAAQ,QAAQ,GAAE,IAAK;AAG/B,UAAQ,QAAQ;IACd,KAAK,cAAc;AACjB,YAAM,aAAc,UAAU,CAAA;AAG9B,iBAAW,UAAU;AACrB,iBAAW,UAAU;AACrB,UAAI,cAAc;AAChB,cAAM,aAAa,UAAU;MAC/B;AACA,aAAO,EAAE,SAAS,OAAO,IAAI,QAAQD,UAAQ;IAC/C;IAEA,KAAK;AACH,aAAO,EAAE,SAAS,OAAO,IAAI,QAAQ,OAAM;IAE7C,KAAK,YAAY;AACf,MAAAC,QAAO,KAAK,oBAAoB;AAChC,cAAQ,UAAS;AACjB,cAAQ,UAAS;AACjB,YAAMC,YAA4B,EAAE,SAAS,OAAO,IAAI,QAAQ,KAAI;AACpE,cAAQ,OAAO,MAAM,GAAG,KAAK,UAAUA,SAAQ,CAAC;GAAM,MAAK;AACzD,gBAAQ,KAAK,CAAC;MAChB,CAAC;AAED,aAAO;IACT;EACF;AAGA,QAAM,WAAW,MAAM,OAAO,QAAQ,QAAQ,EAAE;AAChD,MAAI,aAAa,MAAM;AACrB,WAAO;EACT;AAGA,SAAO;IACL,SAAS;IACT;IACA,OAAO;MACL,MAAM,qBAAqB;MAC3B,SAAS,qBAAqB,MAAM;;;AAG1C;AAEA,SAAS,cAAc,UAAyB;AAC9C,UAAQ,OAAO,MAAM,GAAG,KAAK,UAAU,QAAQ,CAAC;CAAI;AACtD;AAMA,SAAS,eAAe,IAA4B,SAAe;AACjE,SAAO;IACL,SAAS;IACT;IACA,OAAO;MACL,MAAM,qBAAqB;MAC3B;;;AAGN;AAEA,SAAS,QAAQ,IAA4B,QAAe;AAC1D,SAAO,EAAE,SAAS,OAAO,IAAI,OAAM;AACrC;AAyEM,SAAU,qBAAqB,SAA8B;AACjE,QAAM,EAAE,UAAAF,WAAU,UAAAG,WAAU,cAAAC,eAAc,cAAc,SAAQ,IAAK;AAGrE,QAAM,eAAeJ,UAAS,aAAa;AAC3C,MAAI,aAAa,SAAS,QAAQ,KAAK,CAACG,WAAU;AAChD,UAAM,IAAI,MACR,wFAAwF;EAE5F;AACA,MAAI,aAAa,SAAS,MAAM,KAAK,CAACC,eAAc;AAClD,UAAM,IAAI,MACR,oFAAoF;EAExF;AAEA,QAAM,SAAuB,OAAO,QAAQ,QAAQ,OAAM;AACxD,YAAQ,QAAQ;;MAEd,KAAK,0BAA0B;AAC7B,YAAI,CAACD;AAAU,iBAAO,eAAe,IAAI,8CAA8C;AACvF,cAAM,MAAM,qBAAqB,MAAM;AACvC,YAAI;AAAK,iBAAO,mBAAmB,IAAI,GAAG;AAC1C,eAAO,QAAQ,IAAI,MAAMA,UAAS,OAAO,MAA8B,CAAC;MAC1E;MACA,KAAK,uBAAuB;AAC1B,YAAI,CAACA;AAAU,iBAAO,eAAe,IAAI,8CAA8C;AACvF,cAAM,MAAM,kBAAkB,MAAM;AACpC,YAAI;AAAK,iBAAO,mBAAmB,IAAI,GAAG;AAC1C,eAAO,QAAQ,IAAI,MAAMA,UAAS,IAAI,MAA2B,CAAC;MACpE;MACA,KAAK,yBAAyB;AAC5B,YAAI,CAACA;AAAU,iBAAO,eAAe,IAAI,8CAA8C;AACvF,YAAI,CAACA,UAAS;AAAO,iBAAO,eAAe,IAAI,2CAA2C;AAC1F,cAAM,MAAM,oBAAoB,MAAM;AACtC,YAAI;AAAK,iBAAO,mBAAmB,IAAI,GAAG;AAC1C,eAAO,QAAQ,IAAI,MAAMA,UAAS,MAAM,MAA6B,CAAC;MACxE;;MAGA,KAAK,wBAAwB;AAC3B,YAAI,CAACC;AAAc,iBAAO,eAAe,IAAI,4CAA4C;AACzF,cAAM,MAAM,yBAAyB,MAAM;AAC3C,YAAI;AAAK,iBAAO,mBAAmB,IAAI,GAAG;AAC1C,eAAO,QAAQ,IAAI,MAAMA,cAAa,OAAO,MAA0B,CAAC;MAC1E;MACA,KAAK,qBAAqB;AACxB,YAAI,CAACA;AAAc,iBAAO,eAAe,IAAI,4CAA4C;AACzF,cAAM,MAAM,kBAAkB,MAAM;AACpC,YAAI;AAAK,iBAAO,mBAAmB,IAAI,GAAG;AAC1C,eAAO,QAAQ,IAAI,MAAMA,cAAa,IAAI,MAA2B,CAAC;MACxE;MACA,KAAK,uBAAuB;AAC1B,YAAI,CAACA;AAAc,iBAAO,eAAe,IAAI,4CAA4C;AACzF,YAAI,CAACA,cAAa;AAChB,iBAAO,eAAe,IAAI,yCAAyC;AACrE,cAAM,MAAM,wBAAwB,MAAM;AAC1C,YAAI;AAAK,iBAAO,mBAAmB,IAAI,GAAG;AAC1C,eAAO,QAAQ,IAAI,MAAMA,cAAa,MAAM,MAAyB,CAAC;MACxE;MAEA;AACE,eAAO;IACX;EACF;AAEA,qBAAmB,EAAE,UAAAJ,WAAU,cAAc,UAAU,OAAM,CAAE;AACjE;;;AEnkBA;AAAA,EACE,MAAQ;AAAA,EACR,SAAW;AAAA,EACX,aAAe;AAAA,EACf,MAAQ;AAAA,EACR,KAAO;AAAA,EACP,MAAQ;AAAA,EACR,OAAS;AAAA,IACP;AAAA,IACA;AAAA,EACF;AAAA,EACA,YAAc;AAAA,IACZ,MAAQ;AAAA,IACR,KAAO;AAAA,IACP,WAAa;AAAA,EACf;AAAA,EACA,SAAW;AAAA,IACT,OAAS;AAAA,IACT,KAAO;AAAA,IACP,OAAS;AAAA,IACT,OAAS;AAAA,IACT,MAAQ;AAAA,IACR,YAAY;AAAA,IACZ,WAAa;AAAA,IACb,MAAQ;AAAA,IACR,cAAc;AAAA,IACd,gBAAkB;AAAA,EACpB;AAAA,EACA,UAAY;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,QAAU;AAAA,EACV,SAAW;AAAA,EACX,SAAW;AAAA,IACT,MAAQ;AAAA,EACV;AAAA,EACA,cAAgB;AAAA,IACd,4BAA4B;AAAA,EAC9B;AAAA,EACA,iBAAmB;AAAA,IACjB,kBAAkB;AAAA,IAClB,eAAe;AAAA,IACf,SAAW;AAAA,IACX,YAAc;AAAA,IACd,QAAU;AAAA,EACZ;AACF;;;AC7CO,IAAM,sBAAsB;AAC5B,IAAM,4BAA4B;AAElC,IAAM,WAAW;AAAA,EACtB,MAAM;AAAA,EACN,aAAa;AAAA,EACb,SAAS,gBAAY;AAAA,EACrB,aACE;AAAA,EACF,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,iBAAiB;AAAA,EACjB,cAAc;AAAA;AAAA,IAEZ,kBAAkB,CAAC,UAAU,MAAM;AAAA,EACrC;AAAA,EACA,cAAc;AAAA,IACZ,aAAa;AAAA,IACb,QAAQ;AAAA,MACN;AAAA,QACE,KAAK;AAAA,QACL,OAAO;AAAA,QACP,aAAa;AAAA,QACb,MAAM;AAAA,QACN,UAAU;AAAA,QACV,SAAS;AAAA,QACT,SAAS;AAAA,MACX;AAAA,MACA;AAAA,QACE,KAAK;AAAA,QACL,OAAO;AAAA,QACP,aACE;AAAA,QACF,MAAM;AAAA,QACN,UAAU;AAAA,QACV,SAAS;AAAA,MACX;AAAA,MACA;AAAA,QACE,KAAK;AAAA,QACL,OAAO;AAAA,QACP,aACE;AAAA,QACF,MAAM;AAAA,QACN,UAAU;AAAA,QACV,SAAS;AAAA,QACT,SAAS;AAAA,MACX;AAAA,IACF;AAAA,EACF;AACF;;;AC3BA,SAAS,OAAO,SAAS,IAAI,iBAAiB;AAC9C,SAAS,cAAc;AACvB,SAAS,YAAY;AA2BrB,IAAM,gBAAgB;AACtB,IAAM,WAAW;AAEjB,IAAM,oBAAoB;AAE1B,SAAS,IAAI,OAAe,OAAuB;AACjD,SAAO,OAAO,KAAK,EAAE,SAAS,OAAO,GAAG;AAC1C;AAGA,SAAS,SAAS,MAAoB;AACpC,QAAM,IAAI,KAAK,eAAe;AAC9B,QAAM,KAAK,IAAI,KAAK,YAAY,IAAI,GAAG,CAAC;AACxC,QAAM,IAAI,IAAI,KAAK,WAAW,GAAG,CAAC;AAClC,QAAM,IAAI,IAAI,KAAK,YAAY,GAAG,CAAC;AACnC,QAAM,KAAK,IAAI,KAAK,cAAc,GAAG,CAAC;AACtC,QAAM,IAAI,IAAI,KAAK,cAAc,GAAG,CAAC;AACrC,SAAO,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC;AACxC;AAGA,SAAS,eAAe,QAAwB;AAC9C,SAAO,OAAO,QAAQ,gBAAgB,GAAG,EAAE,QAAQ,YAAY,EAAE;AACnE;AAMA,SAAS,aAAa,OAAyB;AAC7C,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,WAAO,MAAM,IAAI,YAAY;AAAA,EAC/B;AACA,MAAI,SAAS,OAAO,UAAU,UAAU;AACtC,UAAM,MAA+B,CAAC;AACtC,eAAW,CAAC,KAAK,GAAG,KAAK,OAAO,QAAQ,KAAgC,GAAG;AACzE,UAAI,GAAG,IAAI,cAAc,KAAK,GAAG,IAAI,WAAW,aAAa,GAAG;AAAA,IAClE;AACA,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAOO,SAAS,aAAa,OAGqB;AAChD,SAAO;AAAA,IACL,aAAa,aAAa,MAAM,eAAe,CAAC,CAAC;AAAA,IACjD,YAAY,aAAa,MAAM,cAAc,CAAC,CAAC;AAAA,EACjD;AACF;AAYO,IAAM,kBAAN,MAAsB;AAAA,EACV;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACT,MAAM;AAAA,EACN,QAAiC;AAAA,EAEzC,YAAY,MAA8B;AACxC,SAAK,aAAa,KAAK;AACvB,SAAK,UAAU,KAAK,WAAW;AAC/B,SAAK,WAAW,KAAK,YAAY;AACjC,SAAK,iBAAiB,KAAK;AAC3B,SAAK,SAAS,KAAK;AACnB,SAAK,MAAM,KAAK,QAAQ,MAAM,oBAAI,KAAK;AAEvC,QAAI,KAAK,SAAS;AAChB,WAAK,MAAM,KAAK,KAAK,SAAS,UAAU;AACxC,WAAK,gBAAgB;AAAA,IACvB,OAAO;AACL,WAAK,MAAM,KAAK,OAAO,GAAG,SAAS,KAAK,UAAU,IAAI,UAAU;AAChE,WAAK,gBAAgB;AAAA,IACvB;AAAA,EACF;AAAA;AAAA,EAGA,IAAI,YAAoB;AACtB,WAAO,KAAK;AAAA,EACd;AAAA;AAAA,EAGQ,YAA8B;AACpC,QAAI,CAAC,KAAK,OAAO;AACf,WAAK,QAAQ,MAAM,KAAK,KAAK,EAAE,WAAW,KAAK,CAAC,EAC7C,KAAK,MAAM;AACV,YAAI,KAAK,eAAe;AACtB,eAAK,OAAO,KAAK,0DAA0D,KAAK,GAAG,EAAE;AAAA,QACvF,OAAO;AACL,eAAK,OAAO,MAAM,yBAAyB,KAAK,GAAG,EAAE;AAAA,QACvD;AACA,eAAO;AAAA,MACT,CAAC,EACA,MAAM,CAAC,QAAiB;AACvB,cAAM,MAAM,eAAe,QAAQ,IAAI,UAAU;AACjD,aAAK,OAAO,KAAK,gCAAgC,KAAK,GAAG,KAAK,GAAG,EAAE;AACnE,eAAO;AAAA,MACT,CAAC;AAAA,IACL;AACA,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,OAAO,QAAgB,SAAkB,UAAkC;AAC/E,QAAI,CAAC,KAAK,QAAS;AACnB,QAAI,CAAE,MAAM,KAAK,UAAU,EAAI;AAE/B,UAAM,KAAK,EAAE,KAAK;AAClB,UAAM,OAAO,KAAK,IAAI;AACtB,UAAM,OAAO,GAAG,SAAS,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC,IAAI,eAAe,MAAM,CAAC;AACtE,UAAM,MAAM,KAAK,YAAY;AAE7B,UAAM,KAAK,UAAU,GAAG,IAAI,iBAAiB;AAAA,MAC3C,WAAW;AAAA,MACX,QAAQ,KAAK;AAAA,MACb;AAAA,MACA,WAAW;AAAA,MACX;AAAA,MACA,QAAQ,KAAK;AAAA,MACb,SAAS;AAAA,IACX,CAAC;AACD,UAAM,KAAK,UAAU,GAAG,IAAI,kBAAkB;AAAA,MAC5C,WAAW;AAAA,MACX,QAAQ,KAAK;AAAA,MACb;AAAA,MACA,WAAW;AAAA,MACX;AAAA,MACA,QAAQ,KAAK;AAAA,MACb,SAAS;AAAA,IACX,CAAC;AAED,UAAM,KAAK,MAAM;AAAA,EACnB;AAAA,EAEA,MAAc,UAAU,MAAc,UAAmC;AACvE,QAAI;AACF,YAAM,UAAU,KAAK,KAAK,KAAK,IAAI,GAAG,KAAK,UAAU,UAAU,MAAM,CAAC,GAAG,MAAM;AAAA,IACjF,SAAS,KAAK;AACZ,YAAM,MAAM,eAAe,QAAQ,IAAI,UAAU;AACjD,WAAK,OAAO,KAAK,gCAAgC,IAAI,KAAK,GAAG,EAAE;AAAA,IACjE;AAAA,EACF;AAAA;AAAA,EAGA,MAAc,QAAuB;AACnC,QAAI,KAAK,YAAY,EAAG;AACxB,QAAI;AACF,YAAM,SAAS,MAAM,QAAQ,KAAK,GAAG,GAAG,OAAO,CAAC,MAAM,EAAE,SAAS,OAAO,CAAC,EAAE,KAAK;AAChF,YAAM,SAAS,MAAM,SAAS,KAAK;AACnC,UAAI,UAAU,EAAG;AACjB,iBAAW,QAAQ,MAAM,MAAM,GAAG,MAAM,GAAG;AACzC,cAAM,GAAG,KAAK,KAAK,KAAK,IAAI,GAAG,EAAE,OAAO,KAAK,CAAC;AAAA,MAChD;AAAA,IACF,SAAS,KAAK;AACZ,YAAM,MAAM,eAAe,QAAQ,IAAI,UAAU;AACjD,WAAK,OAAO,KAAK,+BAA+B,KAAK,GAAG,KAAK,GAAG,EAAE;AAAA,IACpE;AAAA,EACF;AACF;;;AChNA,IAAM,SAAS,aAAa,EAAE,MAAM,QAAQ,OAAO,QAAQ,CAAC;AAG5D,IAAM,SAAS;AAAA,EACb,YAAY;AACd;AAGA,IAAI,WAAmC;AAGvC,eAAe,IAAO,QAAgB,QAAiB,UAAyB;AAC9E,QAAM,UAAU,OAAO,QAAQ,QAAQ,QAAQ;AAC/C,SAAO;AACT;AAKA,SAAS,iBAAiB,QAAgB,OAAuB;AAC/D,SAAO,GAAG,MAAM,KAAK,mBAAmB,KAAK,CAAC;AAChD;AAEA,SAAS,iBAAiB,YAA8D;AACtF,QAAM,MAAM,WAAW,QAAQ,IAAI;AACnC,MAAI,QAAQ,IAAI;AACd,WAAO,EAAE,QAAQ,YAAY,OAAO,KAAK;AAAA,EAC3C;AACA,SAAO;AAAA,IACL,QAAQ,WAAW,MAAM,GAAG,GAAG;AAAA,IAC/B,OAAO,mBAAmB,WAAW,MAAM,MAAM,CAAC,CAAC;AAAA,EACrD;AACF;AAGA,SAAS,oBAAoB,OAAe,YAAoB;AAC9D,QAAM,UAAU,CAAC;AACjB,QAAM,QAAQ,KAAK,IAAI,KAAK,IAAI,GAAG,UAAU,GAAG,EAAE;AAElD,WAAS,IAAI,GAAG,KAAK,OAAO,KAAK;AAC/B,YAAQ,KAAK;AAAA,MACX,YAAY,iBAAiB,QAAQ,CAAC,IAAI,KAAK;AAAA,MAC/C,OAAO,MAAM,IAAI,SAAS,KAAK,KAAK,eAAe,CAAC,SAAS,KAAK;AAAA,MAClE,iBAAiB,MAAM,IAAI,CAAC,iBAAiB,KAAK,EAAE,IAAI,CAAC;AAAA,MACzD,OAAM,oBAAI,KAAK,GAAE,YAAY;AAAA,MAC7B,gBAAgB,KAAK,IAAI,KAAK,KAAO,IAAI,KAAK,GAAG;AAAA;AAAA,MACjD,SAAS;AAAA,QACP,QAAQ,IAAI,MAAM,IAAI,YAAY;AAAA,QAClC,QAAQ,MAAM,IAAI,CAAC,QAAQ,MAAM,IAAI,CAAC,MAAM;AAAA,QAC5C,QAAQ,MAAM,IAAI,KAAO;AAAA,QACzB,aACE,MAAM,IACF,yBAAyB,KAAK,MAC9B,UAAU,CAAC,4BAA4B,KAAK;AAAA,MACpD;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAEA,IAAM,WAA6B;AAAA,EACjC,MAAM,OAAO,QAA+D;AAE1E,WAAO,IAA4B,0BAA0B,QAAQ;AAAA,MACnE,SAAS,oBAAoB,OAAO,OAAO,OAAO,UAAU;AAAA,IAC9D,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,IAAI,QAA0D;AAGlE,UAAM,EAAE,QAAQ,MAAM,IAAI,iBAAiB,OAAO,UAAU;AAC5D,UAAM,QAAQ,SAAS,gBAAgB,MAAM;AAG7C,WAAO,IAA0B,uBAAuB,QAAQ;AAAA,MAC9D,YAAY,OAAO;AAAA,MACnB,aAAa,mCAAmC,MAAM;AAAA,MACtD;AAAA,MACA,iBAAiB;AAAA,QACf,EAAE,OAAO,UAAU,MAAM,WAAW,UAAU;AAAA,QAC9C,EAAE,OAAO,GAAG,KAAK,aAAa,UAAU,MAAM,WAAW,SAAS;AAAA,QAClE,EAAE,OAAO,GAAG,KAAK,aAAa,UAAU,WAAW,WAAW,SAAS;AAAA,MACzE;AAAA,MACA,SAAS,kCAAkC,KAAK,UAAU,MAAM;AAAA,MAChE,QAAQ;AAAA,MACR,MAAM;AAAA;AAAA,MAGN,kBAAkB;AAAA,MAClB,UAAU;AAAA,MACV,WAAW;AAAA,MACX,kBAAkB;AAAA;AAAA,MAGlB,QAAQ,CAAC,UAAU,UAAU,QAAQ,MAAM;AAAA,MAC3C,MAAM,CAAC,eAAe,QAAQ,cAAc,aAAa;AAAA;AAAA,MAGzD,SAAS;AAAA,QACP,EAAE,MAAM,eAAe,MAAM,SAAS;AAAA,QACtC,EAAE,MAAM,eAAe,MAAM,SAAS;AAAA,MACxC;AAAA,MACA,SAAS,CAAC,aAAa;AAAA,MACvB,WAAW;AAAA;AAAA,MAGX,UAAU;AAAA,MACV,WAAW;AAAA;AAAA,MAGX,QAAQ;AAAA,QACN,OAAO;AAAA,QACP,WAAW;AAAA,QACX,QAAQ;AAAA,MACV;AAAA;AAAA,MAGA,iBAAiB;AAAA,QACf;AAAA,UACE,OAAO;AAAA,UACP,WAAW;AAAA,UACX,QAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAO;AAAA,UACP,WAAW;AAAA,UACX,QAAQ;AAAA,QACV;AAAA,QACA;AAAA,UACE,OAAO;AAAA,UACP,WAAW;AAAA,UACX,QAAQ;AAAA,QACV;AAAA,MACF;AAAA;AAAA,MAGA,eAAe;AAAA,QACb;AAAA,UACE,KAAK,mCAAmC,MAAM;AAAA,UAC9C,OAAO;AAAA,UACP,UAAU;AAAA,QACZ;AAAA,QACA;AAAA,UACE,KAAK;AAAA,UACL,OAAO;AAAA,UACP,UAAU;AAAA,QACZ;AAAA,QACA;AAAA,UACE,KAAK;AAAA,UACL,OAAO;AAAA,UACP,UAAU;AAAA,QACZ;AAAA,QACA;AAAA,UACE,KAAK;AAAA,UACL,OAAO;AAAA,UACP,UAAU;AAAA,QACZ;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,MAAM,QAA6D;AAEvE,UAAM,kBAAkB,OAAO,MAAM,YAAY,EAAE,QAAQ,QAAQ,GAAG;AACtE,WAAO,IAA2B,yBAAyB,QAAQ;AAAA,MACjE,OAAO;AAAA,QACL,YAAY,SAAS,eAAe;AAAA,QACpC,OAAO,OAAO;AAAA,QACd,iBAAiB,CAAC;AAAA,QAClB,MAAM,OAAO;AAAA,QACb,gBAAgB;AAAA,QAChB,SAAS;AAAA,UACP,QAAQ;AAAA,UACR,QAAQ,CAAC,SAAS;AAAA,UAClB,aAAa,wBAAwB,OAAO,KAAK;AAAA,QACnD;AAAA,MACF;AAAA,MACA,YAAY;AAAA,MACZ,cAAc;AAAA,QACZ;AAAA,UACE,YAAY;AAAA,UACZ,OAAO,gBAAgB,OAAO,KAAK;AAAA,UACnC,iBAAiB,CAAC;AAAA,UAClB,gBAAgB;AAAA,QAClB;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AACF;AAOA,SAAS,wBAAwB,QAA0B,YAAoB;AAC7E,QAAM,UAAU,CAAC;AACjB,QAAM,QAAQ,KAAK,IAAI,KAAK,IAAI,GAAG,UAAU,GAAG,EAAE;AAClD,QAAM,aAAa,OAAO,QAAQ,OAAO,SAAS;AAElD,WAAS,IAAI,GAAG,KAAK,OAAO,KAAK;AAC/B,UAAM,eAAe,CAAC,CAAC,OAAO;AAC9B,YAAQ,KAAK;AAAA,MACX,YAAY,iBAAiB,aAAa,CAAC,IAAI,UAAU;AAAA,MACzD,OAAO,MAAM,IAAI,cAAc,UAAU,KAAK,oBAAoB,CAAC,SAAS,UAAU;AAAA,MACtF,iBAAiB,MAAM,IAAI,CAAC,eAAe,UAAU,EAAE,IAAI,CAAC;AAAA,MAC5D,MAAM,OAAO,SAAQ,oBAAI,KAAK,GAAE,YAAY;AAAA,MAC5C,gBAAgB,eAAe,IAAM,KAAK,IAAI,KAAK,KAAO,IAAI,KAAK,GAAG;AAAA,MACtE,SAAS;AAAA,QACP,QAAQ,IAAI,MAAM,IAAI,YAAY;AAAA,QAClC,QAAQ,MAAM,IAAI,CAAC,QAAQ,QAAQ,MAAM,IAAI,CAAC,QAAQ,MAAM;AAAA,QAC5D,QAAQ,MAAM,IAAI,IAAM;AAAA,QACxB,aACE,MAAM,IACF,eAAe,eAAe,YAAY,UAAU,MAAM,UAAU,MACpE,eAAe,CAAC;AAAA,MACxB;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAEA,IAAM,eAAqC;AAAA,EACzC,MAAM,OAAO,QAA2D;AAEtE,WAAO,IAA4B,wBAAwB,QAAQ;AAAA,MACjE,SAAS,wBAAwB,QAAQ,OAAO,UAAU;AAAA,IAC5D,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,IAAI,QAAwD;AAGhE,UAAM,EAAE,QAAQ,MAAM,IAAI,iBAAiB,OAAO,UAAU;AAC5D,UAAM,QAAQ,SAAS,cAAc,MAAM;AAG3C,WAAO,IAAwB,qBAAqB,QAAQ;AAAA,MAC1D,YAAY,OAAO;AAAA,MACnB,aAAa,iCAAiC,MAAM;AAAA,MACpD;AAAA,MACA,UAAU;AAAA,MACV,iBAAiB;AAAA,QACf,EAAE,OAAO,UAAU,MAAM,WAAW,UAAU;AAAA,QAC9C,EAAE,OAAO,GAAG,KAAK,aAAa,UAAU,MAAM,WAAW,SAAS;AAAA,MACpE;AAAA,MACA,SAAS,uCAAuC,KAAK,UAAU,MAAM;AAAA,MACrE,UAAU;AAAA;AAAA,MAGV,QAAQ;AAAA,MACR,WAAW;AAAA,MACX,aAAa;AAAA,MACb,MAAM;AAAA;AAAA,MAGN,MAAM;AAAA,MACN,OAAO,CAAC,qBAAqB,eAAe;AAAA;AAAA,MAG5C,SAAS;AAAA,MACT,eAAe;AAAA,MACf,cAAc;AAAA,MACd,YAAY;AAAA,MACZ,UAAU;AAAA;AAAA,MAGV,gBAAgB;AAAA,MAChB,aAAa;AAAA;AAAA,MAGb,QAAQ,CAAC,WAAW,QAAQ,MAAM;AAAA,MAClC,MAAM,CAAC,eAAe,QAAQ,WAAW;AAAA,MACzC,UAAU,CAAC,WAAW,oBAAoB;AAAA;AAAA,MAG1C,SAAS;AAAA,QACP,EAAE,MAAM,eAAe,MAAM,UAAU,UAAU,eAAe;AAAA,QAChE,EAAE,MAAM,eAAe,MAAM,aAAa,UAAU,eAAe;AAAA,QACnE,EAAE,MAAM,eAAe,MAAM,SAAS;AAAA,MACxC;AAAA,MACA,SAAS,CAAC,kBAAkB;AAAA,MAC5B,WAAW;AAAA;AAAA,MAGX,UAAU;AAAA,MACV,QAAQ;AAAA,QACN,EAAE,KAAK,iCAAiC,OAAO,KAAK,QAAQ,KAAK,MAAM,SAAS;AAAA,QAChF,EAAE,KAAK,iCAAiC,OAAO,KAAK,QAAQ,KAAK,MAAM,QAAQ;AAAA,QAC/E,EAAE,KAAK,iCAAiC,OAAO,KAAK,QAAQ,KAAK,MAAM,QAAQ;AAAA,MACjF;AAAA;AAAA,MAGA,QAAQ;AAAA,QACN,OAAO;AAAA,QACP,WAAW;AAAA,QACX,QAAQ;AAAA,MACV;AAAA,MACA,iBAAiB;AAAA,QACf,EAAE,OAAO,IAAI,WAAW,KAAK,QAAQ,OAAO;AAAA,QAC5C,EAAE,OAAO,IAAI,WAAW,KAAO,QAAQ,YAAY;AAAA,MACrD;AAAA;AAAA,MAGA,QAAQ;AAAA,QACN,EAAE,MAAM,cAAc,MAAM,MAAM,UAAU,kBAAkB,KAAK,KAAK;AAAA,QACxE,EAAE,MAAM,cAAc,MAAM,MAAM,UAAU,yBAAyB,KAAK,MAAM;AAAA,MAClF;AAAA;AAAA,MAGA,eAAe;AAAA,QACb;AAAA,UACE,KAAK,iCAAiC,MAAM;AAAA,UAC5C,OAAO;AAAA,UACP,UAAU;AAAA,QACZ;AAAA,QACA;AAAA,UACE,KAAK;AAAA,UACL,OAAO;AAAA,UACP,UAAU;AAAA,QACZ;AAAA,QACA;AAAA,UACE,KAAK;AAAA,UACL,OAAO;AAAA,UACP,UAAU;AAAA,QACZ;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,MAAM,QAAyD;AAEnE,UAAM,aAAa,OAAO,QAAQ,OAAO;AACzC,UAAM,eAAe,WAAW,YAAY,EAAE,QAAQ,UAAU,EAAE;AAClE,UAAM,cAAc,CAAC,CAAC,OAAO;AAE7B,WAAO,IAA2B,uBAAuB,QAAQ;AAAA,MAC/D,OAAO;AAAA,QACL,YAAY,cAAc,YAAY;AAAA,QACtC,OAAO,OAAO;AAAA,QACd,iBAAiB,CAAC;AAAA,QAClB,MAAM,OAAO;AAAA,QACb,gBAAgB,cAAc,IAAM;AAAA,QACpC,SAAS;AAAA,UACP,QAAQ;AAAA,UACR,QAAQ,CAAC,WAAW,MAAM;AAAA,UAC1B,aAAa,cACT,oBAAoB,OAAO,IAAI,KAC/B,wBAAwB,OAAO,KAAK;AAAA,QAC1C;AAAA,MACF;AAAA,MACA,YAAY,cAAc,OAAO;AAAA,MACjC,cAAc,cACV,CAAC,IACD;AAAA,QACE;AAAA,UACE,YAAY;AAAA,UACZ,OAAO,gBAAgB,OAAO,KAAK;AAAA,UACnC,iBAAiB,CAAC;AAAA,UAClB,gBAAgB;AAAA,QAClB;AAAA,MACF;AAAA,IACN,CAAC;AAAA,EACH;AACF;AAMA,qBAAqB;AAAA,EACnB;AAAA,EACA;AAAA;AAAA,EACA;AAAA;AAAA,EACA,UAAU;AAAA,EACV,aAAa,QAA0B;AAErC,UAAM,aAAa,OAAO,aAAa;AACvC,QAAI,eAAe,QAAW;AAC5B,aAAO,aAAa,KAAK,IAAI,KAAK,IAAI,GAAG,UAAU,GAAG,EAAE;AAAA,IAC1D;AAGA,UAAM,iBAAiB,OAAO,aAAa,mBAAmB;AAC9D,UAAM,kBACJ,OAAO,OAAO,aAAa,oBAAoB,WAC3C,OAAO,YAAY,kBACnB;AACN,eAAW,IAAI,gBAAgB;AAAA,MAC7B,YAAY,SAAS;AAAA,MACrB,SAAS,OAAO;AAAA,MAChB,SAAS;AAAA,MACT,UAAU;AAAA,MACV,gBAAgB,aAAa;AAAA,QAC3B,aAAa,OAAO;AAAA,QACpB,YAAY,OAAO;AAAA,MACrB,CAAC;AAAA,MACD;AAAA,IACF,CAAC;AAED,WAAO;AAAA,MACL,wCAAwC,OAAO,UAAU,qBAAqB,cAAc;AAAA,IAC9F;AAAA,EACF;AACF,CAAC;AAED,OAAO,KAAK,qBAAqB;",
|
|
6
6
|
"names": ["manifest", "logger", "response", "provider", "bookProvider"]
|
|
7
7
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ashdev/codex-plugin-metadata-echo",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.36.1",
|
|
4
4
|
"description": "Echo metadata plugin for testing Codex plugin protocol",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"bin": "dist/index.js",
|
|
@@ -38,7 +38,7 @@
|
|
|
38
38
|
"node": ">=22.0.0"
|
|
39
39
|
},
|
|
40
40
|
"dependencies": {
|
|
41
|
-
"@ashdev/codex-plugin-sdk": "^1.
|
|
41
|
+
"@ashdev/codex-plugin-sdk": "^1.36.1"
|
|
42
42
|
},
|
|
43
43
|
"devDependencies": {
|
|
44
44
|
"@biomejs/biome": "^2.4.4",
|