@appaflytech/zeyrek-ai-mcp 0.0.12 → 0.0.13
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.
- package/dist/knowledge/normalize.js +43 -0
- package/dist/knowledge/outlines.js +16 -3
- package/dist/knowledge/rules.js +70 -2
- package/dist/resources/examples/function-total.json +6 -1
- package/dist/resources/examples/workflow-call-workflow.json +115 -0
- package/dist/resources/examples/workflow-http-step.json +84 -0
- package/dist/resources/examples/workflow-loop-step.json +132 -0
- package/dist/resources/guides/entity.md +40 -3
- package/dist/resources/guides/getting-started.md +4 -0
- package/dist/resources/guides/microservice.md +40 -0
- package/dist/resources/guides/modify-existing.md +13 -2
- package/dist/resources/guides/workflow.md +53 -3
- package/dist/resources/schema-fingerprint.json +7 -5
- package/dist/resources/schemas/MicroserviceDto.json +972 -0
- package/dist/tools/access.js +1 -1
- package/dist/tools/entities.js +1 -1
- package/dist/tools/functions.js +1 -1
- package/dist/tools/microservices.js +8 -4
- package/dist/tools/platformInfo.js +1 -1
- package/dist/tools/workflows.js +1 -1
- package/package.json +1 -1
|
@@ -56,6 +56,10 @@ Bağımlılıklar bu sırayı zorunlu kılar; atlama:
|
|
|
56
56
|
ifadelerde Functions.<ad>(…) ile, akışlar 'function' adımıyla çağırır;
|
|
57
57
|
sayfaya özgü fonksiyon (scope:'page') sayfa açıldıktan sonra gelir.
|
|
58
58
|
Kurallar platform_guide('functions'))
|
|
59
|
+
function_update (GÖVDE DEĞİŞİNCE: function_update { id, body } — patch aracı YOKTUR,
|
|
60
|
+
fonksiyonun tek büyük alanı gövdedir ve gateway vermediğin alanları
|
|
61
|
+
mevcut kayıttan doldurur. Adı değiştirirsen platform çağıranları AYNI
|
|
62
|
+
işlemde yeni ada taşır (renamedReferences))
|
|
59
63
|
11. layout_create (header/sidebar + MUTLAKA bir 'slot' — slot'suz layout'a bağlı sayfa
|
|
60
64
|
boş görünür; bkz. platform_guide('page') Kural 5)
|
|
61
65
|
12. page_create + … (İŞ BURADA BİTMEZ: her kaydın yönetim ekranı, kimlik varsa giriş
|
|
@@ -620,6 +620,45 @@ gerekmese bile** ona bir middleware bağla. Tek `variable` adımlı, hiçbir şe
|
|
|
620
620
|
Zayıf alternatif: bütün doğrulamaları ilk yazmadan **önce** bitirip yazma bölümünde hiç
|
|
621
621
|
`response`/hata üretmemek — beklenmedik istisnaya karşı korumasızdır.
|
|
622
622
|
|
|
623
|
+
## Patch belgesi OKUMA şeklidir — rol listesi `/roles` yolundadır (MS-022)
|
|
624
|
+
|
|
625
|
+
`microservice_patch` yamayı **`microservice_get`'in döndürdüğü gövdeye** uygular; platform da onu
|
|
626
|
+
kendi tarafında `MicroserviceDto` olarak okuyup `UpdateMicroserviceCommand`'a çevirir
|
|
627
|
+
(`PatchMicroserviceCommand.cs:36-55`). Yani yamalanan belge **yazma komutu değildir** ve iki
|
|
628
|
+
belgenin alan adları her yerde aynı değildir:
|
|
629
|
+
|
|
630
|
+
| Ne | Create/update GÖVDESİ | Patch YOLU (okuma şekli) |
|
|
631
|
+
|---|---|---|
|
|
632
|
+
| Rol listesi | `roleIds: [<guid>]` | **`/roles`** → `[{ id, name }]` |
|
|
633
|
+
| Middleware listesi | `middlewareIds: [<guid>]` | `/middlewareIds` (aynı) |
|
|
634
|
+
| Alan listesi | `sourceParameters.selectFields` | `/sourceParameters/selectFields` (aynı) |
|
|
635
|
+
|
|
636
|
+
**Ucun rolünü değiştirmek için tanımı yeniden göndermek gerekmez** — tek op yeter:
|
|
637
|
+
|
|
638
|
+
```jsonc
|
|
639
|
+
// tüm listeyi yaz (tercih edilen): name isteğe bağlıdır, platform yalnız id okur
|
|
640
|
+
{ "op": "replace", "path": "/roles", "value": [{ "id": "<role_list id>" }] }
|
|
641
|
+
|
|
642
|
+
// listeye ekle
|
|
643
|
+
{ "op": "add", "path": "/roles/-", "value": { "id": "<role_list id>" } }
|
|
644
|
+
|
|
645
|
+
// tek rolü çıkar
|
|
646
|
+
{ "op": "remove", "path": "/roles[id=<role_list id>]" }
|
|
647
|
+
```
|
|
648
|
+
|
|
649
|
+
- **`roleIds` yolu patch belgesinde YOKTUR.** Verirsen gateway `/roles`'a çevirir, çıplak guid'leri
|
|
650
|
+
`{ id }` nesnesine sarar ve çeviriyi `gatewayNormalized` ile söyler — istek düşmez. Çevrilmeseydi
|
|
651
|
+
`replace /roleIds` gateway'de `OPERATION_PATH_UNRESOLVABLE` verirdi, `add /roleIds` ise platformda
|
|
652
|
+
**sessizce yutulurdu** (bilinmeyen üye atılır, 200 döner, rol değişmez).
|
|
653
|
+
- **Tam dizi `replace`'i tercih et.** Rolü olmayan uçta alan `null` serileşebilir ve `/roles/-`
|
|
654
|
+
çözülemez; gateway bunu tek öğelik tam diziye katlar ve notu yanıta yazar.
|
|
655
|
+
- Rol id'leri `role_list`ten gelir. `role_list` **slug döndürmez** ve iki anahtar farklıdır:
|
|
656
|
+
buradaki `id` ile yetkilendirmenin karşılaştırdığı `slug` aynı şey değildir
|
|
657
|
+
(`platform_guide('entity')` §"Hazır entity'ler").
|
|
658
|
+
- Yazmanın kanıtı yanıttadır: outline `roleIds` taşır, ikinci bir `microservice_get` gerekmez.
|
|
659
|
+
- **Rol tek başına kapı değildir** — §"Uçlar varsayılan olarak ANONİMDİR": koruma `middlewareIds`
|
|
660
|
+
ile gelir.
|
|
661
|
+
|
|
623
662
|
## Uçlar varsayılan olarak ANONİMDİR
|
|
624
663
|
|
|
625
664
|
Çalıştırma rotası `[AllowAnonymous]`'tur (`MicroservicesController.cs:90`): `middlewareIds` boş
|
|
@@ -629,6 +668,7 @@ Anonim veri toplama (anket, başvuru, geri bildirim) bu sayede kurulabilir — a
|
|
|
629
668
|
|
|
630
669
|
`roles` bir kapı değildir: `roleIds` dolu + `middlewareIds` boş bir uç tokensız POST'u 200 ile
|
|
631
670
|
kabul etti. Ayrıntı ve doğru rol kapısı tarifi: `platform_guide('middleware')` Tarif 3b.
|
|
671
|
+
Rol listesini **değiştirmek** için yukarıdaki §"Patch belgesi OKUMA şeklidir".
|
|
632
672
|
|
|
633
673
|
> **Anonimlik/erişim testi `microservice_execute` + `anonymous: true` ile yapılır.** Bayrak
|
|
634
674
|
> verildiğinde gateway isteğe HİÇBİR `Authorization` header'ı koymaz (varsayılan davranışta
|
|
@@ -12,6 +12,10 @@ Gerçek projelerde tek tanım 20-100 bin satır JSON olabilir. **Tam gövdeyi ba
|
|
|
12
12
|
belleğinde çeker, patch'i uygular, politika
|
|
13
13
|
kontrolünden geçirir, geri yazar
|
|
14
14
|
5. *_get view:'outline' → değişikliği teyit et
|
|
15
|
+
|
|
16
|
+
function_update {id, body} → FONKSİYONDA *_patch YOKTUR: tek büyük alan
|
|
17
|
+
gövdedir, yalnız onu gönder (gateway kalan
|
|
18
|
+
alanları mevcut kayıttan doldurur)
|
|
15
19
|
```
|
|
16
20
|
|
|
17
21
|
`view:'full'` **son çaredir** — yalnız küçük kayıtlarda ya da patch'in kurulamadığı köklü
|
|
@@ -23,12 +27,19 @@ yeniden yazımlarda.
|
|
|
23
27
|
ekleme), `/fields/5/nullable`.
|
|
24
28
|
- Dizin indekslerini tahmin etme — `view:'outline'` çıktısındaki sıradan ya da
|
|
25
29
|
`view:'part'` ile doğrulayarak yaz.
|
|
30
|
+
- **Bir listeye tek öğe eklemek listeyi yeniden göndermek değildir:** `add` + `/-`
|
|
31
|
+
(`/fields[slug=status]/valueOptions/-`, `/sourceParameters/selectFields/-`); tek öğeyi silmek
|
|
32
|
+
ya da değiştirmek için seçici (`[value=…]`, `[slug=…]`). Enum örnekleri:
|
|
33
|
+
`platform_guide('entity')` §"Tek bir enum değerini ekle / sil / yeniden adlandır".
|
|
26
34
|
- Silme yerine `replace` tercih et; `remove` kullanacaksan önce o path'i `part` ile görüntüle.
|
|
27
35
|
- Yanıttaki outline özeti değişikliğin uygulandığı hâli gösterir — teyit için oku.
|
|
28
36
|
- **Kullanıcı fonksiyonunda patch aracı yok:** `function_update` tam gövde yazar ama vermediğin
|
|
29
37
|
alanları mevcut kayıttan doldurur — yalnız `body` göndermen yeter (fonksiyonun tek büyük alanı
|
|
30
|
-
gövdedir).
|
|
31
|
-
|
|
38
|
+
gövdedir). `function_get` çıktısı `function_update`'in şablonudur; örnek:
|
|
39
|
+
`ngapps://examples/function-total` `functionUpdateArgs`. Adı değiştirmeden önce
|
|
40
|
+
`dependency_graph` (`module:'ui-function'`) ile çağıranları bul: `{{ }}`/`code` ifadelerindeki
|
|
41
|
+
`Functions.<eskiAd>(` çağrıları metinseldir — platform onları aynı işlemde taşır, ayrıntı
|
|
42
|
+
`platform_guide('functions')` §Güncelleme ve silme.
|
|
32
43
|
|
|
33
44
|
## Değiştirmeden önce geçmişe bak
|
|
34
45
|
|
|
@@ -401,6 +401,41 @@ gidilir, hiçbiri tutmazsa `else` dalı yürür:
|
|
|
401
401
|
> `rule.isExpression` bayrağı bu iki alan için **okunmaz**.
|
|
402
402
|
|
|
403
403
|
|
|
404
|
+
## HTTP adımı: gövde ayrı alan değil, `payloadExpression` üç anahtarı birden taşır (WF-033)
|
|
405
|
+
|
|
406
|
+
Dört alan: `rule.urlExpression` · `httpMethod` · `contentType` · `payloadExpression`.
|
|
407
|
+
**Gövdenin kendi alanı yoktur** — `payloadExpression` tek bir ifadeyle `{ header, body,
|
|
408
|
+
queryString }` **üçünü birden** üretmek zorundadır; yürütücü üçüne de `dynamic` üye erişimiyle
|
|
409
|
+
bakar (`HttpStep.cs:32,42,59`).
|
|
410
|
+
|
|
411
|
+
```jsonc
|
|
412
|
+
"rule": {
|
|
413
|
+
"stepType": "http",
|
|
414
|
+
"urlExpression": "'https://api.example.com/orders'",
|
|
415
|
+
"httpMethod": "POST",
|
|
416
|
+
"contentType": "application/json",
|
|
417
|
+
"payloadExpression": "({ body: { orderId: input.orderId }, header: { Authorization: 'Bearer ' + system.token }, queryString: {} })"
|
|
418
|
+
}
|
|
419
|
+
```
|
|
420
|
+
|
|
421
|
+
| Tuzak | Ne olur |
|
|
422
|
+
|---|---|
|
|
423
|
+
| Bir anahtar eksik (`queryString` yok) | Adım **düşer**: `RuntimeBinderException` — ölçülen mesaj birebir `'System.Dynamic.ExpandoObject' does not contain a definition for 'queryString'`. Boş da olsa `{}` yazın |
|
|
424
|
+
| `urlExpression` tırnaksız | İfadedir, düz metin değil: `https://…` yazarsan JS onu değişken sanır ve adım `x is not defined` der |
|
|
425
|
+
| `contentType` boş | Gövde `body.ToString()` ile gider (`HttpStep.cs:63-85`); nesne gövdesi tip adına dönüşür. POST/PUT'ta açıkça yazın |
|
|
426
|
+
| Yanıt JSON değil | Gövde **sessizce** boş nesne olur (`:92`) — XML dönen uçtan veri de hata da alamazsınız |
|
|
427
|
+
| Adım adında boşluk | Çıktıya adım adıyla erişilir; ad geçerli JS tanımlayıcısı olmalı (`call_roles`, `Call Roles` değil) |
|
|
428
|
+
|
|
429
|
+
**Çıktıyı okurken şemaya değil ölçüme güvenin (2026-09-16).** `workflow_step_schema('http')`
|
|
430
|
+
`returnScheme`'i kök seviyede `{ httpStatusCode, data }` ilan eder, ama koşumda ifade bağlamındaki
|
|
431
|
+
adım `{ data, meta: { elapsedTime, httpStatusCode, totalCount }, error }` şeklindedir:
|
|
432
|
+
|
|
433
|
+
- gövde → **`<adım>.data`**
|
|
434
|
+
- durum kodu → **`<adım>.meta.httpStatusCode`**
|
|
435
|
+
- `<adım>.httpStatusCode` → **undefined** (şemanın vaat ettiği ad çalışmaz)
|
|
436
|
+
|
|
437
|
+
Tam örnek ve POST varyantı: `ngapps://examples/workflow-http-step`.
|
|
438
|
+
|
|
404
439
|
## Workflow adımı: başka bir akışı parametreyle çağırmak (WF-032)
|
|
405
440
|
|
|
406
441
|
Ortak mantığı (kayıt açma, bildirim, numaralandırma) **bir kez** `type:'workflow'` akışı olarak
|
|
@@ -458,6 +493,8 @@ yazıp diğer akışlardan çağırmanın yolu budur — 30 adımı kopyalamak d
|
|
|
458
493
|
- Aynı alt akışı birden çok adımdan çağırmak serbesttir; özyineleme runner'ın koşum sayacına
|
|
459
494
|
takılır (kural envanteri WF-028 — gateway kuralı değil, backend davranışı).
|
|
460
495
|
|
|
496
|
+
Tam örnek (çağıran + çağrılan akış, canlı ölçümle yazıldı): `ngapps://examples/workflow-call-workflow`.
|
|
497
|
+
|
|
461
498
|
## Loop step — dizinin her öğesi için bir adım koştur
|
|
462
499
|
|
|
463
500
|
Tek uçta "başlık + N alt kayıt" yazmanın yolu budur (anket + sorular + seçenekler tek çağrıda;
|
|
@@ -478,9 +515,19 @@ Tek uçta "başlık + N alt kayıt" yazmanın yolu budur (anket + sorular + seç
|
|
|
478
515
|
(`StepRuleDto StepRule`); `children` gönderirsen `rule.Children` boş kalır ve loop
|
|
479
516
|
**`NullReferenceException`** ile patlar — hata mesajı `arrayExpression`'ı işaret ettiği için
|
|
480
517
|
seni ifadeyi suçlamaya iter, oysa sorun anahtar adıdır.
|
|
481
|
-
- **Geçerli öğe `loopItem`'dır
|
|
482
|
-
`
|
|
483
|
-
|
|
518
|
+
- **Geçerli öğe `loopItem`'dır — ama YALNIZ loop'un kendi değerlendirdiği ifadelerde.** Çocuğun
|
|
519
|
+
`fields[].value` / `filters[].value` ifadelerinde `loopItem.<alan>` yazılır (ölçüldü 2026-09-16:
|
|
520
|
+
`table` çocuğunun filtresinde `loopItem.slug` → `'super-admin'`); `input` ve önceki adımlar
|
|
521
|
+
(`createSurvey.data.id`) da görünmeye devam eder.
|
|
522
|
+
- **`code` çocuğunda `loopItem` YOKTUR (ölçüm 2026-09-16).** `code` adımı kendi JS motorunu kurar
|
|
523
|
+
ve `LoopStep`'in `loopItem` ataması oraya ulaşmaz: adım **`Error: loopItem is not defined`** ile
|
|
524
|
+
düşer, o yinelemenin çıktısında `result` hiç oluşmaz. Motorda görünenler `input` · `system` ·
|
|
525
|
+
`file` · `crypto` · `convert` ve ifade fonksiyonlarıdır. **Her öğe için hesap yapman gerekiyorsa
|
|
526
|
+
hesabı `arrayExpression`'da önden yap** — orası JS'tir ve diziyi istediğin şekle sokabilirsin:
|
|
527
|
+
`(input.kalemler || []).map(k => ({ ...k, tutar: k.fiyat * k.adet }))`; çocuk sonra
|
|
528
|
+
`loopItem.tutar`'a bakar.
|
|
529
|
+
- **İndeks değişkeni yoktur.** Sıra numarası gerekiyorsa diziyi `arrayExpression`'da üret:
|
|
530
|
+
`input.kalemler.map((k, i) => ({ ...k, sira: i }))`.
|
|
484
531
|
- **Çıktı `[{ item, result }]` dizisidir.** `result` çocuk adımın çıktısıdır; `table create`
|
|
485
532
|
için `{ id }`. Sonraki adımda `loopQuestions.data` ile okunur — **yazılan kayıtların id'sini
|
|
486
533
|
girdideki öğeyle eşleştirmenin yolu budur.**
|
|
@@ -496,6 +543,9 @@ Tek uçta "başlık + N alt kayıt" yazmanın yolu budur (anket + sorular + seç
|
|
|
496
543
|
İstemci alt kayıtları **düz** gönderir ve satırları `key`/`qkey` ile eşler — iç içe dizi
|
|
497
544
|
göndermek gerekmez (iç içe loop denenmedi; `loopItem` iç loop'ta gölgeleneceği için önerilmez).
|
|
498
545
|
|
|
546
|
+
Tam örnek, ölçülen çıktı şekli ve `code` çocuğu tuzağının çıkış yolu:
|
|
547
|
+
`ngapps://examples/workflow-loop-step`.
|
|
548
|
+
|
|
499
549
|
> **Table step'te `create`/`update` satır değerleri `fields[]`'tedir ve JS İFADESİDİR.**
|
|
500
550
|
> `{ "fieldId": "<alan id>", "source": "expression", "value": "input.title", "order": 0 }` —
|
|
501
551
|
> `PrepareParameters` her `fields[].value`'yu `EvaluateExpression` ile koşturur
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
{
|
|
2
|
-
"hash": "
|
|
3
|
-
"generatedAt": "2026-09-
|
|
4
|
-
"types":
|
|
5
|
-
"files":
|
|
2
|
+
"hash": "05c7864d58e308973805f7becee1578ce9eddad196abcdf7eebb43b1e7677549",
|
|
3
|
+
"generatedAt": "2026-09-16T15:53:10.903Z",
|
|
4
|
+
"types": 186,
|
|
5
|
+
"files": 108,
|
|
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
|
-
"missing": [
|
|
7
|
+
"missing": [
|
|
8
|
+
"NgApps.Infrastructure.Models.IdNamePair`1[[System.Guid, System.Private.CoreLib, Version=10.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]]"
|
|
9
|
+
]
|
|
8
10
|
}
|