@weppy/roblox-mcp 2.4.1 β†’ 2.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (165) hide show
  1. package/.claude-plugin/marketplace.json +2 -2
  2. package/.github/workflows/install-test.yml +2 -21
  3. package/CHANGELOG.md +22 -5
  4. package/COMMERCIAL-LICENSE.md +1 -1
  5. package/README.md +11 -11
  6. package/TRADEMARKS.md +1 -1
  7. package/docs/en/dashboard/changelog.md +1 -1
  8. package/docs/en/dashboard/connection.md +1 -1
  9. package/docs/en/dashboard/overview.md +1 -1
  10. package/docs/en/dashboard/playtest.md +1 -1
  11. package/docs/en/dashboard/settings.md +1 -1
  12. package/docs/en/dashboard/sync.md +1 -1
  13. package/docs/en/dashboard/tools.md +1 -1
  14. package/docs/en/installation/README.md +4 -4
  15. package/docs/en/installation/ai-apps/antigravity.md +1 -1
  16. package/docs/en/installation/ai-apps/claude-app.md +1 -1
  17. package/docs/en/installation/ai-apps/claude-code.md +1 -1
  18. package/docs/en/installation/ai-apps/codex-app.md +1 -1
  19. package/docs/en/installation/ai-apps/codex-cli.md +1 -1
  20. package/docs/en/installation/ai-apps/cursor.md +1 -1
  21. package/docs/en/installation/ai-apps/gemini-cli.md +1 -1
  22. package/docs/en/installation/roblox-explorer.md +12 -12
  23. package/docs/en/installation/roblox-plugin.md +5 -5
  24. package/docs/en/pro-upgrade.md +3 -3
  25. package/docs/en/sync/luau-lsp.md +13 -13
  26. package/docs/en/sync/overview.md +8 -8
  27. package/docs/en/tools/overview.md +1 -1
  28. package/docs/en/tools/playtest.md +2 -2
  29. package/docs/es/README.md +10 -10
  30. package/docs/es/dashboard/changelog.md +1 -1
  31. package/docs/es/dashboard/connection.md +1 -1
  32. package/docs/es/dashboard/overview.md +1 -1
  33. package/docs/es/dashboard/playtest.md +1 -1
  34. package/docs/es/dashboard/settings.md +1 -1
  35. package/docs/es/dashboard/sync.md +1 -1
  36. package/docs/es/dashboard/tools.md +1 -1
  37. package/docs/es/installation/README.md +3 -3
  38. package/docs/es/installation/ai-apps/antigravity.md +1 -1
  39. package/docs/es/installation/ai-apps/claude-app.md +1 -1
  40. package/docs/es/installation/ai-apps/claude-code.md +1 -1
  41. package/docs/es/installation/ai-apps/codex-app.md +1 -1
  42. package/docs/es/installation/ai-apps/codex-cli.md +1 -1
  43. package/docs/es/installation/ai-apps/cursor.md +1 -1
  44. package/docs/es/installation/ai-apps/gemini-cli.md +1 -1
  45. package/docs/es/installation/roblox-explorer.md +11 -11
  46. package/docs/es/installation/roblox-plugin.md +3 -3
  47. package/docs/es/pro-upgrade.md +1 -1
  48. package/docs/es/sync/luau-lsp.md +13 -13
  49. package/docs/es/sync/overview.md +8 -8
  50. package/docs/es/tools/overview.md +1 -1
  51. package/docs/es/tools/playtest.md +2 -2
  52. package/docs/id/README.md +10 -10
  53. package/docs/id/dashboard/changelog.md +1 -1
  54. package/docs/id/dashboard/connection.md +1 -1
  55. package/docs/id/dashboard/overview.md +1 -1
  56. package/docs/id/dashboard/playtest.md +1 -1
  57. package/docs/id/dashboard/settings.md +1 -1
  58. package/docs/id/dashboard/sync.md +1 -1
  59. package/docs/id/dashboard/tools.md +1 -1
  60. package/docs/id/installation/README.md +4 -4
  61. package/docs/id/installation/ai-apps/antigravity.md +1 -1
  62. package/docs/id/installation/ai-apps/claude-app.md +1 -1
  63. package/docs/id/installation/ai-apps/claude-code.md +1 -1
  64. package/docs/id/installation/ai-apps/codex-app.md +1 -1
  65. package/docs/id/installation/ai-apps/codex-cli.md +1 -1
  66. package/docs/id/installation/ai-apps/cursor.md +1 -1
  67. package/docs/id/installation/ai-apps/gemini-cli.md +1 -1
  68. package/docs/id/installation/roblox-explorer.md +11 -11
  69. package/docs/id/installation/roblox-plugin.md +3 -3
  70. package/docs/id/pro-upgrade.md +1 -1
  71. package/docs/id/sync/luau-lsp.md +13 -13
  72. package/docs/id/sync/overview.md +8 -8
  73. package/docs/id/tools/overview.md +1 -1
  74. package/docs/id/tools/playtest.md +2 -2
  75. package/docs/installer/assets/index-Bz0amd7x.js +2 -2
  76. package/docs/installer/index.html +1 -1
  77. package/docs/installer/manifest.webmanifest +3 -3
  78. package/docs/ja/README.md +10 -10
  79. package/docs/ja/installation/README.md +4 -4
  80. package/docs/ja/installation/ai-apps/antigravity.md +1 -1
  81. package/docs/ja/installation/ai-apps/claude-app.md +1 -1
  82. package/docs/ja/installation/ai-apps/claude-code.md +1 -1
  83. package/docs/ja/installation/ai-apps/codex-app.md +1 -1
  84. package/docs/ja/installation/ai-apps/codex-cli.md +1 -1
  85. package/docs/ja/installation/ai-apps/cursor.md +1 -1
  86. package/docs/ja/installation/ai-apps/gemini-cli.md +1 -1
  87. package/docs/ja/installation/roblox-explorer.md +11 -11
  88. package/docs/ja/installation/roblox-plugin.md +3 -3
  89. package/docs/ja/pro-upgrade.md +1 -1
  90. package/docs/ja/sync/luau-lsp.md +13 -13
  91. package/docs/ja/sync/overview.md +8 -8
  92. package/docs/ja/tools/overview.md +1 -1
  93. package/docs/ja/tools/playtest.md +2 -2
  94. package/docs/ko/README.md +10 -10
  95. package/docs/ko/installation/README.md +4 -4
  96. package/docs/ko/installation/ai-apps/antigravity.md +1 -1
  97. package/docs/ko/installation/ai-apps/claude-app.md +1 -1
  98. package/docs/ko/installation/ai-apps/claude-code.md +1 -1
  99. package/docs/ko/installation/ai-apps/codex-app.md +1 -1
  100. package/docs/ko/installation/ai-apps/codex-cli.md +1 -1
  101. package/docs/ko/installation/ai-apps/cursor.md +1 -1
  102. package/docs/ko/installation/ai-apps/gemini-cli.md +1 -1
  103. package/docs/ko/installation/roblox-explorer.md +12 -12
  104. package/docs/ko/installation/roblox-plugin.md +5 -5
  105. package/docs/ko/pro-upgrade.md +1 -1
  106. package/docs/ko/sync/luau-lsp.md +13 -13
  107. package/docs/ko/sync/overview.md +8 -8
  108. package/docs/ko/tools/overview.md +1 -1
  109. package/docs/ko/tools/playtest.md +2 -2
  110. package/docs/pt-br/README.md +11 -11
  111. package/docs/pt-br/dashboard/changelog.md +1 -1
  112. package/docs/pt-br/dashboard/connection.md +1 -1
  113. package/docs/pt-br/dashboard/overview.md +1 -1
  114. package/docs/pt-br/dashboard/playtest.md +1 -1
  115. package/docs/pt-br/dashboard/settings.md +1 -1
  116. package/docs/pt-br/dashboard/sync.md +1 -1
  117. package/docs/pt-br/dashboard/tools.md +1 -1
  118. package/docs/pt-br/installation/README.md +4 -4
  119. package/docs/pt-br/installation/ai-apps/antigravity.md +1 -1
  120. package/docs/pt-br/installation/ai-apps/claude-app.md +1 -1
  121. package/docs/pt-br/installation/ai-apps/claude-code.md +1 -1
  122. package/docs/pt-br/installation/ai-apps/codex-app.md +1 -1
  123. package/docs/pt-br/installation/ai-apps/codex-cli.md +1 -1
  124. package/docs/pt-br/installation/ai-apps/cursor.md +1 -1
  125. package/docs/pt-br/installation/ai-apps/gemini-cli.md +1 -1
  126. package/docs/pt-br/installation/roblox-explorer.md +11 -11
  127. package/docs/pt-br/installation/roblox-plugin.md +3 -3
  128. package/docs/pt-br/pro-upgrade.md +1 -1
  129. package/docs/pt-br/sync/luau-lsp.md +13 -13
  130. package/docs/pt-br/sync/overview.md +8 -8
  131. package/docs/pt-br/tools/overview.md +1 -1
  132. package/docs/pt-br/tools/playtest.md +2 -2
  133. package/docs/troubleshooting.md +1 -1
  134. package/install.ps1 +8 -8
  135. package/install.sh +11 -11
  136. package/llms-full.txt +8 -8
  137. package/llms.txt +4 -4
  138. package/package.json +1 -1
  139. package/plugins/weppy-roblox-mcp/.claude-plugin/plugin.json +1 -1
  140. package/plugins/weppy-roblox-mcp/dashboard/dist/assets/{ChangelogDetailPage-J4ikmBDz.js β†’ ChangelogDetailPage-DRfFUIvC.js} +1 -1
  141. package/plugins/weppy-roblox-mcp/dashboard/dist/assets/{ChangelogPage-CRyiyz5Q.js β†’ ChangelogPage-Dgl8dBt6.js} +1 -1
  142. package/plugins/weppy-roblox-mcp/dashboard/dist/assets/{ConfirmModal-BqqXDrdf.js β†’ ConfirmModal-DfdyAPrJ.js} +1 -1
  143. package/plugins/weppy-roblox-mcp/dashboard/dist/assets/{ConnectionPage-BFjleYaN.js β†’ ConnectionPage-LSvSX1_u.js} +1 -1
  144. package/plugins/weppy-roblox-mcp/dashboard/dist/assets/{InfoLabel-DG5Q_c5f.js β†’ InfoLabel-DrK7vhO-.js} +1 -1
  145. package/plugins/weppy-roblox-mcp/dashboard/dist/assets/{OverviewPage-skOVAGFT.js β†’ OverviewPage-CXsGuoPu.js} +1 -1
  146. package/plugins/weppy-roblox-mcp/dashboard/dist/assets/{PlaytestPage-jdZTJ1qE.js β†’ PlaytestPage-CgkzRAqQ.js} +2 -2
  147. package/plugins/weppy-roblox-mcp/dashboard/dist/assets/{PropertyDiff-DGvziVFn.js β†’ PropertyDiff-Dy3MffNh.js} +1 -1
  148. package/plugins/weppy-roblox-mcp/dashboard/dist/assets/SettingsPage-D2ZBQ2KF.js +1 -0
  149. package/plugins/weppy-roblox-mcp/dashboard/dist/assets/{StatusBadge-D-Jxp4ai.js β†’ StatusBadge-hJyzgRAl.js} +1 -1
  150. package/plugins/weppy-roblox-mcp/dashboard/dist/assets/SyncPage-eX2Rh-Ct.js +4 -0
  151. package/plugins/weppy-roblox-mcp/dashboard/dist/assets/{TierComparison-Ct-fbCs5.js β†’ TierComparison-BwKqP_4s.js} +1 -1
  152. package/plugins/weppy-roblox-mcp/dashboard/dist/assets/{TierPromoProgress-CoEpWzRl.js β†’ TierPromoProgress-CLAr1gQq.js} +1 -1
  153. package/plugins/weppy-roblox-mcp/dashboard/dist/assets/{ToolsPage-Ov5mDGFU.js β†’ ToolsPage-CqzfCxxH.js} +1 -1
  154. package/plugins/weppy-roblox-mcp/dashboard/dist/assets/{WhatsNewPage-DZ-tJeoq.js β†’ WhatsNewPage-23o8LmsR.js} +1 -1
  155. package/plugins/weppy-roblox-mcp/dashboard/dist/assets/index-BfvSPSNj.js +207 -0
  156. package/plugins/weppy-roblox-mcp/dashboard/dist/assets/{useLiveUptime-BpIv_H68.js β†’ useLiveUptime-BeRNzFBh.js} +1 -1
  157. package/plugins/weppy-roblox-mcp/dashboard/dist/index.html +3 -3
  158. package/plugins/weppy-roblox-mcp/dist/index.js +82 -82
  159. package/plugins/weppy-roblox-mcp/roblox-plugin/WeppyRobloxMCP.rbxm +0 -0
  160. package/.github/workflows/deploy-docs.yml +0 -41
  161. package/plugins/weppy-roblox-mcp/dashboard/dist/assets/SettingsPage-DNmdsQlc.js +0 -1
  162. package/plugins/weppy-roblox-mcp/dashboard/dist/assets/SyncPage-BTX8aTCf.js +0 -4
  163. package/plugins/weppy-roblox-mcp/dashboard/dist/assets/index-aMbdHsW4.js +0 -147
  164. /package/docs/installer/{wrox-icon.png β†’ weppy-icon.png} +0 -0
  165. /package/plugins/weppy-roblox-mcp/dashboard/dist/{wrox-icon.png β†’ weppy-icon.png} +0 -0
@@ -18,16 +18,16 @@ Sem Sync, a IA so enxerga trechos colados no chat. Com Sync ativo, ela trabalha
18
18
  2. Incremental Sync: atualizacao continua das mudancas novas
19
19
  3. Rastreamento de History/Status: ver o que mudou, quando e em qual direcao
20
20
 
21
- Os dados de Sync ficam em `{projectRoot}/wrox-project-sync/place_{placeId}/explorer`.
22
- Alem disso, o WROX grava um sourcemap por place em `{projectRoot}/wrox-project-sync/place_{placeId}/sourcemap.json` e mantem o arquivo representativo recomendado na raiz em `{projectRoot}/wrox-project-sync/sourcemap.json`.
23
- Para integracoes de editor como `luau-lsp`, o caminho da raiz e o recomendado. Os passos de configuracao estao em [Usar `luau-lsp` com WROX Sync](./luau-lsp.md).
21
+ Os dados de Sync ficam em `{projectRoot}/weppy-project-sync/place_{placeId}/explorer`.
22
+ Alem disso, o WEPPY grava um sourcemap por place em `{projectRoot}/weppy-project-sync/place_{placeId}/sourcemap.json` e mantem o arquivo representativo recomendado na raiz em `{projectRoot}/weppy-project-sync/sourcemap.json`.
23
+ Para integracoes de editor como `luau-lsp`, o caminho da raiz e o recomendado. Os passos de configuracao estao em [Usar `luau-lsp` com WEPPY Sync](./luau-lsp.md).
24
24
 
25
25
  ### Explorar dados sincronizados no VSCode
26
26
 
27
- Instale a extensao [WROX Roblox Explorer](../installation/roblox-explorer.md) para explorar a arvore de instancias sincronizada no VSCode, assim como no Roblox Studio.
27
+ Instale a extensao [WEPPY Roblox Explorer](../installation/roblox-explorer.md) para explorar a arvore de instancias sincronizada no VSCode, assim como no Roblox Studio.
28
28
  O Explorer le os arquivos de sync gerados aqui e tambem pode mostrar status sync ao vivo e informacoes de direction quando o servidor MCP local estiver em execucao.
29
29
 
30
- ![WROX Roblox Explorer β€” explorar a arvore de instancias sincronizada no VSCode](../../assets/screenshots/roblox-explorer/roblox-explorer-screen.png)
30
+ ![WEPPY Roblox Explorer β€” explorar a arvore de instancias sincronizada no VSCode](../../assets/screenshots/roblox-explorer/roblox-explorer-screen.png)
31
31
 
32
32
  - Arvore de servicos/instancias com icones de classes Roblox
33
33
  - Clique em um script para abri-lo e editar
@@ -40,7 +40,7 @@ O Explorer le os arquivos de sync gerados aqui e tambem pode mostrar status sync
40
40
  | Direcao de sync | Studio -> Local | Bidirecional |
41
41
  | Direction por tipo | Nao suportado | Suportado (Scripts / Values / Containers / Data / Services) |
42
42
  | Apply Mode por tipo | Nao suportado | Suportado (Auto / Manual) |
43
- | APIs de status/historico | Nao suportado | Suportado (`status`, `history`, `progress`) |
43
+ | APIs de status/historico | Nao suportado | Suportado (`status_current_place`, `history`, `progress`) |
44
44
  | Ferramenta `manage_sync` | Nao suportado | Suportado |
45
45
  | Sync multiplace | Nao suportado | Suportado (ate 3 places) |
46
46
 
@@ -87,7 +87,7 @@ No Pro, voce controla Direction e Apply Mode por tipo.
87
87
 
88
88
  | Acao | Descricao | Parametros principais |
89
89
  |------|------|-----------|
90
- | `status` | Consultar estado atual de sync de um place | `placeId` |
90
+ | `status_current_place` | Consultar o estado atual de sync do Place conectado | `-` |
91
91
  | `history` | Consultar historico de mudancas | `placeId`, `query.limit`, `query.offset` |
92
92
  | `directions` | Obter direcoes por tipo | `placeId` |
93
93
  | `read_file` | Ler arquivo sincronizado | `placeId`, `instancePath` |
@@ -148,6 +148,6 @@ Nomes que contem `~` sao escapados como `~~` (ex: `Part~2` β†’ `Part~~2/`). Regr
148
148
 
149
149
  ## Documentos relacionados
150
150
 
151
- - [Usar `luau-lsp` com WROX Sync](./luau-lsp.md)
151
+ - [Usar `luau-lsp` com WEPPY Sync](./luau-lsp.md)
152
152
  - [Cobertura de ferramentas (Tools Overview)](../tools/overview.md)
153
153
  - [Guia de upgrade Pro](https://weppyai.com/en/plans)
@@ -227,7 +227,7 @@ Politica de Sync:
227
227
 
228
228
  | Acao | Descricao | Tier |
229
229
  |------|-----------|------|
230
- | `status` | Obter status de sincronizacao de um Place | Pro |
230
+ | `status_current_place` | Obter o status de sincronizacao do Place conectado no momento | Pro |
231
231
  | `history` | Obter historico de mudancas | Pro |
232
232
  | `directions` | Obter direcoes de sincronizacao por tipo | Pro |
233
233
  | `read_file` | Ler um arquivo sincronizado | Pro |
@@ -86,10 +86,10 @@ Edit --play--> Running --stop--> Edit
86
86
 
87
87
  ### 5. Escrita de relatorios
88
88
 
89
- Os relatorios e logs sao gravados em `{projectRoot}/wrox-project-sync/place_XXXXX/tests/YYYYMMDD-HHmmss/`.
89
+ Os relatorios e logs sao gravados em `{projectRoot}/weppy-project-sync/place_XXXXX/tests/YYYYMMDD-HHmmss/`.
90
90
 
91
91
  ```text
92
- {projectRoot}/wrox-project-sync/place_XXXXX/tests/YYYYMMDD-HHmmss/
92
+ {projectRoot}/weppy-project-sync/place_XXXXX/tests/YYYYMMDD-HHmmss/
93
93
  β”œβ”€β”€ test-report.md
94
94
  └── test-log.txt
95
95
  ```
@@ -5,7 +5,7 @@
5
5
  **Symptom:** "Connection failed" or plugin shows disconnected in Roblox Studio.
6
6
 
7
7
  1. Make sure the MCP server is running: `npx -y @weppy/roblox-mcp`
8
- 2. In Roblox Studio: Plugins tab β†’ WROX β†’ Connect
8
+ 2. In Roblox Studio: Plugins tab β†’ WEPPY β†’ Connect
9
9
  3. Confirm nothing is blocking `localhost:3002` (firewall, antivirus, VPN)
10
10
  4. Try restarting both Roblox Studio and the MCP server
11
11
 
package/install.ps1 CHANGED
@@ -1,5 +1,5 @@
1
1
  #
2
- # WROX β€” One-line install script (Windows PowerShell)
2
+ # WEPPY β€” One-line install script (Windows PowerShell)
3
3
  #
4
4
  # Usage:
5
5
  # irm https://raw.githubusercontent.com/hope1026/weppy-roblox-mcp/main/install.ps1 | iex
@@ -10,7 +10,7 @@
10
10
  #
11
11
 
12
12
  $ErrorActionPreference = "Stop"
13
- $script:InstallLogPath = Join-Path ([System.IO.Path]::GetTempPath()) ("wrox-install-{0:yyyyMMdd-HHmmss}.log" -f (Get-Date))
13
+ $script:InstallLogPath = Join-Path ([System.IO.Path]::GetTempPath()) ("weppy-install-{0:yyyyMMdd-HHmmss}.log" -f (Get-Date))
14
14
  $script:TranscriptStarted = $false
15
15
  $script:NpmCommandPath = $null
16
16
 
@@ -118,7 +118,7 @@ function Add-AntigravityMcpConfig($configPath) {
118
118
  if (-not (Test-Path $parentDir)) { New-Item -ItemType Directory -Path $parentDir -Force | Out-Null }
119
119
  $env:MCP_CONFIG_PATH = $configPath
120
120
  try {
121
- node -e @"
121
+ node --input-type=commonjs -e @"
122
122
  const fs = require('fs');
123
123
  const configPath = process.env.MCP_CONFIG_PATH;
124
124
  let config = {};
@@ -168,7 +168,7 @@ function Test-CodexConfigConfigured($configPath) {
168
168
 
169
169
  $env:MCP_CODEX_CONFIG_PATH = $configPath
170
170
  try {
171
- node -e @'
171
+ node --input-type=commonjs -e @'
172
172
  const fs = require('fs');
173
173
 
174
174
  const configPath = process.env.MCP_CODEX_CONFIG_PATH;
@@ -589,7 +589,7 @@ function Add-McpToConfig($configPath) {
589
589
  if (-not (Test-Path $parentDir)) { New-Item -ItemType Directory -Path $parentDir -Force | Out-Null }
590
590
  $env:MCP_CONFIG_PATH = $configPath
591
591
  try {
592
- node -e @"
592
+ node --input-type=commonjs -e @"
593
593
  const fs = require('fs');
594
594
  const configPath = process.env.MCP_CONFIG_PATH;
595
595
  let config = {};
@@ -605,7 +605,7 @@ fs.writeFileSync(configPath, JSON.stringify(config, null, 2) + '\n');
605
605
 
606
606
  # ── Header ──
607
607
  Write-Host ""
608
- Write-Host "WROX Installer" -ForegroundColor White -BackgroundColor DarkCyan
608
+ Write-Host "WEPPY Installer" -ForegroundColor White -BackgroundColor DarkCyan
609
609
  Write-Host "AI-powered Roblox Studio integration" -ForegroundColor DarkGray
610
610
  Write-Host ("=" * 40)
611
611
 
@@ -635,7 +635,7 @@ if (Confirm-Action " Run npx -y @weppy/roblox-mcp --setup?") {
635
635
  if (-not (Test-Path $npxPath)) {
636
636
  $npxPath = "npx"
637
637
  }
638
- & $npxPath -y "@weppy/roblox-mcp" --setup
638
+ & $npxPath -y --package=@weppy/roblox-mcp weppy-roblox-mcp --setup
639
639
  if ($LASTEXITCODE -ne 0) {
640
640
  Write-Warn "Setup encountered a warning (non-blocking)"
641
641
  } else {
@@ -874,7 +874,7 @@ Write-Host "Installation complete!" -ForegroundColor Green
874
874
  Write-Host ""
875
875
  Write-Host " Next steps:"
876
876
  Write-Host " 1. Restart Roblox Studio"
877
- Write-Host " 2. Look for the WROX button in the Plugins tab"
877
+ Write-Host " 2. Look for the WEPPY button in the Plugins tab"
878
878
  Write-Host " 3. Click Connect and start building with AI!"
879
879
  Write-Host ""
880
880
  Write-Host " Auto registration: Claude Code, Claude Desktop, Cursor, Codex CLI/App, Gemini CLI, Antigravity"
package/install.sh CHANGED
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env bash
2
2
  #
3
- # WROX β€” One-line install script (macOS/Linux)
3
+ # WEPPY β€” One-line install script (macOS/Linux)
4
4
  #
5
5
  # Usage:
6
6
  # curl -fsSL https://raw.githubusercontent.com/hope1026/weppy-roblox-mcp/main/install.sh | bash
@@ -22,9 +22,9 @@ DIM='\033[2m'
22
22
  BOLD='\033[1m'
23
23
  NC='\033[0m'
24
24
 
25
- INSTALL_LOG_FILE="$(mktemp "${TMPDIR:-/tmp}/wrox-install-XXXXXX.log" 2>/dev/null || true)"
25
+ INSTALL_LOG_FILE="$(mktemp "${TMPDIR:-/tmp}/weppy-install-XXXXXX.log" 2>/dev/null || true)"
26
26
  if [ -z "${INSTALL_LOG_FILE:-}" ]; then
27
- INSTALL_LOG_FILE="${HOME}/wrox-install-error.log"
27
+ INSTALL_LOG_FILE="${HOME}/weppy-install-error.log"
28
28
  : > "$INSTALL_LOG_FILE"
29
29
  fi
30
30
 
@@ -92,7 +92,7 @@ add_mcp_to_config() {
92
92
  local parent_dir
93
93
  parent_dir=$(dirname "$config_path")
94
94
  mkdir -p "$parent_dir"
95
- MCP_CONFIG_PATH="$config_path" node -e '
95
+ MCP_CONFIG_PATH="$config_path" node --input-type=commonjs -e '
96
96
  const fs = require("fs");
97
97
  const configPath = process.env.MCP_CONFIG_PATH;
98
98
  let config = {};
@@ -108,7 +108,7 @@ is_json_mcp_configured() {
108
108
 
109
109
  [ -f "$config_path" ] || return 1
110
110
 
111
- MCP_CONFIG_PATH="$config_path" node -e '
111
+ MCP_CONFIG_PATH="$config_path" node --input-type=commonjs -e '
112
112
  const fs = require("fs");
113
113
  const configPath = process.env.MCP_CONFIG_PATH;
114
114
  try {
@@ -126,7 +126,7 @@ add_antigravity_mcp_config() {
126
126
  local parent_dir
127
127
  parent_dir=$(dirname "$config_path")
128
128
  mkdir -p "$parent_dir"
129
- MCP_CONFIG_PATH="$config_path" node -e '
129
+ MCP_CONFIG_PATH="$config_path" node --input-type=commonjs -e '
130
130
  const fs = require("fs");
131
131
  const configPath = process.env.MCP_CONFIG_PATH;
132
132
  let config = {};
@@ -154,7 +154,7 @@ is_antigravity_mcp_configured() {
154
154
 
155
155
  [ -f "$config_path" ] || return 1
156
156
 
157
- MCP_CONFIG_PATH="$config_path" node -e '
157
+ MCP_CONFIG_PATH="$config_path" node --input-type=commonjs -e '
158
158
  const fs = require("fs");
159
159
  const configPath = process.env.MCP_CONFIG_PATH;
160
160
  function isJsonObject(value) {
@@ -185,7 +185,7 @@ is_codex_config_configured() {
185
185
  local config_path="$1"
186
186
 
187
187
  [ -f "$config_path" ] || return 1
188
- MCP_CODEX_CONFIG_PATH="$config_path" node <<'NODE' >/dev/null 2>&1
188
+ MCP_CODEX_CONFIG_PATH="$config_path" node --input-type=commonjs <<'NODE' >/dev/null 2>&1
189
189
  const fs = require("fs");
190
190
 
191
191
  const configPath = process.env.MCP_CODEX_CONFIG_PATH;
@@ -615,7 +615,7 @@ resolve_optional_cli_command() {
615
615
 
616
616
  # ── Header ──
617
617
  # shellcheck disable=SC2059
618
- printf "\n${BOLD}WROX Installer${NC}\n"
618
+ printf "\n${BOLD}WEPPY Installer${NC}\n"
619
619
  # shellcheck disable=SC2059
620
620
  printf "${DIM}AI-powered Roblox Studio integration${NC}\n"
621
621
  printf "%s\n" "════════════════════════════════════"
@@ -641,7 +641,7 @@ success "Node.js $(node -v) detected"
641
641
  step "1/2" "Setup Roblox Studio Plugin"
642
642
 
643
643
  if confirm " Run npx -y @weppy/roblox-mcp --setup?"; then
644
- if npx -y @weppy/roblox-mcp --setup; then
644
+ if npx -y --package=@weppy/roblox-mcp weppy-roblox-mcp --setup; then
645
645
  success "Setup complete"
646
646
  else
647
647
  warn "Setup encountered a warning (non-blocking)"
@@ -872,7 +872,7 @@ printf "${BOLD}Installation complete!${NC}\n\n"
872
872
  printf " ${BOLD}Next steps:${NC}\n"
873
873
  printf " 1. Restart Roblox Studio\n"
874
874
  # shellcheck disable=SC2059
875
- printf " 2. Look for the ${BOLD}WROX${NC} button in the Plugins tab\n"
875
+ printf " 2. Look for the ${BOLD}WEPPY${NC} button in the Plugins tab\n"
876
876
  printf " 3. Click Connect and start building with AI!\n\n"
877
877
  printf " Auto registration: Claude Code, Claude Desktop, Cursor, Codex CLI/App, Gemini CLI, Antigravity\n\n"
878
878
  # shellcheck disable=SC2059
package/llms-full.txt CHANGED
@@ -1,6 +1,6 @@
1
- # WROX β€” Full Documentation
1
+ # WEPPY β€” Full Documentation
2
2
 
3
- > WROX is an MCP server that lets AI coding agents (Claude, Codex,
3
+ > WEPPY is an MCP server that lets AI coding agents (Claude, Codex,
4
4
  > Cursor, Gemini) control a live Roblox Studio session β€” create and edit scripts,
5
5
  > instances, terrain, lighting, assets, audio, and animations via natural language.
6
6
  > Action-based MCP tools Β· Bidirectional sync Β· Multi-place support
@@ -69,12 +69,12 @@ Note: The same plugin package is used for all tiers.
69
69
  4. **Copy** the `WeppyRobloxMCP.rbxm` file into the opened Plugins folder
70
70
  5. **Restart Roblox Studio**
71
71
 
72
- After restarting, the **WROX** button will appear in the Plugins tab.
72
+ After restarting, the **WEPPY** button will appear in the Plugins tab.
73
73
 
74
74
  ### Connect to AI Agent
75
75
 
76
76
  1. Open any project in **Roblox Studio**
77
- 2. Go to **Plugins** tab -> **WROX**
77
+ 2. Go to **Plugins** tab -> **WEPPY**
78
78
  3. Click the **Connect** button in the plugin window
79
79
  4. Once **"Connected"** status is displayed, you're ready
80
80
 
@@ -213,7 +213,7 @@ In the agent pane, click β‹― β†’ MCP Servers β†’ Manage MCP Servers β†’ View raw
213
213
 
214
214
  Browse synced instance trees inside VSCode with Roblox class icons.
215
215
 
216
- Search for **WROX Explorer** in the VSCode Extensions sidebar and click Install, or install from [VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=weppy.weppy-roblox-explorer) or [Open VSX](https://open-vsx.org/extension/weppy/weppy-roblox-explorer).
216
+ Search for **WEPPY Explorer** in the VSCode Extensions sidebar and click Install, or install from [VS Code Marketplace](https://marketplace.visualstudio.com/items?itemName=weppy.weppy-roblox-explorer) or [Open VSX](https://open-vsx.org/extension/weppy/weppy-roblox-explorer).
217
217
 
218
218
  Features:
219
219
  - Instance tree with Roblox class icons (dark/light theme)
@@ -224,7 +224,7 @@ Features:
224
224
 
225
225
  ## After Installation
226
226
 
227
- 1. Open Roblox Studio, go to Plugins tab and click WROX β†’ Connect
227
+ 1. Open Roblox Studio, go to Plugins tab and click WEPPY β†’ Connect
228
228
  2. Test in your AI app: "Create a blue part in Roblox Studio"
229
229
 
230
230
  ---
@@ -506,7 +506,7 @@ Without Sync, AI only sees snippets pasted into chat. With Sync enabled, AI work
506
506
  2. Incremental Sync: continuous update of new changes
507
507
  3. History/Status tracking: inspect what changed, when, and in which direction
508
508
 
509
- Sync data is stored under `{projectRoot}/wrox-project-sync/place_{placeId}/explorer`.
509
+ Sync data is stored under `{projectRoot}/weppy-project-sync/place_{placeId}/explorer`.
510
510
 
511
511
  ## Sync Capabilities
512
512
 
@@ -641,7 +641,7 @@ Claude Code, Claude Desktop, Cursor, Codex CLI, Codex Desktop, Gemini CLI, Antig
641
641
  ## Plugin not connecting
642
642
 
643
643
  1. Make sure the MCP server is running: `npx -y @weppy/roblox-mcp`
644
- 2. In Roblox Studio: Plugins tab β†’ WROX β†’ Connect
644
+ 2. In Roblox Studio: Plugins tab β†’ WEPPY β†’ Connect
645
645
  3. Confirm nothing is blocking `localhost:3002` (firewall, antivirus, VPN)
646
646
  4. Try restarting both Roblox Studio and the MCP server
647
647
 
package/llms.txt CHANGED
@@ -1,12 +1,12 @@
1
- # WROX β€” MCP Server for Roblox Studio
1
+ # WEPPY β€” MCP Server for Roblox Studio
2
2
 
3
- > WROX is an MCP server that lets AI coding agents (Claude, Codex,
3
+ > WEPPY is an MCP server that lets AI coding agents (Claude, Codex,
4
4
  > Cursor, Gemini) control a live Roblox Studio session β€” create and edit scripts,
5
5
  > instances, terrain, lighting, assets, audio, and animations via natural language.
6
6
 
7
7
  ## What it does
8
8
 
9
- WROX provides a real-time bridge between AI agents and the Roblox
9
+ WEPPY provides a real-time bridge between AI agents and the Roblox
10
10
  Studio DataModel. It exposes the full Roblox API surface as executable MCP tools,
11
11
  so AI can directly create, read, modify, and delete instances, scripts, properties,
12
12
  terrain, and more β€” inside a live Studio session.
@@ -52,7 +52,7 @@ Manual alternative:
52
52
  - Installation: https://github.com/hope1026/weppy-roblox-mcp/blob/main/docs/en/installation/README.md
53
53
  - Tools reference: https://github.com/hope1026/weppy-roblox-mcp/blob/main/docs/en/tools/overview.md
54
54
  - Sync guide: https://github.com/hope1026/weppy-roblox-mcp/blob/main/docs/en/sync/overview.md
55
- - WROX Dashboard guide: https://github.com/hope1026/weppy-roblox-mcp/blob/main/docs/en/dashboard/overview.md
55
+ - WEPPY Dashboard guide: https://github.com/hope1026/weppy-roblox-mcp/blob/main/docs/en/dashboard/overview.md
56
56
  - Troubleshooting: https://github.com/hope1026/weppy-roblox-mcp/blob/main/docs/troubleshooting.md
57
57
  - Compatibility: https://github.com/hope1026/weppy-roblox-mcp/blob/main/docs/compatibility.md
58
58
  - Pro upgrade: https://weppyai.com/en/plans
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@weppy/roblox-mcp",
3
- "version": "2.4.1",
3
+ "version": "2.5.0",
4
4
  "description": "MCP (Model Context Protocol) server for Roblox Studio integration - enables AI coding agents to interact with Roblox Studio in real-time",
5
5
  "main": "plugins/weppy-roblox-mcp/dist/index.js",
6
6
  "type": "module",
@@ -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": "2.4.1",
4
+ "version": "2.5.0",
5
5
  "author": {
6
6
  "name": "hope1026"
7
7
  },
@@ -1 +1 @@
1
- import{r,a as R,u as M,b as B,c as D,j as e,T as m}from"./index-aMbdHsW4.js";import{I as V}from"./InfoLabel-DG5Q_c5f.js";import{D as F,P as G}from"./PropertyDiff-DGvziVFn.js";function P(t){const s={scriptsModified:0,scriptsCreated:0,instancesCreated:0,instancesDeleted:0,instancesMoved:0,propertiesChanged:0,lightingChanged:!1,terrainChanged:!1,assetsInserted:0};for(const l of t)switch(l.category){case"script":l.changeType==="create"?s.scriptsCreated++:s.scriptsModified++;break;case"instance":l.changeType==="create"?s.instancesCreated++:l.changeType==="delete"?s.instancesDeleted++:l.changeType==="move"&&s.instancesMoved++;break;case"property":s.propertiesChanged++;break;case"lighting":s.lightingChanged=!0;break;case"terrain":s.terrainChanged=!0;break;case"asset":s.assetsInserted++;break}return s}function U(t){const[s,l]=r.useState(""),[a,d]=r.useState(""),[u,q]=r.useState(),[w,y]=r.useState("completed"),[E,I]=r.useState([]),[O,L]=r.useState([]),[f,x]=r.useState([]),[p,j]=r.useState(),[_,b]=r.useState(),[v,S]=r.useState(),[C,N]=r.useState({scriptsModified:0,scriptsCreated:0,instancesCreated:0,instancesDeleted:0,instancesMoved:0,propertiesChanged:0,lightingChanged:!1,terrainChanged:!1,assetsInserted:0}),[T,g]=r.useState(!0),[k,h]=r.useState(null),i=r.useCallback(async()=>{if(t){g(!0),h(null);try{const[c,o]=await Promise.all([R.get(`/api/dashboard/changelog/${t}`),R.get(`/api/dashboard/changelog/${t}/changes`)]);l(c.entryId),d(c.startTime),q(c.endTime),y(c.status),I(c.entries),L(c.failures),j(c.contextSummary),b(c.replayMetadata),S(c.verificationSummary),x(o.changes),N(P(o.changes))}catch(c){h(c instanceof Error?c.message:"Failed to load changelog detail")}finally{g(!1)}}},[t]);return r.useEffect(()=>{i()},[i]),{entryId:s,startTime:a,endTime:u,status:w,entries:E,failures:O,changes:f,changeSummary:C,contextSummary:p,replayMetadata:_,verificationSummary:v,loading:T,error:k,refresh:i}}const z={script:"πŸ“",instance:"🧱",property:"🎨",lighting:"πŸŒ…",terrain:"⛰️",asset:"πŸ“¦"};function H(t){return z[t]??"❓"}const J="_page_q2jbi_2",W="_header_q2jbi_10",Y="_backLink_q2jbi_16",Q="_headerTitle_q2jbi_29",X="_headerTime_q2jbi_37",Z="_statusActive_q2jbi_44",ee="_statusCompleted_q2jbi_49",te="_section_q2jbi_54",ne="_sectionTitle_q2jbi_61",ae="_summaryGrid_q2jbi_74",ie="_summaryCard_q2jbi_80",se="_summaryCardActive_q2jbi_94",ce="_summaryIcon_q2jbi_99",re="_summaryCount_q2jbi_105",oe="_summaryLabel_q2jbi_112",le="_contextGrid_q2jbi_121",de="_contextRow_q2jbi_127",me="_contextKey_q2jbi_133",ge="_contextValue_q2jbi_141",he="_timelineFilter_q2jbi_149",ue="_filterLabel_q2jbi_156",ye="_filterSelect_q2jbi_162",fe="_timeline_q2jbi_149",xe="_timelineEntry_q2jbi_182",pe="_timelineTime_q2jbi_199",je="_timelineIcon_q2jbi_207",_e="_timelineBody_q2jbi_212",be="_timelineSummary_q2jbi_217",ve="_timelineTarget_q2jbi_224",Se="_timelineConfidence_q2jbi_231",Ce="_confidenceExact_q2jbi_240",Ne="_confidencePartial_q2jbi_245",Te="_confidenceAfterOnly_q2jbi_250",ke="_confidenceIntentOnly_q2jbi_255",qe="_confidenceUnknown_q2jbi_260",we="_timelineExpanded_q2jbi_266",Ee="_empty_q2jbi_338",Ie="_loading_q2jbi_347",Oe="_error_q2jbi_356",n={page:J,header:W,backLink:Y,headerTitle:Q,headerTime:X,statusActive:Z,statusCompleted:ee,section:te,sectionTitle:ne,summaryGrid:ae,summaryCard:ie,summaryCardActive:se,summaryIcon:ce,summaryCount:re,summaryLabel:oe,contextGrid:le,contextRow:de,contextKey:me,contextValue:ge,timelineFilter:he,filterLabel:ue,filterSelect:ye,timeline:fe,timelineEntry:xe,timelineTime:pe,timelineIcon:je,timelineBody:_e,timelineSummary:be,timelineTarget:ve,timelineConfidence:Se,confidenceExact:Ce,confidencePartial:Ne,confidenceAfterOnly:Te,confidenceIntentOnly:ke,confidenceUnknown:qe,timelineExpanded:we,empty:Ee,loading:Ie,error:Oe},$=[{key:"script",icon:"πŸ“",labelKey:"changelog.category.script"},{key:"instance",icon:"🧱",labelKey:"changelog.category.instance"},{key:"property",icon:"🎨",labelKey:"changelog.category.property"},{key:"lighting",icon:"πŸŒ…",labelKey:"changelog.category.lighting"},{key:"terrain",icon:"⛰️",labelKey:"changelog.category.terrain"},{key:"asset",icon:"πŸ“¦",labelKey:"changelog.category.asset"}];function A(t){if(!t)return"--:--";const s=new Date(t);return`${String(s.getHours()).padStart(2,"0")}:${String(s.getMinutes()).padStart(2,"0")}`}function Le(t){if(!t)return"--:--:--";const s=new Date(t);return`${String(s.getHours()).padStart(2,"0")}:${String(s.getMinutes()).padStart(2,"0")}:${String(s.getSeconds()).padStart(2,"0")}`}function Ae(t,s){if(!t||!s)return"";const l=new Date(s).getTime()-new Date(t).getTime();return l<0?"":`${Math.round(l/6e4)}min`}function Ke(t){switch(t){case"exact":return n.confidenceExact;case"partial":return n.confidencePartial;case"after-only":return n.confidenceAfterOnly;case"intent-only":return n.confidenceIntentOnly;default:return n.confidenceUnknown}}function Re(t,s){switch(s){case"exact":return t("changelog.detail.confidence.exact","Exact");case"partial":return t("changelog.detail.confidence.partial","Partial");case"after-only":return t("changelog.detail.confidence.afterOnly","After only");case"intent-only":return t("changelog.detail.confidence.intentOnly","Intent only");default:return t("changelog.detail.confidence.unknown","Unknown")}}function $e(t,s){switch(s){case"exact":return t("changelog.detail.confidence.exact.tooltip","Both the before and after state were confirmed for this change.");case"partial":return t("changelog.detail.confidence.partial.tooltip","Only part of the before and after state could be confirmed for this change.");case"after-only":return t("changelog.detail.confidence.afterOnly.tooltip","Only the resulting state after the change could be confirmed.");case"intent-only":return t("changelog.detail.confidence.intentOnly.tooltip","Only the requested action was recorded, not the resulting state.");default:return t("changelog.detail.confidence.unknown.tooltip","This change could not be confidently classified from the available data.")}}function Fe(){var f,x,p,j,_,b,v,S,C,N,T,g,k,h;const{t}=M(),{id:s}=B(),l=D(),a=U(s),[d,u]=r.useState("all"),[q,w]=r.useState(null),y=r.useMemo(()=>[...d==="all"?a.changes:a.changes.filter(c=>c.category===d)].reverse(),[a.changes,d]);if(a.loading)return e.jsx("div",{className:n.loading,children:t("common.loading","Loading...")});if(a.error)return e.jsxs("div",{className:n.error,children:[a.error,e.jsx("br",{}),e.jsxs("span",{className:n.backLink,onClick:()=>l("/changelog"),children:["←"," ",t("changelog.detail.backToList","Back to list")]})]});const E=Ae(a.startTime,a.endTime),I=a.endTime?`${A(a.startTime)} β†’ ${A(a.endTime)} (${E})`:`${A(a.startTime)} β†’ ${t("changelog.card.inProgress","in progress")}`,O=!!((f=a.contextSummary)!=null&&f.intent||(x=a.contextSummary)!=null&&x.testScenario||(p=a.contextSummary)!=null&&p.expectedBehavior||(j=a.contextSummary)!=null&&j.observedBehavior),L=!!((_=a.verificationSummary)!=null&&_.label||(b=a.verificationSummary)!=null&&b.status||(v=a.verificationSummary)!=null&&v.testTimestamp);return e.jsxs("div",{className:n.page,children:[e.jsxs("div",{className:n.header,children:[e.jsxs("span",{className:n.backLink,onClick:()=>l("/changelog"),children:["←"," ",t("sidebar.changelog","Changelog")]}),e.jsx("span",{className:n.headerTitle,children:"|"}),e.jsx("span",{className:n.headerTime,children:I}),e.jsx(m,{text:a.status==="active"?t("changelog.card.active.tooltip","This session is still receiving new game changes."):t("changelog.card.completed.tooltip","This session has ended and no more changes are expected."),children:e.jsx("span",{className:a.status==="active"?n.statusActive:n.statusCompleted,children:a.status==="active"?t("changelog.card.active","Active"):t("changelog.card.completed","Completed")})})]}),e.jsxs("div",{className:n.section,children:[e.jsx("div",{className:n.sectionTitle,children:e.jsx(m,{text:t("changelog.detail.changeSummary.tooltip","Counts of extracted game changes grouped by category for this session."),children:e.jsx("span",{children:t("changelog.detail.changeSummary","Change Summary")})})}),e.jsx("div",{className:n.summaryGrid,children:$.map(i=>{const c=a.changeSummary;let o;switch(i.key){case"script":o=c.scriptsModified+c.scriptsCreated;break;case"instance":o=c.instancesCreated+c.instancesDeleted+c.instancesMoved;break;case"property":o=c.propertiesChanged;break;case"lighting":o=c.lightingChanged?1:0;break;case"terrain":o=c.terrainChanged?1:0;break;case"asset":o=c.assetsInserted;break;default:o=0}const K=d===i.key;return e.jsxs("div",{className:`${n.summaryCard} ${K?n.summaryCardActive:""}`,onClick:()=>u(K?"all":i.key),children:[e.jsx("span",{className:n.summaryIcon,children:i.icon}),e.jsx("div",{className:n.summaryCount,children:o}),e.jsx("div",{className:n.summaryLabel,children:t(i.labelKey,i.key)})]},i.key)})})]}),O&&e.jsxs("div",{className:n.section,children:[e.jsx("div",{className:n.sectionTitle,children:e.jsx(m,{text:t("changelog.detail.context.tooltip","Structured execution context captured for this changelog session."),children:e.jsx("span",{children:t("changelog.detail.context.title","Context Summary")})})}),e.jsxs("div",{className:n.contextGrid,children:[((S=a.contextSummary)==null?void 0:S.intent)&&e.jsxs("div",{className:n.contextRow,children:[e.jsx("span",{className:n.contextKey,children:t("changelog.card.sessionIntent","Session intent")}),e.jsx("span",{className:n.contextValue,children:a.contextSummary.intent})]}),((C=a.contextSummary)==null?void 0:C.testScenario)&&e.jsxs("div",{className:n.contextRow,children:[e.jsx("span",{className:n.contextKey,children:t("playtest.context.why","Why this test ran")}),e.jsx("span",{className:n.contextValue,children:a.contextSummary.testScenario})]}),((N=a.contextSummary)==null?void 0:N.expectedBehavior)&&e.jsxs("div",{className:n.contextRow,children:[e.jsx("span",{className:n.contextKey,children:t("playtest.context.expected","Expected")}),e.jsx("span",{className:n.contextValue,children:a.contextSummary.expectedBehavior})]}),((T=a.contextSummary)==null?void 0:T.observedBehavior)&&e.jsxs("div",{className:n.contextRow,children:[e.jsx("span",{className:n.contextKey,children:t("playtest.context.observed","Observed")}),e.jsx("span",{className:n.contextValue,children:a.contextSummary.observedBehavior})]})]})]}),L&&e.jsxs("div",{className:n.section,children:[e.jsx("div",{className:n.sectionTitle,children:e.jsx(m,{text:t("changelog.detail.verification.tooltip","Verification signals linked to this changelog session."),children:e.jsx("span",{children:t("changelog.detail.verification.title","Verification")})})}),e.jsxs("div",{className:n.contextGrid,children:[((g=a.verificationSummary)==null?void 0:g.label)&&e.jsxs("div",{className:n.contextRow,children:[e.jsx("span",{className:n.contextKey,children:t("changelog.detail.verification.label","Result")}),e.jsx("span",{className:n.contextValue,children:a.verificationSummary.label})]}),((k=a.verificationSummary)==null?void 0:k.status)&&e.jsxs("div",{className:n.contextRow,children:[e.jsx("span",{className:n.contextKey,children:t("changelog.detail.verification.status","Status")}),e.jsx("span",{className:n.contextValue,children:a.verificationSummary.status})]}),((h=a.verificationSummary)==null?void 0:h.testTimestamp)&&e.jsxs("div",{className:n.contextRow,children:[e.jsx("span",{className:n.contextKey,children:t("changelog.detail.verification.timestamp","Recorded at")}),e.jsx("span",{className:n.contextValue,children:a.verificationSummary.testTimestamp})]})]})]}),e.jsxs("div",{className:n.section,children:[e.jsx("div",{className:n.sectionTitle,children:e.jsx(m,{text:t("changelog.detail.changeTimeline.tooltip","Chronological list of extracted game changes for this session."),children:e.jsx("span",{children:t("changelog.detail.changeTimeline","Change Timeline")})})}),e.jsxs("div",{className:n.timelineFilter,children:[e.jsx("span",{className:n.filterLabel,children:e.jsx(V,{label:`${t("changelog.detail.filterCategory","Category")}:`,tooltip:t("changelog.detail.filterCategory.tooltip","Filter the timeline to a single change category.")})}),e.jsxs("select",{className:n.filterSelect,value:d,onChange:i=>u(i.target.value),children:[e.jsx("option",{value:"all",children:t("tools.filter.all","All")}),$.map(i=>e.jsxs("option",{value:i.key,children:[i.icon," ",t(i.labelKey,i.key)]},i.key))]})]}),y.length===0?e.jsx("div",{className:n.empty,children:t("changelog.detail.noChanges","No changes in this category")}):e.jsx("div",{className:n.timeline,children:y.map((i,c)=>{const o=q===c;return e.jsxs("div",{children:[e.jsxs("div",{className:n.timelineEntry,onClick:()=>w(o?null:c),children:[e.jsx("span",{className:n.timelineTime,children:Le(i.timestamp)}),e.jsx("span",{className:n.timelineIcon,children:H(i.category)}),e.jsxs("div",{className:n.timelineBody,children:[e.jsxs("div",{className:n.timelineSummary,children:[i.summary,e.jsx(m,{text:$e(t,i.confidence),children:e.jsx("span",{className:`${n.timelineConfidence} ${Ke(i.confidence)}`,children:Re(t,i.confidence)})})]}),e.jsx("div",{className:n.timelineTarget,children:i.target})]})]}),o&&e.jsx("div",{className:n.timelineExpanded,children:e.jsx(Me,{change:i})})]},c)})})]})]})}function Me({change:t}){return t.category==="script"&&(t.before||t.after)?e.jsx(F,{before:t.before,after:t.after}):t.category==="property"?e.jsx(G,{before:t.before,after:t.after}):t.details?e.jsx("pre",{style:{fontFamily:"var(--font-code)",fontSize:"11px",color:"var(--text-secondary)",margin:0,whiteSpace:"pre-wrap",wordBreak:"break-all"},children:JSON.stringify(t.details,null,2)}):e.jsx("div",{style:{fontFamily:"var(--font-code)",fontSize:"11px",color:"var(--text-muted)"},children:t.target})}export{Fe as Component};
1
+ import{r,a as R,u as M,b as B,c as D,j as e,T as m}from"./index-BfvSPSNj.js";import{I as V}from"./InfoLabel-DrK7vhO-.js";import{D as F,P as G}from"./PropertyDiff-Dy3MffNh.js";function P(t){const s={scriptsModified:0,scriptsCreated:0,instancesCreated:0,instancesDeleted:0,instancesMoved:0,propertiesChanged:0,lightingChanged:!1,terrainChanged:!1,assetsInserted:0};for(const l of t)switch(l.category){case"script":l.changeType==="create"?s.scriptsCreated++:s.scriptsModified++;break;case"instance":l.changeType==="create"?s.instancesCreated++:l.changeType==="delete"?s.instancesDeleted++:l.changeType==="move"&&s.instancesMoved++;break;case"property":s.propertiesChanged++;break;case"lighting":s.lightingChanged=!0;break;case"terrain":s.terrainChanged=!0;break;case"asset":s.assetsInserted++;break}return s}function U(t){const[s,l]=r.useState(""),[a,d]=r.useState(""),[u,q]=r.useState(),[w,y]=r.useState("completed"),[E,I]=r.useState([]),[O,L]=r.useState([]),[f,x]=r.useState([]),[p,j]=r.useState(),[_,b]=r.useState(),[v,S]=r.useState(),[C,N]=r.useState({scriptsModified:0,scriptsCreated:0,instancesCreated:0,instancesDeleted:0,instancesMoved:0,propertiesChanged:0,lightingChanged:!1,terrainChanged:!1,assetsInserted:0}),[T,g]=r.useState(!0),[k,h]=r.useState(null),i=r.useCallback(async()=>{if(t){g(!0),h(null);try{const[c,o]=await Promise.all([R.get(`/api/dashboard/changelog/${t}`),R.get(`/api/dashboard/changelog/${t}/changes`)]);l(c.entryId),d(c.startTime),q(c.endTime),y(c.status),I(c.entries),L(c.failures),j(c.contextSummary),b(c.replayMetadata),S(c.verificationSummary),x(o.changes),N(P(o.changes))}catch(c){h(c instanceof Error?c.message:"Failed to load changelog detail")}finally{g(!1)}}},[t]);return r.useEffect(()=>{i()},[i]),{entryId:s,startTime:a,endTime:u,status:w,entries:E,failures:O,changes:f,changeSummary:C,contextSummary:p,replayMetadata:_,verificationSummary:v,loading:T,error:k,refresh:i}}const z={script:"πŸ“",instance:"🧱",property:"🎨",lighting:"πŸŒ…",terrain:"⛰️",asset:"πŸ“¦"};function H(t){return z[t]??"❓"}const J="_page_q2jbi_2",W="_header_q2jbi_10",Y="_backLink_q2jbi_16",Q="_headerTitle_q2jbi_29",X="_headerTime_q2jbi_37",Z="_statusActive_q2jbi_44",ee="_statusCompleted_q2jbi_49",te="_section_q2jbi_54",ne="_sectionTitle_q2jbi_61",ae="_summaryGrid_q2jbi_74",ie="_summaryCard_q2jbi_80",se="_summaryCardActive_q2jbi_94",ce="_summaryIcon_q2jbi_99",re="_summaryCount_q2jbi_105",oe="_summaryLabel_q2jbi_112",le="_contextGrid_q2jbi_121",de="_contextRow_q2jbi_127",me="_contextKey_q2jbi_133",ge="_contextValue_q2jbi_141",he="_timelineFilter_q2jbi_149",ue="_filterLabel_q2jbi_156",ye="_filterSelect_q2jbi_162",fe="_timeline_q2jbi_149",xe="_timelineEntry_q2jbi_182",pe="_timelineTime_q2jbi_199",je="_timelineIcon_q2jbi_207",_e="_timelineBody_q2jbi_212",be="_timelineSummary_q2jbi_217",ve="_timelineTarget_q2jbi_224",Se="_timelineConfidence_q2jbi_231",Ce="_confidenceExact_q2jbi_240",Ne="_confidencePartial_q2jbi_245",Te="_confidenceAfterOnly_q2jbi_250",ke="_confidenceIntentOnly_q2jbi_255",qe="_confidenceUnknown_q2jbi_260",we="_timelineExpanded_q2jbi_266",Ee="_empty_q2jbi_338",Ie="_loading_q2jbi_347",Oe="_error_q2jbi_356",n={page:J,header:W,backLink:Y,headerTitle:Q,headerTime:X,statusActive:Z,statusCompleted:ee,section:te,sectionTitle:ne,summaryGrid:ae,summaryCard:ie,summaryCardActive:se,summaryIcon:ce,summaryCount:re,summaryLabel:oe,contextGrid:le,contextRow:de,contextKey:me,contextValue:ge,timelineFilter:he,filterLabel:ue,filterSelect:ye,timeline:fe,timelineEntry:xe,timelineTime:pe,timelineIcon:je,timelineBody:_e,timelineSummary:be,timelineTarget:ve,timelineConfidence:Se,confidenceExact:Ce,confidencePartial:Ne,confidenceAfterOnly:Te,confidenceIntentOnly:ke,confidenceUnknown:qe,timelineExpanded:we,empty:Ee,loading:Ie,error:Oe},$=[{key:"script",icon:"πŸ“",labelKey:"changelog.category.script"},{key:"instance",icon:"🧱",labelKey:"changelog.category.instance"},{key:"property",icon:"🎨",labelKey:"changelog.category.property"},{key:"lighting",icon:"πŸŒ…",labelKey:"changelog.category.lighting"},{key:"terrain",icon:"⛰️",labelKey:"changelog.category.terrain"},{key:"asset",icon:"πŸ“¦",labelKey:"changelog.category.asset"}];function A(t){if(!t)return"--:--";const s=new Date(t);return`${String(s.getHours()).padStart(2,"0")}:${String(s.getMinutes()).padStart(2,"0")}`}function Le(t){if(!t)return"--:--:--";const s=new Date(t);return`${String(s.getHours()).padStart(2,"0")}:${String(s.getMinutes()).padStart(2,"0")}:${String(s.getSeconds()).padStart(2,"0")}`}function Ae(t,s){if(!t||!s)return"";const l=new Date(s).getTime()-new Date(t).getTime();return l<0?"":`${Math.round(l/6e4)}min`}function Ke(t){switch(t){case"exact":return n.confidenceExact;case"partial":return n.confidencePartial;case"after-only":return n.confidenceAfterOnly;case"intent-only":return n.confidenceIntentOnly;default:return n.confidenceUnknown}}function Re(t,s){switch(s){case"exact":return t("changelog.detail.confidence.exact","Exact");case"partial":return t("changelog.detail.confidence.partial","Partial");case"after-only":return t("changelog.detail.confidence.afterOnly","After only");case"intent-only":return t("changelog.detail.confidence.intentOnly","Intent only");default:return t("changelog.detail.confidence.unknown","Unknown")}}function $e(t,s){switch(s){case"exact":return t("changelog.detail.confidence.exact.tooltip","Both the before and after state were confirmed for this change.");case"partial":return t("changelog.detail.confidence.partial.tooltip","Only part of the before and after state could be confirmed for this change.");case"after-only":return t("changelog.detail.confidence.afterOnly.tooltip","Only the resulting state after the change could be confirmed.");case"intent-only":return t("changelog.detail.confidence.intentOnly.tooltip","Only the requested action was recorded, not the resulting state.");default:return t("changelog.detail.confidence.unknown.tooltip","This change could not be confidently classified from the available data.")}}function Fe(){var f,x,p,j,_,b,v,S,C,N,T,g,k,h;const{t}=M(),{id:s}=B(),l=D(),a=U(s),[d,u]=r.useState("all"),[q,w]=r.useState(null),y=r.useMemo(()=>[...d==="all"?a.changes:a.changes.filter(c=>c.category===d)].reverse(),[a.changes,d]);if(a.loading)return e.jsx("div",{className:n.loading,children:t("common.loading","Loading...")});if(a.error)return e.jsxs("div",{className:n.error,children:[a.error,e.jsx("br",{}),e.jsxs("span",{className:n.backLink,onClick:()=>l("/changelog"),children:["←"," ",t("changelog.detail.backToList","Back to list")]})]});const E=Ae(a.startTime,a.endTime),I=a.endTime?`${A(a.startTime)} β†’ ${A(a.endTime)} (${E})`:`${A(a.startTime)} β†’ ${t("changelog.card.inProgress","in progress")}`,O=!!((f=a.contextSummary)!=null&&f.intent||(x=a.contextSummary)!=null&&x.testScenario||(p=a.contextSummary)!=null&&p.expectedBehavior||(j=a.contextSummary)!=null&&j.observedBehavior),L=!!((_=a.verificationSummary)!=null&&_.label||(b=a.verificationSummary)!=null&&b.status||(v=a.verificationSummary)!=null&&v.testTimestamp);return e.jsxs("div",{className:n.page,children:[e.jsxs("div",{className:n.header,children:[e.jsxs("span",{className:n.backLink,onClick:()=>l("/changelog"),children:["←"," ",t("sidebar.changelog","Changelog")]}),e.jsx("span",{className:n.headerTitle,children:"|"}),e.jsx("span",{className:n.headerTime,children:I}),e.jsx(m,{text:a.status==="active"?t("changelog.card.active.tooltip","This session is still receiving new game changes."):t("changelog.card.completed.tooltip","This session has ended and no more changes are expected."),children:e.jsx("span",{className:a.status==="active"?n.statusActive:n.statusCompleted,children:a.status==="active"?t("changelog.card.active","Active"):t("changelog.card.completed","Completed")})})]}),e.jsxs("div",{className:n.section,children:[e.jsx("div",{className:n.sectionTitle,children:e.jsx(m,{text:t("changelog.detail.changeSummary.tooltip","Counts of extracted game changes grouped by category for this session."),children:e.jsx("span",{children:t("changelog.detail.changeSummary","Change Summary")})})}),e.jsx("div",{className:n.summaryGrid,children:$.map(i=>{const c=a.changeSummary;let o;switch(i.key){case"script":o=c.scriptsModified+c.scriptsCreated;break;case"instance":o=c.instancesCreated+c.instancesDeleted+c.instancesMoved;break;case"property":o=c.propertiesChanged;break;case"lighting":o=c.lightingChanged?1:0;break;case"terrain":o=c.terrainChanged?1:0;break;case"asset":o=c.assetsInserted;break;default:o=0}const K=d===i.key;return e.jsxs("div",{className:`${n.summaryCard} ${K?n.summaryCardActive:""}`,onClick:()=>u(K?"all":i.key),children:[e.jsx("span",{className:n.summaryIcon,children:i.icon}),e.jsx("div",{className:n.summaryCount,children:o}),e.jsx("div",{className:n.summaryLabel,children:t(i.labelKey,i.key)})]},i.key)})})]}),O&&e.jsxs("div",{className:n.section,children:[e.jsx("div",{className:n.sectionTitle,children:e.jsx(m,{text:t("changelog.detail.context.tooltip","Structured execution context captured for this changelog session."),children:e.jsx("span",{children:t("changelog.detail.context.title","Context Summary")})})}),e.jsxs("div",{className:n.contextGrid,children:[((S=a.contextSummary)==null?void 0:S.intent)&&e.jsxs("div",{className:n.contextRow,children:[e.jsx("span",{className:n.contextKey,children:t("changelog.card.sessionIntent","Session intent")}),e.jsx("span",{className:n.contextValue,children:a.contextSummary.intent})]}),((C=a.contextSummary)==null?void 0:C.testScenario)&&e.jsxs("div",{className:n.contextRow,children:[e.jsx("span",{className:n.contextKey,children:t("playtest.context.why","Why this test ran")}),e.jsx("span",{className:n.contextValue,children:a.contextSummary.testScenario})]}),((N=a.contextSummary)==null?void 0:N.expectedBehavior)&&e.jsxs("div",{className:n.contextRow,children:[e.jsx("span",{className:n.contextKey,children:t("playtest.context.expected","Expected")}),e.jsx("span",{className:n.contextValue,children:a.contextSummary.expectedBehavior})]}),((T=a.contextSummary)==null?void 0:T.observedBehavior)&&e.jsxs("div",{className:n.contextRow,children:[e.jsx("span",{className:n.contextKey,children:t("playtest.context.observed","Observed")}),e.jsx("span",{className:n.contextValue,children:a.contextSummary.observedBehavior})]})]})]}),L&&e.jsxs("div",{className:n.section,children:[e.jsx("div",{className:n.sectionTitle,children:e.jsx(m,{text:t("changelog.detail.verification.tooltip","Verification signals linked to this changelog session."),children:e.jsx("span",{children:t("changelog.detail.verification.title","Verification")})})}),e.jsxs("div",{className:n.contextGrid,children:[((g=a.verificationSummary)==null?void 0:g.label)&&e.jsxs("div",{className:n.contextRow,children:[e.jsx("span",{className:n.contextKey,children:t("changelog.detail.verification.label","Result")}),e.jsx("span",{className:n.contextValue,children:a.verificationSummary.label})]}),((k=a.verificationSummary)==null?void 0:k.status)&&e.jsxs("div",{className:n.contextRow,children:[e.jsx("span",{className:n.contextKey,children:t("changelog.detail.verification.status","Status")}),e.jsx("span",{className:n.contextValue,children:a.verificationSummary.status})]}),((h=a.verificationSummary)==null?void 0:h.testTimestamp)&&e.jsxs("div",{className:n.contextRow,children:[e.jsx("span",{className:n.contextKey,children:t("changelog.detail.verification.timestamp","Recorded at")}),e.jsx("span",{className:n.contextValue,children:a.verificationSummary.testTimestamp})]})]})]}),e.jsxs("div",{className:n.section,children:[e.jsx("div",{className:n.sectionTitle,children:e.jsx(m,{text:t("changelog.detail.changeTimeline.tooltip","Chronological list of extracted game changes for this session."),children:e.jsx("span",{children:t("changelog.detail.changeTimeline","Change Timeline")})})}),e.jsxs("div",{className:n.timelineFilter,children:[e.jsx("span",{className:n.filterLabel,children:e.jsx(V,{label:`${t("changelog.detail.filterCategory","Category")}:`,tooltip:t("changelog.detail.filterCategory.tooltip","Filter the timeline to a single change category.")})}),e.jsxs("select",{className:n.filterSelect,value:d,onChange:i=>u(i.target.value),children:[e.jsx("option",{value:"all",children:t("tools.filter.all","All")}),$.map(i=>e.jsxs("option",{value:i.key,children:[i.icon," ",t(i.labelKey,i.key)]},i.key))]})]}),y.length===0?e.jsx("div",{className:n.empty,children:t("changelog.detail.noChanges","No changes in this category")}):e.jsx("div",{className:n.timeline,children:y.map((i,c)=>{const o=q===c;return e.jsxs("div",{children:[e.jsxs("div",{className:n.timelineEntry,onClick:()=>w(o?null:c),children:[e.jsx("span",{className:n.timelineTime,children:Le(i.timestamp)}),e.jsx("span",{className:n.timelineIcon,children:H(i.category)}),e.jsxs("div",{className:n.timelineBody,children:[e.jsxs("div",{className:n.timelineSummary,children:[i.summary,e.jsx(m,{text:$e(t,i.confidence),children:e.jsx("span",{className:`${n.timelineConfidence} ${Ke(i.confidence)}`,children:Re(t,i.confidence)})})]}),e.jsx("div",{className:n.timelineTarget,children:i.target})]})]}),o&&e.jsx("div",{className:n.timelineExpanded,children:e.jsx(Me,{change:i})})]},c)})})]})]})}function Me({change:t}){return t.category==="script"&&(t.before||t.after)?e.jsx(F,{before:t.before,after:t.after}):t.category==="property"?e.jsx(G,{before:t.before,after:t.after}):t.details?e.jsx("pre",{style:{fontFamily:"var(--font-code)",fontSize:"11px",color:"var(--text-secondary)",margin:0,whiteSpace:"pre-wrap",wordBreak:"break-all"},children:JSON.stringify(t.details,null,2)}):e.jsx("div",{style:{fontFamily:"var(--font-code)",fontSize:"11px",color:"var(--text-muted)"},children:t.target})}export{Fe as Component};
@@ -1 +1 @@
1
- import{r as i,a as D,D as O,u as F,j as e,T as I,c as V,i as U}from"./index-aMbdHsW4.js";import{C as G}from"./ConfirmModal-BqqXDrdf.js";import{u as H,T as Z,D as W,a as q}from"./TierComparison-Ct-fbCs5.js";import{t as d}from"./TierPromo.module-CAoUYgIx.js";const z=10;function J(){const[t,p]=i.useState([]),[s,a]=i.useState(0),[u,f]=i.useState(!1),[r,v]=i.useState(!0),[l,C]=i.useState(0),[g,j]=i.useState("all"),b=i.useRef(null),x=i.useCallback(async(h,o)=>{v(!0);try{const S={limit:String(z),offset:String(h)};o!=="all"&&(S.status=o);const N=await D.get("/api/dashboard/changelog",S);p(N.entries),a(N.total),f(N.hasMore)}catch{p([]),a(0),f(!1)}finally{v(!1)}},[]),y=i.useCallback(()=>{x(l,g)},[x,l,g]),_=i.useCallback(async()=>{await D.post("/api/dashboard/changelog/clear"),p([]),a(0),f(!1)},[]);return i.useEffect(()=>{x(l,g)},[x,l,g]),i.useEffect(()=>{const h=new O;b.current=h,h.connect();const o=h.on("command",()=>{x(l,g)});return()=>{o(),h.disconnect(),b.current=null}},[x,l,g]),{entries:t,total:s,hasMore:u,loading:r,offset:l,statusFilter:g,setOffset:C,setStatusFilter:j,refresh:y,clear:_}}const K="_card_1n89u_2",Q="_header_1n89u_17",X="_statusBadge_1n89u_24",Y="_statusDot_1n89u_35",ee="_active_1n89u_41",se="_completed_1n89u_50",te="_timeRange_1n89u_58",ae="_summaryList_1n89u_65",ne="_summaryItem_1n89u_71",oe="_summaryIcon_1n89u_80",ce="_summaryText_1n89u_86",ie="_progressBar_1n89u_91",re="_progressFill_1n89u_99",le="_emptySummary_1n89u_112",de="_contextBlock_1n89u_120",ge="_contextLabel_1n89u_129",me="_contextValue_1n89u_137",n={card:K,header:Q,statusBadge:X,statusDot:Y,active:ee,completed:se,timeRange:te,summaryList:ae,summaryItem:ne,summaryIcon:oe,summaryText:ce,progressBar:ie,progressFill:re,emptySummary:le,contextBlock:de,contextLabel:ge,contextValue:me};function E(t){if(!t)return"--:--";const p=new Date(t);return`${String(p.getHours()).padStart(2,"0")}:${String(p.getMinutes()).padStart(2,"0")}`}function he({entry:t,onClick:p}){var S,N,k,B,L,w,A,M,R,P;const{t:s}=F(),a=t.changeSummary,u=t.status==="active",f=t.isBootstrapOnly===!0,r=[],v=a.scriptsModified+a.scriptsCreated;if(v>0){const m=[];a.scriptsModified>0&&m.push(`${a.scriptsModified} ${s("changelog.card.modified","modified")}`),a.scriptsCreated>0&&m.push(`${a.scriptsCreated} ${s("changelog.card.created","created")}`);const T=`${v} ${s("changelog.card.scripts","scripts")} ${m.join(", ")}`;r.push({icon:"πŸ“",text:T,tooltip:s("changelog.card.scripts.tooltip","Script changes made in this session.")})}const l=a.instancesCreated+a.instancesDeleted+a.instancesMoved;if(l>0){const m=[];a.instancesCreated>0&&m.push(`${a.instancesCreated} ${s("changelog.card.created","created")}`),a.instancesDeleted>0&&m.push(`${a.instancesDeleted} ${s("changelog.card.deleted","deleted")}`),a.instancesMoved>0&&m.push(`${a.instancesMoved} ${s("changelog.card.moved","moved")}`);const T=`${l} ${s("changelog.card.instances","instances")} ${m.join(", ")}`;r.push({icon:"🧱",text:T,tooltip:s("changelog.card.instances.tooltip","Instance create, delete, move, or clone changes in this session.")})}a.propertiesChanged>0&&r.push({icon:"🎨",text:`${a.propertiesChanged} ${s("changelog.card.propertiesChanged","properties changed")}`,tooltip:s("changelog.card.propertiesChanged.tooltip","Property value changes recorded for this session.")}),a.lightingChanged&&r.push({icon:"πŸŒ…",text:s("changelog.card.lightingConfigured","Lighting configured"),tooltip:s("changelog.card.lightingConfigured.tooltip","Lighting or atmosphere settings changed in this session.")}),a.terrainChanged&&r.push({icon:"⛰️",text:s("changelog.card.terrainConfigured","Terrain configured"),tooltip:s("changelog.card.terrainConfigured.tooltip","Terrain data or terrain settings changed in this session.")}),a.assetsInserted>0&&r.push({icon:"πŸ“¦",text:`${a.assetsInserted} ${s("changelog.card.assetsInserted","assets inserted")}`,tooltip:s("changelog.card.assetsInserted.tooltip","Assets inserted into the place during this session.")});const C=E(t.startTime),g=u?s("changelog.card.inProgress","in progress"):t.endTime?E(t.endTime):"--:--",j=f?s("changelog.card.bootstrapStatus","Bootstrap"):u?s("changelog.card.active","Active"):s("changelog.card.completed","Completed"),b=f?s("changelog.card.bootstrapStatus.tooltip","This session only contains the initial sync bootstrap snapshot."):u?s("changelog.card.active.tooltip","This session is still receiving new game changes."):s("changelog.card.completed.tooltip","This session has ended and no more changes are expected."),x=f?s("changelog.card.bootstrapSummary","Initial sync snapshot"):s("changelog.card.noChanges","No changes yet"),y=f?s("changelog.card.bootstrapSummary.tooltip","Initial file sync writes are collapsed into a single bootstrap snapshot row."):s("changelog.card.noChanges.tooltip","No game changes have been extracted for this session yet."),_=(N=(S=t.contextSummary)==null?void 0:S.intent)==null?void 0:N.trim(),h=((w=(L=(B=(k=t.contextSummary)==null?void 0:k.affectedAreas)==null?void 0:B[0])==null?void 0:L.label)==null?void 0:w.trim())||((M=(A=t.contextSummary)==null?void 0:A.testScenario)==null?void 0:M.trim()),o=(P=(R=t.verificationSummary)==null?void 0:R.label)==null?void 0:P.trim();return e.jsxs("div",{className:n.card,onClick:p,children:[e.jsxs("div",{className:n.header,children:[e.jsx(I,{text:b,children:e.jsxs("span",{className:`${n.statusBadge} ${u?n.active:n.completed}`,children:[e.jsx("span",{className:n.statusDot}),j]})}),e.jsxs("span",{className:n.timeRange,children:[C,"~",g]})]}),e.jsx("div",{className:n.summaryList,children:r.length>0?r.map((m,T)=>e.jsxs("div",{className:n.summaryItem,children:[e.jsx("span",{className:n.summaryIcon,children:m.icon}),e.jsx(I,{text:m.tooltip,children:e.jsx("span",{className:n.summaryText,children:m.text})})]},T)):e.jsx(I,{text:y,children:e.jsx("span",{className:n.emptySummary,style:{display:"block"},children:x})})}),_&&e.jsxs("div",{className:n.contextBlock,children:[e.jsx("span",{className:n.contextLabel,children:s("changelog.card.sessionIntent","Session intent")}),e.jsx("span",{className:n.contextValue,children:_})]}),!_&&h&&e.jsxs("div",{className:n.contextBlock,children:[e.jsx("span",{className:n.contextLabel,children:s("changelog.card.representativeArea","Representative area")}),e.jsx("span",{className:n.contextValue,children:h})]}),o&&e.jsxs("div",{className:n.contextBlock,children:[e.jsx("span",{className:n.contextLabel,children:s("changelog.card.verification","Verification")}),e.jsx("span",{className:n.contextValue,children:o})]}),u&&e.jsx("div",{className:n.progressBar,children:e.jsx("div",{className:n.progressFill})})]})}const pe="_page_1srvj_2",ue="_limitNotice_1srvj_9",fe="_limitNoticeTitle_1srvj_18",xe="_limitNoticeText_1srvj_25",_e="_headerRow_1srvj_31",ve="_header_1srvj_31",je="_clearButton_1srvj_48",be="_headerSub_1srvj_57",ye="_filterTabs_1srvj_67",Ne="_filterTab_1srvj_67",Ce="_filterTabActive_1srvj_90",Se="_list_1srvj_96",Te="_empty_1srvj_103",$e="_loading_1srvj_112",Ie="_pagination_1srvj_121",ke="_pageInfo_1srvj_129",Be="_btn_1srvj_135",c={page:pe,limitNotice:ue,limitNoticeTitle:fe,limitNoticeText:xe,headerRow:_e,header:ve,clearButton:je,headerSub:be,filterTabs:ye,filterTab:Ne,filterTabActive:Ce,list:Se,empty:Te,loading:$e,pagination:Ie,pageInfo:ke,btn:Be},$=10,Le=[{key:"all",label:"changelog.filter.all"},{key:"active",label:"changelog.filter.active"},{key:"completed",label:"changelog.filter.completed"}];function Pe(){const{t}=F(),p=V(),s=J(),a=H(),{show:u}=U(),[f,r]=i.useState(!1),[v,l]=i.useState(!1),[C,g]=i.useState(!1),j=!a.loading&&a.tier==="basic",b=j?s.entries.slice(0,3):s.entries,x=!j&&s.total>$,y=b.length,_=s.total,h=async()=>{l(!0);try{await s.clear(),u(t("toast.clearSuccess","Cleared successfully"),"success"),r(!1)}catch{u(t("toast.clearFailed","Failed to clear data"),"error")}finally{l(!1)}};return e.jsxs("div",{className:c.page,children:[e.jsxs("div",{className:c.headerRow,children:[e.jsxs("h2",{className:c.header,children:[t("sidebar.changelog","Changelog"),e.jsx("span",{className:c.headerSub,children:t("changelog.subtitle","Game Change History")})]}),e.jsx("button",{className:c.clearButton,onClick:()=>r(!0),children:t("common.clear","Clear")})]}),e.jsx("div",{className:c.filterTabs,children:Le.map(o=>e.jsx("button",{className:`${c.filterTab} ${s.statusFilter===o.key?c.filterTabActive:""}`,onClick:()=>{s.setStatusFilter(o.key),s.setOffset(0)},children:t(o.label,o.key.charAt(0).toUpperCase()+o.key.slice(1))},o.key))}),s.loading&&s.entries.length===0&&e.jsx("div",{className:c.loading,children:t("common.loading","Loading...")}),!s.loading&&s.entries.length===0?e.jsx("div",{className:c.empty,children:t("changelog.empty","No changelog entries yet")}):e.jsx("div",{className:c.list,children:b.map(o=>e.jsx(he,{entry:o,onClick:()=>p(`/changelog/${o.entryId}`)},o.entryId))}),x&&e.jsxs("div",{className:c.pagination,children:[e.jsx("button",{className:c.btn,disabled:s.offset===0,onClick:()=>s.setOffset(Math.max(0,s.offset-$)),children:t("tools.page.prev","Prev")}),e.jsxs("span",{className:c.pageInfo,children:[s.offset+1,"–",Math.min(s.offset+$,s.total)," / ",s.total]}),e.jsx("button",{className:c.btn,disabled:!s.hasMore,onClick:()=>s.setOffset(s.offset+$),children:t("tools.page.next","Next")})]}),j&&e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:c.limitNotice,children:[e.jsx("div",{className:c.limitNoticeTitle,children:t("changelog.basic.limit.title","Basic preview shows the latest 3 sessions")}),e.jsx("div",{className:c.limitNoticeText,children:t("changelog.basic.limit.body","Upgrade to Pro to browse the full changelog timeline for this place.")})]}),e.jsxs("div",{className:d.progressPromoWrap,children:[e.jsxs("div",{className:d.progressPromo,children:[e.jsxs("div",{className:d.progressMain,children:[e.jsxs("div",{className:d.progressLabel,children:[e.jsx("span",{children:t("changelog.basic.metricLabel","Visible Changelog / Total")}),e.jsxs("span",{children:[y," / ",_]})]}),e.jsx("div",{className:d.progressBar,children:e.jsx("div",{className:d.progressFill,style:{width:`${_>0?Math.min(y/_*100,100):0}%`}})}),e.jsxs("div",{className:d.progressLabel,children:[e.jsxs("span",{children:[y," ",t("changelog.basic.visible","visible")]}),e.jsxs("span",{children:[_," ",t("changelog.basic.total","total")]})]})]}),e.jsx("span",{className:d.progressText,children:t("tier.banner.save","Save AI tokens with Pro!")}),e.jsxs("div",{className:d.actions,children:[e.jsx("button",{className:`${d.btn} ${d.btnOutline}`,onClick:()=>g(!0),children:t("tier.compare","Basic vs Pro")}),e.jsx("a",{className:`${d.btn} ${d.btnPrimary}`,href:Z.changelog,target:"_blank",rel:"noreferrer",children:t("tier.upgrade","Upgrade to Pro")})]})]}),e.jsx(W,{variant:"centered"})]})]}),e.jsx(G,{open:f,title:t("changelog.clear.title","Clear changelog?"),message:t("changelog.clear.message","This permanently removes the stored changelog for the current place."),cancelLabel:t("common.cancel","Cancel"),confirmLabel:t("common.clear","Clear"),loading:v,onCancel:()=>!v&&r(!1),onConfirm:h}),C&&e.jsx(q,{onClose:()=>g(!1)})]})}export{Pe as Component};
1
+ import{r as i,a as D,D as O,u as F,j as e,T as I,c as V,i as U}from"./index-BfvSPSNj.js";import{C as G}from"./ConfirmModal-DfdyAPrJ.js";import{u as H,T as Z,D as W,a as q}from"./TierComparison-BwKqP_4s.js";import{t as d}from"./TierPromo.module-CAoUYgIx.js";const z=10;function J(){const[t,p]=i.useState([]),[s,a]=i.useState(0),[u,f]=i.useState(!1),[r,v]=i.useState(!0),[l,C]=i.useState(0),[g,j]=i.useState("all"),b=i.useRef(null),x=i.useCallback(async(h,o)=>{v(!0);try{const S={limit:String(z),offset:String(h)};o!=="all"&&(S.status=o);const N=await D.get("/api/dashboard/changelog",S);p(N.entries),a(N.total),f(N.hasMore)}catch{p([]),a(0),f(!1)}finally{v(!1)}},[]),y=i.useCallback(()=>{x(l,g)},[x,l,g]),_=i.useCallback(async()=>{await D.post("/api/dashboard/changelog/clear"),p([]),a(0),f(!1)},[]);return i.useEffect(()=>{x(l,g)},[x,l,g]),i.useEffect(()=>{const h=new O;b.current=h,h.connect();const o=h.on("command",()=>{x(l,g)});return()=>{o(),h.disconnect(),b.current=null}},[x,l,g]),{entries:t,total:s,hasMore:u,loading:r,offset:l,statusFilter:g,setOffset:C,setStatusFilter:j,refresh:y,clear:_}}const K="_card_1n89u_2",Q="_header_1n89u_17",X="_statusBadge_1n89u_24",Y="_statusDot_1n89u_35",ee="_active_1n89u_41",se="_completed_1n89u_50",te="_timeRange_1n89u_58",ae="_summaryList_1n89u_65",ne="_summaryItem_1n89u_71",oe="_summaryIcon_1n89u_80",ce="_summaryText_1n89u_86",ie="_progressBar_1n89u_91",re="_progressFill_1n89u_99",le="_emptySummary_1n89u_112",de="_contextBlock_1n89u_120",ge="_contextLabel_1n89u_129",me="_contextValue_1n89u_137",n={card:K,header:Q,statusBadge:X,statusDot:Y,active:ee,completed:se,timeRange:te,summaryList:ae,summaryItem:ne,summaryIcon:oe,summaryText:ce,progressBar:ie,progressFill:re,emptySummary:le,contextBlock:de,contextLabel:ge,contextValue:me};function E(t){if(!t)return"--:--";const p=new Date(t);return`${String(p.getHours()).padStart(2,"0")}:${String(p.getMinutes()).padStart(2,"0")}`}function he({entry:t,onClick:p}){var S,N,k,B,L,w,A,M,R,P;const{t:s}=F(),a=t.changeSummary,u=t.status==="active",f=t.isBootstrapOnly===!0,r=[],v=a.scriptsModified+a.scriptsCreated;if(v>0){const m=[];a.scriptsModified>0&&m.push(`${a.scriptsModified} ${s("changelog.card.modified","modified")}`),a.scriptsCreated>0&&m.push(`${a.scriptsCreated} ${s("changelog.card.created","created")}`);const T=`${v} ${s("changelog.card.scripts","scripts")} ${m.join(", ")}`;r.push({icon:"πŸ“",text:T,tooltip:s("changelog.card.scripts.tooltip","Script changes made in this session.")})}const l=a.instancesCreated+a.instancesDeleted+a.instancesMoved;if(l>0){const m=[];a.instancesCreated>0&&m.push(`${a.instancesCreated} ${s("changelog.card.created","created")}`),a.instancesDeleted>0&&m.push(`${a.instancesDeleted} ${s("changelog.card.deleted","deleted")}`),a.instancesMoved>0&&m.push(`${a.instancesMoved} ${s("changelog.card.moved","moved")}`);const T=`${l} ${s("changelog.card.instances","instances")} ${m.join(", ")}`;r.push({icon:"🧱",text:T,tooltip:s("changelog.card.instances.tooltip","Instance create, delete, move, or clone changes in this session.")})}a.propertiesChanged>0&&r.push({icon:"🎨",text:`${a.propertiesChanged} ${s("changelog.card.propertiesChanged","properties changed")}`,tooltip:s("changelog.card.propertiesChanged.tooltip","Property value changes recorded for this session.")}),a.lightingChanged&&r.push({icon:"πŸŒ…",text:s("changelog.card.lightingConfigured","Lighting configured"),tooltip:s("changelog.card.lightingConfigured.tooltip","Lighting or atmosphere settings changed in this session.")}),a.terrainChanged&&r.push({icon:"⛰️",text:s("changelog.card.terrainConfigured","Terrain configured"),tooltip:s("changelog.card.terrainConfigured.tooltip","Terrain data or terrain settings changed in this session.")}),a.assetsInserted>0&&r.push({icon:"πŸ“¦",text:`${a.assetsInserted} ${s("changelog.card.assetsInserted","assets inserted")}`,tooltip:s("changelog.card.assetsInserted.tooltip","Assets inserted into the place during this session.")});const C=E(t.startTime),g=u?s("changelog.card.inProgress","in progress"):t.endTime?E(t.endTime):"--:--",j=f?s("changelog.card.bootstrapStatus","Bootstrap"):u?s("changelog.card.active","Active"):s("changelog.card.completed","Completed"),b=f?s("changelog.card.bootstrapStatus.tooltip","This session only contains the initial sync bootstrap snapshot."):u?s("changelog.card.active.tooltip","This session is still receiving new game changes."):s("changelog.card.completed.tooltip","This session has ended and no more changes are expected."),x=f?s("changelog.card.bootstrapSummary","Initial sync snapshot"):s("changelog.card.noChanges","No changes yet"),y=f?s("changelog.card.bootstrapSummary.tooltip","Initial file sync writes are collapsed into a single bootstrap snapshot row."):s("changelog.card.noChanges.tooltip","No game changes have been extracted for this session yet."),_=(N=(S=t.contextSummary)==null?void 0:S.intent)==null?void 0:N.trim(),h=((w=(L=(B=(k=t.contextSummary)==null?void 0:k.affectedAreas)==null?void 0:B[0])==null?void 0:L.label)==null?void 0:w.trim())||((M=(A=t.contextSummary)==null?void 0:A.testScenario)==null?void 0:M.trim()),o=(P=(R=t.verificationSummary)==null?void 0:R.label)==null?void 0:P.trim();return e.jsxs("div",{className:n.card,onClick:p,children:[e.jsxs("div",{className:n.header,children:[e.jsx(I,{text:b,children:e.jsxs("span",{className:`${n.statusBadge} ${u?n.active:n.completed}`,children:[e.jsx("span",{className:n.statusDot}),j]})}),e.jsxs("span",{className:n.timeRange,children:[C,"~",g]})]}),e.jsx("div",{className:n.summaryList,children:r.length>0?r.map((m,T)=>e.jsxs("div",{className:n.summaryItem,children:[e.jsx("span",{className:n.summaryIcon,children:m.icon}),e.jsx(I,{text:m.tooltip,children:e.jsx("span",{className:n.summaryText,children:m.text})})]},T)):e.jsx(I,{text:y,children:e.jsx("span",{className:n.emptySummary,style:{display:"block"},children:x})})}),_&&e.jsxs("div",{className:n.contextBlock,children:[e.jsx("span",{className:n.contextLabel,children:s("changelog.card.sessionIntent","Session intent")}),e.jsx("span",{className:n.contextValue,children:_})]}),!_&&h&&e.jsxs("div",{className:n.contextBlock,children:[e.jsx("span",{className:n.contextLabel,children:s("changelog.card.representativeArea","Representative area")}),e.jsx("span",{className:n.contextValue,children:h})]}),o&&e.jsxs("div",{className:n.contextBlock,children:[e.jsx("span",{className:n.contextLabel,children:s("changelog.card.verification","Verification")}),e.jsx("span",{className:n.contextValue,children:o})]}),u&&e.jsx("div",{className:n.progressBar,children:e.jsx("div",{className:n.progressFill})})]})}const pe="_page_1srvj_2",ue="_limitNotice_1srvj_9",fe="_limitNoticeTitle_1srvj_18",xe="_limitNoticeText_1srvj_25",_e="_headerRow_1srvj_31",ve="_header_1srvj_31",je="_clearButton_1srvj_48",be="_headerSub_1srvj_57",ye="_filterTabs_1srvj_67",Ne="_filterTab_1srvj_67",Ce="_filterTabActive_1srvj_90",Se="_list_1srvj_96",Te="_empty_1srvj_103",$e="_loading_1srvj_112",Ie="_pagination_1srvj_121",ke="_pageInfo_1srvj_129",Be="_btn_1srvj_135",c={page:pe,limitNotice:ue,limitNoticeTitle:fe,limitNoticeText:xe,headerRow:_e,header:ve,clearButton:je,headerSub:be,filterTabs:ye,filterTab:Ne,filterTabActive:Ce,list:Se,empty:Te,loading:$e,pagination:Ie,pageInfo:ke,btn:Be},$=10,Le=[{key:"all",label:"changelog.filter.all"},{key:"active",label:"changelog.filter.active"},{key:"completed",label:"changelog.filter.completed"}];function Pe(){const{t}=F(),p=V(),s=J(),a=H(),{show:u}=U(),[f,r]=i.useState(!1),[v,l]=i.useState(!1),[C,g]=i.useState(!1),j=!a.loading&&a.tier==="basic",b=j?s.entries.slice(0,3):s.entries,x=!j&&s.total>$,y=b.length,_=s.total,h=async()=>{l(!0);try{await s.clear(),u(t("toast.clearSuccess","Cleared successfully"),"success"),r(!1)}catch{u(t("toast.clearFailed","Failed to clear data"),"error")}finally{l(!1)}};return e.jsxs("div",{className:c.page,children:[e.jsxs("div",{className:c.headerRow,children:[e.jsxs("h2",{className:c.header,children:[t("sidebar.changelog","Changelog"),e.jsx("span",{className:c.headerSub,children:t("changelog.subtitle","Game Change History")})]}),e.jsx("button",{className:c.clearButton,onClick:()=>r(!0),children:t("common.clear","Clear")})]}),e.jsx("div",{className:c.filterTabs,children:Le.map(o=>e.jsx("button",{className:`${c.filterTab} ${s.statusFilter===o.key?c.filterTabActive:""}`,onClick:()=>{s.setStatusFilter(o.key),s.setOffset(0)},children:t(o.label,o.key.charAt(0).toUpperCase()+o.key.slice(1))},o.key))}),s.loading&&s.entries.length===0&&e.jsx("div",{className:c.loading,children:t("common.loading","Loading...")}),!s.loading&&s.entries.length===0?e.jsx("div",{className:c.empty,children:t("changelog.empty","No changelog entries yet")}):e.jsx("div",{className:c.list,children:b.map(o=>e.jsx(he,{entry:o,onClick:()=>p(`/changelog/${o.entryId}`)},o.entryId))}),x&&e.jsxs("div",{className:c.pagination,children:[e.jsx("button",{className:c.btn,disabled:s.offset===0,onClick:()=>s.setOffset(Math.max(0,s.offset-$)),children:t("tools.page.prev","Prev")}),e.jsxs("span",{className:c.pageInfo,children:[s.offset+1,"–",Math.min(s.offset+$,s.total)," / ",s.total]}),e.jsx("button",{className:c.btn,disabled:!s.hasMore,onClick:()=>s.setOffset(s.offset+$),children:t("tools.page.next","Next")})]}),j&&e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:c.limitNotice,children:[e.jsx("div",{className:c.limitNoticeTitle,children:t("changelog.basic.limit.title","Basic preview shows the latest 3 sessions")}),e.jsx("div",{className:c.limitNoticeText,children:t("changelog.basic.limit.body","Upgrade to Pro to browse the full changelog timeline for this place.")})]}),e.jsxs("div",{className:d.progressPromoWrap,children:[e.jsxs("div",{className:d.progressPromo,children:[e.jsxs("div",{className:d.progressMain,children:[e.jsxs("div",{className:d.progressLabel,children:[e.jsx("span",{children:t("changelog.basic.metricLabel","Visible Changelog / Total")}),e.jsxs("span",{children:[y," / ",_]})]}),e.jsx("div",{className:d.progressBar,children:e.jsx("div",{className:d.progressFill,style:{width:`${_>0?Math.min(y/_*100,100):0}%`}})}),e.jsxs("div",{className:d.progressLabel,children:[e.jsxs("span",{children:[y," ",t("changelog.basic.visible","visible")]}),e.jsxs("span",{children:[_," ",t("changelog.basic.total","total")]})]})]}),e.jsx("span",{className:d.progressText,children:t("tier.banner.save","Save AI tokens with Pro!")}),e.jsxs("div",{className:d.actions,children:[e.jsx("button",{className:`${d.btn} ${d.btnOutline}`,onClick:()=>g(!0),children:t("tier.compare","Basic vs Pro")}),e.jsx("a",{className:`${d.btn} ${d.btnPrimary}`,href:Z.changelog,target:"_blank",rel:"noreferrer",children:t("tier.upgrade","Upgrade to Pro")})]})]}),e.jsx(W,{variant:"centered"})]})]}),e.jsx(G,{open:f,title:t("changelog.clear.title","Clear changelog?"),message:t("changelog.clear.message","This permanently removes the stored changelog for the current place."),cancelLabel:t("common.cancel","Cancel"),confirmLabel:t("common.clear","Clear"),loading:v,onCancel:()=>!v&&r(!1),onConfirm:h}),C&&e.jsx(q,{onClose:()=>g(!1)})]})}export{Pe as Component};
@@ -1 +1 @@
1
- import{j as s,s as e}from"./index-aMbdHsW4.js";function x({open:c,title:i,message:n,cancelLabel:t,confirmLabel:o,loading:a=!1,onCancel:l,onConfirm:r}){return c?s.jsx("div",{className:e.backdrop,onClick:a?void 0:l,children:s.jsxs("div",{className:e.modal,onClick:d=>d.stopPropagation(),children:[s.jsx("h2",{className:e.title,children:i}),s.jsx("p",{className:e.message,children:n}),s.jsxs("div",{className:e.actions,children:[s.jsx("button",{className:e.cancelButton,onClick:l,disabled:a,children:t}),s.jsx("button",{className:e.confirmButton,onClick:r,disabled:a,children:a?"...":o})]})]})}):null}export{x as C};
1
+ import{j as s,s as e}from"./index-BfvSPSNj.js";function x({open:c,title:i,message:n,cancelLabel:t,confirmLabel:o,loading:a=!1,onCancel:l,onConfirm:r}){return c?s.jsx("div",{className:e.backdrop,onClick:a?void 0:l,children:s.jsxs("div",{className:e.modal,onClick:d=>d.stopPropagation(),children:[s.jsx("h2",{className:e.title,children:i}),s.jsx("p",{className:e.message,children:n}),s.jsxs("div",{className:e.actions,children:[s.jsx("button",{className:e.cancelButton,onClick:l,disabled:a,children:t}),s.jsx("button",{className:e.confirmButton,onClick:r,disabled:a,children:a?"...":o})]})]})}):null}export{x as C};
@@ -1 +1 @@
1
- import{u as R,r as i,j as e,d as B,a as w,D as P,i as T,T as D}from"./index-aMbdHsW4.js";import{I as r}from"./InfoLabel-DG5Q_c5f.js";import{S as F}from"./StatusBadge-D-Jxp4ai.js";import{C as $}from"./ConfirmModal-BqqXDrdf.js";import{u as H,f as U}from"./useLiveUptime-BpIv_H68.js";const K="_container_1h084_2",G="_entry_1h084_14",O="_timestamp_1h084_21",V="_message_1h084_27",q="_warn_1h084_34",X="_error_1h084_39",z="_empty_1h084_44",_={container:K,entry:G,timestamp:O,message:V,warn:q,error:X,empty:z};function J(n){const t=new Date(n);return Number.isNaN(t.getTime())?n:`${String(t.getHours()).padStart(2,"0")}:${String(t.getMinutes()).padStart(2,"0")}`}function Q({entries:n}){const{t}=R(),o=i.useRef(null);return i.useEffect(()=>{const l=o.current;l&&(l.scrollTop=l.scrollHeight)},[n.length]),e.jsx("div",{ref:o,className:_.container,children:n.length===0?e.jsx("div",{className:_.empty,children:t("connection.log.empty","No events yet")}):n.map((l,j)=>e.jsxs("div",{className:`${_.entry} ${l.type?_[l.type]:""}`,children:[e.jsx("span",{className:_.timestamp,children:J(l.timestamp)}),e.jsx("span",{className:_.message,children:l.message})]},j))})}const A=50;function W(){const n=new Date;return`${String(n.getHours()).padStart(2,"0")}:${String(n.getMinutes()).padStart(2,"0")}`}function Y(){const{level:n,status:t,error:o}=B(),[l,j]=i.useState(null),[k,v]=i.useState([]),g=i.useRef(null),u=i.useCallback((a,d)=>{v(x=>{const h=[...x,{timestamp:W(),message:a,type:d}];return h.length>A?h.slice(-A):h})},[]),p=i.useCallback(async()=>{try{const a=await w.get("/connection-info");j(a)}catch{j(null)}},[]),y=i.useCallback(async()=>{try{const a=await w.get("/api/dashboard/connection-log");v(a.entries??[])}catch{v([])}},[]),f=i.useCallback(async()=>{await w.post("/api/dashboard/connection-log/clear"),v([])},[]),S=i.useCallback(async a=>{await w.post("/api/dashboard/kill-agent",{instanceId:a}),await p()},[p]);return i.useEffect(()=>{n!=="disconnected"&&t&&p(),y()},[n,t,p,y]),i.useEffect(()=>{const a=new P;g.current=a,a.connect();const d=a.on("connection",h=>{const m=h,b=m.status==="connected"?"connected":"disconnected";u(`Plugin ${b} β€” ${m.clientId}`,m.status==="connected"?"info":"warn")}),x=a.on("mcp_status",h=>{const m=h,b=m.status==="registered"?"registered":"unregistered";u(`MCP ${b} β€” ${m.aiClientName}`,m.status==="registered"?"info":"warn"),p()});return()=>{d(),x(),a.disconnect(),g.current=null}},[u,p]),{status:t,connectionInfo:l,connectionLog:k,level:n,error:o,clearConnectionLog:f,killAgent:S}}const Z="_page_1h5nv_2",ee="_card_1h5nv_10",ne="_disabled_1h5nv_18",te="_cardHeader_1h5nv_24",se="_clearButton_1h5nv_37",ce="_serverGrid_1h5nv_47",oe="_statusRow_1h5nv_65",ie="_metaItem_1h5nv_72",ae="_table_1h5nv_79",le="_toggleBtn_1h5nv_104",re="_disconnected_1h5nv_119",de="_disconnectedActions_1h5nv_136",he="_btn_1h5nv_143",me="_activity_active_1h5nv_161",pe="_activity_stale_1h5nv_162",ge="_activity_unknown_1h5nv_163",ue="_killBtn_1h5nv_187",xe="_emptyRow_1h5nv_206",s={page:Z,card:ee,disabled:ne,cardHeader:te,clearButton:se,serverGrid:ce,statusRow:oe,metaItem:ie,table:ae,toggleBtn:le,disconnected:re,disconnectedActions:de,btn:he,activity_active:me,activity_stale:pe,activity_unknown:ge,killBtn:ue,emptyRow:xe};function N(n,t){const o=Math.max(0,Math.floor((Date.now()-n)/1e3));return o<60?`${o}${t("connection.time.secondsAgo","s ago")}`:o<3600?`${Math.floor(o/60)}${t("connection.time.minutesAgo","m ago")}`:`${Math.floor(o/3600)}${t("connection.time.hoursAgo","h ago")}`}function je(n){return n?Date.now()-n<3e4?"active":"stale":"unknown"}function ye(){var I;const{t:n}=R(),{status:t,connectionInfo:o,connectionLog:l,level:j,clearConnectionLog:k,killAgent:v}=Y(),{show:g}=T(),[u,p]=i.useState(!0),[y,f]=i.useState(!1),[S,a]=i.useState(!1),[d,x]=i.useState(null),[h,m]=i.useState(!1),b=H(t==null?void 0:t.uptime),C=j==="disconnected",L=C?"offline":"online",M=async()=>{if(d){m(!0);try{await v(d.instanceId),g(n("connection.agents.killed","Agent killed"),"success"),x(null)}catch{g(n("connection.agents.killFailed","Failed to kill agent"),"error")}finally{m(!1)}}},E=async()=>{a(!0);try{await k(),g(n("toast.clearSuccess","Cleared successfully"),"success"),f(!1)}catch{g(n("toast.clearFailed","Failed to clear data"),"error")}finally{a(!1)}};return e.jsxs("div",{className:s.page,children:[e.jsxs("div",{className:s.card,children:[e.jsx("div",{className:s.cardHeader,children:n("connection.server.title","Server Status")}),C?e.jsxs("div",{className:s.disconnected,children:[e.jsx("h3",{children:n("level.l0.title")}),e.jsx("p",{children:n("level.l0.message")}),e.jsx("p",{children:n("common.reconnecting")}),e.jsxs("div",{className:s.disconnectedActions,children:[e.jsx("button",{className:s.btn,onClick:()=>window.location.reload(),children:n("connection.reconnect","Reconnect")}),e.jsx("button",{className:s.btn,onClick:()=>{window.location.hash="#/settings"},children:n("connection.checkSettings","Check Settings")})]})]}):e.jsxs(e.Fragment,{children:[e.jsx("div",{className:s.statusRow,children:e.jsx(F,{status:L})}),e.jsxs("dl",{className:s.serverGrid,children:[(t==null?void 0:t.version)&&e.jsxs(e.Fragment,{children:[e.jsx("dt",{children:e.jsx(r,{label:n("connection.server.version","Version"),tooltip:n("connection.server.version.tooltip","Installed MCP server version")})}),e.jsx("dd",{children:e.jsx(D,{text:n("connection.server.version.tooltip","Installed MCP server version"),children:`v${t.version}`})})]}),(t==null?void 0:t.pid)!=null&&e.jsxs(e.Fragment,{children:[e.jsx("dt",{children:e.jsx(r,{label:n("connection.server.pid","PID"),tooltip:n("connection.server.pid.tooltip","Operating system process identifier")})}),e.jsx("dd",{children:t.pid})]}),(t==null?void 0:t.uptime)!=null&&e.jsxs(e.Fragment,{children:[e.jsx("dt",{children:e.jsx(r,{label:n("connection.server.uptime","Uptime"),tooltip:n("connection.server.uptime.tooltip","Time elapsed since the MCP server started")})}),e.jsx("dd",{children:U(b??t.uptime)})]}),(t==null?void 0:t.sessionId)&&e.jsxs(e.Fragment,{children:[e.jsx("dt",{children:e.jsx(r,{label:n("connection.server.session","Session"),tooltip:n("connection.server.session.tooltip","Current MCP session identifier")})}),e.jsx("dd",{children:t.sessionId.slice(0,8)})]}),(o==null?void 0:o.serverExecutable)&&e.jsxs(e.Fragment,{children:[e.jsx("dt",{children:e.jsx(r,{label:n("connection.server.exec","Exec"),tooltip:n("connection.server.exec.tooltip","Executable path used to launch the MCP server")})}),e.jsx("dd",{children:o.serverExecutable})]})]})]})]}),e.jsxs("div",{className:`${s.card} ${C?s.disabled:""}`,children:[e.jsxs("div",{className:s.cardHeader,children:[e.jsxs("span",{children:[n("connection.agents.title","AI Agents")," ","(",(o==null?void 0:o.mcpInstanceCount)??0,")"]}),e.jsx("button",{className:s.toggleBtn,onClick:()=>p(c=>!c),"aria-label":u?n("common.collapse","Collapse"):n("common.expand","Expand"),children:u?"β–Ύ":"β–Έ"})]}),u&&e.jsxs("table",{className:s.table,children:[e.jsx("thead",{children:e.jsxs("tr",{children:[e.jsx("th",{children:n("connection.agents.name","Agent")}),e.jsx("th",{children:e.jsx(r,{label:n("connection.server.pid","PID"),tooltip:n("connection.server.pid.tooltip","Operating system process identifier")})}),e.jsx("th",{children:e.jsx(r,{label:n("connection.agents.projectRoot","Project Root"),tooltip:n("connection.agents.projectRoot.tooltip","Authoritative project root for sync ownership")})}),e.jsx("th",{children:n("connection.agents.connected","Connected")}),e.jsx("th",{children:e.jsx(r,{label:n("connection.agents.lastSeen","Last Seen"),tooltip:n("connection.agents.lastSeen.tooltip","Most recent heartbeat or activity from this agent")})}),e.jsx("th",{children:e.jsx(r,{label:n("connection.agents.lastCommand","Last Command"),tooltip:n("connection.agents.lastCommand.tooltip","Most recent tool call executed by this agent")})}),e.jsx("th",{})]})}),e.jsx("tbody",{children:o!=null&&o.mcpInstances&&o.mcpInstances.length>0?o.mcpInstances.map(c=>e.jsxs("tr",{children:[e.jsxs("td",{children:[e.jsx("span",{className:s[`activity_${je(c.lastSeen)}`]}),c.aiClientName??n("connection.agents.unknown","Unknown")]}),e.jsx("td",{children:c.pid}),e.jsx("td",{children:c.projectRoot??c.cwd??n("connection.agents.projectRoot.unresolved","Unresolved")}),e.jsx("td",{children:N(c.connectedAt,n)}),e.jsx("td",{children:c.lastSeen?N(c.lastSeen,n):"-"}),e.jsx("td",{children:c.lastCommandAt?N(c.lastCommandAt,n):"-"}),e.jsx("td",{children:!c.isServer&&e.jsx("button",{className:s.killBtn,onClick:()=>x({instanceId:c.instanceId,name:c.aiClientName??c.instanceId.slice(0,8)}),children:n("connection.agents.kill","Kill")})})]},c.instanceId)):e.jsx("tr",{children:e.jsx("td",{colSpan:7,className:s.emptyRow,children:n("connection.agents.none","No agents connected")})})})]})]}),e.jsxs("div",{className:`${s.card} ${C?s.disabled:""}`,children:[e.jsxs("div",{className:s.cardHeader,children:[n("connection.plugins.title","Plugins")," ","(",((I=t==null?void 0:t.pluginClients)==null?void 0:I.length)??0,")"]}),e.jsxs("table",{className:s.table,children:[e.jsx("thead",{children:e.jsxs("tr",{children:[e.jsx("th",{children:n("connection.plugins.place","Place")}),e.jsx("th",{children:e.jsx(r,{label:n("connection.plugins.clientId","Client ID"),tooltip:n("connection.plugins.clientId.tooltip","Unique plugin client identifier for this Studio connection")})}),e.jsx("th",{children:e.jsx(r,{label:n("connection.plugins.lastSeen","Last Seen"),tooltip:n("connection.plugins.lastSeen.tooltip","Most recent heartbeat received from the plugin")})}),e.jsx("th",{children:e.jsx(r,{label:n("connection.plugins.version","Ver"),tooltip:n("connection.plugins.version.tooltip","Installed plugin version reported by Studio")})})]})}),e.jsx("tbody",{children:t!=null&&t.pluginClients&&t.pluginClients.length>0?t.pluginClients.map(c=>e.jsxs("tr",{children:[e.jsx("td",{children:c.placeName??c.projectName??"-"}),e.jsx("td",{children:c.clientId.slice(0,10)}),e.jsx("td",{children:N(c.lastSeen,n)}),e.jsx("td",{children:c.pluginVersion??"-"})]},c.clientId)):e.jsx("tr",{children:e.jsx("td",{colSpan:4,className:s.emptyRow,children:n("connection.plugins.none","No plugins connected")})})})]})]}),e.jsxs("div",{className:`${s.card} ${C?s.disabled:""}`,children:[e.jsxs("div",{className:s.cardHeader,children:[e.jsx("span",{children:n("connection.log.title","Connection Log")}),e.jsx("button",{className:s.clearButton,onClick:()=>f(!0),children:n("common.clear","Clear")})]}),e.jsx(Q,{entries:l})]}),e.jsx($,{open:y,title:n("connection.clear.title","Clear connection log?"),message:n("connection.clear.message","This permanently removes the stored connection log for the current project."),cancelLabel:n("common.cancel","Cancel"),confirmLabel:n("common.clear","Clear"),loading:S,onCancel:()=>!S&&f(!1),onConfirm:E}),e.jsx($,{open:!!d,title:n("connection.agents.kill.title","Kill agent?"),message:`"${d==null?void 0:d.name}" ν”„λ‘œμ„ΈμŠ€λ₯Ό κ°•μ œ μ’…λ£Œν•©λ‹ˆλ‹€. ν•΄λ‹Ή μ—μ΄μ „νŠΈμ˜ μ§„ν–‰ 쀑인 μž‘μ—…μ΄ μ€‘λ‹¨λ©λ‹ˆλ‹€.`,cancelLabel:n("common.cancel","Cancel"),confirmLabel:n("connection.agents.kill","Kill"),loading:h,onCancel:()=>!h&&x(null),onConfirm:M})]})}export{ye as Component};
1
+ import{u as R,r as i,j as e,d as B,a as w,D as P,i as T,T as D}from"./index-BfvSPSNj.js";import{I as r}from"./InfoLabel-DrK7vhO-.js";import{S as F}from"./StatusBadge-hJyzgRAl.js";import{C as $}from"./ConfirmModal-DfdyAPrJ.js";import{u as H,f as U}from"./useLiveUptime-BeRNzFBh.js";const K="_container_1h084_2",G="_entry_1h084_14",O="_timestamp_1h084_21",V="_message_1h084_27",q="_warn_1h084_34",X="_error_1h084_39",z="_empty_1h084_44",_={container:K,entry:G,timestamp:O,message:V,warn:q,error:X,empty:z};function J(n){const t=new Date(n);return Number.isNaN(t.getTime())?n:`${String(t.getHours()).padStart(2,"0")}:${String(t.getMinutes()).padStart(2,"0")}`}function Q({entries:n}){const{t}=R(),o=i.useRef(null);return i.useEffect(()=>{const l=o.current;l&&(l.scrollTop=l.scrollHeight)},[n.length]),e.jsx("div",{ref:o,className:_.container,children:n.length===0?e.jsx("div",{className:_.empty,children:t("connection.log.empty","No events yet")}):n.map((l,j)=>e.jsxs("div",{className:`${_.entry} ${l.type?_[l.type]:""}`,children:[e.jsx("span",{className:_.timestamp,children:J(l.timestamp)}),e.jsx("span",{className:_.message,children:l.message})]},j))})}const A=50;function W(){const n=new Date;return`${String(n.getHours()).padStart(2,"0")}:${String(n.getMinutes()).padStart(2,"0")}`}function Y(){const{level:n,status:t,error:o}=B(),[l,j]=i.useState(null),[k,v]=i.useState([]),g=i.useRef(null),u=i.useCallback((a,d)=>{v(x=>{const h=[...x,{timestamp:W(),message:a,type:d}];return h.length>A?h.slice(-A):h})},[]),p=i.useCallback(async()=>{try{const a=await w.get("/connection-info");j(a)}catch{j(null)}},[]),y=i.useCallback(async()=>{try{const a=await w.get("/api/dashboard/connection-log");v(a.entries??[])}catch{v([])}},[]),f=i.useCallback(async()=>{await w.post("/api/dashboard/connection-log/clear"),v([])},[]),S=i.useCallback(async a=>{await w.post("/api/dashboard/kill-agent",{instanceId:a}),await p()},[p]);return i.useEffect(()=>{n!=="disconnected"&&t&&p(),y()},[n,t,p,y]),i.useEffect(()=>{const a=new P;g.current=a,a.connect();const d=a.on("connection",h=>{const m=h,b=m.status==="connected"?"connected":"disconnected";u(`Plugin ${b} β€” ${m.clientId}`,m.status==="connected"?"info":"warn")}),x=a.on("mcp_status",h=>{const m=h,b=m.status==="registered"?"registered":"unregistered";u(`MCP ${b} β€” ${m.aiClientName}`,m.status==="registered"?"info":"warn"),p()});return()=>{d(),x(),a.disconnect(),g.current=null}},[u,p]),{status:t,connectionInfo:l,connectionLog:k,level:n,error:o,clearConnectionLog:f,killAgent:S}}const Z="_page_1h5nv_2",ee="_card_1h5nv_10",ne="_disabled_1h5nv_18",te="_cardHeader_1h5nv_24",se="_clearButton_1h5nv_37",ce="_serverGrid_1h5nv_47",oe="_statusRow_1h5nv_65",ie="_metaItem_1h5nv_72",ae="_table_1h5nv_79",le="_toggleBtn_1h5nv_104",re="_disconnected_1h5nv_119",de="_disconnectedActions_1h5nv_136",he="_btn_1h5nv_143",me="_activity_active_1h5nv_161",pe="_activity_stale_1h5nv_162",ge="_activity_unknown_1h5nv_163",ue="_killBtn_1h5nv_187",xe="_emptyRow_1h5nv_206",s={page:Z,card:ee,disabled:ne,cardHeader:te,clearButton:se,serverGrid:ce,statusRow:oe,metaItem:ie,table:ae,toggleBtn:le,disconnected:re,disconnectedActions:de,btn:he,activity_active:me,activity_stale:pe,activity_unknown:ge,killBtn:ue,emptyRow:xe};function N(n,t){const o=Math.max(0,Math.floor((Date.now()-n)/1e3));return o<60?`${o}${t("connection.time.secondsAgo","s ago")}`:o<3600?`${Math.floor(o/60)}${t("connection.time.minutesAgo","m ago")}`:`${Math.floor(o/3600)}${t("connection.time.hoursAgo","h ago")}`}function je(n){return n?Date.now()-n<3e4?"active":"stale":"unknown"}function ye(){var I;const{t:n}=R(),{status:t,connectionInfo:o,connectionLog:l,level:j,clearConnectionLog:k,killAgent:v}=Y(),{show:g}=T(),[u,p]=i.useState(!0),[y,f]=i.useState(!1),[S,a]=i.useState(!1),[d,x]=i.useState(null),[h,m]=i.useState(!1),b=H(t==null?void 0:t.uptime),C=j==="disconnected",L=C?"offline":"online",M=async()=>{if(d){m(!0);try{await v(d.instanceId),g(n("connection.agents.killed","Agent killed"),"success"),x(null)}catch{g(n("connection.agents.killFailed","Failed to kill agent"),"error")}finally{m(!1)}}},E=async()=>{a(!0);try{await k(),g(n("toast.clearSuccess","Cleared successfully"),"success"),f(!1)}catch{g(n("toast.clearFailed","Failed to clear data"),"error")}finally{a(!1)}};return e.jsxs("div",{className:s.page,children:[e.jsxs("div",{className:s.card,children:[e.jsx("div",{className:s.cardHeader,children:n("connection.server.title","Server Status")}),C?e.jsxs("div",{className:s.disconnected,children:[e.jsx("h3",{children:n("level.l0.title")}),e.jsx("p",{children:n("level.l0.message")}),e.jsx("p",{children:n("common.reconnecting")}),e.jsxs("div",{className:s.disconnectedActions,children:[e.jsx("button",{className:s.btn,onClick:()=>window.location.reload(),children:n("connection.reconnect","Reconnect")}),e.jsx("button",{className:s.btn,onClick:()=>{window.location.hash="#/settings"},children:n("connection.checkSettings","Check Settings")})]})]}):e.jsxs(e.Fragment,{children:[e.jsx("div",{className:s.statusRow,children:e.jsx(F,{status:L})}),e.jsxs("dl",{className:s.serverGrid,children:[(t==null?void 0:t.version)&&e.jsxs(e.Fragment,{children:[e.jsx("dt",{children:e.jsx(r,{label:n("connection.server.version","Version"),tooltip:n("connection.server.version.tooltip","Installed MCP server version")})}),e.jsx("dd",{children:e.jsx(D,{text:n("connection.server.version.tooltip","Installed MCP server version"),children:`v${t.version}`})})]}),(t==null?void 0:t.pid)!=null&&e.jsxs(e.Fragment,{children:[e.jsx("dt",{children:e.jsx(r,{label:n("connection.server.pid","PID"),tooltip:n("connection.server.pid.tooltip","Operating system process identifier")})}),e.jsx("dd",{children:t.pid})]}),(t==null?void 0:t.uptime)!=null&&e.jsxs(e.Fragment,{children:[e.jsx("dt",{children:e.jsx(r,{label:n("connection.server.uptime","Uptime"),tooltip:n("connection.server.uptime.tooltip","Time elapsed since the MCP server started")})}),e.jsx("dd",{children:U(b??t.uptime)})]}),(t==null?void 0:t.sessionId)&&e.jsxs(e.Fragment,{children:[e.jsx("dt",{children:e.jsx(r,{label:n("connection.server.session","Session"),tooltip:n("connection.server.session.tooltip","Current MCP session identifier")})}),e.jsx("dd",{children:t.sessionId.slice(0,8)})]}),(o==null?void 0:o.serverExecutable)&&e.jsxs(e.Fragment,{children:[e.jsx("dt",{children:e.jsx(r,{label:n("connection.server.exec","Exec"),tooltip:n("connection.server.exec.tooltip","Executable path used to launch the MCP server")})}),e.jsx("dd",{children:o.serverExecutable})]})]})]})]}),e.jsxs("div",{className:`${s.card} ${C?s.disabled:""}`,children:[e.jsxs("div",{className:s.cardHeader,children:[e.jsxs("span",{children:[n("connection.agents.title","AI Agents")," ","(",(o==null?void 0:o.mcpInstanceCount)??0,")"]}),e.jsx("button",{className:s.toggleBtn,onClick:()=>p(c=>!c),"aria-label":u?n("common.collapse","Collapse"):n("common.expand","Expand"),children:u?"β–Ύ":"β–Έ"})]}),u&&e.jsxs("table",{className:s.table,children:[e.jsx("thead",{children:e.jsxs("tr",{children:[e.jsx("th",{children:n("connection.agents.name","Agent")}),e.jsx("th",{children:e.jsx(r,{label:n("connection.server.pid","PID"),tooltip:n("connection.server.pid.tooltip","Operating system process identifier")})}),e.jsx("th",{children:e.jsx(r,{label:n("connection.agents.projectRoot","Project Root"),tooltip:n("connection.agents.projectRoot.tooltip","Authoritative project root for sync ownership")})}),e.jsx("th",{children:n("connection.agents.connected","Connected")}),e.jsx("th",{children:e.jsx(r,{label:n("connection.agents.lastSeen","Last Seen"),tooltip:n("connection.agents.lastSeen.tooltip","Most recent heartbeat or activity from this agent")})}),e.jsx("th",{children:e.jsx(r,{label:n("connection.agents.lastCommand","Last Command"),tooltip:n("connection.agents.lastCommand.tooltip","Most recent tool call executed by this agent")})}),e.jsx("th",{})]})}),e.jsx("tbody",{children:o!=null&&o.mcpInstances&&o.mcpInstances.length>0?o.mcpInstances.map(c=>e.jsxs("tr",{children:[e.jsxs("td",{children:[e.jsx("span",{className:s[`activity_${je(c.lastSeen)}`]}),c.aiClientName??n("connection.agents.unknown","Unknown")]}),e.jsx("td",{children:c.pid}),e.jsx("td",{children:c.projectRoot??c.cwd??n("connection.agents.projectRoot.unresolved","Unresolved")}),e.jsx("td",{children:N(c.connectedAt,n)}),e.jsx("td",{children:c.lastSeen?N(c.lastSeen,n):"-"}),e.jsx("td",{children:c.lastCommandAt?N(c.lastCommandAt,n):"-"}),e.jsx("td",{children:!c.isServer&&e.jsx("button",{className:s.killBtn,onClick:()=>x({instanceId:c.instanceId,name:c.aiClientName??c.instanceId.slice(0,8)}),children:n("connection.agents.kill","Kill")})})]},c.instanceId)):e.jsx("tr",{children:e.jsx("td",{colSpan:7,className:s.emptyRow,children:n("connection.agents.none","No agents connected")})})})]})]}),e.jsxs("div",{className:`${s.card} ${C?s.disabled:""}`,children:[e.jsxs("div",{className:s.cardHeader,children:[n("connection.plugins.title","Plugins")," ","(",((I=t==null?void 0:t.pluginClients)==null?void 0:I.length)??0,")"]}),e.jsxs("table",{className:s.table,children:[e.jsx("thead",{children:e.jsxs("tr",{children:[e.jsx("th",{children:n("connection.plugins.place","Place")}),e.jsx("th",{children:e.jsx(r,{label:n("connection.plugins.clientId","Client ID"),tooltip:n("connection.plugins.clientId.tooltip","Unique plugin client identifier for this Studio connection")})}),e.jsx("th",{children:e.jsx(r,{label:n("connection.plugins.lastSeen","Last Seen"),tooltip:n("connection.plugins.lastSeen.tooltip","Most recent heartbeat received from the plugin")})}),e.jsx("th",{children:e.jsx(r,{label:n("connection.plugins.version","Ver"),tooltip:n("connection.plugins.version.tooltip","Installed plugin version reported by Studio")})})]})}),e.jsx("tbody",{children:t!=null&&t.pluginClients&&t.pluginClients.length>0?t.pluginClients.map(c=>e.jsxs("tr",{children:[e.jsx("td",{children:c.placeName??c.projectName??"-"}),e.jsx("td",{children:c.clientId.slice(0,10)}),e.jsx("td",{children:N(c.lastSeen,n)}),e.jsx("td",{children:c.pluginVersion??"-"})]},c.clientId)):e.jsx("tr",{children:e.jsx("td",{colSpan:4,className:s.emptyRow,children:n("connection.plugins.none","No plugins connected")})})})]})]}),e.jsxs("div",{className:`${s.card} ${C?s.disabled:""}`,children:[e.jsxs("div",{className:s.cardHeader,children:[e.jsx("span",{children:n("connection.log.title","Connection Log")}),e.jsx("button",{className:s.clearButton,onClick:()=>f(!0),children:n("common.clear","Clear")})]}),e.jsx(Q,{entries:l})]}),e.jsx($,{open:y,title:n("connection.clear.title","Clear connection log?"),message:n("connection.clear.message","This permanently removes the stored connection log for the current project."),cancelLabel:n("common.cancel","Cancel"),confirmLabel:n("common.clear","Clear"),loading:S,onCancel:()=>!S&&f(!1),onConfirm:E}),e.jsx($,{open:!!d,title:n("connection.agents.kill.title","Kill agent?"),message:`"${d==null?void 0:d.name}" ν”„λ‘œμ„ΈμŠ€λ₯Ό κ°•μ œ μ’…λ£Œν•©λ‹ˆλ‹€. ν•΄λ‹Ή μ—μ΄μ „νŠΈμ˜ μ§„ν–‰ 쀑인 μž‘μ—…μ΄ μ€‘λ‹¨λ©λ‹ˆλ‹€.`,cancelLabel:n("common.cancel","Cancel"),confirmLabel:n("connection.agents.kill","Kill"),loading:h,onCancel:()=>!h&&x(null),onConfirm:M})]})}export{ye as Component};
@@ -1 +1 @@
1
- import{j as r,m as e}from"./index-aMbdHsW4.js";function s({label:t,tooltip:o}){return r.jsx(e,{text:o,children:t})}export{s as I};
1
+ import{j as r,m as e}from"./index-BfvSPSNj.js";function s({label:t,tooltip:o}){return r.jsx(e,{text:o,children:t})}export{s as I};