@weppy/roblox-mcp 1.5.5 → 2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +2 -2
- package/CHANGELOG.md +35 -0
- package/README.md +12 -1
- 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/es/README.md +12 -1
- 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/id/README.md +12 -1
- 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/ja/README.md +12 -1
- 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/ko/README.md +12 -1
- 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/pt-br/README.md +12 -1
- 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/package.json +1 -7
- package/plugins/weppy-roblox-mcp/.claude-plugin/plugin.json +1 -1
- package/plugins/weppy-roblox-mcp/dashboard/dist/assets/ChangelogDetailPage-C2oKsYGC.css +1 -0
- package/plugins/weppy-roblox-mcp/dashboard/dist/assets/ChangelogDetailPage-Ss9rBuou.js +1 -0
- package/plugins/weppy-roblox-mcp/dashboard/dist/assets/ChangelogPage-ByQDwNhh.css +1 -0
- package/plugins/weppy-roblox-mcp/dashboard/dist/assets/ChangelogPage-D_OScUeF.js +1 -0
- package/plugins/weppy-roblox-mcp/dashboard/dist/assets/ConnectionPage-C3QU6eRJ.js +1 -0
- package/plugins/weppy-roblox-mcp/dashboard/dist/assets/ConnectionPage-CkQVyTc5.css +1 -0
- package/plugins/weppy-roblox-mcp/dashboard/dist/assets/InfoLabel-Cvotfyns.js +1 -0
- package/plugins/weppy-roblox-mcp/dashboard/dist/assets/OverviewPage-BcSHb-KS.js +1 -0
- package/plugins/weppy-roblox-mcp/dashboard/dist/assets/OverviewPage-CS05LsEh.css +1 -0
- package/plugins/weppy-roblox-mcp/dashboard/dist/assets/PlaytestPage-CqIxk3qY.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-BGBA0lal.js +6 -0
- package/plugins/weppy-roblox-mcp/dashboard/dist/assets/PropertyDiff-Cbx8P1zh.css +1 -0
- package/plugins/weppy-roblox-mcp/dashboard/dist/assets/SettingsPage-D-SyrBho.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-C_KxiYEt.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-DeQjKxmi.js +4 -0
- package/plugins/weppy-roblox-mcp/dashboard/dist/assets/TierPromoPanel-B2hY_Iul.js +1 -0
- package/plugins/weppy-roblox-mcp/dashboard/dist/assets/TierPromoProgress-B9L7tJGd.js +1 -0
- package/plugins/weppy-roblox-mcp/dashboard/dist/assets/ToolsPage-CzFt06tW.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-mMUjBHCe.js +69 -0
- package/plugins/weppy-roblox-mcp/dashboard/dist/assets/tier-promo-config-BFJCz95t.js +1 -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/useLiveUptime-Gqoo4lJE.js +1 -0
- package/plugins/weppy-roblox-mcp/dashboard/dist/index.html +14 -0
- package/plugins/weppy-roblox-mcp/dist/index.js +66 -54
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
> Registra todas as alteracoes realizadas pela IA no Roblox Studio por sessao, fornecendo resumo de alteracoes/timeline/Before & After.
|
|
4
|
+
|
|
5
|
+

|
|
6
|
+
|
|
7
|
+
## Visao geral
|
|
8
|
+
|
|
9
|
+
O Changelog e a pagina que rastreia o historico de alteracoes do jogo realizadas pelo agente de IA no Studio. As alteracoes sao agrupadas por sessao, permitindo visualizar rapidamente quantas alteracoes de cada tipo ocorreram em cada sessao.
|
|
10
|
+
|
|
11
|
+
## Lista de cards de sessao
|
|
12
|
+
|
|
13
|
+
A tela inicial do Changelog exibe uma lista de cards por sessao.
|
|
14
|
+
|
|
15
|
+
### Status da sessao
|
|
16
|
+
|
|
17
|
+
Cada card de sessao exibe um status:
|
|
18
|
+
|
|
19
|
+
| Status | Significado |
|
|
20
|
+
|--------|-------------|
|
|
21
|
+
| **Active** | Sessao em andamento (atualizacao em tempo real) |
|
|
22
|
+
| **Completed** | Sessao concluida |
|
|
23
|
+
| **Bootstrap** | Sessao de sincronizacao inicial |
|
|
24
|
+
|
|
25
|
+
### Resumo da sessao
|
|
26
|
+
|
|
27
|
+
Cada card exibe um resumo da quantidade de alteracoes por categoria na respectiva sessao:
|
|
28
|
+
|
|
29
|
+
- Script — quantidade de scripts criados/modificados
|
|
30
|
+
- Instance — quantidade de instancias criadas/excluidas/movidas
|
|
31
|
+
- Property — quantidade de propriedades alteradas
|
|
32
|
+
- Lighting — quantidade de alteracoes de iluminacao/ambiente
|
|
33
|
+
- Terrain — quantidade de alteracoes de terreno
|
|
34
|
+
- Asset — quantidade de assets inseridos
|
|
35
|
+
|
|
36
|
+
### Abas de filtro
|
|
37
|
+
|
|
38
|
+
Voce pode filtrar as sessoes pelas abas superiores:
|
|
39
|
+
- **All** — Todas as sessoes
|
|
40
|
+
- **Active** — Apenas sessoes em andamento
|
|
41
|
+
- **Completed** — Apenas sessoes concluidas
|
|
42
|
+
|
|
43
|
+
## Visualizacao detalhada da sessao
|
|
44
|
+
|
|
45
|
+
Clique em um card de sessao para acessar a visualizacao detalhada.
|
|
46
|
+
|
|
47
|
+

|
|
48
|
+
|
|
49
|
+
### Change Summary
|
|
50
|
+
|
|
51
|
+
Visualiza as alteracoes da sessao em 6 cards de categoria:
|
|
52
|
+
|
|
53
|
+
| Categoria | Icone | Descricao |
|
|
54
|
+
|-----------|-------|-----------|
|
|
55
|
+
| Scripts | Script | Quantidade de scripts criados/modificados |
|
|
56
|
+
| Instances | Instancia | Quantidade de instancias criadas/excluidas/movidas |
|
|
57
|
+
| Properties | Propriedade | Quantidade de propriedades alteradas |
|
|
58
|
+
| Lighting | Iluminacao | Quantidade de alteracoes de iluminacao/ambiente |
|
|
59
|
+
| Terrain | Terreno | Quantidade de alteracoes de terreno |
|
|
60
|
+
| Assets | Asset | Quantidade de assets inseridos |
|
|
61
|
+
|
|
62
|
+
### Change Timeline
|
|
63
|
+
|
|
64
|
+
Lista todas as alteracoes da sessao em ordem cronologica.
|
|
65
|
+
|
|
66
|
+
- Cada item exibe timestamp, tag de categoria da alteracao e caminho do alvo
|
|
67
|
+
- O dropdown **Category** permite filtrar por uma categoria especifica
|
|
68
|
+
- Ao clicar em um item, a visualizacao comparativa Before & After e expandida
|
|
69
|
+
|
|
70
|
+
### Before & After
|
|
71
|
+
|
|
72
|
+
Compara os dados antes e depois da alteracao. Fornece diferentes niveis de informacao conforme o tipo de alteracao:
|
|
73
|
+
|
|
74
|
+
| Confiabilidade | Significado | Exemplo |
|
|
75
|
+
|----------------|-------------|---------|
|
|
76
|
+
| **exact** | Valores antes e depois registrados com precisao | Alteracao de propriedade, modificacao de script |
|
|
77
|
+
| **partial** | Apenas parte das informacoes registrada | Alteracoes compostas |
|
|
78
|
+
| **after-only** | Apenas o valor posterior existe | Criacao de nova instancia |
|
|
79
|
+
| **intent-only** | Apenas a intencao registrada | Exclusao, etc. |
|
|
80
|
+
|
|
81
|
+
## Casos de uso
|
|
82
|
+
|
|
83
|
+
### Verificacao de trabalho
|
|
84
|
+
|
|
85
|
+
```
|
|
86
|
+
"Quero verificar quais scripts a IA acabou de modificar"
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
Filtre a categoria Script da sessao Active no Changelog para comparar a lista de scripts modificados e o codigo antes e depois.
|
|
90
|
+
|
|
91
|
+
### Rastreamento de alteracoes
|
|
92
|
+
|
|
93
|
+
```
|
|
94
|
+
"Quero rever como o Lighting foi configurado na sessao de ontem"
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
Encontre a sessao na aba Completed e filtre pela categoria Lighting para verificar o historico de alteracoes e os valores configurados.
|
|
98
|
+
|
|
99
|
+
### Depuracao de problemas
|
|
100
|
+
|
|
101
|
+
```
|
|
102
|
+
"Preciso descobrir em que momento uma determinada instancia foi excluida"
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
Filtre a categoria Instance na timeline e rastreie as alteracoes do tipo delete em ordem cronologica.
|
|
106
|
+
|
|
107
|
+
## Documentos relacionados
|
|
108
|
+
|
|
109
|
+
- [Dashboard Overview](overview.md)
|
|
110
|
+
- [Connection](connection.md)
|
|
111
|
+
- [Sync](sync.md)
|
|
112
|
+
- [Playtest](playtest.md)
|
|
113
|
+
- [Tools](tools.md)
|
|
114
|
+
- [Settings](settings.md)
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
# Connection
|
|
2
|
+
|
|
3
|
+
> Monitore o status de conexao do servidor, agentes de IA e plugin em um so lugar.
|
|
4
|
+
|
|
5
|
+

|
|
6
|
+
|
|
7
|
+
## Visao geral
|
|
8
|
+
|
|
9
|
+
A pagina Connection monitora todos os status de conexao do sistema MCP em um unico local. Esta sempre acessivel quando o servidor esta conectado (L1 ou superior).
|
|
10
|
+
|
|
11
|
+
## Server Status
|
|
12
|
+
|
|
13
|
+
Exibe as informacoes essenciais do servidor:
|
|
14
|
+
|
|
15
|
+
| Item | Descricao |
|
|
16
|
+
|------|-----------|
|
|
17
|
+
| Status | Badge de status de conexao (Online/Offline) |
|
|
18
|
+
| Version | Versao do servidor MCP |
|
|
19
|
+
| PID | ID do processo do servidor |
|
|
20
|
+
| Uptime | Tempo de atividade do servidor |
|
|
21
|
+
| Session ID | Identificador da sessao atual |
|
|
22
|
+
| Exec Path | Caminho de execucao do servidor |
|
|
23
|
+
|
|
24
|
+
## AI Agents
|
|
25
|
+
|
|
26
|
+
Exibe em tabela a lista de agentes de IA conectados atualmente:
|
|
27
|
+
|
|
28
|
+
| Coluna | Descricao |
|
|
29
|
+
|--------|-----------|
|
|
30
|
+
| Name | Nome do agente (ex.: Claude Code) |
|
|
31
|
+
| PID | ID do processo do agente |
|
|
32
|
+
| Working Dir | Diretorio de trabalho do agente |
|
|
33
|
+
| Connected | Tempo decorrido desde a conexao |
|
|
34
|
+
|
|
35
|
+
Quando varios agentes estao conectados simultaneamente, todos sao exibidos.
|
|
36
|
+
|
|
37
|
+
## Plugins
|
|
38
|
+
|
|
39
|
+
Exibe a lista de plugins do Roblox Studio conectados:
|
|
40
|
+
|
|
41
|
+
| Coluna | Descricao |
|
|
42
|
+
|--------|-----------|
|
|
43
|
+
| Place | Nome do Place |
|
|
44
|
+
| Client ID | Identificador do cliente do plugin |
|
|
45
|
+
| Last Seen | Horario da ultima comunicacao |
|
|
46
|
+
| Version | Versao do plugin |
|
|
47
|
+
|
|
48
|
+
## Connection Log
|
|
49
|
+
|
|
50
|
+
Exibe eventos relacionados a conexao em tempo real. Eventos de conexao/desconexao de agentes/plugins sao adicionados automaticamente via SSE.
|
|
51
|
+
|
|
52
|
+
## Casos de uso
|
|
53
|
+
|
|
54
|
+
### Diagnostico de problemas de conexao
|
|
55
|
+
|
|
56
|
+
```
|
|
57
|
+
"Parece que a IA nao esta conseguindo se conectar ao Studio"
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
Verifique se o Server Status esta Online e se o plugin aparece na tabela Plugins. Voce pode rastrear eventos de conexao/desconexao no Connection Log.
|
|
61
|
+
|
|
62
|
+
### Verificacao de agentes
|
|
63
|
+
|
|
64
|
+
```
|
|
65
|
+
"Quero verificar qual IA esta conectada agora"
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
Confira o nome, PID e diretorio de trabalho do agente conectado na tabela AI Agents.
|
|
69
|
+
|
|
70
|
+
## Documentos relacionados
|
|
71
|
+
|
|
72
|
+
- [Dashboard Overview](overview.md)
|
|
73
|
+
- [Changelog](changelog.md)
|
|
74
|
+
- [Sync](sync.md)
|
|
75
|
+
- [Playtest](playtest.md)
|
|
76
|
+
- [Tools](tools.md)
|
|
77
|
+
- [Settings](settings.md)
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
# Dashboard
|
|
2
|
+
|
|
3
|
+
> Monitore e gerencie em tempo real o status, conexoes, sincronizacao, historico de execucao de ferramentas e historico de alteracoes do jogo do servidor MCP diretamente no navegador.
|
|
4
|
+
|
|
5
|
+

|
|
6
|
+
|
|
7
|
+
## O que e o Dashboard?
|
|
8
|
+
|
|
9
|
+
O Dashboard e uma interface de monitoramento baseada na web fornecida pelo servidor MCP. Ele abre automaticamente no navegador quando o servidor MCP e iniciado, permitindo acompanhar em tempo real todas as operacoes que o agente de IA realiza no Roblox Studio.
|
|
10
|
+
|
|
11
|
+
- Visualize o status de forma grafica sem precisar vasculhar logs do terminal
|
|
12
|
+
- Acompanhe o que a IA alterou no Studio atraves do historico de alteracoes
|
|
13
|
+
- Verifique status de sincronizacao, conexao e estatisticas de execucao de ferramentas em um so lugar
|
|
14
|
+
|
|
15
|
+
## Estrutura das paginas
|
|
16
|
+
|
|
17
|
+
| Pagina | Descricao | Guia detalhado |
|
|
18
|
+
|--------|-----------|----------------|
|
|
19
|
+
| [Overview](#overview) | Cards de status do servidor/plugin/agente/Sync, feed de alteracoes recentes | Este documento |
|
|
20
|
+
| [Changelog](changelog.md) | Historico de alteracoes do jogo — cards por sessao, resumo de alteracoes, timeline, Before & After | [Guia detalhado](changelog.md) |
|
|
21
|
+
| [Connection](connection.md) | Status do servidor, lista de agentes de IA, informacoes de conexao do plugin | [Guia detalhado](connection.md) |
|
|
22
|
+
| [Sync](sync.md) | Status de sincronizacao, configuracao de direcao, logs | [Guia detalhado](sync.md) |
|
|
23
|
+
| [Playtest](playtest.md) | Status do playtest, historico de testes | [Guia detalhado](playtest.md) |
|
|
24
|
+
| [Tools](tools.md) | Historico de execucao de ferramentas, estatisticas, distribuicao por tier | [Guia detalhado](tools.md) |
|
|
25
|
+
| [Settings](settings.md) | Licenca, nivel de log, configuracoes de Sync, idioma | [Guia detalhado](settings.md) |
|
|
26
|
+
|
|
27
|
+
## Como acessar
|
|
28
|
+
|
|
29
|
+
Quando o servidor MCP e iniciado, o Dashboard abre automaticamente no navegador. Para acessar manualmente:
|
|
30
|
+
|
|
31
|
+
```
|
|
32
|
+
http://localhost:3002
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
> Defina `DASHBOARD_AUTO_OPEN=false` para desativar a abertura automatica (consulte a pagina [Settings](settings.md)).
|
|
36
|
+
|
|
37
|
+
## Niveis de conexao
|
|
38
|
+
|
|
39
|
+
O Dashboard oferece funcionalidades diferentes de acordo com o status da conexao:
|
|
40
|
+
|
|
41
|
+
| Nivel | Condicao | Paginas disponiveis |
|
|
42
|
+
|:-----:|----------|---------------------|
|
|
43
|
+
| **L0** | Servidor desconectado | Exibe apenas a tela de aguardando reconexao |
|
|
44
|
+
| **L1** | Servidor conectado, plugin desconectado | Connection, Tools, Settings |
|
|
45
|
+
| **L2** | Servidor + plugin ambos conectados | Todas as paginas |
|
|
46
|
+
|
|
47
|
+
Quando o plugin nao esta conectado (L1), as paginas Overview, Changelog, Sync e Playtest nao ficam acessiveis.
|
|
48
|
+
|
|
49
|
+
## Overview
|
|
50
|
+
|
|
51
|
+
A pagina Overview e a tela inicial do Dashboard e mostra o status geral do sistema em uma unica visualizacao.
|
|
52
|
+
|
|
53
|
+
### Cards de status
|
|
54
|
+
|
|
55
|
+
| Card | Informacao exibida |
|
|
56
|
+
|------|--------------------|
|
|
57
|
+
| **Server** | Status de conexao do servidor (Online/Offline) |
|
|
58
|
+
| **Plugin** | Status de conexao do plugin, informacoes do Place |
|
|
59
|
+
| **Agent** | Nome do agente de IA conectado atualmente |
|
|
60
|
+
| **Sync** | Status de sincronizacao (Idle/Syncing/Error) |
|
|
61
|
+
|
|
62
|
+
### Alteracoes recentes do jogo (Recent Game Changes)
|
|
63
|
+
|
|
64
|
+
Exibe em tempo real as alteracoes recentes realizadas pela IA no Studio (maximo 20). Cada item e exibido com um icone de categoria de alteracao e, ao clicar, voce e direcionado para a visualizacao detalhada no [Changelog](changelog.md).
|
|
65
|
+
|
|
66
|
+
Icones de categoria:
|
|
67
|
+
- Script — criacao/modificacao de scripts
|
|
68
|
+
- Instance — criacao/exclusao/movimentacao de instancias
|
|
69
|
+
- Property — alteracao de propriedades
|
|
70
|
+
- Lighting — configuracoes de iluminacao/ambiente
|
|
71
|
+
- Terrain — alteracoes de terreno
|
|
72
|
+
- Asset — insercao de assets
|
|
73
|
+
|
|
74
|
+
### Resumo de alteracoes da sessao (Session Change Summary)
|
|
75
|
+
|
|
76
|
+
Mostra as estatisticas de alteracoes da sessao atual agregadas por categoria (ex.: "4 scripts · 3 properties").
|
|
77
|
+
|
|
78
|
+
## Atualizacoes em tempo real
|
|
79
|
+
|
|
80
|
+
O Dashboard utiliza SSE (Server-Sent Events) para atualizar dados em tempo real:
|
|
81
|
+
|
|
82
|
+
- Status do servidor: polling a cada 5 segundos
|
|
83
|
+
- Feed de alteracoes, eventos de conexao: streaming em tempo real via SSE
|
|
84
|
+
- Desconexao do SSE: reconexao automatica apos 3 segundos
|
|
85
|
+
|
|
86
|
+
## Documentos relacionados
|
|
87
|
+
|
|
88
|
+
- [Changelog](changelog.md) — Rastreamento do historico de alteracoes do jogo
|
|
89
|
+
- [Connection](connection.md) — Status de conexao do servidor/agente/plugin
|
|
90
|
+
- [Sync](sync.md) — Monitoramento do status de sincronizacao
|
|
91
|
+
- [Playtest](playtest.md) — Historico de playtest
|
|
92
|
+
- [Tools](tools.md) — Historico/estatisticas de execucao de ferramentas
|
|
93
|
+
- [Settings](settings.md) — Licenca, configuracoes do servidor, idioma
|
|
94
|
+
- [Lista completa de Tools](../tools/overview.md)
|
|
95
|
+
- [Guia detalhado de Sync](../sync/overview.md)
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# Playtest
|
|
2
|
+
|
|
3
|
+
> Verifique o status e os resultados dos playtests executados pela IA.
|
|
4
|
+
|
|
5
|
+

|
|
6
|
+
|
|
7
|
+
## Visao geral
|
|
8
|
+
|
|
9
|
+
A pagina Playtest exibe o status e os resultados dos playtests executados pela IA. So fica acessivel quando o plugin esta conectado (L2).
|
|
10
|
+
|
|
11
|
+
## Playtest Status
|
|
12
|
+
|
|
13
|
+
Exibe o status atual do playtest:
|
|
14
|
+
|
|
15
|
+
| Status | Significado |
|
|
16
|
+
|--------|-------------|
|
|
17
|
+
| **NotRunning** | Playtest nao iniciado |
|
|
18
|
+
| **Running** | Playtest em execucao |
|
|
19
|
+
| **Paused** | Playtest pausado (modo Run) |
|
|
20
|
+
|
|
21
|
+
## Test History
|
|
22
|
+
|
|
23
|
+
Lista em ordem cronologica os resultados dos testes executados pela IA com a acao `run_test`:
|
|
24
|
+
|
|
25
|
+
| Item | Descricao |
|
|
26
|
+
|------|-----------|
|
|
27
|
+
| Timestamp | Horario de execucao do teste |
|
|
28
|
+
| Test Report | Link para o relatorio do teste |
|
|
29
|
+
| Mode | Modo de execucao (play/run) |
|
|
30
|
+
| Duration | Duracao do teste |
|
|
31
|
+
| Status | Resultado (Passed/Failed) |
|
|
32
|
+
|
|
33
|
+
Ao clicar no relatorio de teste, voce pode visualizar o relatorio detalhado em formato markdown e os logs.
|
|
34
|
+
|
|
35
|
+
## Casos de uso
|
|
36
|
+
|
|
37
|
+
### Analise de falha em testes
|
|
38
|
+
|
|
39
|
+
```
|
|
40
|
+
"Quero encontrar a causa da falha no teste automatizado que acabei de executar"
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
Encontre o teste com status Failed no Test History e clique em Test Report para verificar os logs detalhados e a causa da falha.
|
|
44
|
+
|
|
45
|
+
### Verificacao do historico de testes
|
|
46
|
+
|
|
47
|
+
```
|
|
48
|
+
"Quero ver o panorama de sucesso/falha dos testes executados hoje"
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
Verifique o timestamp e o Status no Test History para acompanhar a tendencia dos resultados dos testes.
|
|
52
|
+
|
|
53
|
+
## Documentos relacionados
|
|
54
|
+
|
|
55
|
+
- [Dashboard Overview](overview.md)
|
|
56
|
+
- [Changelog](changelog.md)
|
|
57
|
+
- [Connection](connection.md)
|
|
58
|
+
- [Sync](sync.md)
|
|
59
|
+
- [Tools](tools.md)
|
|
60
|
+
- [Settings](settings.md)
|
|
61
|
+
- [Playtest e testes automatizados (ferramentas)](../tools/playtest.md)
|
|
@@ -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)
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@weppy/roblox-mcp",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "2.0.1",
|
|
4
4
|
"description": "MCP (Model Context Protocol) server for Roblox Studio integration - enables AI coding agents to interact with Roblox Studio in real-time",
|
|
5
5
|
"main": "plugins/weppy-roblox-mcp/dist/index.js",
|
|
6
6
|
"type": "module",
|
|
@@ -28,12 +28,6 @@
|
|
|
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
|
},
|
|
@@ -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
|
+
import{r,b as j,u as L,d as O,c as A,j as t,T as p}from"./index-mMUjBHCe.js";import{I as $}from"./InfoLabel-Cvotfyns.js";import{D,P as F}from"./PropertyDiff-BGBA0lal.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
|
+
._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-mMUjBHCe.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};
|