@weppy/roblox-mcp 1.5.4 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +6 -6
- package/.github/ISSUE_TEMPLATE/bug_report.yml +2 -2
- package/.github/ISSUE_TEMPLATE/install_help.yml +3 -3
- package/CHANGELOG.md +35 -1
- package/CODE_OF_CONDUCT.md +1 -1
- package/CONTRIBUTING.md +3 -3
- package/README.md +35 -18
- package/SECURITY.md +1 -1
- package/SUPPORT.md +2 -2
- package/docs/assets/screenshots/dashboard/dashboard_changelog1.png +3 -0
- package/docs/assets/screenshots/dashboard/dashboard_changelog2.png +3 -0
- package/docs/assets/screenshots/dashboard/dashboard_connection.png +3 -0
- package/docs/assets/screenshots/dashboard/dashboard_overview.png +3 -0
- package/docs/assets/screenshots/dashboard/dashboard_playtest.png +3 -0
- package/docs/assets/screenshots/dashboard/dashboard_sync.png +3 -0
- package/docs/assets/screenshots/dashboard/dashboard_tools.png +3 -0
- package/docs/en/dashboard/changelog.md +114 -0
- package/docs/en/dashboard/connection.md +77 -0
- package/docs/en/dashboard/overview.md +95 -0
- package/docs/en/dashboard/playtest.md +61 -0
- package/docs/en/dashboard/settings.md +67 -0
- package/docs/en/dashboard/sync.md +75 -0
- package/docs/en/dashboard/tools.md +69 -0
- package/docs/en/installation/ai-apps/claude-code.md +1 -1
- package/docs/en/installation/roblox-explorer.md +2 -2
- package/docs/en/installation/roblox-plugin.md +1 -1
- package/docs/en/pro-upgrade.md +1 -1
- package/docs/es/README.md +18 -5
- package/docs/es/dashboard/changelog.md +114 -0
- package/docs/es/dashboard/connection.md +77 -0
- package/docs/es/dashboard/overview.md +95 -0
- package/docs/es/dashboard/playtest.md +61 -0
- package/docs/es/dashboard/settings.md +67 -0
- package/docs/es/dashboard/sync.md +75 -0
- package/docs/es/dashboard/tools.md +69 -0
- package/docs/es/installation/ai-apps/claude-code.md +1 -1
- package/docs/es/installation/roblox-plugin.md +1 -1
- package/docs/es/pro-upgrade.md +1 -1
- package/docs/id/README.md +18 -5
- package/docs/id/dashboard/changelog.md +114 -0
- package/docs/id/dashboard/connection.md +77 -0
- package/docs/id/dashboard/overview.md +95 -0
- package/docs/id/dashboard/playtest.md +61 -0
- package/docs/id/dashboard/settings.md +67 -0
- package/docs/id/dashboard/sync.md +75 -0
- package/docs/id/dashboard/tools.md +69 -0
- package/docs/id/installation/ai-apps/claude-code.md +1 -1
- package/docs/id/installation/roblox-plugin.md +1 -1
- package/docs/id/pro-upgrade.md +1 -1
- package/docs/ja/README.md +18 -5
- package/docs/ja/dashboard/changelog.md +114 -0
- package/docs/ja/dashboard/connection.md +77 -0
- package/docs/ja/dashboard/overview.md +95 -0
- package/docs/ja/dashboard/playtest.md +61 -0
- package/docs/ja/dashboard/settings.md +67 -0
- package/docs/ja/dashboard/sync.md +75 -0
- package/docs/ja/dashboard/tools.md +69 -0
- package/docs/ja/installation/ai-apps/claude-code.md +1 -1
- package/docs/ja/installation/roblox-plugin.md +1 -1
- package/docs/ja/pro-upgrade.md +1 -1
- package/docs/ko/README.md +18 -5
- package/docs/ko/dashboard/changelog.md +114 -0
- package/docs/ko/dashboard/connection.md +77 -0
- package/docs/ko/dashboard/overview.md +95 -0
- package/docs/ko/dashboard/playtest.md +61 -0
- package/docs/ko/dashboard/settings.md +67 -0
- package/docs/ko/dashboard/sync.md +75 -0
- package/docs/ko/dashboard/tools.md +69 -0
- package/docs/ko/installation/ai-apps/claude-code.md +1 -1
- package/docs/ko/installation/roblox-explorer.md +2 -2
- package/docs/ko/installation/roblox-plugin.md +1 -1
- package/docs/ko/pro-upgrade.md +1 -1
- package/docs/pt-br/README.md +18 -5
- package/docs/pt-br/dashboard/changelog.md +114 -0
- package/docs/pt-br/dashboard/connection.md +77 -0
- package/docs/pt-br/dashboard/overview.md +95 -0
- package/docs/pt-br/dashboard/playtest.md +61 -0
- package/docs/pt-br/dashboard/settings.md +67 -0
- package/docs/pt-br/dashboard/sync.md +75 -0
- package/docs/pt-br/dashboard/tools.md +69 -0
- package/docs/pt-br/installation/ai-apps/claude-code.md +1 -1
- package/docs/pt-br/installation/roblox-plugin.md +1 -1
- package/docs/pt-br/pro-upgrade.md +1 -1
- package/docs/troubleshooting.md +1 -1
- package/llms-full.txt +12 -10
- package/llms.txt +21 -18
- package/package.json +4 -10
- package/plugins/weppy-roblox-mcp/.claude-plugin/plugin.json +3 -3
- package/plugins/weppy-roblox-mcp/dashboard/dist/assets/ChangelogDetailPage-BOp7G4Fi.js +1 -0
- package/plugins/weppy-roblox-mcp/dashboard/dist/assets/ChangelogDetailPage-C2oKsYGC.css +1 -0
- package/plugins/weppy-roblox-mcp/dashboard/dist/assets/ChangelogPage-ByQDwNhh.css +1 -0
- package/plugins/weppy-roblox-mcp/dashboard/dist/assets/ChangelogPage-DGhZm1j7.js +1 -0
- package/plugins/weppy-roblox-mcp/dashboard/dist/assets/ConnectionPage-CkQVyTc5.css +1 -0
- package/plugins/weppy-roblox-mcp/dashboard/dist/assets/ConnectionPage-DXv_C7i6.js +1 -0
- package/plugins/weppy-roblox-mcp/dashboard/dist/assets/InfoLabel-CszBT8rJ.js +1 -0
- package/plugins/weppy-roblox-mcp/dashboard/dist/assets/OverviewPage-CS05LsEh.css +1 -0
- package/plugins/weppy-roblox-mcp/dashboard/dist/assets/OverviewPage-DS-g_EC0.js +1 -0
- package/plugins/weppy-roblox-mcp/dashboard/dist/assets/PlaytestPage-C4X6-jp-.js +1 -0
- package/plugins/weppy-roblox-mcp/dashboard/dist/assets/PlaytestPage-emQ5xjZz.css +1 -0
- package/plugins/weppy-roblox-mcp/dashboard/dist/assets/PropertyDiff-Cbx8P1zh.css +1 -0
- package/plugins/weppy-roblox-mcp/dashboard/dist/assets/PropertyDiff-qdFEmTM4.js +6 -0
- package/plugins/weppy-roblox-mcp/dashboard/dist/assets/SettingsPage-BtjNT-j0.js +1 -0
- package/plugins/weppy-roblox-mcp/dashboard/dist/assets/SettingsPage-NF_CPSvZ.css +1 -0
- package/plugins/weppy-roblox-mcp/dashboard/dist/assets/StatusBadge-C2zYt5iE.css +1 -0
- package/plugins/weppy-roblox-mcp/dashboard/dist/assets/StatusBadge-CC_OzjmT.js +1 -0
- package/plugins/weppy-roblox-mcp/dashboard/dist/assets/SyncPage-BNHvpQxD.css +1 -0
- package/plugins/weppy-roblox-mcp/dashboard/dist/assets/SyncPage-BOYoftuM.js +4 -0
- package/plugins/weppy-roblox-mcp/dashboard/dist/assets/TierPromoPanel-DzFynur7.js +1 -0
- package/plugins/weppy-roblox-mcp/dashboard/dist/assets/TierPromoProgress-DkpXj7Ui.js +1 -0
- package/plugins/weppy-roblox-mcp/dashboard/dist/assets/ToolsPage-CZsA-7CL.js +1 -0
- package/plugins/weppy-roblox-mcp/dashboard/dist/assets/ToolsPage-cVoMPYAn.css +1 -0
- package/plugins/weppy-roblox-mcp/dashboard/dist/assets/index-BOVxaPTw.css +1 -0
- package/plugins/weppy-roblox-mcp/dashboard/dist/assets/index-BYvG5KEz.js +69 -0
- package/plugins/weppy-roblox-mcp/dashboard/dist/assets/tier-promo-config-CJ-J0n2q.css +1 -0
- package/plugins/weppy-roblox-mcp/dashboard/dist/assets/tier-promo-config-CckH43fU.js +1 -0
- package/plugins/weppy-roblox-mcp/dashboard/dist/assets/useLiveUptime-DZCw70vn.js +1 -0
- package/plugins/weppy-roblox-mcp/dashboard/dist/index.html +14 -0
- package/plugins/weppy-roblox-mcp/dist/index.js +66 -54
- package/smithery.yaml +1 -1
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
# Settings
|
|
2
|
+
|
|
3
|
+
> Verifique e gerencie informacoes de licenca, configuracoes do servidor, configuracoes de sincronizacao e idioma.
|
|
4
|
+
|
|
5
|
+
## Visao geral
|
|
6
|
+
|
|
7
|
+
Na pagina Settings, voce pode verificar as informacoes de licenca e as configuracoes do servidor, alem de alterar algumas delas. Esta sempre acessivel quando o servidor esta conectado (L1 ou superior).
|
|
8
|
+
|
|
9
|
+
## License (somente leitura)
|
|
10
|
+
|
|
11
|
+
Exibe o status atual da licenca:
|
|
12
|
+
|
|
13
|
+
| Item | Descricao |
|
|
14
|
+
|------|-----------|
|
|
15
|
+
| Status | Badge de status (Active/Inactive) |
|
|
16
|
+
| Tier | Tier atual (Basic/Pro) |
|
|
17
|
+
| License Key | Chave de licenca mascarada |
|
|
18
|
+
| Provider | Informacoes do provedor da licenca |
|
|
19
|
+
|
|
20
|
+
## General
|
|
21
|
+
|
|
22
|
+
| Configuracao | Descricao |
|
|
23
|
+
|--------------|-----------|
|
|
24
|
+
| Log Level | Nivel de saida de logs |
|
|
25
|
+
| History Recording | Se o historico de execucao de ferramentas e salvo |
|
|
26
|
+
| Stats Collection | Se as estatisticas de ferramentas sao coletadas |
|
|
27
|
+
| Request Timeout | Timeout de requisicao (segundos) |
|
|
28
|
+
|
|
29
|
+
## Server Environment (somente leitura)
|
|
30
|
+
|
|
31
|
+
Exibe as configuracoes do servidor definidas por variaveis de ambiente:
|
|
32
|
+
|
|
33
|
+
| Variavel de ambiente | Descricao | Valor padrao |
|
|
34
|
+
|---------------------|-----------|--------------|
|
|
35
|
+
| `HTTP_PORT` | Porta HTTP | 3002 |
|
|
36
|
+
| `HTTP_HOST` | Host HTTP | 127.0.0.1 |
|
|
37
|
+
| `DASHBOARD_AUTO_OPEN` | Abertura automatica do Dashboard | true |
|
|
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
|
+
## Language
|
|
47
|
+
|
|
48
|
+
Altere o idioma da interface do Dashboard. Suporta 6 idiomas + Auto (deteccao automatica do idioma do navegador).
|
|
49
|
+
|
|
50
|
+
| Opcao | Idioma |
|
|
51
|
+
|-------|--------|
|
|
52
|
+
| Auto | Deteccao automatica do idioma do navegador |
|
|
53
|
+
| English | Ingles |
|
|
54
|
+
| 한국어 | Coreano |
|
|
55
|
+
| 日本語 | Japones |
|
|
56
|
+
| Español | Espanhol |
|
|
57
|
+
| Português | Portugues |
|
|
58
|
+
| Bahasa Indonesia | Indonesio |
|
|
59
|
+
|
|
60
|
+
## Documentos relacionados
|
|
61
|
+
|
|
62
|
+
- [Dashboard Overview](overview.md)
|
|
63
|
+
- [Changelog](changelog.md)
|
|
64
|
+
- [Connection](connection.md)
|
|
65
|
+
- [Sync](sync.md)
|
|
66
|
+
- [Playtest](playtest.md)
|
|
67
|
+
- [Tools](tools.md)
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
# Sync
|
|
2
|
+
|
|
3
|
+
> Monitore o status atual, configuracao de direcao e logs da sincronizacao Studio <-> arquivos locais.
|
|
4
|
+
|
|
5
|
+

|
|
6
|
+
|
|
7
|
+
> Para o guia detalhado da funcionalidade Sync em si, consulte o [Guia detalhado de Sync](../sync/overview.md).
|
|
8
|
+
|
|
9
|
+
## Visao geral
|
|
10
|
+
|
|
11
|
+
A pagina Sync exibe visualmente o status atual e as configuracoes da sincronizacao Studio <-> arquivos locais. So fica acessivel quando o plugin esta conectado (L2).
|
|
12
|
+
|
|
13
|
+
## Sync Status
|
|
14
|
+
|
|
15
|
+
Exibe o status atual da sincronizacao:
|
|
16
|
+
|
|
17
|
+
| Status | Significado |
|
|
18
|
+
|--------|-------------|
|
|
19
|
+
| **Idle** | Aguardando sincronizacao |
|
|
20
|
+
| **Initializing** | Sincronizacao inicial em andamento |
|
|
21
|
+
| **Syncing** | Sincronizacao incremental em andamento |
|
|
22
|
+
| **Error** | Erro de sincronizacao ocorrido |
|
|
23
|
+
|
|
24
|
+
O card de status tambem exibe o caminho de sincronizacao, a quantidade de instancias sincronizadas e o modo de aplicacao atual (Auto/Manual).
|
|
25
|
+
|
|
26
|
+
## Sync Directions
|
|
27
|
+
|
|
28
|
+
Exibe em tabela a direcao de sincronizacao por tipo:
|
|
29
|
+
|
|
30
|
+
| Coluna | Descricao |
|
|
31
|
+
|--------|-----------|
|
|
32
|
+
| Type | Tipo do alvo de sincronizacao (Scripts, Values, Instances, Data, Services) |
|
|
33
|
+
| Direction | Direcao da sincronizacao (Local -> Studio, Studio -> Local) |
|
|
34
|
+
| Apply Mode | Modo de aplicacao (Auto/Manual) |
|
|
35
|
+
|
|
36
|
+
Verifique a direcao de sincronizacao de cada tipo para entender em qual sentido as alteracoes sao refletidas.
|
|
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
|
+
## Sync Log
|
|
46
|
+
|
|
47
|
+
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.
|
|
48
|
+
|
|
49
|
+
## Casos de uso
|
|
50
|
+
|
|
51
|
+
### Verificacao do status de sincronizacao
|
|
52
|
+
|
|
53
|
+
```
|
|
54
|
+
"Quero verificar se o Sync esta funcionando corretamente"
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
Confirme se o Sync Status esta Idle e verifique no Sync Log se as alteracoes recentes foram registradas normalmente.
|
|
58
|
+
|
|
59
|
+
### Identificacao da direcao de sincronizacao
|
|
60
|
+
|
|
61
|
+
```
|
|
62
|
+
"Quero saber em qual direcao as alteracoes de script sao sincronizadas"
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
Verifique a Direction do tipo Scripts na tabela Sync Directions.
|
|
66
|
+
|
|
67
|
+
## Documentos relacionados
|
|
68
|
+
|
|
69
|
+
- [Dashboard Overview](overview.md)
|
|
70
|
+
- [Changelog](changelog.md)
|
|
71
|
+
- [Connection](connection.md)
|
|
72
|
+
- [Playtest](playtest.md)
|
|
73
|
+
- [Tools](tools.md)
|
|
74
|
+
- [Settings](settings.md)
|
|
75
|
+
- [Guia detalhado de Sync](../sync/overview.md)
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
# Tools
|
|
2
|
+
|
|
3
|
+
> Verifique o historico e as estatisticas das ferramentas MCP executadas pela IA.
|
|
4
|
+
|
|
5
|
+

|
|
6
|
+
|
|
7
|
+
## Visao geral
|
|
8
|
+
|
|
9
|
+
A pagina Tools fornece o historico e as estatisticas das ferramentas MCP executadas pela IA. E composta por duas sub-abas: **History** e **Statistics**. Esta sempre acessivel quando o servidor esta conectado (L1 ou superior).
|
|
10
|
+
|
|
11
|
+
## Aba History
|
|
12
|
+
|
|
13
|
+
Exibe o historico de execucao das ferramentas em tabela cronologica:
|
|
14
|
+
|
|
15
|
+
| Coluna | Descricao |
|
|
16
|
+
|--------|-----------|
|
|
17
|
+
| Time | Horario de execucao |
|
|
18
|
+
| Tool.Action | Ferramenta e acao executadas (ex.: `query_instances.get_instance`) |
|
|
19
|
+
| Duration | Tempo de execucao |
|
|
20
|
+
| Status | Status do resultado (OK/Error) |
|
|
21
|
+
| Tier | Tier utilizado (Basic/Pro) |
|
|
22
|
+
|
|
23
|
+
Funcionalidades:
|
|
24
|
+
- Dropdown **Tool filter** para filtrar uma ferramenta especifica
|
|
25
|
+
- Paginacao para navegar por grandes volumes de registros
|
|
26
|
+
- Adicao de novos registros de execucao em tempo real
|
|
27
|
+
|
|
28
|
+
## Aba Statistics
|
|
29
|
+
|
|
30
|
+
Analisa visualmente as estatisticas de uso das ferramentas:
|
|
31
|
+
|
|
32
|
+
- **Distribuicao por tier** — Proporcao de uso de ferramentas Basic/Pro
|
|
33
|
+
- **Estatisticas por ferramenta** — Quantidade de chamadas e tempo medio de resposta de cada ferramenta
|
|
34
|
+
- **Analise por acao** — Estatisticas detalhadas por acao dentro de cada ferramenta
|
|
35
|
+
|
|
36
|
+
## Funcionalidades exclusivas do tier Basic
|
|
37
|
+
|
|
38
|
+
Para usuarios do tier Basic, uma UI adicional e exibida:
|
|
39
|
+
|
|
40
|
+
- **Tier Usage Progress** — Barra de progresso de uso
|
|
41
|
+
- **Modal comparativo Basic vs Pro** — Apresenta as funcionalidades adicionais do tier Pro
|
|
42
|
+
|
|
43
|
+
## Casos de uso
|
|
44
|
+
|
|
45
|
+
### Analise de desempenho de ferramentas
|
|
46
|
+
|
|
47
|
+
```
|
|
48
|
+
"Quero saber qual ferramenta demora mais"
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
Verifique o tempo medio de resposta por ferramenta na aba Statistics.
|
|
52
|
+
|
|
53
|
+
### Rastreamento de erros
|
|
54
|
+
|
|
55
|
+
```
|
|
56
|
+
"Quero saber por que a ferramenta que acabei de executar falhou"
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
Encontre o item com Status Error na aba History para verificar as informacoes detalhadas.
|
|
60
|
+
|
|
61
|
+
## Documentos relacionados
|
|
62
|
+
|
|
63
|
+
- [Dashboard Overview](overview.md)
|
|
64
|
+
- [Changelog](changelog.md)
|
|
65
|
+
- [Connection](connection.md)
|
|
66
|
+
- [Sync](sync.md)
|
|
67
|
+
- [Playtest](playtest.md)
|
|
68
|
+
- [Settings](settings.md)
|
|
69
|
+
- [Lista completa de Tools](../tools/overview.md)
|
|
@@ -4,7 +4,7 @@ Como instalar o plugin para conectar agentes de IA no Roblox Studio.
|
|
|
4
4
|
|
|
5
5
|
## 1. Baixar o Plugin
|
|
6
6
|
|
|
7
|
-
1. Abra [GitHub Releases](https://github.com/hope1026/roblox-mcp/releases/latest)
|
|
7
|
+
1. Abra [GitHub Releases](https://github.com/hope1026/weppy-roblox-mcp/releases/latest)
|
|
8
8
|
2. Baixe `weppy-roblox-mcp-v{version}.zip`
|
|
9
9
|
3. Extraia o ZIP - voce encontrara `roblox-plugin/WeppyRobloxMCP.rbxm` e guias de instalacao
|
|
10
10
|
|
|
@@ -30,7 +30,7 @@ Geração de terrain, busca de assets, análise espacial, animação, áudio e a
|
|
|
30
30
|
|
|
31
31
|
### Passo 2: Baixar no GitHub Releases
|
|
32
32
|
|
|
33
|
-
1. Abra [GitHub Releases](https://github.com/hope1026/roblox-mcp/releases/latest)
|
|
33
|
+
1. Abra [GitHub Releases](https://github.com/hope1026/weppy-roblox-mcp/releases/latest)
|
|
34
34
|
2. Baixe `weppy-roblox-mcp-v{version}.zip`
|
|
35
35
|
3. Extraia e copie `roblox-plugin/WeppyRobloxMCP.rbxm` para a pasta de Plugins do Roblox
|
|
36
36
|
|
package/docs/troubleshooting.md
CHANGED
|
@@ -40,7 +40,7 @@ See [Pro Upgrade Guide](en/pro-upgrade.md) for details.
|
|
|
40
40
|
|
|
41
41
|
## Still stuck?
|
|
42
42
|
|
|
43
|
-
[Open a Discussion](https://github.com/hope1026/roblox-mcp/discussions) and include:
|
|
43
|
+
[Open a Discussion](https://github.com/hope1026/weppy-roblox-mcp/discussions) and include:
|
|
44
44
|
- OS and Node.js version
|
|
45
45
|
- AI client and version
|
|
46
46
|
- Error message or logs
|
package/llms-full.txt
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
|
-
# Roblox MCP — Full Documentation
|
|
1
|
+
# Weppy Roblox MCP — Full Documentation
|
|
2
2
|
|
|
3
|
-
>
|
|
4
|
-
>
|
|
3
|
+
> Weppy Roblox MCP is an MCP server that lets AI coding agents (Claude, Codex,
|
|
4
|
+
> Cursor, Gemini) control a live Roblox Studio session — create and edit scripts,
|
|
5
|
+
> instances, terrain, lighting, assets, audio, and animations via natural language.
|
|
6
|
+
> 21 consolidated tools · 140+ actions · Bidirectional sync · Multi-place support
|
|
5
7
|
|
|
6
8
|
---
|
|
7
9
|
|
|
@@ -25,7 +27,7 @@ Download the plugin file from GitHub, then place it in Roblox Studio's Plugins f
|
|
|
25
27
|
|
|
26
28
|
### Download Plugin
|
|
27
29
|
|
|
28
|
-
1. Open [GitHub Releases](https://github.com/hope1026/roblox-mcp/releases/latest)
|
|
30
|
+
1. Open [GitHub Releases](https://github.com/hope1026/weppy-roblox-mcp/releases/latest)
|
|
29
31
|
2. Download `weppy-roblox-mcp-v{version}.zip`
|
|
30
32
|
3. Extract the ZIP file - you will find `roblox-plugin/WeppyRobloxMCP.rbxm` and setup guides
|
|
31
33
|
|
|
@@ -66,7 +68,7 @@ The MCP server command is: `npx -y @weppy/roblox-mcp`
|
|
|
66
68
|
**Method 1: Install from Marketplace (Recommended)**
|
|
67
69
|
|
|
68
70
|
```bash
|
|
69
|
-
/plugin marketplace add hope1026/roblox-mcp
|
|
71
|
+
/plugin marketplace add hope1026/weppy-roblox-mcp
|
|
70
72
|
/plugin install weppy-roblox-mcp@hope1026-roblox-mcp
|
|
71
73
|
```
|
|
72
74
|
|
|
@@ -168,7 +170,7 @@ In the agent pane, click ⋯ → MCP Servers → Manage MCP Servers → View raw
|
|
|
168
170
|
|
|
169
171
|
Browse synced instance trees inside VSCode with Roblox class icons.
|
|
170
172
|
|
|
171
|
-
1. Download the latest `weppy-roblox-explorer-*.vsix` from [Releases](https://github.com/hope1026/roblox-mcp/releases)
|
|
173
|
+
1. Download the latest `weppy-roblox-explorer-*.vsix` from [Releases](https://github.com/hope1026/weppy-roblox-mcp/releases)
|
|
172
174
|
2. Open VSCode → Extensions sidebar → ⋯ → Install from VSIX...
|
|
173
175
|
3. Select the downloaded `.vsix` file
|
|
174
176
|
|
|
@@ -577,7 +579,7 @@ The action you're requesting requires the Pro tier.
|
|
|
577
579
|
|
|
578
580
|
## Still stuck?
|
|
579
581
|
|
|
580
|
-
[Open a Discussion](https://github.com/hope1026/roblox-mcp/discussions) with your OS, Node.js version, AI client, and error details.
|
|
582
|
+
[Open a Discussion](https://github.com/hope1026/weppy-roblox-mcp/discussions) with your OS, Node.js version, AI client, and error details.
|
|
581
583
|
|
|
582
584
|
---
|
|
583
585
|
|
|
@@ -593,7 +595,7 @@ The action you're requesting requires the Pro tier.
|
|
|
593
595
|
|
|
594
596
|
# Links
|
|
595
597
|
|
|
596
|
-
- GitHub: https://github.com/hope1026/roblox-mcp
|
|
598
|
+
- GitHub: https://github.com/hope1026/weppy-roblox-mcp
|
|
597
599
|
- npm: https://www.npmjs.com/package/@weppy/roblox-mcp
|
|
598
|
-
- Issues: https://github.com/hope1026/roblox-mcp/issues
|
|
599
|
-
- Discussions: https://github.com/hope1026/roblox-mcp/discussions
|
|
600
|
+
- Issues: https://github.com/hope1026/weppy-roblox-mcp/issues
|
|
601
|
+
- Discussions: https://github.com/hope1026/weppy-roblox-mcp/discussions
|
package/llms.txt
CHANGED
|
@@ -1,17 +1,20 @@
|
|
|
1
|
-
# Roblox MCP
|
|
1
|
+
# Weppy Roblox MCP — MCP Server for Roblox Studio
|
|
2
2
|
|
|
3
|
-
>
|
|
4
|
-
>
|
|
3
|
+
> Weppy Roblox MCP is an MCP server that lets AI coding agents (Claude, Codex,
|
|
4
|
+
> Cursor, Gemini) control a live Roblox Studio session — create and edit scripts,
|
|
5
|
+
> instances, terrain, lighting, assets, audio, and animations via natural language.
|
|
5
6
|
|
|
6
7
|
## What it does
|
|
7
8
|
|
|
8
|
-
Roblox MCP provides a real-time bridge between AI agents and the Roblox
|
|
9
|
-
DataModel. It exposes the full Roblox API surface as executable MCP tools,
|
|
10
|
-
can directly create, read, modify, and delete instances, scripts, properties,
|
|
9
|
+
Weppy Roblox MCP provides a real-time bridge between AI agents and the Roblox
|
|
10
|
+
Studio DataModel. It exposes the full Roblox API surface as executable MCP tools,
|
|
11
|
+
so AI can directly create, read, modify, and delete instances, scripts, properties,
|
|
11
12
|
terrain, and more — inside a live Studio session.
|
|
12
13
|
|
|
13
|
-
-
|
|
14
|
-
- Bidirectional project sync between Roblox Studio and local files
|
|
14
|
+
- 21 consolidated tools with 140+ actions covering the full Roblox Studio API surface
|
|
15
|
+
- Bidirectional project sync between Roblox Studio and local files (Pro)
|
|
16
|
+
- Automated playtest: AI starts/stops Play/Run, injects test scripts, collects logs
|
|
17
|
+
- Multi-place support (up to 3 places simultaneously)
|
|
15
18
|
- Roblox Explorer VSCode extension for browsing Studio hierarchy
|
|
16
19
|
- Works with Claude Code, Claude Desktop, Cursor, Codex CLI, Codex Desktop, Gemini CLI, Antigravity
|
|
17
20
|
|
|
@@ -28,13 +31,13 @@ Install in 2 steps:
|
|
|
28
31
|
|
|
29
32
|
## Detailed docs
|
|
30
33
|
|
|
31
|
-
- Full documentation: [llms-full.txt](https://github.com/hope1026/roblox-mcp/blob/main/llms-full.txt)
|
|
32
|
-
- Installation: https://github.com/hope1026/roblox-mcp/blob/main/docs/en/installation/README.md
|
|
33
|
-
- Tools reference: https://github.com/hope1026/roblox-mcp/blob/main/docs/en/tools/overview.md
|
|
34
|
-
- Sync guide: https://github.com/hope1026/roblox-mcp/blob/main/docs/en/sync/overview.md
|
|
35
|
-
- Troubleshooting: https://github.com/hope1026/roblox-mcp/blob/main/docs/troubleshooting.md
|
|
36
|
-
- Compatibility: https://github.com/hope1026/roblox-mcp/blob/main/docs/compatibility.md
|
|
37
|
-
- Pro upgrade: https://github.com/hope1026/roblox-mcp/blob/main/docs/en/pro-upgrade.md
|
|
34
|
+
- Full documentation: [llms-full.txt](https://github.com/hope1026/weppy-roblox-mcp/blob/main/llms-full.txt)
|
|
35
|
+
- Installation: https://github.com/hope1026/weppy-roblox-mcp/blob/main/docs/en/installation/README.md
|
|
36
|
+
- Tools reference: https://github.com/hope1026/weppy-roblox-mcp/blob/main/docs/en/tools/overview.md
|
|
37
|
+
- Sync guide: https://github.com/hope1026/weppy-roblox-mcp/blob/main/docs/en/sync/overview.md
|
|
38
|
+
- Troubleshooting: https://github.com/hope1026/weppy-roblox-mcp/blob/main/docs/troubleshooting.md
|
|
39
|
+
- Compatibility: https://github.com/hope1026/weppy-roblox-mcp/blob/main/docs/compatibility.md
|
|
40
|
+
- Pro upgrade: https://github.com/hope1026/weppy-roblox-mcp/blob/main/docs/en/pro-upgrade.md
|
|
38
41
|
|
|
39
42
|
## Requirements
|
|
40
43
|
|
|
@@ -49,7 +52,7 @@ Install in 2 steps:
|
|
|
49
52
|
|
|
50
53
|
## Links
|
|
51
54
|
|
|
52
|
-
- GitHub: https://github.com/hope1026/roblox-mcp
|
|
55
|
+
- GitHub: https://github.com/hope1026/weppy-roblox-mcp
|
|
53
56
|
- npm: https://www.npmjs.com/package/@weppy/roblox-mcp
|
|
54
|
-
- Issues: https://github.com/hope1026/roblox-mcp/issues
|
|
55
|
-
- Discussions: https://github.com/hope1026/roblox-mcp/discussions
|
|
57
|
+
- Issues: https://github.com/hope1026/weppy-roblox-mcp/issues
|
|
58
|
+
- Discussions: https://github.com/hope1026/weppy-roblox-mcp/discussions
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@weppy/roblox-mcp",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "2.0.0",
|
|
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",
|
|
@@ -28,21 +28,15 @@
|
|
|
28
28
|
],
|
|
29
29
|
"author": "",
|
|
30
30
|
"license": "SEE LICENSE IN LICENSE",
|
|
31
|
-
"dependencies": {
|
|
32
|
-
"@modelcontextprotocol/sdk": "^1.0.4",
|
|
33
|
-
"chokidar": "^5.0.0",
|
|
34
|
-
"express": "^4.18.2",
|
|
35
|
-
"lru-cache": "^10.4.3"
|
|
36
|
-
},
|
|
37
31
|
"engines": {
|
|
38
32
|
"node": ">=18.0.0"
|
|
39
33
|
},
|
|
40
34
|
"repository": {
|
|
41
35
|
"type": "git",
|
|
42
|
-
"url": "https://github.com/hope1026/roblox-mcp.git"
|
|
36
|
+
"url": "https://github.com/hope1026/weppy-roblox-mcp.git"
|
|
43
37
|
},
|
|
44
38
|
"bugs": {
|
|
45
|
-
"url": "https://github.com/hope1026/roblox-mcp/issues"
|
|
39
|
+
"url": "https://github.com/hope1026/weppy-roblox-mcp/issues"
|
|
46
40
|
},
|
|
47
|
-
"homepage": "https://github.com/hope1026/roblox-mcp#readme"
|
|
41
|
+
"homepage": "https://github.com/hope1026/weppy-roblox-mcp#readme"
|
|
48
42
|
}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "weppy-roblox-mcp",
|
|
3
3
|
"description": "MCP server for Roblox Studio integration - AI-powered game development with specialized agents and skills",
|
|
4
|
-
"version": "
|
|
4
|
+
"version": "2.0.0",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "hope1026"
|
|
7
7
|
},
|
|
8
|
-
"repository": "https://github.com/hope1026/roblox-mcp",
|
|
9
|
-
"homepage": "https://github.com/hope1026/roblox-mcp#readme",
|
|
8
|
+
"repository": "https://github.com/hope1026/weppy-roblox-mcp",
|
|
9
|
+
"homepage": "https://github.com/hope1026/weppy-roblox-mcp#readme",
|
|
10
10
|
"license": "SEE LICENSE IN LICENSE",
|
|
11
11
|
"keywords": [
|
|
12
12
|
"mcp",
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{r,b as j,u as L,d as O,c as A,j as t,T as p}from"./index-BYvG5KEz.js";import{I as $}from"./InfoLabel-CszBT8rJ.js";import{D,P as F}from"./PropertyDiff-qdFEmTM4.js";function M(e){const a={scriptsModified:0,scriptsCreated:0,instancesCreated:0,instancesDeleted:0,instancesMoved:0,propertiesChanged:0,lightingChanged:!1,terrainChanged:!1,assetsInserted:0};for(const l of e)switch(l.category){case"script":l.changeType==="create"?a.scriptsCreated++:a.scriptsModified++;break;case"instance":l.changeType==="create"?a.instancesCreated++:l.changeType==="delete"?a.instancesDeleted++:l.changeType==="move"&&a.instancesMoved++;break;case"property":a.propertiesChanged++;break;case"lighting":a.lightingChanged=!0;break;case"terrain":a.terrainChanged=!0;break;case"asset":a.assetsInserted++;break}return a}function P(e){const[a,l]=r.useState(""),[i,m]=r.useState(""),[g,f]=r.useState(),[y,h]=r.useState("completed"),[x,_]=r.useState([]),[s,c]=r.useState([]),[o,u]=r.useState([]),[N,E]=r.useState({scriptsModified:0,scriptsCreated:0,instancesCreated:0,instancesDeleted:0,instancesMoved:0,propertiesChanged:0,lightingChanged:!1,terrainChanged:!1,assetsInserted:0}),[I,v]=r.useState(!0),[w,T]=r.useState(null),C=r.useCallback(async()=>{if(e){v(!0),T(null);try{const[d,k]=await Promise.all([j.get(`/api/dashboard/changelog/${e}`),j.get(`/api/dashboard/changelog/${e}/changes`)]);l(d.entryId),m(d.startTime),f(d.endTime),h(d.status),_(d.entries),c(d.failures),u(k.changes),E(M(k.changes))}catch(d){T(d instanceof Error?d.message:"Failed to load changelog detail")}finally{v(!1)}}},[e]);return r.useEffect(()=>{C()},[C]),{entryId:a,startTime:i,endTime:g,status:y,entries:x,failures:s,changes:o,changeSummary:N,loading:I,error:w,refresh:C}}const K={script:"📝",instance:"🧱",property:"🎨",lighting:"🌅",terrain:"⛰️",asset:"📦"};function B(e){return K[e]??"❓"}const G="_page_17pcx_2",R="_header_17pcx_10",U="_backLink_17pcx_16",z="_headerTitle_17pcx_29",H="_headerTime_17pcx_37",q="_statusActive_17pcx_44",J="_statusCompleted_17pcx_49",V="_section_17pcx_54",Y="_sectionTitle_17pcx_61",Q="_summaryGrid_17pcx_74",W="_summaryCard_17pcx_80",X="_summaryCardActive_17pcx_94",Z="_summaryIcon_17pcx_99",ee="_summaryCount_17pcx_105",te="_summaryLabel_17pcx_112",ne="_timelineFilter_17pcx_122",ae="_filterLabel_17pcx_129",se="_filterSelect_17pcx_135",ie="_timeline_17pcx_122",ce="_timelineEntry_17pcx_155",re="_timelineTime_17pcx_172",le="_timelineIcon_17pcx_180",oe="_timelineBody_17pcx_185",de="_timelineSummary_17pcx_190",me="_timelineTarget_17pcx_197",ge="_timelineConfidence_17pcx_204",he="_confidenceExact_17pcx_213",ue="_confidencePartial_17pcx_218",pe="_confidenceAfterOnly_17pcx_223",fe="_confidenceIntentOnly_17pcx_228",ye="_confidenceUnknown_17pcx_233",xe="_timelineExpanded_17pcx_239",_e="_empty_17pcx_311",Ce="_loading_17pcx_320",be="_error_17pcx_329",n={page:G,header:R,backLink:U,headerTitle:z,headerTime:H,statusActive:q,statusCompleted:J,section:V,sectionTitle:Y,summaryGrid:Q,summaryCard:W,summaryCardActive:X,summaryIcon:Z,summaryCount:ee,summaryLabel:te,timelineFilter:ne,filterLabel:ae,filterSelect:se,timeline:ie,timelineEntry:ce,timelineTime:re,timelineIcon:le,timelineBody:oe,timelineSummary:de,timelineTarget:me,timelineConfidence:ge,confidenceExact:he,confidencePartial:ue,confidenceAfterOnly:pe,confidenceIntentOnly:fe,confidenceUnknown:ye,timelineExpanded:xe,empty:_e,loading:Ce,error:be},S=[{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 b(e){if(!e)return"--:--";const a=new Date(e);return`${String(a.getHours()).padStart(2,"0")}:${String(a.getMinutes()).padStart(2,"0")}`}function ve(e){if(!e)return"--:--:--";const a=new Date(e);return`${String(a.getHours()).padStart(2,"0")}:${String(a.getMinutes()).padStart(2,"0")}:${String(a.getSeconds()).padStart(2,"0")}`}function Te(e,a){if(!e||!a)return"";const l=new Date(a).getTime()-new Date(e).getTime();return l<0?"":`${Math.round(l/6e4)}min`}function ke(e){switch(e){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 je(e,a){switch(a){case"exact":return e("changelog.detail.confidence.exact","Exact");case"partial":return e("changelog.detail.confidence.partial","Partial");case"after-only":return e("changelog.detail.confidence.afterOnly","After only");case"intent-only":return e("changelog.detail.confidence.intentOnly","Intent only");default:return e("changelog.detail.confidence.unknown","Unknown")}}function Se(e,a){switch(a){case"exact":return e("changelog.detail.confidence.exact.tooltip","Both the before and after state were confirmed for this change.");case"partial":return e("changelog.detail.confidence.partial.tooltip","Only part of the before and after state could be confirmed for this change.");case"after-only":return e("changelog.detail.confidence.afterOnly.tooltip","Only the resulting state after the change could be confirmed.");case"intent-only":return e("changelog.detail.confidence.intentOnly.tooltip","Only the requested action was recorded, not the resulting state.");default:return e("changelog.detail.confidence.unknown.tooltip","This change could not be confidently classified from the available data.")}}function Le(){const{t:e}=L(),{id:a}=O(),l=A(),i=P(a),[m,g]=r.useState("all"),[f,y]=r.useState(null),h=r.useMemo(()=>[...m==="all"?i.changes:i.changes.filter(c=>c.category===m)].reverse(),[i.changes,m]);if(i.loading)return t.jsx("div",{className:n.loading,children:e("common.loading","Loading...")});if(i.error)return t.jsxs("div",{className:n.error,children:[i.error,t.jsx("br",{}),t.jsxs("span",{className:n.backLink,onClick:()=>l("/changelog"),children:["←"," ",e("changelog.detail.backToList","Back to list")]})]});const x=Te(i.startTime,i.endTime),_=i.endTime?`${b(i.startTime)} → ${b(i.endTime)} (${x})`:`${b(i.startTime)} → ${e("changelog.card.inProgress","in progress")}`;return t.jsxs("div",{className:n.page,children:[t.jsxs("div",{className:n.header,children:[t.jsxs("span",{className:n.backLink,onClick:()=>l("/changelog"),children:["←"," ",e("sidebar.changelog","Changelog")]}),t.jsx("span",{className:n.headerTitle,children:"|"}),t.jsx("span",{className:n.headerTime,children:_}),t.jsx(p,{text:i.status==="active"?e("changelog.card.active.tooltip","This session is still receiving new game changes."):e("changelog.card.completed.tooltip","This session has ended and no more changes are expected."),children:t.jsx("span",{className:i.status==="active"?n.statusActive:n.statusCompleted,children:i.status==="active"?e("changelog.card.active","Active"):e("changelog.card.completed","Completed")})})]}),t.jsxs("div",{className:n.section,children:[t.jsx("div",{className:n.sectionTitle,children:t.jsx(p,{text:e("changelog.detail.changeSummary.tooltip","Counts of extracted game changes grouped by category for this session."),children:t.jsx("span",{children:e("changelog.detail.changeSummary","Change Summary")})})}),t.jsx("div",{className:n.summaryGrid,children:S.map(s=>{const c=i.changeSummary;let o;switch(s.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 u=m===s.key;return t.jsxs("div",{className:`${n.summaryCard} ${u?n.summaryCardActive:""}`,onClick:()=>g(u?"all":s.key),children:[t.jsx("span",{className:n.summaryIcon,children:s.icon}),t.jsx("div",{className:n.summaryCount,children:o}),t.jsx("div",{className:n.summaryLabel,children:e(s.labelKey,s.key)})]},s.key)})})]}),t.jsxs("div",{className:n.section,children:[t.jsx("div",{className:n.sectionTitle,children:t.jsx(p,{text:e("changelog.detail.changeTimeline.tooltip","Chronological list of extracted game changes for this session."),children:t.jsx("span",{children:e("changelog.detail.changeTimeline","Change Timeline")})})}),t.jsxs("div",{className:n.timelineFilter,children:[t.jsx("span",{className:n.filterLabel,children:t.jsx($,{label:`${e("changelog.detail.filterCategory","Category")}:`,tooltip:e("changelog.detail.filterCategory.tooltip","Filter the timeline to a single change category.")})}),t.jsxs("select",{className:n.filterSelect,value:m,onChange:s=>g(s.target.value),children:[t.jsx("option",{value:"all",children:e("tools.filter.all","All")}),S.map(s=>t.jsxs("option",{value:s.key,children:[s.icon," ",e(s.labelKey,s.key)]},s.key))]})]}),h.length===0?t.jsx("div",{className:n.empty,children:e("changelog.detail.noChanges","No changes in this category")}):t.jsx("div",{className:n.timeline,children:h.map((s,c)=>{const o=f===c;return t.jsxs("div",{children:[t.jsxs("div",{className:n.timelineEntry,onClick:()=>y(o?null:c),children:[t.jsx("span",{className:n.timelineTime,children:ve(s.timestamp)}),t.jsx("span",{className:n.timelineIcon,children:B(s.category)}),t.jsxs("div",{className:n.timelineBody,children:[t.jsxs("div",{className:n.timelineSummary,children:[s.summary,t.jsx(p,{text:Se(e,s.confidence),children:t.jsx("span",{className:`${n.timelineConfidence} ${ke(s.confidence)}`,children:je(e,s.confidence)})})]}),t.jsx("div",{className:n.timelineTarget,children:s.target})]})]}),o&&t.jsx("div",{className:n.timelineExpanded,children:t.jsx(Ne,{change:s})})]},c)})})]})]})}function Ne({change:e}){return e.category==="script"&&(e.before||e.after)?t.jsx(D,{before:e.before,after:e.after}):e.category==="property"?t.jsx(F,{before:e.before,after:e.after}):e.details?t.jsx("pre",{style:{fontFamily:"var(--font-code)",fontSize:"11px",color:"var(--text-secondary)",margin:0,whiteSpace:"pre-wrap",wordBreak:"break-all"},children:JSON.stringify(e.details,null,2)}):t.jsx("div",{style:{fontFamily:"var(--font-code)",fontSize:"11px",color:"var(--text-muted)"},children:e.target})}export{Le as Component};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
._page_17pcx_2{display:flex;flex-direction:column;gap:20px;max-width:900px}._header_17pcx_10{display:flex;align-items:center;gap:12px}._backLink_17pcx_16{font-family:var(--font-label);font-size:12px;color:var(--accent);cursor:pointer;text-decoration:none;transition:opacity var(--transition)}._backLink_17pcx_16:hover{opacity:.8}._headerTitle_17pcx_29{font-family:var(--font-label);font-size:14px;font-weight:600;color:var(--text-primary);letter-spacing:.03em}._headerTime_17pcx_37{font-family:var(--font-code);font-size:12px;color:var(--text-secondary);margin-left:auto}._statusActive_17pcx_44{color:var(--success);font-weight:600}._statusCompleted_17pcx_49{color:var(--text-muted)}._section_17pcx_54{background:var(--bg-card);border:1px solid var(--border);border-radius:var(--radius);padding:16px 20px}._sectionTitle_17pcx_61{font-family:var(--font-label);font-size:12px;font-weight:600;color:var(--text-primary);text-transform:uppercase;letter-spacing:.05em;margin-bottom:12px;padding-bottom:8px;border-bottom:1px solid var(--border)}._summaryGrid_17pcx_74{display:grid;grid-template-columns:repeat(auto-fill,minmax(130px,1fr));gap:10px}._summaryCard_17pcx_80{background:var(--bg-secondary);border:1px solid var(--border);border-radius:6px;padding:10px 12px;text-align:center;cursor:pointer;transition:border-color var(--transition)}._summaryCard_17pcx_80:hover{border-color:var(--accent)}._summaryCardActive_17pcx_94{border-color:var(--accent);background:var(--accent-dim)}._summaryIcon_17pcx_99{font-size:20px;display:block;margin-bottom:4px}._summaryCount_17pcx_105{font-family:var(--font-code);font-size:18px;font-weight:700;color:var(--text-primary)}._summaryLabel_17pcx_112{font-family:var(--font-label);font-size:10px;color:var(--text-secondary);text-transform:uppercase;letter-spacing:.04em;margin-top:2px}._timelineFilter_17pcx_122{display:flex;align-items:center;gap:8px;margin-bottom:12px}._filterLabel_17pcx_129{font-family:var(--font-label);font-size:11px;color:var(--text-secondary)}._filterSelect_17pcx_135{font-family:var(--font-code);font-size:11px;padding:3px 8px;border:1px solid var(--border);border-radius:4px;background:var(--bg-secondary);color:var(--text-primary)}._timeline_17pcx_122{display:flex;flex-direction:column;gap:0;position:relative;max-height:480px;overflow-y:auto}._timelineEntry_17pcx_155{display:flex;gap:12px;padding:8px 0;border-bottom:1px solid var(--border);transition:background var(--transition);cursor:pointer}._timelineEntry_17pcx_155:last-child{border-bottom:none}._timelineEntry_17pcx_155:hover{background:var(--bg-secondary)}._timelineTime_17pcx_172{font-family:var(--font-code);font-size:11px;color:var(--text-muted);min-width:50px;flex-shrink:0}._timelineIcon_17pcx_180{font-size:14px;flex-shrink:0}._timelineBody_17pcx_185{flex:1;min-width:0}._timelineSummary_17pcx_190{font-family:var(--font-code);font-size:12px;color:var(--text-primary);word-break:break-all}._timelineTarget_17pcx_197{font-family:var(--font-code);font-size:11px;color:var(--text-secondary);margin-top:2px}._timelineConfidence_17pcx_204{font-family:var(--font-label);font-size:9px;padding:1px 5px;border-radius:3px;margin-left:8px;vertical-align:middle}._confidenceExact_17pcx_213{background:#22c55e26;color:var(--success)}._confidencePartial_17pcx_218{background:#f59e0b26;color:var(--warning)}._confidenceAfterOnly_17pcx_223{background:#22c55e14;color:var(--text-secondary)}._confidenceIntentOnly_17pcx_228{background:#ef444426;color:var(--error)}._confidenceUnknown_17pcx_233{background:var(--bg-secondary);color:var(--text-muted)}._timelineExpanded_17pcx_239{margin-top:8px;padding:8px;background:var(--bg-card);border:1px solid var(--border);border-radius:6px}._beforeAfterList_17pcx_248{display:flex;flex-direction:column;gap:12px}._beforeAfterItem_17pcx_254{background:var(--bg-secondary);border:1px solid var(--border);border-radius:6px;overflow:hidden}._beforeAfterHeader_17pcx_261{display:flex;align-items:center;justify-content:space-between;padding:8px 12px;background:var(--bg-card);border-bottom:1px solid var(--border);cursor:pointer}._beforeAfterPath_17pcx_271{font-family:var(--font-code);font-size:11px;color:var(--text-primary)}._beforeAfterBadge_17pcx_277{font-family:var(--font-label);font-size:9px;padding:1px 6px;border-radius:3px;text-transform:uppercase;letter-spacing:.04em}._badgeCreate_17pcx_286{background:#22c55e26;color:var(--success)}._badgeModify_17pcx_291{background:#f59e0b26;color:var(--warning)}._badgeDelete_17pcx_296{background:#ef444426;color:var(--error)}._badgeMove_17pcx_301{background:#3b82f626;color:var(--accent)}._beforeAfterBody_17pcx_306{padding:8px}._empty_17pcx_311{text-align:center;padding:20px;color:var(--text-muted);font-family:var(--font-label);font-size:12px}._loading_17pcx_320{text-align:center;padding:40px 20px;color:var(--text-secondary);font-family:var(--font-label);font-size:12px}._error_17pcx_329{text-align:center;padding:40px 20px;color:var(--error);font-family:var(--font-label);font-size:13px}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
._card_z2aep_2{background:var(--bg-card);border:1px solid var(--border);border-radius:var(--radius);padding:14px 18px;cursor:pointer;transition:border-color var(--transition),box-shadow var(--transition)}._card_z2aep_2:hover{border-color:var(--accent);box-shadow:0 0 0 1px var(--accent-dim)}._header_z2aep_17{display:flex;align-items:center;justify-content:space-between;margin-bottom:10px}._statusBadge_z2aep_24{display:flex;align-items:center;gap:6px;font-family:var(--font-label);font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.05em}._statusDot_z2aep_35{width:7px;height:7px;border-radius:50%}._active_z2aep_41 ._statusDot_z2aep_35{background:var(--success);box-shadow:0 0 6px var(--success)}._active_z2aep_41{color:var(--success)}._completed_z2aep_50 ._statusDot_z2aep_35{background:var(--text-muted)}._completed_z2aep_50{color:var(--text-secondary)}._timeRange_z2aep_58{font-family:var(--font-code);font-size:11px;color:var(--text-secondary)}._summaryList_z2aep_65{display:flex;flex-direction:column;gap:4px}._summaryItem_z2aep_71{display:flex;align-items:center;gap:8px;font-family:var(--font-code);font-size:12px;color:var(--text-primary)}._summaryIcon_z2aep_80{width:20px;text-align:center;flex-shrink:0}._summaryText_z2aep_86{color:var(--text-secondary)}._progressBar_z2aep_91{margin-top:10px;height:3px;background:var(--bg-secondary);border-radius:2px;overflow:hidden}._progressFill_z2aep_99{height:100%;background:var(--accent);border-radius:2px;animation:_pulse_z2aep_1 2s ease-in-out infinite}@keyframes _pulse_z2aep_1{0%,to{opacity:.6;width:30%}50%{opacity:1;width:70%}}._emptySummary_z2aep_112{font-family:var(--font-label);font-size:12px;color:var(--text-muted);text-align:center;padding:8px 0}._page_59srx_2{display:flex;flex-direction:column;gap:16px;max-width:700px}._header_59srx_10{font-family:var(--font-label);font-size:14px;font-weight:600;color:var(--text-primary);letter-spacing:.05em;text-transform:uppercase}._headerSub_59srx_19{font-size:11px;font-weight:400;color:var(--text-muted);text-transform:none;letter-spacing:0;margin-left:8px}._filterTabs_59srx_29{display:flex;gap:2px;border-bottom:1px solid var(--border)}._filterTab_59srx_29{font-family:var(--font-label);font-size:12px;font-weight:500;padding:8px 16px;background:none;border:none;border-bottom:2px solid transparent;color:var(--text-secondary);cursor:pointer;transition:color var(--transition),border-color var(--transition)}._filterTab_59srx_29:hover{color:var(--text-primary)}._filterTabActive_59srx_52{color:var(--accent);border-bottom-color:var(--accent)}._list_59srx_58{display:flex;flex-direction:column;gap:10px}._empty_59srx_65{text-align:center;padding:40px 20px;color:var(--text-muted);font-family:var(--font-label);font-size:13px}._loading_59srx_74{text-align:center;padding:40px 20px;color:var(--text-secondary);font-family:var(--font-label);font-size:12px}._pagination_59srx_83{display:flex;align-items:center;justify-content:center;gap:12px;margin-top:4px}._pageInfo_59srx_91{font-family:var(--font-code);font-size:12px;color:var(--text-secondary)}._btn_59srx_97{font-family:var(--font-label);font-size:12px;padding:4px 12px;border-radius:4px;border:1px solid var(--border);background:var(--bg-secondary);color:var(--text-primary);cursor:pointer;transition:background var(--transition),border-color var(--transition)}._btn_59srx_97:hover:not(:disabled){border-color:var(--accent);background:var(--accent-dim)}._btn_59srx_97:disabled{opacity:.4;cursor:default}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{r as i,b as N,D as I,u as $,j as t,T,c as k}from"./index-BYvG5KEz.js";const z=10;function M(){const[a,g]=i.useState([]),[e,s]=i.useState(0),[m,u]=i.useState(!1),[r,f]=i.useState(!0),[l,y]=i.useState(0),[p,b]=i.useState("all"),_=i.useRef(null),h=i.useCallback(async(n,d)=>{f(!0);try{const C={limit:String(z),offset:String(n)};d!=="all"&&(C.status=d);const S=await N.get("/api/dashboard/changelog",C);g(S.entries),s(S.total),u(S.hasMore)}catch{g([]),s(0),u(!1)}finally{f(!1)}},[]),v=i.useCallback(()=>{h(l,p)},[h,l,p]);return i.useEffect(()=>{h(l,p)},[h,l,p]),i.useEffect(()=>{const n=new I;_.current=n,n.connect();const d=n.on("command",()=>{h(l,p)});return()=>{d(),n.disconnect(),_.current=null}},[h,l,p]),{entries:a,total:e,hasMore:m,loading:r,offset:l,statusFilter:p,setOffset:y,setStatusFilter:b,refresh:v}}const B="_card_z2aep_2",L="_header_z2aep_17",A="_statusBadge_z2aep_24",D="_statusDot_z2aep_35",E="_active_z2aep_41",F="_completed_z2aep_50",R="_timeRange_z2aep_58",w="_summaryList_z2aep_65",O="_summaryItem_z2aep_71",P="_summaryIcon_z2aep_80",G="_summaryText_z2aep_86",H="_progressBar_z2aep_91",Z="_progressFill_z2aep_99",U="_emptySummary_z2aep_112",o={card:B,header:L,statusBadge:A,statusDot:D,active:E,completed:F,timeRange:R,summaryList:w,summaryItem:O,summaryIcon:P,summaryText:G,progressBar:H,progressFill:Z,emptySummary:U};function j(a){if(!a)return"--:--";const g=new Date(a);return`${String(g.getHours()).padStart(2,"0")}:${String(g.getMinutes()).padStart(2,"0")}`}function q({entry:a,onClick:g}){const{t:e}=$(),s=a.changeSummary,m=a.status==="active",u=a.isBootstrapOnly===!0,r=[],f=s.scriptsModified+s.scriptsCreated;if(f>0){const n=[];s.scriptsModified>0&&n.push(`${s.scriptsModified} ${e("changelog.card.modified","modified")}`),s.scriptsCreated>0&&n.push(`${s.scriptsCreated} ${e("changelog.card.created","created")}`);const d=`${f} ${e("changelog.card.scripts","scripts")} ${n.join(", ")}`;r.push({icon:"📝",text:d,tooltip:e("changelog.card.scripts.tooltip","Script changes made in this session.")})}const l=s.instancesCreated+s.instancesDeleted+s.instancesMoved;if(l>0){const n=[];s.instancesCreated>0&&n.push(`${s.instancesCreated} ${e("changelog.card.created","created")}`),s.instancesDeleted>0&&n.push(`${s.instancesDeleted} ${e("changelog.card.deleted","deleted")}`),s.instancesMoved>0&&n.push(`${s.instancesMoved} ${e("changelog.card.moved","moved")}`);const d=`${l} ${e("changelog.card.instances","instances")} ${n.join(", ")}`;r.push({icon:"🧱",text:d,tooltip:e("changelog.card.instances.tooltip","Instance create, delete, move, or clone changes in this session.")})}s.propertiesChanged>0&&r.push({icon:"🎨",text:`${s.propertiesChanged} ${e("changelog.card.propertiesChanged","properties changed")}`,tooltip:e("changelog.card.propertiesChanged.tooltip","Property value changes recorded for this session.")}),s.lightingChanged&&r.push({icon:"🌅",text:e("changelog.card.lightingConfigured","Lighting configured"),tooltip:e("changelog.card.lightingConfigured.tooltip","Lighting or atmosphere settings changed in this session.")}),s.terrainChanged&&r.push({icon:"⛰️",text:e("changelog.card.terrainConfigured","Terrain configured"),tooltip:e("changelog.card.terrainConfigured.tooltip","Terrain data or terrain settings changed in this session.")}),s.assetsInserted>0&&r.push({icon:"📦",text:`${s.assetsInserted} ${e("changelog.card.assetsInserted","assets inserted")}`,tooltip:e("changelog.card.assetsInserted.tooltip","Assets inserted into the place during this session.")});const y=j(a.startTime),p=m?e("changelog.card.inProgress","in progress"):a.endTime?j(a.endTime):"--:--",b=u?e("changelog.card.bootstrapStatus","Bootstrap"):m?e("changelog.card.active","Active"):e("changelog.card.completed","Completed"),_=u?e("changelog.card.bootstrapStatus.tooltip","This session only contains the initial sync bootstrap snapshot."):m?e("changelog.card.active.tooltip","This session is still receiving new game changes."):e("changelog.card.completed.tooltip","This session has ended and no more changes are expected."),h=u?e("changelog.card.bootstrapSummary","Initial sync snapshot"):e("changelog.card.noChanges","No changes yet"),v=u?e("changelog.card.bootstrapSummary.tooltip","Initial file sync writes are collapsed into a single bootstrap snapshot row."):e("changelog.card.noChanges.tooltip","No game changes have been extracted for this session yet.");return t.jsxs("div",{className:o.card,onClick:g,children:[t.jsxs("div",{className:o.header,children:[t.jsx(T,{text:_,children:t.jsxs("span",{className:`${o.statusBadge} ${m?o.active:o.completed}`,children:[t.jsx("span",{className:o.statusDot}),b]})}),t.jsxs("span",{className:o.timeRange,children:[y,"~",p]})]}),t.jsx("div",{className:o.summaryList,children:r.length>0?r.map((n,d)=>t.jsxs("div",{className:o.summaryItem,children:[t.jsx("span",{className:o.summaryIcon,children:n.icon}),t.jsx(T,{text:n.tooltip,children:t.jsx("span",{className:o.summaryText,children:n.text})})]},d)):t.jsx(T,{text:v,children:t.jsx("span",{className:o.emptySummary,style:{display:"block"},children:h})})}),m&&t.jsx("div",{className:o.progressBar,children:t.jsx("div",{className:o.progressFill})})]})}const J="_page_59srx_2",K="_header_59srx_10",Q="_headerSub_59srx_19",V="_filterTabs_59srx_29",W="_filterTab_59srx_29",X="_filterTabActive_59srx_52",Y="_list_59srx_58",ee="_empty_59srx_65",se="_loading_59srx_74",te="_pagination_59srx_83",ae="_pageInfo_59srx_91",ne="_btn_59srx_97",c={page:J,header:K,headerSub:Q,filterTabs:V,filterTab:W,filterTabActive:X,list:Y,empty:ee,loading:se,pagination:te,pageInfo:ae,btn:ne},x=10,oe=[{key:"all",label:"changelog.filter.all"},{key:"active",label:"changelog.filter.active"},{key:"completed",label:"changelog.filter.completed"}];function ie(){const{t:a}=$(),g=k(),e=M();return t.jsxs("div",{className:c.page,children:[t.jsxs("h2",{className:c.header,children:[a("sidebar.changelog","Changelog"),t.jsx("span",{className:c.headerSub,children:a("changelog.subtitle","Game Change History")})]}),t.jsx("div",{className:c.filterTabs,children:oe.map(s=>t.jsx("button",{className:`${c.filterTab} ${e.statusFilter===s.key?c.filterTabActive:""}`,onClick:()=>{e.setStatusFilter(s.key),e.setOffset(0)},children:a(s.label,s.key.charAt(0).toUpperCase()+s.key.slice(1))},s.key))}),e.loading&&e.entries.length===0&&t.jsx("div",{className:c.loading,children:a("common.loading","Loading...")}),!e.loading&&e.entries.length===0?t.jsx("div",{className:c.empty,children:a("changelog.empty","No changelog entries yet")}):t.jsx("div",{className:c.list,children:e.entries.map(s=>t.jsx(q,{entry:s,onClick:()=>g(`/changelog/${s.entryId}`)},s.entryId))}),e.total>x&&t.jsxs("div",{className:c.pagination,children:[t.jsx("button",{className:c.btn,disabled:e.offset===0,onClick:()=>e.setOffset(Math.max(0,e.offset-x)),children:a("tools.page.prev","Prev")}),t.jsxs("span",{className:c.pageInfo,children:[e.offset+1,"–",Math.min(e.offset+x,e.total)," / ",e.total]}),t.jsx("button",{className:c.btn,disabled:!e.hasMore,onClick:()=>e.setOffset(e.offset+x),children:a("tools.page.next","Next")})]})]})}export{ie as Component};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
._container_1h084_2{max-height:200px;overflow-y:auto;font-family:var(--font-code);font-size:12px;line-height:1.6;padding:8px 12px;background:var(--bg-secondary);border-radius:4px}._entry_1h084_14{display:flex;gap:8px;white-space:nowrap}._timestamp_1h084_21{color:var(--text-muted);flex-shrink:0}._message_1h084_27{color:var(--text-primary);overflow:hidden;text-overflow:ellipsis}._warn_1h084_34 ._message_1h084_27{color:var(--warning)}._error_1h084_39 ._message_1h084_27{color:var(--error)}._empty_1h084_44{color:var(--text-muted);font-style:italic;padding:8px 0}._page_10i40_2{display:flex;flex-direction:column;gap:16px;max-width:820px}._card_10i40_10{background:var(--bg-card);border:1px solid var(--border);border-radius:var(--radius);padding:16px 20px}._disabled_10i40_18{opacity:.4;pointer-events:none}._cardHeader_10i40_24{font-family:var(--font-label);font-weight:500;font-size:11px;text-transform:uppercase;letter-spacing:.05em;color:var(--text-secondary);margin-bottom:12px;display:flex;align-items:center;justify-content:space-between}._serverGrid_10i40_38{display:grid;grid-template-columns:auto 1fr;gap:4px 16px;font-family:var(--font-code);font-size:13px}._serverGrid_10i40_38 dt{color:var(--text-muted)}._serverGrid_10i40_38 dd{color:var(--text-primary);margin:0}._statusRow_10i40_56{display:flex;align-items:center;gap:16px;margin-bottom:12px}._metaItem_10i40_63{font-family:var(--font-code);font-size:12px;color:var(--text-secondary)}._table_10i40_70{width:100%;border-collapse:collapse;font-family:var(--font-code);font-size:12px}._table_10i40_70 th{text-align:left;color:var(--text-muted);font-weight:400;padding:4px 8px 4px 0;border-bottom:1px solid var(--border)}._table_10i40_70 td{padding:6px 8px 6px 0;color:var(--text-primary)}._table_10i40_70 tr:hover td{background:var(--accent-dim)}._toggleBtn_10i40_95{background:none;border:none;color:var(--text-secondary);cursor:pointer;font-size:12px;padding:0 4px;transition:color var(--transition)}._toggleBtn_10i40_95:hover{color:var(--accent)}._disconnected_10i40_110{text-align:center;padding:32px 16px}._disconnected_10i40_110 h3{color:var(--error);font-size:16px;margin:0 0 8px}._disconnected_10i40_110 p{color:var(--text-secondary);font-size:13px;margin:0 0 4px}._disconnectedActions_10i40_127{display:flex;gap:8px;justify-content:center;margin-top:16px}._btn_10i40_134{font-family:var(--font-label);font-size:12px;padding:6px 14px;border-radius:4px;border:1px solid var(--border);background:var(--bg-secondary);color:var(--text-primary);cursor:pointer;transition:background var(--transition),border-color var(--transition)}._btn_10i40_134:hover{border-color:var(--accent);background:var(--accent-dim)}._emptyRow_10i40_152{color:var(--text-muted);font-style:italic}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{u as N,r as a,j as e,a as w,b as S,D as y,T as $}from"./index-BYvG5KEz.js";import{I as l}from"./InfoLabel-CszBT8rJ.js";import{S as I}from"./StatusBadge-CC_OzjmT.js";import{u as R,f as A}from"./useLiveUptime-DZCw70vn.js";const E="_container_1h084_2",L="_entry_1h084_14",M="_timestamp_1h084_21",P="_message_1h084_27",k="_warn_1h084_34",H="_error_1h084_39",D="_empty_1h084_44",g={container:E,entry:L,timestamp:M,message:P,warn:k,error:H,empty:D};function T({entries:n}){const{t}=N(),s=a.useRef(null);return a.useEffect(()=>{const i=s.current;i&&(i.scrollTop=i.scrollHeight)},[n.length]),e.jsx("div",{ref:s,className:g.container,children:n.length===0?e.jsx("div",{className:g.empty,children:t("connection.log.empty","No events yet")}):n.map((i,m)=>e.jsxs("div",{className:`${g.entry} ${i.type?g[i.type]:""}`,children:[e.jsx("span",{className:g.timestamp,children:i.timestamp}),e.jsx("span",{className:g.message,children:i.message})]},m))})}const f=50;function F(){const n=new Date;return`${String(n.getHours()).padStart(2,"0")}:${String(n.getMinutes()).padStart(2,"0")}`}function U(){const{level:n,status:t,error:s}=w(),[i,m]=a.useState(null),[u,v]=a.useState([]),j=a.useRef(null),d=a.useCallback((r,o)=>{v(_=>{const p=[..._,{timestamp:F(),message:r,type:o}];return p.length>f?p.slice(-f):p})},[]),x=a.useCallback(async()=>{try{const r=await S.get("/connection-info");m(r)}catch{m(null)}},[]);return a.useEffect(()=>{n!=="L0"&&t&&x()},[n,t,x]),a.useEffect(()=>{const r=new y;j.current=r,r.connect();const o=r.on("connection",p=>{const h=p,b=h.status==="connected"?"connected":"disconnected";d(`Plugin ${b} — ${h.clientId}`,h.status==="connected"?"info":"warn")}),_=r.on("mcp_status",p=>{const h=p,b=h.status==="registered"?"registered":"unregistered";d(`MCP ${b} — ${h.aiClientName}`,h.status==="registered"?"info":"warn"),x()});return()=>{o(),_(),r.disconnect(),j.current=null}},[d,x]),{status:t,connectionInfo:i,connectionLog:u,level:n,error:s}}const B="_page_10i40_2",G="_card_10i40_10",O="_disabled_10i40_18",V="_cardHeader_10i40_24",q="_serverGrid_10i40_38",W="_statusRow_10i40_56",X="_table_10i40_70",z="_toggleBtn_10i40_95",J="_disconnected_10i40_110",K="_disconnectedActions_10i40_127",Q="_btn_10i40_134",Y="_emptyRow_10i40_152",c={page:B,card:G,disabled:O,cardHeader:V,serverGrid:q,statusRow:W,table:X,toggleBtn:z,disconnected:J,disconnectedActions:K,btn:Q,emptyRow:Y};function C(n,t){const s=Math.max(0,Math.floor((Date.now()-n)/1e3));return s<60?`${s}${t("connection.time.secondsAgo","s ago")}`:s<3600?`${Math.floor(s/60)}${t("connection.time.minutesAgo","m ago")}`:`${Math.floor(s/3600)}${t("connection.time.hoursAgo","h ago")}`}function se(){var r;const{t:n}=N(),{status:t,connectionInfo:s,connectionLog:i,level:m}=U(),[u,v]=a.useState(!0),j=R(t==null?void 0:t.uptime),d=m==="L0",x=d?"offline":"online";return e.jsxs("div",{className:c.page,children:[e.jsxs("div",{className:c.card,children:[e.jsx("div",{className:c.cardHeader,children:n("connection.server.title","Server Status")}),d?e.jsxs("div",{className:c.disconnected,children:[e.jsx("h3",{children:n("level.l0.title")}),e.jsx("p",{children:n("level.l0.message")}),e.jsx("p",{children:n("common.reconnecting")}),e.jsxs("div",{className:c.disconnectedActions,children:[e.jsx("button",{className:c.btn,onClick:()=>window.location.reload(),children:n("connection.reconnect","Reconnect")}),e.jsx("button",{className:c.btn,onClick:()=>{window.location.hash="#/settings"},children:n("connection.checkSettings","Check Settings")})]})]}):e.jsxs(e.Fragment,{children:[e.jsx("div",{className:c.statusRow,children:e.jsx(I,{status:x})}),e.jsxs("dl",{className:c.serverGrid,children:[(t==null?void 0:t.version)&&e.jsxs(e.Fragment,{children:[e.jsx("dt",{children:e.jsx(l,{label:n("connection.server.version","Version"),tooltip:n("connection.server.version.tooltip","Installed MCP server version")})}),e.jsx("dd",{children:e.jsx($,{text:n("connection.server.version.tooltip","Installed MCP server version"),children:`v${t.version}`})})]}),(t==null?void 0:t.pid)!=null&&e.jsxs(e.Fragment,{children:[e.jsx("dt",{children:e.jsx(l,{label:n("connection.server.pid","PID"),tooltip:n("connection.server.pid.tooltip","Operating system process identifier")})}),e.jsx("dd",{children:t.pid})]}),(t==null?void 0:t.uptime)!=null&&e.jsxs(e.Fragment,{children:[e.jsx("dt",{children:e.jsx(l,{label:n("connection.server.uptime","Uptime"),tooltip:n("connection.server.uptime.tooltip","Time elapsed since the MCP server started")})}),e.jsx("dd",{children:A(j??t.uptime)})]}),(t==null?void 0:t.sessionId)&&e.jsxs(e.Fragment,{children:[e.jsx("dt",{children:e.jsx(l,{label:n("connection.server.session","Session"),tooltip:n("connection.server.session.tooltip","Current MCP session identifier")})}),e.jsx("dd",{children:t.sessionId.slice(0,8)})]}),(s==null?void 0:s.serverExecutable)&&e.jsxs(e.Fragment,{children:[e.jsx("dt",{children:e.jsx(l,{label:n("connection.server.exec","Exec"),tooltip:n("connection.server.exec.tooltip","Executable path used to launch the MCP server")})}),e.jsx("dd",{children:s.serverExecutable})]})]})]})]}),e.jsxs("div",{className:`${c.card} ${d?c.disabled:""}`,children:[e.jsxs("div",{className:c.cardHeader,children:[e.jsxs("span",{children:[n("connection.agents.title","AI Agents")," ","(",(s==null?void 0:s.mcpInstanceCount)??0,")"]}),e.jsx("button",{className:c.toggleBtn,onClick:()=>v(o=>!o),"aria-label":u?n("common.collapse","Collapse"):n("common.expand","Expand"),children:u?"▾":"▸"})]}),u&&e.jsxs("table",{className:c.table,children:[e.jsx("thead",{children:e.jsxs("tr",{children:[e.jsx("th",{children:n("connection.agents.name","Agent")}),e.jsx("th",{children:e.jsx(l,{label:n("connection.server.pid","PID"),tooltip:n("connection.server.pid.tooltip","Operating system process identifier")})}),e.jsx("th",{children:e.jsx(l,{label:n("connection.agents.cwd","Working Dir"),tooltip:n("connection.agents.cwd.tooltip","Current working directory for the connected AI agent")})}),e.jsx("th",{children:n("connection.agents.connected","Connected")})]})}),e.jsx("tbody",{children:s!=null&&s.mcpInstances&&s.mcpInstances.length>0?s.mcpInstances.map(o=>e.jsxs("tr",{children:[e.jsx("td",{children:o.aiClientName??n("connection.agents.unknown","Unknown")}),e.jsx("td",{children:o.pid}),e.jsx("td",{children:o.cwd??"-"}),e.jsx("td",{children:C(o.connectedAt,n)})]},o.instanceId)):e.jsx("tr",{children:e.jsx("td",{colSpan:4,className:c.emptyRow,children:n("connection.agents.none","No agents connected")})})})]})]}),e.jsxs("div",{className:`${c.card} ${d?c.disabled:""}`,children:[e.jsxs("div",{className:c.cardHeader,children:[n("connection.plugins.title","Plugins")," ","(",((r=t==null?void 0:t.pluginClients)==null?void 0:r.length)??0,")"]}),e.jsxs("table",{className:c.table,children:[e.jsx("thead",{children:e.jsxs("tr",{children:[e.jsx("th",{children:n("connection.plugins.place","Place")}),e.jsx("th",{children:e.jsx(l,{label:n("connection.plugins.clientId","Client ID"),tooltip:n("connection.plugins.clientId.tooltip","Unique plugin client identifier for this Studio connection")})}),e.jsx("th",{children:e.jsx(l,{label:n("connection.plugins.lastSeen","Last Seen"),tooltip:n("connection.plugins.lastSeen.tooltip","Most recent heartbeat received from the plugin")})}),e.jsx("th",{children:e.jsx(l,{label:n("connection.plugins.version","Ver"),tooltip:n("connection.plugins.version.tooltip","Installed plugin version reported by Studio")})})]})}),e.jsx("tbody",{children:t!=null&&t.pluginClients&&t.pluginClients.length>0?t.pluginClients.map(o=>e.jsxs("tr",{children:[e.jsx("td",{children:o.placeName??o.projectName??"-"}),e.jsx("td",{children:o.clientId.slice(0,10)}),e.jsx("td",{children:C(o.lastSeen,n)}),e.jsx("td",{children:o.pluginVersion??"-"})]},o.clientId)):e.jsx("tr",{children:e.jsx("td",{colSpan:4,className:c.emptyRow,children:n("connection.plugins.none","No plugins connected")})})})]})]}),e.jsxs("div",{className:`${c.card} ${d?c.disabled:""}`,children:[e.jsx("div",{className:c.cardHeader,children:n("connection.log.title","Connection Log")}),e.jsx(T,{entries:i})]})]})}export{se as Component};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{j as e,e as r}from"./index-BYvG5KEz.js";function s({label:t,tooltip:o}){return e.jsx(r,{text:o,children:t})}export{s as I};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
._page_9uhoo_2{display:flex;flex-direction:column;gap:16px;max-width:820px}._card_9uhoo_10{background:var(--bg-card);border:1px solid var(--border);border-radius:var(--radius);padding:16px 20px}._cardHeader_9uhoo_17{font-family:var(--font-label);font-weight:500;font-size:11px;text-transform:uppercase;letter-spacing:.05em;color:var(--text-secondary);margin-bottom:12px}._disconnectCard_9uhoo_28{background:var(--bg-card);border:1px solid var(--error);border-radius:var(--radius);padding:40px 32px;text-align:center}._disconnectIcon_9uhoo_36{font-size:48px;margin-bottom:16px}._disconnectTitle_9uhoo_41{color:var(--error);font-size:18px;font-weight:600;margin:0 0 8px}._disconnectMessage_9uhoo_48{color:var(--text-secondary);font-size:14px;margin:0 0 24px}._reconnectGuide_9uhoo_55{display:flex;flex-direction:column;gap:8px;max-width:360px;margin:0 auto 20px;text-align:left}._guideStep_9uhoo_64{display:flex;align-items:center;gap:12px;font-size:13px;color:var(--text-primary)}._stepNumber_9uhoo_72{display:flex;align-items:center;justify-content:center;width:24px;height:24px;border-radius:50%;background:var(--accent-dim);color:var(--accent);font-family:var(--font-code);font-size:12px;font-weight:600;flex-shrink:0}._reconnectIndicator_9uhoo_88{display:flex;align-items:center;justify-content:center;gap:8px;font-size:12px;color:var(--text-muted);margin-bottom:20px}._reconnectDot_9uhoo_98{width:8px;height:8px;border-radius:50%;background:var(--warning);animation:_pulse_9uhoo_1 1.5s ease-in-out infinite}@keyframes _pulse_9uhoo_1{0%,to{opacity:.4}50%{opacity:1}}._disconnectActions_9uhoo_112{display:flex;gap:8px;justify-content:center}._btn_9uhoo_118{font-family:var(--font-label);font-size:12px;padding:8px 16px;border-radius:4px;border:1px solid var(--accent);background:var(--accent);color:var(--bg-primary);cursor:pointer;transition:opacity var(--transition)}._btn_9uhoo_118:hover{opacity:.85}._btnSecondary_9uhoo_134{font-family:var(--font-label);font-size:12px;padding:8px 16px;border-radius:4px;border:1px solid var(--border);background:var(--bg-secondary);color:var(--text-primary);cursor:pointer;transition:background var(--transition),border-color var(--transition)}._btnSecondary_9uhoo_134:hover{border-color:var(--accent);background:var(--accent-dim)}._metricRow_9uhoo_152,._metricGrid_9uhoo_158{display:grid;grid-template-columns:1fr 1fr;gap:16px}._metricCard_9uhoo_164{background:var(--bg-card);border:1px solid var(--border);border-radius:var(--radius);padding:16px 20px;display:flex;flex-direction:column;gap:6px}._metric_ok_9uhoo_174{border-color:var(--success);box-shadow:0 0 0 1px #22c55e14}._metric_warn_9uhoo_179{border-color:var(--warning);box-shadow:0 0 0 1px #f59e0b14}._metric_error_9uhoo_184{border-color:var(--error);box-shadow:0 0 0 1px #ef444414}._metricHeader_9uhoo_189{display:flex;align-items:center;gap:6px;font-family:var(--font-label);font-size:11px;text-transform:uppercase;letter-spacing:.05em;color:var(--text-secondary)}._metricIcon_9uhoo_200{font-size:14px}._metricTitle_9uhoo_204{flex:1}._metricValue_9uhoo_208{font-family:var(--font-code);font-size:18px;font-weight:600;color:var(--text-primary)}._metricSubtitle_9uhoo_215{font-family:var(--font-code);font-size:11px;color:var(--text-muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}._guideCard_9uhoo_225{background:var(--bg-card);border:1px solid var(--warning);border-radius:var(--radius);padding:16px 20px}._guideTitle_9uhoo_232{font-size:14px;font-weight:500;color:var(--text-primary);margin:0 0 12px}._checklist_9uhoo_239{list-style:none;padding:0;margin:0;display:flex;flex-direction:column;gap:8px}._checklist_9uhoo_239 li{font-size:13px;color:var(--text-secondary);padding-left:24px;position:relative}._checklist_9uhoo_239 li:before{content:"○";position:absolute;left:4px;color:var(--text-muted)}._feedEmpty_9uhoo_263{color:var(--text-muted);font-style:italic;font-size:13px;padding:12px 0}._feedList_9uhoo_270{display:flex;flex-direction:column;gap:4px;max-height:320px;overflow-y:auto}._feedItem_9uhoo_278{display:flex;align-items:baseline;gap:8px;font-size:12px;padding:4px 0;border-bottom:1px solid var(--border)}._feedItem_9uhoo_278:last-child{border-bottom:none}._feedTime_9uhoo_291{font-family:var(--font-code);color:var(--text-muted);flex-shrink:0;width:40px}._feedIcon_9uhoo_298{flex-shrink:0;width:18px;text-align:center}._feedSummary_9uhoo_304{color:var(--text-primary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0}._feedItemClickable_9uhoo_314{cursor:pointer}._feedItemClickable_9uhoo_314:hover{background:var(--bg-secondary)}._feedChevron_9uhoo_322{flex-shrink:0;font-size:10px;color:var(--text-muted);width:14px;text-align:center}._feedDetail_9uhoo_331{padding:8px 12px;margin:2px 0 6px;background:var(--bg-secondary);border:1px solid var(--border);border-radius:6px;overflow-x:auto}._feedDetailPre_9uhoo_340{font-family:var(--font-code);font-size:11px;color:var(--text-secondary);margin:0;white-space:pre-wrap;word-break:break-all}._feedDetailText_9uhoo_349{font-family:var(--font-code);font-size:11px;color:var(--text-muted)}._changelogSummary_9uhoo_356{display:flex;flex-wrap:wrap;gap:8px;font-family:var(--font-code);font-size:12px;color:var(--text-secondary)}._changeTag_9uhoo_365{display:inline-flex;align-items:center;gap:4px;padding:2px 8px;border-radius:3px;background:var(--bg-secondary);border:1px solid var(--border);white-space:nowrap}._tierBar_9uhoo_377{display:flex;flex-direction:column;gap:6px}._tierBarTrack_9uhoo_383{display:flex;height:8px;border-radius:4px;overflow:hidden;background:var(--bg-secondary)}._tierBarFillBasic_9uhoo_391{background:var(--text-muted);transition:width .3s ease}._tierBarFillPro_9uhoo_396{background:var(--accent);transition:width .3s ease}._tierLabels_9uhoo_401{display:flex;justify-content:space-between;font-family:var(--font-code);font-size:11px;color:var(--text-muted)}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{j as t,u as L,r as _,a as G,b as D,D as F,T as U}from"./index-BYvG5KEz.js";import{I as V}from"./InfoLabel-CszBT8rJ.js";import{S as A}from"./StatusBadge-CC_OzjmT.js";import{D as z,P as O}from"./PropertyDiff-qdFEmTM4.js";import{u as J,T as X}from"./tier-promo-config-CckH43fU.js";import{u as q,f as K}from"./useLiveUptime-DZCw70vn.js";import{T as Q}from"./TierPromoProgress-DkpXj7Ui.js";const W="_page_9uhoo_2",Y="_card_9uhoo_10",Z="_cardHeader_9uhoo_17",ee="_disconnectCard_9uhoo_28",te="_disconnectIcon_9uhoo_36",se="_disconnectTitle_9uhoo_41",ne="_disconnectMessage_9uhoo_48",ie="_reconnectGuide_9uhoo_55",re="_guideStep_9uhoo_64",ce="_stepNumber_9uhoo_72",ae="_reconnectIndicator_9uhoo_88",oe="_reconnectDot_9uhoo_98",le="_pulse_9uhoo_1",de="_disconnectActions_9uhoo_112",ue="_btn_9uhoo_118",me="_btnSecondary_9uhoo_134",he="_metricRow_9uhoo_152",ve="_metricGrid_9uhoo_158",_e="_metricCard_9uhoo_164",ge="_metric_ok_9uhoo_174",pe="_metric_warn_9uhoo_179",fe="_metric_error_9uhoo_184",xe="_metricHeader_9uhoo_189",je="_metricIcon_9uhoo_200",Ce="_metricTitle_9uhoo_204",we="_metricValue_9uhoo_208",Ne="_metricSubtitle_9uhoo_215",ye="_guideCard_9uhoo_225",Se="_guideTitle_9uhoo_232",Te="_checklist_9uhoo_239",be="_feedEmpty_9uhoo_263",Ie="_feedList_9uhoo_270",ke="_feedItem_9uhoo_278",De="_feedTime_9uhoo_291",Me="_feedIcon_9uhoo_298",Pe="_feedSummary_9uhoo_304",Ee="_feedItemClickable_9uhoo_314",Be="_feedChevron_9uhoo_322",He="_feedDetail_9uhoo_331",Re="_feedDetailPre_9uhoo_340",Le="_feedDetailText_9uhoo_349",$e="_changelogSummary_9uhoo_356",Ge="_changeTag_9uhoo_365",Fe="_tierBar_9uhoo_377",Ue="_tierBarTrack_9uhoo_383",Ve="_tierBarFillBasic_9uhoo_391",Ae="_tierBarFillPro_9uhoo_396",ze="_tierLabels_9uhoo_401",s={page:W,card:Y,cardHeader:Z,disconnectCard:ee,disconnectIcon:te,disconnectTitle:se,disconnectMessage:ne,reconnectGuide:ie,guideStep:re,stepNumber:ce,reconnectIndicator:ae,reconnectDot:oe,pulse:le,disconnectActions:de,btn:ue,btnSecondary:me,metricRow:he,metricGrid:ve,metricCard:_e,metric_ok:ge,metric_warn:pe,metric_error:fe,metricHeader:xe,metricIcon:je,metricTitle:Ce,metricValue:we,metricSubtitle:Ne,guideCard:ye,guideTitle:Se,checklist:Te,feedEmpty:be,feedList:Ie,feedItem:ke,feedTime:De,feedIcon:Me,feedSummary:Pe,feedItemClickable:Ee,feedChevron:Be,feedDetail:He,feedDetailPre:Re,feedDetailText:Le,changelogSummary:$e,changeTag:Ge,tierBar:Fe,tierBarTrack:Ue,tierBarFillBasic:Ve,tierBarFillPro:Ae,tierLabels:ze};function N({title:e,value:c,icon:i,subtitle:r,status:a,children:n}){const d=a?s[`metric_${a}`]:"";return t.jsxs("div",{className:`${s.metricCard} ${d}`,children:[t.jsxs("div",{className:s.metricHeader,children:[i&&t.jsx("span",{className:s.metricIcon,children:i}),t.jsx("span",{className:s.metricTitle,children:e})]}),t.jsx("div",{className:s.metricValue,children:c}),r&&t.jsx("div",{className:s.metricSubtitle,children:r}),n]})}function E({changes:e}){const{t:c}=L(),[i,r]=_.useState(null);return e.length===0?t.jsx("div",{className:s.feedEmpty,children:c("overview.feed.empty")}):t.jsx("div",{className:s.feedList,children:e.map((a,n)=>{const d=i===n,l=a.raw,g=l&&(l.before!=null||l.after!=null||l.details!=null);return t.jsxs("div",{children:[t.jsxs("div",{className:`${s.feedItem} ${g?s.feedItemClickable:""}`,onClick:()=>g&&r(d?null:n),children:[t.jsx("span",{className:s.feedTime,children:a.timestamp}),t.jsx("span",{className:s.feedIcon,children:a.icon}),t.jsx("span",{className:s.feedSummary,children:a.summary}),g&&t.jsx("span",{className:s.feedChevron,children:d?"▴":"▾"})]}),d&&l&&t.jsx("div",{className:s.feedDetail,children:t.jsx(Oe,{change:l})})]},n)})})}function Oe({change:e}){return e.category==="script"&&(e.before||e.after)?t.jsx(z,{before:e.before,after:e.after}):e.category==="property"?t.jsx(O,{before:e.before,after:e.after}):e.details?t.jsx("pre",{className:s.feedDetailPre,children:JSON.stringify(e.details,null,2)}):t.jsx("div",{className:s.feedDetailText,children:e.target})}const B=20;function $(e){return`${String(e.getHours()).padStart(2,"0")}:${String(e.getMinutes()).padStart(2,"0")}`}function H(){return $(new Date)}function R(e){switch(e){case"script":return"📝";case"instance":return"🧱";case"property":return"🎨";case"lighting":return"💡";case"terrain":return"⛰️";case"asset":return"📦";default:return"🔧"}}function Je(){const{level:e,status:c}=G(),i=J(),[r,a]=_.useState(null),[n,d]=_.useState(null),[l,g]=_.useState(null),[x,h]=_.useState([]),y=_.useRef(null),S=_.useCallback(async()=>{try{const o=await D.get("/connection-info");a(o)}catch{a(null)}},[]),T=_.useCallback(async()=>{try{const o=await D.get("/api/dashboard/changelog/active");if(g(o),o.recentChanges&&o.recentChanges.length>0){const p=o.recentChanges.map(v=>({timestamp:v.timestamp?$(new Date(v.timestamp)):H(),icon:R(v.category),summary:v.summary,category:v.category,raw:v}));h(p)}}catch{g(null)}},[]),f=_.useCallback(async()=>{try{const o=await D.get("/sync/status");d(o)}catch{d(null)}},[]);return _.useEffect(()=>{e!=="L0"?(S(),T(),f()):(a(null),d(null),g(null));const o=new F;y.current=o,o.connect();const p=o.on("game_change",j=>{const u=j,C={timestamp:H(),icon:R(u.category),summary:u.summary,category:u.category};h(k=>{const w=[C,...k];return w.length>B?w.slice(0,B):w}),T()}),v=o.on("sync",j=>{const u=j;d(C=>({...C,state:u.status,...u.placeId?{placeId:u.placeId}:{}}))});return()=>{p(),v(),o.disconnect(),y.current=null}},[e,S,T,f]),{level:e,status:c,connectionInfo:r,syncStatus:n,changeSummary:l,recentChanges:x,tier:i}}function M(e){return e.scriptsModified+e.scriptsCreated+e.instancesCreated+e.instancesDeleted+e.instancesMoved+e.propertiesChanged+e.assetsInserted+(e.lightingChanged?1:0)+(e.terrainChanged?1:0)}function Xe(e,c){switch(e){case"syncing":return c("status.syncing","Syncing");case"initializing":return c("status.initializing","Initializing");case"error":return c("status.error","Error");default:return c("status.idle","Idle")}}function qe(e){switch(e){case"syncing":return"ok";case"initializing":return"warn";case"error":return"error";default:return"ok"}}function I(e,c,i,r){return t.jsxs("div",{className:e.metricSubtitle,children:[t.jsx(V,{label:c,tooltip:i}),": ",r]},c)}function m(e,c){return t.jsx(U,{text:c,children:e})}function st(){var w,P;const{t:e}=L(),{level:c,status:i,connectionInfo:r,syncStatus:a,changeSummary:n,recentChanges:d,tier:l}=Je(),g=q(i==null?void 0:i.uptime);if(c==="L0")return t.jsx("div",{className:s.page,children:t.jsxs("div",{className:s.disconnectCard,children:[t.jsx("div",{className:s.disconnectIcon,children:"⚠️"}),t.jsx("h2",{className:s.disconnectTitle,children:e("overview.l0.title")}),t.jsx("p",{className:s.disconnectMessage,children:e("overview.l0.message")}),t.jsxs("div",{className:s.reconnectGuide,children:[t.jsxs("div",{className:s.guideStep,children:[t.jsx("span",{className:s.stepNumber,children:"1"}),t.jsx("span",{children:e("overview.l0.step1")})]}),t.jsxs("div",{className:s.guideStep,children:[t.jsx("span",{className:s.stepNumber,children:"2"}),t.jsx("span",{children:e("overview.l0.step2")})]})]}),t.jsxs("div",{className:s.reconnectIndicator,children:[t.jsx("span",{className:s.reconnectDot}),e("overview.l0.reconnecting")]}),t.jsxs("div",{className:s.disconnectActions,children:[t.jsx("button",{className:s.btn,onClick:()=>window.location.reload(),children:e("overview.l0.reconnectBtn")}),t.jsx("button",{className:s.btnSecondary,onClick:()=>{window.location.hash="#/settings"},children:e("overview.l0.settingsBtn")})]})]})});const x=(r==null?void 0:r.mcpInstanceCount)??0,h=((w=r==null?void 0:r.mcpInstances)==null?void 0:w.find(b=>!b.isServer&&b.aiClientName))??((P=r==null?void 0:r.mcpInstances)==null?void 0:P.find(b=>!!b.aiClientName))??null,y=(i==null?void 0:i.pluginClients)??[],S=y.length>0,T=(i==null?void 0:i.sessionId)??(r==null?void 0:r.sessionId)??"-",f=e("overview.metric.server.tooltip","MCP server runtime and process status"),o=e("overview.metric.plugin.tooltip","Roblox Studio plugin connection and version status"),p=e("overview.metric.agent.tooltip","Connected AI coding agents and their runtime state"),v=e("overview.metric.sync.tooltip","Current Studio to local sync activity"),j=i?[I(s,e("overview.meta.version","Version"),e("overview.meta.version.tooltip","Installed MCP server version"),`v${i.version}`),I(s,e("overview.meta.session","Session"),e("overview.meta.session.tooltip","Current MCP session identifier"),T),I(s,e("overview.meta.pid","PID"),e("overview.meta.pid.tooltip","Operating system process identifier"),String(i.pid??"-")),I(s,e("overview.meta.uptime","Uptime"),e("overview.meta.uptime.tooltip","Time elapsed since the MCP server started"),K(g??i.uptime))]:[];if(c==="L1")return t.jsxs("div",{className:s.page,children:[t.jsxs("div",{className:s.metricRow,children:[t.jsx(N,{title:m(e("overview.metric.server"),f),value:m(e("status.online"),f),icon:"🖥️",status:"ok",children:t.jsxs(t.Fragment,{children:[j,t.jsx(A,{status:"online"})]})}),t.jsx(N,{title:m(e("overview.metric.agent"),p),value:m((h==null?void 0:h.aiClientName)??e("overview.metric.noAgent"),p),icon:"🤖",subtitle:x>1?`${x} ${e("overview.metric.agent.instancesUnit","instances")}`:void 0,status:h?"ok":"warn"})]}),t.jsxs("div",{className:s.guideCard,children:[t.jsx("h3",{className:s.guideTitle,children:e("overview.l1.pluginGuide")}),t.jsxs("ul",{className:s.checklist,children:[t.jsx("li",{children:e("overview.l1.check1")}),t.jsx("li",{children:e("overview.l1.check2")}),t.jsx("li",{children:e("overview.l1.check3")})]})]}),t.jsxs("div",{className:s.card,children:[t.jsx("div",{className:s.cardHeader,children:e("overview.feed.title")}),d.length>0?t.jsx(E,{changes:d}):t.jsx("div",{className:s.feedEmpty,children:e("overview.l1.feedHint")})]}),n&&M(n)>0&&t.jsxs("div",{className:s.card,children:[t.jsx("div",{className:s.cardHeader,children:e("overview.changelog.title")}),t.jsxs("div",{className:s.changelogSummary,children:[t.jsxs("span",{children:[e("overview.changelog.entries","Entries"),": ",M(n)]}),n.scriptsModified>0&&t.jsxs("span",{className:s.changeTag,children:["📝"," ",n.scriptsModified," ",e("overview.changelog.scripts")]}),n.instancesCreated>0&&t.jsxs("span",{className:s.changeTag,children:["🧱"," ",n.instancesCreated," ",e("overview.changelog.instances")]}),n.propertiesChanged>0&&t.jsxs("span",{className:s.changeTag,children:["🎨"," ",n.propertiesChanged," ",e("overview.changelog.properties")]}),n.assetsInserted>0&&t.jsxs("span",{className:s.changeTag,children:["📦"," ",n.assetsInserted," ",e("overview.changelog.assets")]})]})]})]});const u=y[0],C=n?M(n):0,k=!!n&&C>0;return t.jsxs("div",{className:s.page,children:[t.jsxs("div",{className:s.metricGrid,children:[t.jsx(N,{title:m(e("overview.metric.server"),f),value:m(e("status.online"),f),icon:"🖥️",status:"ok",children:t.jsx(t.Fragment,{children:j})}),t.jsx(N,{title:m(e("overview.metric.plugin"),o),value:m(e(S?"status.online":"status.offline"),o),icon:"🔌",subtitle:u?`${u.placeName??u.projectName??"-"} / v${u.pluginVersion??"-"}`:void 0,status:S?"ok":"error"}),t.jsx(N,{title:m(e("overview.metric.agent"),p),value:m((h==null?void 0:h.aiClientName)??e("overview.metric.noAgent"),p),icon:"🤖",subtitle:x>1?`${x} ${e("overview.metric.agent.instancesUnit","instances")}`:void 0,status:h?"ok":"warn"}),t.jsx(N,{title:m(e("overview.metric.sync"),v),value:m(Xe(a==null?void 0:a.state,e),v),icon:"🔄",status:qe(a==null?void 0:a.state)})]}),t.jsxs("div",{className:s.card,children:[t.jsx("div",{className:s.cardHeader,children:e("overview.feed.title")}),t.jsx(E,{changes:d})]}),k&&t.jsxs("div",{className:s.card,children:[t.jsx("div",{className:s.cardHeader,children:e("overview.changelog.title")}),t.jsxs("div",{className:s.changelogSummary,children:[t.jsxs("span",{children:[e("overview.changelog.entries","Entries"),": ",C]}),n.scriptsModified>0&&t.jsxs("span",{className:s.changeTag,children:["📝"," ",n.scriptsModified," ",e("overview.changelog.scripts")]}),n.instancesCreated>0&&t.jsxs("span",{className:s.changeTag,children:["🧱"," ",n.instancesCreated," ",e("overview.changelog.instances")]}),n.propertiesChanged>0&&t.jsxs("span",{className:s.changeTag,children:["🎨"," ",n.propertiesChanged," ",e("overview.changelog.properties")]}),n.assetsInserted>0&&t.jsxs("span",{className:s.changeTag,children:["📦"," ",n.assetsInserted," ",e("overview.changelog.assets")]})]})]}),!l.loading&&l.tier==="basic"&&l.totalCalls>0&&t.jsxs("div",{className:s.card,children:[t.jsx("div",{className:s.cardHeader,children:e("overview.tier.title")}),t.jsx(Q,{basicCalls:l.basicCalls,proCalls:l.proCalls,totalCalls:l.totalCalls,proUsagePercent:l.proUsagePercent,upgradeHref:X.overview})]})]})}export{st as Component};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{r as o,b as _,u as N,j as e,T as c,a as w}from"./index-BYvG5KEz.js";import{u as v,T as L}from"./tier-promo-config-CckH43fU.js";import{T}from"./TierPromoPanel-DzFynur7.js";import{I as g}from"./InfoLabel-CszBT8rJ.js";const M=5e3;function k(){const[t,a]=o.useState({state:"NotRunning"}),[d,i]=o.useState([]),[r,p]=o.useState(null),[f,b]=o.useState(!0),y=o.useRef(null),n=o.useCallback(async()=>{try{const u=await _.get("/api/dashboard/playtest/status");a(u)}catch{}},[]),m=o.useCallback(async()=>{try{const u=await _.get("/api/dashboard/playtest/history");i(u.entries??[])}catch{i([])}},[]),l=o.useCallback(async()=>{await Promise.all([n(),m()]),b(!1)},[n,m]),j=o.useCallback(()=>{l()},[l]),S=o.useCallback(async u=>{try{const P=await _.get(`/api/dashboard/playtest/report/${u}`);p(P)}catch{p(null)}},[]),h=o.useCallback(async u=>{try{await _.post("/api/dashboard/playtest/control",{action:u}),setTimeout(n,500)}catch{}},[n]);return o.useEffect(()=>(l(),y.current=setInterval(l,M),()=>{y.current&&clearInterval(y.current)}),[l]),{status:t,history:d,selectedReport:r,loading:f,loadReport:S,control:h,refresh:j}}const H="_page_9936t_2",C="_card_9936t_10",D="_cardHeader_9936t_17",$="_statusRow_9936t_29",E="_statusIndicator_9936t_36",A="_statusRunning_9936t_44",z="_statusPaused_9936t_49",B="_statusNotRunning_9936t_53",U="_statusLabel_9936t_57",O="_statusMeta_9936t_64",V="_controlButtons_9936t_70",F="_btn_9936t_77",G="_btnPrimary_9936t_99",q="_btnDanger_9936t_109",J="_historyList_9936t_119",K="_historyItem_9936t_127",Q="_historyItemSelected_9936t_146",W="_historyItemHeader_9936t_151",X="_historyIcon_9936t_157",Y="_historyTimestamp_9936t_162",Z="_historyName_9936t_169",tt="_historyItemMeta_9936t_179",et="_historyMode_9936t_188",st="_historyDuration_9936t_192",at="_historyStatus_9936t_196",rt="_status_passed_9936t_203",nt="_status_failed_9936t_207",ot="_status_running_9936t_211",it="_historyError_9936t_215",lt="_reportContainer_9936t_226",ct="_reportSection_9936t_232",ut="_reportSectionHeader_9936t_238",dt="_reportMarkdown_9936t_250",pt="_reportLogs_9936t_263",yt="_emptyState_9936t_278",mt="_emptyStateTitle_9936t_285",ht="_emptyStateMessage_9936t_293",_t="_upgradePanel_9936t_302",gt="_upgradePanelIcon_9936t_310",xt="_upgradePanelTitle_9936t_315",ft="_upgradePanelDesc_9936t_323",bt="_benefitList_9936t_333",jt="_benefitItem_9936t_344",St="_upgradeActions_9936t_359",s={page:H,card:C,cardHeader:D,statusRow:$,statusIndicator:E,statusRunning:A,statusPaused:z,statusNotRunning:B,statusLabel:U,statusMeta:O,controlButtons:V,btn:F,btnPrimary:G,btnDanger:q,historyList:J,historyItem:K,historyItemSelected:Q,historyItemHeader:W,historyIcon:X,historyTimestamp:Y,historyName:Z,historyItemMeta:tt,historyMode:et,historyDuration:st,historyStatus:at,status_passed:rt,status_failed:nt,status_running:ot,historyError:it,reportContainer:lt,reportSection:ct,reportSectionHeader:ut,reportMarkdown:dt,reportLogs:pt,emptyState:yt,emptyStateTitle:mt,emptyStateMessage:ht,upgradePanel:_t,upgradePanelIcon:gt,upgradePanelTitle:xt,upgradePanelDesc:ft,benefitList:bt,benefitItem:jt,upgradeActions:St};function x(t){return t.trim().toLowerCase()}function Nt(t){switch(x(t)){case"passed":return"✅";case"failed":return"❌";case"running":return"⏱";default:return"❓"}}function Rt(t,a){switch(x(a)){case"run":return t("playtest.status.mode.run","Run");case"server":return t("playtest.status.mode.server","Server");case"edit":return t("playtest.status.mode.edit","Edit");case"play":return t("playtest.status.mode.play","Play");default:return a}}function It(t,a){switch(x(a)){case"passed":return t("playtest.history.status.passed","Passed");case"failed":return t("playtest.history.status.failed","Failed");case"running":return t("playtest.history.status.running","Running");default:return t("playtest.history.status.unknown","Unknown")}}function Pt(t){return t<1e3?`${t}ms`:`${(t/1e3).toFixed(1)}s`}function wt({entries:t,onSelect:a,selectedTimestamp:d}){const{t:i}=N();return t.length===0?e.jsx("div",{className:s.emptyState,children:i("playtest.history.empty","No test results yet")}):e.jsx("div",{className:s.historyList,children:t.map(r=>{const p=r.timestamp===d;return e.jsxs("button",{className:`${s.historyItem} ${p?s.historyItemSelected:""}`,onClick:()=>a(r.timestamp),children:[e.jsxs("div",{className:s.historyItemHeader,children:[e.jsx("span",{className:s.historyIcon,children:Nt(r.status)}),e.jsx("span",{className:s.historyTimestamp,children:r.timestamp}),e.jsx("span",{className:s.historyName,children:r.testName})]}),e.jsxs("div",{className:s.historyItemMeta,children:[e.jsx(c,{text:i("playtest.history.mode.tooltip","Playtest mode used for this recorded test run."),children:e.jsxs("span",{className:s.historyMode,children:[i("playtest.history.mode","Mode"),": ",Rt(i,r.mode)]})}),e.jsx("span",{className:s.historyDuration,children:Pt(r.durationMs)}),e.jsx(c,{text:i("playtest.history.status.tooltip","Recorded result state for this automated playtest run."),children:e.jsx("span",{className:`${s.historyStatus} ${s[`status_${x(r.status)}`]??""}`,children:It(i,r.status)})})]}),r.errorMessage&&e.jsx("div",{className:s.historyError,children:r.errorMessage})]},r.timestamp)})})}function vt({report:t}){const{t:a}=N();return e.jsxs("div",{className:s.reportContainer,children:[t.markdown&&e.jsxs("div",{className:s.reportSection,children:[e.jsx("div",{className:s.reportSectionHeader,children:e.jsx(c,{text:a("playtest.report.content.tooltip","Markdown summary for the selected automated playtest run."),children:e.jsx("span",{children:a("playtest.report.content","Report")})})}),e.jsx("pre",{className:s.reportMarkdown,children:t.markdown})]}),t.logs&&e.jsxs("div",{className:s.reportSection,children:[e.jsx("div",{className:s.reportSectionHeader,children:e.jsx(c,{text:a("playtest.report.logs.tooltip","Execution logs captured for the selected automated playtest run."),children:e.jsx("span",{children:a("playtest.report.logs","Logs")})})}),e.jsx("pre",{className:s.reportLogs,children:t.logs})]}),!t.markdown&&!t.logs&&e.jsx("div",{className:s.emptyState,children:a("playtest.report.empty","No report content available")})]})}function I(t){return(t==null?void 0:t.trim().toLowerCase())??""}function R(t){switch(I(t).replace(/[\s_-]+/g,"")){case"running":return"running";case"paused":return"paused";case"notrunning":return"not-running";default:return"not-running"}}function Lt(t){switch(R(t)){case"paused":return s.statusPaused;case"running":return s.statusRunning;default:return s.statusNotRunning}}function Tt(t,a){switch(R(a)){case"paused":return t("playtest.status.state.paused","Paused");case"running":return t("playtest.status.state.running","Running");default:return t("playtest.status.state.notRunning","Not Running")}}function Mt(t,a){switch(R(a)){case"paused":return t("playtest.status.state.paused.tooltip","The current Roblox playtest session is paused.");case"running":return t("playtest.status.state.running.tooltip","A Roblox playtest session is currently running.");default:return t("playtest.status.state.notRunning.tooltip","No Roblox playtest session is currently running.")}}function kt(t,a){switch(I(a)){case"run":return t("playtest.status.mode.run","Run");case"server":return t("playtest.status.mode.server","Server");case"edit":return t("playtest.status.mode.edit","Edit");case"play":return t("playtest.status.mode.play","Play");default:return a}}function Et(){const{t}=N(),{level:a}=w(),{tier:d,loading:i}=v(),r=k(),[p,f]=o.useState(null),b=!i&&d==="basic",y=a==="L0"||a==="L1";if(b)return e.jsx("div",{className:s.page,children:e.jsx(T,{icon:t("playtest.basic.icon","🎮"),title:t("playtest.basic.title","Playtest is a Pro-only feature"),description:t("playtest.basic.desc","Control playtesting from the dashboard, run automated tests, and view detailed test reports."),benefits:[t("playtest.basic.benefit1","One-click play/pause/stop controls"),t("playtest.basic.benefit2","Automated test execution via AI agent"),t("playtest.basic.benefit3","Test history with pass/fail tracking"),t("playtest.basic.benefit4","Detailed markdown test reports")],upgradeLabel:t("tier.upgrade","Upgrade to Pro"),upgradeHref:L.playtest})});const{status:n,history:m,selectedReport:l,loading:j}=r,S=h=>{f(h),r.loadReport(h)};return e.jsxs("div",{className:s.page,children:[!y&&e.jsxs("div",{className:s.card,children:[e.jsx("div",{className:s.cardHeader,children:e.jsx(g,{label:t("playtest.status.title","Playtest Status"),tooltip:t("playtest.status.title.tooltip","Current Roblox playtest session state reported by Studio.")})}),e.jsxs("div",{className:s.statusRow,children:[e.jsx("span",{className:`${s.statusIndicator} ${Lt(n.state)}`}),e.jsx(c,{text:Mt(t,n.state),children:e.jsx("span",{className:s.statusLabel,children:Tt(t,n.state)})}),n.mode&&e.jsxs("span",{className:s.statusMeta,children:[e.jsx(g,{label:`${t("playtest.status.mode","Mode")}:`,tooltip:t("playtest.status.mode.tooltip","Studio playtest launch mode for the current session.")})," ",e.jsx(c,{text:t("playtest.status.mode.value.tooltip","Specific Roblox Studio playtest mode currently in use."),children:e.jsx("span",{children:kt(t,n.mode)})})]}),n.placeName&&e.jsx(c,{text:t("playtest.status.place.tooltip","Roblox place currently associated with this playtest session."),children:e.jsxs("span",{className:s.statusMeta,children:[n.placeName,n.placeId?` (${n.placeId})`:""]})})]})]}),e.jsxs("div",{className:s.card,children:[e.jsx("div",{className:s.cardHeader,children:e.jsx(g,{label:t("playtest.history.title","Test History"),tooltip:t("playtest.history.title.tooltip","Recorded automated playtest runs for this project.")})}),j?e.jsx("div",{className:s.emptyState,children:t("common.loading","Loading...")}):m.length===0?e.jsxs("div",{className:s.emptyState,children:[e.jsx("div",{className:s.emptyStateTitle,children:t("playtest.empty.title","No playtest results yet")}),e.jsxs("div",{className:s.emptyStateMessage,children:[t("playtest.empty.message.before","Test results will appear here when the AI agent runs automated tests via")," ",e.jsx(c,{text:t("playtest.empty.runTest.tooltip","Dashboard automation entry point that runs Roblox playtest checks through the system_info tool."),children:e.jsx("span",{children:"system_info.run_test"})}),t("playtest.empty.message.after",".")]})]}):e.jsx(wt,{entries:m,onSelect:S,selectedTimestamp:p??void 0})]}),l&&e.jsxs("div",{className:s.card,children:[e.jsx("div",{className:s.cardHeader,children:e.jsx(g,{label:t("playtest.report.title","Selected Report"),tooltip:t("playtest.report.title.tooltip","Detailed output for the currently selected automated playtest run.")})}),e.jsx(vt,{report:l})]})]})}export{Et as Component};
|