@weppy/roblox-mcp 2.1.3 → 2.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +2 -2
- package/CHANGELOG.md +17 -10
- package/README.md +1 -1
- package/docs/en/dashboard/overview.md +1 -1
- package/docs/en/dashboard/settings.md +1 -8
- package/docs/en/dashboard/sync.md +0 -7
- package/docs/en/sync/overview.md +0 -1
- package/docs/en/tools/overview.md +0 -1
- package/docs/es/dashboard/overview.md +1 -1
- package/docs/es/dashboard/settings.md +1 -8
- package/docs/es/dashboard/sync.md +0 -7
- package/docs/es/sync/overview.md +0 -1
- package/docs/es/tools/overview.md +0 -1
- package/docs/id/dashboard/overview.md +1 -1
- package/docs/id/dashboard/settings.md +1 -8
- package/docs/id/dashboard/sync.md +0 -7
- package/docs/id/sync/overview.md +0 -1
- package/docs/id/tools/overview.md +0 -1
- package/docs/ja/dashboard/overview.md +1 -1
- package/docs/ja/dashboard/settings.md +1 -8
- package/docs/ja/dashboard/sync.md +0 -7
- package/docs/ja/sync/overview.md +0 -1
- package/docs/ja/tools/overview.md +0 -1
- package/docs/ko/dashboard/overview.md +1 -1
- package/docs/ko/dashboard/settings.md +1 -8
- package/docs/ko/dashboard/sync.md +0 -7
- package/docs/ko/sync/overview.md +0 -1
- package/docs/ko/tools/overview.md +0 -1
- package/docs/pt-br/dashboard/overview.md +1 -1
- package/docs/pt-br/dashboard/settings.md +1 -8
- package/docs/pt-br/dashboard/sync.md +0 -7
- package/docs/pt-br/sync/overview.md +0 -1
- package/docs/pt-br/tools/overview.md +0 -1
- package/llms-full.txt +1 -2
- package/package.json +1 -1
- package/plugins/weppy-roblox-mcp/.claude-plugin/plugin.json +1 -1
- package/plugins/weppy-roblox-mcp/dashboard/dist/assets/{ChangelogDetailPage-2ZPwh_Le.js → ChangelogDetailPage-D7eMrarv.js} +1 -1
- package/plugins/weppy-roblox-mcp/dashboard/dist/assets/{ChangelogPage-DW2_STiE.js → ChangelogPage-DFCCRyyK.js} +1 -1
- package/plugins/weppy-roblox-mcp/dashboard/dist/assets/{ConfirmModal-CInBBLZW.js → ConfirmModal-BmRJ2JXZ.js} +1 -1
- package/plugins/weppy-roblox-mcp/dashboard/dist/assets/{ConnectionPage-nNwPIEZw.js → ConnectionPage-CiaCY026.js} +1 -1
- package/plugins/weppy-roblox-mcp/dashboard/dist/assets/{InfoLabel-B_Ys60mi.js → InfoLabel-CCDWZLC9.js} +1 -1
- package/plugins/weppy-roblox-mcp/dashboard/dist/assets/{OverviewPage-BMBzDR4R.js → OverviewPage-BHpt3LI2.js} +1 -1
- package/plugins/weppy-roblox-mcp/dashboard/dist/assets/{PlaytestPage-BDgsWgto.js → PlaytestPage-CNwwI5Ro.js} +1 -1
- package/plugins/weppy-roblox-mcp/dashboard/dist/assets/{PropertyDiff-BbsF9z4D.js → PropertyDiff-DIplDn-J.js} +1 -1
- package/plugins/weppy-roblox-mcp/dashboard/dist/assets/SettingsPage-CPqQYZPN.js +1 -0
- package/plugins/weppy-roblox-mcp/dashboard/dist/assets/SettingsPage-DTv0NbEY.css +1 -0
- package/plugins/weppy-roblox-mcp/dashboard/dist/assets/{StatusBadge-FYpJOX7r.js → StatusBadge-C8VKAPpk.js} +1 -1
- package/plugins/weppy-roblox-mcp/dashboard/dist/assets/SyncPage-CLt9jxd8.css +1 -0
- package/plugins/weppy-roblox-mcp/dashboard/dist/assets/SyncPage-DTSKbpio.js +4 -0
- package/plugins/weppy-roblox-mcp/dashboard/dist/assets/TierComparison-7ofkPwj3.js +1 -0
- package/plugins/weppy-roblox-mcp/dashboard/dist/assets/{TierPromoProgress-Cuz1dgcs.js → TierPromoProgress-SnRUjAPh.js} +1 -1
- package/plugins/weppy-roblox-mcp/dashboard/dist/assets/{ToolsPage-YGBoDwbQ.js → ToolsPage-CrdNh3D9.js} +1 -1
- package/plugins/weppy-roblox-mcp/dashboard/dist/assets/index-DGGmfli1.js +129 -0
- package/plugins/weppy-roblox-mcp/dashboard/dist/assets/{useLiveUptime-D5Ux8dA5.js → useLiveUptime-BnXeLpOw.js} +1 -1
- package/plugins/weppy-roblox-mcp/dashboard/dist/index.html +1 -1
- package/plugins/weppy-roblox-mcp/dist/index.js +61 -64
- package/plugins/weppy-roblox-mcp/roblox-plugin/WeppyRobloxMCP.rbxm +0 -0
- package/plugins/weppy-roblox-mcp/dashboard/dist/assets/SettingsPage-BB7-WAMU.css +0 -1
- package/plugins/weppy-roblox-mcp/dashboard/dist/assets/SettingsPage-BPSAA3lu.js +0 -1
- package/plugins/weppy-roblox-mcp/dashboard/dist/assets/SyncPage-BcXYv0GI.js +0 -4
- package/plugins/weppy-roblox-mcp/dashboard/dist/assets/SyncPage-Bf1SdHGg.css +0 -1
- package/plugins/weppy-roblox-mcp/dashboard/dist/assets/TierComparison-D4uVUGcZ.js +0 -1
- package/plugins/weppy-roblox-mcp/dashboard/dist/assets/index-BNdn6WpU.js +0 -129
|
@@ -6,14 +6,14 @@
|
|
|
6
6
|
},
|
|
7
7
|
"metadata": {
|
|
8
8
|
"description": "Weppy Roblox MCP — MCP server that lets AI coding agents control a live Roblox Studio session with 21 tools, 140+ actions, bidirectional sync, automated playtest, and multi-place support",
|
|
9
|
-
"version": "2.1
|
|
9
|
+
"version": "2.2.1"
|
|
10
10
|
},
|
|
11
11
|
"plugins": [
|
|
12
12
|
{
|
|
13
13
|
"name": "weppy-roblox-mcp",
|
|
14
14
|
"source": "./plugins/weppy-roblox-mcp",
|
|
15
15
|
"description": "Weppy Roblox MCP — MCP server that lets AI coding agents control a live Roblox Studio session with 21 tools, 140+ actions, bidirectional sync, automated playtest, and multi-place support",
|
|
16
|
-
"version": "2.1
|
|
16
|
+
"version": "2.2.1",
|
|
17
17
|
"author": {
|
|
18
18
|
"name": "hope1026"
|
|
19
19
|
},
|
package/CHANGELOG.md
CHANGED
|
@@ -4,26 +4,33 @@ All notable changes to this project will be documented in this file.
|
|
|
4
4
|
|
|
5
5
|
|
|
6
6
|
|
|
7
|
+
## [2.2.1] - 2026-04-03
|
|
7
8
|
|
|
9
|
+
### Features
|
|
8
10
|
|
|
11
|
+
- implement command acknowledgment and in-flight request tracking to ensure reliable command delivery and timeout handling
|
|
9
12
|
|
|
10
13
|
|
|
14
|
+
## [2.2.0] - 2026-04-03
|
|
11
15
|
|
|
16
|
+
### Sync Stability
|
|
12
17
|
|
|
18
|
+
- Redesign sync algorithm for large-scale instances — snapshot-based scanner replaces legacy chokidar detector for improved reliability
|
|
19
|
+
- Add throttled sync initialization with retry logic and session cleanup
|
|
20
|
+
- Harden scanner lifecycle transitions: startup cancellation, resume, finalize, and queue ordering
|
|
21
|
+
- Close full-sync detector lifecycle races and preserve snapshot kind transitions
|
|
22
|
+
- Improve reverse sync path resolution with snapshot-based scanning
|
|
13
23
|
|
|
24
|
+
### Features
|
|
14
25
|
|
|
26
|
+
- Add client-mode idle watchdog with configurable timeout for automatic shutdown
|
|
27
|
+
- Separate health check and polling failure thresholds for better connection state management
|
|
28
|
+
- Add upstream permanent failure detection with graceful shutdown callback
|
|
15
29
|
|
|
30
|
+
### Bug Fixes
|
|
16
31
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
32
|
+
- Fix cancel-pending license state incorrectly treated as inactive
|
|
33
|
+
- Fix detector activity reporting and status exposure in idle responses
|
|
27
34
|
|
|
28
35
|
|
|
29
36
|
## [2.1.3] - 2026-03-31
|
package/README.md
CHANGED
|
@@ -37,7 +37,7 @@ Then restart Roblox Studio — done!
|
|
|
37
37
|
Automatic MCP registration currently supports **Claude Code, Claude Desktop, Cursor, Codex CLI, and Gemini CLI**.
|
|
38
38
|
**Codex App** and **Antigravity** still require manual setup after the script finishes.
|
|
39
39
|
|
|
40
|
-
If PowerShell execution is blocked on Windows, use the manual install path below. If you're using the ZIP package, you can
|
|
40
|
+
If PowerShell execution is blocked on Windows, use the manual install path below. If you're using the ZIP package, you can run `setup-plugin.sh` / `setup-mcp.sh` on macOS or Linux, or `setup-plugin.bat` / `setup-mcp.bat` on Windows.
|
|
41
41
|
|
|
42
42
|
### Manual Install
|
|
43
43
|
|
|
@@ -22,7 +22,7 @@ The dashboard is a web-based monitoring interface provided by the MCP server. It
|
|
|
22
22
|
| [Sync](sync.md) | Sync status, direction settings, logs | [Detailed Guide](sync.md) |
|
|
23
23
|
| [Playtest](playtest.md) | Playtest status, test history | [Detailed Guide](playtest.md) |
|
|
24
24
|
| [Tools](tools.md) | Tool execution history, statistics, tier distribution | [Detailed Guide](tools.md) |
|
|
25
|
-
| [Settings](settings.md) | License, log level,
|
|
25
|
+
| [Settings](settings.md) | License, log level, language | [Detailed Guide](settings.md) |
|
|
26
26
|
|
|
27
27
|
## How to Access
|
|
28
28
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Settings
|
|
2
2
|
|
|
3
|
-
> View and manage license information, server settings,
|
|
3
|
+
> View and manage license information, server settings, and language.
|
|
4
4
|
|
|
5
5
|
## Overview
|
|
6
6
|
|
|
@@ -36,13 +36,6 @@ Displays server settings configured via environment variables:
|
|
|
36
36
|
| `HTTP_HOST` | HTTP host | 127.0.0.1 |
|
|
37
37
|
| `DASHBOARD_AUTO_OPEN` | Auto-open dashboard | true |
|
|
38
38
|
|
|
39
|
-
## Sync Settings
|
|
40
|
-
|
|
41
|
-
| Setting | Description |
|
|
42
|
-
|---------|-------------|
|
|
43
|
-
| Max Depth | Maximum sync depth |
|
|
44
|
-
| Max Instances | Maximum number of synced instances |
|
|
45
|
-
|
|
46
39
|
## Language
|
|
47
40
|
|
|
48
41
|
Change the dashboard UI language. 6 languages + Auto (automatic browser language detection) are supported.
|
|
@@ -35,13 +35,6 @@ Shows sync directions by type in a table:
|
|
|
35
35
|
|
|
36
36
|
Check each type's sync direction to understand which changes are reflected in which direction.
|
|
37
37
|
|
|
38
|
-
## Sync Config
|
|
39
|
-
|
|
40
|
-
Displays sync configuration values:
|
|
41
|
-
- Max Depth — Maximum sync depth
|
|
42
|
-
- Max Instances — Maximum number of synced instances
|
|
43
|
-
- Interval — Sync interval
|
|
44
|
-
|
|
45
38
|
## Sync Log
|
|
46
39
|
|
|
47
40
|
Displays sync events in chronological order. Each log entry includes a change type tag (create, update, delete, etc.) and the target path.
|
package/docs/en/sync/overview.md
CHANGED
|
@@ -86,7 +86,6 @@ In Pro, Direction and Apply Mode can be controlled per type.
|
|
|
86
86
|
| Action | Description | Key params |
|
|
87
87
|
|------|------|-----------|
|
|
88
88
|
| `status` | Check current sync state for a place | `placeId` |
|
|
89
|
-
| `config` | Get sync configuration | `placeId` |
|
|
90
89
|
| `history` | Query change history | `placeId`, `query.limit`, `query.offset` |
|
|
91
90
|
| `directions` | Get per-type direction settings | `placeId` |
|
|
92
91
|
| `read_file` | Read a synced file | `placeId`, `instancePath` |
|
|
@@ -228,7 +228,6 @@ Sync policy:
|
|
|
228
228
|
| Action | Description | Tier |
|
|
229
229
|
|--------|-------------|------|
|
|
230
230
|
| `status` | Get sync status for a place | Pro |
|
|
231
|
-
| `config` | Get sync configuration | Pro |
|
|
232
231
|
| `history` | Get change history | Pro |
|
|
233
232
|
| `directions` | Get per-type sync directions | Pro |
|
|
234
233
|
| `read_file` | Read a synced file | Pro |
|
|
@@ -22,7 +22,7 @@ El Dashboard es una interfaz de monitoreo basada en web proporcionada por el ser
|
|
|
22
22
|
| [Sync](sync.md) | Estado de sincronizacion, configuracion de direccion, logs | [Guia detallada](sync.md) |
|
|
23
23
|
| [Playtest](playtest.md) | Estado del playtest, historial de pruebas | [Guia detallada](playtest.md) |
|
|
24
24
|
| [Tools](tools.md) | Historial de ejecucion de herramientas, estadisticas, distribucion por tier | [Guia detallada](tools.md) |
|
|
25
|
-
| [Settings](settings.md) | Licencia, nivel de log,
|
|
25
|
+
| [Settings](settings.md) | Licencia, nivel de log, idioma | [Guia detallada](settings.md) |
|
|
26
26
|
|
|
27
27
|
## Como acceder
|
|
28
28
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Settings
|
|
2
2
|
|
|
3
|
-
> Consulta y gestiona la informacion de licencia, la configuracion del servidor
|
|
3
|
+
> Consulta y gestiona la informacion de licencia, la configuracion del servidor y el idioma.
|
|
4
4
|
|
|
5
5
|
## Descripcion general
|
|
6
6
|
|
|
@@ -36,13 +36,6 @@ Muestra la configuracion del servidor establecida mediante variables de entorno:
|
|
|
36
36
|
| `HTTP_HOST` | Host HTTP | 127.0.0.1 |
|
|
37
37
|
| `DASHBOARD_AUTO_OPEN` | Apertura automatica del dashboard | true |
|
|
38
38
|
|
|
39
|
-
## Sync Settings
|
|
40
|
-
|
|
41
|
-
| Configuracion | Descripcion |
|
|
42
|
-
|---------------|-------------|
|
|
43
|
-
| Max Depth | Profundidad maxima de sincronizacion |
|
|
44
|
-
| Max Instances | Numero maximo de instancias a sincronizar |
|
|
45
|
-
|
|
46
39
|
## Language
|
|
47
40
|
|
|
48
41
|
Cambia el idioma de la interfaz del Dashboard. Soporta 6 idiomas + Auto (deteccion automatica del idioma del navegador).
|
|
@@ -35,13 +35,6 @@ Muestra en una tabla la direccion de sincronizacion por tipo:
|
|
|
35
35
|
|
|
36
36
|
Permite verificar la direccion de sincronizacion de cada tipo para entender en que direccion se reflejan los cambios.
|
|
37
37
|
|
|
38
|
-
## Sync Config
|
|
39
|
-
|
|
40
|
-
Muestra los valores de configuracion de sincronizacion:
|
|
41
|
-
- Max Depth — profundidad maxima de sincronizacion
|
|
42
|
-
- Max Instances — numero maximo de instancias a sincronizar
|
|
43
|
-
- Interval — intervalo de sincronizacion
|
|
44
|
-
|
|
45
38
|
## Sync Log
|
|
46
39
|
|
|
47
40
|
Muestra los eventos de sincronizacion en orden cronologico. Cada entrada del log incluye una etiqueta de tipo de cambio (create, update, delete, etc.) y la ruta del objetivo.
|
package/docs/es/sync/overview.md
CHANGED
|
@@ -86,7 +86,6 @@ En Pro puedes controlar Direction y Apply Mode por tipo.
|
|
|
86
86
|
| Accion | Descripcion | Parametros clave |
|
|
87
87
|
|------|------|-----------|
|
|
88
88
|
| `status` | Consultar estado actual de sync de un place | `placeId` |
|
|
89
|
-
| `config` | Obtener configuracion de sync | `placeId` |
|
|
90
89
|
| `history` | Consultar historial de cambios | `placeId`, `query.limit`, `query.offset` |
|
|
91
90
|
| `directions` | Obtener direcciones por tipo | `placeId` |
|
|
92
91
|
| `read_file` | Leer archivo sincronizado | `placeId`, `instancePath` |
|
|
@@ -228,7 +228,6 @@ Politica de Sync:
|
|
|
228
228
|
| Accion | Descripcion | Tier |
|
|
229
229
|
|--------|-------------|------|
|
|
230
230
|
| `status` | Obtener estado de sincronizacion de un Place | Pro |
|
|
231
|
-
| `config` | Obtener configuracion de sincronizacion | Pro |
|
|
232
231
|
| `history` | Obtener historial de cambios | Pro |
|
|
233
232
|
| `directions` | Obtener direcciones de sincronizacion por tipo | Pro |
|
|
234
233
|
| `read_file` | Leer un archivo sincronizado | Pro |
|
|
@@ -22,7 +22,7 @@ Dashboard adalah antarmuka pemantauan berbasis web yang disediakan oleh server M
|
|
|
22
22
|
| [Sync](sync.md) | Status sinkronisasi, pengaturan arah, log | [Panduan detail](sync.md) |
|
|
23
23
|
| [Playtest](playtest.md) | Status playtest, riwayat pengujian | [Panduan detail](playtest.md) |
|
|
24
24
|
| [Tools](tools.md) | Riwayat eksekusi alat, statistik, distribusi tier | [Panduan detail](tools.md) |
|
|
25
|
-
| [Settings](settings.md) | Lisensi, level log,
|
|
25
|
+
| [Settings](settings.md) | Lisensi, level log, bahasa | [Panduan detail](settings.md) |
|
|
26
26
|
|
|
27
27
|
## Cara Mengakses
|
|
28
28
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Settings
|
|
2
2
|
|
|
3
|
-
> Periksa dan kelola informasi lisensi, pengaturan server,
|
|
3
|
+
> Periksa dan kelola informasi lisensi, pengaturan server, dan bahasa.
|
|
4
4
|
|
|
5
5
|
## Ikhtisar
|
|
6
6
|
|
|
@@ -36,13 +36,6 @@ Menampilkan pengaturan server yang dikonfigurasi melalui variabel lingkungan:
|
|
|
36
36
|
| `HTTP_HOST` | Host HTTP | 127.0.0.1 |
|
|
37
37
|
| `DASHBOARD_AUTO_OPEN` | Pembukaan otomatis dashboard | true |
|
|
38
38
|
|
|
39
|
-
## Sync Settings
|
|
40
|
-
|
|
41
|
-
| Pengaturan | Deskripsi |
|
|
42
|
-
|------------|-----------|
|
|
43
|
-
| Max Depth | Kedalaman maksimum sinkronisasi |
|
|
44
|
-
| Max Instances | Jumlah maksimum instance yang disinkronkan |
|
|
45
|
-
|
|
46
39
|
## Language
|
|
47
40
|
|
|
48
41
|
Mengubah bahasa UI dashboard. Mendukung 6 bahasa + Auto (deteksi otomatis bahasa browser).
|
|
@@ -35,13 +35,6 @@ Menampilkan arah sinkronisasi per tipe dalam bentuk tabel:
|
|
|
35
35
|
|
|
36
36
|
Periksa arah sinkronisasi setiap tipe untuk memahami perubahan mana yang direfleksikan ke arah mana.
|
|
37
37
|
|
|
38
|
-
## Sync Config
|
|
39
|
-
|
|
40
|
-
Menampilkan nilai pengaturan sinkronisasi:
|
|
41
|
-
- Max Depth — kedalaman maksimum sinkronisasi
|
|
42
|
-
- Max Instances — jumlah maksimum instance yang disinkronkan
|
|
43
|
-
- Interval — interval sinkronisasi
|
|
44
|
-
|
|
45
38
|
## Sync Log
|
|
46
39
|
|
|
47
40
|
Menampilkan event sinkronisasi secara kronologis. Setiap item log mencakup tag jenis perubahan (create, update, delete, dll.) dan path target.
|
package/docs/id/sync/overview.md
CHANGED
|
@@ -86,7 +86,6 @@ Di Pro, Direction dan Apply Mode bisa diatur per tipe.
|
|
|
86
86
|
| Aksi | Deskripsi | Parameter utama |
|
|
87
87
|
|------|------|-----------|
|
|
88
88
|
| `status` | Cek status sync saat ini untuk place | `placeId` |
|
|
89
|
-
| `config` | Ambil konfigurasi sync | `placeId` |
|
|
90
89
|
| `history` | Ambil riwayat perubahan | `placeId`, `query.limit`, `query.offset` |
|
|
91
90
|
| `directions` | Ambil Direction per tipe | `placeId` |
|
|
92
91
|
| `read_file` | Baca file yang sudah tersinkron | `placeId`, `instancePath` |
|
|
@@ -228,7 +228,6 @@ Kebijakan Sync:
|
|
|
228
228
|
| Aksi | Deskripsi | Tier |
|
|
229
229
|
|------|-----------|------|
|
|
230
230
|
| `status` | Mendapatkan status sinkronisasi sebuah Place | Pro |
|
|
231
|
-
| `config` | Mendapatkan konfigurasi sinkronisasi | Pro |
|
|
232
231
|
| `history` | Mendapatkan riwayat perubahan | Pro |
|
|
233
232
|
| `directions` | Mendapatkan arah sinkronisasi per tipe | Pro |
|
|
234
233
|
| `read_file` | Membaca file yang disinkronkan | Pro |
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
| [Sync](sync.md) | 同期状態、方向設定、ログ | [詳細ガイド](sync.md) |
|
|
23
23
|
| [Playtest](playtest.md) | プレイテスト状態、テスト記録 | [詳細ガイド](playtest.md) |
|
|
24
24
|
| [Tools](tools.md) | ツール実行履歴、統計、ティア分布 | [詳細ガイド](tools.md) |
|
|
25
|
-
| [Settings](settings.md) |
|
|
25
|
+
| [Settings](settings.md) | ライセンス、ログレベル、言語 | [詳細ガイド](settings.md) |
|
|
26
26
|
|
|
27
27
|
## アクセス方法
|
|
28
28
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Settings
|
|
2
2
|
|
|
3
|
-
>
|
|
3
|
+
> ライセンス情報、サーバー設定、言語を確認・管理します。
|
|
4
4
|
|
|
5
5
|
## 概要
|
|
6
6
|
|
|
@@ -36,13 +36,6 @@ Settingsページではライセンス情報とサーバー設定を確認し、
|
|
|
36
36
|
| `HTTP_HOST` | HTTPホスト | 127.0.0.1 |
|
|
37
37
|
| `DASHBOARD_AUTO_OPEN` | ダッシュボード自動オープン | true |
|
|
38
38
|
|
|
39
|
-
## Sync Settings
|
|
40
|
-
|
|
41
|
-
| 設定 | 説明 |
|
|
42
|
-
|------|------|
|
|
43
|
-
| Max Depth | 同期最大深度 |
|
|
44
|
-
| Max Instances | 同期最大インスタンス数 |
|
|
45
|
-
|
|
46
39
|
## Language
|
|
47
40
|
|
|
48
41
|
ダッシュボードUI言語を変更します。6言語 + Auto(ブラウザ言語自動検出)をサポートしています。
|
|
@@ -35,13 +35,6 @@ SyncページはStudio ↔ ローカルファイル同期の現在の状態と
|
|
|
35
35
|
|
|
36
36
|
各タイプの同期方向を確認して、どの変更がどの方向に反映されるかを把握できます。
|
|
37
37
|
|
|
38
|
-
## Sync Config
|
|
39
|
-
|
|
40
|
-
同期設定値を表示します:
|
|
41
|
-
- Max Depth — 同期最大深度
|
|
42
|
-
- Max Instances — 同期最大インスタンス数
|
|
43
|
-
- Interval — 同期間隔
|
|
44
|
-
|
|
45
38
|
## Sync Log
|
|
46
39
|
|
|
47
40
|
同期イベントを時系列で表示します。各ログ項目には変更タイプタグ(create, update, deleteなど)と対象パスが含まれます。
|
package/docs/ja/sync/overview.md
CHANGED
|
@@ -86,7 +86,6 @@ ProではタイプごとにDirection/Apply Modeを細かく制御できます。
|
|
|
86
86
|
| アクション | 説明 | 主な引数 |
|
|
87
87
|
|------|------|-----------|
|
|
88
88
|
| `status` | Placeの現在の同期状態を確認 | `placeId` |
|
|
89
|
-
| `config` | 同期設定を取得 | `placeId` |
|
|
90
89
|
| `history` | 変更履歴を取得 | `placeId`, `query.limit`, `query.offset` |
|
|
91
90
|
| `directions` | タイプ別Directionを取得 | `placeId` |
|
|
92
91
|
| `read_file` | 同期ファイルを読み取り | `placeId`, `instancePath` |
|
|
@@ -228,7 +228,6 @@ Syncポリシー:
|
|
|
228
228
|
| アクション | 説明 | ティア |
|
|
229
229
|
|------------|------|--------|
|
|
230
230
|
| `status` | Placeの同期ステータスを取得 | Pro |
|
|
231
|
-
| `config` | 同期設定を取得 | Pro |
|
|
232
231
|
| `history` | 変更履歴を取得 | Pro |
|
|
233
232
|
| `directions` | タイプ別同期方向を取得 | Pro |
|
|
234
233
|
| `read_file` | 同期済みファイルを読み取り | Pro |
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
| [Sync](sync.md) | 동기화 상태, 방향 설정, 로그 | [상세 가이드](sync.md) |
|
|
23
23
|
| [Playtest](playtest.md) | 플레이테스트 상태, 테스트 기록 | [상세 가이드](playtest.md) |
|
|
24
24
|
| [Tools](tools.md) | 도구 실행 기록, 통계, 티어 분포 | [상세 가이드](tools.md) |
|
|
25
|
-
| [Settings](settings.md) | 라이선스, 로그 레벨,
|
|
25
|
+
| [Settings](settings.md) | 라이선스, 로그 레벨, 언어 | [상세 가이드](settings.md) |
|
|
26
26
|
|
|
27
27
|
## 접속 방법
|
|
28
28
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Settings
|
|
2
2
|
|
|
3
|
-
> 라이선스 정보, 서버 설정,
|
|
3
|
+
> 라이선스 정보, 서버 설정, 언어를 확인하고 관리합니다.
|
|
4
4
|
|
|
5
5
|
## 개요
|
|
6
6
|
|
|
@@ -36,13 +36,6 @@ Settings 페이지에서는 라이선스 정보와 서버 설정을 확인하고
|
|
|
36
36
|
| `HTTP_HOST` | HTTP 호스트 | 127.0.0.1 |
|
|
37
37
|
| `DASHBOARD_AUTO_OPEN` | 대시보드 자동 열림 | true |
|
|
38
38
|
|
|
39
|
-
## Sync Settings
|
|
40
|
-
|
|
41
|
-
| 설정 | 설명 |
|
|
42
|
-
|------|------|
|
|
43
|
-
| Max Depth | 동기화 최대 깊이 |
|
|
44
|
-
| Max Instances | 동기화 최대 인스턴스 수 |
|
|
45
|
-
|
|
46
39
|
## Language
|
|
47
40
|
|
|
48
41
|
대시보드 UI 언어를 변경합니다. 6개 언어 + Auto(브라우저 언어 자동 감지)를 지원합니다.
|
|
@@ -35,13 +35,6 @@ Sync 페이지는 Studio ↔ 로컬 파일 동기화의 현재 상태와 설정
|
|
|
35
35
|
|
|
36
36
|
각 타입의 동기화 방향을 확인하여 어떤 변경이 어느 방향으로 반영되는지 파악할 수 있습니다.
|
|
37
37
|
|
|
38
|
-
## Sync Config
|
|
39
|
-
|
|
40
|
-
동기화 설정 값을 표시합니다:
|
|
41
|
-
- Max Depth — 동기화 최대 깊이
|
|
42
|
-
- Max Instances — 동기화 최대 인스턴스 수
|
|
43
|
-
- Interval — 동기화 간격
|
|
44
|
-
|
|
45
38
|
## Sync Log
|
|
46
39
|
|
|
47
40
|
동기화 이벤트를 시간순으로 표시합니다. 각 로그 항목에는 변경 유형 태그(create, update, delete 등)와 대상 경로가 포함됩니다.
|
package/docs/ko/sync/overview.md
CHANGED
|
@@ -86,7 +86,6 @@ Pro에서는 타입별로 Direction/Apply Mode를 다르게 설정해 워크플
|
|
|
86
86
|
| 액션 | 설명 | 주요 인자 |
|
|
87
87
|
|------|------|-----------|
|
|
88
88
|
| `status` | 현재 Place의 동기화 상태 확인 | `placeId` |
|
|
89
|
-
| `config` | 동기화 설정 확인 | `placeId` |
|
|
90
89
|
| `history` | 변경 기록 조회 | `placeId`, `query.limit`, `query.offset` |
|
|
91
90
|
| `directions` | 타입별 Direction 조회 | `placeId` |
|
|
92
91
|
| `read_file` | 동기화된 파일 읽기 | `placeId`, `instancePath` |
|
|
@@ -228,7 +228,6 @@ Sync 정책:
|
|
|
228
228
|
| 액션 | 설명 | 티어 |
|
|
229
229
|
|------|------|------|
|
|
230
230
|
| `status` | Place의 동기화 상태 가져오기 | Pro |
|
|
231
|
-
| `config` | 동기화 설정 가져오기 | Pro |
|
|
232
231
|
| `history` | 변경 기록 가져오기 | Pro |
|
|
233
232
|
| `directions` | 타입별 동기화 방향 가져오기 | Pro |
|
|
234
233
|
| `read_file` | 동기화된 파일 읽기 | Pro |
|
|
@@ -22,7 +22,7 @@ O Dashboard e uma interface de monitoramento baseada na web fornecida pelo servi
|
|
|
22
22
|
| [Sync](sync.md) | Status de sincronizacao, configuracao de direcao, logs | [Guia detalhado](sync.md) |
|
|
23
23
|
| [Playtest](playtest.md) | Status do playtest, historico de testes | [Guia detalhado](playtest.md) |
|
|
24
24
|
| [Tools](tools.md) | Historico de execucao de ferramentas, estatisticas, distribuicao por tier | [Guia detalhado](tools.md) |
|
|
25
|
-
| [Settings](settings.md) | Licenca, nivel de log,
|
|
25
|
+
| [Settings](settings.md) | Licenca, nivel de log, idioma | [Guia detalhado](settings.md) |
|
|
26
26
|
|
|
27
27
|
## Como acessar
|
|
28
28
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Settings
|
|
2
2
|
|
|
3
|
-
> Verifique e gerencie informacoes de licenca, configuracoes do servidor
|
|
3
|
+
> Verifique e gerencie informacoes de licenca, configuracoes do servidor e idioma.
|
|
4
4
|
|
|
5
5
|
## Visao geral
|
|
6
6
|
|
|
@@ -36,13 +36,6 @@ Exibe as configuracoes do servidor definidas por variaveis de ambiente:
|
|
|
36
36
|
| `HTTP_HOST` | Host HTTP | 127.0.0.1 |
|
|
37
37
|
| `DASHBOARD_AUTO_OPEN` | Abertura automatica do Dashboard | true |
|
|
38
38
|
|
|
39
|
-
## Sync Settings
|
|
40
|
-
|
|
41
|
-
| Configuracao | Descricao |
|
|
42
|
-
|--------------|-----------|
|
|
43
|
-
| Max Depth | Profundidade maxima de sincronizacao |
|
|
44
|
-
| Max Instances | Numero maximo de instancias sincronizadas |
|
|
45
|
-
|
|
46
39
|
## Language
|
|
47
40
|
|
|
48
41
|
Altere o idioma da interface do Dashboard. Suporta 6 idiomas + Auto (deteccao automatica do idioma do navegador).
|
|
@@ -35,13 +35,6 @@ Exibe em tabela a direcao de sincronizacao por tipo:
|
|
|
35
35
|
|
|
36
36
|
Verifique a direcao de sincronizacao de cada tipo para entender em qual sentido as alteracoes sao refletidas.
|
|
37
37
|
|
|
38
|
-
## Sync Config
|
|
39
|
-
|
|
40
|
-
Exibe os valores de configuracao da sincronizacao:
|
|
41
|
-
- Max Depth — Profundidade maxima de sincronizacao
|
|
42
|
-
- Max Instances — Numero maximo de instancias sincronizadas
|
|
43
|
-
- Interval — Intervalo de sincronizacao
|
|
44
|
-
|
|
45
38
|
## Sync Log
|
|
46
39
|
|
|
47
40
|
Exibe os eventos de sincronizacao em ordem cronologica. Cada entrada de log inclui uma tag de tipo de alteracao (create, update, delete, etc.) e o caminho do alvo.
|
|
@@ -86,7 +86,6 @@ No Pro, voce controla Direction e Apply Mode por tipo.
|
|
|
86
86
|
| Acao | Descricao | Parametros principais |
|
|
87
87
|
|------|------|-----------|
|
|
88
88
|
| `status` | Consultar estado atual de sync de um place | `placeId` |
|
|
89
|
-
| `config` | Obter configuracao de sync | `placeId` |
|
|
90
89
|
| `history` | Consultar historico de mudancas | `placeId`, `query.limit`, `query.offset` |
|
|
91
90
|
| `directions` | Obter direcoes por tipo | `placeId` |
|
|
92
91
|
| `read_file` | Ler arquivo sincronizado | `placeId`, `instancePath` |
|
|
@@ -228,7 +228,6 @@ Politica de Sync:
|
|
|
228
228
|
| Acao | Descricao | Tier |
|
|
229
229
|
|------|-----------|------|
|
|
230
230
|
| `status` | Obter status de sincronizacao de um Place | Pro |
|
|
231
|
-
| `config` | Obter configuracao de sincronizacao | Pro |
|
|
232
231
|
| `history` | Obter historico de mudancas | Pro |
|
|
233
232
|
| `directions` | Obter direcoes de sincronizacao por tipo | Pro |
|
|
234
233
|
| `read_file` | Ler um arquivo sincronizado | Pro |
|
package/llms-full.txt
CHANGED
|
@@ -426,7 +426,6 @@ Roblox MCP provides consolidated tools with action-based sub-commands. Each tool
|
|
|
426
426
|
| Action | Description |
|
|
427
427
|
|--------|-------------|
|
|
428
428
|
| `status` | Get sync status for a place |
|
|
429
|
-
| `config` | Get sync configuration |
|
|
430
429
|
| `history` | Get change history |
|
|
431
430
|
| `directions` | Get per-type sync directions |
|
|
432
431
|
| `read_file` | Read a synced file |
|
|
@@ -563,7 +562,7 @@ Set `DASHBOARD_AUTO_OPEN=false` to disable automatic opening.
|
|
|
563
562
|
| **Sync** | Sync status, direction settings, logs |
|
|
564
563
|
| **Playtest** | Playtest status and test history |
|
|
565
564
|
| **Tools** | Tool execution history, statistics, tier distribution |
|
|
566
|
-
| **Settings** | License, log level,
|
|
565
|
+
| **Settings** | License, log level, language |
|
|
567
566
|
|
|
568
567
|
## Connection States
|
|
569
568
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@weppy/roblox-mcp",
|
|
3
|
-
"version": "2.1
|
|
3
|
+
"version": "2.2.1",
|
|
4
4
|
"description": "MCP (Model Context Protocol) server for Roblox Studio integration - enables AI coding agents to interact with Roblox Studio in real-time",
|
|
5
5
|
"main": "plugins/weppy-roblox-mcp/dist/index.js",
|
|
6
6
|
"type": "module",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{r,a as R,u as M,b as B,c as D,j as e,T as m}from"./index-BNdn6WpU.js";import{I as V}from"./InfoLabel-B_Ys60mi.js";import{D as F,P as G}from"./PropertyDiff-BbsF9z4D.js";function P(t){const s={scriptsModified:0,scriptsCreated:0,instancesCreated:0,instancesDeleted:0,instancesMoved:0,propertiesChanged:0,lightingChanged:!1,terrainChanged:!1,assetsInserted:0};for(const l of t)switch(l.category){case"script":l.changeType==="create"?s.scriptsCreated++:s.scriptsModified++;break;case"instance":l.changeType==="create"?s.instancesCreated++:l.changeType==="delete"?s.instancesDeleted++:l.changeType==="move"&&s.instancesMoved++;break;case"property":s.propertiesChanged++;break;case"lighting":s.lightingChanged=!0;break;case"terrain":s.terrainChanged=!0;break;case"asset":s.assetsInserted++;break}return s}function U(t){const[s,l]=r.useState(""),[a,d]=r.useState(""),[u,q]=r.useState(),[w,y]=r.useState("completed"),[E,I]=r.useState([]),[O,L]=r.useState([]),[f,x]=r.useState([]),[p,j]=r.useState(),[_,b]=r.useState(),[v,S]=r.useState(),[C,N]=r.useState({scriptsModified:0,scriptsCreated:0,instancesCreated:0,instancesDeleted:0,instancesMoved:0,propertiesChanged:0,lightingChanged:!1,terrainChanged:!1,assetsInserted:0}),[T,g]=r.useState(!0),[k,h]=r.useState(null),i=r.useCallback(async()=>{if(t){g(!0),h(null);try{const[c,o]=await Promise.all([R.get(`/api/dashboard/changelog/${t}`),R.get(`/api/dashboard/changelog/${t}/changes`)]);l(c.entryId),d(c.startTime),q(c.endTime),y(c.status),I(c.entries),L(c.failures),j(c.contextSummary),b(c.replayMetadata),S(c.verificationSummary),x(o.changes),N(P(o.changes))}catch(c){h(c instanceof Error?c.message:"Failed to load changelog detail")}finally{g(!1)}}},[t]);return r.useEffect(()=>{i()},[i]),{entryId:s,startTime:a,endTime:u,status:w,entries:E,failures:O,changes:f,changeSummary:C,contextSummary:p,replayMetadata:_,verificationSummary:v,loading:T,error:k,refresh:i}}const z={script:"📝",instance:"🧱",property:"🎨",lighting:"🌅",terrain:"⛰️",asset:"📦"};function H(t){return z[t]??"❓"}const J="_page_q2jbi_2",W="_header_q2jbi_10",Y="_backLink_q2jbi_16",Q="_headerTitle_q2jbi_29",X="_headerTime_q2jbi_37",Z="_statusActive_q2jbi_44",ee="_statusCompleted_q2jbi_49",te="_section_q2jbi_54",ne="_sectionTitle_q2jbi_61",ae="_summaryGrid_q2jbi_74",ie="_summaryCard_q2jbi_80",se="_summaryCardActive_q2jbi_94",ce="_summaryIcon_q2jbi_99",re="_summaryCount_q2jbi_105",oe="_summaryLabel_q2jbi_112",le="_contextGrid_q2jbi_121",de="_contextRow_q2jbi_127",me="_contextKey_q2jbi_133",ge="_contextValue_q2jbi_141",he="_timelineFilter_q2jbi_149",ue="_filterLabel_q2jbi_156",ye="_filterSelect_q2jbi_162",fe="_timeline_q2jbi_149",xe="_timelineEntry_q2jbi_182",pe="_timelineTime_q2jbi_199",je="_timelineIcon_q2jbi_207",_e="_timelineBody_q2jbi_212",be="_timelineSummary_q2jbi_217",ve="_timelineTarget_q2jbi_224",Se="_timelineConfidence_q2jbi_231",Ce="_confidenceExact_q2jbi_240",Ne="_confidencePartial_q2jbi_245",Te="_confidenceAfterOnly_q2jbi_250",ke="_confidenceIntentOnly_q2jbi_255",qe="_confidenceUnknown_q2jbi_260",we="_timelineExpanded_q2jbi_266",Ee="_empty_q2jbi_338",Ie="_loading_q2jbi_347",Oe="_error_q2jbi_356",n={page:J,header:W,backLink:Y,headerTitle:Q,headerTime:X,statusActive:Z,statusCompleted:ee,section:te,sectionTitle:ne,summaryGrid:ae,summaryCard:ie,summaryCardActive:se,summaryIcon:ce,summaryCount:re,summaryLabel:oe,contextGrid:le,contextRow:de,contextKey:me,contextValue:ge,timelineFilter:he,filterLabel:ue,filterSelect:ye,timeline:fe,timelineEntry:xe,timelineTime:pe,timelineIcon:je,timelineBody:_e,timelineSummary:be,timelineTarget:ve,timelineConfidence:Se,confidenceExact:Ce,confidencePartial:Ne,confidenceAfterOnly:Te,confidenceIntentOnly:ke,confidenceUnknown:qe,timelineExpanded:we,empty:Ee,loading:Ie,error:Oe},$=[{key:"script",icon:"📝",labelKey:"changelog.category.script"},{key:"instance",icon:"🧱",labelKey:"changelog.category.instance"},{key:"property",icon:"🎨",labelKey:"changelog.category.property"},{key:"lighting",icon:"🌅",labelKey:"changelog.category.lighting"},{key:"terrain",icon:"⛰️",labelKey:"changelog.category.terrain"},{key:"asset",icon:"📦",labelKey:"changelog.category.asset"}];function A(t){if(!t)return"--:--";const s=new Date(t);return`${String(s.getHours()).padStart(2,"0")}:${String(s.getMinutes()).padStart(2,"0")}`}function Le(t){if(!t)return"--:--:--";const s=new Date(t);return`${String(s.getHours()).padStart(2,"0")}:${String(s.getMinutes()).padStart(2,"0")}:${String(s.getSeconds()).padStart(2,"0")}`}function Ae(t,s){if(!t||!s)return"";const l=new Date(s).getTime()-new Date(t).getTime();return l<0?"":`${Math.round(l/6e4)}min`}function Ke(t){switch(t){case"exact":return n.confidenceExact;case"partial":return n.confidencePartial;case"after-only":return n.confidenceAfterOnly;case"intent-only":return n.confidenceIntentOnly;default:return n.confidenceUnknown}}function Re(t,s){switch(s){case"exact":return t("changelog.detail.confidence.exact","Exact");case"partial":return t("changelog.detail.confidence.partial","Partial");case"after-only":return t("changelog.detail.confidence.afterOnly","After only");case"intent-only":return t("changelog.detail.confidence.intentOnly","Intent only");default:return t("changelog.detail.confidence.unknown","Unknown")}}function $e(t,s){switch(s){case"exact":return t("changelog.detail.confidence.exact.tooltip","Both the before and after state were confirmed for this change.");case"partial":return t("changelog.detail.confidence.partial.tooltip","Only part of the before and after state could be confirmed for this change.");case"after-only":return t("changelog.detail.confidence.afterOnly.tooltip","Only the resulting state after the change could be confirmed.");case"intent-only":return t("changelog.detail.confidence.intentOnly.tooltip","Only the requested action was recorded, not the resulting state.");default:return t("changelog.detail.confidence.unknown.tooltip","This change could not be confidently classified from the available data.")}}function Fe(){var f,x,p,j,_,b,v,S,C,N,T,g,k,h;const{t}=M(),{id:s}=B(),l=D(),a=U(s),[d,u]=r.useState("all"),[q,w]=r.useState(null),y=r.useMemo(()=>[...d==="all"?a.changes:a.changes.filter(c=>c.category===d)].reverse(),[a.changes,d]);if(a.loading)return e.jsx("div",{className:n.loading,children:t("common.loading","Loading...")});if(a.error)return e.jsxs("div",{className:n.error,children:[a.error,e.jsx("br",{}),e.jsxs("span",{className:n.backLink,onClick:()=>l("/changelog"),children:["←"," ",t("changelog.detail.backToList","Back to list")]})]});const E=Ae(a.startTime,a.endTime),I=a.endTime?`${A(a.startTime)} → ${A(a.endTime)} (${E})`:`${A(a.startTime)} → ${t("changelog.card.inProgress","in progress")}`,O=!!((f=a.contextSummary)!=null&&f.intent||(x=a.contextSummary)!=null&&x.testScenario||(p=a.contextSummary)!=null&&p.expectedBehavior||(j=a.contextSummary)!=null&&j.observedBehavior),L=!!((_=a.verificationSummary)!=null&&_.label||(b=a.verificationSummary)!=null&&b.status||(v=a.verificationSummary)!=null&&v.testTimestamp);return e.jsxs("div",{className:n.page,children:[e.jsxs("div",{className:n.header,children:[e.jsxs("span",{className:n.backLink,onClick:()=>l("/changelog"),children:["←"," ",t("sidebar.changelog","Changelog")]}),e.jsx("span",{className:n.headerTitle,children:"|"}),e.jsx("span",{className:n.headerTime,children:I}),e.jsx(m,{text:a.status==="active"?t("changelog.card.active.tooltip","This session is still receiving new game changes."):t("changelog.card.completed.tooltip","This session has ended and no more changes are expected."),children:e.jsx("span",{className:a.status==="active"?n.statusActive:n.statusCompleted,children:a.status==="active"?t("changelog.card.active","Active"):t("changelog.card.completed","Completed")})})]}),e.jsxs("div",{className:n.section,children:[e.jsx("div",{className:n.sectionTitle,children:e.jsx(m,{text:t("changelog.detail.changeSummary.tooltip","Counts of extracted game changes grouped by category for this session."),children:e.jsx("span",{children:t("changelog.detail.changeSummary","Change Summary")})})}),e.jsx("div",{className:n.summaryGrid,children:$.map(i=>{const c=a.changeSummary;let o;switch(i.key){case"script":o=c.scriptsModified+c.scriptsCreated;break;case"instance":o=c.instancesCreated+c.instancesDeleted+c.instancesMoved;break;case"property":o=c.propertiesChanged;break;case"lighting":o=c.lightingChanged?1:0;break;case"terrain":o=c.terrainChanged?1:0;break;case"asset":o=c.assetsInserted;break;default:o=0}const K=d===i.key;return e.jsxs("div",{className:`${n.summaryCard} ${K?n.summaryCardActive:""}`,onClick:()=>u(K?"all":i.key),children:[e.jsx("span",{className:n.summaryIcon,children:i.icon}),e.jsx("div",{className:n.summaryCount,children:o}),e.jsx("div",{className:n.summaryLabel,children:t(i.labelKey,i.key)})]},i.key)})})]}),O&&e.jsxs("div",{className:n.section,children:[e.jsx("div",{className:n.sectionTitle,children:e.jsx(m,{text:t("changelog.detail.context.tooltip","Structured execution context captured for this changelog session."),children:e.jsx("span",{children:t("changelog.detail.context.title","Context Summary")})})}),e.jsxs("div",{className:n.contextGrid,children:[((S=a.contextSummary)==null?void 0:S.intent)&&e.jsxs("div",{className:n.contextRow,children:[e.jsx("span",{className:n.contextKey,children:t("changelog.card.sessionIntent","Session intent")}),e.jsx("span",{className:n.contextValue,children:a.contextSummary.intent})]}),((C=a.contextSummary)==null?void 0:C.testScenario)&&e.jsxs("div",{className:n.contextRow,children:[e.jsx("span",{className:n.contextKey,children:t("playtest.context.why","Why this test ran")}),e.jsx("span",{className:n.contextValue,children:a.contextSummary.testScenario})]}),((N=a.contextSummary)==null?void 0:N.expectedBehavior)&&e.jsxs("div",{className:n.contextRow,children:[e.jsx("span",{className:n.contextKey,children:t("playtest.context.expected","Expected")}),e.jsx("span",{className:n.contextValue,children:a.contextSummary.expectedBehavior})]}),((T=a.contextSummary)==null?void 0:T.observedBehavior)&&e.jsxs("div",{className:n.contextRow,children:[e.jsx("span",{className:n.contextKey,children:t("playtest.context.observed","Observed")}),e.jsx("span",{className:n.contextValue,children:a.contextSummary.observedBehavior})]})]})]}),L&&e.jsxs("div",{className:n.section,children:[e.jsx("div",{className:n.sectionTitle,children:e.jsx(m,{text:t("changelog.detail.verification.tooltip","Verification signals linked to this changelog session."),children:e.jsx("span",{children:t("changelog.detail.verification.title","Verification")})})}),e.jsxs("div",{className:n.contextGrid,children:[((g=a.verificationSummary)==null?void 0:g.label)&&e.jsxs("div",{className:n.contextRow,children:[e.jsx("span",{className:n.contextKey,children:t("changelog.detail.verification.label","Result")}),e.jsx("span",{className:n.contextValue,children:a.verificationSummary.label})]}),((k=a.verificationSummary)==null?void 0:k.status)&&e.jsxs("div",{className:n.contextRow,children:[e.jsx("span",{className:n.contextKey,children:t("changelog.detail.verification.status","Status")}),e.jsx("span",{className:n.contextValue,children:a.verificationSummary.status})]}),((h=a.verificationSummary)==null?void 0:h.testTimestamp)&&e.jsxs("div",{className:n.contextRow,children:[e.jsx("span",{className:n.contextKey,children:t("changelog.detail.verification.timestamp","Recorded at")}),e.jsx("span",{className:n.contextValue,children:a.verificationSummary.testTimestamp})]})]})]}),e.jsxs("div",{className:n.section,children:[e.jsx("div",{className:n.sectionTitle,children:e.jsx(m,{text:t("changelog.detail.changeTimeline.tooltip","Chronological list of extracted game changes for this session."),children:e.jsx("span",{children:t("changelog.detail.changeTimeline","Change Timeline")})})}),e.jsxs("div",{className:n.timelineFilter,children:[e.jsx("span",{className:n.filterLabel,children:e.jsx(V,{label:`${t("changelog.detail.filterCategory","Category")}:`,tooltip:t("changelog.detail.filterCategory.tooltip","Filter the timeline to a single change category.")})}),e.jsxs("select",{className:n.filterSelect,value:d,onChange:i=>u(i.target.value),children:[e.jsx("option",{value:"all",children:t("tools.filter.all","All")}),$.map(i=>e.jsxs("option",{value:i.key,children:[i.icon," ",t(i.labelKey,i.key)]},i.key))]})]}),y.length===0?e.jsx("div",{className:n.empty,children:t("changelog.detail.noChanges","No changes in this category")}):e.jsx("div",{className:n.timeline,children:y.map((i,c)=>{const o=q===c;return e.jsxs("div",{children:[e.jsxs("div",{className:n.timelineEntry,onClick:()=>w(o?null:c),children:[e.jsx("span",{className:n.timelineTime,children:Le(i.timestamp)}),e.jsx("span",{className:n.timelineIcon,children:H(i.category)}),e.jsxs("div",{className:n.timelineBody,children:[e.jsxs("div",{className:n.timelineSummary,children:[i.summary,e.jsx(m,{text:$e(t,i.confidence),children:e.jsx("span",{className:`${n.timelineConfidence} ${Ke(i.confidence)}`,children:Re(t,i.confidence)})})]}),e.jsx("div",{className:n.timelineTarget,children:i.target})]})]}),o&&e.jsx("div",{className:n.timelineExpanded,children:e.jsx(Me,{change:i})})]},c)})})]})]})}function Me({change:t}){return t.category==="script"&&(t.before||t.after)?e.jsx(F,{before:t.before,after:t.after}):t.category==="property"?e.jsx(G,{before:t.before,after:t.after}):t.details?e.jsx("pre",{style:{fontFamily:"var(--font-code)",fontSize:"11px",color:"var(--text-secondary)",margin:0,whiteSpace:"pre-wrap",wordBreak:"break-all"},children:JSON.stringify(t.details,null,2)}):e.jsx("div",{style:{fontFamily:"var(--font-code)",fontSize:"11px",color:"var(--text-muted)"},children:t.target})}export{Fe as Component};
|
|
1
|
+
import{r,a as R,u as M,b as B,c as D,j as e,T as m}from"./index-DGGmfli1.js";import{I as V}from"./InfoLabel-CCDWZLC9.js";import{D as F,P as G}from"./PropertyDiff-DIplDn-J.js";function P(t){const s={scriptsModified:0,scriptsCreated:0,instancesCreated:0,instancesDeleted:0,instancesMoved:0,propertiesChanged:0,lightingChanged:!1,terrainChanged:!1,assetsInserted:0};for(const l of t)switch(l.category){case"script":l.changeType==="create"?s.scriptsCreated++:s.scriptsModified++;break;case"instance":l.changeType==="create"?s.instancesCreated++:l.changeType==="delete"?s.instancesDeleted++:l.changeType==="move"&&s.instancesMoved++;break;case"property":s.propertiesChanged++;break;case"lighting":s.lightingChanged=!0;break;case"terrain":s.terrainChanged=!0;break;case"asset":s.assetsInserted++;break}return s}function U(t){const[s,l]=r.useState(""),[a,d]=r.useState(""),[u,q]=r.useState(),[w,y]=r.useState("completed"),[E,I]=r.useState([]),[O,L]=r.useState([]),[f,x]=r.useState([]),[p,j]=r.useState(),[_,b]=r.useState(),[v,S]=r.useState(),[C,N]=r.useState({scriptsModified:0,scriptsCreated:0,instancesCreated:0,instancesDeleted:0,instancesMoved:0,propertiesChanged:0,lightingChanged:!1,terrainChanged:!1,assetsInserted:0}),[T,g]=r.useState(!0),[k,h]=r.useState(null),i=r.useCallback(async()=>{if(t){g(!0),h(null);try{const[c,o]=await Promise.all([R.get(`/api/dashboard/changelog/${t}`),R.get(`/api/dashboard/changelog/${t}/changes`)]);l(c.entryId),d(c.startTime),q(c.endTime),y(c.status),I(c.entries),L(c.failures),j(c.contextSummary),b(c.replayMetadata),S(c.verificationSummary),x(o.changes),N(P(o.changes))}catch(c){h(c instanceof Error?c.message:"Failed to load changelog detail")}finally{g(!1)}}},[t]);return r.useEffect(()=>{i()},[i]),{entryId:s,startTime:a,endTime:u,status:w,entries:E,failures:O,changes:f,changeSummary:C,contextSummary:p,replayMetadata:_,verificationSummary:v,loading:T,error:k,refresh:i}}const z={script:"📝",instance:"🧱",property:"🎨",lighting:"🌅",terrain:"⛰️",asset:"📦"};function H(t){return z[t]??"❓"}const J="_page_q2jbi_2",W="_header_q2jbi_10",Y="_backLink_q2jbi_16",Q="_headerTitle_q2jbi_29",X="_headerTime_q2jbi_37",Z="_statusActive_q2jbi_44",ee="_statusCompleted_q2jbi_49",te="_section_q2jbi_54",ne="_sectionTitle_q2jbi_61",ae="_summaryGrid_q2jbi_74",ie="_summaryCard_q2jbi_80",se="_summaryCardActive_q2jbi_94",ce="_summaryIcon_q2jbi_99",re="_summaryCount_q2jbi_105",oe="_summaryLabel_q2jbi_112",le="_contextGrid_q2jbi_121",de="_contextRow_q2jbi_127",me="_contextKey_q2jbi_133",ge="_contextValue_q2jbi_141",he="_timelineFilter_q2jbi_149",ue="_filterLabel_q2jbi_156",ye="_filterSelect_q2jbi_162",fe="_timeline_q2jbi_149",xe="_timelineEntry_q2jbi_182",pe="_timelineTime_q2jbi_199",je="_timelineIcon_q2jbi_207",_e="_timelineBody_q2jbi_212",be="_timelineSummary_q2jbi_217",ve="_timelineTarget_q2jbi_224",Se="_timelineConfidence_q2jbi_231",Ce="_confidenceExact_q2jbi_240",Ne="_confidencePartial_q2jbi_245",Te="_confidenceAfterOnly_q2jbi_250",ke="_confidenceIntentOnly_q2jbi_255",qe="_confidenceUnknown_q2jbi_260",we="_timelineExpanded_q2jbi_266",Ee="_empty_q2jbi_338",Ie="_loading_q2jbi_347",Oe="_error_q2jbi_356",n={page:J,header:W,backLink:Y,headerTitle:Q,headerTime:X,statusActive:Z,statusCompleted:ee,section:te,sectionTitle:ne,summaryGrid:ae,summaryCard:ie,summaryCardActive:se,summaryIcon:ce,summaryCount:re,summaryLabel:oe,contextGrid:le,contextRow:de,contextKey:me,contextValue:ge,timelineFilter:he,filterLabel:ue,filterSelect:ye,timeline:fe,timelineEntry:xe,timelineTime:pe,timelineIcon:je,timelineBody:_e,timelineSummary:be,timelineTarget:ve,timelineConfidence:Se,confidenceExact:Ce,confidencePartial:Ne,confidenceAfterOnly:Te,confidenceIntentOnly:ke,confidenceUnknown:qe,timelineExpanded:we,empty:Ee,loading:Ie,error:Oe},$=[{key:"script",icon:"📝",labelKey:"changelog.category.script"},{key:"instance",icon:"🧱",labelKey:"changelog.category.instance"},{key:"property",icon:"🎨",labelKey:"changelog.category.property"},{key:"lighting",icon:"🌅",labelKey:"changelog.category.lighting"},{key:"terrain",icon:"⛰️",labelKey:"changelog.category.terrain"},{key:"asset",icon:"📦",labelKey:"changelog.category.asset"}];function A(t){if(!t)return"--:--";const s=new Date(t);return`${String(s.getHours()).padStart(2,"0")}:${String(s.getMinutes()).padStart(2,"0")}`}function Le(t){if(!t)return"--:--:--";const s=new Date(t);return`${String(s.getHours()).padStart(2,"0")}:${String(s.getMinutes()).padStart(2,"0")}:${String(s.getSeconds()).padStart(2,"0")}`}function Ae(t,s){if(!t||!s)return"";const l=new Date(s).getTime()-new Date(t).getTime();return l<0?"":`${Math.round(l/6e4)}min`}function Ke(t){switch(t){case"exact":return n.confidenceExact;case"partial":return n.confidencePartial;case"after-only":return n.confidenceAfterOnly;case"intent-only":return n.confidenceIntentOnly;default:return n.confidenceUnknown}}function Re(t,s){switch(s){case"exact":return t("changelog.detail.confidence.exact","Exact");case"partial":return t("changelog.detail.confidence.partial","Partial");case"after-only":return t("changelog.detail.confidence.afterOnly","After only");case"intent-only":return t("changelog.detail.confidence.intentOnly","Intent only");default:return t("changelog.detail.confidence.unknown","Unknown")}}function $e(t,s){switch(s){case"exact":return t("changelog.detail.confidence.exact.tooltip","Both the before and after state were confirmed for this change.");case"partial":return t("changelog.detail.confidence.partial.tooltip","Only part of the before and after state could be confirmed for this change.");case"after-only":return t("changelog.detail.confidence.afterOnly.tooltip","Only the resulting state after the change could be confirmed.");case"intent-only":return t("changelog.detail.confidence.intentOnly.tooltip","Only the requested action was recorded, not the resulting state.");default:return t("changelog.detail.confidence.unknown.tooltip","This change could not be confidently classified from the available data.")}}function Fe(){var f,x,p,j,_,b,v,S,C,N,T,g,k,h;const{t}=M(),{id:s}=B(),l=D(),a=U(s),[d,u]=r.useState("all"),[q,w]=r.useState(null),y=r.useMemo(()=>[...d==="all"?a.changes:a.changes.filter(c=>c.category===d)].reverse(),[a.changes,d]);if(a.loading)return e.jsx("div",{className:n.loading,children:t("common.loading","Loading...")});if(a.error)return e.jsxs("div",{className:n.error,children:[a.error,e.jsx("br",{}),e.jsxs("span",{className:n.backLink,onClick:()=>l("/changelog"),children:["←"," ",t("changelog.detail.backToList","Back to list")]})]});const E=Ae(a.startTime,a.endTime),I=a.endTime?`${A(a.startTime)} → ${A(a.endTime)} (${E})`:`${A(a.startTime)} → ${t("changelog.card.inProgress","in progress")}`,O=!!((f=a.contextSummary)!=null&&f.intent||(x=a.contextSummary)!=null&&x.testScenario||(p=a.contextSummary)!=null&&p.expectedBehavior||(j=a.contextSummary)!=null&&j.observedBehavior),L=!!((_=a.verificationSummary)!=null&&_.label||(b=a.verificationSummary)!=null&&b.status||(v=a.verificationSummary)!=null&&v.testTimestamp);return e.jsxs("div",{className:n.page,children:[e.jsxs("div",{className:n.header,children:[e.jsxs("span",{className:n.backLink,onClick:()=>l("/changelog"),children:["←"," ",t("sidebar.changelog","Changelog")]}),e.jsx("span",{className:n.headerTitle,children:"|"}),e.jsx("span",{className:n.headerTime,children:I}),e.jsx(m,{text:a.status==="active"?t("changelog.card.active.tooltip","This session is still receiving new game changes."):t("changelog.card.completed.tooltip","This session has ended and no more changes are expected."),children:e.jsx("span",{className:a.status==="active"?n.statusActive:n.statusCompleted,children:a.status==="active"?t("changelog.card.active","Active"):t("changelog.card.completed","Completed")})})]}),e.jsxs("div",{className:n.section,children:[e.jsx("div",{className:n.sectionTitle,children:e.jsx(m,{text:t("changelog.detail.changeSummary.tooltip","Counts of extracted game changes grouped by category for this session."),children:e.jsx("span",{children:t("changelog.detail.changeSummary","Change Summary")})})}),e.jsx("div",{className:n.summaryGrid,children:$.map(i=>{const c=a.changeSummary;let o;switch(i.key){case"script":o=c.scriptsModified+c.scriptsCreated;break;case"instance":o=c.instancesCreated+c.instancesDeleted+c.instancesMoved;break;case"property":o=c.propertiesChanged;break;case"lighting":o=c.lightingChanged?1:0;break;case"terrain":o=c.terrainChanged?1:0;break;case"asset":o=c.assetsInserted;break;default:o=0}const K=d===i.key;return e.jsxs("div",{className:`${n.summaryCard} ${K?n.summaryCardActive:""}`,onClick:()=>u(K?"all":i.key),children:[e.jsx("span",{className:n.summaryIcon,children:i.icon}),e.jsx("div",{className:n.summaryCount,children:o}),e.jsx("div",{className:n.summaryLabel,children:t(i.labelKey,i.key)})]},i.key)})})]}),O&&e.jsxs("div",{className:n.section,children:[e.jsx("div",{className:n.sectionTitle,children:e.jsx(m,{text:t("changelog.detail.context.tooltip","Structured execution context captured for this changelog session."),children:e.jsx("span",{children:t("changelog.detail.context.title","Context Summary")})})}),e.jsxs("div",{className:n.contextGrid,children:[((S=a.contextSummary)==null?void 0:S.intent)&&e.jsxs("div",{className:n.contextRow,children:[e.jsx("span",{className:n.contextKey,children:t("changelog.card.sessionIntent","Session intent")}),e.jsx("span",{className:n.contextValue,children:a.contextSummary.intent})]}),((C=a.contextSummary)==null?void 0:C.testScenario)&&e.jsxs("div",{className:n.contextRow,children:[e.jsx("span",{className:n.contextKey,children:t("playtest.context.why","Why this test ran")}),e.jsx("span",{className:n.contextValue,children:a.contextSummary.testScenario})]}),((N=a.contextSummary)==null?void 0:N.expectedBehavior)&&e.jsxs("div",{className:n.contextRow,children:[e.jsx("span",{className:n.contextKey,children:t("playtest.context.expected","Expected")}),e.jsx("span",{className:n.contextValue,children:a.contextSummary.expectedBehavior})]}),((T=a.contextSummary)==null?void 0:T.observedBehavior)&&e.jsxs("div",{className:n.contextRow,children:[e.jsx("span",{className:n.contextKey,children:t("playtest.context.observed","Observed")}),e.jsx("span",{className:n.contextValue,children:a.contextSummary.observedBehavior})]})]})]}),L&&e.jsxs("div",{className:n.section,children:[e.jsx("div",{className:n.sectionTitle,children:e.jsx(m,{text:t("changelog.detail.verification.tooltip","Verification signals linked to this changelog session."),children:e.jsx("span",{children:t("changelog.detail.verification.title","Verification")})})}),e.jsxs("div",{className:n.contextGrid,children:[((g=a.verificationSummary)==null?void 0:g.label)&&e.jsxs("div",{className:n.contextRow,children:[e.jsx("span",{className:n.contextKey,children:t("changelog.detail.verification.label","Result")}),e.jsx("span",{className:n.contextValue,children:a.verificationSummary.label})]}),((k=a.verificationSummary)==null?void 0:k.status)&&e.jsxs("div",{className:n.contextRow,children:[e.jsx("span",{className:n.contextKey,children:t("changelog.detail.verification.status","Status")}),e.jsx("span",{className:n.contextValue,children:a.verificationSummary.status})]}),((h=a.verificationSummary)==null?void 0:h.testTimestamp)&&e.jsxs("div",{className:n.contextRow,children:[e.jsx("span",{className:n.contextKey,children:t("changelog.detail.verification.timestamp","Recorded at")}),e.jsx("span",{className:n.contextValue,children:a.verificationSummary.testTimestamp})]})]})]}),e.jsxs("div",{className:n.section,children:[e.jsx("div",{className:n.sectionTitle,children:e.jsx(m,{text:t("changelog.detail.changeTimeline.tooltip","Chronological list of extracted game changes for this session."),children:e.jsx("span",{children:t("changelog.detail.changeTimeline","Change Timeline")})})}),e.jsxs("div",{className:n.timelineFilter,children:[e.jsx("span",{className:n.filterLabel,children:e.jsx(V,{label:`${t("changelog.detail.filterCategory","Category")}:`,tooltip:t("changelog.detail.filterCategory.tooltip","Filter the timeline to a single change category.")})}),e.jsxs("select",{className:n.filterSelect,value:d,onChange:i=>u(i.target.value),children:[e.jsx("option",{value:"all",children:t("tools.filter.all","All")}),$.map(i=>e.jsxs("option",{value:i.key,children:[i.icon," ",t(i.labelKey,i.key)]},i.key))]})]}),y.length===0?e.jsx("div",{className:n.empty,children:t("changelog.detail.noChanges","No changes in this category")}):e.jsx("div",{className:n.timeline,children:y.map((i,c)=>{const o=q===c;return e.jsxs("div",{children:[e.jsxs("div",{className:n.timelineEntry,onClick:()=>w(o?null:c),children:[e.jsx("span",{className:n.timelineTime,children:Le(i.timestamp)}),e.jsx("span",{className:n.timelineIcon,children:H(i.category)}),e.jsxs("div",{className:n.timelineBody,children:[e.jsxs("div",{className:n.timelineSummary,children:[i.summary,e.jsx(m,{text:$e(t,i.confidence),children:e.jsx("span",{className:`${n.timelineConfidence} ${Ke(i.confidence)}`,children:Re(t,i.confidence)})})]}),e.jsx("div",{className:n.timelineTarget,children:i.target})]})]}),o&&e.jsx("div",{className:n.timelineExpanded,children:e.jsx(Me,{change:i})})]},c)})})]})]})}function Me({change:t}){return t.category==="script"&&(t.before||t.after)?e.jsx(F,{before:t.before,after:t.after}):t.category==="property"?e.jsx(G,{before:t.before,after:t.after}):t.details?e.jsx("pre",{style:{fontFamily:"var(--font-code)",fontSize:"11px",color:"var(--text-secondary)",margin:0,whiteSpace:"pre-wrap",wordBreak:"break-all"},children:JSON.stringify(t.details,null,2)}):e.jsx("div",{style:{fontFamily:"var(--font-code)",fontSize:"11px",color:"var(--text-muted)"},children:t.target})}export{Fe as Component};
|