@appaflytech/zeyrek-ai-mcp 0.0.6 → 0.0.8

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 (98) hide show
  1. package/.env.example +2 -2
  2. package/.env.production.example +8 -0
  3. package/README.md +9 -8
  4. package/dist/config.js +18 -3
  5. package/dist/knowledge/backendConstraints.js +88 -0
  6. package/dist/knowledge/componentCatalog.js +415 -68
  7. package/dist/knowledge/componentEvents.js +120 -25
  8. package/dist/knowledge/functionGuards.js +134 -0
  9. package/dist/knowledge/normalize.js +512 -25
  10. package/dist/knowledge/outlines.js +31 -0
  11. package/dist/knowledge/policy.js +14 -5
  12. package/dist/knowledge/propTypes.js +5 -4
  13. package/dist/knowledge/rules.js +453 -6
  14. package/dist/knowledge/styleResolve.js +6 -1
  15. package/dist/platform/csv.js +123 -0
  16. package/dist/platform/errors.js +62 -3
  17. package/dist/platform/http.js +11 -2
  18. package/dist/platform/responses.js +16 -4
  19. package/dist/platform/screenshot.js +98 -9
  20. package/dist/platform/strictArguments.js +32 -0
  21. package/dist/platform/writeDiff.js +6 -3
  22. package/dist/resources/examples/flow-call-function.json +66 -0
  23. package/dist/resources/examples/function-total.json +70 -0
  24. package/dist/resources/examples/microfunction-node-sum.json +56 -0
  25. package/dist/resources/examples/page-dynamic-form.json +1 -1
  26. package/dist/resources/examples/page-sign-in.json +2 -2
  27. package/dist/resources/guides/component.md +14 -2
  28. package/dist/resources/guides/entity.md +321 -17
  29. package/dist/resources/guides/expressions.md +9 -0
  30. package/dist/resources/guides/functions.md +262 -0
  31. package/dist/resources/guides/getting-started.md +7 -0
  32. package/dist/resources/guides/layout.md +6 -0
  33. package/dist/resources/guides/merge.md +231 -0
  34. package/dist/resources/guides/microfunction.md +166 -0
  35. package/dist/resources/guides/microservice.md +166 -7
  36. package/dist/resources/guides/modify-existing.md +23 -0
  37. package/dist/resources/guides/page.md +101 -22
  38. package/dist/resources/guides/translation.md +35 -10
  39. package/dist/resources/guides/workflow.md +51 -2
  40. package/dist/resources/schema-fingerprint.json +4 -4
  41. package/dist/resources/schemas/AnalyzeImportQuery.json +51 -0
  42. package/dist/resources/schemas/ApplyMergePlanCommand.json +19 -0
  43. package/dist/resources/schemas/CreateBulkRowCommand.json +3 -0
  44. package/dist/resources/schemas/CreateEnvironmentCommand.json +31 -0
  45. package/dist/resources/schemas/CreateGlobalFunctionCommand.json +95 -0
  46. package/dist/resources/schemas/CreateImportPlanCommand.json +278 -0
  47. package/dist/resources/schemas/CreateMergePlanCommand.json +34 -0
  48. package/dist/resources/schemas/CreateMicrofunctionCommand.json +117 -0
  49. package/dist/resources/schemas/CreateMicrofunctionRuntimeCommand.json +51 -0
  50. package/dist/resources/schemas/CreateMicroserviceCommand.json +123 -2
  51. package/dist/resources/schemas/CreateWorkflowCommand.json +17 -3
  52. package/dist/resources/schemas/DataJobDto.json +267 -0
  53. package/dist/resources/schemas/ExportRowsCommand.json +172 -0
  54. package/dist/resources/schemas/Filter.json +3 -1
  55. package/dist/resources/schemas/GetRowsQuery.json +3 -1
  56. package/dist/resources/schemas/GlobalFunctionDto.json +89 -0
  57. package/dist/resources/schemas/GlobalFunctionUpdateResultDto.json +249 -0
  58. package/dist/resources/schemas/ImportAnalysisDto.json +401 -0
  59. package/dist/resources/schemas/ImportPlanDto.json +260 -0
  60. package/dist/resources/schemas/ImportSampleDto.json +90 -0
  61. package/dist/resources/schemas/InvokeMicrofunctionCommand.json +25 -0
  62. package/dist/resources/schemas/PreviewMicroserviceCommand.json +123 -2
  63. package/dist/resources/schemas/PreviewWorkflowCommand.json +17 -3
  64. package/dist/resources/schemas/ResolveMergeConflictsCommand.json +58 -0
  65. package/dist/resources/schemas/RevertMergePlanCommand.json +19 -0
  66. package/dist/resources/schemas/RunImportCommand.json +62 -0
  67. package/dist/resources/schemas/StepDto.json +17 -3
  68. package/dist/resources/schemas/UpdateBulkRowCommand.json +3 -0
  69. package/dist/resources/schemas/UpdateEntityCommand.json +3 -1
  70. package/dist/resources/schemas/UpdateGlobalFunctionCommand.json +66 -0
  71. package/dist/resources/schemas/UpdateMicrofunctionCommand.json +121 -0
  72. package/dist/resources/schemas/UpdateMicrofunctionRuntimeCommand.json +54 -0
  73. package/dist/resources/schemas/UpdateMicroserviceCommand.json +123 -2
  74. package/dist/resources/schemas/UpdateWorkflowCommand.json +17 -3
  75. package/dist/server.js +17 -4
  76. package/dist/tools/activities.js +40 -0
  77. package/dist/tools/automations.js +14 -5
  78. package/dist/tools/common.js +16 -0
  79. package/dist/tools/dependencies.js +1 -1
  80. package/dist/tools/environments.js +52 -0
  81. package/dist/tools/files.js +51 -50
  82. package/dist/tools/flows.js +104 -5
  83. package/dist/tools/functions.js +331 -0
  84. package/dist/tools/importSchemas.js +79 -0
  85. package/dist/tools/imports.js +241 -0
  86. package/dist/tools/layouts.js +4 -4
  87. package/dist/tools/merges.js +113 -0
  88. package/dist/tools/microfunctions.js +155 -0
  89. package/dist/tools/microservices.js +112 -9
  90. package/dist/tools/pages.js +188 -66
  91. package/dist/tools/platformInfo.js +4 -1
  92. package/dist/tools/queries.js +72 -6
  93. package/dist/tools/revisions.js +94 -0
  94. package/dist/tools/rows.js +342 -22
  95. package/dist/tools/screenWrite.js +11 -2
  96. package/dist/tools/templates.js +32 -5
  97. package/dist/tools/workflows.js +28 -6
  98. package/package.json +3 -1
@@ -78,16 +78,18 @@ mümkündür ama doğrulama duvarı ve canlı canvas yalnız `page_schema_patch`
78
78
  her turda çözümlenmiş metinle EZER — anahtar yalnız `ref`'te yaşar, `data`'ya yazıp
79
79
  güvenme (`code` prop'uyla aynı davranış). Tam şekil, fallback zinciri ve `translation_*`
80
80
  tool'ları için `platform_guide('translation')`.
81
- - **Kurulmuş bir düğümün prop TİPİNİ `set_prop_type` micro-op'u değiştirir.**
81
+ - **Kurulmuş bir düğümün prop TİPİNİ yerinde değiştir — düğümü yeniden KURMA.** İki eş yol var:
82
+ `{ op: 'replace_prop', target: '<elementId>', prop: 'content', value: { type: 'translation', ref: 'dashboard.kpi.total' } }`
83
+ (applier `code` ve `translation` sarmalını tipiyle korur; gateway 2026-09-15'e kadar translation
84
+ sarmalını reddediyordu) ya da
82
85
  `{ op: 'set_prop_type', target: '<elementId>', prop: 'content', propType: 'translation', ref: 'dashboard.kpi.total' }`
83
- bir `static` prop'u çeviriye, `propType: 'code'` + `ref: '<ifade>'` koda, `propType: 'static'` +
84
- `data: <değer>` sabite bağlar. Bu bir **gateway emülasyonudur**: `replace_prop` gönderilen ham
85
- değeri her zaman `static` Prop'una sarar ve sarmalanmış Prop nesnesini reddeder, yani prop tipini
86
- yazamaz. Op olmadan tek yol düğümü `remove_component` + `add_component` ile yeniden kurmaktı;
87
- 2026-09-06 koşusunda on bir etiket bu yolla kuruldu ve onlara yazan **dokuz setter iteratee'si**
88
- platform tarafından sessizce silindi (üç KPI kartı boş kaldı). Taşıyıcı alan tipe göre değişir —
89
- `static` değeri `data`'da, `code` ve `translation` `ref`'te taşır; eksik taşıyıcı istek
90
- gönderilmeden reddedilir ve `page_schema_validate` aynı kararı verir.
86
+ (gateway emülasyonu; mevcut `data`'yı tasarım yedeği olarak taşır). Taşıyıcı alan tipe göre
87
+ değişir — `static` değeri `data`'da, `code` ve `translation` `ref`'te taşır; eksik taşıyıcı istek
88
+ gönderilmeden reddedilir ve `page_schema_validate` aynı kararı verir. Eski yol
89
+ `remove_component` + `add_component` idi: 2026-09-06 koşusunda on bir etiket bu yolla kuruldu ve
90
+ onlara yazan **dokuz setter iteratee'si** sessizce silindi; 2026-09-15'te (G-04) aynı zincir bir
91
+ `daterangepicker` yer tutucusunu çeviriye bağlarken tekrarlandı — setter hedefi elementId değil
92
+ komponentin iç kimliğidir (aşağıda Kural 2, `FLOW-018`).
91
93
 
92
94
  - **`blocks[].size`, komponentin `component_get`'teki `maxSize`'ını aşamaz.** Dikkat: katalog
93
95
  varsayılanı aşabiliyor (`page-header` default `h:8`, `maxSize` `h:4`) — varsayılanı körü körüne
@@ -394,6 +396,14 @@ göstermek error flow'un işidir.
394
396
  > "branches": [{ "id": "<GUID>", "name": "always", "nextStepId": null }] }
395
397
  > ```
396
398
 
399
+ > **`confirm` adımının diyalog çerçevesi de yazılabilir.** `args` dört düz metin alanı taşır:
400
+ > `message` (gövde), `title` (başlık), `confirmText` (onay düğmesi, `yes` dalı), `cancelText`
401
+ > (vazgeç düğmesi, `no` dalı). Son üçü isteğe bağlıdır; boş bırakılan alan dile göre sabit metne
402
+ > düşer ("Emin misiniz?" / "Evet" / "Hayır" — `dialog.functions.ts` `resolveDialogFrame`).
403
+ > Dördü de `alert`'in `message`'ı gibi DÜZ METİNDİR (FLOW-022 hepsini denetler):
404
+ > `{ "type": "confirm", "args": { "message": "Bu risk ve 4 aksiyonu silinecek.", "title": "Riski sil",
405
+ > "confirmText": "Sil", "cancelText": "Vazgeç" } }`.
406
+
397
407
  > **Hangi yolu seçeceksin — `errorSteps` mi, ana akışta `condition` mı?** İkisi birden
398
408
  > kurulamaz (yukarıdaki 1. madde), yani bu bir tercih değil bir karar:
399
409
  >
@@ -479,7 +489,7 @@ Tarif: `platform_guide('middleware')`.
479
489
 
480
490
  **Sözlükler** (`StepType.cs`, `StepParameterValueType.cs` — hepsi küçük harf):
481
491
  `start · microservice · setter · setcookie · validation · condition · redirect · alert ·
482
- confirm · flow-trigger · storage · navigate · code · download · end`
492
+ confirm · flow-trigger · storage · navigate · code · download · function · end`
483
493
  değer tipleri: `static · page · property · storage · variable · code · item · state`
484
494
 
485
495
  > **Sözlükte olmak KOŞACAĞI anlamına gelmez — koşan tipler barındırıcıdan gelir.** Motor yedi
@@ -490,7 +500,7 @@ değer tipleri: `static · page · property · storage · variable · code · it
490
500
  >
491
501
  > | Adım tipi | Web | Mobil | Nerede register ediliyor |
492
502
  > |---|---|---|---|
493
- > | `start` · `setter` · `code` · `condition` · `microservice` · `validation` · `flow-trigger` | ✅ | ✅ | `flow-engine.ts` — motorun kendisi |
503
+ > | `start` · `setter` · `code` · `condition` · `microservice` · `validation` · `flow-trigger` · `function` | ✅ | ✅ | `flow-engine.ts` — motorun kendisi (`function` mobilde kayıtlıdır ama mobil runtime `Functions`'ı boş kurar — K11, çağrı çalışmaz) |
494
504
  > | `alert` · `redirect` · `setcookie` · `storage` | ✅ | ✅ | uygulama; mobilde `redirect` navigate, `setcookie` storage uygulamasına eşlenir |
495
505
  > | `confirm` · `download` | ✅ | ❌ | yalnız `Runtime.svelte` |
496
506
  > | `navigate` | ❌ | ✅ | yalnız `ScreenRuntime.tsx` — web'deki karşılığı `redirect` |
@@ -521,6 +531,14 @@ değer tipleri: `static · page · property · storage · variable · code · it
521
531
  > (`Page.*`, komponentlere adıyla erişim, `state.page/app`, `Steps`, `self`/`item`/`event`,
522
532
  > `cookie.get/set`, `await`) ve `value.type` çözümleme tablosu için
523
533
  > **`platform_guide('expressions')`** — uydurma erişim adı sessizce `undefined` üretir.
534
+ >
535
+ > **`function` adımı ("Call function")** bir kullanıcı fonksiyonunu çağırır: `args: { functionId, functionName,
536
+ > parameters: [{ name, value }] }` — `functionId` zorunlu ve gerçek (`function_list`; FLOW-024 block),
537
+ > `parameters[].name` fonksiyonun bildirimindeki adla eşleşir, `value` şekli `microservice` adımıyla
538
+ > aynıdır. Çıktı `Steps.<adımAdı>.data` (hata `.error.message`), dal `always`. Aynı fonksiyon `code`
539
+ > adımında ve `{{ }}` bağlamasında `Functions.<ad>(…)` ile de çağrılır; gateway bilinmeyen adı ve
540
+ > fazla argümanı FLOW-025 ile uyarır. Tam gövde `ngapps://examples/flow-call-function`, kurallar
541
+ > **`platform_guide('functions')`**.
524
542
 
525
543
  > Bir microservice adımı kaydedildiğinde platform `args.microserviceSchema`'yı
526
544
  > (parameterScheme + returnScheme + `isReturnArray`) kendisi doldurur — `flow_get` ile geri
@@ -812,8 +830,9 @@ kullanır: `page.mappers.ts` `mapPageLayoutToPreview` — layout varsa çizilen
812
830
  >
813
831
  > Kural: **`isWrapper` yalnız gerçekten sayfa boyu kaplaması gereken kap içindir**
814
832
  > (`page_container` böyledir ve öyle kalmalı). Sadece "başlık/çerçeve çizilmesin" diye wrapper
815
- > yapma — o iş `container` için `style` ile (`background:'transparent'`, `border:'none'`),
816
- > `form` için `hideBorders`/`hidePadding` prop'larıyla yapılır. **`states` için micro-op
833
+ > yapma — o iş `container` için de `form` için de `style` ile yapılır (`background:'transparent'`,
834
+ > `border:'none'`, `padding:0`). `form`'un eski `hideBorders`/`hidePadding` prop'ları
835
+ > 2026-09-09'da şemadan kaldırıldı — bileşen onları hiçbir zaman okumuyordu, no-op'tu. **`states` için micro-op
817
836
  > YOKTUR:** yanlış `isWrapper`'ı düzeltmenin tek yolu düğümü `remove_component` +
818
837
  > `add_component` ile yeniden kurmaktır (sonrasında Kural 2'deki flow yeniden kaydetme adımı
819
838
  > ZORUNLU olur).
@@ -884,6 +903,16 @@ Beş şeyi bilmeden flex kurma:
884
903
  aradaki boşluklar çizilmez. Yine de bitişik ver (0,1,2…): kapsayıcı ileride `grid`'e
885
904
  döndürülürse şema geçerli kalsın. Gateway bu yüzden **flex kapsayıcının İÇİNDE PAGE-010
886
905
  boşluk uyarısı üretmez** (ızgarada üretmeye devam eder).
906
+ **Dizi sırası çizimi belirlemez** — `children[]` içindeki yer değil `y` kazanır; `y`'si eşit
907
+ iki çocukta dizi sırası kazanır. Bu yüzden flex kapta sıralamanın yolu `index`'tir:
908
+ `add_component`/`move_component`'e verilen `index` **görünen sıradaki yeri** belirler ve gateway
909
+ kardeşlerin konumunu Studio'nun flex tuvali gibi yeniden yazar (x=0, alt alta birikimli y;
910
+ yanıtın `gatewayNormalized` notu hangi `y`'nin değiştiğini söyler). Grafiğin üstüne başlık:
911
+ `{ "op": "add_component", "parent": "<flex kap>", "index": 0, "component": { … } }` — koordinat
912
+ hesaplamak gerekmez, `remove_component` + `add_component` hiç gerekmez. **Izgara kapta `index`
913
+ çizimi değiştirmez** (her çocuk kendi `position`'ında mutlak çizilir): sırayı
914
+ `move_component { target, position: { x, y } }` ile ver; sona eklemeyen `index` orada
915
+ **PAGE-033 (uyarı)** üretir.
887
916
  3. **Flex kapsayıcının yüksekliği içeriğine oturur.** `verticalAlign`'ın dağıtacak boşluğu
888
917
  olması için `appearance.heightType: 'fixed'` vermelisin — ölçü `heightString`'den
889
918
  (serbest CSS uzunluğu, ör. `"30vh"`), o yoksa `size.h × 10px`'ten gelir. `heightString`
@@ -1001,7 +1030,8 @@ UYGULAMAZ** — koordinatları aynen kaydeder (aşağı itme yalnız `page_creat
1001
1030
  > sarmalayıcıya bağla (yukarıdaki `box_multi`). Sarmalayıcıyı **`isWrapper:false`** kur
1002
1031
  > (Kural 1f: wrapper = `min-height:80vh`) ve çerçevesini `style` ile kapat:
1003
1032
  > `{ background:'transparent', border:'none', '&__body': { padding:'0px' } }`.
1004
- > `appearance.isHidden` diye bir kaçış yolu YOKTUR — runtime onu hiç okumaz.
1033
+ > `appearance.isHidden` diye bir alan YOKTUR (2026-09-15'te platformdan kaldırıldı, S-16) —
1034
+ > görünürlük yalnız `props.isHidden`'dır.
1005
1035
 
1006
1036
  > **Satır BAŞINA doğrulama kurulamaz.** `validations` komponentin kendisindedir, tüm satırlar
1007
1037
  > onu paylaşır — "3. soru zorunlu, 4. soru değil" şemayla ifade edilemez. Zorunluluk satır
@@ -1129,6 +1159,13 @@ yapmazsan ekran "platform mavisi" görünür; marka rengine çevirmek tek satır
1129
1159
  BÜTÜN girdileri yuvarlar; aynı şeyi komponent komponent `&__input { borderRadius }` yazarak
1130
1160
  yapmak hem uzun sürer hem de yeni komponent eklendiğinde tutarsızlık üretir.
1131
1161
 
1162
+ **Koyu tema karesi için sayfada `theme-toggle` bulunması gerekmez.** Ziyaretçinin tema tercihi
1163
+ çerezde değil `localStorage`'da (`zeyrek-viewer-theme-mode`) yaşar ve tema store'u onu sayfa
1164
+ açılırken bir kez okur; `page_screenshot` `colorScheme: 'dark' | 'light'` parametresi tercihi
1165
+ sayfa script'lerinden ÖNCE eker. İki temayı da doğrulamak, tasarıma düğme eklemeden iki çağrıdır
1166
+ (aynı tool'un `language` parametresi ikinci dil için aynı işi yapar —
1167
+ `platform_guide('translation')`).
1168
+
1132
1169
  ### 1h-3 — Ölçülmüş hazır bloklar (anket ekranından, olduğu gibi kullanılabilir)
1133
1170
 
1134
1171
  ```jsonc
@@ -1543,6 +1580,19 @@ alanına dokunur. **Komponenti silip yeniden eklemeyin:** `remove_component` + `
1543
1580
  turu o komponente bağlı setter hedeflerini koparır (Kural 1e sonundaki not) ve komponentin tek
1544
1581
  referans verdiği akışları kalıcı olarak sildirir (Kural 2'deki yan etki notu).
1545
1582
 
1583
+ **Kurulu düğümün appearance'ını değiştirmek: `set_appearance`.** Aynı gerekçeyle appearance için
1584
+ de silip yeniden ekleme gerekmez:
1585
+
1586
+ ```jsonc
1587
+ { "op": "set_appearance", "target": "box_summary", "appearance": { "heightType": "auto", "tooltip": null } }
1588
+ ```
1589
+
1590
+ Op **birleştirir**: yalnız verilen alanları yazar, gerisini korur; `null` alanı temizler. Alan
1591
+ adları `page_schema_get`'in döndürdüğü appearance anahtarlarıdır; bilinmeyen alan
1592
+ `unknown-appearance-field`, tanınmayan enum değeri (`heightType: "tall"`) 400 ile reddedilir.
1593
+ **`isHidden` bir appearance alanı DEĞİLDİR** — gizlemek için `replace_prop { prop: 'isHidden' }`
1594
+ ya da `set_binding { prop: 'isHidden' }` (Kural 7a'daki `isHidden` notu).
1595
+
1546
1596
  **Kip ayrımı query parametresidir:** aynı sayfa `?id=<kayıt>` ile edit, parametresiz create.
1547
1597
 
1548
1598
  `mount` akışı (`page_container` ya da `form` üzerine bağlanır):
@@ -1655,10 +1705,12 @@ start → [setter] btn_save.isLoading = true
1655
1705
  > artık doğrudan `props.isHidden` yazılabilir; sırf gizlemek için `container`'a sarmak
1656
1706
  > GEREKMEZ. Tek doğru kaynak `component_get` + `page_schema_validate` kuru koşusudur.
1657
1707
  >
1658
- > **`appearance.isHidden` bir kaçış yolu DEĞİLDİR:** kaydedilir ama runtime hiçbir yerde okumaz
1659
- > (renderer yalnız `props.isHidden`'a bakar) — komponent görünmeye devam eder. Başlangıçta gizli
1660
- > göstermek için ya komponenti `isHidden`'ı OLAN bir `container`'a sar (Kural 1g) ya da
1661
- > görünürlüğü sayfa açılış akışının setter'ıyla kur.
1708
+ > **Appearance'ta `isHidden` alanı YOKTUR** (2026-09-15'te platformdan kaldırıldı, S-16): renderer
1709
+ > yalnız `props.isHidden`'a bakar. Başlangıçta gizli bildirim şemada
1710
+ > `"props": { "isHidden": { "type": "static", "data": true } }` ile kurulur, açılışı akıştaki
1711
+ > setter yapar. `add_component` / `page_update` gövdesine yine de `appearance.isHidden` konursa
1712
+ > gateway değeri `props.isHidden`'a taşır ve `gatewayNormalized`'da bildirir (prop zaten verilmişse
1713
+ > o kazanır); `set_appearance` ile `isHidden` yazmak istek gönderilmeden reddedilir.
1662
1714
 
1663
1715
  ### 7b — Liste → form geçişi
1664
1716
 
@@ -1848,6 +1900,18 @@ hiçbiri** bağlı değildi; üç portalın da rol menüsü boş çıkıyor, pan
1848
1900
  > hiç görünmeyen düğüm var; `zeroSized` çizilmemiş komponenti gösterir. Runtime düğümleri
1849
1901
  > `data-element-id` basmıyorsa yanıt `layoutReportUnavailable` der — tool tahmin üretmez.
1850
1902
  >
1903
+ > **Sürükle-bırakı gerçekten sınamak (G-09).** `kanban` ve `eventcalendar` iç öğelerine
1904
+ > `<elementId>__<rol>` kimliği yazar (tablonun `__row-<n>`'i ile aynı kalıp):
1905
+ > kart `kb_board__card-<id>`, kolon `kb_board__col-<value>`; etkinlik `cal_plan__event-<id>`,
1906
+ > gün `cal_plan__day-<yyyy-MM-dd>`, tüm gün hücresi `cal_plan__allday-<yyyy-MM-dd>`, saat dilimi
1907
+ > `cal_plan__slot-<yyyy-MM-dd>T<HH>`. `id`, `idField`'ın değeridir (yoksa `card-<sıra>` /
1908
+ > `event-<sıra>`); tarih yereldir. Tıklama yolu `click` ile, taşıma `drag` ile sınanır:
1909
+ > `actions: [{ action:'drag', target:'kb_board__card-42', to:'kb_board__col-Assigned' }]`.
1910
+ > `actionsReport[].flowRuns`/`requests` sıfırsa `cardMove`/`eventMove` bağı kurulu görünse de
1911
+ > taşıma kalıcılaşmamıştır. Kaynak `draggable` değilse (`isDraggable`/`isEditable` kapalı)
1912
+ > adım `applied:false` ve notla döner. Çok günlü etkinlik aynı kimliği her gün hücresinde taşır;
1913
+ > hedef ilk eşleşmedir.
1914
+ >
1851
1915
  > **Üye kimliğiyle doğrulama (`asUser`).** Kapının kapalı olduğunu görmek yarısıdır; açık
1852
1916
  > olduğunu görmek diğer yarısı. `page_runtime_get` ve `page_screenshot` aynı `asUser` alanını
1853
1917
  > alır: uygulamanın kendi giriş ucundan (`microservice_execute`) aldığın üye jetonunu verirsin,
@@ -1935,10 +1999,22 @@ micro-op hattına dönün.
1935
1999
  >
1936
2000
  > **Gateway artık bunu söylüyor (FLOW-018).** `remove_component` içeren bir yamada gateway sayfanın
1937
2001
  > akışlarını okur ve silinen düğümü hedefleyen setter adımlarını uyarı olarak listeler: hangi akış,
1938
- > hangi adım, hangi hedef. Uyarıyı gördüğünde yapılacak tek şey `flow_update` ile aynı gövdeyi
1939
- > yeniden kaydetmektir. Ters yönü (`silinen düğümün referans verdiği` akışların platformca kalıcı
2002
+ > hangi adım, hangi hedef. Ters yönü (`silinen düğümün referans verdiği` akışların platformca kalıcı
1940
2003
  > silinmesi) ayrı bir uyarı kapsar; ikisi birlikte çıkabilir. Ölçüm 2026-09-04 (benchmark 4. koşu):
1941
2004
  > uyarı yokken aynı tuzak ~8 dakika teşhis aldı ve yalnız ekran görüntüsüyle görüldü.
2005
+ >
2006
+ > **Mekanizma ve onarım (2026-09-15, G-04).** Setter iteratee'si hedefini elementId olarak DEĞİL,
2007
+ > komponentin iç kimliği olarak saklar (`step_iterates.DesignComponentId`, FK `SetNull`); düğüm
2008
+ > yeni kimlikle yazılınca eski satır silinir ve alan boşalır — `flow_get` iteratee'yi `element`'siz
2009
+ > döndürür. Bu yüzden **`flow_get`'ten okunan gövdeyi aynen yeniden kaydetmek onarmaz** (element
2010
+ > zaten yok; `flow_update` FLOW-017'ye takılır). İki güvence var: (1) backend artık AYNI yamada
2011
+ > silinip aynı `elementId` ile eklenen düğüme (alt ağaç dahil) eski kimliğini geri veriyor, bağ
2012
+ > kopmuyor; (2) gateway yamadan sonra akışları yeniden okur ve kopan her iteratee için yanıtta
2013
+ > `flowTargetsLost` ile hazır onarımı verir:
2014
+ > `flow_patch` `{ op: 'add', path: '/steps[stepId=s4]/args/iteratees/0/element', value: 'f_range' }`.
2015
+ > `flow_get` de hedefsiz setter iteratee'sini `flowWarnings` (`FLOW-017 (okuma)`) ile gösterir.
2016
+ > Ayrı isteklerle (önce sil, sonra ekle) yapılan yeniden kurulum ve komple şema yazan `page_update`
2017
+ > bu korumanın DIŞINDADIR — prop tipini değiştirmek için düğümü hiç yeniden kurmayın.
1942
2018
 
1943
2019
  ## Bilinen sınırlar
1944
2020
 
@@ -2013,8 +2089,11 @@ micro-op hattına dönün.
2013
2089
  (süssüz) ekrana ifadenin **kendisini** basar; ifade yalnız `data`'da olursa prop **boş**
2014
2090
  render edilir. `set_binding` micro-op'u eski sürümlerde `data`'ya yazıyordu — bu davranış
2015
2091
  düzeltildi, ama daha önce kurulmuş sayfalarda kalıntı olabilir. Prop nesnesini birebir
2016
- kontrol etmen gerekirse `remove_component` + `add_component` ile
2017
- `{"type":"code","ref":"{{ … }}","data":"<yedek>"}` yaz; `replace_prop` her zaman `static` kurar.
2092
+ kontrol etmen gerekirse `replace_prop` ile
2093
+ `value: {"type":"code","ref":"{{ … }}"}` yaz — code tipi ve `ref` olduğu gibi kaydedilir
2094
+ (platform code prop'unda `data`'yı saklamaz).
2095
+ `replace_prop`'a `expression` alanı verme: platform onu yalnız `set_binding`'de okur (gateway
2096
+ code sarmalına çevirir).
2018
2097
 
2019
2098
  - **Ana sayfa sayfadan değil application'dan değişir:** `page_create/update` gövdesindeki
2020
2099
  `isHomepage` platformca yok sayılır (tasarım). Doğru yol `application_update` →
@@ -81,22 +81,23 @@ backend'de zaten tanımlı, Studio'nun "Translate" aksiyonunun ürettiği şekil
81
81
  "value": { "type": "translation", "ref": "home.welcome", "data": "Hoş geldiniz" } }
82
82
  ```
83
83
 
84
- > **`replace_prop` ile kurulamaz, `set_prop_type` ile kurulur.** Micro-op applier her `value`'yu
85
- > `Static` (ifade verilmişse `Code`) Prop'a çevirir (`PageSchemaMicroOpApplier.cs:77`);
86
- > `translation` sarmalı gönderildiğinde sarmal `Data`'nın içine düşer ve prop sessizce bozulur.
87
- > Gateway `replace_prop`'un bu kullanımını **reddeder**. Kurulu bir prop'u çeviriye bağlamanın
88
- > yolu `set_prop_type`'tır:
84
+ > **Yukarıdaki `replace_prop` sarmalı olduğu gibi çalışır (2026-09-15, G-04).** Micro-op applier
85
+ > `{type, ref, data}` sözlüğünün tipini korur ve `Translation` Prop'unu `Ref` + metin `Data` ile
86
+ > kurar (`PageSchemaMicroOpApplier.ApplyOne`). Gateway bu kullanımı eskiden reddedip komponenti
87
+ > yeniden eklemeyi öneriyordu; o öneri uygulanınca düğüme yazan setter iteratee'lerinin `element`'i
88
+ > silindi (bir panoda alt başlık ve tarih aralığı boş kaldı). Ref'siz translation sarmalı istek
89
+ > gönderilmeden reddedilir; nesne `data` silinir. Eş yol `set_prop_type`'tır — mevcut `data`'yı
90
+ > tasarım yedeği olarak taşır ve layout ağacında (micro-op hattı yok) tek yoldur:
89
91
  >
90
92
  > ```jsonc
91
93
  > { "op": "set_prop_type", "target": "welcome_text", "prop": "text",
92
94
  > "propType": "translation", "ref": "home.welcome" }
93
95
  > ```
94
96
  >
95
- > Gateway şemayı okur, prop'un TİPİNİ yerinde değiştirir ve sayfayı tam gövdeyle geri yazar —
96
- > düğümün olay/setter bağları korunur. Eski yol (`remove_component` + `add_component`) düğümü
97
- > yeniden kurduğu için ona yazan setter iteratee'lerini sessizce öldürüyordu; artık gerekmiyor.
98
- > Taşıyıcı alan tipe göre değişir: `static` → `data`, `code` ve `translation` → `ref`. Eksik
99
- > taşıyıcı istek platforma gitmeden reddedilir ve `page_schema_validate` aynı kararı verir.
97
+ > İkisi de düğümün olay/setter bağlarını korur. **Prop tipini değiştirmek için
98
+ > `remove_component` + `add_component` yapmayın.** Taşıyıcı alan tipe göre değişir: `static` →
99
+ > `data`, `code` ve `translation` → `ref`. Eksik taşıyıcı istek platforma gitmeden reddedilir ve
100
+ > `page_schema_validate` aynı kararı verir.
100
101
  >
101
102
  > Ölçüldü 2026-09-08 (yerel `dil-dogrulama/dil-app`): kurulu bir `statcard`'ın `title` prop'u tek
102
103
  > `set_prop_type` op'uyla `f11.tam` anahtarına bağlandı; gerçek ekranda `tr` → "iki dilde dolu",
@@ -123,6 +124,30 @@ Son kullanıcı dili `language-selector` komponentiyle değiştirir (`platform_g
123
124
  prop'lar sayfa yenilenmeden yeniden çözülür — ayrı bir akış kurmana gerek yok, komponenti sayfaya
124
125
  eklemen yeterli. Projede dil tanımlı değilse (`languages` boşsa) liste boş çizilir.
125
126
 
127
+ ## Kareyi ikinci dilde almak: `page_screenshot(language:)`
128
+
129
+ Dil değiştirici **kanıt için gerekli değildir.** Runtime boot dilini şu sırayla seçer:
130
+ `?lang=<kod>` → tarayıcıda kayıtlı seçim → tarayıcı dilleri → projenin varsayılanı
131
+ (`resolveRuntimeLanguage`). `page_screenshot` `language` parametresi adrese o sorgu değerini
132
+ ekler; seçim hem çeviriye bağlı prop'ları hem **çok dilli alanların satır değerlerini** kapsar,
133
+ çünkü aynı değer veri diline de geçirilir.
134
+
135
+ ```jsonc
136
+ { "applicationSlug": "app", "pageSlug": "dashboard", "language": "en" }
137
+ { "applicationSlug": "app", "pageSlug": "dashboard", "language": "tr" } // aynı sayfa, ikinci dil
138
+ ```
139
+
140
+ Bunun pratik sonucu: **referans tasarımına dil değiştirici eklemek zorunda değilsin.** Görsel
141
+ repro'su olan bir ekranı bozmadan iki dilin karesini alabilirsin; `language-selector` yalnız son
142
+ kullanıcı gerçekten dil değiştirecekse gerekir.
143
+
144
+ - Kod projenin `languages` listesinde değilse çağrı **reddedilir**. Runtime tanımadığı kodu yok
145
+ sayıp kareyi varsayılan dilde çizerdi ve "çevrildi" sanılan yanlış bir kare rapora girerdi.
146
+ - Bölgeli kod (`tr-TR`) indirgenir ve indirgeme yanıtta `languageNote` ile bildirilir.
147
+ - Aynı tool'un `colorScheme` parametresi ziyaretçinin tema tercihini sayfa açılmadan eker
148
+ (`localStorage`'daki `zeyrek-viewer-theme-mode`), yani koyu tema karesi için sayfada
149
+ `theme-toggle` bulunması da gerekmez.
150
+
126
151
  ## İstek dili: nereden gelir, hangi ifadede ne denir
127
152
 
128
153
  Her istekte dil şu sırayla çözülür: **`X-Data-Language` başlığı → `Accept-Language` → projenin
@@ -375,6 +375,22 @@ Tek uçta "başlık + N alt kayıt" yazmanın yolu budur (anket + sorular + seç
375
375
  başka alana ihtiyacı varsa bunları **`returnFields`** ile iste
376
376
  (`{ alias, fieldId, fieldSlug }` öğeleriyle) — `selectFields` write operasyonunda sessizce
377
377
  yok sayılır.
378
+ - **Bulk yazma (`bulk-create`/`bulk-update`/`bulk-delete`) table step'te de vardır**, ama tek
379
+ satırlık `create`/`update`'in aksine satır dizisi `fields`'tan değil, adımın **`expression`**
380
+ alanının (JS) sonucundan gelir: `rule.expression` bir **dizi** döndürmeli, dizideki her
381
+ nesnenin anahtarı alan **slug**'ıdır (fieldId değil). `bulk-delete`'te dizi ya birincil anahtar
382
+ değerlerinin düz listesi (`{ value: [...] }` şeklinde tek elemanlı sarmalayıcı) ya da her öğesi
383
+ `{ <pk slug>: <değer> }` olan nesne dizisidir. Tek istekte en fazla 1000 satır
384
+ (`EntityConstants.BulkRowLimit`); aşarsa `BulkRowLimitException`. `fields`'ta tanımlı ve
385
+ **değeri dolu** bir sabit varsa her satıra uygulanır; boş bırakılan alanlar `expression`
386
+ sonucundaki satırı ezmez.
387
+ - **Dosya (ve çoka-çok dosya) alanı `bulk-create`/`bulk-update`'te desteklenir** — microservice
388
+ tarafındaki `bulk-create`/`bulk-update` ile **aynı format**
389
+ (`{ type, fileName, value, clone, override, id }`); her satırın dosya değeri ayrı ayrı
390
+ `fileService`'e yüklenir, dosya alanı olan tabloda bulk artık reddedilmez.
391
+ - **Studio'nun workflow table formunda bulk için `expression` editörü henüz yoktur** — akışı
392
+ UI'dan kurarken bulk operasyonu seçilemez; `rule.expression`'ı JSON/`workflow_patch` ile elle
393
+ yazmak gerekir, yoksa adım `MissingParameterException` ile düşer.
378
394
  - **Çıktının ŞEKLİ `isSingle`'a bağlıdır** (ölçüm: 09-04 koşusu Y-15). `isSingle: true` ise
379
395
  `<step>.data` nesnedir ve `<step>.data.id` çalışır; **`isSingle: false` ise `data` bir
380
396
  DİZİDİR** — `<step>.data.id` `undefined` olur, akış `RowValidationFailed` ile düşer ve hata
@@ -395,6 +411,38 @@ Tek uçta "başlık + N alt kayıt" yazmanın yolu budur (anket + sorular + seç
395
411
  > **Gateway table step'lerinde `path`/`sort`/`limit` eksiklerini otomatik dolduruyor**
396
412
  > (yanıtta `gatewayNormalized`). Dolu değerlere dokunmaz; yanlış path yine WF/MS block'una takılır.
397
413
 
414
+ ## Table update adımı: yazılan alan kümesi ADIMDAN gelir
415
+
416
+ `operation: 'update'` (aynısı `create`/`upsert`) adımında SET listesi `rule.fields[]`'tir.
417
+ `PrepareParameters` listedeki **her** alanın ifadesini değerlendirir (`TableStep.cs:508-530`),
418
+ `undefined` dönen sonucu `Parse` `null`a çevirir (`CommonFieldType.cs:59`) ve satır sözlüğü
419
+ süzgeçsiz kurulur (`TableStep.ByUpdateAsync`, `:254-262`). İki sonucu vardır:
420
+
421
+ - Gövdede o anahtar yoksa `input.x` **`undefined`**'dır ve kolona **NULL yazılır** — eski değer
422
+ silinir, yanıt yine 200'dür.
423
+ - Adımda listelenmeyen alan hiçbir gövdeyle **değiştirilemez**.
424
+
425
+ Ölçüm (2026-09-15): `fields: [title, owner, status]` olan bir update adımına `{ id, status }`
426
+ gövdesi gitti; uç 200 döndü, `status` değişti, `title` ve `owner` **NULL** oldu. Microservice
427
+ `update` ucuyla birebir aynı davranış; tam tablo ve kısmi güncellemenin üç doğru yolu
428
+ `platform_guide('microservice')` §"Güncelleme sözleşmesi"nde.
429
+
430
+ Gateway bunun tanımdan görülebilen hâlini **WF-031 (warn)** ile keser: yazma adımı akışın giriş
431
+ DTO'sunda OLMAYAN bir `input.x` alanını bağlıyorsa o ifade kesinlikle `undefined` döner ve kural
432
+ eksik alanları adıyla sayar. Uyarıyı susturmanın doğru yolu adımı **eylem başına daraltmaktır**
433
+ (`fields[]` yalnız o eylemin yazdığı alanlar); alanı DTO'ya eklemek yalnız izin verir, çağıranın
434
+ her istekte göndereceğini garanti etmez.
435
+
436
+ Akışta kısmi güncelleme gerekiyorsa **oku-birleştir**: önce `table get`, sonra `table update`,
437
+ gelmeyen alan okunan değere düşsün —
438
+
439
+ ```js
440
+ typeof input.title !== 'undefined' && input.title !== null ? input.title : read_row.data.title
441
+ ```
442
+
443
+ (ölçüldü: `{ id, status }` gövdesiyle `title`/`owner` korundu). Bedeli fazladan bir okuma turu ve
444
+ **son yazan kazanır**; eylem başına ayrı uç kurmak hâlâ daha ucuz ve daha güvenlidir.
445
+
398
446
  ## Response step'i gövdeyi `bodyExpression`'dan üretir
399
447
 
400
448
  `rule: { dataTransferObjectId }` **hiçbir şey döndürmez** (`result: null`). Çalışan şekil:
@@ -537,7 +585,7 @@ yolunu değiştirir: kapalı yolu deneyip raporuna "kanıtlayamadım" yazma, kan
537
585
  - Join'li table step'inde kök `rule.alias` boş (WF-019, block — Postgres 42601'in sebebi)
538
586
  - Akışta hiç okunmayan `selectFields` alanı (WF-023, warn — gereksiz taşınan sütun)
539
587
  - Adımda ya da akışta `description` yok (WF-024, block — Studio'da adım okunamaz kalır)
540
- - İlişki alanının içini okuyan ifade (WF-020, warn — join yoksa alan düz FK'dır)
588
+ - İlişki alanının içini okuyan ifade (WF-020, warn — join yoksa alan düz FK'dır); `Functions.<ad>()` çağrısı SUNUCUDA GEÇERSİZDİR (`WF-030` block, 2026-09-10) — `function_create source:'workflow'` ile tanımla, çıplak adla çağır
541
589
  - `set-user` adımı olmadan `user` okuyan middleware (MW-003, warn)
542
590
  - Backend zorunlulukları (WF-026, block — istek gitmeden): `name`/`slug`; `returnDtoId` varsa
543
591
  `returnBehavior`, `parameterDtoId` varsa `parameterBehavior` (`primitive` | `object` | `array`),
@@ -615,7 +663,8 @@ Kaydedilen sözleşme üç tüketim yolunda da aynı şekilde bağlanır:
615
663
  |---|---|
616
664
  | `queryStepSourceType: 'library'` (workflow query adımı) | Adımın ifadeleri: `rule.expression` (nesne literali) ya da `rule.queryParameters[]` — ikisi de **JavaScript ifadesidir**; istek girdisini (`input.year`), önceki adım çıktısını **ve bağlı middleware'in `user.*` değişkenini** okur |
617
665
  | Query kaynaklı microservice (`source: 'query'`) | Yalnız çağrının kendisi: **body → query-string → header** (`MicroserviceExecuteParameter.FindValue`); ifade YOKTUR, `user.*` bu yola girmez |
618
- | `query_preview` | `parameters` alanı — davranış yukarıdaki ikisiyle aynıdır |
666
+ | `query_preview` | Komutun `definition.parameters[].value` alanı; tool'un üst düzey `parameters` argümanı (ad → değer) gateway'de oraya bağlanır. Değer almayan parametre yanıtta `unboundParameters` ile listelenir |
667
+ | `microservice_execute` / `microservice_debug` | Üst düzey `parameters` (ad → değer): gateway GET/DELETE'te query-string'e, POST/PUT'ta gövdeye koyar — yukarıdaki query kaynaklı uç satırının okuduğu yer. `microservice_debug` NULL bağlanan parametreyi `unboundParameters` ile adıyla verir |
619
668
 
620
669
  > **Boş string parametre `NULL`'a çevrilir.** `Query.NormalizePreviewParameters` değeri normalize
621
670
  > ederken boş ya da yalnız boşluktan oluşan değeri `null` yapar. `WHERE status = {{durum}}` yazıp
@@ -1,8 +1,8 @@
1
1
  {
2
- "hash": "0e6bb2b45f8c545b50dc6d6169e7d816d9cb9532ecbaed894307995d537ff3b6",
3
- "generatedAt": "2026-09-09T09:49:52.511Z",
4
- "types": 103,
5
- "files": 73,
2
+ "hash": "cafe3a6b082c7828cece4eaa1c0115ba28581f157eac3288abcf068c7f6f8533",
3
+ "generatedAt": "2026-09-15T10:24:42.398Z",
4
+ "types": 185,
5
+ "files": 107,
6
6
  "note": "Şemaları üreten backend kaynaklarının parmak izi. Elle düzenlemeyin: 'npm run generate-schemas' yazar, 'npm run schema:check' denetler.",
7
7
  "missing": []
8
8
  }
@@ -0,0 +1,51 @@
1
+ {
2
+ "schema": {
3
+ "required": [
4
+ "fileId"
5
+ ],
6
+ "type": "object",
7
+ "properties": {
8
+ "datasourceId": {
9
+ "type": "string",
10
+ "format": "uuid"
11
+ },
12
+ "fileId": {
13
+ "minLength": 1,
14
+ "type": "string",
15
+ "format": "uuid"
16
+ },
17
+ "locale": {
18
+ "type": "string",
19
+ "nullable": true
20
+ },
21
+ "headerRow": {
22
+ "minimum": 0,
23
+ "type": "integer",
24
+ "format": "int32",
25
+ "nullable": true
26
+ },
27
+ "csv": {
28
+ "$ref": "#/components/schemas/NgApps.Application.Contexts.Datastore.Imports.ImportCsvOptionsDto"
29
+ }
30
+ },
31
+ "additionalProperties": false
32
+ },
33
+ "components": {
34
+ "schemas": {
35
+ "NgApps.Application.Contexts.Datastore.Imports.ImportCsvOptionsDto": {
36
+ "type": "object",
37
+ "properties": {
38
+ "delimiter": {
39
+ "type": "string",
40
+ "nullable": true
41
+ },
42
+ "encoding": {
43
+ "type": "string",
44
+ "nullable": true
45
+ }
46
+ },
47
+ "additionalProperties": false
48
+ }
49
+ }
50
+ }
51
+ }
@@ -0,0 +1,19 @@
1
+ {
2
+ "schema": {
3
+ "type": "object",
4
+ "properties": {
5
+ "projectId": {
6
+ "type": "string",
7
+ "format": "uuid"
8
+ },
9
+ "planId": {
10
+ "type": "string",
11
+ "format": "uuid"
12
+ }
13
+ },
14
+ "additionalProperties": false
15
+ },
16
+ "components": {
17
+ "schemas": {}
18
+ }
19
+ }
@@ -23,6 +23,9 @@
23
23
  "nullable": true
24
24
  },
25
25
  "nullable": true
26
+ },
27
+ "relationsByName": {
28
+ "type": "boolean"
26
29
  }
27
30
  },
28
31
  "additionalProperties": false
@@ -0,0 +1,31 @@
1
+ {
2
+ "schema": {
3
+ "required": [
4
+ "name"
5
+ ],
6
+ "type": "object",
7
+ "properties": {
8
+ "projectId": {
9
+ "type": "string",
10
+ "format": "uuid"
11
+ },
12
+ "name": {
13
+ "minLength": 1,
14
+ "pattern": "\\A(?=.{3,31}\\z)[a-z][a-z0-9_-]*(/[a-z0-9][a-z0-9_-]*)*\\z",
15
+ "type": "string"
16
+ },
17
+ "parentEnvironmentId": {
18
+ "type": "string",
19
+ "format": "uuid",
20
+ "nullable": true
21
+ },
22
+ "includeRecords": {
23
+ "type": "boolean"
24
+ }
25
+ },
26
+ "additionalProperties": false
27
+ },
28
+ "components": {
29
+ "schemas": {}
30
+ }
31
+ }
@@ -0,0 +1,95 @@
1
+ {
2
+ "schema": {
3
+ "required": [
4
+ "body",
5
+ "name",
6
+ "source"
7
+ ],
8
+ "type": "object",
9
+ "properties": {
10
+ "source": {
11
+ "$ref": "#/components/schemas/NgApps.Domain.Contexts.Studio.GlobalFunctions.GlobalFunctionSource"
12
+ },
13
+ "applicationId": {
14
+ "type": "string",
15
+ "format": "uuid",
16
+ "nullable": true
17
+ },
18
+ "pageId": {
19
+ "type": "string",
20
+ "format": "uuid",
21
+ "nullable": true
22
+ },
23
+ "scope": {
24
+ "$ref": "#/components/schemas/NgApps.Domain.Contexts.Studio.GlobalFunctions.GlobalFunctionScope"
25
+ },
26
+ "name": {
27
+ "minLength": 1,
28
+ "type": "string"
29
+ },
30
+ "description": {
31
+ "type": "string",
32
+ "nullable": true
33
+ },
34
+ "isAsync": {
35
+ "type": "boolean"
36
+ },
37
+ "parameters": {
38
+ "type": "array",
39
+ "items": {
40
+ "$ref": "#/components/schemas/NgApps.Application.Contexts.Studio.GlobalFunctions.GlobalFunctionParameterDto"
41
+ },
42
+ "nullable": true
43
+ },
44
+ "body": {
45
+ "minLength": 1,
46
+ "type": "string"
47
+ }
48
+ },
49
+ "additionalProperties": false
50
+ },
51
+ "components": {
52
+ "schemas": {
53
+ "NgApps.Domain.Contexts.Studio.GlobalFunctions.GlobalFunctionSource": {
54
+ "enum": [
55
+ "workflow",
56
+ "studio"
57
+ ],
58
+ "type": "string",
59
+ "format": ""
60
+ },
61
+ "NgApps.Domain.Contexts.Studio.GlobalFunctions.GlobalFunctionScope": {
62
+ "enum": [
63
+ "application",
64
+ "page"
65
+ ],
66
+ "type": "string",
67
+ "format": ""
68
+ },
69
+ "NgApps.Application.Contexts.Studio.GlobalFunctions.GlobalFunctionParameterDto": {
70
+ "type": "object",
71
+ "properties": {
72
+ "name": {
73
+ "type": "string",
74
+ "nullable": true
75
+ },
76
+ "type": {
77
+ "type": "string",
78
+ "nullable": true
79
+ },
80
+ "required": {
81
+ "type": "boolean"
82
+ },
83
+ "defaultValue": {
84
+ "nullable": true
85
+ },
86
+ "description": {
87
+ "type": "string",
88
+ "nullable": true
89
+ }
90
+ },
91
+ "additionalProperties": false
92
+ }
93
+ }
94
+ }
95
+ }