@appaflytech/zeyrek-ai-mcp 0.0.31 → 0.0.32

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 (205) hide show
  1. package/.env.example +0 -15
  2. package/README.md +5 -5
  3. package/dist/config.js +0 -37
  4. package/dist/index.js +0 -2
  5. package/dist/knowledge/backendConstraints.js +1 -18
  6. package/dist/knowledge/boxSections.js +184 -0
  7. package/dist/knowledge/componentCatalog.js +233 -568
  8. package/dist/knowledge/componentEvents.js +21 -141
  9. package/dist/knowledge/layoutSummary.js +2 -140
  10. package/dist/knowledge/normalize.js +67 -236
  11. package/dist/knowledge/outlines.js +0 -36
  12. package/dist/knowledge/policy.js +4 -18
  13. package/dist/knowledge/reservedTables.js +0 -79
  14. package/dist/knowledge/rules.js +21 -366
  15. package/dist/knowledge/schemaGuard.js +0 -11
  16. package/dist/knowledge/styleResolve.js +38 -55
  17. package/dist/knowledge/themeResolve.js +3 -3
  18. package/dist/observability/trace.js +3 -6
  19. package/dist/platform/diagnostics.js +4 -10
  20. package/dist/platform/domSummary.js +1 -1
  21. package/dist/platform/errors.js +10 -162
  22. package/dist/platform/http.js +8 -29
  23. package/dist/platform/responses.js +5 -39
  24. package/dist/platform/{capture/capture.js → screenshot.js} +519 -105
  25. package/dist/platform/secrets.js +1 -17
  26. package/dist/platform/strictArguments.js +12 -68
  27. package/dist/platform/tokenVault.js +4 -187
  28. package/dist/resources/examples/layout-app-shell.json +707 -229
  29. package/dist/resources/examples/middleware-authenticate.json +1 -1
  30. package/dist/resources/examples/page-detail-profile.json +1 -2
  31. package/dist/resources/examples/page-dynamic-form.json +2 -3
  32. package/dist/resources/examples/page-flex-sections.json +1 -1
  33. package/dist/resources/examples/page-html-embed.json +1 -1
  34. package/dist/resources/examples/workflow-basic.json +2 -8
  35. package/dist/resources/guides/component.md +5 -92
  36. package/dist/resources/guides/entity.md +8 -50
  37. package/dist/resources/guides/expressions.md +5 -14
  38. package/dist/resources/guides/functions.md +1 -1
  39. package/dist/resources/guides/getting-started.md +1 -38
  40. package/dist/resources/guides/layout.md +58 -55
  41. package/dist/resources/guides/merge.md +3 -37
  42. package/dist/resources/guides/microservice.md +2 -87
  43. package/dist/resources/guides/middleware.md +4 -68
  44. package/dist/resources/guides/page.md +75 -456
  45. package/dist/resources/guides/theme.md +2 -8
  46. package/dist/resources/guides/translation.md +1 -1
  47. package/dist/resources/guides/workflow.md +1 -58
  48. package/dist/resources/rules.js +5 -11
  49. package/dist/resources/schema-fingerprint.json +5 -7
  50. package/dist/resources/schemas/CreateEntityCommand.json +0 -118
  51. package/dist/resources/schemas/CreateMicroserviceCommand.json +1 -13
  52. package/dist/resources/schemas/CreateQueryCommand.json +0 -4
  53. package/dist/resources/schemas/CreateWorkflowCommand.json +1 -146
  54. package/dist/resources/schemas/DataJobDto.json +1 -6
  55. package/dist/resources/schemas/GlobalFunctionUpdateResultDto.json +1 -21
  56. package/dist/resources/schemas/MicroserviceDto.json +3 -15
  57. package/dist/resources/schemas/PreviewMicroserviceCommand.json +1 -10
  58. package/dist/resources/schemas/PreviewWorkflowCommand.json +1 -25
  59. package/dist/resources/schemas/StepDto.json +1 -25
  60. package/dist/resources/schemas/UpdateEntityCommand.json +0 -118
  61. package/dist/resources/schemas/UpdateMicroserviceCommand.json +1 -13
  62. package/dist/resources/schemas/UpdateQueryCommand.json +0 -4
  63. package/dist/resources/schemas/UpdateViewCommand.json +2 -0
  64. package/dist/resources/schemas/UpdateWorkflowCommand.json +1 -146
  65. package/dist/server.js +1 -27
  66. package/dist/tools/access.js +2 -369
  67. package/dist/tools/applications.js +3 -60
  68. package/dist/tools/common.js +0 -7
  69. package/dist/tools/components.js +14 -118
  70. package/dist/tools/datasources.js +3 -3
  71. package/dist/tools/dependencies.js +1 -1
  72. package/dist/tools/deployments.js +3 -38
  73. package/dist/tools/designSchemaPatch.js +18 -34
  74. package/dist/tools/dtos.js +5 -36
  75. package/dist/tools/entities.js +12 -79
  76. package/dist/tools/externalComponents.js +5 -26
  77. package/dist/tools/flows.js +14 -122
  78. package/dist/tools/folders.js +1 -1
  79. package/dist/tools/imports.js +2 -5
  80. package/dist/tools/layouts.js +17 -50
  81. package/dist/tools/merges.js +2 -2
  82. package/dist/tools/microservices.js +25 -77
  83. package/dist/tools/pages.js +112 -465
  84. package/dist/tools/platformInfo.js +8 -27
  85. package/dist/tools/projects.js +9 -71
  86. package/dist/tools/rows.js +13 -69
  87. package/dist/tools/schemaOps.js +1 -61
  88. package/dist/tools/screenWrite.js +8 -37
  89. package/dist/tools/screens.js +5 -95
  90. package/dist/tools/templates.js +1 -26
  91. package/dist/tools/translations.js +1 -1
  92. package/dist/tools/variables.js +5 -11
  93. package/dist/tools/workflows.js +5 -10
  94. package/package.json +1 -1
  95. package/dist/knowledge/access.js +0 -802
  96. package/dist/knowledge/case.js +0 -41
  97. package/dist/knowledge/connectDataBind.js +0 -819
  98. package/dist/knowledge/connectDataDefinition.js +0 -341
  99. package/dist/knowledge/connectDataExecute.js +0 -93
  100. package/dist/knowledge/connectDataRules.js +0 -128
  101. package/dist/knowledge/decision.js +0 -121
  102. package/dist/knowledge/expressionPrelude.js +0 -59
  103. package/dist/knowledge/microserviceParameters.js +0 -58
  104. package/dist/knowledge/mining.js +0 -94
  105. package/dist/knowledge/mobileComponentCatalog.js +0 -859
  106. package/dist/knowledge/mobileComponentEvents.js +0 -239
  107. package/dist/knowledge/platform/lint.js +0 -385
  108. package/dist/knowledge/platform/mobile.js +0 -142
  109. package/dist/knowledge/platform/mobileLayoutLint.js +0 -324
  110. package/dist/knowledge/platform/mobileRules.js +0 -231
  111. package/dist/knowledge/platform/mobileSpacing.js +0 -82
  112. package/dist/knowledge/platform/mobileTabs.js +0 -108
  113. package/dist/knowledge/platform/nativeBoxModel.js +0 -44
  114. package/dist/knowledge/platform/profile.js +0 -25
  115. package/dist/knowledge/platform/resolve.js +0 -122
  116. package/dist/knowledge/platform/web.js +0 -39
  117. package/dist/knowledge/process.js +0 -510
  118. package/dist/knowledge/rowFilter.js +0 -43
  119. package/dist/knowledge/styleResolveNative.js +0 -527
  120. package/dist/platform/argumentAliases.js +0 -128
  121. package/dist/platform/bodyFile.js +0 -103
  122. package/dist/platform/capture/actions.js +0 -333
  123. package/dist/platform/capture/browser.js +0 -1
  124. package/dist/platform/capture/console-log.js +0 -122
  125. package/dist/platform/capture/index.js +0 -11
  126. package/dist/platform/capture/readiness.js +0 -103
  127. package/dist/platform/capture/summary.js +0 -77
  128. package/dist/platform/capture/target.js +0 -5
  129. package/dist/platform/capture/targets/studio-mobile.js +0 -15
  130. package/dist/platform/capture/targets/studio-web.js +0 -5
  131. package/dist/platform/impersonation.js +0 -45
  132. package/dist/platform/jsonArray.js +0 -24
  133. package/dist/platform/schemaReadMemory.js +0 -60
  134. package/dist/resources/examples/bpm-gorev-kontrol.json +0 -294
  135. package/dist/resources/examples/bpm-iso-dokuman.json +0 -228
  136. package/dist/resources/examples/bpm-satinalma.json +0 -376
  137. package/dist/resources/examples/connect-data-convert-verify.json +0 -107
  138. package/dist/resources/examples/connect-data-dropdown-roles.json +0 -66
  139. package/dist/resources/examples/connect-data-edit-m2m.json +0 -73
  140. package/dist/resources/examples/connect-data-query-params.json +0 -50
  141. package/dist/resources/examples/connect-data-table-entity.json +0 -147
  142. package/dist/resources/examples/connect-data-workflow-microservice.json +0 -65
  143. package/dist/resources/examples/mobile-app-shell-drawer.json +0 -243
  144. package/dist/resources/examples/mobile-app-shell-stack.json +0 -157
  145. package/dist/resources/examples/mobile-app-shell-tab.json +0 -208
  146. package/dist/resources/examples/mobile-form-screen.json +0 -365
  147. package/dist/resources/examples/mobile-list-detail-form.json +0 -672
  148. package/dist/resources/guides/access.md +0 -810
  149. package/dist/resources/guides/bpm.md +0 -691
  150. package/dist/resources/guides/case.md +0 -153
  151. package/dist/resources/guides/decision.md +0 -185
  152. package/dist/resources/guides/mobile-layout.md +0 -193
  153. package/dist/resources/guides/mobile.md +0 -495
  154. package/dist/resources/read.js +0 -41
  155. package/dist/resources/schemas/AccessExplanationDto.json +0 -144
  156. package/dist/resources/schemas/AccessMatrixDto.json +0 -170
  157. package/dist/resources/schemas/AccessPermissionDto.json +0 -57
  158. package/dist/resources/schemas/AccessPolicyDto.json +0 -223
  159. package/dist/resources/schemas/AccessResourceDto.json +0 -86
  160. package/dist/resources/schemas/AppSessionDto.json +0 -53
  161. package/dist/resources/schemas/ConnectDataDescribeDto.json +0 -344
  162. package/dist/resources/schemas/ConnectDataRequestModel.json +0 -202
  163. package/dist/resources/schemas/ConnectDataResultDto.json +0 -421
  164. package/dist/resources/schemas/ConnectorCredentialDto.json +0 -70
  165. package/dist/resources/schemas/ConvertConnectDataToMicroserviceCommand.json +0 -37
  166. package/dist/resources/schemas/CreateAccessPolicyCommand.json +0 -209
  167. package/dist/resources/schemas/CreateDecisionCommand.json +0 -221
  168. package/dist/resources/schemas/CreateProcessDefinitionCommand.json +0 -1337
  169. package/dist/resources/schemas/DecisionDto.json +0 -302
  170. package/dist/resources/schemas/DetachConnectDataMicroserviceCommand.json +0 -28
  171. package/dist/resources/schemas/ExplainAccessQuery.json +0 -33
  172. package/dist/resources/schemas/GenerateProcessDocumentCommand.json +0 -116
  173. package/dist/resources/schemas/OrganizationProjectDto.json +0 -335
  174. package/dist/resources/schemas/OrganizationSchemaDto.json +0 -196
  175. package/dist/resources/schemas/OrganizationSchemaVersionDto.json +0 -207
  176. package/dist/resources/schemas/PatchProcessDefinitionCommand.json +0 -76
  177. package/dist/resources/schemas/ProcessDefinitionDto.json +0 -1480
  178. package/dist/resources/schemas/ProcessSimulationDto.json +0 -96
  179. package/dist/resources/schemas/SaveConnectorCredentialCommand.json +0 -90
  180. package/dist/resources/schemas/SaveProcessEventSourceCommand.json +0 -61
  181. package/dist/resources/schemas/SaveProcessMailSourceCommand.json +0 -89
  182. package/dist/resources/schemas/SignProcessTaskCommand.json +0 -73
  183. package/dist/resources/schemas/SimulateProcessDefinitionQuery.json +0 -92
  184. package/dist/resources/schemas/UpdateAccessPolicyCommand.json +0 -209
  185. package/dist/resources/schemas/UpdateDecisionCommand.json +0 -216
  186. package/dist/resources/schemas/UpdateProcessDefinitionCommand.json +0 -1357
  187. package/dist/resources/schemas/ValidateProcessDefinitionQuery.json +0 -1339
  188. package/dist/tools/accessOperations.js +0 -135
  189. package/dist/tools/accessPolicies.js +0 -170
  190. package/dist/tools/accessRuntime.js +0 -203
  191. package/dist/tools/bpm.js +0 -343
  192. package/dist/tools/bpmGovernance.js +0 -266
  193. package/dist/tools/bpmOperations.js +0 -230
  194. package/dist/tools/bpmReporting.js +0 -154
  195. package/dist/tools/bpmRouting.js +0 -150
  196. package/dist/tools/bpmRuntime.js +0 -396
  197. package/dist/tools/case.js +0 -178
  198. package/dist/tools/caseRuntime.js +0 -89
  199. package/dist/tools/connectData.js +0 -449
  200. package/dist/tools/connectors.js +0 -193
  201. package/dist/tools/decisions.js +0 -206
  202. package/dist/tools/mobile.js +0 -221
  203. package/dist/tools/modules.js +0 -48
  204. package/dist/tools/organizationStructure.js +0 -137
  205. package/dist/tools/profileWrite.js +0 -92
@@ -4,10 +4,6 @@ Sayfaların paylaştığı kabuk: yan menü, üst şerit, kullanıcı menüsü v
4
4
  gireceği delik. Şema gövdesi ve koordinat modeli için `platform_guide('page')` (Kural 1,
5
5
  1d, 1f); komponent sözleşmeleri için `platform_guide('component')`.
6
6
 
7
- > **Mobil uygulamada** kabuk `app-bar` + tek `slot`'tur; sekmeler uygulama ayarı
8
- > (`properties.mobile.tabs`), çekmece `drawer` widget'ıdır. Web kabuk bileşenleri (`navigations`,
9
- > `sidebar`, `header`) `MOB-004` alır — `platform_guide('mobile')` §Gezinme.
10
-
11
7
  ## Karar kuralları
12
8
 
13
9
  **1. Layout, tek `slot` içeren SIRADAN bir komponent ağacıdır.** Ayrı bir dil yoktur:
@@ -43,16 +39,20 @@ göre kurmaktır. `version` bir **string**tir (mikrosaniye zaman damgası) — s
43
39
  **4. TEK slot.** Sayfa şeması **her** slot'a ayrı ayrı kopyalanır — iki slot, sayfayı iki
44
40
  kez çizer ve `elementId`'leri tekrarlar. (LAY-002 / LAY-006)
45
41
 
46
- **5. Kabuğu `container` + `slot` ile kur.** `layout` monoliti (sabit logo/menü/kullanıcı
47
- bandı — yalnız doldurulur) ve `layout-shell` + `layout-region` ikilisi **emekliye
48
- ayrıldı**; kayıtlı kalırlar ve mevcut layout'lar çalışır, ama yeni kabuk `container` ile
49
- kurulur. Sebebi: `container` zaten `layout-region`'ın yaptığının üstünü yapıyor (flex/ızgara
50
- düzeni, hizalama, gap, wrap), region'ın kattığı tek şey `dock` sözlüğüydü.
51
-
52
- **5a. Kök, sayfanın `page_container`'ının yerleşim ikizidir.** Studio'nun yeni layout
53
- iskeleti (`getDefaultLayout`) tam olarak şunu kurar ve sen de aynısını yazmalısın:
54
- `states.isWrapper: true` (çerçevesiz, başlıksız, saydam) + `appearance.heightType: 'fill'`
55
- + `blocks` x0/w12. Sarmalayıcı olmayan bir kök, kenarlıklı beyaz bir kart olarak çizilir.
42
+ **5. VARSAYILAN kabuğu kullan, sonra özelleştir (2026-09-29).** Yeni bir layout kurarken
43
+ önce `ngapps://examples/layout-app-shell` örneğini `layout_create`'in `views` alanına olduğu
44
+ gibi ver — Studio'da "New layout" ile açılan iskeletin birebir aynısıdır (aşağıdaki mini
45
+ tarif). Sonra uygulamaya göre değiştir: menü öğeleri ve `href`'leri, başlık, ikonlar;
46
+ gerekmeyen parçayı (arama, yardım, bildirim) sil. Kullanıcı açıkça başka bir kabuk isterse
47
+ sıfırdan kur. Kabuk sıradan bileşenlerden oluşur: `container` + `navigations` + `icon` +
48
+ `slot`. `layout` monoliti (sabit logo/menü/kullanıcı bandı — yalnız doldurulur) ve
49
+ `layout-shell` + `layout-region` ikilisi **emekliye ayrıldı**; kayıtlı kalırlar ve mevcut
50
+ layout'lar çalışır, ama yeni kabukta kullanılmaz — Studio iskeleti de artık onları kurmaz.
51
+
52
+ **5a. Kök, sayfanın `page_container`'ının yerleşim ikizidir.** Varsayılan kabuk kökü şöyle
53
+ kurar ve sen de aynısını yazmalısın: `states.isWrapper: true` (çerçevesiz, başlıksız,
54
+ saydam) + `appearance.heightType: 'fill'` + `blocks` x0/w12. Sarmalayıcı olmayan bir kök,
55
+ kenarlıklı beyaz bir kart olarak çizilir.
56
56
 
57
57
  **5b. Tam ekran kabuk `heightType: 'fill'` ile kurulur (2026-08-28).** Yükseklik ne
58
58
  içerikten (`auto`) ne satır sayısından (`fixed`) gelir — ebeveynin bıraktığı yerden gelir:
@@ -65,7 +65,7 @@ yapılan eski numaraya artık gerek yok.
65
65
  NEREDE durduğunu değil, BİÇİMİNİ söyler (dikey kolon / yatay şerit / dolgu yüzeyi). Hem
66
66
  runtime hem Studio tuvali bölgeleri 12 kolonluk ızgarayla yerleştirir.
67
67
 
68
- **7. Dar ekranda flex YIĞILMAZ.** Runtime'ın dar ekran kuralı yalnız ızgara özelliklerini ezer.
68
+ **7. Mobilde flex YIĞILMAZ.** Runtime'ın mobil kuralı yalnız ızgara özelliklerini ezer.
69
69
  Telefonda alt alta düşmesi gereken satırı `layout:'grid'` ile kur; `layout:'flex'` +
70
70
  `direction:'row'` telefonda da yan yana kalır (375px'te ölçüldü: ızgara çocukları 375/375px
71
71
  alt alta, flex çocukları 49/310px yan yana). Not: `wrap` varsayılanı artık açık (2026-09-01) —
@@ -76,45 +76,48 @@ yana kalmaya devam eder.
76
76
  gerçek çıktıyı, layout'a bağlı bir sayfanın runtime paketinde görürsün (slot yerleşimi
77
77
  dahil). Slot kurgusu için ayrıca `page_state` → `layoutSlots`.
78
78
 
79
- ## Mini tarif — uygulama kabuğu
79
+ ## Mini tarif — uygulama kabuğu (VARSAYILAN)
80
80
 
81
- Yan menü + üst şerit + içerik. Studio'nun `getDefaultLayout` iskeletiyle birebir aynı ağaç;
82
- `layout_create`'in `views` alanına doğrudan verilebilir (`resource: layout-app-shell`).
81
+ Sol menü + üst şerit + ortada boş içerik alanı ve slot. Studio'nun `getDefaultLayout`
82
+ iskeletiyle birebir aynı ağaç; `layout_create`'in `views` alanına doğrudan verilebilir
83
+ (`resource: layout-app-shell`).
83
84
 
84
85
  ```
85
- container isWrapper:true heightType:'fill' layout:'flex' direction:'row' gap:'none'
86
- │ verticalAlign:'stretch' block w12 x0
87
- ├ container heightType:'fill' layout:'flex' direction:'column' block w2 ← yan menü
88
- │ └ navigations block w12
89
- └ container heightType:'fill' layout:'flex' direction:'column' block w10 x2
90
- ├ container layout:'flex' direction:'row' states.isSticky block w12 h6
91
- │ └ breadcrumb block w12 h3
92
- └ slot heightType:'fill' block w12 y6
86
+ container shell_root isWrapper · fill · flex row · gap none · stretch
87
+ └ navigations shell_menu layout:'sidebar' · fill · başlık + menüde arama + daraltma
88
+ └ container shell_main fill · flex column · wrap:false · center · zemin surface-alt · taşma gizli
89
+ ├ container shell_topbar fixed 64px · flex row · stretch/middle · wrap:false · alt çizgi
90
+ │ ├ navigations shell_crumbs layout:'breadcrumb' · 30px · fill
91
+ │ ├ navigations shell_search layout:'command' · 393px × 36px · "Sayfa ara…"
92
+ │ ├ icon shell_help help · tooltip "Yardım"
93
+ │ └ icon shell_bell notifications · tooltip "Bildirimler"
94
+ └ container shell_content fill · isScrollable · isWrapper · dolgu 28/32/32/32
95
+ └ container shell_page fill · en fazla 1600px · ortalı
96
+ └ slot shell_slot fill
93
97
  ```
94
98
 
95
- - **Genişlik `appearance.widthType`'tan gelir (2026-09-01); kolon payı fallback'tir.**
96
- Yan menü için `widthType: 'fixed'` + `widthString: "240px"` (serbest CSS uzunluğu:
97
- `"50%"`, `"10vw"`, `calc(...)` de geçer; yalnız flex kabın çocuğunda okunur, mutlak
98
- ızgara kabında okunmaz). `'fill'` kabın tüm genişliğini alır, `'auto'` içeriğe oturur;
99
- `widthType` HİÇ yazılmazsa `w:2` = 12'de 2 → 1440px tasarım genişliğinde 240px payı
100
- geçerlidir. String yalnız `'fixed'` modda okunur — tek başına `widthString` ölüdür.
101
- - **Yükseklik `fill`'dir**, `size.h` değil: kök ekranı doldurur, yan menü ve içerik sütunu
102
- kökün bıraktığını, slot da üst şeritten artanı alır. Slot'un grid satırı ayrıca açık
103
- uçludur (`y / auto`), yani sayfa uzadıkça slot uzar.
104
- - **Kaydırma:** `fill` + `states.isScrollable:true` verilen düğüm büyümek yerine İÇİNDE
105
- kaydırır — uzun içerikte kabuğu sabit tutmanın yolu budur.
106
- - **Slot'un kenar boşluğu margin'dir, padding değil.** Slot droppable değildir; ona yazılan
107
- `paddingType`/`paddingValue` hiçbir kutuya çizilmez (LAY-010). Her sayfanın kenardan uzak
108
- durmasını tek yerden istiyorsan slot'a `appearance.marginType: 'custom'` + `marginValue: 24`
109
- yaz — margin slot'un sarmalayıcısına iç boşluk olarak iner ve slot'un zemini olmadığı için
110
- sonuç padding'le aynıdır. Studio iskeleti slot'a zaten 8px custom margin verir. Değer SAYIDIR
111
- (`24`, `"24px"` değil — LAY-011). Her sayfaya sarmalayıcı container eklemek gerekmez.
112
- - **MOBİL UYARISI:** bu ağaç `flex` olduğu için telefonda YIĞILMAZ (Kural 7) — 375px'te yan
113
- menü ince bir şerite iner. Telefonda alt alta düşmesi gereken bir kabuk için kökü
114
- `layout:'grid'` kur; o zaman `fill`'in flex anlamı (`flex:1 1 auto`) devreye girmez,
115
- yükseklik yine `blocks` satırlarından gelir. İkisini aynı anda veren bir yol bugün yok.
116
- - Menü satırlarını biçimlendirme: **bugün mümkün değil.** `navigations`'ın `style` prop'u
117
- ölüdür (bkz. `component_get('navigations')`).
99
+ - **Menü bir kaptır.** `navigations` droppable'dır ve içine bırakılanı KENDİ YANINA çizer:
100
+ `shell_main` kökün değil menünün çocuğudur. Ana sütunu köke kardeş koyarsan satıra
101
+ sığmaz ve menünün altına sarar (ölçüldü 2026-09-29).
102
+ - **Tek menü, üç görünüm.** Menü, kırıntı yolu (`layout:'breadcrumb'`) ve arama
103
+ (`layout:'command'`) AYNI `navigations` ağacını taşır; kırıntı aktif sayfanın yolunu, komut
104
+ paleti sonuçları bu ağaçtan çıkarır. Menüyü değiştirirken üçünü birlikte güncelle.
105
+ - **Örnek menü adressizdir.** Öğelere `href` olarak sayfa slug'ı ya da `{ page: '<id>' }` ver;
106
+ başlıkları ve ikonları uygulamanın diline göre değiştir. Menü başlığı (`title`) uygulamanın
107
+ adıdır. Renkler tema token'ıdır (`var(--ng-text-primary)` …) — sabit hex yazma, koyu temada
108
+ okunmaz.
109
+ - **Yerleşim prop'larını açıkça yaz.** `layout_create` katalog varsayılanlarını düğüme
110
+ yazmaz: `layout` prop'u olmayan `container` ızgara çizer. Örnekte her kapta
111
+ `layout:'flex'` + yön/hizalama/gap/wrap yazılıdır; kapatılan bayrak da (`wrap:false`,
112
+ `crumbSiblings:false`) açıkça yazılır.
113
+ - **Yükseklik `fill`'dir**, `size.h` değil: kök ekranı doldurur, menü ve ana sütun kökün
114
+ bıraktığını, içerik alanı üst şeritten artanı, slot da içerik alanını alır. İçerik alanı
115
+ `isScrollable` olduğu için uzun sayfa kabuğu itmez, içeride kaydırır.
116
+ - **Menü satırlarını biçimlendirme:** `navigations`'ın tipli grupları ve renk prop'ları
117
+ (`textColor`, `mutedColor`, `iconColor`, `bgColor` …) — bkz. `component_get('navigations')`.
118
+ - **Mobil:** menü ≤768px'te kendi çekmecesine ve hamburger düğmesine döner (bağımsız
119
+ `navigations`'ta `mobileBehavior:'drawer'` varsayılandır); üst şerit ve içerik tam genişliğe
120
+ yayılır.
118
121
 
119
122
  ## Mini tarif — menüde aktif satır
120
123
 
@@ -144,8 +147,8 @@ bağlantı nesnesi ya da tam yol).
144
147
  "direction": { "type": "static", "data": "row" } },
145
148
  "blocks": [{ "breakpoint": 1024, "size": { "w": 12, "h": 80 }, "position": { "x": 0, "y": 0 } }] }
146
149
 
147
- // KÖTÜ — telefonda 49px'lik yan menü: row flex dar ekranda yığılmaz (Kural 7)
148
- // Dar ekranda alt alta düşmesi gerekiyorsa kökü layout:'grid' kur — bedeli, fill'in
150
+ // KÖTÜ — telefonda 49px'lik yan menü: row flex mobilde yığılmaz (Kural 7)
151
+ // Mobilde alt alta düşmesi gerekiyorsa kökü layout:'grid' kur — bedeli, fill'in
149
152
  // flex anlamının devreye girmemesi.
150
153
  ```
151
154
 
@@ -183,9 +186,9 @@ bunlardan biri olabilir:
183
186
  |---|---|
184
187
  | ~~`heightType` yalnız `auto` \| `fixed`~~ | **28 Ağustos'ta kapandı:** üçüncü değer `fill` (Kural 5b) |
185
188
  | ~~Kök kap viewport'a kilitlenmez~~ | **28 Ağustos'ta kapandı:** `fill` verilmiş kök 100vh (Kural 5b) |
186
- | Flex dar ekranda yığılmaz | Kural 7 — kabuk bugün bir MASAÜSTÜ kabuğudur |
187
- | Kırılıma duyarlı prop yok | `direction`/`gap` masaüstü ve dar ekranda AYNI; yalnız `blocks` ve `appearance.hideOn` kırılım bilir |
188
- | Dar ekranda çekmece (overlay) yok | Telefon genişliğinde içeriğin üstüne binen panel kurulamaz (mobil UYGULAMADA çekmece `drawer` widget'ıdır — `platform_guide('mobile')`) |
189
+ | Flex mobilde yığılmaz | Kural 7 — kabuk bugün bir MASAÜSTÜ kabuğudur |
190
+ | Kırılıma duyarlı prop yok | `direction`/`gap` masaüstü ve mobilde AYNI; yalnız `blocks` ve `appearance.hideOn` kırılım bilir |
191
+ | ~~Mobil çekmece (overlay) yok~~ | **Kapandı:** `navigations` (`layout:'sidebar'`) ≤768px'te kendi çekmecesine ve hamburger düğmesine döner — varsayılan kabuğun sol menüsü bunu kendiliğinden yapar |
189
192
 
190
193
  ---
191
194
 
@@ -193,7 +196,7 @@ bunlardan biri olabilir:
193
196
  (`injectPageSchemaIntoSlots`, `getResolvedLayoutViews`), `apps/studio/src/features/page/api/page.mappers.ts`
194
197
  (`mapPageLayoutToPreview`), `packages/ng-apps-ui/src/shared/render/render.functions.ts`
195
198
  (`resolveNodeBoxStyle` — slot'un `y / auto` satırı, flex çocuk genişliği),
196
- `packages/ng-apps-ui/src/shared/render/RenderComponent.svelte` (dar ekran media kuralı),
199
+ `packages/ng-apps-ui/src/shared/render/RenderComponent.svelte` (mobil media kuralı),
197
200
  `packages/ng-apps-screen-builder/src/flex-layout.ts` (`getFlexChildStyle` — `widthType`
198
201
  fill/fixed/auto dalları, `normalizeCssSize` kabul kuralı; tuval ve runtime aynı fonksiyonu okur),
199
202
  `apps/studio/src/features/page/components/appearance/appearance-size.functions.ts` (panelin
@@ -39,16 +39,6 @@ trail tabloları hariç, dış datasource'lara dokunulmaz). Kayıt taşıması a
39
39
  (`promote`) kuralıdır ve orada aynen geçerlidir. **Satırlar merge'de geri taşınmaz** — merge yalnız
40
40
  tanım işidir.
41
41
 
42
- Tanım sayılan ve merge'in taşıdığı üç şey 2026-09-25'ten beri listede: **çeviriler**
43
- (translation kalemi, adı çeviri anahtarı), **microfunction'lar** (kod ve arşiv; hedefte **taslak**
44
- kalır, yayını kullanıcı yapar) ve zamanlanmış işin **duraklatma durumu**. Öncesinde dalda
45
- eklenen çeviri ve microfunction development'a hiç gelmiyordu.
46
-
47
- - Aynı çeviri anahtarını (uygulama, dil, anahtar) dal da development da kendi başına eklediyse plan
48
- yalnız dalınkini `add` gösterir; apply development'ın satırına **dalın değerini** yazar.
49
- - Microfunction **runtime**'ı merge'de taşınmaz (kimlik bilgisi taşır). Dalda yeni bir runtime kurup
50
- microfunction'ı ona bağlarsanız apply `23503` ile düşer — runtime'ı önce development'ta kurun.
51
-
52
42
  Dalda `page_screenshot` **çalışır** (2026-09-09'dan beri); ayrıntısı bir sonraki bölümde.
53
43
 
54
44
  ## Dalda görsel doğrulama
@@ -95,7 +85,7 @@ değişkenler, çözülen ref'ler) kareyi tamamlar: kare ne çizildiğini, bu ik
95
85
  - `derivedFromKey`: kalem OTOMATİK ÜRETİLMİŞ bir kayıtsa (varsayılan DTO) kaynağının anahtarı
96
86
  - `elements[]`: `path`, `kind`, `base`, `source` (dal), `target` (development), `resolution`
97
87
 
98
- `dataRisk` bir **uyarıdır, apply'ı bloklamaz**; dört sebepten biriyle doğrudur:
88
+ `dataRisk` bir **uyarıdır, apply'ı bloklamaz**; üç sebepten biriyle doğrudur:
99
89
 
100
90
  | `dataRiskReasons` | Ne demek |
101
91
  |---|---|
@@ -103,32 +93,8 @@ değişkenler, çözülen ref'ler) kareyi tamamlar: kare ne çizildiğini, bu ik
103
93
  | `field-narrowed` | Tip / `nullable` / `unique` daraltılıyor |
104
94
  | `not-null-without-default-on-populated-table` | **Hedefte satır varken** varsayılansız zorunlu alan ekleniyor — bu apply'ı DDL aşamasında düşürür. Alanı `nullable` yapın ya da `defaultValueType: "default-value"` + `defaultValue` verin |
105
95
 
106
- | `table-removed` | **Hedefte satırı olan** tablo siliniyor; boş tablo riskli sayılmaz |
107
-
108
- `not-null-…` satırı 2026-09-09'da eklendi; öncesinde bu durum `dataRisk: 0` diyordu ve risk ancak
109
- apply denenerek öğreniliyordu. Hedef tablo **boşsa** aynı alan riskli sayılmaz.
110
-
111
- Aynı denetimin sert hâli promote'tadır: deploy başlamadan production verisine karşı koşar ve veri
112
- bozacak değişikliği 400 ile reddeder (`deployment_start` açıklaması).
113
-
114
- ### Silinen kaydın yeni bağımlısı: `dependents[]`
115
-
116
- Dal bir kaydı sildi, development ise dal açıldıktan **sonra** o kaydı kullanmaya başladıysa
117
- (bir sayfa sorguyu bağladı, bir akış servisi çağırdı) silme `delete` olarak değil **`conflict`**
118
- olarak gelir ve kalemde `dependents[]` (`{ id, name, module }`) dolar:
119
-
120
- - `choice: "target"` kaydı ve bağımlısını korur,
121
- - `choice: "source"` siler — bağımlı FK ile düşebilir ya da kırık bağla kalır.
122
-
123
- Sorgunun çıktı DTO'su ve alanları **aynı çakışma grubundadır**: biri çözülünce diğerleri de o
124
- tarafa gider. Dal açılmadan önce var olan ve development'ta değişmeyen bağımlı çakışma üretmez —
125
- onu dal zaten görmüştü.
126
-
127
- ### Süreç kenarlarında çakışma
128
-
129
- `versions[…].model.edges` listesinde iki taraf **aynı geçidin** çıkışlarına dokunduysa tek bir
130
- çakışma gelir, yolu `versions[id=…].model.edges{from=<düğüm>}` biçimindedir — o geçidin bütün
131
- çıkışları bir karar olarak çözülür. Farklı geçitlere yapılan değişiklikler kendiliğinden birleşir.
96
+ Son satır 2026-09-09'da eklendi; öncesinde bu durum `dataRisk: 0` diyordu ve risk ancak apply
97
+ denenerek öğreniliyordu. Hedef tablo **boşsa** aynı alan riskli sayılmaz.
132
98
 
133
99
  `derivedFromKey` dolu olan kalemi ayrıca çözmeye çalışmayın: kaynağını (entity ya da query)
134
100
  çözdüğünüzde aynı yoldaki çakışması **kendiliğinden** aynı tarafa çözülür. Entity adını değiştiren
@@ -243,16 +243,9 @@ DTO'dan süzülmez (WF-026 — `platform_guide('workflow')` §Hata yolu). Sözle
243
243
  - **Operatör sözlüğü kapalıdır:** `eq · neq · lt · lte · gt · gte · contains · icontains ·
244
244
  in · notin · startswith · endswith · istartswith · iendswith · isnull · isnotnull`.
245
245
  **`like` YOKTUR** — metin
246
- araması `contains`/`icontains` iledir. Kritik tuzak: eski backend bilinmeyen operatörü 400 ile
246
+ araması `contains`/`icontains` iledir. Kritik tuzak: platform bilinmeyen operatörü 400 ile
247
247
  reddetmez, **sessizce `eq`'e düşürür** (enum çözümlemesi unknown'da default'a düşer) — uç
248
- testten geçer ama yanlış sonuç döner (koşuda `ne` böyle geçti). 2026-09-27'den sonraki backend
249
- uç çağrısının `filters` parametresinde (JSON dizisi) 400 verir; workflow tablo adımının filtresi
250
- hâlâ sessizce `eq`'e düşer. Ad büyük/küçük harfe duyarlıdır: `NEQ` geçersizdir. Gateway her iki
251
- sürümde istek gitmeden keser: uç tanımında ve
252
- workflow tablo adımında MS-012/WF-015 (blok), çalışma anında `row_list` / `row_export` filtresinde ve
253
- `microservice_execute` / `microservice_debug`'ın `filters` parametresinde hata — sık yanlışlara öneriyle
254
- (`ne`/`!=` → `neq`, `like` → `contains`, `=` → `eq`). Studio'nun filtre ARAYÜZÜNDEKİ adlar
255
- (`notContains`, `between`…) ayrı bir sözlüktür; arayüz onları bu işleçlere çevirir.
248
+ testten geçer ama arama hiçbir şey döndürmez. Gateway MS-012/WF-015 bunu istek gitmeden keser.
256
249
  - **Write operasyonunda (`create`/`update`) yanıt yalnız primary key'dir** — platform sonucu
257
250
  PK'ya indirger ve `selectFields`'ı kaydederken sessizce boşaltır. Yanıtın başka alan da
258
251
  dönmesi gerekiyorsa **`returnFields`** kullanılır (öğeler `selectFields` ile aynı şekildedir:
@@ -344,25 +337,6 @@ kart doğru sütuna geçer, başlığı ve sorumlusu silinir.
344
337
  > ifadeden gelir ve `undefined` dönen ifade de `null` yazar —
345
338
  > `platform_guide('workflow')` §"Table update adımı".
346
339
 
347
- ### Toplu güncelleme FİLTREYLE kurulmaz
348
-
349
- "Bekleyen bütün başvuruları onayla" bir table-source `update` ucuyla YAZILAMAZ. `update`
350
- operasyonu tam olarak **bir tekil alan filtresi** ister: birden çok filtre
351
- `InvalidFilterCountException`, tekil olmayan alanla filtre `FilterFieldMustUniqueException`
352
- döndürür (ölçüldü 2026-09-20, S2-22). Yani hedef kümeyi bir KOŞUL belirleyemez, yalnız bir ANAHTAR
353
- belirler. İki doğru yol var:
354
-
355
- | Ne istiyorsun | Yol |
356
- |---|---|
357
- | Anahtarlar elinde, hepsi ya hep ya hiç yazılsın | **`bulk-update` ucu** — gövde satır dizisi, filtre yok, tek çağrı, tek transaction (yukarıdaki §"Toplu yazma"). En fazla 1000 satır; bir satır düşerse hiçbiri yazılmaz |
358
- | Satır başına SONUÇ ve satır başına YETKİ kararı gerekiyor | **İş akışı + döngü** (BK-05 deseni): liste ucunu çağır → her satır için `microservice` adımı → sayaçları topla → özet döndür |
359
-
360
- Kapsam ve politika koşulu her iki yolda da satır satır uygulanır; fark sonucun şeklidir. Toplu
361
- onay gibi işlerde ikinci yol tercih edilir çünkü yetkisi yetmeyen satır ötekileri geri almaz:
362
- çağıran "N onaylandı · M reddedildi" özetini alır (ölçülen koşu: iki satır da 403 ile reddedildi,
363
- akış "0 onaylandı · 2 reddedildi" döndürdü). Döngüdeki uç, çağıranın kimliğiyle denetlenir —
364
- akış içinden yazmak yetki YÜKSELTMEZ.
365
-
366
340
  ## İlişki alanı: `row_list` NESNE döner, uç/step JOIN'siz DÜZ FK döner
367
341
 
368
342
  Aynı alan iki yoldan farklı şekilde gelir ve bu fark sessizce yanlış sonuç üretir:
@@ -704,20 +678,6 @@ Rol listesini **değiştirmek** için yukarıdaki §"Patch belgesi OKUMA şeklid
704
678
  > rota `/{project}/m/{application}/{microservice SLUG'ı}`'dır ( `url` alanı rotaya GİRMEZ) ve
705
679
  > `Host: <org>.<suffix>` + `X-Environment` başlıkları zorunludur.
706
680
 
707
- ### Kompleks projede
708
-
709
- - `enforce` ortamda **anonim uç yoktur**: oturumsuz her istek `401 AppSessionRequired` döner; yukarıdaki
710
- anonim veri toplama deseni kompleks projede kurulamaz. Uç izni erişim politikasıyla gelir
711
- (`microservice.execute`); platform `roleIds`'i hiçbir modda karar için kullanmaz.
712
- - `middlewareIds`'e bağlı middleware **her modda koşar** ve reddedebilir; set-user adımı ya da yanıttaki
713
- `user` platformun doldurduğu `user`'ı ezer. Kimlik middleware'ini uçtan çıkarın (ACC-006).
714
- - Table kaynaklı uç satırları kapsamla SQL'de süzer (kapsam dışı id 404), gizli alanı çıkarır, korumalı
715
- alanı `__protected` ile işaretler; yetkisiz alana yazma ya da filtre 403.
716
- - Query kaynaklı uç kapsamlı ya da korumalı tabloya dokunuyorsa sorgu `isUnrestricted` olmadıkça
717
- `403 AccessQueryNotScoped` (ACC-005).
718
- - Sınama: `access_session_create` → `asUser`; ret nedeni `access_preview` ve `microservice_debug`
719
- yanıtındaki `accessDecision`. Kurallar: `platform_guide('access')`.
720
-
721
681
  ## Alias nerede geçerli
722
682
 
723
683
  Alias bir **SQL tablo takma adıdır**: yalnız okunan tarafta anlamı vardır. Sözleşme iki ayrı
@@ -738,29 +698,6 @@ Yazma alanına `alias` koyarsan istek **hata vermez**, alan model bağlamada dü
738
698
  istek gitmeden gövdeden çıkarır ve `gatewayNormalized` ile bildirir — böylece `silentlyDropped`
739
699
  listesi yalnız gerçek kayıpları gösterir.
740
700
 
741
- ### Kök filtrenin alias'ı entity SLUG'ı olmak zorundadır (MS-023)
742
-
743
- `filters[].alias` runtime'da iki şeyden birine eşlenir: **ana entity'nin slug'ı** ya da bir **join
744
- alias'ı** (`PostgreSqlRelationHandler.GetField`). Üçüncü bir seçenek yoktur — `sourceParameters.alias`
745
- alanına yazdığın kök takma ad da dâhil. Eşleşmeyen alias'lı **zorunlu** filtre isteği 400
746
- `FilterFieldNotResolvedException` ile düşürür ve parametreyi hangi adla gönderirsen gönder değişmez.
747
-
748
- Çağrı parametresinin adı aynı kuraldan çıkar:
749
-
750
- | Filtrenin alias'ı | Çağrı parametresi (`parameterScheme[].name`) | Çalışır mı |
751
- |---|---|---|
752
- | entity slug'ı (`kredi_basvurusu`) | `id` — **nitelenmemiş** alan slug'ı | evet |
753
- | join alias'ı (`musteri`) | `musteri.id` | evet |
754
- | başka bir şey (`kredi`) | `kredi.id` | **hayır** — 400 `FilterFieldNotResolvedException` |
755
-
756
- Yani şemadaki ad, uç çalışabildiği sürece runtime'ın beklediği addır; nitelikli bir ad görüyorsan
757
- alias'ın bir JOIN alias'ı olduğundan emin ol. `microservice_get` join olmayan nitelikli adı
758
- **MS-023** uyarısıyla işaretler. Düzeltme:
759
- `microservice_patch { op: 'replace', path: '/sourceParameters/filters/0/alias', value: '<entity slug>' }`.
760
-
761
- Ölçüldü 2026-09-20 (`rehber-basit/tb119-get`, entity slug `tb119_urun`): alias `u` → parametre
762
- `u.kod`, çağrı 400; alias `tb119_urun` → parametre `kod`, çağrı 200.
763
-
764
701
  ## Zamanlanmış iş (`type: 'schedule-job'`) — `typeParameters.schedule`
765
702
 
766
703
  Zamanlama tek bir tanımdır; `cronExpression` tek başına verilirse **UTC cron** sayılır (eski gövde).
@@ -876,25 +813,3 @@ Dört gerçek daha:
876
813
  (`{ "op": "add", "path": "/description", "value": "…" }`). Patch yanıtındaki `silentlyDropped`
877
814
  alanı, gönderilen ama kaydedilmeyen alanları listeler — boş değilse platform bir alanı yutmuş
878
815
  demektir.
879
-
880
- ## Connect Data kaynağı olarak uç
881
-
882
- Okuyan bir uç prop'a **akışsız** bağlanabilir (`connect_data_bind`, `platform_guide('page')` §Kural 1c-3). Şartlar
883
- (ölçüldü 2026-09-21, koşu 38):
884
-
885
- - Uç **okur** (GET tablo `get`, query ya da view kaynağı), **middleware'siz** ve **dönüş şeması** vardır; yazan tablo/sistem
886
- ucu, middleware'li uç ve şemasız uç `connect_data_describe`'da 422 `ConnectDataSourceUnsupported`.
887
- **Middleware'li uç bilinçli olarak dışarıda (karar 2026-10-02, qm madde 5C):** connectData yolu ucun middleware
888
- zincirini koşmaz; kaynak olarak kabul edilseydi ucun korumaları (kimlik, rol, setter değişkenleri) atlanırdı.
889
- Korumalı ucu listeye bağlamanın yolu **akıştır**: bileşenin `mount` (ve arama/sayfa) akışında microservice adımı
890
- ucu çağırır — middleware'ler koşar —, setter dönen satırları `rows`'a yazar. Uç projedeki başka bir uygulamada
891
- olabilir (microservice adımı servisin kendi uygulamasının adresine gider). Middleware'i kaldırıp ucu açmak çözüm
892
- değildir.
893
- - **Tablo ucunda `enableDynamicFilters: true`** alanları `canFilter`/`sortable` yapar (kullanıcı filtresi tanım filtresiyle
894
- AND'lenir); `sort`/`limit` query-string parametreleri offset sayfalama açar. Dinamik filtresiz ya da query kaynaklı uç
895
- `pageMode: client` kalır (CD-007) ve süzmez.
896
- - Uç parametreleri bağlantının `params`'ından gelir (`source.parameters`; CD-013).
897
- - `connect_data_convert` bir bağlantıyı `source: connectData` bir uca çevirir: `m/{app}/{slug}` `POST { op: 'list' }` aynı
898
- kabiliyet damgalı `{ data, meta, errors }` zarfını döner. Kompleks projede `microservice_execute { asUserId }` ile
899
- kullanıcı gözüyle doğrulayın; `microservice_preview` Studio ucudur (ROLLBACK'li, kapıları koşmaz).
900
- - Örnekler: `ngapps://examples/connect-data-workflow-microservice`, `ngapps://examples/connect-data-convert-verify`.
@@ -19,16 +19,6 @@ kavramı olmayan bir üründe auth middleware'i, ayar tablosu olmayan bir ürün
19
19
  kur** — giriş sayfası + korunacak her uç ve her sayfa `middlewareIds`'e bağlı. Kısmi koruma,
20
20
  sistemi güvenli gösterip açık bırakır.
21
21
 
22
- > **Kompleks projede (`accessModel: 'complex'`) kimlik tarifleri gerekmez — bağlı kalırsa da etkisiz
23
- > değildir.** Platform uygulama oturumunu kendisi yönetir (`POST /{proje}/runtime/{app}/auth/sign-in`), uç
24
- > yolunda `user` değişkenini güvenilir özneyle önceden doldurur ve yetkiyi erişim politikasıyla verir. Bağlı
25
- > middleware'ler ise zorlama modundan bağımsız **her modda koşar** ve reddedebilir; set-user adımı ya da
26
- > yanıttaki `user` platformun `user`'ını **ezer**. Kimlik middleware'ini uçların ve sayfaların
27
- > `middlewareIds`'inden çıkarın (ACC-006, warn). Rol listesini (`microservice.roles`, `page.roleIds`)
28
- > platform hiçbir modda karar için kullanmaz; yalnız `Authorized(user.roles)` çağıran middleware okur.
29
- > Kompleks projenin yolu `platform_guide('access')` §Runtime; bu rehberin tarifleri basit projede aynen
30
- > geçerlidir.
31
-
32
22
  ## Açıklama zorunlu
33
23
 
34
24
  Middleware de bir workflow'dur: her adımı ve middleware'in kendisi `description` taşımak
@@ -66,20 +56,8 @@ cevabı adımın ifadesinde gizlidir. Ayrıntı ve yazım ölçütü: `platform_
66
56
  kuracaksan ifadeyi guard'la: `typeof user === 'undefined' ? false : Authorized(user.roles)`.
67
57
  Gateway `set-user` adımı olmadan `user` okuyan middleware'i **MW-003** ile uyarır.
68
58
  4. **`input` YOKTUR.** Middleware girdisini HTTP bağlamından okur: `cookie`, `header`,
69
- `queryString`, `body`, `triggerSource` (hangi microservice/sayfa tetikledi: type, id, name,
70
- slug, roles, pathAndQuery — emekliye ayrılacak) ve `context` (type, name, roles, path,
71
- **impersonatedUserId**, language). `context.path` isteği yapan sayfanın adresidir
72
- (`/view|dev|branch/{ortam}/{proje}/{uygulama}/{sayfa}`): mobil runtime onu `X-Page-Path`
73
- başlığıyla yollar, web'de tarayıcının `Referer`'ından okunur. Doğrudan API çağrısında,
74
- zamanlanmış/otomasyon koşusunda ve sayfası olmayan istekte **`null`'dır** — `split` gibi bir
75
- metot çağırmadan önce koru: `(context.path || '').split('/')[1]`. İstemci beyanıdır, yetki kararı
76
- için okunmaz. Kimlik devri **yalnız `context.impersonatedUserId`**'dedir;
77
- `triggerSource.impersonatedUserId` diye bir alan yoktur, hep `undefined` okunur (MW-006).
78
- `context.impersonatedUserId` ve start adımının `impersonation` dalı yalnız Studio önizlemesinde
79
- seçilen uygulama kullanıcısı için dolar; kimlik devrini yalnız super-admin yapabilir, anonim ya da
80
- yetkisiz istekte başlık platformda silinir. `impersonation` dalı bağlı değilse start
81
- `success`'e düşer — uygulamanın kendi auth yolu koşar (ZM-22, 2026-09-26). Tarif: 1c. Hazır
82
- fonksiyonlar: `system.validateToken(...)`,
59
+ `queryString`, `body`, `triggerSource` (hangi microservice/sayfa tetikledi: type, name,
60
+ slug, roles, impersonatedUserId). Hazır fonksiyonlar: `system.validateToken(...)`,
83
61
  `system.generateToken(...)`, `crypto.JWT.encode/validate`, `Authorized(user.roles)`,
84
62
  `request.url.searchParams`, `GenerateGuid()`, `UtcNow()`, `system.getPageUrl(slug)` —
85
63
  **tam sözlük ve gerçek örnekler: `platform_guide('expressions')`**.
@@ -219,31 +197,6 @@ guard → [condition] triggerSource.type === 'page'
219
197
  Korumalı her sayfada yukarıdaki `redirect → response` zinciri kurulmalı ve **tokensız bir
220
198
  istekle 401 verdiği görülerek** kabul edilmeli. Karşılığı: `platform_guide('page')` Kural 8.
221
199
 
222
- ## Tarif 1c — Studio önizlemesinde seçilen kullanıcıyla açılış (`impersonation` dalı)
223
-
224
- Özel auth middleware'li bir uygulamada Studio'nun Preview alt çubuğundaki kullanıcı seçici
225
- (`impersonated-user-id` başlığı) jeton taşımaz; yalnız jeton yolu olan middleware bu istekte 401
226
- döner ya da `user` kurmadan biter ve korumalı her uç `user is not defined` ile 500 verir (ZM-22).
227
- Seçilen kullanıcıyla açılmak için start adımının **`impersonation` dalını** bağlayın:
228
-
229
- ```
230
- start ─ success → token → token_check → userTable → setUser → response 200 (normal yol)
231
- ─ impersonation → kimlik [table get: users, filtre id eq context.impersonatedUserId]
232
- → var_mi [condition] ─ else → response 401
233
- → setUser (aynı set-user ifadesi) → response 200
234
- ```
235
-
236
- ```jsonc
237
- // start adımının dalları — impersonation dalının adı ve tipi 'impersonation'
238
- { "id": "<GUID>", "name": "impersonation", "type": "impersonation", "nextStepId": "<kimlik adımının id'si>" }
239
- ```
240
-
241
- - Dal **yalnız** platform kimlik devrini doğruladığında seçilir (Studio önizlemesi, super-admin);
242
- başlığı elle ekleyen istek normal `success` yolundan geçer. Bu yüzden değer yalnız bu dalda anlamlıdır:
243
- **`context.impersonatedUserId`'yi dal dışında yetki kararı için okumayın.**
244
- - Kullanıcı satırını yine tablodan okuyun; değerin kendisi yalnız bir kimliktir, rol ya da sahiplik
245
- taşımaz. `set-user` ifadesi normal yolla aynı şekli üretmelidir (kapsam workflow'ları `user.id` okur).
246
-
247
200
  ## Tarif 3b — Rol kapısı: `microservice.roles` TEK BAŞINA hiçbir şeyi kapatmaz
248
201
 
249
202
  **Ölçüm (2026-08-19):** `roleIds: ['<admin rol id>']` verilmiş ama `middlewareIds` **boş** bir
@@ -281,29 +234,12 @@ kurulur.** Her projenin ayar middleware'ine ihtiyacı yoktur; okunmayan bir `set
281
234
  sadece fazladan parça demektir. Karar tablosu: `platform_guide('getting-started')`.
282
235
 
283
236
  ```
284
- start → settings [table get: ayarlar tablosu]
285
- → setPrivate [variable name:'settingsPrivate', expression: '{ ...settings.data }',
286
- dataTransferObjectId: <ayarlar DTO>, isPrivate: true]
287
- → setPublic [variable name:'settings',
288
- expression: '({ app_name: settings.data.app_name, theme: settings.data.theme })']
237
+ start → settings [table get: ayarlar tablosu] → setVar [variable name:'settings',
238
+ expression: '{ ...settings.data }', dataTransferObjectId: <ayarlar DTO>]
289
239
  ```
290
240
 
291
241
  Response yok — tek işi değişken kurmak; bağlandığı her uçta `settings.<alan>` okunur.
292
242
 
293
- **Sayfaya bağlanan middleware'in değişkeni istemciye gider.** Sayfa yanıtı middleware
294
- değişkenlerini `Page.variables` olarak taşır; tarayıcıda ve cihazda okunur. Bu yüzden:
295
-
296
- - Gizli değer taşıyan (şifre, `client_secret`, API anahtarı) ya da bütün bir kaydı yayan değişkene
297
- **`rule.isPrivate: true`** ver (Studio: "Sunucuda tut"). Aynı istekteki sonraki middleware'ler
298
- onu okumaya devam eder; istemciye gitmez. Sayfanın akışları istemcide koşar ve `Page.variables`'ı
299
- okur — işaretli değişken orada `undefined`'dır; akışın ihtiyaç duyduğu alanı işaretleme.
300
- - İstemcinin gerçekten ihtiyaç duyduğu alanları ayrı, işaretsiz bir değişkende **izin listesiyle**
301
- kur (yukarıdaki `settings`). Aynı ad sonra işaretsiz bir adımla yeniden yazılırsa istemciye açılır.
302
- - Yalnız microservice uçlarına bağlı middleware'de değişken yanıtla dönmez; işaret yine de zararsızdır.
303
- - Lint: `MW-007` (işaretsiz değişken bir kaydı yayıyor ya da gizli değer adı taşıyor → warn).
304
- Ölçüm: qm `[SY] Settings Setter` `{ ...settings.data }` ile `sso_client_secret`'ı istemciye
305
- veriyordu (2026-10-02).
306
-
307
243
  ## Tarif 3 — Kimlik kapsaması: "sadece benim kayıtlarım" ucu
308
244
 
309
245
  Kullanıcıya özel veri dönen uçlarda kimliği **istemci parametresinden alma** (sahtelenir);