@undesirables/plugin-tcg-oracle 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ Business Source License 1.1
2
+
3
+ Parameters
4
+
5
+ Licensor: The Undesirables LLC
6
+ Licensed Work: plugin-undesirables
7
+ The Licensed Work is (c) 2026 The Undesirables LLC
8
+ Additional Use Grant: You may use the Licensed Work for non-production purposes,
9
+ personal projects, and evaluation. Production use requires
10
+ a commercial license from The Undesirables LLC.
11
+ Change Date: 2030-04-24
12
+ Change License: MIT
13
+
14
+ Notice
15
+
16
+ The Business Source License (this document, or the "License") is not an Open
17
+ Source license. However, the Licensed Work will eventually be made available
18
+ under an Open Source License, as stated in this License.
19
+
20
+ For more information on the Business Source License, please visit:
21
+ https://mariadb.com/bsl11/
package/README.md ADDED
@@ -0,0 +1,119 @@
1
+ # @undesirables/plugin-tcg-oracle
2
+
3
+ ![TCG Oracle Banner](./images/banner.jpg)
4
+
5
+ [![npm](https://img.shields.io/npm/v/@undesirables/plugin-tcg-oracle)](https://www.npmjs.com/package/@undesirables/plugin-tcg-oracle)
6
+ [![License: BUSL-1.1](https://img.shields.io/badge/License-BUSL--1.1-blue)](LICENSE)
7
+
8
+ > Give any ElizaOS agent real trading card market intelligence — search 370K+ products, grade cards with AI vision, and simulate future prices with Monte Carlo models.
9
+
10
+ ---
11
+
12
+ ## Why This Exists
13
+
14
+ The trading card market is worth **$50 billion** and growing. Millions of people buy, sell, and grade cards every day. But the tools available to them are fragmented: you check prices on one site, send cards to PSA for $50+ and wait weeks for a grade, and have no way to forecast whether a card is going up or down.
15
+
16
+ This plugin gives your ElizaOS agent the ability to do all of that in one conversation:
17
+
18
+ 1. **"Search for Charizard cards"** → Instantly searches 370K+ real products across 25 games
19
+ 2. **"Grade this card"** → AI vision analyzes centering, corners, edges, surface → predicts PSA/Beckett score
20
+ 3. **"Simulate Charizard VMAX at $350 for 60 days"** → Runs 10,000 Monte Carlo simulations using Heston, Merton, or Kou stochastic models → returns percentile price bands
21
+ 4. **"Show me the Pokemon market"** → Pulls the latest daily market snapshot with top movers and volume trends
22
+
23
+ No API keys required from third parties. You just point it at the TCG Oracle server (self-hosted or public).
24
+
25
+ ---
26
+
27
+ ## Quick Start
28
+
29
+ ```bash
30
+ npm install @undesirables/plugin-tcg-oracle
31
+ ```
32
+
33
+ Add to your ElizaOS character file:
34
+
35
+ ```json
36
+ {
37
+ "plugins": ["@undesirables/plugin-tcg-oracle"],
38
+ "settings": {
39
+ "TCG_ORACLE_URL": "https://oracle.the-undesirables.com"
40
+ }
41
+ }
42
+ ```
43
+
44
+ Start your agent:
45
+
46
+ ```bash
47
+ elizaos start --character your-character.json
48
+ ```
49
+
50
+ That's it. Your agent can now search cards, grade images, and run simulations.
51
+
52
+ ---
53
+
54
+ ## Actions
55
+
56
+ | Action | What It Does | Example Prompt |
57
+ |--------|-------------|----------------|
58
+ | `TCG_ORACLE_SEARCH` | Search 370K+ products by card name, set, or keyword | "Search for Base Set Charizard" |
59
+ | `TCG_ORACLE_GRADE` | Grade a card image URL — returns PSA/Beckett prediction | "Grade this card: https://..." |
60
+ | `TCG_ORACLE_SIMULATE` | Monte Carlo price forecast with 3 stochastic models | "Simulate Charizard at $350 for 60 days" |
61
+ | `TCG_ORACLE_MARKET` | Pull the latest daily market snapshot for any game | "Show me the Pokemon market" |
62
+
63
+ ---
64
+
65
+ ## Supported Games (25)
66
+
67
+ Pokémon · Magic: The Gathering · Yu-Gi-Oh! · Disney Lorcana · One Piece · Flesh and Blood · Star Wars: Unlimited · Dragon Ball Super · Digimon · MetaZoo · Union Arena · Gundam Card Game · LoL Riftbound · and 12 more via TCGCSV
68
+
69
+ ---
70
+
71
+ ## How the Data Works
72
+
73
+ All market data comes from [TCGCSV](https://tcgcsv.com) — a community project that snapshots pricing data daily for 25 TCG games. Our GitLab CI pipeline automatically refreshes this data every 24 hours. The full dataset (370K+ products) is also available on [Kaggle](https://www.kaggle.com/datasets/sailorpepe/tcg-market-intelligence).
74
+
75
+ **Monte Carlo models explained:**
76
+ - **Heston** — Models volatility itself as stochastic (volatility changes over time). Best for cards with unpredictable hype cycles.
77
+ - **Merton** — Adds random jumps to the price process. Best for cards that can spike on tournament results or reprints.
78
+ - **Kou** — Uses double-exponential jump distribution. Best for modeling asymmetric risk (big upside spikes vs gradual decline).
79
+
80
+ ---
81
+
82
+ ## Self-Hosting
83
+
84
+ You can run your own TCG Oracle server instead of using the public API:
85
+
86
+ ```bash
87
+ pip install undesirables-mcp-server
88
+ undesirables-mcp --workspace ./my-workspace
89
+ ```
90
+
91
+ Then point `TCG_ORACLE_URL` to `http://localhost:8000`.
92
+
93
+ ---
94
+
95
+ ## Configuration
96
+
97
+ | Setting | Description | Required |
98
+ |---------|-------------|----------|
99
+ | `TCG_ORACLE_URL` | Base URL of the TCG Oracle API | Yes |
100
+
101
+ ---
102
+
103
+ ## Architecture
104
+
105
+ This is a **native TypeScript** ElizaOS plugin. It runs natively in the ElizaOS Node.js runtime — no Python subprocess, no external CLI tools. It calls the TCG Oracle REST API via `fetch()` with 30-second timeouts and structured `parameters` for v2 LLM parameter extraction.
106
+
107
+ ---
108
+
109
+ ## Related Projects
110
+
111
+ - [undesirables-mcp-server](https://github.com/sailorpepe/undesirables-mcp-server) — 36-tool MCP server (Glama Registry, PyPI)
112
+ - [plugin-undesirables](https://github.com/sailorpepe/plugin-undesirables) — Soul personality plugin for ElizaOS
113
+ - [tcg-oracle-tools](https://pypi.org/project/tcg-oracle-tools/) — Python SDK for TCG market analysis
114
+
115
+ ---
116
+
117
+ ## License
118
+
119
+ [BUSL-1.1](LICENSE) — Business Source License 1.1. Copyright © 2026 The Undesirables LLC.
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/index.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,184 @@
1
+ import { describe, it, expect, vi, beforeEach } from "vitest";
2
+ // Mock fetch globally
3
+ const mockFetch = vi.fn();
4
+ vi.stubGlobal("fetch", mockFetch);
5
+ describe("plugin-tcg-oracle", () => {
6
+ beforeEach(() => {
7
+ vi.clearAllMocks();
8
+ });
9
+ describe("Plugin Structure", () => {
10
+ it("should export a valid ElizaOS v2 plugin", async () => {
11
+ const plugin = (await import("./index.js")).default;
12
+ expect(plugin.name).toBe("@undesirables/plugin-tcg-oracle");
13
+ expect(plugin.description).toBeTruthy();
14
+ expect(plugin.actions).toHaveLength(4);
15
+ expect(plugin.providers).toHaveLength(1);
16
+ expect(plugin.evaluators).toEqual([]);
17
+ });
18
+ it("should have correct action names", async () => {
19
+ const plugin = (await import("./index.js")).default;
20
+ const names = plugin.actions.map((a) => a.name);
21
+ expect(names).toContain("TCG_ORACLE_SEARCH");
22
+ expect(names).toContain("TCG_ORACLE_GRADE");
23
+ expect(names).toContain("TCG_ORACLE_SIMULATE");
24
+ expect(names).toContain("TCG_ORACLE_MARKET");
25
+ });
26
+ it("should have a named provider", async () => {
27
+ const plugin = (await import("./index.js")).default;
28
+ const provider = plugin.providers[0];
29
+ expect(provider.name).toBe("tcg-oracle");
30
+ expect(provider.description).toBeTruthy();
31
+ expect(typeof provider.get).toBe("function");
32
+ });
33
+ it("actions should have examples with v2 format (name + content)", async () => {
34
+ const plugin = (await import("./index.js")).default;
35
+ for (const action of plugin.actions) {
36
+ expect(action.examples).toBeDefined();
37
+ expect(action.examples.length).toBeGreaterThanOrEqual(1);
38
+ for (const exampleGroup of action.examples) {
39
+ for (const example of exampleGroup) {
40
+ expect(example).toHaveProperty("name");
41
+ expect(example).toHaveProperty("content");
42
+ }
43
+ }
44
+ }
45
+ });
46
+ it("all actions should have structured parameters", async () => {
47
+ const plugin = (await import("./index.js")).default;
48
+ for (const action of plugin.actions) {
49
+ expect(action.parameters).toBeDefined();
50
+ expect(action.parameters.length).toBeGreaterThanOrEqual(1);
51
+ for (const param of action.parameters) {
52
+ expect(param).toHaveProperty("name");
53
+ expect(param).toHaveProperty("description");
54
+ expect(param).toHaveProperty("schema");
55
+ }
56
+ }
57
+ });
58
+ it("all actions should have similes for discoverability", async () => {
59
+ const plugin = (await import("./index.js")).default;
60
+ for (const action of plugin.actions) {
61
+ expect(action.similes).toBeDefined();
62
+ expect(action.similes.length).toBeGreaterThanOrEqual(3);
63
+ }
64
+ });
65
+ });
66
+ describe("Action Validation", () => {
67
+ it("search action should reject when TCG_ORACLE_URL is not set", async () => {
68
+ const plugin = (await import("./index.js")).default;
69
+ const searchAction = plugin.actions.find((a) => a.name === "TCG_ORACLE_SEARCH");
70
+ const mockRuntime = {
71
+ getSetting: vi.fn().mockReturnValue(""),
72
+ agentId: "test-agent",
73
+ };
74
+ const isValid = await searchAction.validate(mockRuntime);
75
+ expect(isValid).toBe(false);
76
+ });
77
+ it("search action should accept when TCG_ORACLE_URL is set", async () => {
78
+ const plugin = (await import("./index.js")).default;
79
+ const searchAction = plugin.actions.find((a) => a.name === "TCG_ORACLE_SEARCH");
80
+ const mockRuntime = {
81
+ getSetting: vi.fn().mockReturnValue("https://oracle.the-undesirables.com"),
82
+ agentId: "test-agent",
83
+ };
84
+ const isValid = await searchAction.validate(mockRuntime);
85
+ expect(isValid).toBe(true);
86
+ });
87
+ });
88
+ describe("API Client Error Handling", () => {
89
+ it("search handler should return error when API is unreachable", async () => {
90
+ const plugin = (await import("./index.js")).default;
91
+ const searchAction = plugin.actions.find((a) => a.name === "TCG_ORACLE_SEARCH");
92
+ mockFetch.mockRejectedValueOnce(new Error("ECONNREFUSED"));
93
+ const mockRuntime = {
94
+ getSetting: vi.fn().mockReturnValue("https://oracle.the-undesirables.com"),
95
+ agentId: "test-agent",
96
+ };
97
+ const mockMessage = {
98
+ content: { text: "Search for Charizard" },
99
+ };
100
+ let callbackText = "";
101
+ const mockCallback = vi.fn(async (response) => {
102
+ callbackText = response.text;
103
+ });
104
+ const result = await searchAction.handler(mockRuntime, mockMessage, undefined, undefined, mockCallback);
105
+ expect(result).toBeDefined();
106
+ expect(result.success).toBe(false);
107
+ });
108
+ it("search handler should handle API timeout (AbortError)", async () => {
109
+ const plugin = (await import("./index.js")).default;
110
+ const searchAction = plugin.actions.find((a) => a.name === "TCG_ORACLE_SEARCH");
111
+ const abortError = new Error("The operation was aborted");
112
+ abortError.name = "AbortError";
113
+ mockFetch.mockRejectedValueOnce(abortError);
114
+ const mockRuntime = {
115
+ getSetting: vi.fn().mockReturnValue("https://oracle.the-undesirables.com"),
116
+ agentId: "test-agent",
117
+ };
118
+ const mockMessage = {
119
+ content: { text: "Search for Charizard" },
120
+ };
121
+ const mockCallback = vi.fn();
122
+ const result = await searchAction.handler(mockRuntime, mockMessage, undefined, undefined, mockCallback);
123
+ expect(result).toBeDefined();
124
+ expect(result.success).toBe(false);
125
+ expect(result.error).toContain("timed out");
126
+ });
127
+ it("grade handler should reject messages without image URLs", async () => {
128
+ const plugin = (await import("./index.js")).default;
129
+ const gradeAction = plugin.actions.find((a) => a.name === "TCG_ORACLE_GRADE");
130
+ const mockRuntime = {
131
+ getSetting: vi.fn().mockReturnValue("https://oracle.the-undesirables.com"),
132
+ agentId: "test-agent",
133
+ };
134
+ const mockMessage = {
135
+ content: { text: "Grade my card please" },
136
+ };
137
+ const mockCallback = vi.fn();
138
+ const result = await gradeAction.handler(mockRuntime, mockMessage, undefined, undefined, mockCallback);
139
+ expect(result).toBeDefined();
140
+ expect(result.success).toBe(false);
141
+ expect(result.error).toContain("No image URL");
142
+ });
143
+ it("simulate handler should reject when no price is provided", async () => {
144
+ const plugin = (await import("./index.js")).default;
145
+ const simAction = plugin.actions.find((a) => a.name === "TCG_ORACLE_SIMULATE");
146
+ const mockRuntime = {
147
+ getSetting: vi.fn().mockReturnValue("https://oracle.the-undesirables.com"),
148
+ agentId: "test-agent",
149
+ };
150
+ const mockMessage = {
151
+ content: { text: "Simulate Charizard price" },
152
+ };
153
+ const mockCallback = vi.fn();
154
+ const result = await simAction.handler(mockRuntime, mockMessage, undefined, undefined, mockCallback);
155
+ expect(result).toBeDefined();
156
+ expect(result.success).toBe(false);
157
+ });
158
+ });
159
+ describe("Provider", () => {
160
+ it("should return connected status when URL is configured", async () => {
161
+ const plugin = (await import("./index.js")).default;
162
+ const provider = plugin.providers[0];
163
+ const mockRuntime = {
164
+ getSetting: vi.fn().mockReturnValue("https://oracle.the-undesirables.com"),
165
+ agentId: "test-agent",
166
+ };
167
+ const result = await provider.get(mockRuntime, {}, {});
168
+ expect(result.text).toContain("connected");
169
+ expect(result.values?.tcgOracleStatus).toBe("connected");
170
+ });
171
+ it("should return not configured status when URL is missing", async () => {
172
+ const plugin = (await import("./index.js")).default;
173
+ const provider = plugin.providers[0];
174
+ const mockRuntime = {
175
+ getSetting: vi.fn().mockReturnValue(""),
176
+ agentId: "test-agent",
177
+ };
178
+ const result = await provider.get(mockRuntime, {}, {});
179
+ expect(result.text).toContain("not configured");
180
+ expect(result.values?.tcgOracleStatus).toBe("not configured");
181
+ });
182
+ });
183
+ });
184
+ //# sourceMappingURL=index.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.test.js","sourceRoot":"","sources":["../../src/__tests__/index.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { IAgentRuntime } from "@elizaos/core";
2
+ /**
3
+ * Validates that the TCG Oracle plugin has all required configuration.
4
+ * Called during plugin init and before each action.
5
+ */
6
+ export declare function validateTcgOracleConfig(runtime: IAgentRuntime): {
7
+ valid: boolean;
8
+ error?: string;
9
+ };
10
+ //# sourceMappingURL=environment.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"environment.d.ts","sourceRoot":"","sources":["../src/environment.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEnD;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,aAAa,GACrB;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAyBpC"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Validates that the TCG Oracle plugin has all required configuration.
3
+ * Called during plugin init and before each action.
4
+ */
5
+ export function validateTcgOracleConfig(runtime) {
6
+ const url = runtime.getSetting?.("TCG_ORACLE_URL") ||
7
+ process.env.TCG_ORACLE_URL ||
8
+ "";
9
+ if (!url) {
10
+ return {
11
+ valid: false,
12
+ error: "TCG_ORACLE_URL is required. Set it in your character.json settings " +
13
+ "or as an environment variable. Example: https://oracle.the-undesirables.com",
14
+ };
15
+ }
16
+ try {
17
+ new URL(url);
18
+ }
19
+ catch {
20
+ return {
21
+ valid: false,
22
+ error: `TCG_ORACLE_URL is not a valid URL: "${url}"`,
23
+ };
24
+ }
25
+ return { valid: true };
26
+ }
27
+ //# sourceMappingURL=environment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"environment.js","sourceRoot":"","sources":["../src/environment.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CACrC,OAAsB;IAEtB,MAAM,GAAG,GACN,OAAO,CAAC,UAAU,EAAE,CAAC,gBAAgB,CAAY;QAClD,OAAO,CAAC,GAAG,CAAC,cAAc;QAC1B,EAAE,CAAC;IAEL,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,KAAK,EACH,qEAAqE;gBACrE,6EAA6E;SAChF,CAAC;IACJ,CAAC;IAED,IAAI,CAAC;QACH,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;IACf,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,KAAK,EAAE,uCAAuC,GAAG,GAAG;SACrD,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AACzB,CAAC"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * TCG Oracle — ElizaOS Plugin v1.0.0
3
+ * ====================================
4
+ * AI-powered trading card market intelligence for ElizaOS agents.
5
+ * Native TypeScript rewrite of the Python G.A.M.E. SDK version.
6
+ *
7
+ * Features:
8
+ * - Search 370K+ TCG products across 25 games (Pokemon, MTG, Yu-Gi-Oh, etc.)
9
+ * - AI Vision card grading (PSA/Beckett prediction via Qwen VL)
10
+ * - Monte Carlo price simulation (Heston, Merton, Kou stochastic models)
11
+ * - Real-time market snapshots from TCGCSV daily data
12
+ * - License key purchase & verification (Ethereum NFT)
13
+ *
14
+ * @see https://the-undesirables.com
15
+ * @see https://github.com/sailorpepe/elizaos-tcg-oracle-plugin
16
+ */
17
+ import type { Plugin } from "@elizaos/core";
18
+ declare const SUPPORTED_GAMES: readonly ["Pokemon", "Magic: The Gathering", "Yu-Gi-Oh!", "Lorcana", "One Piece", "Flesh and Blood", "Star Wars: Unlimited", "Dragon Ball Super", "Digimon", "MetaZoo", "Union Arena", "Gundam Card Game", "LoL Riftbound"];
19
+ declare const SIMULATION_MODELS: readonly ["heston", "merton", "kou"];
20
+ declare const tcgOraclePlugin: Plugin;
21
+ export default tcgOraclePlugin;
22
+ export { SUPPORTED_GAMES, SIMULATION_MODELS };
23
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAIH,OAAO,KAAK,EACV,MAAM,EAUP,MAAM,eAAe,CAAC;AAMvB,QAAA,MAAM,eAAe,6NAcX,CAAC;AAEX,QAAA,MAAM,iBAAiB,sCAAuC,CAAC;AAoc/D,QAAA,MAAM,eAAe,EAAE,MAkBtB,CAAC;AAEF,eAAe,eAAe,CAAC;AAC/B,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,434 @@
1
+ /**
2
+ * TCG Oracle — ElizaOS Plugin v1.0.0
3
+ * ====================================
4
+ * AI-powered trading card market intelligence for ElizaOS agents.
5
+ * Native TypeScript rewrite of the Python G.A.M.E. SDK version.
6
+ *
7
+ * Features:
8
+ * - Search 370K+ TCG products across 25 games (Pokemon, MTG, Yu-Gi-Oh, etc.)
9
+ * - AI Vision card grading (PSA/Beckett prediction via Qwen VL)
10
+ * - Monte Carlo price simulation (Heston, Merton, Kou stochastic models)
11
+ * - Real-time market snapshots from TCGCSV daily data
12
+ * - License key purchase & verification (Ethereum NFT)
13
+ *
14
+ * @see https://the-undesirables.com
15
+ * @see https://github.com/sailorpepe/elizaos-tcg-oracle-plugin
16
+ */
17
+ import { validateTcgOracleConfig } from "./environment.js";
18
+ // ============================================================
19
+ // Configuration
20
+ // ============================================================
21
+ const SUPPORTED_GAMES = [
22
+ "Pokemon",
23
+ "Magic: The Gathering",
24
+ "Yu-Gi-Oh!",
25
+ "Lorcana",
26
+ "One Piece",
27
+ "Flesh and Blood",
28
+ "Star Wars: Unlimited",
29
+ "Dragon Ball Super",
30
+ "Digimon",
31
+ "MetaZoo",
32
+ "Union Arena",
33
+ "Gundam Card Game",
34
+ "LoL Riftbound",
35
+ ];
36
+ const SIMULATION_MODELS = ["heston", "merton", "kou"];
37
+ // ============================================================
38
+ // API Client
39
+ // ============================================================
40
+ function getBaseUrl(runtime) {
41
+ return (runtime.getSetting?.("TCG_ORACLE_URL") ||
42
+ process.env.TCG_ORACLE_URL ||
43
+ "");
44
+ }
45
+ async function callApi(baseUrl, endpoint, params) {
46
+ if (!baseUrl) {
47
+ return {
48
+ error: "TCG_ORACLE_URL not set. Set it in your character.json settings or as an environment variable. Install the server: pip install undesirables-mcp-server",
49
+ };
50
+ }
51
+ const url = new URL(`${baseUrl}${endpoint}`);
52
+ for (const [key, value] of Object.entries(params)) {
53
+ if (value !== undefined && value !== null && value !== "") {
54
+ url.searchParams.set(key, String(value));
55
+ }
56
+ }
57
+ try {
58
+ const controller = new AbortController();
59
+ const timeout = setTimeout(() => controller.abort(), 30_000);
60
+ const response = await fetch(url.toString(), {
61
+ signal: controller.signal,
62
+ headers: { "User-Agent": "elizaos-tcg-oracle-plugin/1.0.0" },
63
+ });
64
+ clearTimeout(timeout);
65
+ if (!response.ok) {
66
+ return { error: `API returned HTTP ${response.status}` };
67
+ }
68
+ const json = (await response.json());
69
+ return { data: json.data || json };
70
+ }
71
+ catch (err) {
72
+ if (err.name === "AbortError") {
73
+ return { error: "TCG Oracle API timed out (30s)" };
74
+ }
75
+ return {
76
+ error: "Failed to connect to TCG Oracle API. Is the server running?",
77
+ };
78
+ }
79
+ }
80
+ // ============================================================
81
+ // Helper: Truncate data safely before JSON.stringify
82
+ // ============================================================
83
+ function safeStringify(data, maxItems = 10) {
84
+ if (Array.isArray(data)) {
85
+ return JSON.stringify(data.slice(0, maxItems), null, 2);
86
+ }
87
+ return JSON.stringify(data, null, 2).slice(0, 2000);
88
+ }
89
+ // ============================================================
90
+ // ACTION 1: Search TCG Products
91
+ // ============================================================
92
+ const searchAction = {
93
+ name: "TCG_ORACLE_SEARCH",
94
+ description: "Search for trading card products across 25 games including Pokemon, Magic: The Gathering, Yu-Gi-Oh, Lorcana, One Piece, and more. Returns product names, set info, and current market prices from 370K+ real products sourced from TCGCSV daily.",
95
+ similes: [
96
+ "SEARCH_CARDS",
97
+ "FIND_CARD",
98
+ "CARD_LOOKUP",
99
+ "CARD_SEARCH",
100
+ "TCG_SEARCH",
101
+ "FIND_POKEMON",
102
+ "SEARCH_MTG",
103
+ ],
104
+ parameters: [
105
+ {
106
+ name: "query",
107
+ description: "The card name, set name, or keyword to search for (e.g., 'Charizard', 'Base Set', 'Pikachu VMAX')",
108
+ required: true,
109
+ schema: { type: "string" },
110
+ },
111
+ {
112
+ name: "limit",
113
+ description: "Maximum number of results to return (default: 10, max: 50)",
114
+ required: false,
115
+ schema: { type: "number" },
116
+ },
117
+ ],
118
+ examples: [
119
+ [
120
+ { name: "{{user1}}", content: { text: "Search for Charizard cards" } },
121
+ { name: "{{agentName}}", content: { text: "Searching TCG Oracle for Charizard...", action: "TCG_ORACLE_SEARCH" } },
122
+ ],
123
+ [
124
+ { name: "{{user1}}", content: { text: "What Pikachu VMAX cards are available?" } },
125
+ { name: "{{agentName}}", content: { text: "Looking up Pikachu VMAX products...", action: "TCG_ORACLE_SEARCH" } },
126
+ ],
127
+ [
128
+ { name: "{{user1}}", content: { text: "Find me Base Set holographic cards" } },
129
+ { name: "{{agentName}}", content: { text: "Searching for Base Set holographic cards...", action: "TCG_ORACLE_SEARCH" } },
130
+ ],
131
+ ],
132
+ validate: async (runtime) => {
133
+ return !!getBaseUrl(runtime);
134
+ },
135
+ handler: async (runtime, message, _state, _options, callback) => {
136
+ const text = message.content.text || "";
137
+ // Extract search query — strip common prefixes
138
+ const query = text
139
+ .replace(/^(search|find|look up|lookup|what|show me)\s+(for\s+)?/i, "")
140
+ .replace(/\s+cards?\s*$/i, "")
141
+ .trim();
142
+ if (!query) {
143
+ if (callback)
144
+ await callback({ text: "What card would you like me to search for?" });
145
+ return { success: false, error: "No search query provided" };
146
+ }
147
+ const result = await callApi(getBaseUrl(runtime), "/api/v1/search", {
148
+ query,
149
+ limit: 10,
150
+ });
151
+ if (result.error) {
152
+ if (callback)
153
+ await callback({ text: `Search failed: ${result.error}` });
154
+ return { success: false, error: result.error };
155
+ }
156
+ const summary = safeStringify(result.data);
157
+ const responseText = `Found products matching "${query}":\n\n${summary}`;
158
+ if (callback)
159
+ await callback({ text: responseText }, "TCG_ORACLE_SEARCH");
160
+ return { success: true, text: responseText, data: { search_results: result.data } };
161
+ },
162
+ };
163
+ // ============================================================
164
+ // ACTION 2: AI Card Grading
165
+ // ============================================================
166
+ const gradeAction = {
167
+ name: "TCG_ORACLE_GRADE",
168
+ description: "Grade a TCG card image using AI vision (Qwen VL model running locally). Predicts PSA and Beckett grading scores by analyzing centering, corners, edges, surface condition, and print quality. Works with Pokemon, MTG, Yu-Gi-Oh, and other TCG cards.",
169
+ similes: [
170
+ "GRADE_CARD",
171
+ "CARD_GRADING",
172
+ "PSA_GRADE",
173
+ "BECKETT_GRADE",
174
+ "RATE_CARD",
175
+ "EVALUATE_CARD",
176
+ ],
177
+ parameters: [
178
+ {
179
+ name: "image_url",
180
+ description: "Direct URL to the card image (PNG, JPG, or WebP)",
181
+ required: true,
182
+ schema: { type: "string" },
183
+ },
184
+ {
185
+ name: "game",
186
+ description: "The TCG game this card belongs to (default: Pokemon)",
187
+ required: false,
188
+ schema: { type: "string" },
189
+ },
190
+ ],
191
+ examples: [
192
+ [
193
+ { name: "{{user1}}", content: { text: "Grade this card: https://example.com/charizard.jpg" } },
194
+ { name: "{{agentName}}", content: { text: "Analyzing card image for grading...", action: "TCG_ORACLE_GRADE" } },
195
+ ],
196
+ [
197
+ { name: "{{user1}}", content: { text: "What PSA grade would this get? https://i.imgur.com/card.png" } },
198
+ { name: "{{agentName}}", content: { text: "Running AI vision grading analysis...", action: "TCG_ORACLE_GRADE" } },
199
+ ],
200
+ [
201
+ { name: "{{user1}}", content: { text: "Rate the condition of this Magic card https://example.com/mtg.jpg" } },
202
+ { name: "{{agentName}}", content: { text: "Evaluating card condition for Beckett grading...", action: "TCG_ORACLE_GRADE" } },
203
+ ],
204
+ ],
205
+ validate: async (runtime) => !!getBaseUrl(runtime),
206
+ handler: async (runtime, message, _state, _options, callback) => {
207
+ const text = message.content.text || "";
208
+ // Extract URL from message
209
+ const urlMatch = text.match(/https?:\/\/[^\s]+/);
210
+ if (!urlMatch) {
211
+ if (callback)
212
+ await callback({ text: "Please provide a card image URL to grade." });
213
+ return { success: false, error: "No image URL found in message" };
214
+ }
215
+ const result = await callApi(getBaseUrl(runtime), "/api/v1/grade", {
216
+ image_url: urlMatch[0],
217
+ game: "Pokemon",
218
+ });
219
+ if (result.error) {
220
+ if (callback)
221
+ await callback({ text: `Grading failed: ${result.error}` });
222
+ return { success: false, error: result.error };
223
+ }
224
+ const summary = safeStringify(result.data);
225
+ const responseText = `Card grading complete:\n\n${summary}`;
226
+ if (callback)
227
+ await callback({ text: responseText }, "TCG_ORACLE_GRADE");
228
+ return { success: true, text: responseText, data: { grade_result: result.data } };
229
+ },
230
+ };
231
+ // ============================================================
232
+ // ACTION 3: Monte Carlo Price Simulation
233
+ // ============================================================
234
+ const simulateAction = {
235
+ name: "TCG_ORACLE_SIMULATE",
236
+ description: "Run Monte Carlo simulation on a TCG card's price to predict future value. Uses real drift and volatility computed from TCGCSV historical data. Supports three stochastic models: Heston (stochastic volatility), Merton (jump-diffusion), and Kou (double-exponential jumps). Returns percentile bands (5th, 25th, 50th, 75th, 95th) for the forecast period.",
237
+ similes: [
238
+ "SIMULATE_PRICE",
239
+ "PRICE_PREDICTION",
240
+ "FORECAST_PRICE",
241
+ "MONTE_CARLO",
242
+ "PRICE_FORECAST",
243
+ "WHAT_WILL_THIS_BE_WORTH",
244
+ ],
245
+ parameters: [
246
+ {
247
+ name: "card_name",
248
+ description: "Name of the card to simulate",
249
+ required: true,
250
+ schema: { type: "string" },
251
+ },
252
+ {
253
+ name: "current_price",
254
+ description: "Current price in USD",
255
+ required: true,
256
+ schema: { type: "number" },
257
+ },
258
+ {
259
+ name: "model",
260
+ description: "Stochastic model: 'heston', 'merton', or 'kou'",
261
+ required: false,
262
+ schema: { type: "string", enumValues: ["heston", "merton", "kou"] },
263
+ },
264
+ {
265
+ name: "days",
266
+ description: "Forecast horizon in days (default: 30)",
267
+ required: false,
268
+ schema: { type: "number" },
269
+ },
270
+ ],
271
+ examples: [
272
+ [
273
+ { name: "{{user1}}", content: { text: "Simulate the price of Charizard VMAX at $350 for 60 days" } },
274
+ { name: "{{agentName}}", content: { text: "Running Monte Carlo simulation on Charizard VMAX...", action: "TCG_ORACLE_SIMULATE" } },
275
+ ],
276
+ [
277
+ { name: "{{user1}}", content: { text: "What will a PSA 10 Base Set Blastoise worth $800 be in 90 days using merton model?" } },
278
+ { name: "{{agentName}}", content: { text: "Running Merton jump-diffusion simulation for Blastoise...", action: "TCG_ORACLE_SIMULATE" } },
279
+ ],
280
+ [
281
+ { name: "{{user1}}", content: { text: "Forecast Lorcana Elsa at $25 for 30 days" } },
282
+ { name: "{{agentName}}", content: { text: "Simulating Lorcana Elsa price trajectory...", action: "TCG_ORACLE_SIMULATE" } },
283
+ ],
284
+ ],
285
+ validate: async (runtime) => !!getBaseUrl(runtime),
286
+ handler: async (runtime, message, _state, options, callback) => {
287
+ const text = message.content.text || "";
288
+ // Try to extract parameters from text
289
+ const priceMatch = text.match(/\$?([\d,]+(?:\.\d{2})?)/);
290
+ const daysMatch = text.match(/(\d+)\s*days?/i);
291
+ const modelMatch = text.match(/\b(heston|merton|kou)\b/i);
292
+ const cardName = text
293
+ .replace(/simulate|price|forecast|monte carlo|at|\$[\d,.]+|\d+\s*days?|heston|merton|kou/gi, "")
294
+ .replace(/\s+/g, " ")
295
+ .trim() || "Unknown Card";
296
+ const currentPrice = priceMatch ? parseFloat(priceMatch[1].replace(",", "")) : 0;
297
+ const days = daysMatch ? parseInt(daysMatch[1]) : 30;
298
+ const model = modelMatch ? modelMatch[1].toLowerCase() : "heston";
299
+ if (currentPrice <= 0) {
300
+ if (callback)
301
+ await callback({ text: "Please provide a current price for the simulation. Example: 'Simulate Charizard VMAX at $350 for 60 days'" });
302
+ return { success: false, error: "Invalid or missing current price" };
303
+ }
304
+ const result = await callApi(getBaseUrl(runtime), "/api/v1/simulate", {
305
+ card_name: cardName,
306
+ current_price: currentPrice,
307
+ model,
308
+ days,
309
+ simulations: 10000,
310
+ });
311
+ if (result.error) {
312
+ if (callback)
313
+ await callback({ text: `Simulation failed: ${result.error}` });
314
+ return { success: false, error: result.error };
315
+ }
316
+ const summary = safeStringify(result.data);
317
+ const responseText = `Monte Carlo simulation for ${cardName} ($${currentPrice}, ${model} model, ${days} days):\n\n${summary}`;
318
+ if (callback)
319
+ await callback({ text: responseText }, "TCG_ORACLE_SIMULATE");
320
+ return { success: true, text: responseText, data: { simulation_result: result.data } };
321
+ },
322
+ };
323
+ // ============================================================
324
+ // ACTION 4: Market Snapshot
325
+ // ============================================================
326
+ const marketAction = {
327
+ name: "TCG_ORACLE_MARKET",
328
+ description: "Retrieve the latest daily market data snapshot from TCGCSV for a specific game. Returns top movers, price changes, volume data, and market trends. Data is refreshed daily via automated pipeline.",
329
+ similes: [
330
+ "MARKET_SNAPSHOT",
331
+ "MARKET_DATA",
332
+ "TCG_MARKET",
333
+ "CARD_MARKET",
334
+ "TOP_MOVERS",
335
+ "PRICE_CHANGES",
336
+ ],
337
+ parameters: [
338
+ {
339
+ name: "game",
340
+ description: "Game name: Pokemon, Magic: The Gathering, Yu-Gi-Oh, Lorcana, One Piece, etc",
341
+ required: false,
342
+ schema: { type: "string" },
343
+ },
344
+ ],
345
+ examples: [
346
+ [
347
+ { name: "{{user1}}", content: { text: "Show me the Pokemon market snapshot" } },
348
+ { name: "{{agentName}}", content: { text: "Pulling the latest Pokemon market data...", action: "TCG_ORACLE_MARKET" } },
349
+ ],
350
+ [
351
+ { name: "{{user1}}", content: { text: "What's happening in the Yu-Gi-Oh market today?" } },
352
+ { name: "{{agentName}}", content: { text: "Fetching Yu-Gi-Oh market snapshot...", action: "TCG_ORACLE_MARKET" } },
353
+ ],
354
+ [
355
+ { name: "{{user1}}", content: { text: "Top movers in Magic: The Gathering" } },
356
+ { name: "{{agentName}}", content: { text: "Pulling Magic: The Gathering market data...", action: "TCG_ORACLE_MARKET" } },
357
+ ],
358
+ ],
359
+ validate: async (runtime) => !!getBaseUrl(runtime),
360
+ handler: async (runtime, message, _state, _options, callback) => {
361
+ const text = message.content.text?.toLowerCase() || "";
362
+ // Detect game from message
363
+ let game = "Pokemon";
364
+ for (const g of SUPPORTED_GAMES) {
365
+ if (text.includes(g.toLowerCase())) {
366
+ game = g;
367
+ break;
368
+ }
369
+ }
370
+ const result = await callApi(getBaseUrl(runtime), "/api/v1/market", { game });
371
+ if (result.error) {
372
+ if (callback)
373
+ await callback({ text: `Market data failed: ${result.error}` });
374
+ return { success: false, error: result.error };
375
+ }
376
+ const summary = safeStringify(result.data, 25);
377
+ const responseText = `Market snapshot for ${game}:\n\n${summary}`;
378
+ if (callback)
379
+ await callback({ text: responseText }, "TCG_ORACLE_MARKET");
380
+ return { success: true, text: responseText, data: { market_data: result.data } };
381
+ },
382
+ };
383
+ // ============================================================
384
+ // PROVIDER: TCG Oracle Context
385
+ // ============================================================
386
+ const tcgOracleProvider = {
387
+ name: "tcg-oracle",
388
+ description: "Provides TCG Oracle market intelligence context to the agent",
389
+ get: async (runtime, _message, _state) => {
390
+ const baseUrl = getBaseUrl(runtime);
391
+ const status = baseUrl ? "connected" : "not configured";
392
+ return {
393
+ text: `[TCG Oracle]
394
+ Status: ${status}
395
+ Database: 370,158 products across 25 games
396
+ Data source: TCGCSV daily snapshots
397
+ Models: Heston (stochastic vol), Merton (jump-diffusion), Kou (double-exp)
398
+ Supported games: ${SUPPORTED_GAMES.join(", ")}
399
+ API: ${baseUrl || "TCG_ORACLE_URL not set"}
400
+
401
+ The agent can search cards, grade card images, simulate prices via Monte Carlo, and pull market snapshots.`,
402
+ values: {
403
+ tcgOracleStatus: status,
404
+ tcgOracleUrl: baseUrl || "not set",
405
+ totalProducts: 370158,
406
+ },
407
+ };
408
+ },
409
+ };
410
+ // ============================================================
411
+ // PLUGIN EXPORT
412
+ // ============================================================
413
+ const tcgOraclePlugin = {
414
+ name: "@undesirables/plugin-tcg-oracle",
415
+ description: "TCG Oracle — AI-powered trading card market intelligence for ElizaOS agents. " +
416
+ "Covers 370K+ products across 25 games with Monte Carlo price simulation " +
417
+ "(Heston/Merton/Kou), AI vision card grading, and real-time market snapshots. " +
418
+ "Powered by TCGCSV daily data pipeline.",
419
+ init: async (config, runtime) => {
420
+ const validation = validateTcgOracleConfig(runtime);
421
+ if (!validation.valid) {
422
+ console.warn(`⚠️ TCG Oracle: ${validation.error}`);
423
+ }
424
+ else {
425
+ console.log(`✅ TCG Oracle connected to ${runtime.getSetting?.("TCG_ORACLE_URL")}`);
426
+ }
427
+ },
428
+ actions: [searchAction, gradeAction, simulateAction, marketAction],
429
+ providers: [tcgOracleProvider],
430
+ evaluators: [],
431
+ };
432
+ export default tcgOraclePlugin;
433
+ export { SUPPORTED_GAMES, SIMULATION_MODELS };
434
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAe3D,+DAA+D;AAC/D,gBAAgB;AAChB,+DAA+D;AAE/D,MAAM,eAAe,GAAG;IACtB,SAAS;IACT,sBAAsB;IACtB,WAAW;IACX,SAAS;IACT,WAAW;IACX,iBAAiB;IACjB,sBAAsB;IACtB,mBAAmB;IACnB,SAAS;IACT,SAAS;IACT,aAAa;IACb,kBAAkB;IAClB,eAAe;CACP,CAAC;AAEX,MAAM,iBAAiB,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,CAAU,CAAC;AAE/D,+DAA+D;AAC/D,aAAa;AACb,+DAA+D;AAE/D,SAAS,UAAU,CAAC,OAAsB;IACxC,OAAO,CACJ,OAAO,CAAC,UAAU,EAAE,CAAC,gBAAgB,CAAY;QAClD,OAAO,CAAC,GAAG,CAAC,cAAc;QAC1B,EAAE,CACH,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,OAAO,CACpB,OAAe,EACf,QAAgB,EAChB,MAAuC;IAEvC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO;YACL,KAAK,EACH,uJAAuJ;SAC1J,CAAC;IACJ,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,OAAO,GAAG,QAAQ,EAAE,CAAC,CAAC;IAC7C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAClD,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,EAAE,EAAE,CAAC;YAC1D,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC;IAED,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,MAAM,CAAC,CAAC;QAE7D,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE;YAC3C,MAAM,EAAE,UAAU,CAAC,MAAM;YACzB,OAAO,EAAE,EAAE,YAAY,EAAE,iCAAiC,EAAE;SAC7D,CAAC,CAAC;QACH,YAAY,CAAC,OAAO,CAAC,CAAC;QAEtB,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,OAAO,EAAE,KAAK,EAAE,qBAAqB,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;QAC3D,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAwB,CAAC;QAC5D,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC;IACrC,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,IAAI,GAAG,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;YAC9B,OAAO,EAAE,KAAK,EAAE,gCAAgC,EAAE,CAAC;QACrD,CAAC;QACD,OAAO;YACL,KAAK,EAAE,6DAA6D;SACrE,CAAC;IACJ,CAAC;AACH,CAAC;AAED,+DAA+D;AAC/D,qDAAqD;AACrD,+DAA+D;AAE/D,SAAS,aAAa,CAAC,IAAS,EAAE,QAAQ,GAAG,EAAE;IAC7C,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACxB,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAC1D,CAAC;IACD,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;AACtD,CAAC;AAED,+DAA+D;AAC/D,gCAAgC;AAChC,+DAA+D;AAE/D,MAAM,YAAY,GAAW;IAC3B,IAAI,EAAE,mBAAmB;IACzB,WAAW,EACT,kPAAkP;IACpP,OAAO,EAAE;QACP,cAAc;QACd,WAAW;QACX,aAAa;QACb,aAAa;QACb,YAAY;QACZ,cAAc;QACd,YAAY;KACb;IACD,UAAU,EAAE;QACV;YACE,IAAI,EAAE,OAAO;YACb,WAAW,EAAE,mGAAmG;YAChH,QAAQ,EAAE,IAAI;YACd,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;SAC3B;QACD;YACE,IAAI,EAAE,OAAO;YACb,WAAW,EAAE,4DAA4D;YACzE,QAAQ,EAAE,KAAK;YACf,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;SAC3B;KACF;IACD,QAAQ,EAAE;QACR;YACE,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,4BAA4B,EAAE,EAAmB;YACvF,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,uCAAuC,EAAE,MAAM,EAAE,mBAAmB,EAAE,EAAmB;SACpI;QACD;YACE,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,wCAAwC,EAAE,EAAmB;YACnG,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,qCAAqC,EAAE,MAAM,EAAE,mBAAmB,EAAE,EAAmB;SAClI;QACD;YACE,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,oCAAoC,EAAE,EAAmB;YAC/F,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,6CAA6C,EAAE,MAAM,EAAE,mBAAmB,EAAE,EAAmB;SAC1I;KACF;IACD,QAAQ,EAAE,KAAK,EAAE,OAAsB,EAAE,EAAE;QACzC,OAAO,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IAC/B,CAAC;IACD,OAAO,EAAE,KAAK,EACZ,OAAsB,EACtB,OAAe,EACf,MAAc,EACd,QAAkC,EAClC,QAA0B,EACS,EAAE;QACrC,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC;QAExC,+CAA+C;QAC/C,MAAM,KAAK,GAAG,IAAI;aACf,OAAO,CAAC,yDAAyD,EAAE,EAAE,CAAC;aACtE,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAAC;aAC7B,IAAI,EAAE,CAAC;QAEV,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,IAAI,QAAQ;gBAAE,MAAM,QAAQ,CAAC,EAAE,IAAI,EAAE,4CAA4C,EAAE,CAAC,CAAC;YACrF,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,0BAA0B,EAAE,CAAC;QAC/D,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,gBAAgB,EAAE;YAClE,KAAK;YACL,KAAK,EAAE,EAAE;SACV,CAAC,CAAC;QAEH,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YACjB,IAAI,QAAQ;gBAAE,MAAM,QAAQ,CAAC,EAAE,IAAI,EAAE,kBAAkB,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YACzE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;QACjD,CAAC;QAED,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC3C,MAAM,YAAY,GAAG,4BAA4B,KAAK,SAAS,OAAO,EAAE,CAAC;QAEzE,IAAI,QAAQ;YAAE,MAAM,QAAQ,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,mBAAmB,CAAC,CAAC;QAC1E,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE,cAAc,EAAE,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;IACtF,CAAC;CACF,CAAC;AAEF,+DAA+D;AAC/D,4BAA4B;AAC5B,+DAA+D;AAE/D,MAAM,WAAW,GAAW;IAC1B,IAAI,EAAE,kBAAkB;IACxB,WAAW,EACT,uPAAuP;IACzP,OAAO,EAAE;QACP,YAAY;QACZ,cAAc;QACd,WAAW;QACX,eAAe;QACf,WAAW;QACX,eAAe;KAChB;IACD,UAAU,EAAE;QACV;YACE,IAAI,EAAE,WAAW;YACjB,WAAW,EAAE,kDAAkD;YAC/D,QAAQ,EAAE,IAAI;YACd,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;SAC3B;QACD;YACE,IAAI,EAAE,MAAM;YACZ,WAAW,EAAE,sDAAsD;YACnE,QAAQ,EAAE,KAAK;YACf,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;SAC3B;KACF;IACD,QAAQ,EAAE;QACR;YACE,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,oDAAoD,EAAE,EAAmB;YAC/G,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,qCAAqC,EAAE,MAAM,EAAE,kBAAkB,EAAE,EAAmB;SACjI;QACD;YACE,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,6DAA6D,EAAE,EAAmB;YACxH,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,uCAAuC,EAAE,MAAM,EAAE,kBAAkB,EAAE,EAAmB;SACnI;QACD;YACE,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,mEAAmE,EAAE,EAAmB;YAC9H,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,kDAAkD,EAAE,MAAM,EAAE,kBAAkB,EAAE,EAAmB;SAC9I;KACF;IACD,QAAQ,EAAE,KAAK,EAAE,OAAsB,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC;IACjE,OAAO,EAAE,KAAK,EACZ,OAAsB,EACtB,OAAe,EACf,MAAc,EACd,QAAkC,EAClC,QAA0B,EACS,EAAE;QACrC,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC;QAExC,2BAA2B;QAC3B,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;QACjD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,IAAI,QAAQ;gBAAE,MAAM,QAAQ,CAAC,EAAE,IAAI,EAAE,2CAA2C,EAAE,CAAC,CAAC;YACpF,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,+BAA+B,EAAE,CAAC;QACpE,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,eAAe,EAAE;YACjE,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC;YACtB,IAAI,EAAE,SAAS;SAChB,CAAC,CAAC;QAEH,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YACjB,IAAI,QAAQ;gBAAE,MAAM,QAAQ,CAAC,EAAE,IAAI,EAAE,mBAAmB,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YAC1E,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;QACjD,CAAC;QAED,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC3C,MAAM,YAAY,GAAG,6BAA6B,OAAO,EAAE,CAAC;QAE5D,IAAI,QAAQ;YAAE,MAAM,QAAQ,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,kBAAkB,CAAC,CAAC;QACzE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE,YAAY,EAAE,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;IACpF,CAAC;CACF,CAAC;AAEF,+DAA+D;AAC/D,yCAAyC;AACzC,+DAA+D;AAE/D,MAAM,cAAc,GAAW;IAC7B,IAAI,EAAE,qBAAqB;IAC3B,WAAW,EACT,+VAA+V;IACjW,OAAO,EAAE;QACP,gBAAgB;QAChB,kBAAkB;QAClB,gBAAgB;QAChB,aAAa;QACb,gBAAgB;QAChB,yBAAyB;KAC1B;IACD,UAAU,EAAE;QACV;YACE,IAAI,EAAE,WAAW;YACjB,WAAW,EAAE,8BAA8B;YAC3C,QAAQ,EAAE,IAAI;YACd,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;SAC3B;QACD;YACE,IAAI,EAAE,eAAe;YACrB,WAAW,EAAE,sBAAsB;YACnC,QAAQ,EAAE,IAAI;YACd,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;SAC3B;QACD;YACE,IAAI,EAAE,OAAO;YACb,WAAW,EAAE,gDAAgD;YAC7D,QAAQ,EAAE,KAAK;YACf,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,CAAC,EAAE;SACpE;QACD;YACE,IAAI,EAAE,MAAM;YACZ,WAAW,EAAE,wCAAwC;YACrD,QAAQ,EAAE,KAAK;YACf,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;SAC3B;KACF;IACD,QAAQ,EAAE;QACR;YACE,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,0DAA0D,EAAE,EAAmB;YACrH,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,qDAAqD,EAAE,MAAM,EAAE,qBAAqB,EAAE,EAAmB;SACpJ;QACD;YACE,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,oFAAoF,EAAE,EAAmB;YAC/I,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,2DAA2D,EAAE,MAAM,EAAE,qBAAqB,EAAE,EAAmB;SAC1J;QACD;YACE,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,0CAA0C,EAAE,EAAmB;YACrG,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,6CAA6C,EAAE,MAAM,EAAE,qBAAqB,EAAE,EAAmB;SAC5I;KACF;IACD,QAAQ,EAAE,KAAK,EAAE,OAAsB,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC;IACjE,OAAO,EAAE,KAAK,EACZ,OAAsB,EACtB,OAAe,EACf,MAAc,EACd,OAAiC,EACjC,QAA0B,EACS,EAAE;QACrC,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC;QAExC,sCAAsC;QACtC,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;QACzD,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;QAC/C,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAE1D,MAAM,QAAQ,GACZ,IAAI;aACD,OAAO,CAAC,kFAAkF,EAAE,EAAE,CAAC;aAC/F,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;aACpB,IAAI,EAAE,IAAI,cAAc,CAAC;QAE9B,MAAM,YAAY,GAAG,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACjF,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACrD,MAAM,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC;QAElE,IAAI,YAAY,IAAI,CAAC,EAAE,CAAC;YACtB,IAAI,QAAQ;gBAAE,MAAM,QAAQ,CAAC,EAAE,IAAI,EAAE,2GAA2G,EAAE,CAAC,CAAC;YACpJ,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,kCAAkC,EAAE,CAAC;QACvE,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,kBAAkB,EAAE;YACpE,SAAS,EAAE,QAAQ;YACnB,aAAa,EAAE,YAAY;YAC3B,KAAK;YACL,IAAI;YACJ,WAAW,EAAE,KAAK;SACnB,CAAC,CAAC;QAEH,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YACjB,IAAI,QAAQ;gBAAE,MAAM,QAAQ,CAAC,EAAE,IAAI,EAAE,sBAAsB,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YAC7E,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;QACjD,CAAC;QAED,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC3C,MAAM,YAAY,GAAG,8BAA8B,QAAQ,MAAM,YAAY,KAAK,KAAK,WAAW,IAAI,cAAc,OAAO,EAAE,CAAC;QAE9H,IAAI,QAAQ;YAAE,MAAM,QAAQ,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,qBAAqB,CAAC,CAAC;QAC5E,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE,iBAAiB,EAAE,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;IACzF,CAAC;CACF,CAAC;AAEF,+DAA+D;AAC/D,4BAA4B;AAC5B,+DAA+D;AAE/D,MAAM,YAAY,GAAW;IAC3B,IAAI,EAAE,mBAAmB;IACzB,WAAW,EACT,oMAAoM;IACtM,OAAO,EAAE;QACP,iBAAiB;QACjB,aAAa;QACb,YAAY;QACZ,aAAa;QACb,YAAY;QACZ,eAAe;KAChB;IACD,UAAU,EAAE;QACV;YACE,IAAI,EAAE,MAAM;YACZ,WAAW,EAAE,6EAA6E;YAC1F,QAAQ,EAAE,KAAK;YACf,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;SAC3B;KACF;IACD,QAAQ,EAAE;QACR;YACE,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,qCAAqC,EAAE,EAAmB;YAChG,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,2CAA2C,EAAE,MAAM,EAAE,mBAAmB,EAAE,EAAmB;SACxI;QACD;YACE,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,gDAAgD,EAAE,EAAmB;YAC3G,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,sCAAsC,EAAE,MAAM,EAAE,mBAAmB,EAAE,EAAmB;SACnI;QACD;YACE,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,oCAAoC,EAAE,EAAmB;YAC/F,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,6CAA6C,EAAE,MAAM,EAAE,mBAAmB,EAAE,EAAmB;SAC1I;KACF;IACD,QAAQ,EAAE,KAAK,EAAE,OAAsB,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC;IACjE,OAAO,EAAE,KAAK,EACZ,OAAsB,EACtB,OAAe,EACf,MAAc,EACd,QAAkC,EAClC,QAA0B,EACS,EAAE;QACrC,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;QAEvD,2BAA2B;QAC3B,IAAI,IAAI,GAAG,SAAS,CAAC;QACrB,KAAK,MAAM,CAAC,IAAI,eAAe,EAAE,CAAC;YAChC,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;gBACnC,IAAI,GAAG,CAAC,CAAC;gBACT,MAAM;YACR,CAAC;QACH,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,gBAAgB,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QAE9E,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YACjB,IAAI,QAAQ;gBAAE,MAAM,QAAQ,CAAC,EAAE,IAAI,EAAE,uBAAuB,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YAC9E,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;QACjD,CAAC;QAED,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAC/C,MAAM,YAAY,GAAG,uBAAuB,IAAI,QAAQ,OAAO,EAAE,CAAC;QAElE,IAAI,QAAQ;YAAE,MAAM,QAAQ,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,mBAAmB,CAAC,CAAC;QAC1E,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE,WAAW,EAAE,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;IACnF,CAAC;CACF,CAAC;AAEF,+DAA+D;AAC/D,+BAA+B;AAC/B,+DAA+D;AAE/D,MAAM,iBAAiB,GAAa;IAClC,IAAI,EAAE,YAAY;IAClB,WAAW,EAAE,8DAA8D;IAC3E,GAAG,EAAE,KAAK,EACR,OAAsB,EACtB,QAAgB,EAChB,MAAa,EACY,EAAE;QAC3B,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;QACpC,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,gBAAgB,CAAC;QAExD,OAAO;YACL,IAAI,EAAE;UACF,MAAM;;;;mBAIG,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC;OACtC,OAAO,IAAI,wBAAwB;;2GAEiE;YACrG,MAAM,EAAE;gBACN,eAAe,EAAE,MAAM;gBACvB,YAAY,EAAE,OAAO,IAAI,SAAS;gBAClC,aAAa,EAAE,MAAM;aACtB;SACF,CAAC;IACJ,CAAC;CACF,CAAC;AAEF,+DAA+D;AAC/D,gBAAgB;AAChB,+DAA+D;AAE/D,MAAM,eAAe,GAAW;IAC9B,IAAI,EAAE,iCAAiC;IACvC,WAAW,EACT,+EAA+E;QAC/E,0EAA0E;QAC1E,+EAA+E;QAC/E,wCAAwC;IAC1C,IAAI,EAAE,KAAK,EAAE,MAA8B,EAAE,OAAsB,EAAE,EAAE;QACrE,MAAM,UAAU,GAAG,uBAAuB,CAAC,OAAO,CAAC,CAAC;QACpD,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;YACtB,OAAO,CAAC,IAAI,CAAC,kBAAkB,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC;QACrD,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,6BAA6B,OAAO,CAAC,UAAU,EAAE,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;QACrF,CAAC;IACH,CAAC;IACD,OAAO,EAAE,CAAC,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,YAAY,CAAC;IAClE,SAAS,EAAE,CAAC,iBAAiB,CAAC;IAC9B,UAAU,EAAE,EAAE;CACf,CAAC;AAEF,eAAe,eAAe,CAAC;AAC/B,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,CAAC"}
Binary file
Binary file
package/package.json ADDED
@@ -0,0 +1,49 @@
1
+ {
2
+ "name": "@undesirables/plugin-tcg-oracle",
3
+ "version": "1.0.0",
4
+ "description": "ElizaOS plugin for TCG Oracle — AI-powered trading card market intelligence. Covers 370K+ products across 25 games with Monte Carlo price simulation (Heston/Merton/Kou), AI vision card grading, and real-time market snapshots.",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "type": "module",
8
+ "files": [
9
+ "dist",
10
+ "images",
11
+ "plugin.json",
12
+ "README.md",
13
+ "LICENSE"
14
+ ],
15
+ "scripts": {
16
+ "build": "tsc",
17
+ "clean": "rm -rf dist",
18
+ "test": "vitest run"
19
+ },
20
+ "keywords": [
21
+ "elizaos",
22
+ "elizaos-plugins",
23
+ "ai-agents",
24
+ "tcg",
25
+ "trading-cards",
26
+ "pokemon",
27
+ "magic-the-gathering",
28
+ "yugioh",
29
+ "monte-carlo",
30
+ "card-grading",
31
+ "market-intelligence",
32
+ "price-prediction"
33
+ ],
34
+ "author": "The Undesirables LLC (sailorpepe)",
35
+ "license": "BUSL-1.1",
36
+ "repository": {
37
+ "type": "git",
38
+ "url": "https://github.com/sailorpepe/elizaos-tcg-oracle-plugin"
39
+ },
40
+ "homepage": "https://the-undesirables.com",
41
+ "peerDependencies": {
42
+ "@elizaos/core": ">=1.0.0"
43
+ },
44
+ "devDependencies": {
45
+ "@elizaos/core": "2.0.0-alpha.77",
46
+ "typescript": "^5.4.0",
47
+ "vitest": "^3.2.4"
48
+ }
49
+ }
package/plugin.json ADDED
@@ -0,0 +1,27 @@
1
+ {
2
+ "name": "@undesirables/plugin-tcg-oracle",
3
+ "version": "1.0.0",
4
+ "description": "ElizaOS plugin for TCG Oracle — AI-powered trading card market intelligence with Monte Carlo simulation and AI vision grading for 370K+ products across 25 games.",
5
+ "author": "The Undesirables LLC",
6
+ "license": "BUSL-1.1",
7
+ "type": "module",
8
+ "main": "dist/index.js",
9
+ "types": "dist/index.d.ts",
10
+ "repository": {
11
+ "type": "git",
12
+ "url": "https://github.com/sailorpepe/elizaos-tcg-oracle-plugin"
13
+ },
14
+ "homepage": "https://the-undesirables.com",
15
+ "keywords": [
16
+ "elizaos",
17
+ "elizaos-plugins",
18
+ "tcg",
19
+ "trading-cards",
20
+ "monte-carlo",
21
+ "card-grading",
22
+ "market-intelligence"
23
+ ],
24
+ "peerDependencies": {
25
+ "@elizaos/core": ">=1.0.0"
26
+ }
27
+ }