@darkclaw921/umgt 0.0.0-stage → 0.2.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.
Files changed (295) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +161 -2
  3. package/architecture.md +105 -0
  4. package/bin/lm-game-hub.js +7 -0
  5. package/dist/server/activity.d.ts +17 -0
  6. package/dist/server/activity.js +55 -0
  7. package/dist/server/activity.js.map +1 -0
  8. package/dist/server/agents/activity.d.ts +36 -0
  9. package/dist/server/agents/activity.js +117 -0
  10. package/dist/server/agents/activity.js.map +1 -0
  11. package/dist/server/agents/claude.d.ts +5 -0
  12. package/dist/server/agents/claude.js +107 -0
  13. package/dist/server/agents/claude.js.map +1 -0
  14. package/dist/server/agents/codex.d.ts +5 -0
  15. package/dist/server/agents/codex.js +128 -0
  16. package/dist/server/agents/codex.js.map +1 -0
  17. package/dist/server/agents/core-tools.d.ts +23 -0
  18. package/dist/server/agents/core-tools.js +298 -0
  19. package/dist/server/agents/core-tools.js.map +1 -0
  20. package/dist/server/agents/core.d.ts +9 -0
  21. package/dist/server/agents/core.js +106 -0
  22. package/dist/server/agents/core.js.map +1 -0
  23. package/dist/server/agents/index.d.ts +5 -0
  24. package/dist/server/agents/index.js +41 -0
  25. package/dist/server/agents/index.js.map +1 -0
  26. package/dist/server/agents/kimi.d.ts +5 -0
  27. package/dist/server/agents/kimi.js +123 -0
  28. package/dist/server/agents/kimi.js.map +1 -0
  29. package/dist/server/agents/rpc.d.ts +19 -0
  30. package/dist/server/agents/rpc.js +102 -0
  31. package/dist/server/agents/rpc.js.map +1 -0
  32. package/dist/server/agents/types.d.ts +51 -0
  33. package/dist/server/agents/types.js +7 -0
  34. package/dist/server/agents/types.js.map +1 -0
  35. package/dist/server/app.d.ts +21 -0
  36. package/dist/server/app.js +38 -0
  37. package/dist/server/app.js.map +1 -0
  38. package/dist/server/asset-catalog.d.ts +5 -0
  39. package/dist/server/asset-catalog.js +525 -0
  40. package/dist/server/asset-catalog.js.map +1 -0
  41. package/dist/server/asset-media.d.ts +16 -0
  42. package/dist/server/asset-media.js +170 -0
  43. package/dist/server/asset-media.js.map +1 -0
  44. package/dist/server/asset-selection.d.ts +71 -0
  45. package/dist/server/asset-selection.js +273 -0
  46. package/dist/server/asset-selection.js.map +1 -0
  47. package/dist/server/assets.d.ts +69 -0
  48. package/dist/server/assets.js +669 -0
  49. package/dist/server/assets.js.map +1 -0
  50. package/dist/server/browser-gateway.d.ts +82 -0
  51. package/dist/server/browser-gateway.js +285 -0
  52. package/dist/server/browser-gateway.js.map +1 -0
  53. package/dist/server/chat-computer.d.ts +13 -0
  54. package/dist/server/chat-computer.js +29 -0
  55. package/dist/server/chat-computer.js.map +1 -0
  56. package/dist/server/chat-games.d.ts +38 -0
  57. package/dist/server/chat-games.js +202 -0
  58. package/dist/server/chat-games.js.map +1 -0
  59. package/dist/server/chat.d.ts +42 -0
  60. package/dist/server/chat.js +318 -0
  61. package/dist/server/chat.js.map +1 -0
  62. package/dist/server/cli.d.ts +14 -0
  63. package/dist/server/cli.js +117 -0
  64. package/dist/server/cli.js.map +1 -0
  65. package/dist/server/core-client.d.ts +69 -0
  66. package/dist/server/core-client.js +357 -0
  67. package/dist/server/core-client.js.map +1 -0
  68. package/dist/server/directory-picker.d.ts +14 -0
  69. package/dist/server/directory-picker.js +113 -0
  70. package/dist/server/directory-picker.js.map +1 -0
  71. package/dist/server/engine.d.ts +36 -0
  72. package/dist/server/engine.js +507 -0
  73. package/dist/server/engine.js.map +1 -0
  74. package/dist/server/events.d.ts +12 -0
  75. package/dist/server/events.js +137 -0
  76. package/dist/server/events.js.map +1 -0
  77. package/dist/server/game-launch.d.ts +16 -0
  78. package/dist/server/game-launch.js +143 -0
  79. package/dist/server/game-launch.js.map +1 -0
  80. package/dist/server/html5.d.ts +9 -0
  81. package/dist/server/html5.js +107 -0
  82. package/dist/server/html5.js.map +1 -0
  83. package/dist/server/interview.d.ts +241 -0
  84. package/dist/server/interview.js +190 -0
  85. package/dist/server/interview.js.map +1 -0
  86. package/dist/server/mcp.d.ts +27 -0
  87. package/dist/server/mcp.js +91 -0
  88. package/dist/server/mcp.js.map +1 -0
  89. package/dist/server/plugins.d.ts +8 -0
  90. package/dist/server/plugins.js +144 -0
  91. package/dist/server/plugins.js.map +1 -0
  92. package/dist/server/process.d.ts +15 -0
  93. package/dist/server/process.js +89 -0
  94. package/dist/server/process.js.map +1 -0
  95. package/dist/server/publication-materials.d.ts +18 -0
  96. package/dist/server/publication-materials.js +104 -0
  97. package/dist/server/publication-materials.js.map +1 -0
  98. package/dist/server/publication-mcp.d.ts +3 -0
  99. package/dist/server/publication-mcp.js +43 -0
  100. package/dist/server/publication-mcp.js.map +1 -0
  101. package/dist/server/publication.d.ts +54 -0
  102. package/dist/server/publication.js +334 -0
  103. package/dist/server/publication.js.map +1 -0
  104. package/dist/server/push.d.ts +81 -0
  105. package/dist/server/push.js +122 -0
  106. package/dist/server/push.js.map +1 -0
  107. package/dist/server/reports.d.ts +4 -0
  108. package/dist/server/reports.js +40 -0
  109. package/dist/server/reports.js.map +1 -0
  110. package/dist/server/roblox-assets.d.ts +41 -0
  111. package/dist/server/roblox-assets.js +131 -0
  112. package/dist/server/roblox-assets.js.map +1 -0
  113. package/dist/server/roblox-connection.d.ts +54 -0
  114. package/dist/server/roblox-connection.js +331 -0
  115. package/dist/server/roblox-connection.js.map +1 -0
  116. package/dist/server/roblox-install.d.ts +4 -0
  117. package/dist/server/roblox-install.js +170 -0
  118. package/dist/server/roblox-install.js.map +1 -0
  119. package/dist/server/roblox-mcp.d.ts +2 -0
  120. package/dist/server/roblox-mcp.js +34 -0
  121. package/dist/server/roblox-mcp.js.map +1 -0
  122. package/dist/server/roblox-play.d.ts +23 -0
  123. package/dist/server/roblox-play.js +84 -0
  124. package/dist/server/roblox-play.js.map +1 -0
  125. package/dist/server/roblox-project-tools.d.ts +11 -0
  126. package/dist/server/roblox-project-tools.js +119 -0
  127. package/dist/server/roblox-project-tools.js.map +1 -0
  128. package/dist/server/roblox-setup.d.ts +37 -0
  129. package/dist/server/roblox-setup.js +206 -0
  130. package/dist/server/roblox-setup.js.map +1 -0
  131. package/dist/server/roblox-skills.d.ts +15 -0
  132. package/dist/server/roblox-skills.js +15 -0
  133. package/dist/server/roblox-skills.js.map +1 -0
  134. package/dist/server/roblox.d.ts +30 -0
  135. package/dist/server/roblox.js +248 -0
  136. package/dist/server/roblox.js.map +1 -0
  137. package/dist/server/routes.d.ts +11 -0
  138. package/dist/server/routes.js +223 -0
  139. package/dist/server/routes.js.map +1 -0
  140. package/dist/server/security.d.ts +4 -0
  141. package/dist/server/security.js +64 -0
  142. package/dist/server/security.js.map +1 -0
  143. package/dist/server/skills.d.ts +4 -0
  144. package/dist/server/skills.js +123 -0
  145. package/dist/server/skills.js.map +1 -0
  146. package/dist/server/store.d.ts +25 -0
  147. package/dist/server/store.js +89 -0
  148. package/dist/server/store.js.map +1 -0
  149. package/dist/server/templates/roblox-coin-run.d.ts +2 -0
  150. package/dist/server/templates/roblox-coin-run.js +326 -0
  151. package/dist/server/templates/roblox-coin-run.js.map +1 -0
  152. package/dist/server/templates/roblox-skills.json +55 -0
  153. package/dist/server/templates/yandex-sdk.d.ts +3 -0
  154. package/dist/server/templates/yandex-sdk.js +177 -0
  155. package/dist/server/templates/yandex-sdk.js.map +1 -0
  156. package/dist/server/updates.d.ts +28 -0
  157. package/dist/server/updates.js +99 -0
  158. package/dist/server/updates.js.map +1 -0
  159. package/dist/server/video-media.d.ts +47 -0
  160. package/dist/server/video-media.js +224 -0
  161. package/dist/server/video-media.js.map +1 -0
  162. package/dist/server/video-routes.d.ts +7 -0
  163. package/dist/server/video-routes.js +91 -0
  164. package/dist/server/video-routes.js.map +1 -0
  165. package/dist/server/video.d.ts +214 -0
  166. package/dist/server/video.js +301 -0
  167. package/dist/server/video.js.map +1 -0
  168. package/dist/server/web-build.d.ts +16 -0
  169. package/dist/server/web-build.js +232 -0
  170. package/dist/server/web-build.js.map +1 -0
  171. package/dist/server/workflow.d.ts +221 -0
  172. package/dist/server/workflow.js +826 -0
  173. package/dist/server/workflow.js.map +1 -0
  174. package/dist/server/yandex-config.d.ts +33 -0
  175. package/dist/server/yandex-config.js +12 -0
  176. package/dist/server/yandex-config.js.map +1 -0
  177. package/dist/server/yandex-godot.d.ts +5 -0
  178. package/dist/server/yandex-godot.js +107 -0
  179. package/dist/server/yandex-godot.js.map +1 -0
  180. package/dist/shared/aspects.d.ts +48 -0
  181. package/dist/shared/aspects.js +22 -0
  182. package/dist/shared/aspects.js.map +1 -0
  183. package/dist/shared/assistant.d.ts +7 -0
  184. package/dist/shared/assistant.js +36 -0
  185. package/dist/shared/assistant.js.map +1 -0
  186. package/dist/shared/chat.d.ts +46 -0
  187. package/dist/shared/chat.js +2 -0
  188. package/dist/shared/chat.js.map +1 -0
  189. package/dist/shared/settings.d.ts +11 -0
  190. package/dist/shared/settings.js +25 -0
  191. package/dist/shared/settings.js.map +1 -0
  192. package/dist/shared/types.d.ts +510 -0
  193. package/dist/shared/types.js +2 -0
  194. package/dist/shared/types.js.map +1 -0
  195. package/dist/web/apple-touch-icon.png +0 -0
  196. package/dist/web/assets/AgentActivity-sYJeY5Yf.js +9 -0
  197. package/dist/web/assets/ArrowRight.es-9w41WqD8.js +1 -0
  198. package/dist/web/assets/ArrowUpRight.es-BmIrpjWN.js +1 -0
  199. package/dist/web/assets/AssetMediaPreview-D2cd6oQO.js +1 -0
  200. package/dist/web/assets/AssetSelectionWizard-a43_6NO7.js +1 -0
  201. package/dist/web/assets/CaretDown.es-Cq33NYip.js +1 -0
  202. package/dist/web/assets/CheckCircle.es-D5B3hdvz.js +1 -0
  203. package/dist/web/assets/CoreAccount-D4ZC8CWv.js +1 -0
  204. package/dist/web/assets/DownloadSimple.es-DwOWFbs2.js +1 -0
  205. package/dist/web/assets/FileText.es-D83IIiOG.js +1 -0
  206. package/dist/web/assets/ImageSquare.es-DxCFt99_.js +1 -0
  207. package/dist/web/assets/KidsApp-BXWaALoK.css +1 -0
  208. package/dist/web/assets/KidsApp-D-8t3HPy.js +2 -0
  209. package/dist/web/assets/MagnifyingGlass.es-rkdOU2rH.js +1 -0
  210. package/dist/web/assets/PaperPlaneRight.es-U0twumpP.js +1 -0
  211. package/dist/web/assets/PencilSimple.es-JVHwRvGx.js +1 -0
  212. package/dist/web/assets/PlainChat-BC4K_tmj.css +1 -0
  213. package/dist/web/assets/PlainChat-CMxYwKko.js +1 -0
  214. package/dist/web/assets/Sparkle.es-CmGpvnNm.js +1 -0
  215. package/dist/web/assets/Square.es-BjNN9Ypc.js +1 -0
  216. package/dist/web/assets/UploadSimple.es-DxIuxpCC.js +1 -0
  217. package/dist/web/assets/WarningCircle.es-D63H8cL9.js +1 -0
  218. package/dist/web/assets/WorkflowJournal-Did0sRta.js +1 -0
  219. package/dist/web/assets/YandexConfigFields-DDL22Bfw.js +1 -0
  220. package/dist/web/assets/YandexGamesView-R64RSJRL.js +2 -0
  221. package/dist/web/assets/bg-build-DIalyCDw.svg +3 -0
  222. package/dist/web/assets/bg-idea-DHcE-Dhs.svg +3 -0
  223. package/dist/web/assets/bg-materials-UDVFaueI.svg +3 -0
  224. package/dist/web/assets/bg-plan-DpfwIsqJ.svg +3 -0
  225. package/dist/web/assets/bg-play-CNc1QZFK.svg +3 -0
  226. package/dist/web/assets/dist-7vx7MTaJ.js +1 -0
  227. package/dist/web/assets/index-Izzbh11U.css +1 -0
  228. package/dist/web/assets/index-sNciOZYG.js +13 -0
  229. package/dist/web/assets/jsx-runtime-CdVFa8IP.js +1 -0
  230. package/dist/web/assets/manrope-cyrillic-wght-normal-Dvxsihut.woff2 +0 -0
  231. package/dist/web/assets/manrope-greek-wght-normal-DL7QRZyv.woff2 +0 -0
  232. package/dist/web/assets/manrope-latin-ext-wght-normal-Ch3YOpNY.woff2 +0 -0
  233. package/dist/web/assets/manrope-latin-wght-normal-DHIcAJRg.woff2 +0 -0
  234. package/dist/web/assets/manrope-vietnamese-wght-normal-usUDDRr7.woff2 +0 -0
  235. package/dist/web/assets/resources-DppXCagL.js +1 -0
  236. package/dist/web/assets/robot-happy-B6YvlU94.svg +24 -0
  237. package/dist/web/assets/robot-hello-CCsQgsS-.svg +24 -0
  238. package/dist/web/assets/robot-listen-Buuz9xII.svg +24 -0
  239. package/dist/web/assets/robot-sad-CRtiNVWs.svg +24 -0
  240. package/dist/web/assets/robot-think-CJ5fDBTm.svg +24 -0
  241. package/dist/web/assets/star-big-CSFDKjws.svg +22 -0
  242. package/dist/web/assets/star-empty-CC-5vioJ.svg +3 -0
  243. package/dist/web/assets/star-next-ztuDjOHU.svg +9 -0
  244. package/dist/web/assets/star-on-l_krO3aV.svg +10 -0
  245. package/dist/web/assets/ui-wHE_yBK0.js +41 -0
  246. package/dist/web/assets/umgt-logo-DAOkTN9u.png +0 -0
  247. package/dist/web/assets/unbounded-cyrillic-wght-normal-C627f1f8.woff2 +0 -0
  248. package/dist/web/assets/unbounded-latin-ext-wght-normal-D6H-S6MW.woff2 +0 -0
  249. package/dist/web/assets/unbounded-latin-wght-normal-D5afBTBx.woff2 +0 -0
  250. package/dist/web/assets/unbounded-vietnamese-wght-normal-rat7GD3o.woff2 +0 -0
  251. package/dist/web/assets/workflow-BhcU9uvG.css +1 -0
  252. package/dist/web/assets/workflow-BrIKN5ER.js +34 -0
  253. package/dist/web/favicon.ico +0 -0
  254. package/dist/web/icons/favicon-16.png +0 -0
  255. package/dist/web/icons/favicon-32.png +0 -0
  256. package/dist/web/icons/icon-192.png +0 -0
  257. package/dist/web/icons/icon-512.png +0 -0
  258. package/dist/web/icons/maskable-192.png +0 -0
  259. package/dist/web/icons/maskable-512.png +0 -0
  260. package/dist/web/index.html +28 -0
  261. package/dist/web/manifest.webmanifest +19 -0
  262. package/dist/web/sw.js +25 -0
  263. package/docs/agent-activity-ui.md +33 -0
  264. package/docs/agent-activity.md +43 -0
  265. package/docs/agent-permissions-ui.md +15 -0
  266. package/docs/api.md +145 -0
  267. package/docs/approval-journal.md +13 -0
  268. package/docs/asset-media.md +27 -0
  269. package/docs/asset-providers.md +34 -0
  270. package/docs/asset-selection.md +31 -0
  271. package/docs/automatic-approvals.md +15 -0
  272. package/docs/background-game-launch.md +17 -0
  273. package/docs/billing-validation.md +23 -0
  274. package/docs/core-isolation.md +37 -0
  275. package/docs/core.md +45 -0
  276. package/docs/generated-text-ui.md +41 -0
  277. package/docs/interactive-interview-ui.md +29 -0
  278. package/docs/interactive-interview.md +52 -0
  279. package/docs/local-codex.md +51 -0
  280. package/docs/local-meshy.md +13 -0
  281. package/docs/markdown.md +11 -0
  282. package/docs/permission-ui.md +11 -0
  283. package/docs/plan.md +47 -0
  284. package/docs/remote-core-deployment.md +47 -0
  285. package/docs/roblox.md +90 -0
  286. package/docs/validation.md +228 -0
  287. package/docs/video-reference.md +35 -0
  288. package/docs/workflow-journal-ui.md +21 -0
  289. package/docs/yandex-foundation.md +27 -0
  290. package/docs/yandex-games.md +45 -0
  291. package/package.json +95 -4
  292. package/scripts/create-roblox-demo.mjs +31 -0
  293. package/scripts/diagnose-roblox-mcp.mjs +45 -0
  294. package/scripts/open-hub-chrome.mjs +60 -0
  295. package/scripts/smoke-agent.mjs +91 -0
@@ -0,0 +1,206 @@
1
+ import { callRobloxProjectTool, robloxProjectTools, resolveOpenedBuild, openedBuildTarget } from './roblox-project-tools.js';
2
+ import { fileURLToPath } from 'node:url';
3
+ import { z } from 'zod';
4
+ import { detectRoblox, openRoblox } from './roblox.js';
5
+ import { ensureRobloxInstalled } from './roblox-install.js';
6
+ import { StudioConnection, StudioConnectionError } from './roblox-connection.js';
7
+ import { RobloxPlay } from './roblox-play.js';
8
+ import { createToken, registerScopedToken } from './security.js';
9
+ export class RobloxSetup {
10
+ hub;
11
+ settings;
12
+ jobs = new Map();
13
+ connection;
14
+ play;
15
+ closed = false;
16
+ constructor(hub, settings) {
17
+ this.hub = hub;
18
+ this.settings = settings;
19
+ this.connection = new StudioConnection({ preferredStudio: id => hub.store.get('roblox-targets', id)?.studioId });
20
+ this.play = new RobloxPlay(hub, this.connection, settings);
21
+ }
22
+ status(project) {
23
+ return this.jobs.get(project.id)?.status ?? { projectId: project.id, status: 'idle', phase: 'detect', message: 'Studio и MCP будут настроены автоматически при открытии проекта.', checkedAt: new Date().toISOString(), tools: [] };
24
+ }
25
+ assertIdle(id) { this.play.assertIdle(id); if (this.jobs.get(id)?.promise)
26
+ throw Object.assign(new Error('Автоматическая настройка Studio ещё выполняется'), { statusCode: 409 }); }
27
+ async settle(id) { await this.jobs.get(id)?.promise; }
28
+ cancel(project) { const job = this.jobs.get(project.id); job?.controller.abort(); return job?.status ?? this.status(project); }
29
+ update(project, job, patch) {
30
+ job.status = { ...job.status, ...patch, checkedAt: new Date().toISOString() };
31
+ this.hub.events.publish('roblox.setup', job.status, project.id);
32
+ }
33
+ start(project) {
34
+ if (this.closed)
35
+ throw new Error('Hub закрывается');
36
+ const previous = this.jobs.get(project.id);
37
+ if (previous?.promise)
38
+ return previous.status;
39
+ const job = { controller: new AbortController(), status: { projectId: project.id, status: 'running', phase: 'detect', message: 'Ищем Roblox Studio', tools: [], checkedAt: new Date().toISOString() } };
40
+ this.jobs.set(project.id, job);
41
+ job.promise = this.prepare(project, job).catch(error => this.failure(project, job, error)).finally(() => { job.promise = undefined; });
42
+ return job.status;
43
+ }
44
+ failure(project, job, error) {
45
+ if (job.controller.signal.aborted) {
46
+ this.update(project, job, { status: 'cancelled', message: 'Настройка остановлена' });
47
+ return;
48
+ }
49
+ const reason = error instanceof StudioConnectionError ? error.reason : 'setup_failed';
50
+ this.update(project, job, { status: ['connection_failed', 'target_missing', 'target_ambiguous', 'mcp_missing'].includes(reason) ? 'action_required' : 'failed', reason, message: error instanceof Error ? error.message : String(error), tools: [], studioId: undefined });
51
+ }
52
+ async prepare(project, job) {
53
+ const signal = job.controller.signal;
54
+ this.update(project, job, { phase: 'install', message: 'Проверяем установку Studio' });
55
+ const studio = await ensureRobloxInstalled(this.settings().robloxStudioPath, this.hub.dataDir, signal, message => this.update(project, job, { message }));
56
+ if (!studio.executable)
57
+ throw new Error(studio.message);
58
+ this.update(project, job, { studioExecutable: studio.executable, phase: 'connect', message: 'Проверяем подключение Studio MCP' });
59
+ // Already-open, verified project places must not be rebuilt/reopened. In
60
+ // particular, do not discard unsaved editor changes or interrupt Play.
61
+ try {
62
+ await this.connection.connect(this.settings(), signal);
63
+ const target = await this.connection.target(project.id, signal);
64
+ this.ready(project, job, target.id);
65
+ return;
66
+ }
67
+ catch (error) {
68
+ if (error instanceof StudioConnectionError && error.reason === 'permission_denied')
69
+ throw error;
70
+ if (error instanceof StudioConnectionError && error.reason === 'target_ambiguous')
71
+ throw error;
72
+ // A protocol/schema failure cannot prove whether the open place belongs
73
+ // to this project. Do not rebuild or reopen over possible unsaved edits.
74
+ if (error instanceof StudioConnectionError && error.reason === 'protocol_error')
75
+ throw error;
76
+ signal.throwIfAborted();
77
+ }
78
+ this.update(project, job, { phase: 'open', message: 'Собираем и открываем place этого проекта' });
79
+ const opened = await openRoblox(project, studio.executable, { signal });
80
+ if (!opened.ok)
81
+ throw new Error(opened.output);
82
+ this.update(project, job, { phase: 'connect', message: 'Ожидаем Studio. При первом запуске войдите и включите Assistant → … → Manage MCP Servers → Enable Studio as MCP server.' });
83
+ // A slow launch needs a bounded wait; failed calls aren't marked ready.
84
+ let lastError;
85
+ for (let attempt = 0; attempt < 20; attempt++) {
86
+ try {
87
+ await this.connection.connect(this.settings(), signal);
88
+ const target = await this.connection.target(project.id, signal);
89
+ this.ready(project, job, target.id);
90
+ return;
91
+ }
92
+ catch (error) {
93
+ lastError = error;
94
+ signal.throwIfAborted();
95
+ if (error instanceof StudioConnectionError && ['permission_denied', 'target_ambiguous', 'mcp_missing', 'protocol_error'].includes(error.reason))
96
+ throw error;
97
+ }
98
+ if (attempt < 19)
99
+ await new Promise((resolve, reject) => { const abort = () => { clearTimeout(timer); reject(signal.reason); }; const timer = setTimeout(() => { signal.removeEventListener('abort', abort); resolve(); }, 1500); signal.addEventListener('abort', abort, { once: true }); });
100
+ }
101
+ throw lastError;
102
+ }
103
+ ready(project, job, studioId) {
104
+ this.update(project, job, { status: 'ready', phase: 'ready', studioId, reason: undefined, tools: this.connection.scopedTools().map(x => x.name), message: 'Studio MCP подключён. Идентификатор place совпадает с проектом; агент может проверять игру.' });
105
+ }
106
+ async check(project, signal) {
107
+ const previous = this.jobs.get(project.id);
108
+ if (previous?.promise)
109
+ return previous.status;
110
+ if (this.closed)
111
+ throw new Error('Hub закрывается');
112
+ const job = { controller: new AbortController(), status: { ...this.status(project), status: 'running', phase: 'connect', message: 'Проверяем Studio MCP' } };
113
+ this.jobs.set(project.id, job);
114
+ const checkSignal = signal ? AbortSignal.any([signal, job.controller.signal]) : job.controller.signal;
115
+ job.promise = (async () => {
116
+ try {
117
+ const studio = await detectRoblox(this.settings().robloxStudioPath, checkSignal);
118
+ if (!studio.available)
119
+ throw new Error('Studio не найдена. Нажмите «Настроить автоматически», чтобы установить её.');
120
+ job.status.studioExecutable = studio.executable;
121
+ await this.connection.connect(this.settings(), checkSignal);
122
+ await resolveOpenedBuild(this.hub, this.connection, project, checkSignal);
123
+ const target = await openedBuildTarget(this.hub, this.connection, project, checkSignal);
124
+ this.ready(project, job, target.id);
125
+ }
126
+ catch (error) {
127
+ this.failure(project, job, error);
128
+ }
129
+ })().finally(() => { job.promise = undefined; });
130
+ await job.promise;
131
+ return job.status;
132
+ }
133
+ async agentConfig(project, signal) {
134
+ const status = await this.check(project, signal);
135
+ signal?.throwIfAborted();
136
+ if (status.status !== 'ready')
137
+ return { message: `Studio MCP: ${status.message} Gameplay must not be reported as verified.` };
138
+ return { message: `Studio MCP verified project ${project.id}; target studio_id: ${status.studioId}. The Hub bridge checks ownership before each call.`, server: undefined };
139
+ }
140
+ async close() { this.closed = true; for (const job of this.jobs.values())
141
+ job.controller.abort(); await this.play.close(); await Promise.allSettled([...this.jobs.values()].map(job => job.promise)); await this.connection.close(); }
142
+ }
143
+ export function registerRobloxSetup(app, hub, settings, projectById, assertIdle, executionSignal) {
144
+ const setup = new RobloxSetup(hub, settings), tokens = new Map();
145
+ const project = (id) => { const value = projectById(id); if (value.engine !== 'roblox')
146
+ throw Object.assign(new Error('Настройка Studio MCP доступна только для Roblox'), { statusCode: 422 }); return value; };
147
+ app.get('/api/v1/projects/:id/roblox/setup', async (request) => { const p = project(request.params.id), status = setup.status(p); return status.status === 'idle' ? setup.check(p) : status; });
148
+ app.post('/api/v1/projects/:id/roblox/setup', async (request, reply) => { const p = project(request.params.id); if (request.body !== undefined)
149
+ z.object({}).strict().parse(request.body); if (setup.status(p).status !== 'running')
150
+ assertIdle(p.id); return reply.code(202).send(setup.start(p)); });
151
+ app.post('/api/v1/projects/:id/roblox/cancel', async (request) => { if (request.body !== undefined)
152
+ z.object({}).strict().parse(request.body); const p = project(request.params.id); setup.cancel(p); await setup.settle(p.id); return setup.status(p); });
153
+ app.post('/api/v1/projects/:id/roblox/check', async (request) => { if (request.body !== undefined)
154
+ z.object({}).strict().parse(request.body); return setup.check(project(request.params.id)); });
155
+ app.post('/api/v1/projects/:id/roblox/mcp', async (request) => {
156
+ const p = project(request.params.id);
157
+ const signal = executionSignal(p.id);
158
+ if (!signal || signal.aborted)
159
+ throw Object.assign(new Error('Studio tools require an active project execution'), { statusCode: 409 });
160
+ const input = z.discriminatedUnion('action', [
161
+ z.object({ action: z.literal('list') }).strict(),
162
+ z.object({ action: z.literal('call'), name: z.string().min(1).max(200), arguments: z.record(z.string(), z.unknown()).default({}) }).strict(),
163
+ ]).parse(request.body);
164
+ await setup.connection.connect(settings(), signal);
165
+ await resolveOpenedBuild(hub, setup.connection, p, signal);
166
+ // Listing schemas also requires a verified project; diagnostics expose no
167
+ // other open place content to the agent.
168
+ if (input.action === 'list') {
169
+ await openedBuildTarget(hub, setup.connection, p, signal);
170
+ return { tools: [...setup.connection.scopedTools(), ...robloxProjectTools] };
171
+ }
172
+ if (robloxProjectTools.some(tool => tool.name === input.name)) {
173
+ z.object({}).strict().parse(input.arguments);
174
+ return callRobloxProjectTool(hub, setup.connection, p, input.name, signal);
175
+ }
176
+ try {
177
+ return await setup.connection.call(p.id, input.name, input.arguments, signal);
178
+ }
179
+ catch (error) {
180
+ if (!(error instanceof StudioConnectionError) || error.reason !== 'target_ambiguous')
181
+ throw error;
182
+ await openedBuildTarget(hub, setup.connection, p, signal);
183
+ return setup.connection.call(p.id, input.name, input.arguments, signal);
184
+ }
185
+ });
186
+ app.addHook('preClose', async () => setup.close());
187
+ return { setup, config: async (p, signal) => {
188
+ const result = await setup.agentConfig(p, signal);
189
+ if (setup.status(p).status !== 'ready')
190
+ return result;
191
+ let token = tokens.get(p.id);
192
+ const path = `/api/v1/projects/${p.id}/roblox/mcp`;
193
+ if (!token) {
194
+ token = createToken();
195
+ tokens.set(p.id, token);
196
+ registerScopedToken(app, token, path);
197
+ }
198
+ const address = app.server.address();
199
+ if (!address || typeof address === 'string')
200
+ return result;
201
+ const filename = fileURLToPath(new URL('./roblox-mcp.js', import.meta.url));
202
+ const source = import.meta.url.endsWith('.ts') ? filename.replace(/\.js$/, '.ts') : filename;
203
+ return { ...result, server: { command: process.execPath, args: source.endsWith('.ts') ? ['--import', fileURLToPath(import.meta.resolve('tsx')), source] : [source], env: { LM_HUB_ROBLOX_URL: `http://127.0.0.1:${address.port}${path}`, LM_HUB_ROBLOX_TOKEN: token } } };
204
+ } };
205
+ }
206
+ //# sourceMappingURL=roblox-setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"roblox-setup.js","sourceRoot":"","sources":["../../src/server/roblox-setup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /** Offline, revision-pinned upstream guidance; no downloaded code is executed. */
2
+ export declare const robloxSkillDefinitions: {
3
+ id: string;
4
+ name: string;
5
+ description: string;
6
+ engine: 'roblox';
7
+ source: string;
8
+ license: string;
9
+ version: string;
10
+ reference: string;
11
+ content: string;
12
+ references: {
13
+ 'LICENSE.txt': string;
14
+ };
15
+ }[];
@@ -0,0 +1,15 @@
1
+ import bundle from './templates/roblox-skills.json' with { type: 'json' };
2
+ /** Offline, revision-pinned upstream guidance; no downloaded code is executed. */
3
+ export const robloxSkillDefinitions = Object.entries(bundle.files)
4
+ .filter(([path]) => path.endsWith('/SKILL.md'))
5
+ .map(([path, fullContent]) => {
6
+ const id = path.split('/')[1];
7
+ const description = fullContent.match(/^description: (.*)$/m)?.[1] ?? id;
8
+ const prefix = `skills/${id}/references/`;
9
+ return { id, name: id, description, engine: 'roblox',
10
+ source: bundle.source, license: 'MIT', version: bundle.revision,
11
+ reference: `https://github.com/EL4CTEO/roblox-skills/tree/${bundle.revision}/skills/${id}`,
12
+ content: fullContent.replace(/^---\n[\s\S]*?\n---\n/, '').trim(),
13
+ references: { ...Object.fromEntries(Object.entries(bundle.files).filter(([name]) => name.startsWith(prefix)).map(([name, text]) => [name.slice(prefix.length), text])), 'LICENSE.txt': bundle.license }, };
14
+ });
15
+ //# sourceMappingURL=roblox-skills.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"roblox-skills.js","sourceRoot":"","sources":["../../src/server/roblox-skills.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,gCAAgC,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAE1E,kFAAkF;AAClF,MAAM,CAAC,MAAM,sBAAsB,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;KAC/D,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;KAC9C,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,WAAW,CAAC,EAAE,EAAE;IAC3B,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9B,MAAM,WAAW,GAAG,WAAW,CAAC,KAAK,CAAC,sBAAsB,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACzE,MAAM,MAAM,GAAG,UAAU,EAAE,cAAc,CAAC;IAC1C,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,QAAiB;QAC3D,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,QAAQ;QAC/D,SAAS,EAAE,iDAAiD,MAAM,CAAC,QAAQ,WAAW,EAAE,EAAE;QAC1F,OAAO,EAAE,WAAW,CAAC,OAAO,CAAC,uBAAuB,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE;QAChE,UAAU,EAAE,EAAE,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,MAAM,CAAC,OAAO,EAAE,GACxM,CAAC;AACJ,CAAC,CAAC,CAAC"}
@@ -0,0 +1,30 @@
1
+ import type { Diagnostic, HubSettings, Project } from '../shared/types.js';
2
+ import type { AgentMcpServer } from './agents/types.js';
3
+ import { type ProcessOptions } from './process.js';
4
+ export declare const robloxLaunchInstructions = "Use Luau and the standard Roblox character controls. The filesystem is the source of truth: edit src/server, src/client, src/shared and default.project.json. Hub builds a local builds/game.rbxlx without Rojo for the documented manifest subset. For additional Rojo features use an installed Rojo CLI. Never publish/upload a place or assets without explicit user instruction. Opening Studio does not start Play automatically. Static packaging does not prove gameplay works; use Studio Play and inspect Output. For build and synchronization use the injected Roblox_Studio tools hub_build, hub_sync_scripts and hub_open_build (stop Play before sync/open; opening can focus an existing place, so compare loaded sources and asset properties against the build before tests). All Studio actions must go through this Hub bridge; never start a separate StudioMCP transport or import Hub modules from the shell to control the game. For assets use lm-assets, which selects the project engine provider. The Roblox_Studio bridge lists only the verified project instance and enforces its studio_id. Never remove or modify ReplicatedStorage.LMGameHubProject. Never modify another open place. Do not claim an unperformed Studio playtest passed.";
5
+ export interface RobloxDiagnostic extends Diagnostic {
6
+ mcpExecutable?: string;
7
+ }
8
+ export declare function detectRoblox(configured?: string, signal?: AbortSignal): Promise<RobloxDiagnostic>;
9
+ export declare function robloxMcpServer(settings: HubSettings): AgentMcpServer | undefined;
10
+ /** Build the explicit Rojo manifest subset without third-party binaries or network access. */
11
+ export interface RobloxScriptSource {
12
+ path: string;
13
+ className: string;
14
+ source: string;
15
+ }
16
+ export declare function buildRoblox(project: Project, options?: ProcessOptions & {
17
+ onScript?: (script: RobloxScriptSource) => void;
18
+ }): Promise<{
19
+ ok: boolean;
20
+ output: string;
21
+ path?: string;
22
+ scripts: string[];
23
+ }>;
24
+ export declare function openRoblox(project: Project, configured?: string, options?: ProcessOptions): Promise<{
25
+ ok: boolean;
26
+ output: string;
27
+ path?: string;
28
+ }>;
29
+ export declare function scaffoldRoblox(project: Project): Promise<void>;
30
+ export declare function createCoinRunSources(project: Project): Promise<void>;
@@ -0,0 +1,248 @@
1
+ import { lstat, mkdir, readFile, readdir, realpath, rename, rm, stat, writeFile } from 'node:fs/promises';
2
+ import { join, resolve } from 'node:path';
3
+ import { homedir } from 'node:os';
4
+ import { randomUUID } from 'node:crypto';
5
+ import { spawn } from 'node:child_process';
6
+ import { runProcess } from './process.js';
7
+ import { coinRunServer, coinRunClient } from './templates/roblox-coin-run.js';
8
+ export const robloxLaunchInstructions = 'Use Luau and the standard Roblox character controls. The filesystem is the source of truth: edit src/server, src/client, src/shared and default.project.json. Hub builds a local builds/game.rbxlx without Rojo for the documented manifest subset. For additional Rojo features use an installed Rojo CLI. Never publish/upload a place or assets without explicit user instruction. Opening Studio does not start Play automatically. Static packaging does not prove gameplay works; use Studio Play and inspect Output. For build and synchronization use the injected Roblox_Studio tools hub_build, hub_sync_scripts and hub_open_build (stop Play before sync/open; opening can focus an existing place, so compare loaded sources and asset properties against the build before tests). All Studio actions must go through this Hub bridge; never start a separate StudioMCP transport or import Hub modules from the shell to control the game. For assets use lm-assets, which selects the project engine provider. The Roblox_Studio bridge lists only the verified project instance and enforces its studio_id. Never remove or modify ReplicatedStorage.LMGameHubProject. Never modify another open place. Do not claim an unperformed Studio playtest passed.';
9
+ const macStudio = '/Applications/RobloxStudio.app/Contents/MacOS/RobloxStudio';
10
+ export async function detectRoblox(configured, signal) {
11
+ signal?.throwIfAborted();
12
+ configured = configured?.trim() || undefined;
13
+ const candidates = configured ? [process.platform === 'darwin' && configured.endsWith('.app') ? join(configured, 'Contents/MacOS/RobloxStudio') : configured] : process.platform === 'darwin'
14
+ ? [macStudio, join(homedir(), 'Applications/RobloxStudio.app/Contents/MacOS/RobloxStudio')]
15
+ : process.platform === 'win32' ? [] : [];
16
+ if (!configured && process.platform === 'win32') {
17
+ const versions = join(process.env.LOCALAPPDATA ?? join(homedir(), 'AppData/Local'), 'Roblox/Versions');
18
+ const installed = await Promise.all((await readdir(versions).catch(() => [])).map(async (entry) => { const executable = join(versions, entry, 'RobloxStudioBeta.exe'); const info = await stat(executable).catch(() => undefined); return { executable, modified: info?.mtimeMs ?? 0 }; }));
19
+ for (const entry of installed.sort((a, b) => b.modified - a.modified))
20
+ candidates.push(entry.executable);
21
+ }
22
+ for (const executable of candidates) {
23
+ if (!(await stat(executable).then(x => x.isFile()).catch(() => false)))
24
+ continue;
25
+ signal?.throwIfAborted();
26
+ const mcpExecutable = process.platform === 'darwin' ? join(resolve(executable, '..'), 'StudioMCP') : undefined;
27
+ return { id: 'roblox', name: 'Roblox Studio', available: true, executable,
28
+ mcpExecutable: mcpExecutable && await stat(mcpExecutable).then(x => x.isFile()).catch(() => false) ? mcpExecutable : undefined,
29
+ message: 'Studio найдена. Локальная сборка .rbxlx доступна. Play и проверка игрового процесса выполняются в Studio; для управления агентом включите встроенный MCP.' };
30
+ }
31
+ return { id: 'roblox', name: 'Roblox Studio', available: false, message: 'Установите Roblox Studio для macOS/Windows или укажите путь к исполняемому файлу в настройках.' };
32
+ }
33
+ export function robloxMcpServer(settings) {
34
+ if (!settings.robloxStudioId?.trim())
35
+ return undefined; // Legacy helper; workflows use the project-scoped bridge.
36
+ const command = settings.robloxMcpPath?.trim() || (process.platform === 'darwin' ? '/Applications/RobloxStudio.app/Contents/MacOS/StudioMCP' : '');
37
+ if (command)
38
+ return { command, args: [], env: {} };
39
+ if (process.platform === 'win32')
40
+ return { command: 'cmd.exe', args: ['/c', join(process.env.LOCALAPPDATA ?? join(homedir(), 'AppData/Local'), 'Roblox/mcp.bat')], env: {} };
41
+ return undefined;
42
+ }
43
+ /** Reject symlinks and traversal before reading source or writing generated artifacts. */
44
+ async function safePath(root, relative, missing = false) {
45
+ if (!relative || relative.includes('\\') || relative.split('/').some(x => !x || x === '..' || x === '.') || relative.startsWith('/') || /^[A-Za-z]:/.test(relative))
46
+ throw new Error('Roblox path must be relative and stay inside project');
47
+ let current = root;
48
+ for (const part of relative.split('/')) {
49
+ current = join(current, part);
50
+ try {
51
+ if ((await lstat(current)).isSymbolicLink())
52
+ throw new Error('Roblox project paths cannot be symbolic links');
53
+ }
54
+ catch (error) {
55
+ if (!(missing && error.code === 'ENOENT'))
56
+ throw error;
57
+ }
58
+ }
59
+ return current;
60
+ }
61
+ const xml = (value) => String(value).replace(/[&<>"']/g, char => ({ '&': '&amp;', '<': '&lt;', '>': '&gt;', '"': '&quot;', "'": '&apos;' }[char]));
62
+ const propertyTypes = {
63
+ Anchored: 'bool', CanCollide: 'bool', CanTouch: 'bool', CanQuery: 'bool', Neutral: 'bool', Enabled: 'bool', Disabled: 'bool', ResetOnSpawn: 'bool',
64
+ Transparency: 'float', Reflectance: 'float', Brightness: 'float', Gravity: 'float', WalkSpeed: 'float', JumpPower: 'float', ClockTime: 'float',
65
+ SoundId: 'Content', MeshId: 'Content', TextureID: 'Content', TextureId: 'Content', Volume: 'float', Looped: 'bool', CFrame: 'CFrame', Scale: 'Vector3', Offset: 'Vector3', MeshType: 'token',
66
+ Size: 'Vector3', Position: 'Vector3', Color: 'Color3', Ambient: 'Color3', OutdoorAmbient: 'Color3',
67
+ Shape: 'token', Material: 'token', Technology: 'token', Text: 'string', Value: 'string',
68
+ };
69
+ function property(name, value) {
70
+ const type = propertyTypes[name];
71
+ if (!type)
72
+ throw new Error(`Unsupported native property ${name}; use Rojo for additional manifest features`);
73
+ if (type === 'Content') {
74
+ if (typeof value !== 'string' || value && !/^rbxasset(?:id:\/\/\d+|:\/\/[^<>]+)$/.test(value))
75
+ throw new Error(`Invalid ${name}`);
76
+ return `<Content name="${name}">${value ? `<url>${xml(value)}</url>` : '<null></null>'}</Content>`;
77
+ }
78
+ if (type === 'CFrame') {
79
+ if (!Array.isArray(value) || value.length !== 12 || value.some(x => typeof x !== 'number' || !Number.isFinite(x)))
80
+ throw new Error('Invalid CFrame');
81
+ const tags = ['X', 'Y', 'Z', 'R00', 'R01', 'R02', 'R10', 'R11', 'R12', 'R20', 'R21', 'R22'];
82
+ return `<CoordinateFrame name="CFrame">${tags.map((tag, i) => `<${tag}>${value[i]}</${tag}>`).join('')}</CoordinateFrame>`;
83
+ }
84
+ if (type === 'Vector3' || type === 'Color3') {
85
+ if (!Array.isArray(value) || value.length !== 3 || value.some(x => typeof x !== 'number' || !Number.isFinite(x)))
86
+ throw new Error(`Invalid ${name}`);
87
+ if (name === 'Position')
88
+ return `<CoordinateFrame name="CFrame"><X>${value[0]}</X><Y>${value[1]}</Y><Z>${value[2]}</Z><R00>1</R00><R01>0</R01><R02>0</R02><R10>0</R10><R11>1</R11><R12>0</R12><R20>0</R20><R21>0</R21><R22>1</R22></CoordinateFrame>`;
89
+ if (name === 'Color') {
90
+ if (value.some(x => x < 0 || x > 1))
91
+ throw new Error('Color components must be in 0..1');
92
+ const [r, g, b] = value.map(x => Math.round(x * 255));
93
+ return `<Color3uint8 name="Color3uint8">${(0xff000000 | (r << 16) | (g << 8) | b) >>> 0}</Color3uint8>`;
94
+ }
95
+ const tags = type === 'Vector3' ? ['X', 'Y', 'Z'] : ['R', 'G', 'B'];
96
+ return `<${type} name="${name === 'Size' ? 'size' : name}">${tags.map((tag, i) => `<${tag}>${value[i]}</${tag}>`).join('')}</${type}>`;
97
+ }
98
+ if (type === 'bool' && typeof value !== 'boolean' || ['float', 'token'].includes(type) && (typeof value !== 'number' || !Number.isFinite(value)) || type === 'string' && typeof value !== 'string')
99
+ throw new Error(`Invalid ${name}`);
100
+ return `<${type} name="${name === 'Shape' ? 'shape' : name}">${xml(value)}</${type}>`;
101
+ }
102
+ export async function buildRoblox(project, options = {}) {
103
+ const root = await realpath(project.path), scripts = [];
104
+ let count = 0;
105
+ const item = (name, kind, properties, children) => {
106
+ if (!/^[A-Za-z][A-Za-z0-9]*$/.test(kind))
107
+ throw new Error('Invalid Roblox class');
108
+ if (++count > 10000)
109
+ throw new Error('Roblox project has too many instances');
110
+ return `<Item class="${kind}" referent="RBX${count}"><Properties><string name="Name">${xml(name)}</string>${properties}</Properties>${children}</Item>`;
111
+ };
112
+ const sourceNode = async (relative, name, instancePath) => {
113
+ options.signal?.throwIfAborted();
114
+ if (relative.split('/').some(p => p.startsWith('.')))
115
+ throw new Error('Hidden project files are not Roblox sources');
116
+ const path = await safePath(root, relative), info = await stat(path);
117
+ if (info.isDirectory()) {
118
+ let children = '';
119
+ for (const entry of (await readdir(path)).sort())
120
+ children += await sourceNode(`${relative}/${entry}`, entry.replace(/\.(?:server|client)?\.?lua[u]?$/, ''), instancePath + '.' + entry.replace(/\.(?:server|client)?\.?lua[u]?$/, ''));
121
+ return item(name, 'Folder', '', children);
122
+ }
123
+ if (!/\.lua[u]?$/.test(relative))
124
+ throw new Error(`Unsupported source ${relative}; use Rojo for non-Luau sources`);
125
+ if (info.size > 2_000_000)
126
+ throw new Error('Roblox script is too large');
127
+ const content = await readFile(path, 'utf8');
128
+ if (!content.trim())
129
+ throw new Error(`Empty Roblox script: ${relative}`);
130
+ scripts.push(path);
131
+ const kind = /\.server\.lua[u]?$/.test(path) ? 'Script' : /\.client\.lua[u]?$/.test(path) ? 'LocalScript' : 'ModuleScript';
132
+ options.onScript?.({ path: instancePath, className: kind, source: content });
133
+ return item(name, kind, `<ProtectedString name="Source">${xml(content)}</ProtectedString>`, '');
134
+ };
135
+ const node = async (name, value, depth = 0, instancePath = 'game.' + name) => {
136
+ if (depth > 30 || !value || typeof value !== 'object' || Array.isArray(value))
137
+ throw new Error('Invalid Roblox manifest tree');
138
+ const data = value;
139
+ for (const key of Object.keys(data))
140
+ if (key.startsWith('$') && !['$className', '$path', '$properties'].includes(key))
141
+ throw new Error(`Unsupported manifest key ${key}; use Rojo`);
142
+ if (data.$path !== undefined && typeof data.$path !== 'string')
143
+ throw new Error('Invalid Roblox source path');
144
+ if (data.$path && !data.$className && !data.$properties && Object.keys(data).length === 1)
145
+ return sourceNode(data.$path, name, instancePath);
146
+ let children = '', properties = '';
147
+ if (data.$path) {
148
+ const path = await safePath(root, data.$path);
149
+ if (!(await stat(path)).isDirectory())
150
+ throw new Error('Class-mapped $path must be a source directory');
151
+ for (const entry of (await readdir(path)).sort())
152
+ children += await sourceNode(`${data.$path}/${entry}`, entry.replace(/\.(?:server|client)?\.?lua[u]?$/, ''), instancePath + '.' + entry.replace(/\.(?:server|client)?\.?lua[u]?$/, ''));
153
+ }
154
+ if (data.$properties)
155
+ for (const [key, val] of Object.entries(data.$properties))
156
+ properties += property(key, val);
157
+ for (const [key, val] of Object.entries(data))
158
+ if (!key.startsWith('$'))
159
+ children += await node(key, val, depth + 1, instancePath + '.' + key);
160
+ return item(name, data.$className ?? 'Folder', properties, children);
161
+ };
162
+ try {
163
+ options.signal?.throwIfAborted();
164
+ const manifest = JSON.parse(await readFile(await safePath(root, 'default.project.json'), 'utf8'));
165
+ for (const key of Object.keys(manifest))
166
+ if (!['name', 'tree'].includes(key))
167
+ throw new Error(`Unsupported manifest field ${key}; use Rojo`);
168
+ if (manifest.tree?.$className !== 'DataModel')
169
+ throw new Error('Manifest root must be DataModel');
170
+ // An exact project marker is verified before any agent can address this place.
171
+ const replicated = manifest.tree.ReplicatedStorage ?? { $className: 'ReplicatedStorage' };
172
+ if (!replicated || typeof replicated !== 'object' || Array.isArray(replicated))
173
+ throw new Error('Invalid ReplicatedStorage manifest');
174
+ if (replicated.LMGameHubProject && (replicated.LMGameHubProject.$className !== 'StringValue' || replicated.LMGameHubProject.$properties?.Value !== project.id))
175
+ throw new Error('LMGameHubProject is reserved for the Hub project identity');
176
+ manifest.tree.ReplicatedStorage = { ...replicated, LMGameHubProject: { $className: 'StringValue', $properties: { Value: project.id } } };
177
+ let body = '';
178
+ for (const [name, value] of Object.entries(manifest.tree))
179
+ if (name !== '$className')
180
+ body += await node(name, value);
181
+ if (!scripts.length)
182
+ throw new Error('Project contains no Luau scripts');
183
+ await safePath(root, 'builds/game.rbxlx', true);
184
+ await mkdir(join(root, 'builds'), { recursive: true });
185
+ const path = join(root, 'builds/game.rbxlx'), temporary = join(root, 'builds', `.${randomUUID()}.rbxlx`);
186
+ try {
187
+ await writeFile(temporary, `<roblox xmlns:xmime="http://www.w3.org/2005/05/xmlmime" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="4"><External>null</External><External>nil</External>${body}</roblox>`, { flag: 'wx' });
188
+ options.signal?.throwIfAborted();
189
+ await rename(temporary, path);
190
+ }
191
+ finally {
192
+ await rm(temporary, { force: true });
193
+ }
194
+ const output = `Roblox: собран ${path}; ${scripts.length} Luau scripts, ${count} instances. Проверены структура, пути и упаковка. Компиляция Luau и Studio Play не выполнялись.\n`;
195
+ options.emit?.(output);
196
+ return { ok: true, output, path, scripts };
197
+ }
198
+ catch (error) {
199
+ options.signal?.throwIfAborted();
200
+ const output = String(error);
201
+ options.emit?.(output);
202
+ return { ok: false, output, scripts };
203
+ }
204
+ }
205
+ export async function openRoblox(project, configured, options = {}) {
206
+ const result = await buildRoblox(project, options);
207
+ if (!result.ok)
208
+ return result;
209
+ const studio = await detectRoblox(configured, options.signal);
210
+ if (!studio.executable)
211
+ throw new Error(studio.message);
212
+ // Hand off to the user's editor. The Hub must not hold an operation open until
213
+ // Studio exits, or terminate an existing editor when Hub closes.
214
+ const application = studio.executable.includes('.app/Contents/MacOS/') ? resolve(studio.executable, '../../..') : studio.executable;
215
+ const launch = process.platform === 'darwin' ? await runProcess('/usr/bin/open', ['-a', application, result.path], { ...options, timeout: 15000 }) : await new Promise((resolve, reject) => {
216
+ options.signal?.throwIfAborted();
217
+ const child = spawn(studio.executable, [result.path], { detached: true, stdio: 'ignore', shell: false, windowsHide: false });
218
+ child.once('error', reject);
219
+ child.once('spawn', () => { child.unref(); resolve({ code: 0, cancelled: false, output: '' }); });
220
+ });
221
+ const output = launch.output + '\nФайл передан Roblox Studio. Для запуска нажмите Play. Открытие окна не подтверждает игровую проверку.\n';
222
+ options.emit?.(output);
223
+ return { ok: launch.code === 0 && !launch.cancelled, output, path: result.path };
224
+ }
225
+ export async function scaffoldRoblox(project) {
226
+ if (project.dimension !== '3d' || project.platforms.some(p => p !== 'roblox'))
227
+ throw new Error('Roblox uses a 3D scene and the Roblox platform');
228
+ for (const directory of ['src/server', 'src/client', 'src/shared', 'assets', '.lm-game-hub'])
229
+ await mkdir(join(project.path, directory), { recursive: true });
230
+ const tree = { $className: 'DataModel', Workspace: { $className: 'Workspace', Ground: { $className: 'Part', $properties: { Anchored: true, Size: [140, 2, 220], Position: [0, -1, -75], Color: [0.17, 0.35, 0.24] } }, Spawn: { $className: 'SpawnLocation', $properties: { Anchored: true, Neutral: true, Size: [10, 1, 10], Position: [0, 0.5, 8] } } }, ServerScriptService: { $className: 'ServerScriptService', $path: 'src/server' }, ReplicatedStorage: { $className: 'ReplicatedStorage', LMGameHubProject: { $className: 'StringValue', $properties: { Value: project.id } }, Shared: { $path: 'src/shared' } }, StarterPlayer: { $className: 'StarterPlayer', StarterPlayerScripts: { $className: 'StarterPlayerScripts', $path: 'src/client' } } };
231
+ await writeFile(join(project.path, 'default.project.json'), JSON.stringify({ name: project.name, tree }, null, 2), { flag: 'wx' });
232
+ await writeFile(join(project.path, 'src/server/Main.server.luau'), '--!strict\nprint("Game Hub: create your game from the approved plan")\n', { flag: 'wx' });
233
+ await writeFile(join(project.path, 'src/client/Main.client.luau'), '--!strict\nprint("Game Hub client ready")\n', { flag: 'wx' });
234
+ await writeFile(join(project.path, '.gitignore'), 'builds/\n.lm-game-hub/*.sqlite*\n.lm-game-hub/tmp/\n');
235
+ await writeFile(join(project.path, 'README.md'), `# ${project.name}\n\nLuau sources live in src/server, src/client and src/shared. Hub builds builds/game.rbxlx, then opens it in Roblox Studio. Press Play to test. Do not edit the generated place as the only copy: rebuilding replaces it from source. The default.project.json is also compatible with Rojo. Native Hub packaging supports Luau files, directories, explicit classes and the properties documented in docs/roblox.md in the Hub repository; unsupported features fail explicitly. Use Rojo for larger projects.\n\nHub sets up Studio MCP automatically and verifies the LMGameHubProject marker before connecting agents. On first use sign in to Studio and enable Assistant → … → Manage MCP Servers → Enable Studio as MCP server, then press Check connection in Hub. No manual Studio ID or global CLI configuration is needed. No publication is automatic.\n`);
236
+ const build = await buildRoblox(project);
237
+ if (!build.ok)
238
+ throw new Error(build.output);
239
+ }
240
+ export async function createCoinRunSources(project) {
241
+ const root = await realpath(project.path);
242
+ await writeFile(await safePath(root, 'src/server/Main.server.luau'), coinRunServer);
243
+ await writeFile(await safePath(root, 'src/client/Main.client.luau'), coinRunClient);
244
+ const result = await buildRoblox(project);
245
+ if (!result.ok)
246
+ throw new Error(result.output);
247
+ }
248
+ //# sourceMappingURL=roblox.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"roblox.js","sourceRoot":"","sources":["../../src/server/roblox.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { type PushSender } from './push.js';
2
+ import type { FastifyInstance } from 'fastify';
3
+ import type { HubContext } from './app.js';
4
+ import { type WorkflowOptions } from './workflow.js';
5
+ import { type PublicationOptions } from './publication.js';
6
+ import { type DirectoryPicker } from './directory-picker.js';
7
+ export declare function registerRoutes(app: FastifyInstance, hub: HubContext, workflowOptions?: WorkflowOptions & {
8
+ directoryPicker?: DirectoryPicker;
9
+ pushSender?: PushSender;
10
+ publication?: Partial<PublicationOptions>;
11
+ }): Promise<void>;