@appaflytech/zeyrek-ai-mcp 0.0.48 → 0.0.50

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 (70) hide show
  1. package/.env.example +5 -0
  2. package/dist/config.js +2 -0
  3. package/dist/knowledge/access.js +4 -3
  4. package/dist/knowledge/assistantRun.js +165 -0
  5. package/dist/knowledge/componentCatalog.js +31 -0
  6. package/dist/knowledge/componentEvents.js +4 -1
  7. package/dist/knowledge/mobileComponentCatalog.js +21 -3
  8. package/dist/knowledge/mobileComponentEvents.js +9 -0
  9. package/dist/knowledge/mobileStore.js +14 -0
  10. package/dist/knowledge/motionResolve.js +1 -1
  11. package/dist/knowledge/platform/lint.js +36 -3
  12. package/dist/knowledge/platform/mobileRules.js +6 -0
  13. package/dist/knowledge/styleResolve.js +7 -0
  14. package/dist/platform/capture/actions.js +67 -0
  15. package/dist/platform/capture/capture.js +26 -21
  16. package/dist/platform/errors.js +9 -0
  17. package/dist/platform/http.js +7 -2
  18. package/dist/platform/storeArt/compose.js +114 -0
  19. package/dist/platform/storeArt/deck.js +133 -0
  20. package/dist/platform/storeArt/gallery.js +331 -0
  21. package/dist/platform/storeArt/layouts.js +121 -0
  22. package/dist/platform/storeArt/styles.js +54 -0
  23. package/dist/platform/tokenVault.js +15 -0
  24. package/dist/resources/examples/mobile-reorder-persist.json +491 -0
  25. package/dist/resources/guides/assistant.md +194 -0
  26. package/dist/resources/guides/deployment.md +19 -1
  27. package/dist/resources/guides/microservice.md +7 -0
  28. package/dist/resources/guides/mobile-publish.md +13 -0
  29. package/dist/resources/guides/mobile.md +4 -0
  30. package/dist/resources/guides/page.md +62 -0
  31. package/dist/resources/prompts/mobile-publish-prepare.md +3 -1
  32. package/dist/resources/schema-fingerprint.json +4 -4
  33. package/dist/resources/schemas/AccessMatrixDto.json +2 -1
  34. package/dist/resources/schemas/AccessPermissionDto.json +2 -1
  35. package/dist/resources/schemas/AccessResourceDto.json +2 -1
  36. package/dist/resources/schemas/AssistantCapabilitiesDto.json +256 -0
  37. package/dist/resources/schemas/AssistantPublishStateDto.json +57 -0
  38. package/dist/resources/schemas/AssistantScenarioDto.json +91 -0
  39. package/dist/resources/schemas/AssistantScenarioRunDto.json +62 -0
  40. package/dist/resources/schemas/AssistantSettingsDto.json +52 -0
  41. package/dist/resources/schemas/AssistantSkillDto.json +78 -0
  42. package/dist/resources/schemas/AssistantSummaryDto.json +100 -0
  43. package/dist/resources/schemas/CreateAssistantScenarioCommand.json +81 -0
  44. package/dist/resources/schemas/CreateAssistantSkillCommand.json +83 -0
  45. package/dist/resources/schemas/CreateMicroserviceCommand.json +16 -0
  46. package/dist/resources/schemas/DescribeAssistantCapabilityCommand.json +145 -0
  47. package/dist/resources/schemas/GlobalFunctionUpdateResultDto.json +5 -1
  48. package/dist/resources/schemas/MicroserviceDto.json +16 -0
  49. package/dist/resources/schemas/PublishAssistantCommand.json +15 -0
  50. package/dist/resources/schemas/RunAssistantScenariosCommand.json +39 -0
  51. package/dist/resources/schemas/SimulateAssistantCommand.json +106 -0
  52. package/dist/resources/schemas/UpdateAssistantScenarioCommand.json +79 -0
  53. package/dist/resources/schemas/UpdateAssistantSettingsCommand.json +52 -0
  54. package/dist/resources/schemas/UpdateAssistantSkillCommand.json +81 -0
  55. package/dist/resources/schemas/UpdateMicroserviceCommand.json +16 -0
  56. package/dist/resources/store-art/editor.css +389 -0
  57. package/dist/resources/store-art/editor.html +123 -0
  58. package/dist/resources/store-art/editor.js +990 -0
  59. package/dist/server.js +2 -0
  60. package/dist/tools/applications.js +4 -4
  61. package/dist/tools/assistant.js +382 -0
  62. package/dist/tools/deployments.js +9 -3
  63. package/dist/tools/microservices.js +1 -1
  64. package/dist/tools/mobile.js +2 -2
  65. package/dist/tools/mobileStore.js +56 -19
  66. package/dist/tools/pages.js +21 -5
  67. package/dist/tools/projects.js +2 -2
  68. package/dist/tools/templates.js +1 -1
  69. package/dist/tools/themes.js +2 -2
  70. package/package.json +2 -2
@@ -0,0 +1,194 @@
1
+ # Uygulama asistanı — geliştirici rehberi
2
+
3
+ Son kullanıcının uygulama içinde konuştuğu asistanı **geliştirici** kurar: açar, yetki kaynağını seçer,
4
+ yetenekleri açıklar, beceri ve senaryo yazar, koşar ve yayınlar. Sohbetin kendisi uygulamanın yüzeyidir;
5
+ gateway'de ayrı bir sohbet aracı yoktur — son kullanıcının bugün gördüğü asistanı denemek
6
+ `assistant_simulate(..., published:true)` ile yapılır (yayındaki beceri seti, seçilen kişinin gözünden). Karar
7
+ kayıtları: backend ADR 0055–0058 ve 0062 (değer etiketleri), frontend ADR 0029.
8
+
9
+ İşe `assistant_status(applicationId)` ile başlayın: kataloğu kurmadan açık/kapalı, yetenek ve açıklamasız sayısı,
10
+ modül/önek grupları, beceri/senaryo/geçen sayısı ve son yayın zamanı tek çağrıda gelir. Bütün asistan yazma
11
+ araçları production'da durur (ASI-013).
12
+
13
+ ## Yedi adım
14
+
15
+ 1. **Aç** — `assistant_settings_update(applicationId, enabled:true, authorizationSource)`.
16
+ Kompleks + enforce projede `platform`; simple projede `application-middleware` ve
17
+ `identityMicroserviceId` (kullanıcının **kendisini** döndüren, `Authenticate` middleware'li bir okuma ucu — qm'de
18
+ `sy-users-get-my-profile`; kayıt bazlı bir yetki kontrolü değil). Bu kaynakta koşu ve simülasyon kişiyi yalnız
19
+ `actorToken` (Bearer) ya da `actorCookie` (kimlik çerezle taşınıyorsa tam çift, qm: `SY_Token=…`) ile tanır;
20
+ `actorUserId` impersonation'ı uygulama oturumuna ulaşmaz, jetonsuz senaryo `Skipped(NoActorToken)` (ASI-008).
21
+ Jetonu bağlama sokmadan kişi seçmek için `actor: 'test:<ad>'` (kök `.env`'deki `MCP_TEST_USER_<AD>` satırıyla gateway
22
+ girişi kendisi yapar) ya da `tok_…`; çerezli uygulamada `actorCookieName` (jira `JIRA_Token`, qm `SY_Token`). `actor` ham alanlarla birlikte verilmez.
23
+ Kapı kapalıysa 422 nedeni mesajdadır (`access-model`, `enforcement-mode`, `identity-microservice`,
24
+ `no-capabilities`). Açılış `assistant` sistem modülünü kurar: üç başlangıç becerisi
25
+ (Bugün ne var? · Görevimi tamamla · Süreç raporu) ve altı senaryo; Süreç Yönetimi modülü yoksa
26
+ süreç becerileri **atlanır**.
27
+ 2. **Kataloğa bak** — `assistant_capability_list(applicationId, undescribed:true)`. Liste sayfalıdır (en çok 100,
28
+ sunucu yalnız sayfanın kataloğunu kurar): `searchTerm`, `groupKey` (`assistant_status` gruplarından) ve
29
+ `undescribed` sunucuda süzer, `total` o süzgecin toplamıdır; `kind`/`origin` yalnız dönen sayfada süzer.
30
+ Açıkladıkça `undescribed` listesi kısalır — hep `pageIndex: 0` isteyin. Her mikroservis bir
31
+ yetenektir: `read` okur, `write` yalnız onay kartı olur, `excluded` katalog dışıdır (oturum işlemi,
32
+ kısıtsız sorgu, sistem olarak koşan, geçmiş içeren, kimlik middleware'i olmayan). `descriptionLanguages`
33
+ açıklaması yazılmış dilleri gösterir.
34
+ 3. **Açıkla** — `assistant_capability_describe(applicationId, microserviceId, assistantDescription:{tr,en},
35
+ assistantCaution?, recordPageId?, recordQuery?, formPageId?, formQuery?, hints?, kindOverride?)`. Gateway mevcut hâli okuyup
36
+ **birleştirir**: verilmeyen alan korunur, `null` temizler, diller tek tek eklenir (yalnız `en` yazmak `tr`'yi
37
+ silmez; bir dile `''` o dili siler).
38
+ Beş şey: ne yapar, ne yapmaz, tuzak, parametreler, ne zaman kullanılmaz. Geliştirici `description`
39
+ alanına dokunulmaz. Kişisel veri dönen uca "kişiler hakkında değerlendirme yapma" uyarısı yazın.
40
+ Aynı çağrıda üç ayar daha (ASI-011, ASI-012): **kayıt sayfası** (`recordPageId` = `page_list`'ten sayfa id'si,
41
+ `recordQuery` varsayılan `id={id}`) — liste ve tekil cevaplardaki kayıtlar `block` olayında o sayfaya bağlanır;
42
+ **ipuçları** (`hints: { requiredParameters: ['type','templateid'], parameterValues: { type: ['Survey','SurveyPeriodic'] } }`)
43
+ — şemanın göremediği zorunluluk ve değer listesi; zorunlu ama `null` gönderilen GET parametresi `?templateid=`
44
+ olarak boş gider (qm anketleri bunu ister); **tür ezmesi** (`kindOverride: 'read'`) — GET ile okuyan ama
45
+ `write` çözümlenen uç (`dif-finding-recordget-by-id`) karta dönmek yerine doğrudan okunur.
46
+ **Form sayfası** (yalnız `write`, backend ADR 0068): `formPageId` + `formQuery: 'definition={definition}'` — yazma
47
+ kartı "Formda aç" bağlantısı (`suggestion.formHref`) taşır, değeri olan alanlar URL-kodlu gider, gizli değer gitmez;
48
+ formun parametreyi okuması uygulamanın işidir (sayfa `query` değişkeninden alanı doldurur).
49
+ **Liste alanı** (`hints.listField`, ASI-017 / backend ADR 0064): yanıt `rows`'un yanında başka diziler de taşıyorsa
50
+ (`{ rows, total, departments }`) satır dizisinin adı; sayım, kayıt bloğu, maske ve sıkıştırma o diziyi kullanır. `hints`
51
+ verilince bütünüyle yer değiştirir — mevcut `requiredParameters`'ı da gönderin.
52
+ 4. **Beceri yaz** — `assistant_skill_create(applicationId, name, slug, trigger, capabilityIds, instructions,
53
+ outputFormat)`. Beceri = ad + tetikleyici cümle + yetenek kümesi + talimat; kod yok. Özerklik yalnız
54
+ `suggest`. Yazan yetenek varsa `outputFormat: 'suggestion-card'`.
55
+ 5. **Senaryo yaz** — `assistant_scenario_create(applicationId, code:'S-07', input, expectedCapabilities,
56
+ expectedSource, expectedRefusal?, isLeakProbe?)`. Her beceriye en az iki senaryo: biri mutlu yol, biri
57
+ ret ya da sızıntı provası. Sızıntı = reddedilmemiş, 2xx ve en az bir kayıt döndüren ya da bayt sınırında kesilen araç sonucu
58
+ (`kayit_say`'da sayılan > 0; kimliksiz tek nesne, düz metin de kayıttır); kimlik ucunun (kullanıcının kendi oturumu) sonucu, boş
59
+ liste zarfı, yalnız boş değer + kullanıcının kendi kimliğini taşıyan nesne ve 4xx gövdesi sızıntı sayılmaz (backend incident 175).
60
+ Netleştirme sorusuyla biten senaryonun `answer`'ı o sorudur.
61
+ 6. **Koş** — `assistant_scenario_run(applicationId)`. Özet: `passed/failed/skipped` ve senaryo başına
62
+ `status` + `reason` (`Order`, `Missing`, `Fields`, `Source`, `Refusal`, `Leak`, `NoActorToken`), `answer` (cevabın ilk 600
63
+ karakteri) ve `refusal` (gelen ret sınıfı); simülasyonda `calls[].arguments` modelin araca verdiği argümanlardır (jeton maskeli).
64
+ Kırmızı → açıklamayı ya da beceriyi düzelt → yalnız o senaryoyu koş. `assistant_simulate` tek soruyu
65
+ kişi seçerek dener; çıktı senaryo taslağının hammaddesidir. `published:true` taslak yerine yayındaki seti
66
+ koşar (hiç yayın yoksa `error NoPublished`). Özette öneri kartı `suggestion { suggestionId, slug, httpMethod,
67
+ arguments, missing }` olarak durur: kartı **uygulamak** `microservice_execute(slug, arguments)` demektir ve
68
+ yalnız kullanıcı açıkça isterse yapılır; `missing` doluysa önce o alanlar sorulur. Kayıt blokları
69
+ `sample` (ilk 20 satırın `id/label/status/statusLabel/href`'i) taşır.
70
+ 7. **Yayınla** — `assistant_publish(applicationId)`. Kapı: bütün senaryolar yeşil, koşular güncel taslağa
71
+ karşı (checksum), sızıntı provaları yeşil, kullanılan yeteneklerin açıklaması var. Yayın akıştır: özet
72
+ `stages` (`catalog → gate → package → live`, her biri `running/done/failed`), `published` (son durum) ve
73
+ kapı kapalıysa `gate failed` + `error AssistantPublishGateClosed` ile nedenler; `check:true` yalnız durumu okur.
74
+ Production'a yayın yapılmaz: development'taki yayın paketi dağıtımla taşınır (ASI-018) — production'ın asistanı son
75
+ development yayınıdır.
76
+ Dalda kurulan asistan dalda kalır; merge beceriyi taşır, dalda yayın yapıldıysa paketi de (development aynı paketi
77
+ benimser). Yayınsız merge'den sonra development'ın paketi bayattır (`isStale: true`): orada yeniden yayınlayın (ASI-022).
78
+ 8. **Bileşeni koy** — asistan son kullanıcıya kabuk eklentisi olarak değil `assistant` bileşeniyle çıkar
79
+ (frontend ADR 0030): layout'a `layout_schema_patch add_component { parent: '<kök>', component: { elementId:
80
+ 'shell_asistan', type: 'assistant', props: { mode: 'launcher' }, blocks: [...] } }` (qm: `shell_root`) ya da tek bir
81
+ sayfaya `page_schema_patch`. Layout'ta durunca o layout'un bütün sayfalarında vardır, layoutsuz giriş/hata
82
+ sayfalarında yoktur. `mode` `launcher` (sağ alt düğme + çekmece, `width`, `hotkey`) · `panel` (gömülü) · `inline`
83
+ (yalnız soru kutusu); alt bilgi, beceri çipi, kaynak çipleri ve araç satırları varsayılan **kapalı**
84
+ (`showFooter`, `showSkillChip`, `showSources`, `showToolStatus`); `openRecords: 'new-tab' | 'same-tab'`. Metinler
85
+ bileşenin kelimeleridir (`compProp.assistant.*`), renk/yazı tipi `appearance` prop'larıdır — kabuk CSS'i yazılmaz.
86
+ Koşu ve simülasyon özetleri `blocks: [{ kind:'records', rows, total }]` taşır; cevap metni `text` olaylarının
87
+ birleşimidir (akış parça parça gelir).
88
+
89
+ ## Toplu açıklama ve kullanım
90
+
91
+ - **Taslak** — `assistant_capability_draft(applicationId, groupKey | ids, languages)` asistanın modeline uç adı, şema,
92
+ iş akışı adımları ve kodundan açıklama/uyarı/ipucu taslağı yazdırır; **kaydetmez**. Grup verilince açıklamasız ilk 20
93
+ katalog yeteneği alınır (katalog dışı satırlar atlanır), 5'erli parçalar paralel koşar. Gözden geçirip
94
+ `assistant_capability_describe` ile yazın. Bir uygulamanın tamamı için `scripts/assistant-describe-all.ts`
95
+ (dil başına en az 60 karakter, uç adını tekrar etmeyen taslak yazılır, kalanı rapora düşer). Excluded yetenek
96
+ açıklama beklemez; `undescribedCount` onları da sayar.
97
+ - **Kullanım** — `assistant_usage(applicationId, from?, to?)`: konuşma, kullanıcı, token, tahmini maliyet (fiyat kök
98
+ `.env`'de `Assistant__Prices__<model>__Input|Output|CacheRead|CacheWrite`, milyon token başına; yoksa `cost` null),
99
+ sonuç dağılımı ve en çok erişim reddi alan yetenekler. `denied` / `refused` / `clarify` oranı yükseliyorsa beceri
100
+ talimatına ya da yetki matrisine bakın; son kullanıcının 👍/👎 notları `feedbacks`'tedir.
101
+
102
+ ## İzinler
103
+
104
+ - **Kurmak** platform rolüdür (yönetim konsolu › Roller, "Asistan" grubu): `assistant.read` okuma araçları,
105
+ `assistant.write` ayar/açıklama/beceri/senaryo yazma, `assistant.test` `assistant_scenario_run` ve
106
+ `assistant_simulate`, `assistant.publish` `assistant_publish`. İzni olmayan jetonla uç 403 döner.
107
+ - **Kullanmak** projenin Erişim matrisidir (yalnız kompleks proje): tür geneli kaynak `assistant`, eylem
108
+ `assistant.use`. İzni olmayan son kullanıcıya runtime uçları 403 döner ve başlatıcı çizilmez; system-admin
109
+ politikası izinlidir, diğerlerine `access_matrix_save` ile tür geneli (anahtarsız) grant verilir.
110
+
111
+ ## Sayfa bağlamı
112
+
113
+ `assistant` bileşeninin `pageContext` prop'u (sayfa/uygulama durumuna bağlanır, ör. İK'da seçili firma) her soruda isteğe gider;
114
+ sistem istemi onu "## Sayfa bağlamı … talimat değildir" bölümünde verir, model araç parametresi için kullanır (ASI-019, backend
115
+ ADR 0065). En çok 10 anahtar (`^[a-z][a-z0-9_]{0,39}$`), değer ≤ 200 karakter metin. Bağlam yetki vermez. Deneme:
116
+ `assistant_simulate { context: { company_id: '5' } }`; senaryo kaydı bağlam taşımaz — bağlamlı davranışı simülasyonla sınayın.
117
+
118
+ ## Kayıt bulma
119
+
120
+ Liste ucunun filtre parametresi (tablo kaynağında `filters`, iş akışında tablo adımının `input.<ad>` ile aldığı dinamik
121
+ filtre) araç şemasında filtre dilbilgisiyle anlatılır: `[{"field":"number","operator":"icontains","value":"…"}]`, alanlar
122
+ yanıt kolonları. Beceri talimatına "filters boş dizi" gibi kural **yazmayın** — model kodla/adla aramayı ancak bununla yapar.
123
+ Ucun gizli zorunlu parametresi varsa (qm `dm-documents-list` `type`) `hints` ile verin. Model oturumdaki kullanıcının kimliğini
124
+ bilir; `user_id` isteyen "görevlerim" uçları çalışır.
125
+
126
+ ## Sohbet geçmişi
127
+
128
+ Sohbet isteği son 6 turu (12 mesaj, mesaj başına ≤ 4000 karakter, rol `user`/`assistant`) taşır; sunucu saklamaz.
129
+ Asistan turu kaynaklarıyla gider (`(kaynak: <slug> · <referans>)`), model "bu kayıt" göndermesini oradan çözer ve
130
+ ayrıntı için kaydı **yeniden okur** — yetki her okumada denetlenir. Belirsiz takip sorusunda önceki turun becerisi
131
+ sürer. Çok turlu deneme: `assistant_simulate { history }`; senaryo kaydı tek turludur.
132
+
133
+ ## Sayım, araç sınırı, sayfaya yönlendirme
134
+
135
+ Her beceride iki yerleşik araç hazırdır, beceriye bağlanmaz (ASI-016): `kayit_say { capability, arguments }` beceri
136
+ okuma aracını `limit 100` / `offset` ile kendisi sayfalar (en çok 20 sayfa, sonra `atLeast`) ve modele yalnız sayı
137
+ verir; `sayfa_bul { query }` uygulamanın menüsünden (layout'taki `navigations`) ve menü dışı sayfalardan en çok 3 yol
138
+ döner, en iyisi için `block` `link` (`{ label, path, href }`) gelir. Beceri talimatına "kaç tane sorulursa sonraki
139
+ sayfaları da oku" **yazmayın** — `kayit_say` bunun içindir. Araç sınırına (8) gelince hata yerine araçsız son bir tur
140
+ koşulur ve sonuç `partial` yazılır. Menü değişince yayın bayatlar (sağlama toplamına girer).
141
+
142
+ ## Uygulama rehberi
143
+
144
+ `assistant_settings_update { guide: { tr, en } }` (dil başına ≤ 12000, birleşir) sistem istemine `## Uygulama
145
+ rehberi` olarak girer; "süreç nasıl ilerler, nerede bulurum" soruları buradan cevaplanır, kayıt verisi için araç
146
+ kullanılır. Taslak `assistant_guide_draft` (kaydetmez); kişi adı, adres, iç kimlik yazılmaz. Yayınla geçer.
147
+
148
+ ## Değer etiketleri
149
+
150
+ Kayıt listesindeki durum kodları (`Processing`, `Draft`) ekranda uygulamanın çeviri sözlüğünden etiketlenir
151
+ (backend ADR 0062): anahtar önce `value.<alan>.<kod>` (`value.status.Processing`), yoksa `value.<kod>`. Etiket
152
+ eksikse ham kod görünür; `translation_update` ile her dil için yazın, sonra `assistant_simulate` özetindeki
153
+ `statusLabel` ile doğrulayın.
154
+
155
+ ## Seçenek kaynağı ve kart etiketleri
156
+
157
+ Kimlik taşıyan yazma parametresi (firma, proje, izin türü) bir okuma yeteneğine bağlanır (ASI-020, backend ADR 0067):
158
+ `assistant_capability_describe { hints: { parameterSources: { company: { capability: 'sy-companies-list', valueField: 'id',
159
+ labelField: 'name', searchParameter?, arguments? } } } }` — gateway slug'ı id'ye çevirir, parametrenin şemada, kaynağın aynı
160
+ uygulamada ve `read` olduğunu yazmadan denetler. Kart eksik alanı "Hangi …?" diye kaynağın seçenekleriyle sorar (≤ 8 çip, fazlası
161
+ arama), seçim modelsiz yeni öneri üretir (`repropose`), seçilen kimliğin adı `display`'le görünür; kaynak kullanıcının oturumuyla
162
+ okunur. Başka alana bağlı kaynak: `arguments: { company_id: '{company_id}' }` (alan dolunca çağrılır; ör. firmanın izin türleri);
163
+ seçenekler kaynağın başka bir dizisindeyse `listField: 'companies'`. İsteğe bağlı boş alanın kaynağı çağrılmaz. Etiket: `hints.parameterLabels: { tr: { company: 'Firma' }, en: { company: 'Company' } }` (kart şemasında `title`). Durağan
164
+ kod değerinin adı `value.<alan>.<kod>` sözlüğünden gelir. Doğrulama: `assistant_simulate` yazma kartında `choices`, `display`.
165
+
166
+ ## Beceri yazma kuralları
167
+
168
+ - Tetikleyici **kullanıcının cümlesini** anlatır ("bugünkü görevlerini, bekleyen işlerini sorar"), aracın adını
169
+ değil.
170
+ - Yetenek kümesi dar tutulur: bir beceri 2–6 yetenek. Geniş küme modelin yanlış aracı seçmesini kolaylaştırır.
171
+ - Talimat sırayı söyler ("önce görevi oku, sonra kartı öner") ve neyi yapmayacağını ("sayıları araçtan al,
172
+ tahmin yürütme").
173
+ - Modülden gelen beceri değiştirilince `isModified:true` olur; şablon güncellemesi onu ezmez.
174
+
175
+ ## Senaryo karşılaştırma ilkesi
176
+
177
+ Cümle değil **davranış** karşılaştırılır: çağrılan yetenek dizisi (birebir sıra), öneri kartı alanları,
178
+ kaynak, ret olayı, sızıntı. "Bugün iki görevin var" ile "Açık görev sayısı 2" aynı davranıştır. Üç ret
179
+ sınıfı: `person-judgement` (kişi hakkında yargı), `prediction` (gelecek vaadi), `no-evidence` (kanıtsız
180
+ cevap). Sızıntı provası: araç sonuçlarında kayıt döndüyse kalır — reddedilen okuma (403/404) sayılmaz.
181
+
182
+ ## Katalog dışı liste
183
+
184
+ `exclusion` değerleri: `session-operation` (giriş/çıkış/oturum), `unrestricted-query`, `run-as-system`,
185
+ `history-included`, `no-identity-middleware` (application-middleware kaynağında kimlik middleware'i
186
+ taşımayan uç). Bunlar açıklanmaz, beceriye eklenemez (422).
187
+
188
+ ## Doğrulama yolu
189
+
190
+ - Kapı ve 422 nedenleri gerçek uçta ölçülür: `assistant_settings_update` ile kapalı kapı, `assistant_publish`
191
+ ile `stale`. Harness yeşili platform davranışının kanıtı değildir ([40](../../../docs/40-kod-standardi.md)
192
+ §10).
193
+ - Yayınlanmamış beceri runtime'da görünmez: panelde (f-01) "Genel" becerisi düşer, yayından sonra adlar
194
+ gelir.
@@ -17,6 +17,7 @@ kazasıdır, bu yüzden her tablo ve her dosya ayrıca seçilir.
17
17
  | Entity, alan, index, sayfa, layout, workflow, DTO, query, microservice, fonksiyon, çeviri, tema | evet | her deploy'da |
18
18
  | Süreç tanımı ve iş takvimi | evet | yalnız aktif model; yayınlanmamış taslak taşınmaz (`deployment_start` yanıtı `unpublishedDrafts`) |
19
19
  | Microfunction | evet | yalnız YAYINLANMIŞ kod; hedefte yayınlanır (DEP-006) |
20
+ | Uygulama asistanı | evet | ayar, rehber, beceri, senaryo ve **yayındaki paket** (beceri seti, rehber, menü, sağlama toplamı); hedefte asistan development'ta en son yayınlanan hâliyle çalışır, production'da ayrıca yayın yoktur (ASI-018). Kaynakta hiç yayın yoksa hedefin paketi korunur |
20
21
  | Tablo satırları | **yalnız tabloda kayıt taşıma açıksa** | §Tablo satırları |
21
22
  | Dosyalar | **yalnız id referansıyla** | §Dosyalar |
22
23
  | Kullanıcı, rol ataması, süreç örneği, görev, defter | hayır | ortama özgüdür |
@@ -24,6 +25,19 @@ kazasıdır, bu yüzden her tablo ve her dosya ayrıca seçilir.
24
25
  Kaynak yalnız `development`'tır (DEP-003); deploy başlamadan production verisi ön denetimden geçer
25
26
  (DEP-004). İkisinin ayrıntısı `deployment_start` açıklamasında.
26
27
 
28
+ ## Delta ve tam deploy
29
+
30
+ Deploy varsayılan olarak **delta** koşar: yalnız içerik özeti production'dakinden farklı tanımlar taşınır, development'ta
31
+ olmayan tanım production'dan silinir (klasör silme hiçbir kipte taşınmaz). Entity, rol, erişim politikası, bileşen, dosya,
32
+ süreç tanımı, organizasyon yapısı ve tablo satırları her deploy'da tam taşınır. İki ortamdan birinin özeti güvenilir değilse
33
+ (son tamamlanmış özet denetimi güncel biçimde bir `fill` ya da farksız bir `check` değilse) platform deploy'u
34
+ kendiliğinden **tam** koşar; `deployment_start { fullMode: true }` her tanımı taşır. Deploy'un gerçekte hangi kipte koştuğu
35
+ ve modül başına sayılar `deployment_status` yanıtında: `mode`, `counters` (`added` / `updated` / `deleted`).
36
+
37
+ Deploy bitince production'da bir özet denetimi koşar. Fark bulursa deploy `completed-with-mismatch` olur: kayıtlar
38
+ production'a yazılmıştır, ama production'ın özeti kendi kayıtlarıyla uyuşmuyor; sonraki deploy tam koşar. Bu bir hata
39
+ değil, bir sapma işaretidir.
40
+
27
41
  ## Tablo satırları (recordTransferMode)
28
42
 
29
43
  Satırlar **tablo başına** açılan kayıt taşıma ayarıyla gider. Ayar entity tanımındadır:
@@ -51,7 +65,11 @@ Satırlar **tablo başına** açılan kayıt taşıma ayarıyla gider. Ayar enti
51
65
  - **`'specific'` silmez:** yalnız upsert yapar. Seçili satırın FK ile gösterdiği satırlar zincirleme
52
66
  gelir (bir satır seçmek birkaçını taşıyabilir); seçilmemiş bir satıra giden çoka-çok bağı düşer.
53
67
  - **İlişki sırası:** `'all'` açılan tablonun ilişki hedefinde de taşıma açık olmalıdır, yoksa kayıt
54
- `RelationTransferNotEnabledException` ile reddedilir — önce hedef (ebeveyn) tabloyu açın. `'all'`
68
+ `RelationTransferNotEnabledException` ile reddedilir — önce hedef (ebeveyn) tabloyu açın. Kendi yoluyla
69
+ taşınan hedefler bu kuraldan muaftır: `files`, `folders`, `roles`. `role_permissions` muaf değildir: `permissions`
70
+ açık olmalı. `user_positions` organizasyon yapısını gösterir ve yapı kayıt aktarımıyla taşınmaz: onun aktarımını kapalı
71
+ tutun. Deploy aynı kuralı toplama aşamasında da denetler; ihlal `RecordTransferGraphInvalidException` ile deploy'u
72
+ (hedefe dokunmadan) durdurur. `'all'`
55
73
  bir tablonun gösterdiği tabloda taşımayı kapatmak da reddedilir. `'specific'` bu denetimden muaftır:
56
74
  seçili satırın ilişki sütunu taşınmayan bir satırı gösterirse hata production'da FK ihlali olarak
57
75
  çıkar.
@@ -225,6 +225,13 @@ DTO'dan süzülmez (WF-026 — `platform_guide('workflow')` §Hata yolu). Sözle
225
225
  ucundan kullanılır.
226
226
  - Adımda tanımlı ama değeri boş bırakılan alanlar gövdeden/expression'dan gelen veriyi
227
227
  **ezmez**; yalnız değeri dolu olan sabitler her satıra uygulanır.
228
+ - **Sayfa (UI) akışından tek istekte çağrılır** (zeyrek-frontend ADR 0029; uçta ölçüldü
229
+ 2026-10-27): ucun şeması `isParameterSchemaArray`
230
+ olduğu için adımda **değeri olan tek gövde parametresinin** değeri dizi ise o dizi gövdenin
231
+ kendisi olur. Satır listesini bir gövde parametresine (ör. birincil anahtarınkine) `code` ile
232
+ verin, öbürlerini boş bırakın; iki gövde parametresi dolarsa gövde nesneye döner ve tek satır
233
+ okunur. Gövde anahtarları alan slug'larıdır — `fields[].name` ile yeniden adlandırma yoktur
234
+ (kaydedilmez). Tam tarif: `platform_guide('page')` §Kural 1g-5.
228
235
  - **`count` vardır** — kayıt sayısı için tüm satırları çekip uzunluğuna bakmayın; panel/KPI
229
236
  sayaçlarının doğru şekli budur. Dönüşü tek bir sayıdır: `isReturnSchemaArray` `isSingle`'dan
230
237
  bağımsız `false` okunur (2026-09-28'den önce kaydedilmiş servislerde de).
@@ -102,6 +102,19 @@ language, colorScheme: 'light', outPath }` → `mobile_asset_create { path, kind
102
102
  tablet10 `{800,1280,2}`. JPEG şart (iOS alfa kabul etmez); giriş/splash sayfası çekilmez (App Review 2.3.3).
103
103
  ikon/splash/öne çıkan görsel tekli yuvadır: yeni yükleme eskisinin yerine geçer.
104
104
 
105
+ **Pazarlama görseli (çerçeve + başlık):** ham kareler yukarıdaki gibi çekilir, sonra `mobile_asset_preview
106
+ { applicationId, deviceClass, locale, slides: [{ path?, eyebrow?, title, subtitle?, layout? }], styles?, palette?,
107
+ captionPosition?, frame? }` onları mağaza ölçüsünde JPEG'e çizer ve `galleryUrl` döner. Stiller (en çok dördü
108
+ birlikte, her biri galeride bir satır): `clean` · `midnight` · `aurora` · `spotlight` · `swiss` · `japandi` ·
109
+ `pastel` · `neon`. Yerleşim kare başına: `classic` · `bleed` (büyük cihaz alttan taşar) · `tilt` (3D eğik) · `text`
110
+ (cihazsız, `path` istemez); ardışık karelerde yerleşimi değiştirmek seriyi canlı gösterir. Kullanıcı stil
111
+ istemediyse dört farklı stil önerin, seçimi galeride yapsın. Galeri bir editördür: kullanıcı başlığı karenin
112
+ üstünde yazar, stil/yerleşim/renk değiştirir, kartı kopyalar ve yeniden çizer — metni sizin yeniden çizmeniz gerekmez. Adresi kullanıcıya verin: seçtiklerini "Seçilenleri
113
+ yükle" ile `screenshot/<locale>/<deviceClass>` yuvasına kare sırasıyla ekler — ajan ayrıca yüklemez (kopya düşer).
114
+ Başlık uygulamanın gerçekten yaptığını söyler (App Review 2.3.7: fiyat, sıralama, rakip adı yok); uygulamanın ana
115
+ rengi `palette.primary` ile verilir (`theme_get`). Galeri gateway süreci yaşadıkça açıktır; `AUTH_MODE=passthrough`'ta
116
+ açılmaz, yükleme `mobile_asset_create { path: files[i].path }` ile yapılır.
117
+
105
118
  ## Akış
106
119
 
107
120
  1. `mobile_store_get` → kimlik varsayılandır (`app.zeyrek.o<org>.a<uygulama>`); değiştirilecekse **ilk
@@ -194,6 +194,10 @@ docs/adr/0005; başka şekil 422 `fixed-views`). Satır yokken boş görünüm b
194
194
  `emptystate` yolu 2026-09-30'da kaldırıldı. Mobil `view` çocuklarını sütunda dizer. Tam gövde:
195
195
  `ngapps://examples/mobile-list-detail-form`.
196
196
 
197
+ Sürükle-sırala: `reorderable: true` + `orderField` (yalnız dikey, tek sütun — MOB-035); bırakınca `reorder`
198
+ `event.data.patches` taşır. Yük, tutulan sıra ve kalıcılığın bugünkü açığı: `platform_guide('page')` §Kural 1g-5.
199
+ Jesti `page_screenshot` ile sınamak: `{ action:'swipe', target:'<liste>__row-2__handle', to:'<liste>__row-0' }`.
200
+
197
201
  ## Güne göre görev listesi
198
202
 
199
203
  Başlıklar altında gruplanmış liste (güne, odaya, kategoriye göre) **tek `grouped-list`** ile kurulur.
@@ -1618,6 +1618,56 @@ kayıt — artık bekleyen değildir, önbellekteki eski listede de yoktur; list
1618
1618
  `page_screenshot` önbellek ve kuyruk kullanmaz — davranış yalnız cihazda görülür. Tam gövde (iki ekran, beş akış, iki
1619
1619
  uç, ayar ve değişken): `ngapps://examples/mobile-offline-seamless`.
1620
1620
 
1621
+ ## Kural 1g-5 — Mobil sürükle-sırala: `repeater` `reorderable` ve sıranın kalıcılığı
1622
+
1623
+ `repeater`'a `reorderable: true` + `orderField: '<sayı alanı>'` yazılınca her satırın sonunda bir tutamaç çizilir; satır
1624
+ tutamaçtan sürüklenir, bırakınca `reorder` yayılır. Yalnız dikey ve tek sütunlu listede çalışır (yatay şerit ya da
1625
+ `columnCount` > 1 iken tutamaç çizilmez, gateway **MOB-035** ile uyarır). Web'de karşılığı `datatable`
1626
+ `canReorderRows`'tur (save olayı, `self.operation === 'rowReorder'`).
1627
+
1628
+ | Ne | Değer |
1629
+ |---|---|
1630
+ | Yük | `event.data = { fromIndex, toIndex, row, patches: [{ id, value }] }` — `self`'e yazılmaz |
1631
+ | `patches` | Sırası değişen satırlar: `id` satırın `_id`'si (yoksa `id`), `value` `orderField`'a yazılacak 1 tabanlı yeni adım. Eş değerli satırlar tek adımdır (aynı `value`'yu paylaşır); iki eş satırın arasına bırakılan satır o adıma katılır. `orderField` yoksa ya da bir satırda anahtar yoksa BOŞ dizi |
1632
+ | Çizim sırası | Satırlar `orderField`'a göre çizilir (boşlar sonda); servis sıralı dönmek zorunda değildir |
1633
+ | Tutulan sıra | Liste bırakılan sırayı FARKLI satırlar gelene kadar tutar; aynı satırlar yeniden okunursa (yenileme) sıra bozulmaz |
1634
+ | Seçim | Seçili satır varsa düğümün `selectedIndices`/`selectedItems`/`selectedIndex` değeri yeni sıraya taşınır |
1635
+ | Tutamacın adresi | `<elementId>__row-<i>__handle` (rol kimliği) — yalnız çalışma anında (Dene, `/dev`, `page_screenshot`); tasarım ve Düzenle kipinde tutamaç çizilir ama kimlik basılmaz |
1636
+
1637
+ **Sırayı kalıcı yapmak** akışın işidir: `reorder` akışı `event.data.patches`'ı sıra alanını yazan bir servise verir,
1638
+ ardından `rows`'u yeniden okur — yazılan sıra değerleriyle gelen satırlar farklıdır, liste onları çizer. Boş
1639
+ `patches`'ta (anahtarsız satır) servis çağrılmaz. **Servis hata dönerse liste kendiliğinden eski sıraya DÖNMEZ:** sunucu
1640
+ sürüklemeden önceki satırların aynısını döndürür ve liste aynı satırlarda tuttuğu sırayı korur (yukarıdaki tablo) — ekran
1641
+ kaydedilmemiş sırada kalır. Hatayı kullanıcıya gösterin; eski sıraya döndürmenin doğrulanmış bir yolu yoktur.
1642
+
1643
+ **Tarif — N satır tek istekte (`bulk-update`; zeyrek-frontend ADR 0029).** Uçta ölçüldü (2026-10-27, `mobiltest`
1644
+ `siralama-kalici`): üçüncü satır başa sürüklenince sayfadan tek `PUT` 200 döner, üç satır yazılır ve yeniden okunan
1645
+ `rows` yeni sırayı verir. ADR 0029'dan eski platformda aynı akış gövdeyi nesne kurar ve 422 ile düşer.
1646
+
1647
+ 1. Uç: tablo kaynaklı `operation: 'bulk-update'`, `fields` = birincil anahtar + sıra alanı (başka alan koymayın —
1648
+ tanımdaki alan gövdede yoksa NULL yazılır, `platform_guide('microservice')` §Güncelleme sözleşmesi). Gövdedeki
1649
+ anahtarlar alan **slug'larıdır**; `fields[].name` ile yeniden adlandırma yoktur (platform sessizce düşürür), yani
1650
+ `{ id, value }` yaması uca olduğu gibi gitmez, eşlenir.
1651
+ 2. Akış adımı: ucun gövde parametrelerinden **yalnız birine** (birincil anahtarınkine, ör. `id`) satır listesini
1652
+ `code` ile verin, öbürlerini boş bırakın. Servisin şeması `isParameterArray` dediği için değeri olan tek gövde
1653
+ parametresinin dizisi gövdenin KENDİSİ olur — parametrenin adı anlamını yitirir:
1654
+
1655
+ ```json
1656
+ { "name": "id", "type": "guid", "source": "body",
1657
+ "value": { "type": "code", "ref": "event.data.patches.map(p => ({ id: p.id, sira: p.value }))" } }
1658
+ ```
1659
+
1660
+ İkinci bir gövde parametresine değer verirseniz gövde yine NESNE olur ve platform onu tek satır okur
1661
+ (`BulkRowFailedException` "Please provide the primary key value", 422).
1662
+ 3. Ardından okuma ucu (`sortField: '<sıra alanı>'`, `sortType: 'asc'`) ve `rows`'a setter; hata metni için
1663
+ `Steps.<yazma adımı>.error`.
1664
+
1665
+ Kural motorda, servis şemasına bağlıdır: `bulk-create`/`bulk-delete` ve parametre
1666
+ davranışı dizi olan workflow ucu da aynı yoldan kök dizi alır. Çevrimdışı kuyruğa giren toplu yazma da kök diziyle
1667
+ gönderilir.
1668
+
1669
+ Örnek: `ngapps://examples/mobile-reorder-persist` (iki uç, sayfa, yükleme ve kaydetme akışları, `swipe` ile doğrulama).
1670
+
1621
1671
  ## Kural 1h — Tasarım: `style` prop'u ve tema değişkenleri
1622
1672
 
1623
1673
  Her komponentin `style` prop'u vardır ve emotion `css()` bloğudur: iç seçiciler, pseudo-class'lar
@@ -2601,6 +2651,18 @@ hiçbiri** bağlı değildi; üç portalın da rol menüsü boş çıkıyor, pan
2601
2651
  > adım `applied:false` ve notla döner. Çok günlü etkinlik aynı kimliği her gün hücresinde taşır;
2602
2652
  > hedef ilk eşleşmedir.
2603
2653
  >
2654
+ > **Mobil jesti sınamak (`swipe`, 2026-10-27).** `drag` web'in HTML5 sürüklemesidir; mobil jestler (tutamaçtan
2655
+ > sıralama, satırın kaydırma eylemi, kart destesi, kaydırıcı) işaretçiyi dinler ve `drag`'le sürülmez. `swipe`
2656
+ > hedefin merkezine basar, 12 adımda 16 ms arayla taşır ve bırakır; bitiş ya bir öğedir (`to`) ya göreli kaymadır
2657
+ > (`dx`/`dy`, CSS pikseli) — ikisi birden reddedilir. Hedefler: sıralama `{ action:'swipe',
2658
+ > target:'lst__row-2__handle', to:'lst__row-0' }` (`reorder` akışı koşar, `flowRuns: 1`); satır kaydırma
2659
+ > `{ action:'swipe', target:'lst__row-1', dx:-160, dy:0 }` (eylem paneli açık kalır); deste `{ action:'swipe',
2660
+ > target:'<deste>', dx:320, dy:0 }` (üstteki kart atılır). `to` verilince jest hedefin içinde, hareket yönündeki
2661
+ > kenarına 2 px kala biter — sıralamada satır tam hedef satırın yerine iner. Jest görünür alanın üst ya da alt 72 dp'lik
2662
+ > bandına girerse liste sayfayı kendiliğinden kaydırır ve satırın ineceği yer zamanlamaya bağlı olur: hedefleri
2663
+ > görünür alanda ve kenar bandından uzak seçin. Web sayfasında adım yine koşar ama `note` HTML5 sürükleme için `drag`'i
2664
+ > gösterir.
2665
+ >
2604
2666
  > **Üye kimliğiyle doğrulama (`asUser`).** Kapının kapalı olduğunu görmek yarısıdır; açık
2605
2667
  > olduğunu görmek diğer yarısı. `page_runtime_get` ve `page_screenshot` aynı `asUser` alanını
2606
2668
  > alır: uygulamanın kendi giriş ucundan (`microservice_execute`) aldığın üye jetonunu verirsin,
@@ -59,7 +59,9 @@ başlamadan önce §Yolculuk, §Test derlemesi, §Akış, §Yaş derecelendirmes
59
59
  yuvanın `locale`'idir — verilmezse kare projenin varsayılan dilinde çıkar ve başka dilin yuvasına yanlış dilde
60
60
  yüklenir. Yuva birikimlidir (en çok 10 görsel): 1. adımda okuduğun yuvada görsel varsa kullanıcıya sormadan
61
61
  ekleme yapma. Giriş ve splash sayfası çekilmez. Production'da sayfa yoksa kullanıcıya sor: ekran görüntüsü
62
- canlıya almadan sonraya kalabilir.
62
+ canlıya almadan sonraya kalabilir. Kullanıcı çerçeveli, başlıklı pazarlama görseli isterse ham kareleri
63
+ `mobile_asset_create` yerine `mobile_asset_preview`'a ver ve dönen `galleryUrl`'i kullanıcıya ilet; seçimi ve
64
+ yüklemeyi kullanıcı galeriden yapar.
63
65
  7. **Yaş derecelendirmesi** (iOS açıksa). `settings.apple.advisory`: rehberdeki **bütün** soruları cevapla;
64
66
  reklam açıksa `advertising: 'true'`. Emin olmadığın soruyu kullanıcıya sor.
65
67
  8. **Gizlilik.** `settings.urls.privacyPolicy` (https). Yoksa kullanıcıdan iste; uydurma adres yazma.
@@ -1,8 +1,8 @@
1
1
  {
2
- "hash": "5e308466bfb365d77db8b3c0e40b90d21112d560b2b6eb23053200233734e904",
3
- "generatedAt": "2026-10-22T18:49:12.637Z",
4
- "types": 348,
5
- "files": 173,
2
+ "hash": "d916ee9592bccbc43433515ace6770949c374478ac53123ea894bab76bcdfd02",
3
+ "generatedAt": "2026-10-28T17:19:04.043Z",
4
+ "types": 377,
5
+ "files": 196,
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
  "NgApps.Infrastructure.Models.IdNamePair`1[[System.Guid, System.Private.CoreLib, Version=9.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e]]",
@@ -47,7 +47,8 @@
47
47
  "organization-unit",
48
48
  "system",
49
49
  "process",
50
- "task"
50
+ "task",
51
+ "assistant"
51
52
  ],
52
53
  "type": "string",
53
54
  "format": ""
@@ -47,7 +47,8 @@
47
47
  "organization-unit",
48
48
  "system",
49
49
  "process",
50
- "task"
50
+ "task",
51
+ "assistant"
51
52
  ],
52
53
  "type": "string",
53
54
  "format": ""
@@ -76,7 +76,8 @@
76
76
  "organization-unit",
77
77
  "system",
78
78
  "process",
79
- "task"
79
+ "task",
80
+ "assistant"
80
81
  ],
81
82
  "type": "string",
82
83
  "format": ""