@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.
Files changed (89) hide show
  1. package/.claude-plugin/marketplace.json +2 -2
  2. package/CHANGELOG.md +35 -0
  3. package/README.md +12 -1
  4. package/docs/assets/screenshots/dashboard/dashboard_changelog1.png +3 -0
  5. package/docs/assets/screenshots/dashboard/dashboard_changelog2.png +3 -0
  6. package/docs/assets/screenshots/dashboard/dashboard_connection.png +3 -0
  7. package/docs/assets/screenshots/dashboard/dashboard_overview.png +3 -0
  8. package/docs/assets/screenshots/dashboard/dashboard_playtest.png +3 -0
  9. package/docs/assets/screenshots/dashboard/dashboard_sync.png +3 -0
  10. package/docs/assets/screenshots/dashboard/dashboard_tools.png +3 -0
  11. package/docs/en/dashboard/changelog.md +114 -0
  12. package/docs/en/dashboard/connection.md +77 -0
  13. package/docs/en/dashboard/overview.md +95 -0
  14. package/docs/en/dashboard/playtest.md +61 -0
  15. package/docs/en/dashboard/settings.md +67 -0
  16. package/docs/en/dashboard/sync.md +75 -0
  17. package/docs/en/dashboard/tools.md +69 -0
  18. package/docs/es/README.md +12 -1
  19. package/docs/es/dashboard/changelog.md +114 -0
  20. package/docs/es/dashboard/connection.md +77 -0
  21. package/docs/es/dashboard/overview.md +95 -0
  22. package/docs/es/dashboard/playtest.md +61 -0
  23. package/docs/es/dashboard/settings.md +67 -0
  24. package/docs/es/dashboard/sync.md +75 -0
  25. package/docs/es/dashboard/tools.md +69 -0
  26. package/docs/id/README.md +12 -1
  27. package/docs/id/dashboard/changelog.md +114 -0
  28. package/docs/id/dashboard/connection.md +77 -0
  29. package/docs/id/dashboard/overview.md +95 -0
  30. package/docs/id/dashboard/playtest.md +61 -0
  31. package/docs/id/dashboard/settings.md +67 -0
  32. package/docs/id/dashboard/sync.md +75 -0
  33. package/docs/id/dashboard/tools.md +69 -0
  34. package/docs/ja/README.md +12 -1
  35. package/docs/ja/dashboard/changelog.md +114 -0
  36. package/docs/ja/dashboard/connection.md +77 -0
  37. package/docs/ja/dashboard/overview.md +95 -0
  38. package/docs/ja/dashboard/playtest.md +61 -0
  39. package/docs/ja/dashboard/settings.md +67 -0
  40. package/docs/ja/dashboard/sync.md +75 -0
  41. package/docs/ja/dashboard/tools.md +69 -0
  42. package/docs/ko/README.md +12 -1
  43. package/docs/ko/dashboard/changelog.md +114 -0
  44. package/docs/ko/dashboard/connection.md +77 -0
  45. package/docs/ko/dashboard/overview.md +95 -0
  46. package/docs/ko/dashboard/playtest.md +61 -0
  47. package/docs/ko/dashboard/settings.md +67 -0
  48. package/docs/ko/dashboard/sync.md +75 -0
  49. package/docs/ko/dashboard/tools.md +69 -0
  50. package/docs/pt-br/README.md +12 -1
  51. package/docs/pt-br/dashboard/changelog.md +114 -0
  52. package/docs/pt-br/dashboard/connection.md +77 -0
  53. package/docs/pt-br/dashboard/overview.md +95 -0
  54. package/docs/pt-br/dashboard/playtest.md +61 -0
  55. package/docs/pt-br/dashboard/settings.md +67 -0
  56. package/docs/pt-br/dashboard/sync.md +75 -0
  57. package/docs/pt-br/dashboard/tools.md +69 -0
  58. package/package.json +1 -7
  59. package/plugins/weppy-roblox-mcp/.claude-plugin/plugin.json +1 -1
  60. package/plugins/weppy-roblox-mcp/dashboard/dist/assets/ChangelogDetailPage-C2oKsYGC.css +1 -0
  61. package/plugins/weppy-roblox-mcp/dashboard/dist/assets/ChangelogDetailPage-Ss9rBuou.js +1 -0
  62. package/plugins/weppy-roblox-mcp/dashboard/dist/assets/ChangelogPage-ByQDwNhh.css +1 -0
  63. package/plugins/weppy-roblox-mcp/dashboard/dist/assets/ChangelogPage-D_OScUeF.js +1 -0
  64. package/plugins/weppy-roblox-mcp/dashboard/dist/assets/ConnectionPage-C3QU6eRJ.js +1 -0
  65. package/plugins/weppy-roblox-mcp/dashboard/dist/assets/ConnectionPage-CkQVyTc5.css +1 -0
  66. package/plugins/weppy-roblox-mcp/dashboard/dist/assets/InfoLabel-Cvotfyns.js +1 -0
  67. package/plugins/weppy-roblox-mcp/dashboard/dist/assets/OverviewPage-BcSHb-KS.js +1 -0
  68. package/plugins/weppy-roblox-mcp/dashboard/dist/assets/OverviewPage-CS05LsEh.css +1 -0
  69. package/plugins/weppy-roblox-mcp/dashboard/dist/assets/PlaytestPage-CqIxk3qY.js +1 -0
  70. package/plugins/weppy-roblox-mcp/dashboard/dist/assets/PlaytestPage-emQ5xjZz.css +1 -0
  71. package/plugins/weppy-roblox-mcp/dashboard/dist/assets/PropertyDiff-BGBA0lal.js +6 -0
  72. package/plugins/weppy-roblox-mcp/dashboard/dist/assets/PropertyDiff-Cbx8P1zh.css +1 -0
  73. package/plugins/weppy-roblox-mcp/dashboard/dist/assets/SettingsPage-D-SyrBho.js +1 -0
  74. package/plugins/weppy-roblox-mcp/dashboard/dist/assets/SettingsPage-NF_CPSvZ.css +1 -0
  75. package/plugins/weppy-roblox-mcp/dashboard/dist/assets/StatusBadge-C2zYt5iE.css +1 -0
  76. package/plugins/weppy-roblox-mcp/dashboard/dist/assets/StatusBadge-C_KxiYEt.js +1 -0
  77. package/plugins/weppy-roblox-mcp/dashboard/dist/assets/SyncPage-BNHvpQxD.css +1 -0
  78. package/plugins/weppy-roblox-mcp/dashboard/dist/assets/SyncPage-DeQjKxmi.js +4 -0
  79. package/plugins/weppy-roblox-mcp/dashboard/dist/assets/TierPromoPanel-B2hY_Iul.js +1 -0
  80. package/plugins/weppy-roblox-mcp/dashboard/dist/assets/TierPromoProgress-B9L7tJGd.js +1 -0
  81. package/plugins/weppy-roblox-mcp/dashboard/dist/assets/ToolsPage-CzFt06tW.js +1 -0
  82. package/plugins/weppy-roblox-mcp/dashboard/dist/assets/ToolsPage-cVoMPYAn.css +1 -0
  83. package/plugins/weppy-roblox-mcp/dashboard/dist/assets/index-BOVxaPTw.css +1 -0
  84. package/plugins/weppy-roblox-mcp/dashboard/dist/assets/index-mMUjBHCe.js +69 -0
  85. package/plugins/weppy-roblox-mcp/dashboard/dist/assets/tier-promo-config-BFJCz95t.js +1 -0
  86. package/plugins/weppy-roblox-mcp/dashboard/dist/assets/tier-promo-config-CJ-J0n2q.css +1 -0
  87. package/plugins/weppy-roblox-mcp/dashboard/dist/assets/useLiveUptime-Gqoo4lJE.js +1 -0
  88. package/plugins/weppy-roblox-mcp/dashboard/dist/index.html +14 -0
  89. 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
+ ![Changelog — lista de cards de alteracoes por sessao](../../assets/screenshots/dashboard/dashboard_changelog1.png)
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
+ ![Visualizacao detalhada do Changelog — resumo de alteracoes, timeline, Before & After](../../assets/screenshots/dashboard/dashboard_changelog2.png)
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
+ ![Connection — status do servidor, agentes de IA, informacoes de conexao do plugin](../../assets/screenshots/dashboard/dashboard_connection.png)
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
+ ![Dashboard Overview — status do servidor, alteracoes recentes e resumo da sessao em uma unica tela](../../assets/screenshots/dashboard/dashboard_overview.png)
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
+ ![Playtest — status do playtest e historico de testes](../../assets/screenshots/dashboard/dashboard_playtest.png)
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
+ ![Sync — status de sincronizacao, configuracao de direcao, logs](../../assets/screenshots/dashboard/dashboard_sync.png)
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
+ ![Tools — historico de execucao e estatisticas das ferramentas](../../assets/screenshots/dashboard/dashboard_tools.png)
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": "1.5.5",
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
  },
@@ -1,7 +1,7 @@
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": "1.5.5",
4
+ "version": "2.0.1",
5
5
  "author": {
6
6
  "name": "hope1026"
7
7
  },
@@ -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};