@appaflytech/zeyrek-ai-mcp 0.0.4 → 0.0.6

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 (101) hide show
  1. package/.env.example +8 -3
  2. package/.env.production.example +2 -0
  3. package/README.md +229 -193
  4. package/dist/config.js +20 -2
  5. package/dist/knowledge/backendConstraints.js +897 -0
  6. package/dist/knowledge/componentCatalog.js +196 -42
  7. package/dist/knowledge/coverage.js +43 -0
  8. package/dist/knowledge/flowGuards.js +30 -0
  9. package/dist/knowledge/guideSections.js +49 -0
  10. package/dist/knowledge/hydrate.js +97 -0
  11. package/dist/knowledge/languageCodes.js +36 -0
  12. package/dist/knowledge/languages.js +105 -0
  13. package/dist/knowledge/layoutSummary.js +10 -0
  14. package/dist/knowledge/localization.js +51 -0
  15. package/dist/knowledge/normalize.js +449 -16
  16. package/dist/knowledge/outlines.js +136 -12
  17. package/dist/knowledge/propTypes.js +80 -0
  18. package/dist/knowledge/rules.js +618 -43
  19. package/dist/knowledge/schemaGuard.js +199 -0
  20. package/dist/knowledge/styleResolve.js +63 -4
  21. package/dist/observability/trace.js +27 -3
  22. package/dist/platform/errors.js +46 -4
  23. package/dist/platform/http.js +33 -4
  24. package/dist/platform/patch.js +27 -0
  25. package/dist/platform/refs.js +104 -0
  26. package/dist/platform/responses.js +9 -2
  27. package/dist/platform/screenshot.js +527 -16
  28. package/dist/platform/secrets.js +40 -0
  29. package/dist/platform/tokenVault.js +89 -0
  30. package/dist/platform/writeDiff.js +281 -0
  31. package/dist/resources/examples/layout-app-shell.json +1 -1
  32. package/dist/resources/examples/microservice-table-list.json +2 -4
  33. package/dist/resources/examples/page-dynamic-form.json +2 -2
  34. package/dist/resources/examples/page-flex-sections.json +99 -0
  35. package/dist/resources/examples/page-sign-in.json +3 -2
  36. package/dist/resources/guides/component.md +69 -8
  37. package/dist/resources/guides/entity.md +404 -16
  38. package/dist/resources/guides/expressions.md +44 -2
  39. package/dist/resources/guides/external-component.md +9 -0
  40. package/dist/resources/guides/getting-started.md +77 -7
  41. package/dist/resources/guides/layout.md +53 -10
  42. package/dist/resources/guides/microservice.md +226 -13
  43. package/dist/resources/guides/middleware.md +89 -1
  44. package/dist/resources/guides/page.md +383 -46
  45. package/dist/resources/guides/translation.md +126 -8
  46. package/dist/resources/guides/view.md +16 -1
  47. package/dist/resources/guides/workflow.md +198 -27
  48. package/dist/resources/knowledge.js +5 -0
  49. package/dist/resources/rules.js +27 -0
  50. package/dist/resources/schema-fingerprint.json +8 -0
  51. package/dist/resources/schemas/CreateBulkRowCommand.json +33 -0
  52. package/dist/resources/schemas/CreateDatasourceCommand.json +15 -6
  53. package/dist/resources/schemas/CreateDiscoveredEntitiesCommand.json +19 -8
  54. package/dist/resources/schemas/CreateEntityCommand.json +52 -12
  55. package/dist/resources/schemas/CreateMicroserviceCommand.json +26 -2
  56. package/dist/resources/schemas/CreateQueryCommand.json +56 -3
  57. package/dist/resources/schemas/CreateRowCommand.json +38 -0
  58. package/dist/resources/schemas/CreateViewCommand.json +13 -10
  59. package/dist/resources/schemas/CreateWorkflowCommand.json +95 -14
  60. package/dist/resources/schemas/GetRowsQuery.json +3 -0
  61. package/dist/resources/schemas/PreviewMicroserviceCommand.json +16 -0
  62. package/dist/resources/schemas/PreviewQueryCommand.json +5 -2
  63. package/dist/resources/schemas/PreviewWorkflowCommand.json +34 -9
  64. package/dist/resources/schemas/StepDto.json +23 -3
  65. package/dist/resources/schemas/UpdateBulkRowCommand.json +33 -0
  66. package/dist/resources/schemas/UpdateDatasourceCommand.json +15 -6
  67. package/dist/resources/schemas/UpdateEntityCommand.json +49 -10
  68. package/dist/resources/schemas/UpdateMicroserviceCommand.json +28 -3
  69. package/dist/resources/schemas/UpdateQueryCommand.json +13 -3
  70. package/dist/resources/schemas/UpdateRowCommand.json +40 -0
  71. package/dist/resources/schemas/UpdateViewCommand.json +15 -10
  72. package/dist/resources/schemas/UpdateWorkflowCommand.json +95 -14
  73. package/dist/server.js +4 -0
  74. package/dist/tools/access.js +3 -3
  75. package/dist/tools/applications.js +1 -1
  76. package/dist/tools/automations.js +63 -30
  77. package/dist/tools/common.js +39 -0
  78. package/dist/tools/components.js +16 -7
  79. package/dist/tools/datasources.js +83 -21
  80. package/dist/tools/deployments.js +34 -2
  81. package/dist/tools/dtos.js +25 -12
  82. package/dist/tools/entities.js +113 -28
  83. package/dist/tools/externalComponents.js +9 -3
  84. package/dist/tools/files.js +20 -6
  85. package/dist/tools/flows.js +110 -11
  86. package/dist/tools/folders.js +7 -2
  87. package/dist/tools/globalFunctions.js +63 -0
  88. package/dist/tools/layouts.js +103 -29
  89. package/dist/tools/microservices.js +229 -38
  90. package/dist/tools/organizations.js +5 -6
  91. package/dist/tools/pages.js +365 -100
  92. package/dist/tools/platformInfo.js +152 -11
  93. package/dist/tools/projects.js +183 -33
  94. package/dist/tools/queries.js +32 -10
  95. package/dist/tools/rows.js +159 -45
  96. package/dist/tools/screenWrite.js +59 -0
  97. package/dist/tools/screens.js +28 -0
  98. package/dist/tools/translations.js +24 -8
  99. package/dist/tools/views.js +20 -10
  100. package/dist/tools/workflows.js +33 -16
  101. package/package.json +6 -3
package/.env.example CHANGED
@@ -1,6 +1,10 @@
1
1
  # LOKAL PROFIL — platform/gateway kodu gelistirirken. Uzak ortam icin:
2
2
  # cp zeyrek-mcp/.env.production.example .env
3
3
  # Ortam rolleri: docs/ortam.md
4
+ #
5
+ # npm paketiyle (npx @appaflytech/zeyrek-ai-mcp) kurulumda .env sart degil: ayni anahtarlar
6
+ # .mcp.json'in env blogundan verilebilir ve o blok .env'i ezer. Arama sirasi:
7
+ # <calisma dizini>/.env -> <paket>/.env -> <paket>/../.env
4
8
 
5
9
  # Platform API adresleri (host makinesinden lokal compose icin)
6
10
  ORG_API_BASE_URL=http://localhost:17000
@@ -52,9 +56,10 @@ SCREENSHOT_BROWSER_PATH=
52
56
  ORG_SWAGGER_URL=
53
57
  TENANT_SWAGGER_URL=
54
58
 
55
- # Bos = tum moduller (149 tool). Hazir kumeler: core (veri+mantik, 92), studio (sayfa
56
- # tasarimi, 46), admin (template/organizasyon/deployment, 15). Kume ve tekil modul adi
57
- # karisik yazilabilir. Ornek: core,studio | entity,row,microservice
59
+ # Bos = tum moduller (167 tool / 27 modul). Hazir kumeler: core (veri+mantik, 97), studio
60
+ # (sayfa tasarimi, 59), admin (template/organizasyon/deployment, 16). platform modulu (3 tool)
61
+ # her kumede vardir. Kume ve tekil modul adi karisik yazilabilir.
62
+ # Ornek: core,studio | entity,row,microservice
58
63
  MODULES=
59
64
 
60
65
  MCP_PORT=5100
@@ -1,6 +1,7 @@
1
1
  # UZAK PROFIL — kosular, uygulama kurulumu, gercek-ekran dogrulama, demo.
2
2
  # Kurulum: cp zeyrek-mcp/.env.production.example .env (sonra PASSWORD'u doldurun)
3
3
  # Ortam rolleri: docs/ortam.md
4
+ # npm paketiyle kurulumda ayni anahtarlar .mcp.json'in env blogundan da verilebilir (README).
4
5
  #
5
6
  # "production" burada PLATFORM KURULUMUNUN adidir. AI'in yazma hedefi orada da
6
7
  # development environment'idir — asagidaki DEFAULT_ENVIRONMENT bu yuzden development.
@@ -37,6 +38,7 @@ SCREENSHOT_BROWSER_PATH=
37
38
  ORG_SWAGGER_URL=
38
39
  TENANT_SWAGGER_URL=
39
40
 
41
+ # Bos = tum moduller (167 tool). Kumeler: core (97) | studio (59) | admin (16).
40
42
  MODULES=
41
43
 
42
44
  MCP_PORT=5100
package/README.md CHANGED
@@ -1,174 +1,150 @@
1
- # zeyrek-ai-mcp
1
+ # @appaflytech/zeyrek-ai-mcp
2
2
 
3
- NgApps platformunu MCP tool'ları olarak sunan bağımsız gateway — veri/mantık tarafı (project,
4
- application, datasource, entity, row, microservice, query, workflow, automation, dto, view) ve
5
- Studio tasarım tarafı (page, component, flow, layout, variable, folder, file) birlikte, **162
6
- tool / 24 modül**. Durum + yol haritası:
7
- [`docs/00-durum-ve-yol-haritasi.md`](docs/00-durum-ve-yol-haritasi.md);
8
- tasarım: [`docs/`](docs/01-vizyon-ve-kapsam.md). Platform koduna
9
- referans vermez; iki API'yi HTTP üzerinden sarar, istekler MVC binding'den geçtiği için
10
- FluentValidation aynen çalışır.
3
+ Zeyrek (NgApps) platformunu **MCP tool'ları** olarak sunan bağımsız gateway. Bir Claude / MCP
4
+ oturumu Studio arayüzüne hiç girmeden proje kurabilir, veri modeli çıkarabilir, mikroservis ve
5
+ workflow yazıp çalıştırabilir, sayfa tasarlayabilir.
11
6
 
12
- ## Kurulum
7
+ - **167 tool · 27 modül** — veri/mantık tarafı (project, application, datasource, entity, row,
8
+ microservice, query, workflow, automation, global function, dto, view, dependency), Studio tasarım tarafı
9
+ (page, component, external component, flow, layout, variable, folder, file, access,
10
+ translation) ve yönetim (template, organization, deployment).
11
+ - Platform koduna referans vermez: Organization.API ile Tenant.API'yi **HTTP üzerinden** sarar —
12
+ istekler MVC binding'den geçtiği için FluentValidation aynen çalışır.
13
+ - Üstünde bir **bilgi katmanı** vardır (rehber + altın örnek + politika lint'i): platformun
14
+ yazılı olmayan kuralları istek API'ye gitmeden uygulanır.
13
15
 
14
- ```bash
15
- cd zeyrek-mcp
16
- npm install
17
- cp .env.example ../.env
18
- ```
16
+ Gereken: **Node 20+** ve erişebildiğiniz bir platform kurulumu (API adresleri, org adı, kullanıcı).
19
17
 
20
- `.env` **repo kökünde**, `.mcp.json`'ın yanında durur (kök `.gitignore`'da `/.env` ile korunur).
21
- Sunucu şu sırayla arar, ilk bulunan anahtar kazanır: `<çalışma dizini>/.env` →
22
- `<paket>/.env` → `<paket>/../.env`.
18
+ ---
23
19
 
24
- > `npm install` yalnız `npm run dev` için değil: repo kökündeki `.mcp.json` sunucuyu
25
- > `zeyrek-mcp/node_modules/.bin/tsx` ile başlatır. Bağımlılıklar kurulu değilken MCP istemcisi
26
- > **hata vermeden sıfır tool ile** bağlanır — repoyu yeni klonladıysanız ilk adım budur.
20
+ ## Hızlı başlangıç (npm)
27
21
 
28
- Ayarlar `.env` yerine (ya da onunla birlikte) repo kökündeki `.mcp.json`'ın `env` bloğundan da
29
- verilebilir; env bloğu her zaman `.env`'i ezer — ayrıntı [npm paketi olarak
30
- kurulum](#npm-paketi-olarak-kurulum). Asgari şunlar gerekir:
22
+ Repoyu klonlamanıza gerek yok; paket npx ile çalışır. Projenizin kökündeki `.mcp.json`'a
23
+ ekleyin:
31
24
 
32
- | Değişken | Örnek | Not |
33
- |----------|-------|-----|
34
- | `ORG_API_BASE_URL` | `http://localhost:7000` | Organization.API |
35
- | `TENANT_API_BASE_URL` | `http://localhost:5000` | Tenant.API |
36
- | `ORGANIZATION` | `zeyrek-local` | Org subdomain'i; istekler `Host: {org}.{suffix}` ile gider |
37
- | `USERNAME` / `PASSWORD` | | `/connect/token` ile takas edilir (AuthMode=local) |
38
- | `DEFAULT_PROJECT` | `crm` | Opsiyonel; tool'daki `project` parametresi her zaman ezer |
39
- | `STUDIO_BASE_URL` | `http://localhost:3000` | Opsiyonel; yalnız `page_screenshot` kullanır — Studio arayüzünün kök adresi ([`docs/26`](docs/26-sayfa-ekran-goruntusu.md)) |
40
- | `SCREENSHOT_BROWSER_PATH` | `/usr/bin/chromium-browser` | Opsiyonel; `page_screenshot` için sistemdeki Chromium ikilisinin yolu (verilmezse playwright-core'un indirdiği tarayıcı) |
25
+ ```json
26
+ {
27
+ "mcpServers": {
28
+ "zeyrek-ai": {
29
+ "type": "stdio",
30
+ "command": "npx",
31
+ "args": ["-y", "@appaflytech/zeyrek-ai-mcp@0.0.5", "--stdio"],
32
+ "env": {
33
+ "ORG_API_BASE_URL": "https://new-zeyrek.glomil.com/api/org",
34
+ "TENANT_API_BASE_URL": "https://new-zeyrek.glomil.com/api",
35
+ "ORGANIZATION": "new-zeyrek",
36
+ "HOST_SUFFIX": "glomil.com",
37
+ "DEFAULT_ENVIRONMENT": "development",
38
+ "USERNAME": "admin@zeyrek.com",
39
+ "PASSWORD": "parolanız",
40
+ "LOG_DIR": "logs"
41
+ }
42
+ }
43
+ }
44
+ }
45
+ ```
41
46
 
42
- ## Çalıştırma
47
+ Claude Code'da komutla eklemek isterseniz:
43
48
 
44
49
  ```bash
45
- npm run dev
50
+ claude mcp add zeyrek-ai \
51
+ -e ORG_API_BASE_URL=https://new-zeyrek.glomil.com/api/org \
52
+ -e TENANT_API_BASE_URL=https://new-zeyrek.glomil.com/api \
53
+ -e ORGANIZATION=new-zeyrek \
54
+ -e HOST_SUFFIX=glomil.com \
55
+ -e DEFAULT_ENVIRONMENT=development \
56
+ -e USERNAME=admin@zeyrek.com \
57
+ -e PASSWORD='parolanız' \
58
+ -- npx -y @appaflytech/zeyrek-ai-mcp@0.0.5 --stdio
46
59
  ```
47
60
 
48
- Sağlık: `http://localhost:5100/healthz`. Sunucu stateless streamable HTTP konuşur (`/mcp`,
49
- yalnız POST); `npm run start:stdio` ile stdio kipi de var.
61
+ **İlk doğrulama:** oturumda `platform_whoami` tool'unu çağırtın — kimlik, org çözümü ve ağ
62
+ erişimi tek seferde test edilir. Tool listesi boş geliyorsa Sorun giderme bölümüne bakın.
50
63
 
51
- ## Tool çağrısı günlüğü
64
+ ### Sürüm seçimi
52
65
 
53
- Her MCP tool çağrısı, okunmak için biçimlenmiş tek bir blok olarak dosyaya yazılır — varsayılan
54
- `zeyrek-mcp/logs/gateway-YYYY-MM-DD.log` (günlük dosya, `.gitignore`'da). Amaç: bir çağrının ne
55
- yapmaya çalıştığını, içeriden hangi duraklardan geçtiğini ve nerede patladığını **koda inmeden**
56
- okuyabilmek.
66
+ `@0.0.5` gibi sabit sürüm önerilir: npx kopyayı önbelleğe alır, sabit sürümde herkes aynı
67
+ gateway'i çalıştırır. `@latest` yazarsanız ekipteki makineler farklı sürümlerde kalabilir;
68
+ güncellemek için `.mcp.json`'daki sürümü yükseltip MCP sunucusunu yeniden başlatın.
57
69
 
58
- ```
59
- ┌─ #1 · 11:27:27.082 · platform_whoami — Oturum bilgisi
60
- │ amaç : Gateway'in platformda kimin adına çalıştığını döner; auth kurulumunu doğrulamak için ilk çağrılacak tool.
61
- │ girdi : (parametresiz)
62
- │ adımlar:
63
- │ +2ms kimlik → önbellekte geçerli token yok — POST http://localhost:7000/connect/token · kullanıcı admin@zeyrek.com
64
- │ +229ms kimlik ← HTTP 200 · token alındı, önbellekte 63158340 sn geçerli
65
- │ +229ms istek → GET http://localhost:7000/connect/userinfo · org api · env=development
66
- │ +237ms yanıt ← HTTP 200 · 8 ms · 174 B
67
- │ gövde: {"sub":"01917edf-…","email":"admin@zeyrek.com","role":["super-admin"]}
68
- └─ SONUÇ : başarılı · 238 ms · 4 adım · 137 B yanıt
69
- ```
70
+ ---
70
71
 
71
- Adım etiketleri: `politika` (lint kuralları; `politika ✕` isteği hiç göndermez), `düzeltme`
72
- (gateway'in gövdeye uyguladığı otomatik düzeltmeler — yanıttaki `gatewayNormalized`), `kimlik →/←`
73
- (`/connect/token` turu), `istek →/yanıt ←` (platform API turu, tam URL + süre + boyut),
74
- `kırpma ✂` (yanıt `MAX_RESPONSE_BYTES` sınırını aştı), `tarayıcı →/←` (`page_screenshot`'ın
75
- headless Chromium turu: açılan URL, viewport, PNG boyutu), `hata ✕` (yakalanan hata: sınıf,
76
- HTTP kodu, mesaj, ilk 3 stack satırı). Tool gövdesine hiç girmeyen çağrılar — yanlış tool adı ya da
77
- parametre şemasına takılan gövde — `MCP KATMANI REDDETTİ` bloğu olarak düşer; bunlar aksi hâlde
78
- hiçbir yerde görünmezdi.
72
+ ## Ayarlar
79
73
 
80
- Arama: `SONUÇ : HATA` tüm başarısız çağrılar, `hata ✕` hata satırları, `#<n>` tek bir çağrı.
74
+ Ayar üç kaynaktan gelebilir, **öncelik sırası**:
81
75
 
82
- | Değişken | Varsayılan | Not |
83
- |----------|-----------|-----|
84
- | `LOG_LEVEL` | `detail` | `detail` istek/yanıt gövdelerini de yazar · `summary` yalnız durak + boyut + hata gövdeleri · `off` hiç dosya açmaz |
85
- | `LOG_DIR` | `zeyrek-mcp/logs` | Günlük dosyaların klasörü |
86
- | `LOG_FILE` | — | Verilirse tek sabit dosyaya yazar (tarih döndürmesi kapanır) |
87
- | `LOG_MAX_BODY_CHARS` | `2000` | Tek bir gövde/parametre önizlemesinin karakter sınırı |
76
+ 1. `.mcp.json`'ın `env` bloğu (npm kurulumunda tek kaynak budur)
77
+ 2. `.env` dosyası — sırayla aranır, ilk bulunan anahtar kazanır:
78
+ `<çalışma dizini>/.env` → `<paket>/.env` → `<paket>/../.env`
79
+ 3. Şemadaki varsayılan
88
80
 
89
- Adı `pass|secret|token|authorization|api key|credential|connectionString` desenine uyan alanlar
90
- `***` ile maskelenir (`girdi` satırında ve gövde önizlemelerinde). Günlükleme yazma hatası tool
91
- çağrısını **düşürmez**: ilk hatada stderr'e tek satır yazılıp günlükleme kapatılır.
81
+ Parolayı sürüm kontrolündeki bir dosyaya yazmak istemiyorsanız `.mcp.json`'da `PASSWORD` alanını
82
+ hiç yazmayıp çalışma dizininize `PASSWORD=...` içeren bir `.env` koyun.
92
83
 
93
- ## Claude Code kaydı
84
+ ### Zorunlu
94
85
 
95
- ```bash
96
- claude mcp add ngapps --transport http http://localhost:5100/mcp
97
- ```
86
+ | Değişken | Örnek | Not |
87
+ |---|---|---|
88
+ | `ORG_API_BASE_URL` | `https://new-zeyrek.glomil.com/api/org` | Organization.API kökü |
89
+ | `TENANT_API_BASE_URL` | `https://new-zeyrek.glomil.com/api` | Tenant.API kökü |
90
+ | `ORGANIZATION` | `new-zeyrek` | Org subdomain'i; istekler `Host: {ORGANIZATION}.{HOST_SUFFIX}` ile gider |
91
+ | `DEFAULT_ENVIRONMENT` | `development` | Gömülü varsayılanı **yoktur**; boşsa sunucu açılmaz |
92
+ | `USERNAME` + `PASSWORD` | | `AUTH_MODE=local` için; `/connect/token` ile takas edilir |
93
+ | `TOKEN` | | `USERNAME`/`PASSWORD` yerine hazır Bearer JWT verilebilir |
98
94
 
99
- stdio alternatifi (port gerekmez, sunucuyu istemci başlatır):
95
+ ### Opsiyonel
100
96
 
101
- ```bash
102
- claude mcp add zeyrek-ai -- npx tsx <repo>/zeyrek-mcp/src/index.ts --stdio
103
- ```
97
+ | Değişken | Varsayılan | Not |
98
+ |---|---|---|
99
+ | `HOST_SUFFIX` | `localhost` | Org çözümündeki alan adı eki |
100
+ | `DEFAULT_PROJECT` | — | Tool'daki `project` parametresi her zaman ezer |
101
+ | `AUTH_MODE` | `local` | `passthrough`: kimlik istemcinin `Authorization` header'ından gelir (stdio kipinde kullanılamaz) |
102
+ | `MODULES` | hepsi | Tool setini daraltır — aşağıdaki Modüller bölümü |
103
+ | `POLICY` | `strict` | Politika lint'i: `strict` \| `warn` \| `off` |
104
+ | `LOG_LEVEL` | `detail` | `detail` gövdeleri de yazar · `summary` gövdesiz · `off` dosya açmaz |
105
+ | `LOG_DIR` | çalışma dizini altında `logs/` | Günlük dosyaların klasörü |
106
+ | `LOG_FILE` | — | Verilirse tek sabit dosyaya yazar (tarih döndürmesi kapanır) |
107
+ | `LOG_MAX_BODY_CHARS` | `2000` | Tek gövde/parametre önizlemesinin karakter sınırı |
108
+ | `MAX_RESPONSE_BYTES` | `262144` | Yanıt budama eşiği |
109
+ | `REQUEST_TIMEOUT_MS` | `100000` | Platform isteklerinin zaman aşımı |
110
+ | `MCP_PORT` | `5100` | Yalnız HTTP kipinde |
111
+ | `STUDIO_BASE_URL` | — | Yalnız `page_screenshot`: Studio arayüzünün kök adresi |
112
+ | `SCREENSHOT_BROWSER_PATH` | — | `page_screenshot` için sistemdeki Chromium ikilisi (verilmezse playwright-core'un indirdiği tarayıcı) |
104
113
 
105
- İlk doğrulama: oturumda `platform_whoami` tool'unu çağırtın — kimlik ve org çözümü tek seferde
106
- test edilir.
114
+ Tam liste ve yorumlu şablon: pakete dahil edilen `.env.example` (lokal profil) ve
115
+ `.env.production.example` (uzak profil).
107
116
 
108
- ## npm paketi olarak kurulum
117
+ ### Bilinmesi gereken üç davranış
109
118
 
110
- Repoyu klonlamadan, yayınlanmış paketle. Tüm ayarlar `.mcp.json`'ın `env` bloğundan gelir;
111
- `.env` dosyasına gerek yoktur:
119
+ - **`${…}` genişletmesi istemciye bağlıdır.** Claude Code `${PASSWORD}` ve
120
+ `${PASSWORD:-varsayılan}` yazımını açar, VS Code'un kendi MCP istemcisi açmaz ve metni olduğu
121
+ gibi geçirir. Sunucu, açılmamış yer tutucuyu boş değerle aynı sayıp **düşürür** — ayar `.env`'den
122
+ ya da varsayılandan doldurulur, sunucu yer tutucu metinle patlamaz.
123
+ - **Boş bırakılan (`""`) alan tanımsız sayılır**; varsayılana düşer ya da `.env`'den doldurulur.
124
+ Yani `"MODULES": ""` yazmak alanı hiç yazmamakla aynıdır.
125
+ - **`USERNAME` adı işletim sistemine aittir** (Windows'ta her zaman, macOS kabuklarında sık sık
126
+ tanımlıdır). Bu yüzden `.mcp.json`'da `${USERNAME:-…}` gibi genişletme kullanmayın, değeri düz
127
+ yazın. Değer işletim sisteminin kullanıcı adıyla (`USER`/`LOGNAME`) **aynıysa** sunucu onu
128
+ düşürür ve `.env`'deki değer geçerli olur; bu guard olmadan gateway kimliği makine kullanıcı
129
+ adıyla almaya kalkıyor ve `POST /connect/token` "kayıt bulunamadı" diyerek 404 dönüyordu.
112
130
 
113
- ```json
114
- {
115
- "mcpServers": {
116
- "zeyrek-ai": {
117
- "type": "stdio",
118
- "command": "npx",
119
- "args": ["-y", "@appaflytech/zeyrek-ai-mcp@latest", "--stdio"],
120
- "env": {
121
- "ORG_API_BASE_URL": "http://localhost:17000",
122
- "TENANT_API_BASE_URL": "http://localhost:15000",
123
- "ORGANIZATION": "zeyrek-test",
124
- "HOST_SUFFIX": "zeyrek.local",
125
- "DEFAULT_PROJECT": "emrah",
126
- "DEFAULT_ENVIRONMENT": "development",
127
- "USERNAME": "admin@zeyrek.com",
128
- "PASSWORD": "${PASSWORD}",
129
- "MODULES": "core",
130
- "LOG_DIR": "logs"
131
- }
132
- }
133
- }
134
- }
135
- ```
131
+ ---
136
132
 
137
- Ayar öncelik sırası: **`.mcp.json` env bloğu → `.env` (varsa; repo içinden çalışırken kökte
138
- durur) → şemadaki varsayılan.** `.env.example` tüm değişkenlerin tam listesidir. npx ile kurulan
139
- pakette `.env` yoktur, tüm ayarlar env bloğundan gelir.
140
-
141
- - `.mcp.json` sürüm kontrolündeyse parolayı düz yazmayın: Claude Code `${PASSWORD}` ve
142
- `${PASSWORD:-varsayılan}` genişletmesi yapar, değer kabuk ortamından gelir.
143
- - Genişletme **istemciye bağlıdır**: Claude Code açar, VS Code'un kendi MCP istemcisi açmaz ve
144
- metni olduğu gibi geçirir. Bu yüzden sunucu, açılmamış `${…}` yer tutucusunu boş değerle aynı
145
- sayıp **düşürür** — ayar `.env`'den ya da şema varsayılanından doldurulur, sunucu yer tutucu
146
- metinle patlamaz (`dropUnusableEnvironment`). Ortama göre gerçekten değişen ayarı `.env`'e
147
- koymak her istemcide çalışan yoldur.
148
- - Boş bırakılan (`""`) alanlar **tanımsız** sayılır; varsayılana düşer ya da `.env`'den
149
- doldurulur. Yani `"${MODULES:-}"` yazmak alanı hiç yazmamakla aynıdır.
150
- - Değişken adları ön eksizdir (`USERNAME`, `PASSWORD`, `TOKEN`, `LOG_LEVEL` …), yani kabuk
151
- ortamındaki aynı adlı değişkenlerle çakışabilir — `USERNAME` Windows'ta yerleşiktir, macOS
152
- kabukları da sık sık tanımlar. Bu yüzden `.mcp.json`'da `${USERNAME:-…}` gibi genişletme
153
- kullanmayın; değeri düz yazın.
154
- `USERNAME` işletim sisteminin kullanıcı adıyla (`USER`/`LOGNAME`) AYNIYSA sunucu onu düşürür ve
155
- `.env`'deki değer geçerli olur — bu guard olmadan terminalden `npm run dev` çalıştırmak kimliği
156
- makine kullanıcısı adıyla almaya kalkıyor ve `POST /connect/token` 404 dönüyordu. Hata metni
157
- "kayıt bulunamadı" olduğu için kimlik ayarına değil veriye işaret ediyor, teşhisi zorlaştırıyordu.
158
- - `LOG_DIR` verilmezse günlükler **çalışma dizininin** altındaki `logs/` klasörüne yazılır.
159
- - Konfigürasyon geçersizse sunucu stderr'e tek satır sebep yazıp `exit 1` yapar — istemci artık
160
- sessizce sıfır tool ile bağlanmaz.
161
-
162
- Yayınlama (paket bakımcısı için):
133
+ ## Modüller
163
134
 
164
- ```bash
165
- cd zeyrek-mcp
166
- npm run typecheck && npm test
167
- npm publish # prepack: tsc -p tsconfig.build.json + varlık kopyalama
168
- ```
135
+ `MODULES` ile tool seti daraltılabilir — tekil modül adı (`entity,row,microservice`), hazır küme
136
+ ya da ikisi karışık (`core,page`). `platform` modülü (3 tool) her kümede vardır.
137
+
138
+ | Küme | Tool | Modüller |
139
+ |---|---|---|
140
+ | `core` | 93 | platform, project, application, datasource, entity, row, microservice, query, workflow, automation, dto, view, dependency |
141
+ | `studio` | 59 | platform, page, component, externalComponent, flow, layout, variable, folder, file, access, translation |
142
+ | `admin` | 16 | platform, template, organization, deployment |
143
+ | (boş) | **167** | 27 modülün tamamı |
169
144
 
170
- `dist/` içine `src/resources/{schemas,guides,examples}` altındaki 41 JSON/MD varlığı
171
- `scripts/copy-assets.ts` kopyalar — `tsc` tek başına bunları taşımaz.
145
+ Bilinmeyen bir modül/küme adı verilirse sunucu açılmaz, geçerli adları listeleyen bir hata yazar.
146
+
147
+ ---
172
148
 
173
149
  ## Kullanım kalıpları
174
150
 
@@ -178,47 +154,39 @@ npm publish # prepack: tsc -p tsconfig.build.json + varlık kopyalama
178
154
  `definition` parametresini API'ye birebir geçirir. En iyi şablon, mevcut bir kaydın `*_get`
179
155
  çıktısıdır; step şeması için `workflow_step_schema` kullanılır.
180
156
  - **Test kası:** `microservice_execute` gerçek runtime yolunu çağırır; dönen `httpStatus`
181
- microservice'in kendi sonucudur. Beklenmedik sonuçta aynı parametrelerle
182
- `microservice_debug` çağırın — adım adım `executionItems` ağacı döner.
157
+ microservice'in kendi sonucudur. Beklenmedik sonuçta aynı parametrelerle `microservice_debug`
158
+ çağırın — adım adım `executionItems` ağacı döner.
183
159
  - **Asenkron işler:** `automation_trigger` fire-and-forget'tır (`automation_histories` ile
184
160
  izlenir); `deployment_start` bir saga başlatır (`deployment_status` ile izlenir).
185
161
  - **Sayfa tasarımı:** `layout_*` → `page_create` → `page_state` → `page_schema_patch`
186
162
  (micro-op); olay akışları `flow_*` + `set_event`. Şema değişikliği `page_update` ile değil
187
- `page_schema_patch` ile yapılır; `page_build` diye bir tool **yok** (platform ucu üründe
188
- olmayan ayrı bir servise delege ediyor) — ayrıntı `platform_guide('page')`.
163
+ `page_schema_patch` ile yapılır; `page_build` diye bir tool **yok** — ayrıntı
164
+ `platform_guide('page')`.
189
165
  - **Yazma tool'ları replace gövdeleri merge eder:** `page_update`, `layout_update`,
190
166
  `component_update` kaydı önce okur, yalnız verdiğiniz alanları değiştirir; şema/olay kaybı
191
167
  olmaz. `flow_*` uçlarının istediği barındırıcı gövdesini de gateway kurar.
192
- - Tool seti `MODULES` ile daraltılabilir: tekil modül adı (`entity,row,microservice`)
193
- ya da hazır küme — `core` (92 tool: veri + mantık), `studio` (50 tool: sayfa tasarımı),
194
- `admin` (15 tool: template, organizasyon, deployment). Küme ve modül adları karışık
195
- yazılabilir: `MODULES=core,page`.
196
-
197
- ## Bilgi katmanı (Faz 1.5)
198
-
199
- Tasarım: [`docs/07-bilgi-katmani.md`](docs/07-bilgi-katmani.md).
200
- Üç savunma hattı:
201
-
202
- - **Rehberler:** `platform_guide` tool'u (workflow, microservice, entity, page, component,
203
- html, layout, middleware, view, expressions, getting-started, modify-existing) + `ngapps://guides/*`
204
- resource'ları. Bir modülde ilk yazma işleminden önce ilgili rehber okunmalı; tool
205
- açıklamaları bunu söyler. Komponent davranış bilgisi ayrıca `component_get` çıktısında
206
- `knowledge` alanı olarak döner (`src/knowledge/componentCatalog.ts`).
207
- - **Altın örnekler:** `ngapps://examples/*` — boş org'da şablon kaynağı. Şu an sentetik seed;
208
- platform ayaktayken `npm run harvest-examples -- --project qm` ham hasadı
209
- `src/resources/examples/harvested/` altına yazar, küratörlükten geçen dosyalar `examples/`
210
- köküne taşınır.
168
+ - **Gerçek ekran:** UI değişikliği `page_screenshot` ile doğrulanır (`STUDIO_BASE_URL` gerekir;
169
+ ilk kullanımda `npx playwright-core install chromium`).
170
+
171
+ ## Bilgi katmanı
172
+
173
+ Üç savunma hattı, hepsi pakete gömülü — ayrı kurulum gerekmez:
174
+
175
+ - **Rehberler:** `platform_guide` tool'u (workflow, microservice, entity, page, component, html,
176
+ layout, middleware, view, expressions, getting-started, modify-existing) +
177
+ `ngapps://guides/*` resource'ları. Bir modülde ilk yazma işleminden önce ilgili rehber
178
+ okunmalıdır; tool açıklamaları bunu söyler. Komponent davranış bilgisi ayrıca `component_get`
179
+ çıktısında `knowledge` alanı olarak döner.
180
+ - **Altın örnekler:** `ngapps://examples/*` — boş org'da şablon kaynağı.
211
181
  - **Politika lint'i:** entity/microservice/workflow/automation create/update/preview gövdeleri
212
- API'ye gitmeden `src/knowledge/rules.ts` kurallarından geçer. Block kuralları (MS-001 join'li
213
- kaynakta boş selectFields, WF-001 kopuk step grafı, WF-002 workflow'da returnDtoId, WF-005
214
- tip×step matrisi) isteği durdurup düzeltme önerisi döner; warn bulguları yanıta
215
- `policyFindings` olarak eklenir. `POLICY=strict|warn|off`, çağrı başına kaçış:
216
- `policyOverride: true`. Kural envanteri: `docs/08-kural-envanteri.md`.
182
+ API'ye gitmeden kurallardan geçer. Block kuralları (MS-001 join'li kaynakta boş selectFields,
183
+ WF-001 kopuk step grafı, WF-002 workflow'da returnDtoId, WF-005 tip×step matrisi) isteği
184
+ durdurup düzeltme önerisi döner; warn bulguları yanıta `policyFindings` olarak eklenir.
185
+ `POLICY=strict|warn|off`, çağrı başına kaçış: `policyOverride: true`.
217
186
 
218
187
  ## Büyük şema erişimi
219
188
 
220
- Tam gövdeyi LLM bağlamına sokmadan çalışma modeli
221
- ([tasarım](docs/09-buyuk-sema-stratejisi.md)):
189
+ Tam gövdeyi LLM bağlamına sokmadan çalışma modeli:
222
190
 
223
191
  1. `project_overview` — projenin kompakt haritası (id/ad/tip envanteri)
224
192
  2. `workflow_get` / `microservice_get` / `entity_get` + `view: 'outline'` — iskelet
@@ -226,42 +194,110 @@ Tam gövdeyi LLM bağlamına sokmadan çalışma modeli
226
194
  4. `workflow_patch` / `microservice_patch` / `entity_patch` — RFC 6902 işlemleri; gateway
227
195
  get→patch→lint→put zincirini kendi belleğinde yürütür, yanıt outline özetidir
228
196
 
229
- ## Şema kaynakları
197
+ ---
198
+
199
+ ## Tool çağrısı günlüğü
200
+
201
+ Her MCP tool çağrısı, okunmak için biçimlenmiş tek bir blok olarak
202
+ `zeyrek-mcp/logs/gateway-YYYY-MM-DD.log` dosyasına yazılır (`.gitignore`'da; `LOG_LEVEL=detail|summary|off`).
203
+ Hızlı arama: `SONUÇ : HATA` tüm başarısız çağrılar, `#<n>` tek bir çağrı. Blok formatı, adım
204
+ etiketleri, diğer `LOG_*` ayarları ve maskeleme:
205
+ [`docs/30-tool-cagri-gunlugu.md`](docs/30-tool-cagri-gunlugu.md).
206
+
207
+ ## Sorun giderme
230
208
 
231
- API'ler ayaktayken:
209
+ | Belirti | Sebep / çözüm |
210
+ |---|---|
211
+ | İstemci bağlanıyor ama **hiç tool görünmüyor** | Konfigürasyon geçersiz. Sunucu stderr'e tek satır sebep yazıp `exit 1` yapar; istemcinin MCP log'una bakın. En sık: `DEFAULT_ENVIRONMENT` boş, `USERNAME`/`PASSWORD` eksik. |
212
+ | `POST /connect/token` 404 / "kayıt bulunamadı" | Kimlik makine kullanıcı adıyla gidiyor — `USERNAME` üstteki üçüncü davranış maddesi. |
213
+ | `Host` çözülemedi / 404 | `ORGANIZATION` + `HOST_SUFFIX` birlikte `{org}.{suffix}` üretir; ikisi de doğru olmalı. |
214
+ | `page_screenshot` hata veriyor | `STUDIO_BASE_URL` boş ya da tarayıcı yok: `npx playwright-core install chromium` veya `SCREENSHOT_BROWSER_PATH`. |
215
+ | Eski sürüm çalışıyor | npx önbelleği: `.mcp.json`'da sabit sürüm yazın ve sunucuyu yeniden başlatın. |
216
+
217
+ Her durumda ilk bakılacak yer günlük dosyasıdır (`LOG_DIR`).
218
+
219
+ ---
220
+
221
+ ## HTTP kipi
222
+
223
+ Gateway'i ortak bir sunucu olarak çalıştırmak için (stateless streamable HTTP; `/mcp`, yalnız
224
+ POST):
232
225
 
233
226
  ```bash
234
- npm run generate-schemas
227
+ npx -y @appaflytech/zeyrek-ai-mcp@0.0.5 # --stdio olmadan
235
228
  ```
236
229
 
237
- Swagger'dan seçili komut şemalarını `src/resources/schemas/` altına yazar; sunucu bunları
238
- `ngapps://schemas/*` MCP resource'ları olarak yayınlar (`ngapps://schemas/index` dizindir).
239
- Üretilen JSON'lar klasörde durur ve gateway'le birlikte taşınır — script yalnızca yeniden
240
- üretmek için gerekir.
230
+ Sağlık ucu: `http://localhost:5100/healthz` (port `MCP_PORT`). İstemci kaydı:
241
231
 
242
- Swagger adresi sırayla denenir: `ORG_SWAGGER_URL` / `TENANT_SWAGGER_URL`
243
- override'ları → `{API_BASE_URL}/swagger/v1/swagger.json` → `localhost:3000` frontend proxy'si
244
- (`/api/org` ve `/api`). Hangi adresin kullanıldığı çıktıda yazar.
232
+ ```bash
233
+ claude mcp add zeyrek-ai --transport http http://localhost:5100/mcp
234
+ ```
235
+
236
+ `AUTH_MODE=passthrough` yalnız bu kipte anlamlıdır: kimlik istemcinin `Authorization` header'ından
237
+ geçer. (PoC boyunca `local` modda test edildi.)
238
+
239
+ ---
240
+
241
+ ## Geliştirme (repo)
242
+
243
+ Bu paket [monorepo](https://gitlab.com/new-zeyrek/zeyrek-app) içindeki `zeyrek-mcp/` klasöründen
244
+ yayınlanır. Aşağıdaki bağlantılar ve komutlar **repo içinde** geçerlidir; npm paketinde `docs/`
245
+ ve `src/` yoktur.
246
+
247
+ ```bash
248
+ cd zeyrek-mcp
249
+ npm install
250
+ cp .env.example ../.env # uzak profil için: cp .env.production.example ../.env
251
+ npm run dev # HTTP · npm run start:stdio ile stdio
252
+ ```
253
+
254
+ `.env` **repo kökünde**, `.mcp.json`'ın yanında durur. Repo kökündeki `.mcp.json` sunucuyu
255
+ `zeyrek-mcp/node_modules/.bin/tsx` ile başlatır — bağımlılıklar kurulu değilken MCP istemcisi
256
+ hata vermeden sıfır tool ile bağlanır; repoyu yeni klonladıysanız ilk adım `npm install`'dır.
245
257
 
246
- ## Test
258
+ Doğrulama:
247
259
 
248
260
  ```bash
249
261
  npm run typecheck
250
- npm test
262
+ npm test # gerçek ağa çıkmaz (undici MockAgent); MCP katmanı InMemoryTransport ile
263
+ npm run docs:lint
251
264
  ```
252
265
 
253
- Testler gerçek ağa çıkmaz (undici `MockAgent`); MCP katmanı `InMemoryTransport` üzerinden
254
- gerçek el sıkışmasıyla doğrulanır.
266
+ Şema kaynakları (API'ler ayaktayken): `npm run generate-schemas`, Swagger'dan seçili komut
267
+ şemalarını `src/resources/schemas/` altına yazar; sunucu bunları `ngapps://schemas/*` resource'ları
268
+ olarak yayınlar (`ngapps://schemas/index` dizindir). Swagger adresi sırayla denenir:
269
+ `ORG_SWAGGER_URL` / `TENANT_SWAGGER_URL` override'ları → `{API_BASE_URL}/swagger/v1/swagger.json`
270
+ → `localhost:3000` frontend proxy'si.
271
+
272
+ Tasarım ve durum dokümanları: [`docs/INDEX.md`](docs/INDEX.md),
273
+ [`docs/00-durum-ve-yol-haritasi.md`](docs/00-durum-ve-yol-haritasi.md),
274
+ kural envanteri [`docs/08-kural-envanteri.md`](docs/08-kural-envanteri.md).
275
+
276
+ ### Yayınlama (paket bakımcısı)
277
+
278
+ ```bash
279
+ cd zeyrek-mcp
280
+ npm run typecheck && npm test
281
+ npm version patch # package.json sürümü
282
+ npm publish # prepack: tsc -p tsconfig.build.json + varlık kopyalama
283
+ ```
284
+
285
+ `dist/` içine `src/resources/{schemas,guides,examples}` altındaki JSON/MD varlıklarını
286
+ `scripts/copy-assets.ts` kopyalar — `tsc` tek başına bunları taşımaz. Yayınlanan paket
287
+ `dist/`, `README.md` ve iki `.env` şablonundan oluşur.
288
+
289
+ Sürüm yükseldikten sonra ekipteki `.mcp.json` örneklerindeki sabit sürümü de güncelleyin.
290
+
291
+ ---
255
292
 
256
- ## Bilinen sınırlar (PoC)
293
+ ## Bilinen sınırlar
257
294
 
258
295
  - `project_create/update` `LoaderImage` yüklemez (multipart dosya kapsam dışı; urlencoded form
259
296
  kullanılır).
260
- - `row_list.selectedFields` kırpması gateway tarafında yapılır: platform `GetRowsQuery.SelectedFields`
261
- alanını yalnızca many-to-many alt sorgularını daraltmak için okur, skaler kolonlar için her zaman
262
- tam satır döner. Gateway satırları verilen alanlara (+`id`) indirger; alan eşleşmesi
263
- büyük/küçük harf duyarsızdır.
297
+ - `row_list.selectedFields` kırpması gateway tarafında yapılır: platform
298
+ `GetRowsQuery.SelectedFields` alanını yalnızca many-to-many alt sorgularını daraltmak için okur,
299
+ skaler kolonlar için her zaman tam satır döner. Gateway satırları verilen alanlara (+`id`)
300
+ indirger; alan eşleşmesi büyük/küçük harf duyarsızdır.
264
301
  - `microservice_execute` dosya (stream) çıktısını içerik olarak aktarmaz.
265
- - Passthrough auth modu tanımlı ama uçtan uca tatbik edilmedi; PoC `local` modda test edilir.
266
- - Docker/compose servisi bilinçli olarak ertelendi (Faz 3 backlog'u —
267
- `docs/00-durum-ve-yol-haritasi.md` §5.4).
302
+ - Passthrough auth modu tanımlı ama uçtan uca tatbik edilmedi.
303
+ - Docker/compose servisi bilinçli olarak ertelendi.
package/dist/config.js CHANGED
@@ -1,3 +1,4 @@
1
+ import { userInfo } from "node:os";
1
2
  import { z } from "zod";
2
3
  export const moduleNames = [
3
4
  "platform",
@@ -10,6 +11,7 @@ export const moduleNames = [
10
11
  "query",
11
12
  "workflow",
12
13
  "automation",
14
+ "globalFunction",
13
15
  "dto",
14
16
  "view",
15
17
  "page",
@@ -39,6 +41,7 @@ export const modulePresets = {
39
41
  "query",
40
42
  "workflow",
41
43
  "automation",
44
+ "globalFunction",
42
45
  "dto",
43
46
  "view",
44
47
  "dependency",
@@ -97,8 +100,22 @@ const environmentSchema = z.object({
97
100
  MCP_PORT: z.coerce.number().int().positive().default(5100),
98
101
  STUDIO_BASE_URL: z.string().url().optional(),
99
102
  SCREENSHOT_BROWSER_PATH: z.string().min(1).optional(),
103
+ SCREENSHOT_QUEUE_WAIT_MS: z.coerce.number().int().positive().default(120000),
100
104
  });
101
105
  export const environmentKeys = Object.keys(environmentSchema.shape);
106
+ /**
107
+ * Makine kullanıcısının adı. Windows `USER`/`LOGNAME` tanımlamaz — o ikisi POSIX kabuklarına
108
+ * aittir — bu yüzden `USERNAME` gölgelemesinin HER ZAMAN yaşandığı platformda kıyaslanacak ad
109
+ * yalnız buradan gelir. Kısıtlı ortamlarda çağrı fırlatabildiği için sarılıdır.
110
+ */
111
+ function machineUserName() {
112
+ try {
113
+ return userInfo().username;
114
+ }
115
+ catch {
116
+ return undefined;
117
+ }
118
+ }
102
119
  /**
103
120
  * `.mcp.json` env bloğundan gelen KULLANILAMAZ değerleri süreç ortamından düşürür ki `.env`
104
121
  * (dotenv mevcut anahtarları ezmez) ve şema varsayılanları devreye girebilsin. İki hâl
@@ -114,14 +131,14 @@ export const environmentKeys = Object.keys(environmentSchema.shape);
114
131
  * sisteminin kullanıcı adıyla AYNIYSA düşürülür: gerçekten o adla giren bir kurulum zaten
115
132
  * `.env`/`.mcp.json`'da aynı değeri yazar ve dosyadan geri okunur.
116
133
  */
117
- export function dropUnusableEnvironment(env) {
134
+ export function dropUnusableEnvironment(env, osUserName = machineUserName()) {
118
135
  for (const key of environmentKeys) {
119
136
  const value = env[key];
120
137
  if (value === "" || (value !== undefined && /^\$\{[^}]*\}$/.test(value))) {
121
138
  delete env[key];
122
139
  }
123
140
  }
124
- const osUser = env.USER ?? env.LOGNAME;
141
+ const osUser = env.USER ?? env.LOGNAME ?? osUserName;
125
142
  if (env.USERNAME !== undefined && env.USERNAME === osUser) {
126
143
  delete env.USERNAME;
127
144
  }
@@ -191,5 +208,6 @@ export function loadConfig(env) {
191
208
  port: values.MCP_PORT,
192
209
  studioBaseUrl: values.STUDIO_BASE_URL?.replace(/\/+$/, ""),
193
210
  screenshotBrowserPath: values.SCREENSHOT_BROWSER_PATH,
211
+ screenshotQueueWaitMs: values.SCREENSHOT_QUEUE_WAIT_MS,
194
212
  };
195
213
  }