@appaflytech/zeyrek-ai-mcp 0.0.30 → 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 (203) 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 +232 -562
  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 -319
  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/page-detail-profile.json +1 -2
  30. package/dist/resources/examples/page-dynamic-form.json +2 -3
  31. package/dist/resources/examples/page-flex-sections.json +1 -1
  32. package/dist/resources/examples/page-html-embed.json +1 -1
  33. package/dist/resources/examples/workflow-basic.json +2 -8
  34. package/dist/resources/guides/component.md +4 -91
  35. package/dist/resources/guides/entity.md +8 -50
  36. package/dist/resources/guides/expressions.md +5 -14
  37. package/dist/resources/guides/functions.md +1 -1
  38. package/dist/resources/guides/getting-started.md +1 -38
  39. package/dist/resources/guides/layout.md +58 -55
  40. package/dist/resources/guides/microservice.md +2 -81
  41. package/dist/resources/guides/middleware.md +2 -44
  42. package/dist/resources/guides/page.md +75 -454
  43. package/dist/resources/guides/theme.md +2 -8
  44. package/dist/resources/guides/translation.md +1 -1
  45. package/dist/resources/guides/workflow.md +1 -58
  46. package/dist/resources/rules.js +5 -11
  47. package/dist/resources/schema-fingerprint.json +5 -7
  48. package/dist/resources/schemas/CreateEntityCommand.json +0 -118
  49. package/dist/resources/schemas/CreateMicroserviceCommand.json +1 -13
  50. package/dist/resources/schemas/CreateQueryCommand.json +0 -4
  51. package/dist/resources/schemas/CreateWorkflowCommand.json +1 -143
  52. package/dist/resources/schemas/DataJobDto.json +1 -6
  53. package/dist/resources/schemas/GlobalFunctionUpdateResultDto.json +1 -21
  54. package/dist/resources/schemas/MicroserviceDto.json +3 -15
  55. package/dist/resources/schemas/PreviewMicroserviceCommand.json +1 -10
  56. package/dist/resources/schemas/PreviewWorkflowCommand.json +1 -22
  57. package/dist/resources/schemas/StepDto.json +1 -22
  58. package/dist/resources/schemas/UpdateEntityCommand.json +0 -118
  59. package/dist/resources/schemas/UpdateMicroserviceCommand.json +1 -13
  60. package/dist/resources/schemas/UpdateQueryCommand.json +0 -4
  61. package/dist/resources/schemas/UpdateViewCommand.json +2 -0
  62. package/dist/resources/schemas/UpdateWorkflowCommand.json +1 -143
  63. package/dist/server.js +1 -27
  64. package/dist/tools/access.js +2 -369
  65. package/dist/tools/applications.js +3 -60
  66. package/dist/tools/common.js +0 -7
  67. package/dist/tools/components.js +14 -118
  68. package/dist/tools/datasources.js +3 -3
  69. package/dist/tools/dependencies.js +1 -1
  70. package/dist/tools/deployments.js +2 -2
  71. package/dist/tools/designSchemaPatch.js +18 -34
  72. package/dist/tools/dtos.js +5 -36
  73. package/dist/tools/entities.js +12 -79
  74. package/dist/tools/externalComponents.js +5 -26
  75. package/dist/tools/flows.js +14 -122
  76. package/dist/tools/folders.js +1 -1
  77. package/dist/tools/imports.js +2 -5
  78. package/dist/tools/layouts.js +17 -50
  79. package/dist/tools/merges.js +1 -1
  80. package/dist/tools/microservices.js +25 -77
  81. package/dist/tools/pages.js +112 -465
  82. package/dist/tools/platformInfo.js +8 -27
  83. package/dist/tools/projects.js +9 -71
  84. package/dist/tools/rows.js +13 -69
  85. package/dist/tools/schemaOps.js +1 -61
  86. package/dist/tools/screenWrite.js +8 -37
  87. package/dist/tools/screens.js +5 -95
  88. package/dist/tools/templates.js +1 -26
  89. package/dist/tools/translations.js +1 -1
  90. package/dist/tools/variables.js +5 -11
  91. package/dist/tools/workflows.js +5 -10
  92. package/package.json +2 -2
  93. package/dist/knowledge/access.js +0 -802
  94. package/dist/knowledge/case.js +0 -41
  95. package/dist/knowledge/connectDataBind.js +0 -819
  96. package/dist/knowledge/connectDataDefinition.js +0 -341
  97. package/dist/knowledge/connectDataExecute.js +0 -93
  98. package/dist/knowledge/connectDataRules.js +0 -128
  99. package/dist/knowledge/decision.js +0 -121
  100. package/dist/knowledge/expressionPrelude.js +0 -59
  101. package/dist/knowledge/microserviceParameters.js +0 -58
  102. package/dist/knowledge/mining.js +0 -94
  103. package/dist/knowledge/mobileComponentCatalog.js +0 -859
  104. package/dist/knowledge/mobileComponentEvents.js +0 -239
  105. package/dist/knowledge/platform/lint.js +0 -385
  106. package/dist/knowledge/platform/mobile.js +0 -142
  107. package/dist/knowledge/platform/mobileLayoutLint.js +0 -324
  108. package/dist/knowledge/platform/mobileRules.js +0 -231
  109. package/dist/knowledge/platform/mobileSpacing.js +0 -82
  110. package/dist/knowledge/platform/mobileTabs.js +0 -108
  111. package/dist/knowledge/platform/nativeBoxModel.js +0 -44
  112. package/dist/knowledge/platform/profile.js +0 -25
  113. package/dist/knowledge/platform/resolve.js +0 -122
  114. package/dist/knowledge/platform/web.js +0 -39
  115. package/dist/knowledge/process.js +0 -510
  116. package/dist/knowledge/rowFilter.js +0 -43
  117. package/dist/knowledge/styleResolveNative.js +0 -527
  118. package/dist/platform/argumentAliases.js +0 -128
  119. package/dist/platform/bodyFile.js +0 -103
  120. package/dist/platform/capture/actions.js +0 -333
  121. package/dist/platform/capture/browser.js +0 -1
  122. package/dist/platform/capture/console-log.js +0 -122
  123. package/dist/platform/capture/index.js +0 -11
  124. package/dist/platform/capture/readiness.js +0 -103
  125. package/dist/platform/capture/summary.js +0 -77
  126. package/dist/platform/capture/target.js +0 -5
  127. package/dist/platform/capture/targets/studio-mobile.js +0 -15
  128. package/dist/platform/capture/targets/studio-web.js +0 -5
  129. package/dist/platform/impersonation.js +0 -45
  130. package/dist/platform/jsonArray.js +0 -24
  131. package/dist/platform/schemaReadMemory.js +0 -60
  132. package/dist/resources/examples/bpm-gorev-kontrol.json +0 -294
  133. package/dist/resources/examples/bpm-iso-dokuman.json +0 -228
  134. package/dist/resources/examples/bpm-satinalma.json +0 -376
  135. package/dist/resources/examples/connect-data-convert-verify.json +0 -107
  136. package/dist/resources/examples/connect-data-dropdown-roles.json +0 -66
  137. package/dist/resources/examples/connect-data-edit-m2m.json +0 -73
  138. package/dist/resources/examples/connect-data-query-params.json +0 -50
  139. package/dist/resources/examples/connect-data-table-entity.json +0 -147
  140. package/dist/resources/examples/connect-data-workflow-microservice.json +0 -65
  141. package/dist/resources/examples/mobile-app-shell-drawer.json +0 -243
  142. package/dist/resources/examples/mobile-app-shell-stack.json +0 -157
  143. package/dist/resources/examples/mobile-app-shell-tab.json +0 -208
  144. package/dist/resources/examples/mobile-form-screen.json +0 -365
  145. package/dist/resources/examples/mobile-list-detail-form.json +0 -672
  146. package/dist/resources/guides/access.md +0 -796
  147. package/dist/resources/guides/bpm.md +0 -686
  148. package/dist/resources/guides/case.md +0 -153
  149. package/dist/resources/guides/decision.md +0 -185
  150. package/dist/resources/guides/mobile-layout.md +0 -193
  151. package/dist/resources/guides/mobile.md +0 -495
  152. package/dist/resources/read.js +0 -41
  153. package/dist/resources/schemas/AccessExplanationDto.json +0 -144
  154. package/dist/resources/schemas/AccessMatrixDto.json +0 -170
  155. package/dist/resources/schemas/AccessPermissionDto.json +0 -57
  156. package/dist/resources/schemas/AccessPolicyDto.json +0 -223
  157. package/dist/resources/schemas/AccessResourceDto.json +0 -86
  158. package/dist/resources/schemas/AppSessionDto.json +0 -53
  159. package/dist/resources/schemas/ConnectDataDescribeDto.json +0 -344
  160. package/dist/resources/schemas/ConnectDataRequestModel.json +0 -202
  161. package/dist/resources/schemas/ConnectDataResultDto.json +0 -421
  162. package/dist/resources/schemas/ConnectorCredentialDto.json +0 -70
  163. package/dist/resources/schemas/ConvertConnectDataToMicroserviceCommand.json +0 -37
  164. package/dist/resources/schemas/CreateAccessPolicyCommand.json +0 -209
  165. package/dist/resources/schemas/CreateDecisionCommand.json +0 -221
  166. package/dist/resources/schemas/CreateProcessDefinitionCommand.json +0 -1337
  167. package/dist/resources/schemas/DecisionDto.json +0 -302
  168. package/dist/resources/schemas/DetachConnectDataMicroserviceCommand.json +0 -28
  169. package/dist/resources/schemas/ExplainAccessQuery.json +0 -33
  170. package/dist/resources/schemas/GenerateProcessDocumentCommand.json +0 -116
  171. package/dist/resources/schemas/OrganizationProjectDto.json +0 -335
  172. package/dist/resources/schemas/OrganizationSchemaDto.json +0 -196
  173. package/dist/resources/schemas/OrganizationSchemaVersionDto.json +0 -207
  174. package/dist/resources/schemas/PatchProcessDefinitionCommand.json +0 -76
  175. package/dist/resources/schemas/ProcessDefinitionDto.json +0 -1480
  176. package/dist/resources/schemas/ProcessSimulationDto.json +0 -96
  177. package/dist/resources/schemas/SaveConnectorCredentialCommand.json +0 -90
  178. package/dist/resources/schemas/SaveProcessEventSourceCommand.json +0 -61
  179. package/dist/resources/schemas/SaveProcessMailSourceCommand.json +0 -89
  180. package/dist/resources/schemas/SignProcessTaskCommand.json +0 -73
  181. package/dist/resources/schemas/SimulateProcessDefinitionQuery.json +0 -92
  182. package/dist/resources/schemas/UpdateAccessPolicyCommand.json +0 -209
  183. package/dist/resources/schemas/UpdateDecisionCommand.json +0 -216
  184. package/dist/resources/schemas/UpdateProcessDefinitionCommand.json +0 -1357
  185. package/dist/resources/schemas/ValidateProcessDefinitionQuery.json +0 -1339
  186. package/dist/tools/accessOperations.js +0 -135
  187. package/dist/tools/accessPolicies.js +0 -170
  188. package/dist/tools/accessRuntime.js +0 -203
  189. package/dist/tools/bpm.js +0 -343
  190. package/dist/tools/bpmGovernance.js +0 -266
  191. package/dist/tools/bpmOperations.js +0 -230
  192. package/dist/tools/bpmReporting.js +0 -154
  193. package/dist/tools/bpmRouting.js +0 -150
  194. package/dist/tools/bpmRuntime.js +0 -396
  195. package/dist/tools/case.js +0 -178
  196. package/dist/tools/caseRuntime.js +0 -89
  197. package/dist/tools/connectData.js +0 -449
  198. package/dist/tools/connectors.js +0 -193
  199. package/dist/tools/decisions.js +0 -206
  200. package/dist/tools/mobile.js +0 -221
  201. package/dist/tools/modules.js +0 -48
  202. package/dist/tools/organizationStructure.js +0 -137
  203. package/dist/tools/profileWrite.js +0 -92
@@ -64,10 +64,9 @@
64
64
  "children": [], "events": [], "validations": [], "stateBindings": []
65
65
  }
66
66
  },
67
+ { "op": "set_event", "target": "page_container", "event": "mount", "eventValue": "<profil yükleme flow id>" },
67
68
  { "op": "set_event", "target": "password_form", "event": "submit", "eventValue": "<şifre güncelleme flow id>" }
68
69
  ],
69
- "pageEvents": [{ "name": "mount", "value": "<profil yükleme flow id>" }],
70
- "_pageEventsNote": "pageEvents page_update { events } ile yazılır; set_event ile page_container'a bağlanmaz — page_container Studio'nun Layers ağacında görünmez.",
71
70
  "mountFlowCreateArgs": {
72
71
  "host": "page",
73
72
  "hostId": "<sayfa id>",
@@ -70,7 +70,7 @@
70
70
  "hostId": "<page id>",
71
71
  "name": "Formu yukle",
72
72
  "slug": "formu-yukle",
73
- "_note": "Sayfanın kendi mount olayına bağlanır (page_update { events: [{ name: 'mount', value: <flow id> }] }; page_container'a değil — Layers'ta görünmez). condition adımı `always` dalını kural dallarıyla BİRLİKTE taşır: always yükleniyor bayrağını her koşumda kapatır, kural dalları içeriği kurar.",
73
+ "_note": "page_container.mount'a bağlanır. condition adımı `always` dalını kural dallarıyla BİRLİKTE taşır: always yükleniyor bayrağını her koşumda kapatır, kural dalları içeriği kurar.",
74
74
  "steps": [
75
75
  {
76
76
  "stepId": "start", "name": "start", "type": "start", "kind": "normal",
@@ -208,9 +208,8 @@
208
208
  }
209
209
  ]
210
210
  },
211
- "pageEvents": [{ "name": "mount", "value": "<load flow id>" }],
212
- "_pageEventsNote": "pageEvents page_update { events } ile yazılır; set_event ile page_container'a bağlanmaz — page_container Studio'nun Layers ağacında görünmez.",
213
211
  "eventPatchOps": [
212
+ { "op": "set_event", "target": "page_container", "event": "mount", "eventValue": "<load flow id>" },
214
213
  { "op": "set_event", "target": "btn_submit", "event": "click", "eventValue": "<submit flow id>" }
215
214
  ],
216
215
  "verification": {
@@ -10,7 +10,7 @@
10
10
  "stringNeedsFixedMode": "widthString/heightString YALNIZ ilgili *Type:'fixed' iken okunur. 'fill'/'auto' moda string yazmak ölüdür — gateway PAGE-017 uyarısı verir, Studio paneli mod değişiminde string'i siler.",
11
11
  "cssSizeAcceptance": "Boyut string'i kabul kuralı (normalizeCssSize): çıplak sayı px sayılır, birimler px/%/vw/vh/vmin/vmax/rem/em/ch, calc(...) geçer. Negatif, pt, fr, 'auto' GEÇMEZ — platform 200 döner ama panel ve runtime değeri sessizce düşürür (PAGE-018).",
12
12
  "wrapDefaultTrue": "wrap varsayılanı 2026-09-01'den beri AÇIK: w:12 çocuklar alt satıra sararak dikey akar. Bu örnekte de açık bırakıldı; kapatırsan üç hücre tek satıra sıkışır.",
13
- "gapThemeVars": "gap preset'leri tema değişkenidir (small/medium/large → var(--ng-spacing-sm/md/lg)); yalnız none/small/medium/large geçer, '18px' gibi ham değer platformda 422.",
13
+ "gapThemeVars": "gap preset'leri tema değişkenidir (small/medium/large → var(--ng-spacing-sm/md/lg)); alan allowCustom'dır, '18px' gibi ham CSS de geçer.",
14
14
  "quickStackSkeleton": "Studio'nun Quick Stack üreteci hücre olarak DAİMA box kurar, ebeveyne layout:'flex' + direction:'row' + wrap:true yazar ve satır span'ları 12'ye tamamlanır. states.isQuickStack yalnız editör süsüdür (kesikli çerçeve) — runtime'da hiçbir etkisi yoktur.",
15
15
  "orderFromBlocks": "Flex'te sıra blocks[].position'dan gelir (önce y, sonra x) ve y yalnız SIRADIR; boşluk çizilmez. Yine de bitişik ver ki grid'e dönüşte şema geçerli kalsın.",
16
16
  "heightStringOnlyFixed": "heightType:'fixed' ölçüyü heightString'den alır ('30vh' gibi), o yoksa size.h×10px'ten. heightType:'auto' içerik kadar, 'fill' ebeveynin bıraktığı yer."
@@ -60,7 +60,7 @@
60
60
  {
61
61
  "name": "Panoyu doldur",
62
62
  "slug": "panoyu-doldur",
63
- "note": "actions[0].flow buna işaret eder; ayrıca sayfanın kendi mount olayına page_update { events } ile bağlanır (ilk yükleme; page_container'a değil — Layers'ta görünmez).",
63
+ "note": "actions[0].flow buna işaret eder; ayrıca page_container.mount'a set_event ile bağlanır (ilk yükleme).",
64
64
  "steps": [
65
65
  {
66
66
  "stepId": "start", "name": "Start", "type": "start", "kind": "normal", "args": {},
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "_meta": {
3
3
  "synthetic": true,
4
- "note": "hr projesinde doğrulanmış şekil. Kurallar: step/branch id'leri GERÇEK GUID ve global benzersiz (RowAlreadyExists); DtoId verilen yerde Behavior zorunlu; table rule'da datasourceId + fieldId zorunlu; filtre value JavaScript ifadesi ve source:\"expression\" + filterType:\"single\" ister (yoksa filtre sessizce yok sayılır, bütün satırlar döner — 38/U-16); adım adı ifadedeki değişken adıdır, geçerli JS tanımlayıcısı olmalı (load_product.data); preview girdisi previewPayload anahtarıyla. bağlanmamış fail dalı hataya düşerse start'taki global-error dalına gider (IStep.cs:74-86)."
4
+ "note": "hr projesinde doğrulanmış şekil. Kurallar: step/branch id'leri GERÇEK GUID ve global benzersiz (RowAlreadyExists); DtoId verilen yerde Behavior zorunlu; table rule'da datasourceId + fieldId zorunlu; filtre value JavaScript ifadesi; preview girdisi previewPayload anahtarıyla. bağlanmamış fail dalı hataya düşerse start'taki global-error dalına gider (IStep.cs:74-86)."
5
5
  },
6
6
  "definition": {
7
7
  "name": "Product Lookup",
@@ -34,7 +34,7 @@
34
34
  },
35
35
  {
36
36
  "id": "<GUID-3>",
37
- "name": "load_product",
37
+ "name": "Load Product",
38
38
  "description": "input.productName ile ürünü okur; tek kayıt bekler.",
39
39
  "caution": "Ad benzersiz değil: aynı adda birden çok ürün varsa ilkini alır, hiç yoksa sessizce boş döner.",
40
40
  "type": "table",
@@ -59,15 +59,9 @@
59
59
  ],
60
60
  "filters": [
61
61
  {
62
- "alias": "<entity slug>",
63
62
  "fieldSlug": "name",
64
63
  "operator": "eq",
65
- "source": "expression",
66
64
  "value": "input.productName",
67
- "filterType": "single",
68
- "conditionType": "and",
69
- "children": [],
70
- "order": 0,
71
65
  "fieldId": "<name alanı id>"
72
66
  }
73
67
  ],
@@ -3,11 +3,6 @@
3
3
  Sayfaya konan her şeyin ortak kuralları. Kuruluş sırası ve şema gövdesi için
4
4
  `platform_guide('page')`; HTML kaçış kapısının derin sözleşmesi için `platform_guide('html')`.
5
5
 
6
- > **Mobil uygulamada** katalog ayrıdır: `component_list`/`component_get` mobil satırları okur,
7
- > `component_get` `mobileKnowledge` (bileşenin mobil farkları) ve `mobileNotes` ekler; katalogda
8
- > olmayan tip `MOB-003` alır. Stil CSS değil React Native'dir — `page_runtime_get(resolveStyles)`
9
- > `nativeStyle` döner (`platform_guide('mobile')`).
10
-
11
6
  ## Keşif: iki tool, üç bilgi katmanı
12
7
 
13
8
  ```
@@ -28,9 +23,7 @@ component_get → tek tipin TAM sözleşmesi, üç katman birleşik:
28
23
  - **`isHidden`** her komponenti gizler; setter ile yazmak katalogda listelenmeyen tiplerde de
29
24
  çalışır. Gizli komponent `mount` olayını görünür olana dek TETİKLEMEZ.
30
25
  - **`mount`** olayını komponentin kendisi değil ortak katman yayar: komponent ilk kez
31
- görünür olduğunda bir kez. Sayfa açılış akışı `page_container.mount`'a DEĞİL, sayfanın kendi
32
- `mount` olayına bağlanır (`page_update { events }`, `platform_guide('page')` Kural 1d-2) —
33
- `page_container` Studio'nun Layers ağacında görünmez.
26
+ görünür olduğunda bir kez. Sayfa açılış akışı `page_container.mount`'a bağlanır.
34
27
  - **`name` = `elementId`** kuralı: runtime her komponent için `const <name> = Components[...]`
35
28
  üretir; bozuk ad sayfadaki BÜTÜN ifadeleri öldürür (`platform_guide('page')` Kural 1c-2).
36
29
  - **Boyut:** `blocks[].size` katalogdaki `maxSize`'ı aşamaz; yükseklikte
@@ -81,51 +74,6 @@ Doğrulama mesajını çeviriye bağlamak ayrı bir sözleşmedir (`t:` öneki,
81
74
  İstisna: `html` komponentinin
82
75
  aksiyonları kendi `flow` prop'uyla bağlanır (`platform_guide('html')`).
83
76
 
84
- ## Korumalı değer ve arayüz yetkisi (kompleks proje)
85
-
86
- Kompleks projede ortamın zorlama modu `enforce` iken runtime iki şey taşır; ikisi de **yalnız
87
- arayüzdür**, yetkiyi backend her istekte yeniden denetler.
88
-
89
- - **Satır metası.** Table-source uçtan dönen satırda korumalı alan varsa
90
- `__protected: { <alanSlug>: 'masked' | 'plain' }` bulunur; `hidden` alan satırda hiç yoktur.
91
- `table` · `datatable` · `detailview` · `text` (`record` + `recordField` ile) `masked` alanı
92
- kilitli maske olarak çizer; "Göster" → gerekçe → değer 30 sn görünür, sonra yeniden maskelenir.
93
- "Göster" yalnız erişim özeti yüklüyken çıkar: `off`'ta (basit proje hep `off`) hiç çıkmaz —
94
- backend her reveal'i reddeder; `shadow`'da çıkar — backend reveal'i yine denetler, yetkisiz
95
- kullanıcı ret mesajını görür; `enforce`'ta yalnız entity'nin `actions`'ında `reveal` varsa.
96
- Değeri boş maskeli hücrede "Göster" çıkmaz. Tasarımcı kanvasında (**View as user**) düğme seçilen
97
- kullanıcıya sunulacağı yerde etkisiz çizilir (kullanıcı seçili değilken tasarımcının
98
- `project.data.reveal` izni karar verir); gerçek açma önizlemededir.
99
- Açılan değer prop'a, akışa, olaya yazılmaz. Entity `revealEntity` prop'undan (slug ya da id) ya
100
- da boşsa erişim özetinden çözülür (`component_get` → `knowledge.propNotes.revealEntity`).
101
- - **Maske forma bağlanmaz.** Güncelleme formunda korumalı alanın `textinput`'u her zamanki gibi
102
- `value` ile kaydın alanına bağlanır, yanına `isMasked` eklenir:
103
- `{{ Steps.<adım>.data.__protected?.tckn === 'masked' }}`. `isMasked` açıkken bağlı değer maske
104
- metni sayılır ve gösterilmez: alan boş başlar, "Değiştirmek için yeni değer girin" yer tutucusunu
105
- gösterir, mount sonrası düğüm değerini `null`'a çeker ve `required`'a takılmaz. Kullanıcı yazınca
106
- sıradan girdidir; değer girdinin yazmadığı bir değere dönerse (forma başka satır seçildi, akış
107
- alanı sıfırladı) yeni kaydın maskesi yine gizlenir ve temizlenir.
108
- - **Izgarada kör üzerine yazma (ADR 0007).** Bağlı `datatable`'da `capability.canWrite` politikadan gelir;
109
- maskeli okumak yazmayı kapatmaz. Maskeli hücre düzenlemeye **boş** açılır, yazılan değer gider, boş bırakılan
110
- maske gitmez; hücre seçimine girmez, toplu düzenleme maskeli kolonu sunmaz. Korumalı alanı güncellemek için
111
- form kurmak zorunlu değildir. Eski değeri görerek düzeltmek gerekiyorsa önce "Göster" (30 sn, editöre ön
112
- doldurulmaz). Bağlı olmayan tabloda ve `table` bileşeninde maskeli hücre düzenlenmez.
113
- - **Boş değerin gönderilmemesi isteğin kuruluşuna bağlıdır.** Microservice çağrısının parametre
114
- bağı boş (`null`/`''`) değeri gövdeye koymaz → saklı değer korunur. Gövdeyi akış kodunda ya da
115
- setter göreviyle elle kuruyorsan (`{ tckn: TextInput1.value }`) `null` gider: `canWrite` yoksa
116
- 403 `AccessFieldWriteDeniedException`, varsa saklı değer **silinir**. Boş maskeli alanı böyle bir
117
- gövdeye koyma.
118
- - **`Page.can(permission, resourceKey)`** her ifadede (görünürlük bağı, akış kodu) kullanılır:
119
- `Page.can('reveal', 'entity:musteriler')` · `Page.can('entity.update', 'entity:<id>')` ·
120
- `Page.can('view', 'page:musteri/detay')` · `Page.can('execute', 'microservice:musteri-listesi')`.
121
- İzin kısa eylem adı ya da katalog slug'ıdır; anahtar `entity:<slug|id>` · `page:<slug>` ·
122
- `microservice:<slug>`. `enforce` dışında (ya da özet yüklenmemişken) HER ZAMAN `true`; okunamayan
123
- anahtar ya da başka kaynak tipinin izni `enforce`'ta `false`.
124
- - **Oturum.** `/view` runtime isteklerinde oturum çerezi gider, durum değiştiren isteğe `X-ZY-CSRF`
125
- eklenir; oturum 401'i bir kez yenilenir (`auth/refresh`) ve istek tekrarlanır. Yenilenemezse
126
- uygulamanın giriş sayfasına gidilir — sayfa yükü bugün giriş sayfasını taşımadığı için yönlendirme
127
- backend bunu gönderene dek olmaz (teknik borç). Özetin listelemediği sayfa ana sayfaya döner.
128
-
129
77
  ## Stil
130
78
 
131
79
  Her komponentin `style` prop'u vardır ve iç parçalara iner (`textinput.style`: `&__label` ·
@@ -140,10 +88,7 @@ Widget, kendi komponent ağacını taşıyan yeniden kullanılabilir pakettir (`
140
88
 
141
89
  1. **Kayıt:** `component_create` — `kind:'widget'`, `widgetType`, `schema` (widget'ın kendi
142
90
  ağacı; `name = elementId` kuralı burada da geçerli — layout gibi widget adları da kullanan
143
- sayfaya sızar). Ağacın KÖKÜ tiplidir: `container` → `widget-area`, `modal`/`drawer` → kendi
144
- tipi (+ düğümde `widgetType`). Runtime widget'ı yalnız bu kökten çizer; düz `container` kökle
145
- kayıt 200 döner ama boş çizilir. Kök vermezsen gateway düğümlerini Studio'nun kurduğu köke
146
- sarar ve `gatewayNormalized`'da CMP-002 ile bildirir (`component_update` şemada da aynı).
91
+ sayfaya sızar).
147
92
  2. **Sayfaya koyma:** `add_component` düğümünde `kind:'widget'` ve **`type` = widget KAYDININ
148
93
  ID'si** — slug DEĞİL (runtime widget'ı `widget.id === node.type` ile çözer; slug yazarsan
149
94
  kayıt 200 döner, render sessizce boş kalır — gateway **PAGE-012/LAY-005** ile reddeder).
@@ -157,30 +102,15 @@ Widget, kendi komponent ağacını taşıyan yeniden kullanılabilir pakettir (`
157
102
  micro-op'ları `PATCH /components/{app}/{id}/schema`'ya yazar; `component_update` ise slug alan
158
103
  tam gövde PUT'tur. Widget'ın düzey olayı yoktur, `remove_event` yalnız komponent hedefler.
159
104
 
160
- ## Satır başına çizilen çocuklar ve `item`
161
-
162
- İki komponent çocuklarını VERİ SATIRI başına çizer; çocukların kod bağlamalarında o satır `item`'dır
163
- (`{{ item.title }}`):
164
-
165
- | Host | Hangi çocuklar | `item` |
166
- |---|---|---|
167
- | `repeater` | Bütün çocukları, `rows`'un her satırında | Satır; `item.x = …` satıra geri YAZAR |
168
- | `datatable` | Yalnız `datatable-cell` çocukları: her biri `column` prop'undaki kolonun hücresine, her satırda | Satır; SALT OKUNUR |
169
-
170
- `datatable`'ın kendisi `isDroppable` DEĞİLDİR: çocuğu yalnız `datatable-cell` olabilir
171
- (`props.column = <columns[].name>`), asıl içerik onun içine konur. Şablonu olan kolonda kolonun
172
- `type`/format ayarı çizilmez; sıralama, filtre ve dışa aktarma ham değerle çalışır. Hangi türün host
173
- olduğu tek kayıttadır: `zeyrek-frontend/packages/ng-apps-ui/src/shared/render/row-scope.ts`.
174
-
175
105
  ## `states` ve `appearance` sözlükleri
176
106
 
177
107
  Her şema düğümünde iki sözlük vardır; ikisi de ortak render katmanında çözülür:
178
108
 
179
109
  | `states` | Anlamı |
180
110
  |---|---|
181
- | `isDroppable` | İçine komponent alır (container/form/repeater true). **Değer kataloğun kararıdır** (`component_list` `droppable` sütunu): Studio kanvası bırakma hedefini bu alandan çözer, bu yüzden gateway yazdığı düğümlerde alanı katalogdan doldurur ve `gatewayNormalized` ile bildirir (PAGE-040). `false` yazılmış bir kabın içine kanvasta bırakma yapılamaz — bilerek kapatmak için `resize_component`/`set_states` |
111
+ | `isDroppable` | İçine komponent alır (container/form/repeater true) |
182
112
  | `isScrollable` | İçeriği kendi alanında kaydırır (sabit yükseklikte `overflow-y: auto`) |
183
- | `isWrapper` | Sayfanın/layout'un/widget'ın ANA kabı — salt düzen elemanı: `height:100%` + **`min-height:80vh`**, kap başlığı ÇİZİLMEZ. **Yalnız sayfa boyu kaplaması gereken tek kap için kullan:** iç içe kutuya verirsen 720px'lik pencerede o kutu 36px içerikle bile 576px çizilir (ölçüldü, `platform_guide('page')` Kural 1f). Çerçeve/başlık gizlemek için wrapper kullanma: çerçevesiz kutu `box`'tır; `container`'da çerçeve `surfaceStyle`'ın dört `border*` yönüne `'none'` yazılarak kapatılır (`platform_guide('page')` §Kap seçimi). Kurulmuş bir düğümün bayrağını `resize_component` micro-op'unun `states` alanı değiştirir — düğümü yeniden kurmak gerekmez |
113
+ | `isWrapper` | Sayfanın/layout'un/widget'ın ANA kabı — salt düzen elemanı: `height:100%` + **`min-height:80vh`**, kap başlığı ÇİZİLMEZ. **Yalnız sayfa boyu kaplaması gereken tek kap için kullan:** iç içe kutuya verirsen 720px'lik pencerede o kutu 36px içerikle bile 576px çizilir (ölçüldü, `platform_guide('page')` Kural 1f). Çerçeve/başlık gizlemek için wrapper değil `style` (`border:'none'`) kullan. Kurulmuş bir düğümün bayrağını `resize_component` micro-op'unun `states` alanı değiştirir — düğümü yeniden kurmak gerekmez |
184
114
  | `isSticky` | Kaydırmada yerinde kalır (header/sidebar; z-index'i otomatik) |
185
115
  | `isFloating` | Düğümü akıştan çıkarıp yüzdürür (katman davranışı; nadir) |
186
116
  | `isQuickStack` | Studio'nun Quick Stack iskelet hücresi işareti — editörde kesikli çerçeve çizer, **runtime'da hiçbir etkisi yoktur**. MCP'den iskelet kurarken yazmak serbesttir ama gerekmez |
@@ -259,23 +189,6 @@ ve `layout` grubundaki adlar giremez. **MCP tarafında karşılığı yoktur:**
259
189
  bir prop'tur, `set_prop` ile aynı şekilde yazılır. Bu bilgi yalnız "studio'da neden o
260
190
  düğmeler var" sorusuna cevaptır.
261
191
 
262
- ## Bağlanabilir prop'lar (`connectData`)
263
-
264
- `component_get` yanıtındaki `connectData` bileşenin hangi prop'unun veri kaynağına bağlanabileceğini
265
- söyler; alan yoksa bileşen bağlanamaz (`connectDataNote`). Kaynak platform kataloğudur.
266
-
267
- | Alan | Anlamı |
268
- |---|---|
269
- | `primary` | Birincil bağlanabilir prop (`rows`, `options`); Studio "Veriye bağla" düğmesi bunu açar |
270
- | `trigger` | "Veriye bağla" düğmesinin yeri: `toolbar` (bileşen araç çubuğu) · `canvas` (kanvastaki bileşenin üstü) |
271
- | `props.<yol>.roles` | Rol → tür (`any` · `string` · `number` · `boolean` · `date` · `parent`); dropdown `{ label, value }`, grafik `{ category, value }` |
272
- | `props.<yol>.required` | Doldurulmadan bağlanamayan roller |
273
- | `props.<yol>.fields` | Rol → bileşenin alan ADI prop'u (grafik `category → categoryField`, kanban `title → titleField`); bağlama o prop'lara seçilen alanın slug'ını yazar. Kaydında `fields` olmayan bileşen (dropdown) satırı rol adlarıyla okur |
274
- | `props.<yol>.fieldsFrom` | Satırların alanlarını tanımlayan liste prop'u (`datatable.rows → columns`); rol yerine kolon listesi üretilir |
275
-
276
- Yol joker olabilir: `series[].data` kaydı `series.1.data` prop'unu kapsar. Bağlamanın kendisi, tanım
277
- şekli ve kurallar: `platform_guide('page')` §Kural 1c-3.
278
-
279
192
  ## Komponent seçimi
280
193
 
281
194
  "Hangi işe hangi komponent" tablosu ve `table` / `datatable` karşılaştırması:
@@ -15,9 +15,7 @@ uzayındadır. Çakışan slug `Migration failed … relation "X" already exists
15
15
  kaydı hiç oluşmaz**. Rezerve adlardan bilinenler: `branches`, `applications`, `caches`,
16
16
  `components`, `datasources`, `entities`, `fields`, `files`, `flows`, `folders`, `layouts`,
17
17
  `microservices`, `pages`, `permissions`, `projects`, `queries`, `queued_events`, `roles`,
18
- `steps`, `users`, `variables`, `views`, `workflows` — ve rol yönetim şemasının tabloları:
19
- `organization_units`, `organization_positions`, `user_positions`, `access_policies`, `access_grants`
20
- (tam liste gateway'in rezerve ad kontrolündedir). Alan adı bunlardan biriyse eş anlamlısını
18
+ `steps`, `users`, `variables`, `views`, `workflows`. Alan adı bunlardan biriyse eş anlamlısını
21
19
  seç (ör. şube/branş için `branches` değil `specialties`).
22
20
 
23
21
  > **Ama `users`/`roles`/`files`/`folders` bir istisna:** bunlar "dolu olduğu için kaçınılacak"
@@ -26,7 +24,7 @@ seç (ör. şube/branş için `branches` değil `specialties`).
26
24
 
27
25
  ## Hazır entity'ler — kimlik tablosu ZATEN VAR
28
26
 
29
- Her projeye seed sırasında hazır entity'ler açılır ve **id'leri her kurulumda aynı sabitlerdir**
27
+ Her projeye seed sırasında 9 entity açılır ve **id'leri her kurulumda aynı sabitlerdir**
30
28
  (`Defaults` sınıfı) — aramana gerek yok, doğrudan `entity_get` ile çekebilirsin:
31
29
 
32
30
  | slug | id | Ne için |
@@ -37,33 +35,12 @@ Her projeye seed sırasında hazır entity'ler açılır ve **id'leri her kurulu
37
35
  | `permissions` · `role_permissions` | `01917ede-a457-…` · `01917ede-d450-…` | yetki matrisi |
38
36
  | `files` · `folders` | `0191dbf2-39c4-…` · `0191df94-f635-…` | Drive; `FILE` alanları buraya bağlanır (`entity_list`'te GİZLİ) |
39
37
  | `audit_trails` · `audit_trail_values` | `01961f53-25c3-…` · `01961f53-3552-…` | denetim izi |
40
- | `organization_units` · `organization_unit_closure` | `01a0a05e-1c9a-7022-a0c7-6b8320756a4c` · `01a0a05e-1ca3-7b6a-9f1b-7f1633f7f05a` | **Organizasyon ağacı** (yalnız okunur, aşağıda): birimler — `parent_id` · `unit_type` (holding/company/branch/region/department/team/other) · `function_code` · `name` · `code` · `manager_position_id` · `origin` · `is_active` — ve ata/torun kapanışı |
41
- | `organization_positions` · `organization_position_closure` | `01a0a05e-1ca3-700f-95c6-18fe1e30079c` · `01a0a05e-1ca4-7b73-b90e-4aa7d8eeeeef` | birimdeki koltuklar — `unit_id` · `parent_position_id` (idari hat) · `functional_parent_position_id` (işlevsel hat) · `role_id` · `name` · `code`; kapanışta `line_type` |
42
- | `user_positions` | `01a0a05e-1ca4-7841-b6b3-45c5892d5501` | kullanıcı ↔ pozisyon — `user_id` · `position_id` · `is_primary` · `assignment_type` · `starts_at` · `ends_at` |
43
38
 
44
39
  **`users` gerçek bir entity'dir**, sahte bir sistem tablosu değil: `entity_get` alanlarını verir,
45
40
  `RELATION` alanı hedef alabilir, table step / microservice okur, `row_create` yazar, kendi default
46
41
  DTO'su vardır. Auth middleware tarifi zaten bunu okur — `ngapps://examples/middleware-authenticate`
47
42
  `entityId` olarak `users`'ı kullanır.
48
43
 
49
- ### Organizasyon ağacı tabloları — okunur, genel yolla YAZILMAZ (ORG-001 · ORG-002)
50
-
51
- Beş organizasyon tablosu **her projede vardır**; basit projede boştur, kompleks projede
52
- (`project_create` `accessModel: 'complex'`) organizasyonun rol yönetim şemasının kopyasını taşır.
53
-
54
- - **Yazma kapalı (ORG-001, block).** `row_create` / `row_update` / `row_delete`, table kaynaklı uç
55
- ve table step bu tablolara platformda `400 SystemEntityWriteNotAllowed` alır; gateway isteği hiç
56
- göndermez. Ağaç organizasyon şemasından **senkronla** gelir (yönetim konsolunda yayın → abone
57
- projenin her ortamı); projeye özel birim/pozisyon ve kullanıcı ataması Studio › Organizasyon
58
- ekranındadır — MCP'de bu yazma yolu bilinçli olarak yoktur: projede yapı değişikliği aboneliği
59
- kapatır (`receiveUpdates = false`) ve dal ortamında 409 döner.
60
- - **Kompleks proje yayınlı son şemayla doğar (ORG-002).** Organizasyonda yayın yoksa tablolar boş
61
- kalır; önce `organization_schema_get` ile `publishedVersion`'a bak. Abonelik ve özelleştirme
62
- durumu `project_get` → `organizationSchema`.
63
- - **Okuma serbest:** `row_list('organization_units')`, pozisyonlar için `row_list('organization_positions')`.
64
- Alt ağaç sorusu (bir birimin bütün torunları) kapanış tablosundan `ancestor_id` filtresiyle
65
- okunur; `depth` 0 düğümün kendisidir.
66
-
67
44
  ### Neden gözden kaçıyor
68
45
 
69
46
  `entity_list`'i **`applicationId` ile** çağırdığında hazır entity'ler listede **görünmez**: seed
@@ -117,12 +94,6 @@ yapıyorsan devam et).
117
94
  uygulamanın rol açması/düzenlemesi gerekiyorsa yol her domain tablosuyla aynıdır: entity + kendi
118
95
  microservice ucun + sayfa. `role_list` yalnız okur.
119
96
 
120
- > **Kompleks projede roller organizasyon şemasından gelir** (`roles.origin = 'organization'`;
121
- > `role_list` bu alanı döndürmez, `row_list('roles')` okur). Şemadan gelen rol MCP'den yazılmaz,
122
- > yönetim konsolunda düzenlenir; yetki `page.roleIds` ile değil erişim politikasıyla verilir.
123
- > Aşağıdaki reçete basit proje içindir — kompleks projede kendi rolünü açan uç yine uyarı alır
124
- > (ROL-002 warn), dikey çözümün açtığı rol projeye özgü kalır.
125
-
126
97
  `roles` entity'sinin açtığı alanlar — fiziksel tabloda ayrıca `template_*` kolonları var, hepsi
127
98
  nullable, gateway'den görünmez:
128
99
 
@@ -163,15 +134,6 @@ Rol açma reçetesi:
163
134
  `permissions` / `role_permissions` **Studio'nun yetki matrisidir**, uygulama sayfasının yetkisi
164
135
  değil; uygulama tarafında yetkiyi `page.roleIds` ve middleware ifadesi kurar.
165
136
 
166
- ## Veri koruma — maskeli, şifreli ve türetilmiş alan
167
-
168
- TCKN, telefon gibi alanlar `fields[].protection` ile maskeli ve/veya şifreli saklanır; telefonun
169
- operatör kodu gibi sorgulanabilir parça `derivedFromFieldId` + `derivationRule` ile türetilmiş alan
170
- olur. Koruma yalnız düz metin alana konur (display, birincil anahtar, ilişki, çok dilli değil —
171
- PROT-003), korumalı alanda metin araması ve sıralama yoktur (PROT-001, PROT-002). Modlar, maske
172
- türleri, dolu kolonda geçiş ve hatalar: `platform_guide('access')` §'Alan koruması'. Satırları bir
173
- bileşene bağlamak (liste, dropdown, grafik) akış değil `connect_data_bind`: `platform_guide('page')` §Kural 1c-3.
174
-
175
137
  ## Alan tipleri (dbType + commonType İKİSİ birden verilir)
176
138
 
177
139
  | dbType (BÜYÜK HARF zorunlu) | commonType |
@@ -197,9 +159,6 @@ bileşene bağlamak (liste, dropdown, grafik) akış değil `connect_data_bind`:
197
159
  `description`'a yaz: para → `INT8` kuruş (`*_minor`), süre → `INT4` dakika, yüzde →
198
160
  `INT4` ×100, puan → `INT4` ×10.
199
161
  - `commonType`'sız `UUID`/`BOOL` "isn't a supported database type" hatasıyla reddedilir.
200
- - Birincil anahtar `properties.generationType` taşımak ZORUNDADIR: `properties` hiç verilmezse create
201
- `Please select a valid generation type for 'id'` ile düşer (38/U-14). `0` (Always) ve `1` (ByDefault) ikisi de
202
- geçerlidir — `UUID` anahtarda ikisiyle de satır id'si üretildi (ölçüldü 2026-09-21, 39/05 D-15).
203
162
  - **Katalogu okumak gerekiyorsa** (bu datasource'ta hangi `dbType` var, hangisi varsayılan, tip
204
163
  hangi seçenekleri kabul ediyor, hangi tipe dönüştürülebilir) `datasource_configuration_options`
205
164
  çağır: varsayılan yanıt ~5 KB'lık **özettir**; 816 kayıtlık collation DEĞER listesi yalnız
@@ -721,13 +680,12 @@ orada `undefined` alır.
721
680
  > `Sequence contains no **elements**` (satır yok — genelde preview rollback'i) **farklı**
722
681
  > sorunlardır; karıştırmak teşhisi saptırır.
723
682
 
724
- - **Audit izi ne zaman gerçekten yazılır?** Tek koşul `isAuditTrailActive: true`. Bayrak açık ve
725
- `auditTrailType` boş gelirse **`simple`** yazılır (TB-101, 2026-09-20 — eskiden bayrak tek başına
726
- hiçbir şey yazmıyordu, sessiz tuzaktı); okuma yolunda da tipsiz ama açık entity `simple` sayılır.
727
- Üç tip, aynı satır başlığını yazar, farkları okumada: `simple` yalnız "kim oluşturdu / kim
728
- güncelledi" meta'sını besler (geçmiş listesi dönmez) · `basic` geçmiş listesini döndürür, değişen
729
- alanları döndürmez · `detailed` değişen alanları da yazar. Enum yalnız bu üç değeri tanır
730
- (`AuditTrailType.cs`); `advanced` diye bir değer **yoktur**, gönderirsen bağlama hatası alırsın.
683
+ - **Audit izi ne zaman gerçekten yazılır?** `CreateAuditTrailCommandHandler` şu üç durumda
684
+ **hiç kayıt açmaz**: `IsAuditTrailActive == false`, `AuditTrailType == null`, ya da
685
+ `AuditTrailType == simple`. Yani iz tutulması için `isAuditTrailActive: true` **ve**
686
+ `auditTrailType: "basic" | "detailed"` birlikte gerekir. Enum yalnız üç değer tanır —
687
+ `simple` · `basic` · `detailed` (`AuditTrailType.cs`); `advanced` diye bir değer **yoktur**,
688
+ gönderirsen bağlama hatası alırsın.
731
689
  - **Audit izi IP adresi tutar.** `audit_trails.IpAddress`, isteğin
732
690
  `HttpContext.Connection.RemoteIpAddress` değerinden doldurulur (`UserContext.cs`) ve satır
733
691
  olaylarıyla (`Row.Created/Updated/Deleted` → `UserIpAddress`) audit consumer'a taşınır; kullanıcı
@@ -14,10 +14,8 @@ Uydurma fonksiyon adı runtime'da `X is not defined` 500'üdür — yalnız bura
14
14
 
15
15
  **Değişkenler:** step çıktıları (`<stepAdı>.data`), middleware değişkenleri (`user`,
16
16
  `settings`, `permissions`… — `workflow_middleware_variables` ile keşfet), HTTP bağlamı:
17
- `cookie`, `header`, `queryString`, `body`, `triggerSource` (tetikleyen ucun
18
- type/id/name/slug/roles/pathAndQuery'si — emekliye ayrılacak) ve `context`
19
- (type/name/roles/path/impersonatedUserId/language). **Kimlik devri yalnız `context.impersonatedUserId`**'dedir;
20
- `triggerSource`'ta bu alan yoktur (MW-006). Gövde bir JSON **nesnesi** ise `body.alan` diye okunur,
17
+ `cookie`, `header`, `queryString`, `body`, `triggerSource`/`context` (tetikleyen ucun
18
+ type/name/roles/impersonatedUserId'ı). Gövde bir JSON **nesnesi** ise `body.alan` diye okunur,
21
19
  gövde bir JSON **dizisi** ise `body[0].alan` diye — 2026-09-04 öncesinde nesne gövde de diziye
22
20
  sarılıyordu ve `body.alan` sessizce `undefined` dönüyordu, bu yüzden gövdeye bakan yetki kapıları
23
21
  açık kalıyordu. Workflow'da istek girdisi `input.`, automation'da
@@ -99,16 +97,14 @@ dalından devam eder.
99
97
  |---|---|
100
98
  | `Page` | `Page.user`, `Page.variables`, `Page.components`, `Page.properties`, `Page.queryParams`, `Page.authorized(roles)` |
101
99
  | **Komponent adları** | Her komponent adıyla doğrudan değişkendir: `specialties_table.rows = data` hem prop'u yazar hem UI'ı günceller (change event). Addaki `-` silinir: `tickets-table` → `ticketstable` |
102
- | `state.page` / `state.app` | Sayfa/uygulama state'i (oku/yaz): `state.page.selectedId = row.id`. **Bellekte yaşar** — sayfa her açıldığında tanımlı `value`'dan başlar; mobil uygulamada kalıcı olması için değişkene `storage` verilir (`platform_guide('mobile')` §Kalıcı state). **Tanımlı değişkenler de buradadır:** `variable_create` ile yazılan her `key` sayfa düzeyinde `state.page.<key>`, uygulama düzeyinde `state.app.<key>` olur; `value` nesneyse alanlarına inilir (`state.page.MyTest.isActive`) |
100
+ | `state.page` / `state.app` | Kalıcı state (oku/yaz): `state.page.selectedId = row.id`. **Tanımlı değişkenler de buradadır:** `variable_create` ile yazılan her `key` sayfa düzeyinde `state.page.<key>`, uygulama düzeyinde `state.app.<key>` olur; `value` nesneyse alanlarına inilir (`state.page.MyTest.isActive`) |
103
101
  | `Steps` | Adım çıktıları: `Steps.load_specialties` — anahtar adımın **ADIdır**, `stepId` değil (`setStorage(task.name, …)`); `Steps.<adım>.error` o adımın hatası — ama YALNIZ HTTP durum metnidir (401 için `'Unauthorized'`), ucun mesajı değil. `Steps.error` ise hata akışı için doldurulur (`onError` koşmadan önce `setStorage('error', …)` yapar) ve **yalnız orada okunur**: storage sayfa başına tek `FlowMachine`'de yaşar, ama dışarıdan başlayan her akış başlarken `'error'`'u ve kendi adımlarının önceki değerlerini temizler (`flow-engine.ts` `run`, 2026-09-25) — normal akışta `Steps.error` boştur; hata akışı ve onun tetiklediği akış (`nested`) onu görür ve şekli `{ message, code, step: { id, name, type, data } }`'dir: kullanıcıya gösterilecek metin `Steps.error.message`'tır (`err.response.data.message`, boşsa durum metni). **Başarılı bir adımda `Steps.<adım>.data` gerçek bir `Array`'dir** — `.map` · `.filter` · `.concat` · `.length` çalışır. Adım HATA dönerse aynı alan ucun hata gövdesini taşır; aşağıdaki kutuya bakın |
104
- | `self` · `item` · `Row` / `RowIndex` | Tetikleyen komponent (yazılabilir) · repeater/tablo satırı (yazmak YALNIZ o satırı günceller). Satır AKIŞINDA (satırdaki düğümün olayı) ARC-121 düzeltmesini (2026-09-27) taşıyan runtime gerekir, eskisinde boştu — sürümden bağımsız yol `<liste>.selectedItem` / `.selectedIndex`. Tekrarlayıcının KENDİ `change`/`select` akışında satır bağlamı yoktur. `item.x = …` yazımı tekrarlayıcının `change` olayı olarak iletilir: `change`'e bağlı akış her yazımda koşar, o akış da `item`'a yazarsa döngü olur |
102
+ | `self` · `item` · `Row` / `RowIndex` | Tetikleyen komponent (yazılabilir) · repeater/tablo satırı (yazmak satırı günceller) |
105
103
  | `event` | `{name, data, source: {id, props}}` |
106
104
  | `cookie` | `cookie.get(name)` / `cookie.set(name, value, {expiresInHours, path})` / `cookie.remove(name)` — tarayıcı cookie'si |
107
105
  | `setComponentProperty(name, key, value)` / `getComponentProperty(name, key)` | fonksiyon alternatifi |
108
106
  | `resetForm(name)` | Formu sıfırlar: alanlar başlangıç değerine döner, form "gönderilmemiş" olur, doğrulama mesajları silinir. Kayıt sonrası "yeni kayıt" için alanları tek tek `null`'a çekme — gönderilmiş formda her biri "zorunlu alan" mesajı çıkarır. Ad ya da komponent değişkeni alır: `resetForm('risk_form')` / `resetForm(risk_form)`. **Yalnız UI flow kodunda** |
109
- | `LocalStorage` · `Widget` · `params` | yerel veri · widget bağlamı · olay parametreleri. `LocalStorage` barındırıcının deposudur, salt okunur ve değerler METİNdir: web'de uygulamanın kökenindeki `localStorage` (Studio önizlemesinde Studio'nun kendi anahtarları da görünür), cihazda akışın `storage` deposu. `storage` adımı düz bir anahtara yazınca `LocalStorage.<anahtar>` aynı akışta yeni değeri verir ve sayfanın bağları yeniden değerlendirilir (`isSelected: {{ LocalStorage['zeyrek:theme-mode'] === 'dark' }}`). `state.page\|app.<key>`'e yazan adım `LocalStorage`'a girmez (ARC-147, 2026-09-29) |
110
- | `Device` | Salt okunur cihaz durumu, barındırıcı günceller: `Device.isOnline` — ağ bağlantısı var mı (bilinmiyorsa `true`). Değişince sayfanın bütün bağları yeniden değerlendirilir; çevrimdışı bandı: `isHidden: {{ Device.isOnline }}`. Cihazda `expo-network`, web'de tarayıcının `online`/`offline` olayları. `Device` adında komponent ifade bağlamından süzülür (ayrılmış ad) |
111
- | **Ayrılmış adlar** | Bu tablodaki globallerle (ve önsözün iç adlarıyla: `payload`, `error`, `repeaterId`, `_` ile başlayanlar…) aynı `name`'i taşıyan komponent (runtime yalnız İLK `-`'yi siler: `ite-m` da `item` sayılır) ifadede kendi adıyla GÖRÜNMEZ — süzülür, uyarı loglanır (liste: `@ng-apps/flow` `EXPRESSION_PRELUDE_NAMES`). Eskiden aynı ad sayfanın BÜTÜN ifadelerini `SyntaxError`'la düşürürdü (ARC-143). Gateway artık bu adların HEPSİNİ **PAGE-009** ile sayfa/layout yazma yollarında ve `page_schema_validate`'te istek gitmeden reddeder — komponente `t`, `state`, `event`, `item`, `self`, `Page`, `Row` gibi ad verme |
107
+ | `LocalStorage` · `Widget` · `params` | yerel veri · widget bağlamı · olay parametreleri |
112
108
  | `t(key)` | Çeviri anahtarını çözer: aktif dil → projenin varsayılan dili → anahtarın kendisi. Boş string de "eksik" sayılır. Sözlük `machine.context.state.translations`'tan gelir; dil `language-selector` ile değişince bir sonraki çağrı yeni dili görür. **Yalnız UI flow kodunda vardır** — backend ifadelerinde karşılığı `Loc()`'tur (`platform_guide('workflow')`) | `t('home.welcome')` |
113
109
  | `log(...)` | console (proxy'leri temizler) |
114
110
  | `Functions` | **Kullanıcı fonksiyonları** (`function_create`): `Functions.toplamHesapla(fiyat, adet)` — uygulama kapsamlılar her sayfada, sayfa kapsamlılar yalnız kendi sayfasında. **Yalnız tarayıcı**; sunucuda bu ad alanı yoktur (2026-09-10, `WF-030`) |
@@ -129,11 +125,6 @@ dalından devam eder.
129
125
  > `runtimeErrors` taşır ve hangi komponentin hangi prop'unun yazılamadığını (`element` ·
130
126
  > `property`) söyler. Aynı defter hata dönen microservice adımlarını da kaydeder. **Kare
131
127
  > "çalışıyor" görünse bile `runtimeErrors` doluysa o adımlar işini YAPMAMIŞTIR.**
132
- >
133
- > **Prop'a bağlı ifade patlarsa** (Studio'da "Expression error" toast'ı) `page_screenshot` yanıtı
134
- > `expressionErrors` taşır: `{ elementId, prop, expression, message, count }`, öğe başına en çok iki.
135
- > Toast da öğeyi adlandırır (`Expression error · tx_baslik.content`); cihazda geliştirme paketi aynı
136
- > satırı Metro günlüğüne basar (ZM-05).
137
128
 
138
129
  **Prop'a doğrudan ifade bağlama (`{{ }}`):** akış kurmadan bir prop'u ifadeye bağlamak için
139
130
  prop `type: 'code'` olur, **ifade `ref` alanına `{{ }}` içinde** yazılır, `data` tasarım zamanı
@@ -273,7 +273,7 @@ toplamHesapla(row.fiyat, row.adet) > 1000
273
273
  serbesttir — sunucuda o ad alanı yok.
274
274
  - **Önekli hata:** gövde hatası `Functions.<ad>: <mesaj>` (studio) ya da `<ad>: <mesaj>` (workflow)
275
275
  olarak gelir; `Steps.<adım>.error.message` ya da `runtimeErrors`'ta bu öneki ara.
276
- - **Mobil uygulama:** mobil runtime (`@ng-apps/ui-native`) `appFunctions`/`pageFunctions`'ı `Functions`'a geçirir, çağrı web'deki gibi çalışır.
276
+ - **Mobil yok** (K11): `apps/mobile` runtime'ı `Functions`'ı boş nesne kurar.
277
277
  - **Önbellek:** `/view` yolu eski gövdeyi birkaç saniye gösterebilir; `/dev` yolu anlıktır.
278
278
  - **Parametre konumsal:** `parameters` sırasını değiştirmek mevcut çağrıların anlamını değiştirir;
279
279
  `function` adımları ada göre eşlendiği için etkilenmez.
@@ -5,10 +5,7 @@
5
5
  Bağımlılıklar bu sırayı zorunlu kılar; atlama:
6
6
 
7
7
  ```
8
- 1. project_create (ÖNCE TÜRÜ SEÇ: accessModel 'simple' | 'complex' — aşağıdaki
9
- 'Basit mi kompleks mi?' tablosu; sonradan değiştirmek ayrı bir dönüşüm
10
- işidir.
11
- application zorunlu: ilk application projeyle birlikte açılır;
8
+ 1. project_create (application zorunlu: ilk application projeyle birlikte açılır;
12
9
  application slug'ı ORG GENELİNDE tekildir — 'web' büyük olasılıkla
13
10
  doludur, 409'da project_list ile mevcut slug'ları tara.
14
11
  DİL: gateway create'ten sonra projenin dillerini kurar — verirsen
@@ -71,8 +68,6 @@ Bağımlılıklar bu sırayı zorunlu kılar; atlama:
71
68
  13. application_update (homepageId — ana sayfa sayfadan değil application'dan seçilir)
72
69
  ```
73
70
 
74
- Onay zinciri, görev kutusu, SLA gibi insanı bekleyen işler workflow'a sıkıştırılmaz: entity ve (gerekiyorsa) servis workflow'ları hazır olduktan sonra süreç tanımı yazılır — `platform_guide('bpm')`.
75
-
76
71
  ## İlk kullanıcıyı kim açar? (tavuk-yumurta kilidi)
77
72
 
78
73
  Kimlik kurulmuş yeni bir projede **giriş yapabilecek hiç kimse yoktur** ve zincir kendi kendini
@@ -124,38 +119,6 @@ Middleware bir kontrol listesi maddesi değil; **ihtiyaca** kurulur:
124
119
  `middlewareIds` ile bağlı olmalı. Bir-iki uca bağlayıp gerisini açık bırakmak, hiç kurmamaktan
125
120
  kötüdür — sistem güvenli görünür, değildir.
126
121
 
127
- ## Basit mi kompleks mi? (proje türü)
128
-
129
- Tür `project_create` `accessModel` ile proje açılırken seçilir; varsayılan `simple`'dır.
130
-
131
- | Durum | Tür |
132
- |---|---|
133
- | Kimlik ve yetki uygulamanın kendi işi; birkaç rol yeter, satır kapsamı elle yazılan `user.id` filtresi | **simple** — bugünkü davranış, aşağıdaki middleware tablosu geçerli |
134
- | Kurumun birim/pozisyon ağacı var (holding → şirket → bölge → departman), "müdür ekibinin kayıtlarını görür", maskeli/şifreli alan (TCKN) | **complex** |
135
-
136
- Kompleks projede fark edilmesi gerekenler:
137
-
138
- - Proje organizasyonun **yayınlı son** rol şemasının kopyasıyla doğar; yayın yoksa organizasyon
139
- tabloları boştur (ORG-002). Açmadan önce `organization_schema_get` → `publishedVersion`.
140
- - Ağaç tabloları (`organization_units`, `organization_positions`, `user_positions`) yalnız
141
- okunur; `row_*` ile yazılmaz (ORG-001).
142
- - Abonelik `project_get` → `organizationSchema`: `customizedAt` görünüyorsa proje ayrışmıştır ve
143
- yeni sürümler artık gelmez.
144
-
145
- ### Kompleks projede ilk kullanıcı
146
-
147
- `users` kompleks projede de boş doğar ve yukarıdaki bootstrap deseni **`enforce` ortamda çalışmaz**:
148
- anonim uç işareti olmadığı için oturumsuz her microservice isteği — bootstrap ucu da — `401` döner.
149
- Yeni kompleks proje `enforce` başlar. Sıra:
150
-
151
- 1. Kullanıcıya söyle: development ortamının zorlama modu Studio › Ayarlar › Ortamlar'dan geçici olarak
152
- `shadow` yapılsın (insan işi, ACC-007; production'a dokunulmaz). `shadow` engellemez.
153
- 2. Bootstrap desenini uygula (geçici uç → kullanıcı → ucu hemen sil).
154
- 3. Kullanıcının koltuğu Studio › Organizasyon ekranında atanır (`user_positions`); politika pozisyona ya da
155
- role atanmışsa yetki buradan gelir.
156
- 4. Mod `enforce`'a döner; `access_session_create` ile giriş yap, `asUser` ile uçları sına, reddi
157
- `access_preview` ile açıkla (`platform_guide('access')`).
158
-
159
122
  ## Örnek arama davranışı
160
123
 
161
124
  Örnek gövde için **mevcut projeleri taramak yerine** önce şunlara bak: