@remix-gg/mcp 0.4.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +81 -0
- package/dist/client-helpers/index.d.ts +2 -0
- package/dist/client-helpers/index.d.ts.map +1 -0
- package/dist/client-helpers/index.js +2 -0
- package/dist/client-helpers/index.js.map +1 -0
- package/dist/config.d.ts +20 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +58 -0
- package/dist/config.js.map +1 -0
- package/dist/core/api-client.d.ts +4 -0
- package/dist/core/api-client.d.ts.map +1 -0
- package/dist/core/api-client.js +12 -0
- package/dist/core/api-client.js.map +1 -0
- package/dist/core/config.d.ts +6 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +19 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/index.d.ts +5 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +4 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/skills.d.ts +22 -0
- package/dist/core/skills.d.ts.map +1 -0
- package/dist/core/skills.js +49 -0
- package/dist/core/skills.js.map +1 -0
- package/dist/core/tool-defs.d.ts +12 -0
- package/dist/core/tool-defs.d.ts.map +1 -0
- package/dist/core/tool-defs.js +356 -0
- package/dist/core/tool-defs.js.map +1 -0
- package/dist/core/tools/create-game.d.ts +9 -0
- package/dist/core/tools/create-game.d.ts.map +1 -0
- package/dist/core/tools/create-game.js +21 -0
- package/dist/core/tools/create-game.js.map +1 -0
- package/dist/core/tools/create-shop-item.d.ts +14 -0
- package/dist/core/tools/create-shop-item.d.ts.map +1 -0
- package/dist/core/tools/create-shop-item.js +78 -0
- package/dist/core/tools/create-shop-item.js.map +1 -0
- package/dist/core/tools/delete-shop-item.d.ts +9 -0
- package/dist/core/tools/delete-shop-item.d.ts.map +1 -0
- package/dist/core/tools/delete-shop-item.js +19 -0
- package/dist/core/tools/delete-shop-item.js.map +1 -0
- package/dist/core/tools/generate-image.d.ts +8 -0
- package/dist/core/tools/generate-image.d.ts.map +1 -0
- package/dist/core/tools/generate-image.js +32 -0
- package/dist/core/tools/generate-image.js.map +1 -0
- package/dist/core/tools/generate-sprite-sheet.d.ts +14 -0
- package/dist/core/tools/generate-sprite-sheet.d.ts.map +1 -0
- package/dist/core/tools/generate-sprite-sheet.js +29 -0
- package/dist/core/tools/generate-sprite-sheet.js.map +1 -0
- package/dist/core/tools/helpers.d.ts +60 -0
- package/dist/core/tools/helpers.d.ts.map +1 -0
- package/dist/core/tools/helpers.js +68 -0
- package/dist/core/tools/helpers.js.map +1 -0
- package/dist/core/tools/index.d.ts +13 -0
- package/dist/core/tools/index.d.ts.map +1 -0
- package/dist/core/tools/index.js +13 -0
- package/dist/core/tools/index.js.map +1 -0
- package/dist/core/tools/list-shop-items.d.ts +8 -0
- package/dist/core/tools/list-shop-items.d.ts.map +1 -0
- package/dist/core/tools/list-shop-items.js +17 -0
- package/dist/core/tools/list-shop-items.js.map +1 -0
- package/dist/core/tools/update-game.d.ts +11 -0
- package/dist/core/tools/update-game.d.ts.map +1 -0
- package/dist/core/tools/update-game.js +22 -0
- package/dist/core/tools/update-game.js.map +1 -0
- package/dist/core/tools/update-shop-item.d.ts +15 -0
- package/dist/core/tools/update-shop-item.d.ts.map +1 -0
- package/dist/core/tools/update-shop-item.js +24 -0
- package/dist/core/tools/update-shop-item.js.map +1 -0
- package/dist/core/tools/upload-game-asset.d.ts +8 -0
- package/dist/core/tools/upload-game-asset.d.ts.map +1 -0
- package/dist/core/tools/upload-game-asset.js +43 -0
- package/dist/core/tools/upload-game-asset.js.map +1 -0
- package/dist/core/tools/upload-version.d.ts +8 -0
- package/dist/core/tools/upload-version.d.ts.map +1 -0
- package/dist/core/tools/upload-version.js +20 -0
- package/dist/core/tools/upload-version.js.map +1 -0
- package/dist/core/tools/validate-game.d.ts +6 -0
- package/dist/core/tools/validate-game.d.ts.map +1 -0
- package/dist/core/tools/validate-game.js +41 -0
- package/dist/core/tools/validate-game.js.map +1 -0
- package/dist/core/tools.test.d.ts +2 -0
- package/dist/core/tools.test.d.ts.map +1 -0
- package/dist/core/tools.test.js +825 -0
- package/dist/core/tools.test.js.map +1 -0
- package/dist/generated/server-api.d.ts +3673 -0
- package/dist/generated/server-api.d.ts.map +1 -0
- package/dist/generated/server-api.js +2 -0
- package/dist/generated/server-api.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +365 -0
- package/dist/index.js.map +1 -0
- package/dist/server/create-server.d.ts +12 -0
- package/dist/server/create-server.d.ts.map +1 -0
- package/dist/server/create-server.js +29 -0
- package/dist/server/create-server.js.map +1 -0
- package/dist/server/create-server.test.d.ts +2 -0
- package/dist/server/create-server.test.d.ts.map +1 -0
- package/dist/server/create-server.test.js +37 -0
- package/dist/server/create-server.test.js.map +1 -0
- package/dist/server/index.d.ts +3 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +8 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/lib/config.d.ts +2 -0
- package/dist/server/lib/config.d.ts.map +1 -0
- package/dist/server/lib/config.js +2 -0
- package/dist/server/lib/config.js.map +1 -0
- package/dist/server/resources/skills.d.ts +3 -0
- package/dist/server/resources/skills.d.ts.map +1 -0
- package/dist/server/resources/skills.js +60 -0
- package/dist/server/resources/skills.js.map +1 -0
- package/dist/server/resources/skills.test.d.ts +2 -0
- package/dist/server/resources/skills.test.d.ts.map +1 -0
- package/dist/server/resources/skills.test.js +44 -0
- package/dist/server/resources/skills.test.js.map +1 -0
- package/dist/server/tools/register.d.ts +3 -0
- package/dist/server/tools/register.d.ts.map +1 -0
- package/dist/server/tools/register.js +26 -0
- package/dist/server/tools/register.js.map +1 -0
- package/dist/server/tools/register.test.d.ts +2 -0
- package/dist/server/tools/register.test.d.ts.map +1 -0
- package/dist/server/tools/register.test.js +85 -0
- package/dist/server/tools/register.test.js.map +1 -0
- package/dist/types.d.ts +73 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +31 -0
- package/dist/types.js.map +1 -0
- package/package.json +38 -0
- package/skills/SKILL.md +82 -0
- package/skills/actions/open-game.md +18 -0
- package/skills/workflows/add-image-to-game.md +121 -0
- package/skills/workflows/add-sprite-to-game.md +127 -0
- package/skills/workflows/game-creation.md +124 -0
- package/skills/workflows/implement-multiplayer.md +355 -0
- package/skills/workflows/integrate-save-game.md +135 -0
- package/skills/workflows/manage-shop-items.md +246 -0
- package/skills/workflows/upload-game.md +74 -0
|
@@ -0,0 +1,356 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { createGame, createShopItem, deleteShopItem, generateImage, generateSpriteSheet, listShopItems, updateGame, updateShopItem, uploadGameAsset, uploadVersion, validateGame, } from './tools/index.js';
|
|
3
|
+
/** Type-safe builder — infers schema + result types at the call site. */
|
|
4
|
+
function defineTool(def) {
|
|
5
|
+
return def;
|
|
6
|
+
}
|
|
7
|
+
// ── Individual definitions ───────────────────────────────────
|
|
8
|
+
const createGameDef = defineTool({
|
|
9
|
+
name: 'createGame',
|
|
10
|
+
title: 'Create Game',
|
|
11
|
+
description: 'Creates a new game on the Remix platform. ' +
|
|
12
|
+
'Returns the game ID and version ID needed for future updates (pass them to uploadVersion, generateImage, etc.). ' +
|
|
13
|
+
'IMPORTANT: Before calling this tool, ALWAYS check for a .remix-settings.json file in the project root. ' +
|
|
14
|
+
'If it already contains gameId and versionId, do NOT call this tool — use the existing IDs instead. ' +
|
|
15
|
+
'Calling this tool when IDs already exist will create a duplicate game. ' +
|
|
16
|
+
'Requires REMIX_API_KEY to be configured.',
|
|
17
|
+
inputSchema: z.object({
|
|
18
|
+
name: z.string().min(5).max(25).describe('The name of the game to create (5–25 characters)'),
|
|
19
|
+
}),
|
|
20
|
+
execute: (input, config) => createGame(input.name, config),
|
|
21
|
+
formatResult: (result) => [
|
|
22
|
+
'Game created successfully!',
|
|
23
|
+
'',
|
|
24
|
+
` Name: ${result.name}`,
|
|
25
|
+
` Game ID: ${result.gameId}`,
|
|
26
|
+
` Version ID: ${result.versionId}`,
|
|
27
|
+
` Created: ${result.createdAt}`,
|
|
28
|
+
'',
|
|
29
|
+
'Save these IDs to .remix-settings.json in the project root so they persist across sessions:',
|
|
30
|
+
'',
|
|
31
|
+
` { "gameId": "${result.gameId}", "versionId": "${result.versionId}", "name": "${result.name}" }`,
|
|
32
|
+
'',
|
|
33
|
+
'Use the game ID and version ID in subsequent tool calls (uploadVersion, generateImage, etc.).',
|
|
34
|
+
].join('\n'),
|
|
35
|
+
});
|
|
36
|
+
const updateGameDef = defineTool({
|
|
37
|
+
name: 'updateGame',
|
|
38
|
+
title: 'Update Game',
|
|
39
|
+
description: 'Updates an existing game on the Remix platform. ' +
|
|
40
|
+
'Can change the game name and/or multiplayer flag. ' +
|
|
41
|
+
'Check .remix-settings.json in the project root for gameId before asking the user. ' +
|
|
42
|
+
'Requires REMIX_API_KEY to be configured.',
|
|
43
|
+
inputSchema: z.object({
|
|
44
|
+
gameId: z.string().describe('The game ID (check .remix-settings.json in the project root).'),
|
|
45
|
+
name: z.string().min(5).max(25).optional().describe('Updated game name (5–25 characters).'),
|
|
46
|
+
isMultiplayer: z.boolean().optional().describe('Whether the game supports multiplayer.'),
|
|
47
|
+
}),
|
|
48
|
+
execute: (input, config) => updateGame(input.gameId, { name: input.name, isMultiplayer: input.isMultiplayer }, config),
|
|
49
|
+
formatResult: (result) => [
|
|
50
|
+
'Game updated successfully!',
|
|
51
|
+
'',
|
|
52
|
+
` Game ID: ${result.gameId}`,
|
|
53
|
+
` Name: ${result.name}`,
|
|
54
|
+
` Multiplayer: ${result.isMultiplayer}`,
|
|
55
|
+
].join('\n'),
|
|
56
|
+
});
|
|
57
|
+
const uploadVersionDef = defineTool({
|
|
58
|
+
name: 'uploadVersion',
|
|
59
|
+
title: 'Upload Version',
|
|
60
|
+
description: 'Uploads an HTML game file to an existing game version on the Remix platform. ' +
|
|
61
|
+
'Check .remix-settings.json in the project root for gameId and versionId before asking the user. ' +
|
|
62
|
+
'IMPORTANT: This tool reads the file from disk — do NOT read the game file yourself, just pass the file path.',
|
|
63
|
+
inputSchema: z.object({
|
|
64
|
+
gameId: z.string().describe('The game ID (returned by createGame)'),
|
|
65
|
+
versionId: z.string().describe('The version ID (returned by createGame)'),
|
|
66
|
+
filePath: z
|
|
67
|
+
.string()
|
|
68
|
+
.describe('Absolute path to the HTML game file to upload. ' +
|
|
69
|
+
'Do NOT read the file first — this tool reads it internally.'),
|
|
70
|
+
}),
|
|
71
|
+
execute: (input, config) => uploadVersion(input.gameId, input.versionId, input.filePath, config),
|
|
72
|
+
formatResult: (result) => [
|
|
73
|
+
'Game code uploaded successfully!',
|
|
74
|
+
'',
|
|
75
|
+
` Game ID: ${result.gameId}`,
|
|
76
|
+
` Version ID: ${result.versionId}`,
|
|
77
|
+
` Thread ID: ${result.threadId ?? 'N/A'}`,
|
|
78
|
+
].join('\n'),
|
|
79
|
+
});
|
|
80
|
+
const validateGameDef = defineTool({
|
|
81
|
+
name: 'validateGame',
|
|
82
|
+
title: 'Validate Game HTML',
|
|
83
|
+
description: 'Validates an HTML game file for common issues. ' +
|
|
84
|
+
'IMPORTANT: This tool reads the file from disk. Do NOT read the game ' +
|
|
85
|
+
'file yourself before calling this tool — just pass the file path. ' +
|
|
86
|
+
'Call this before uploadVersion.',
|
|
87
|
+
inputSchema: z.object({
|
|
88
|
+
filePath: z
|
|
89
|
+
.string()
|
|
90
|
+
.describe('Absolute path to the HTML game file to validate. ' +
|
|
91
|
+
'Do NOT read the file first — this tool reads it internally.'),
|
|
92
|
+
}),
|
|
93
|
+
execute: (input) => validateGame(input.filePath),
|
|
94
|
+
formatResult: (result) => result.valid
|
|
95
|
+
? 'Validation passed — no issues found.'
|
|
96
|
+
: `Validation found ${result.issues.length} issue(s):\n${result.issues.map((i) => ` - ${i}`).join('\n')}`,
|
|
97
|
+
});
|
|
98
|
+
const generateImageDef = defineTool({
|
|
99
|
+
name: 'generateImage',
|
|
100
|
+
title: 'Generate Image',
|
|
101
|
+
description: 'Generates an image for a game using AI based on a text prompt, ' +
|
|
102
|
+
'uploads it as a game asset, and returns the hosted URL. ' +
|
|
103
|
+
'Requires REMIX_API_KEY to be configured.',
|
|
104
|
+
inputSchema: z.object({
|
|
105
|
+
gameId: z.string().describe('The game ID (returned by createGame)'),
|
|
106
|
+
prompt: z.string().describe('A text description of the image to generate'),
|
|
107
|
+
fileName: z
|
|
108
|
+
.string()
|
|
109
|
+
.optional()
|
|
110
|
+
.describe("Base name for the uploaded asset without extension (e.g. 'treasure-chest'). " +
|
|
111
|
+
'The file extension is determined by the generated image format. ' +
|
|
112
|
+
'Defaults to a slugified version of the prompt.'),
|
|
113
|
+
}),
|
|
114
|
+
execute: (input, config) => generateImage(input.gameId, input.prompt, input.fileName, config),
|
|
115
|
+
formatResult: (result) => result.url
|
|
116
|
+
? `Image generated and uploaded successfully!\n\n URL: ${result.url}\n File: ${result.fileName}\n Prompt: "${result.prompt}"`
|
|
117
|
+
: `Image generated and uploaded successfully!\n\n File: ${result.fileName}\n Prompt: "${result.prompt}"`,
|
|
118
|
+
});
|
|
119
|
+
const uploadGameAssetDef = defineTool({
|
|
120
|
+
name: 'uploadGameAsset',
|
|
121
|
+
title: 'Upload Game Asset',
|
|
122
|
+
description: 'Uploads an asset file (image, audio, 3D model, or video) to a game on the Remix platform. ' +
|
|
123
|
+
'IMPORTANT: This tool reads the file from disk. Do NOT read the asset ' +
|
|
124
|
+
'file yourself before calling this tool — just pass the file path. ' +
|
|
125
|
+
'Requires REMIX_API_KEY to be configured.',
|
|
126
|
+
inputSchema: z.object({
|
|
127
|
+
gameId: z.string().describe('The game ID (returned by createGame)'),
|
|
128
|
+
filePath: z
|
|
129
|
+
.string()
|
|
130
|
+
.describe('Absolute path to the asset file to upload. ' +
|
|
131
|
+
'Supported formats: jpg, jpeg, png, webp, mp3, wav, hrd, glb, gltf, mp4, mov, avi. ' +
|
|
132
|
+
'Do NOT read the file first — this tool reads it internally.'),
|
|
133
|
+
assetName: z
|
|
134
|
+
.string()
|
|
135
|
+
.optional()
|
|
136
|
+
.describe('Custom name for the asset. Defaults to the file name.'),
|
|
137
|
+
}),
|
|
138
|
+
execute: (input, config) => uploadGameAsset(input.gameId, input.filePath, input.assetName, config),
|
|
139
|
+
formatResult: (result) => [
|
|
140
|
+
'Asset uploaded successfully!',
|
|
141
|
+
'',
|
|
142
|
+
` File: ${result.fileName}`,
|
|
143
|
+
` Game ID: ${result.gameId}`,
|
|
144
|
+
'',
|
|
145
|
+
`Response: ${JSON.stringify(result.response, null, 2)}`,
|
|
146
|
+
].join('\n'),
|
|
147
|
+
});
|
|
148
|
+
const itemTypeEnum = z.enum(['TIER_UNLOCK', 'CONSUMABLE', 'ONE_TIME']);
|
|
149
|
+
const shopItemSummary = (result) => [
|
|
150
|
+
` Item ID: ${result.id}`,
|
|
151
|
+
` Game ID: ${result.gameId}`,
|
|
152
|
+
` Name: ${result.name}`,
|
|
153
|
+
` Slug: ${result.slug}`,
|
|
154
|
+
` Status: ${result.status}`,
|
|
155
|
+
` Type: ${result.itemType}`,
|
|
156
|
+
` Bits Cost: ${result.bitsCost ?? 'N/A'}`,
|
|
157
|
+
` Tier: ${result.tier ?? 'N/A'}`,
|
|
158
|
+
].join('\n');
|
|
159
|
+
const listShopItemsDef = defineTool({
|
|
160
|
+
name: 'listShopItems',
|
|
161
|
+
title: 'List Shop Items',
|
|
162
|
+
description: 'Lists shop items for a game on the Remix platform. ' +
|
|
163
|
+
'Use this before editing or deleting items so you can inspect current IDs, slugs, and statuses. ' +
|
|
164
|
+
'Check .remix-settings.json in the project root for gameId before asking the user. ' +
|
|
165
|
+
'Requires REMIX_API_KEY to be configured.',
|
|
166
|
+
inputSchema: z.object({
|
|
167
|
+
gameId: z.string().describe('The game ID to inspect.'),
|
|
168
|
+
}),
|
|
169
|
+
execute: (input, config) => listShopItems(input.gameId, config),
|
|
170
|
+
formatResult: (result) => result.items.length === 0
|
|
171
|
+
? `No shop items found for game ${result.gameId}.`
|
|
172
|
+
: [
|
|
173
|
+
`Found ${result.items.length} shop item(s) for game ${result.gameId}:`,
|
|
174
|
+
'',
|
|
175
|
+
...result.items.flatMap((item) => [shopItemSummary(item), '']),
|
|
176
|
+
]
|
|
177
|
+
.join('\n')
|
|
178
|
+
.trimEnd(),
|
|
179
|
+
});
|
|
180
|
+
const createShopItemDef = defineTool({
|
|
181
|
+
name: 'createShopItem',
|
|
182
|
+
title: 'Create Shop Item',
|
|
183
|
+
description: 'Creates a shop item for a game on the Remix platform. ' +
|
|
184
|
+
'Use this for consumables, one-time unlocks, or tier unlock items that players buy with Bits. ' +
|
|
185
|
+
'Check .remix-settings.json in the project root for gameId before asking the user. ' +
|
|
186
|
+
'If iconUrl is omitted for consumables or one-time items, this tool will try to auto-generate one before creating the item. ' +
|
|
187
|
+
'Requires REMIX_API_KEY to be configured.',
|
|
188
|
+
inputSchema: z.object({
|
|
189
|
+
gameId: z.string().describe('The game ID that owns the shop item.'),
|
|
190
|
+
name: z.string().min(1).max(60).describe('Display name shown in the in-game store.'),
|
|
191
|
+
slug: z
|
|
192
|
+
.string()
|
|
193
|
+
.min(1)
|
|
194
|
+
.max(80)
|
|
195
|
+
.optional()
|
|
196
|
+
.describe("Stable item slug used in game code and purchases (for example 'extra-life'). " +
|
|
197
|
+
'Defaults to a slugified version of the name if omitted.'),
|
|
198
|
+
itemType: itemTypeEnum
|
|
199
|
+
.optional()
|
|
200
|
+
.describe('Purchase behavior. Defaults to CONSUMABLE if omitted.'),
|
|
201
|
+
bitsCost: z
|
|
202
|
+
.number()
|
|
203
|
+
.int()
|
|
204
|
+
.min(0)
|
|
205
|
+
.optional()
|
|
206
|
+
.describe('Bits cost for the item. Required for CONSUMABLE and ONE_TIME items. ' +
|
|
207
|
+
'Tier unlock items can omit this if the backend flow determines pricing elsewhere.'),
|
|
208
|
+
description: z
|
|
209
|
+
.string()
|
|
210
|
+
.max(300)
|
|
211
|
+
.optional()
|
|
212
|
+
.describe('Optional player-facing description for the item.'),
|
|
213
|
+
iconUrl: z
|
|
214
|
+
.string()
|
|
215
|
+
.url()
|
|
216
|
+
.optional()
|
|
217
|
+
.describe('Optional hosted icon URL. Use generateImage or uploadGameAsset to create one.'),
|
|
218
|
+
tier: z.number().int().min(1).optional().describe('Required when itemType is TIER_UNLOCK.'),
|
|
219
|
+
}),
|
|
220
|
+
execute: (input, config) => createShopItem(input, config),
|
|
221
|
+
formatResult: (result) => [
|
|
222
|
+
'Shop item created successfully!',
|
|
223
|
+
'',
|
|
224
|
+
` Item ID: ${result.id}`,
|
|
225
|
+
` Game ID: ${result.gameId}`,
|
|
226
|
+
` Name: ${result.name}`,
|
|
227
|
+
` Slug: ${result.slug}`,
|
|
228
|
+
` Status: ${result.status}`,
|
|
229
|
+
` Type: ${result.itemType}`,
|
|
230
|
+
` Bits Cost: ${result.bitsCost ?? 'N/A'}`,
|
|
231
|
+
` Tier: ${result.tier ?? 'N/A'}`,
|
|
232
|
+
` Icon URL: ${result.iconUrl ?? 'N/A'}`,
|
|
233
|
+
` Description: ${result.description ?? 'N/A'}`,
|
|
234
|
+
].join('\n'),
|
|
235
|
+
});
|
|
236
|
+
const updateShopItemDef = defineTool({
|
|
237
|
+
name: 'updateShopItem',
|
|
238
|
+
title: 'Update Shop Item',
|
|
239
|
+
description: 'Updates a shop item for a game on the Remix platform. ' +
|
|
240
|
+
'Use listShopItems first if you need to inspect the item ID or current values. ' +
|
|
241
|
+
'Status is managed internally and cannot be changed by this tool. ' +
|
|
242
|
+
'Provide only the fields that should change. ' +
|
|
243
|
+
'Requires REMIX_API_KEY to be configured.',
|
|
244
|
+
inputSchema: z.object({
|
|
245
|
+
gameId: z.string().describe('The game ID that owns the item.'),
|
|
246
|
+
itemId: z.string().describe('The item ID to update.'),
|
|
247
|
+
name: z.string().min(1).max(60).optional().describe('Updated display name.'),
|
|
248
|
+
slug: z.string().min(1).max(80).optional().describe('Updated stable slug.'),
|
|
249
|
+
itemType: itemTypeEnum.optional().describe('Updated purchase behavior.'),
|
|
250
|
+
bitsCost: z.number().int().min(0).optional().describe('Updated Bits cost.'),
|
|
251
|
+
description: z
|
|
252
|
+
.union([z.string().max(300), z.null()])
|
|
253
|
+
.optional()
|
|
254
|
+
.describe('Updated description. Pass null to clear it.'),
|
|
255
|
+
iconUrl: z
|
|
256
|
+
.union([z.string().url(), z.null()])
|
|
257
|
+
.optional()
|
|
258
|
+
.describe('Updated icon URL. Pass null to clear it.'),
|
|
259
|
+
tier: z
|
|
260
|
+
.union([z.number().int().min(1), z.null()])
|
|
261
|
+
.optional()
|
|
262
|
+
.describe('Updated tier level. Required for TIER_UNLOCK items. Pass null only when changing away from tier unlocks.'),
|
|
263
|
+
}),
|
|
264
|
+
execute: (input, config) => updateShopItem(input, config),
|
|
265
|
+
formatResult: (result) => ['Shop item updated successfully!', '', shopItemSummary(result)].join('\n'),
|
|
266
|
+
});
|
|
267
|
+
const deleteShopItemDef = defineTool({
|
|
268
|
+
name: 'deleteShopItem',
|
|
269
|
+
title: 'Delete Shop Item',
|
|
270
|
+
description: 'Deletes or deactivates a shop item for a game on the Remix platform, depending on its current status. ' +
|
|
271
|
+
'Use listShopItems first if you need to inspect the item ID or current status. ' +
|
|
272
|
+
'Requires REMIX_API_KEY to be configured.',
|
|
273
|
+
inputSchema: z.object({
|
|
274
|
+
gameId: z.string().describe('The game ID that owns the item.'),
|
|
275
|
+
itemId: z.string().describe('The item ID to delete or deactivate.'),
|
|
276
|
+
}),
|
|
277
|
+
execute: (input, config) => deleteShopItem(input.gameId, input.itemId, config),
|
|
278
|
+
formatResult: (result) => result.item
|
|
279
|
+
? [
|
|
280
|
+
'Shop item deleted successfully!',
|
|
281
|
+
'',
|
|
282
|
+
` Deleted: ${result.deleted}`,
|
|
283
|
+
` Item ID: ${result.itemId}`,
|
|
284
|
+
` Status: ${result.item.status}`,
|
|
285
|
+
].join('\n')
|
|
286
|
+
: [
|
|
287
|
+
'Shop item deleted successfully!',
|
|
288
|
+
'',
|
|
289
|
+
` Deleted: ${result.deleted}`,
|
|
290
|
+
` Item ID: ${result.itemId}`,
|
|
291
|
+
].join('\n'),
|
|
292
|
+
});
|
|
293
|
+
const generateSpriteSheetDef = defineTool({
|
|
294
|
+
name: 'generateSpriteSheet',
|
|
295
|
+
title: 'Generate Sprite Sheet',
|
|
296
|
+
description: 'Generates an animated sprite sheet using AI based on a text prompt. ' +
|
|
297
|
+
'Returns URLs to both the original sprite sheet and a transparent (background-removed) version. ' +
|
|
298
|
+
'Each frame in the grid represents one animation step. ' +
|
|
299
|
+
'Requires REMIX_API_KEY to be configured.',
|
|
300
|
+
inputSchema: z.object({
|
|
301
|
+
gameId: z.string().describe('The game ID (returned by createGame)'),
|
|
302
|
+
prompt: z
|
|
303
|
+
.string()
|
|
304
|
+
.min(1)
|
|
305
|
+
.max(500)
|
|
306
|
+
.describe('A text description of the sprite sheet to generate. ' +
|
|
307
|
+
'Describe the character/object and the animation (e.g. "a pixel-art knight swinging a sword").'),
|
|
308
|
+
gridSize: z
|
|
309
|
+
.number()
|
|
310
|
+
.int()
|
|
311
|
+
.min(2)
|
|
312
|
+
.max(6)
|
|
313
|
+
.optional()
|
|
314
|
+
.describe('Number of rows and columns in the sprite grid (2–6). ' +
|
|
315
|
+
'A grid of 4 means 4×4 = 16 frames. Defaults to 4.'),
|
|
316
|
+
imageUrl: z
|
|
317
|
+
.string()
|
|
318
|
+
.url()
|
|
319
|
+
.optional()
|
|
320
|
+
.describe('Optional reference image URL to guide the sprite generation.'),
|
|
321
|
+
}),
|
|
322
|
+
execute: (input, config) => generateSpriteSheet(input.gameId, input.prompt, input.gridSize, input.imageUrl, config),
|
|
323
|
+
formatResult: (result) => {
|
|
324
|
+
const lines = [
|
|
325
|
+
'Sprite sheet generated successfully!',
|
|
326
|
+
'',
|
|
327
|
+
` Sprite URL: ${result.spriteUrl}`,
|
|
328
|
+
` Transparent Sprite URL: ${result.transparentSpriteUrl}`,
|
|
329
|
+
` Grid: ${result.metadata.gridDimensions} (${result.metadata.gridSize}×${result.metadata.gridSize} = ${result.metadata.gridSize ** 2} frames)`,
|
|
330
|
+
` Original Prompt: "${result.promptOriginal}"`,
|
|
331
|
+
` Rewritten Prompt: "${result.promptRewritten}"`,
|
|
332
|
+
];
|
|
333
|
+
if (result.warnings.length > 0) {
|
|
334
|
+
lines.push('', ' Warnings:');
|
|
335
|
+
for (const w of result.warnings) {
|
|
336
|
+
lines.push(` - ${w}`);
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
return lines.join('\n');
|
|
340
|
+
},
|
|
341
|
+
});
|
|
342
|
+
// ── Registry ─────────────────────────────────────────────────
|
|
343
|
+
export const TOOL_DEFS = [
|
|
344
|
+
createGameDef,
|
|
345
|
+
updateGameDef,
|
|
346
|
+
uploadVersionDef,
|
|
347
|
+
validateGameDef,
|
|
348
|
+
generateImageDef,
|
|
349
|
+
generateSpriteSheetDef,
|
|
350
|
+
uploadGameAssetDef,
|
|
351
|
+
listShopItemsDef,
|
|
352
|
+
createShopItemDef,
|
|
353
|
+
updateShopItemDef,
|
|
354
|
+
deleteShopItemDef,
|
|
355
|
+
];
|
|
356
|
+
//# sourceMappingURL=tool-defs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-defs.js","sourceRoot":"","sources":["../../src/core/tool-defs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { RemixConfig } from '../config.js';
|
|
2
|
+
export interface CreateGameResult {
|
|
3
|
+
gameId: string;
|
|
4
|
+
versionId: string;
|
|
5
|
+
name: string;
|
|
6
|
+
createdAt: string;
|
|
7
|
+
}
|
|
8
|
+
export declare function createGame(name: string, config?: Partial<RemixConfig>): Promise<CreateGameResult>;
|
|
9
|
+
//# sourceMappingURL=create-game.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-game.d.ts","sourceRoot":"","sources":["../../../src/core/tools/create-game.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAG/C,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,MAAM,CAAA;IACjB,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,wBAAsB,UAAU,CAC9B,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,GAC5B,OAAO,CAAC,gBAAgB,CAAC,CAwB3B"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { createServerApiClient } from '../api-client.js';
|
|
2
|
+
import { unwrapApiResponse } from './helpers.js';
|
|
3
|
+
export async function createGame(name, config) {
|
|
4
|
+
const client = createServerApiClient(config);
|
|
5
|
+
const result = await unwrapApiResponse(client.POST('/v1/games', {
|
|
6
|
+
body: { name },
|
|
7
|
+
}));
|
|
8
|
+
const game = result.data.game;
|
|
9
|
+
const gameId = game?.id;
|
|
10
|
+
const versionId = game?.version?.id;
|
|
11
|
+
if (!gameId || !versionId) {
|
|
12
|
+
throw new Error(`Unexpected API response — missing game ID or version ID: ${JSON.stringify(result)}`);
|
|
13
|
+
}
|
|
14
|
+
return {
|
|
15
|
+
gameId,
|
|
16
|
+
versionId,
|
|
17
|
+
name: game.name ?? name,
|
|
18
|
+
createdAt: String(game.createdAt ?? new Date().toISOString()),
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=create-game.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-game.js","sourceRoot":"","sources":["../../../src/core/tools/create-game.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAA;AAExD,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAA;AAShD,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,IAAY,EACZ,MAA6B;IAE7B,MAAM,MAAM,GAAG,qBAAqB,CAAC,MAAM,CAAC,CAAA;IAC5C,MAAM,MAAM,GAAG,MAAM,iBAAiB,CACpC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE;QACvB,IAAI,EAAE,EAAE,IAAI,EAAE;KACf,CAAC,CACH,CAAA;IAED,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAA;IAC7B,MAAM,MAAM,GAAG,IAAI,EAAE,EAAE,CAAA;IACvB,MAAM,SAAS,GAAG,IAAI,EAAE,OAAO,EAAE,EAAE,CAAA;IAEnC,IAAI,CAAC,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CACb,4DAA4D,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CACrF,CAAA;IACH,CAAC;IAED,OAAO;QACL,MAAM;QACN,SAAS;QACT,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,IAAI;QACvB,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,SAAS,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;KAC9D,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { RemixConfig } from '../config.js';
|
|
2
|
+
import { type CreateShopItemResult, type ShopItemType } from './helpers.js';
|
|
3
|
+
export interface CreateShopItemInput {
|
|
4
|
+
gameId: string;
|
|
5
|
+
name: string;
|
|
6
|
+
slug?: string;
|
|
7
|
+
itemType?: ShopItemType;
|
|
8
|
+
bitsCost?: number;
|
|
9
|
+
description?: string;
|
|
10
|
+
iconUrl?: string;
|
|
11
|
+
tier?: number;
|
|
12
|
+
}
|
|
13
|
+
export declare function createShopItem(input: CreateShopItemInput, config?: Partial<RemixConfig>): Promise<CreateShopItemResult>;
|
|
14
|
+
//# sourceMappingURL=create-shop-item.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-shop-item.d.ts","sourceRoot":"","sources":["../../../src/core/tools/create-shop-item.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAE/C,OAAO,EACL,KAAK,oBAAoB,EACzB,KAAK,YAAY,EAGlB,MAAM,cAAc,CAAA;AAErB,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,QAAQ,CAAC,EAAE,YAAY,CAAA;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AA+ED,wBAAsB,cAAc,CAClC,KAAK,EAAE,mBAAmB,EAC1B,MAAM,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,GAC5B,OAAO,CAAC,oBAAoB,CAAC,CAgB/B"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { createServerApiClient } from '../api-client.js';
|
|
2
|
+
import { generateImage } from './generate-image.js';
|
|
3
|
+
import { normalizeShopItem, unwrapApiResponse, } from './helpers.js';
|
|
4
|
+
function buildShopItemIconPrompt(input) {
|
|
5
|
+
const parts = [
|
|
6
|
+
`Create a polished game shop icon for an item named "${input.name}".`,
|
|
7
|
+
input.description ? `Item description: ${input.description}.` : '',
|
|
8
|
+
`Item type: ${input.itemType ?? 'CONSUMABLE'}.`,
|
|
9
|
+
'Style: bold, readable at small sizes, centered subject, high contrast, no text, no letters, no UI, no watermark.',
|
|
10
|
+
'Output a single clean item icon suitable for an in-game store.',
|
|
11
|
+
];
|
|
12
|
+
return parts.filter(Boolean).join(' ');
|
|
13
|
+
}
|
|
14
|
+
function shouldAutoGenerateShopIcon(input) {
|
|
15
|
+
if (input.iconUrl?.trim())
|
|
16
|
+
return false;
|
|
17
|
+
return (input.itemType ?? 'CONSUMABLE') !== 'TIER_UNLOCK';
|
|
18
|
+
}
|
|
19
|
+
async function resolveShopItemIconUrl(input, config) {
|
|
20
|
+
const trimmedIconUrl = input.iconUrl?.trim();
|
|
21
|
+
if (trimmedIconUrl)
|
|
22
|
+
return trimmedIconUrl;
|
|
23
|
+
if (!shouldAutoGenerateShopIcon(input))
|
|
24
|
+
return undefined;
|
|
25
|
+
try {
|
|
26
|
+
const fileNameBase = input.slug?.trim() || input.name.trim();
|
|
27
|
+
const generated = await generateImage(input.gameId, buildShopItemIconPrompt(input), `shop-item-${fileNameBase}`, config);
|
|
28
|
+
return generated.url;
|
|
29
|
+
}
|
|
30
|
+
catch (error) {
|
|
31
|
+
console.warn(`Failed to auto-generate shop icon for "${input.name}":`, error);
|
|
32
|
+
return undefined;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
function buildCreateShopItemBody(input, iconUrl) {
|
|
36
|
+
const itemType = input.itemType ?? 'CONSUMABLE';
|
|
37
|
+
if (itemType === 'TIER_UNLOCK') {
|
|
38
|
+
if (input.tier == null) {
|
|
39
|
+
throw new Error('tier is required when itemType is TIER_UNLOCK');
|
|
40
|
+
}
|
|
41
|
+
return {
|
|
42
|
+
name: input.name,
|
|
43
|
+
...(input.slug ? { slug: input.slug } : {}),
|
|
44
|
+
itemType,
|
|
45
|
+
bitsCost: input.bitsCost ?? 0,
|
|
46
|
+
...(input.description ? { description: input.description } : {}),
|
|
47
|
+
...(iconUrl ? { iconUrl } : {}),
|
|
48
|
+
tier: input.tier,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
if (input.bitsCost == null) {
|
|
52
|
+
throw new Error('bitsCost is required when itemType is CONSUMABLE or ONE_TIME');
|
|
53
|
+
}
|
|
54
|
+
return {
|
|
55
|
+
name: input.name,
|
|
56
|
+
...(input.slug ? { slug: input.slug } : {}),
|
|
57
|
+
itemType,
|
|
58
|
+
bitsCost: input.bitsCost,
|
|
59
|
+
...(input.description ? { description: input.description } : {}),
|
|
60
|
+
...(iconUrl ? { iconUrl } : {}),
|
|
61
|
+
...(input.tier != null ? { tier: input.tier } : {}),
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
export async function createShopItem(input, config) {
|
|
65
|
+
const client = createServerApiClient(config);
|
|
66
|
+
const iconUrl = await resolveShopItemIconUrl(input, config);
|
|
67
|
+
const body = buildCreateShopItemBody(input, iconUrl);
|
|
68
|
+
const result = await unwrapApiResponse(client.POST('/v1/games/{gameId}/items', {
|
|
69
|
+
params: {
|
|
70
|
+
path: {
|
|
71
|
+
gameId: input.gameId,
|
|
72
|
+
},
|
|
73
|
+
},
|
|
74
|
+
body,
|
|
75
|
+
}));
|
|
76
|
+
return normalizeShopItem(result.data.item);
|
|
77
|
+
}
|
|
78
|
+
//# sourceMappingURL=create-shop-item.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-shop-item.js","sourceRoot":"","sources":["../../../src/core/tools/create-shop-item.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { RemixConfig } from '../config.js';
|
|
2
|
+
import { type CreateShopItemResult } from './helpers.js';
|
|
3
|
+
export interface DeleteShopItemResult {
|
|
4
|
+
deleted: boolean;
|
|
5
|
+
itemId: string;
|
|
6
|
+
item?: CreateShopItemResult;
|
|
7
|
+
}
|
|
8
|
+
export declare function deleteShopItem(gameId: string, itemId: string, config?: Partial<RemixConfig>): Promise<DeleteShopItemResult>;
|
|
9
|
+
//# sourceMappingURL=delete-shop-item.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delete-shop-item.d.ts","sourceRoot":"","sources":["../../../src/core/tools/delete-shop-item.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC/C,OAAO,EAAE,KAAK,oBAAoB,EAAwC,MAAM,cAAc,CAAA;AAE9F,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,OAAO,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,oBAAoB,CAAA;CAC5B;AAED,wBAAsB,cAAc,CAClC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,GAC5B,OAAO,CAAC,oBAAoB,CAAC,CAkB/B"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { createServerApiClient } from '../api-client.js';
|
|
2
|
+
import { normalizeShopItem, unwrapApiResponse } from './helpers.js';
|
|
3
|
+
export async function deleteShopItem(gameId, itemId, config) {
|
|
4
|
+
const client = createServerApiClient(config);
|
|
5
|
+
const result = await unwrapApiResponse(client.DELETE('/v1/games/{gameId}/items/{itemId}', {
|
|
6
|
+
params: {
|
|
7
|
+
path: {
|
|
8
|
+
gameId,
|
|
9
|
+
itemId,
|
|
10
|
+
},
|
|
11
|
+
},
|
|
12
|
+
}));
|
|
13
|
+
return {
|
|
14
|
+
deleted: result.data.deleted,
|
|
15
|
+
itemId: result.data.itemId,
|
|
16
|
+
item: result.data.item ? normalizeShopItem(result.data.item) : undefined,
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=delete-shop-item.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delete-shop-item.js","sourceRoot":"","sources":["../../../src/core/tools/delete-shop-item.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAA;AAExD,OAAO,EAA6B,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAA;AAQ9F,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,MAAc,EACd,MAAc,EACd,MAA6B;IAE7B,MAAM,MAAM,GAAG,qBAAqB,CAAC,MAAM,CAAC,CAAA;IAC5C,MAAM,MAAM,GAAG,MAAM,iBAAiB,CACpC,MAAM,CAAC,MAAM,CAAC,mCAAmC,EAAE;QACjD,MAAM,EAAE;YACN,IAAI,EAAE;gBACJ,MAAM;gBACN,MAAM;aACP;SACF;KACF,CAAC,CACH,CAAA;IAED,OAAO;QACL,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO;QAC5B,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM;QAC1B,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,iBAAiB,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;KACzE,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { RemixConfig } from '../config.js';
|
|
2
|
+
export interface GenerateImageResult {
|
|
3
|
+
url?: string;
|
|
4
|
+
fileName: string;
|
|
5
|
+
prompt: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function generateImage(gameId: string, prompt: string, fileName?: string, config?: Partial<RemixConfig>): Promise<GenerateImageResult>;
|
|
8
|
+
//# sourceMappingURL=generate-image.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-image.d.ts","sourceRoot":"","sources":["../../../src/core/tools/generate-image.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAG/C,MAAM,WAAW,mBAAmB;IAClC,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;CACf;AAED,wBAAsB,aAAa,CACjC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,QAAQ,CAAC,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,GAC5B,OAAO,CAAC,mBAAmB,CAAC,CAyC9B"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { createServerApiClient } from '../api-client.js';
|
|
2
|
+
import { getAssetUrl, unwrapApiResponse, uploadAssetFormData } from './helpers.js';
|
|
3
|
+
export async function generateImage(gameId, prompt, fileName, config) {
|
|
4
|
+
const client = createServerApiClient(config);
|
|
5
|
+
const result = await unwrapApiResponse(client.POST('/v1/games/{gameId}/images/generate', {
|
|
6
|
+
params: { path: { gameId } },
|
|
7
|
+
body: { prompt },
|
|
8
|
+
}));
|
|
9
|
+
const imageData = result.data.image?.data;
|
|
10
|
+
const contentType = result.data.image?.contentType ?? 'image/png';
|
|
11
|
+
if (!imageData) {
|
|
12
|
+
throw new Error(`Unexpected API response — missing image data: ${JSON.stringify(result)}`);
|
|
13
|
+
}
|
|
14
|
+
const ext = contentType === 'image/jpeg' ? '.jpg' : contentType === 'image/webp' ? '.webp' : '.png';
|
|
15
|
+
const baseName = fileName
|
|
16
|
+
? fileName.replace(/\.[^.]+$/, '')
|
|
17
|
+
: prompt
|
|
18
|
+
.toLowerCase()
|
|
19
|
+
.replace(/[^a-z0-9]+/g, '-')
|
|
20
|
+
.replace(/^-|-$/g, '')
|
|
21
|
+
.slice(0, 60);
|
|
22
|
+
const resolvedFileName = baseName + ext;
|
|
23
|
+
const formData = new FormData();
|
|
24
|
+
formData.append('file', new Blob([Buffer.from(imageData, 'base64')], { type: contentType }), resolvedFileName);
|
|
25
|
+
const uploadResult = await uploadAssetFormData(gameId, formData, config);
|
|
26
|
+
return {
|
|
27
|
+
url: getAssetUrl(uploadResult.data.asset),
|
|
28
|
+
fileName: resolvedFileName,
|
|
29
|
+
prompt,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=generate-image.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-image.js","sourceRoot":"","sources":["../../../src/core/tools/generate-image.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAA;AAExD,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAQlF,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,MAAc,EACd,MAAc,EACd,QAAiB,EACjB,MAA6B;IAE7B,MAAM,MAAM,GAAG,qBAAqB,CAAC,MAAM,CAAC,CAAA;IAC5C,MAAM,MAAM,GAAG,MAAM,iBAAiB,CACpC,MAAM,CAAC,IAAI,CAAC,oCAAoC,EAAE;QAChD,MAAM,EAAE,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,EAAE;QAC5B,IAAI,EAAE,EAAE,MAAM,EAAE;KACjB,CAAC,CACH,CAAA;IAED,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAA;IACzC,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,WAAW,IAAI,WAAW,CAAA;IAEjE,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,iDAAiD,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;IAC5F,CAAC;IAED,MAAM,GAAG,GACP,WAAW,KAAK,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,KAAK,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAA;IACzF,MAAM,QAAQ,GAAG,QAAQ;QACvB,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;QAClC,CAAC,CAAC,MAAM;aACH,WAAW,EAAE;aACb,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC;aAC3B,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;aACrB,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;IACnB,MAAM,gBAAgB,GAAG,QAAQ,GAAG,GAAG,CAAA;IAEvC,MAAM,QAAQ,GAAG,IAAI,QAAQ,EAAE,CAAA;IAC/B,QAAQ,CAAC,MAAM,CACb,MAAM,EACN,IAAI,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,EACnE,gBAAgB,CACjB,CAAA;IAED,MAAM,YAAY,GAAG,MAAM,mBAAmB,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAA;IAExE,OAAO;QACL,GAAG,EAAE,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC;QACzC,QAAQ,EAAE,gBAAgB;QAC1B,MAAM;KACP,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { RemixConfig } from '../config.js';
|
|
2
|
+
export interface GenerateSpriteSheetResult {
|
|
3
|
+
spriteUrl: string;
|
|
4
|
+
transparentSpriteUrl: string;
|
|
5
|
+
promptOriginal: string;
|
|
6
|
+
promptRewritten: string;
|
|
7
|
+
metadata: {
|
|
8
|
+
gridSize: number;
|
|
9
|
+
gridDimensions: string;
|
|
10
|
+
};
|
|
11
|
+
warnings: string[];
|
|
12
|
+
}
|
|
13
|
+
export declare function generateSpriteSheet(gameId: string, prompt: string, gridSize?: number, imageUrl?: string, config?: Partial<RemixConfig>): Promise<GenerateSpriteSheetResult>;
|
|
14
|
+
//# sourceMappingURL=generate-sprite-sheet.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-sprite-sheet.d.ts","sourceRoot":"","sources":["../../../src/core/tools/generate-sprite-sheet.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAG/C,MAAM,WAAW,yBAAyB;IACxC,SAAS,EAAE,MAAM,CAAA;IACjB,oBAAoB,EAAE,MAAM,CAAA;IAC5B,cAAc,EAAE,MAAM,CAAA;IACtB,eAAe,EAAE,MAAM,CAAA;IACvB,QAAQ,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,CAAA;KAAE,CAAA;IACtD,QAAQ,EAAE,MAAM,EAAE,CAAA;CACnB;AAED,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,QAAQ,CAAC,EAAE,MAAM,EACjB,QAAQ,CAAC,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,GAC5B,OAAO,CAAC,yBAAyB,CAAC,CA6BpC"}
|