@appaflytech/zeyrek-ai-mcp 0.0.51 → 0.0.53

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 (58) hide show
  1. package/dist/knowledge/componentCatalog.js +3 -1
  2. package/dist/knowledge/componentEvents.js +13 -1
  3. package/dist/knowledge/expressionPrelude.js +3 -0
  4. package/dist/knowledge/mobileComponentCatalog.js +4 -1
  5. package/dist/knowledge/mobileStore.js +258 -1
  6. package/dist/knowledge/normalize.js +4 -3
  7. package/dist/knowledge/platform/mobile.js +1 -1
  8. package/dist/knowledge/platform/mobileRules.js +79 -0
  9. package/dist/knowledge/rules.js +199 -6
  10. package/dist/knowledge/storeImport.js +69 -0
  11. package/dist/platform/argumentAliases.js +13 -4
  12. package/dist/platform/bodyFile.js +195 -38
  13. package/dist/platform/capture/actions.js +24 -5
  14. package/dist/platform/capture/capture.js +80 -11
  15. package/dist/platform/capture/persistent-browser.js +23 -1
  16. package/dist/platform/capture/readiness.js +32 -1
  17. package/dist/platform/errors.js +45 -5
  18. package/dist/platform/http.js +17 -9
  19. package/dist/platform/responses.js +7 -1
  20. package/dist/platform/secrets.js +8 -0
  21. package/dist/platform/token.js +32 -21
  22. package/dist/resources/examples/flow-credit-spend.json +233 -0
  23. package/dist/resources/examples/flow-purchase-paywall.json +662 -0
  24. package/dist/resources/examples/mobile-offline-list.json +1 -1
  25. package/dist/resources/examples/mobile-offline-queue.json +1 -1
  26. package/dist/resources/examples/mobile-offline-seamless.json +12 -3
  27. package/dist/resources/examples/store-import-mapping.json +25 -0
  28. package/dist/resources/guides/deployment.md +9 -0
  29. package/dist/resources/guides/expressions.md +1 -0
  30. package/dist/resources/guides/microservice.md +13 -1
  31. package/dist/resources/guides/mobile-publish.md +67 -2
  32. package/dist/resources/guides/mobile-steps.md +91 -3
  33. package/dist/resources/guides/mobile.md +38 -8
  34. package/dist/resources/guides/page.md +39 -8
  35. package/dist/resources/guides/translation.md +3 -1
  36. package/dist/resources/guides/workflow.md +30 -0
  37. package/dist/resources/schema-fingerprint.json +2 -2
  38. package/dist/resources/schemas/CreateWorkflowCommand.json +6 -1
  39. package/dist/resources/schemas/GlobalFunctionUpdateResultDto.json +4 -0
  40. package/dist/resources/schemas/PreviewWorkflowCommand.json +6 -1
  41. package/dist/resources/schemas/StepDto.json +6 -1
  42. package/dist/resources/schemas/UpdateWorkflowCommand.json +6 -1
  43. package/dist/server.js +4 -0
  44. package/dist/tools/applications.js +7 -2
  45. package/dist/tools/deployments.js +1 -1
  46. package/dist/tools/designSchemaPatch.js +7 -2
  47. package/dist/tools/environments.js +40 -0
  48. package/dist/tools/flows.js +102 -9
  49. package/dist/tools/mobile.js +56 -0
  50. package/dist/tools/mobilePurchases.js +236 -0
  51. package/dist/tools/mobileStore.js +2 -2
  52. package/dist/tools/mobileStoreImport.js +173 -0
  53. package/dist/tools/pages.js +45 -11
  54. package/dist/tools/platformInfo.js +4 -4
  55. package/dist/tools/screenWrite.js +107 -1
  56. package/dist/tools/variables.js +1 -1
  57. package/package.json +1 -1
  58. package/dist/resources/guides/mobile-flow.md +0 -64
@@ -0,0 +1,662 @@
1
+ {
2
+ "_meta": {
3
+ "synthetic": true,
4
+ "note": "Mobil teklif ekranı (paywall, kök docs/adr/0027-uygulama-ici-satin-alma.md): plan seçimi, fiyat Products'tan, Devam et → purchase, Satın almaları geri yükle → restore-purchases, otomatik yenileme metni ve koşullar/gizlilik bağlantıları; hak açılınca aynı ekran 'Premium açıldı' köküne geçer (Entitlements.premium). Studio'nun 'Teklif ekranı oluştur' şablonunun (features/purchases/paywall-template.functions.ts) MCP karşılığıdır. Akışlar FLOW-045 / FLOW-020 / FLOW-022'den temiz geçer, ekran MOB-034 ve MOB-042'i karşılar (test/coverage.test.ts).",
5
+ "pairsWith": "mobile-app-shell-stack (kabuk); ürünler önce mobile_product_upsert ile kataloğa yazılır (premium_yillik, premium_aylik — aynı hak 'premium')",
6
+ "sourceRef": "platform_guide('mobile-steps') §Satın alma tarifi; platform_guide('mobile-publish') §Satın almalar; lokal ölçüm 2026-10-23 qm/test-harita-200 'teklif' sayfası (Studio şablonu: start kökü, {{ }} sarmalı kod bağları, pending/failed ayrımı)"
7
+ },
8
+ "_rules": {
9
+ "order": "Sıra: (1) mobile_product_upsert ile ürünler; (2) page_create + schemaPatchOps (kök önce safe-area); (3) ÖNCE restore-purchases akışı (restoreFlowCreateArgs), SONRA purchase akışı (purchaseFlowCreateArgs) — MOB-034 yalnız satın alma akışı yazılırken ekranın geri yükleme yolunu arar, ters sırada eskimiş bir uyarı kalır; (4) bindOps ile akış kimliklerini düğmelere bağla. Ürünün mağazaya gitmesi (mobile_product_send) ekranı beklemez ama cihazda gerçek satın alma onu ister.",
10
+ "start": "Her akış 'start' adımıyla açılır ve iş onun always dalındadır — start'sız akışı motor sessizce bitirir (Devam et hiçbir şey yapmaz; Studio şablonunun ilk ölçümünde görüldü).",
11
+ "codeBindings": "Kod bağı (isHidden, content) '{{ … }}' ile SARILIR: sarmalsız 'Entitlements.premium' düz metin sayılır ve dolu metin 'true' gibi davranır — iki kök birden gizlenir, ekran boş kalır (aynı ölçüm).",
12
+ "value": "purchase.value ürünün Zeyrek anahtarıdır ve METİN ŞABLONUDUR: düz 'premium_yillik' ya da seçimden '{{ plan_secim.value }}'. Statik anahtar katalogda değilse cihaz ve önizleme 'invalid' döner; gateway o yazımı FLOW-045 ile durdurur (ürünü önce mobile_product_upsert ile açın), mağaza ön kontrolü P-23 Studio'da yazılanı uyarır.",
13
+ "branches": "İki adım da KAPIDIR: error dalı → hata akışı → ikisi de yoksa akış adımda biter. Steps.<ad>.error.status: cancelled (vazgeçti — bir şey gösterme) · pending (Ask to Buy, bekleyen ödeme ya da sunucuya ulaşılamadı; hak açılınca Entitlements kendiliğinden güncellenir) · failed · unavailable (mağaza yok, ürün satışta değil, ikili satın almayı taşımıyor) · unsupported (web, production /view, eski kabuk) · invalid (anahtar manifestte yok). Koşulun kural kimlikleri GUID'dir ve dalın adıdır (FLOW-020); else kuralı vazgeçmeyi sessiz bırakır.",
14
+ "result": "Başarı: purchase Steps.<ad>.data = { productKey, entitlements }, restore-purchases { entitlements }. Ekran hakka bakar, ürüne değil: Entitlements.<hak> (boolean). Fiyat yazılmaz — Products.<anahtar>.price mağazanın yerel fiyat metnidir (₺949,99), period / trial ISO 8601 süre (P1Y, P7D) ya da null.",
15
+ "disclosure": "Abonelik satan ekranda süre, fiyat, otomatik yenileme ve iptal yolu metni ile kullanım koşulları + gizlilik bağlantısı zorunludur (App Store 3.1.2, Play politikası) — MOB-042 uyarır. Geri yükleme düğmesi satın alma ekranında durur (MOB-034). Gizlilik adresi mağaza ayarındadır: mobile_store_get settings.urls.privacyPolicy.",
16
+ "preview": "Studio önizlemesi, /dev ve Zeyrek Mobile oynatıcısı gerçek satın alma yapmaz: dört sonuçlu deneme penceresi açar (satın alındı · vazgeçildi · beklemede · başarısız; düğümler preview-purchase__success | __cancel | __pending | __error, gönder preview-purchase__send). Production /view'da adım 'unsupported'. Gerçek satın alma yalnız kabuk 0.9.0+ mağaza derlemesinde (TestFlight / Play iç test).",
17
+ "binding": "Akışı olaya bağlamak ayrı adımdır: page_schema_patch set_event { target: 'btn_devam' | 'btn_geri_yukle', event: 'click', eventValue: '<flow id>' }."
18
+ },
19
+ "pageCreateArgs": {
20
+ "name": "Teklif",
21
+ "slug": "teklif"
22
+ },
23
+ "schemaPatchOps": [
24
+ {
25
+ "op": "add_component",
26
+ "parent": "page_container",
27
+ "component": {
28
+ "elementId": "guvenli_alan",
29
+ "name": "guvenli_alan",
30
+ "type": "safe-area",
31
+ "kind": "component",
32
+ "props": {},
33
+ "appearance": {
34
+ "marginType": "none",
35
+ "widthType": "fill"
36
+ },
37
+ "blocks": [],
38
+ "events": [],
39
+ "validations": [],
40
+ "stateBindings": [],
41
+ "children": [
42
+ {
43
+ "elementId": "teklif",
44
+ "name": "teklif",
45
+ "type": "container",
46
+ "kind": "component",
47
+ "props": {
48
+ "direction": {
49
+ "type": "static",
50
+ "ref": null,
51
+ "data": "column"
52
+ },
53
+ "gap": {
54
+ "type": "static",
55
+ "ref": null,
56
+ "data": "medium"
57
+ },
58
+ "horizontalAlign": {
59
+ "type": "static",
60
+ "ref": null,
61
+ "data": "stretch"
62
+ },
63
+ "isHidden": {
64
+ "type": "code",
65
+ "ref": "{{ Entitlements.premium }}",
66
+ "data": null
67
+ }
68
+ },
69
+ "appearance": {
70
+ "marginType": "none",
71
+ "widthType": "fill"
72
+ },
73
+ "blocks": [],
74
+ "events": [],
75
+ "validations": [],
76
+ "stateBindings": [],
77
+ "children": [
78
+ {
79
+ "elementId": "txt_teklif_baslik",
80
+ "name": "txt_teklif_baslik",
81
+ "type": "text",
82
+ "kind": "component",
83
+ "props": {
84
+ "content": {
85
+ "type": "static",
86
+ "ref": null,
87
+ "data": "Premium'a geç"
88
+ },
89
+ "type": {
90
+ "type": "static",
91
+ "ref": null,
92
+ "data": "h2"
93
+ }
94
+ },
95
+ "appearance": {
96
+ "marginType": "none",
97
+ "widthType": "fill"
98
+ },
99
+ "blocks": [],
100
+ "events": [],
101
+ "validations": [],
102
+ "stateBindings": [],
103
+ "children": []
104
+ },
105
+ {
106
+ "elementId": "txt_faydalar",
107
+ "name": "txt_faydalar",
108
+ "type": "text",
109
+ "kind": "component",
110
+ "props": {
111
+ "content": {
112
+ "type": "static",
113
+ "ref": null,
114
+ "data": "Reklamsız kullanım, bütün raporlar ve bulut yedeği."
115
+ }
116
+ },
117
+ "appearance": {
118
+ "marginType": "none",
119
+ "widthType": "fill"
120
+ },
121
+ "blocks": [],
122
+ "events": [],
123
+ "validations": [],
124
+ "stateBindings": [],
125
+ "children": []
126
+ },
127
+ {
128
+ "elementId": "plan_secim",
129
+ "name": "plan_secim",
130
+ "type": "choice-chips",
131
+ "kind": "component",
132
+ "props": {
133
+ "value": {
134
+ "type": "static",
135
+ "ref": null,
136
+ "data": "premium_yillik"
137
+ },
138
+ "options": {
139
+ "type": "static",
140
+ "ref": null,
141
+ "data": [
142
+ {
143
+ "value": {
144
+ "type": "static",
145
+ "ref": null,
146
+ "data": "premium_yillik"
147
+ },
148
+ "label": {
149
+ "type": "static",
150
+ "ref": null,
151
+ "data": "Premium yıllık · 1 hafta ücretsiz"
152
+ },
153
+ "badge": {
154
+ "type": "static",
155
+ "ref": null,
156
+ "data": "%39"
157
+ },
158
+ "badgeKind": {
159
+ "type": "static",
160
+ "ref": null,
161
+ "data": "success"
162
+ }
163
+ },
164
+ {
165
+ "value": {
166
+ "type": "static",
167
+ "ref": null,
168
+ "data": "premium_aylik"
169
+ },
170
+ "label": {
171
+ "type": "static",
172
+ "ref": null,
173
+ "data": "Premium aylık"
174
+ }
175
+ }
176
+ ]
177
+ }
178
+ },
179
+ "appearance": {
180
+ "marginType": "none",
181
+ "widthType": "fill"
182
+ },
183
+ "blocks": [],
184
+ "events": [],
185
+ "validations": [],
186
+ "stateBindings": [],
187
+ "children": []
188
+ },
189
+ {
190
+ "elementId": "txt_fiyat",
191
+ "name": "txt_fiyat",
192
+ "type": "text",
193
+ "kind": "component",
194
+ "props": {
195
+ "content": {
196
+ "type": "code",
197
+ "ref": "{{ Products[plan_secim.value]?.price ?? '' }}",
198
+ "data": null
199
+ },
200
+ "type": {
201
+ "type": "static",
202
+ "ref": null,
203
+ "data": "h3"
204
+ }
205
+ },
206
+ "appearance": {
207
+ "marginType": "none",
208
+ "widthType": "fill"
209
+ },
210
+ "blocks": [],
211
+ "events": [],
212
+ "validations": [],
213
+ "stateBindings": [],
214
+ "children": []
215
+ },
216
+ {
217
+ "elementId": "btn_devam",
218
+ "name": "btn_devam",
219
+ "type": "button",
220
+ "kind": "component",
221
+ "props": {
222
+ "text": {
223
+ "type": "static",
224
+ "ref": null,
225
+ "data": "Devam et"
226
+ },
227
+ "kind": {
228
+ "type": "static",
229
+ "ref": null,
230
+ "data": "primary"
231
+ }
232
+ },
233
+ "appearance": {
234
+ "marginType": "none",
235
+ "widthType": "fill"
236
+ },
237
+ "blocks": [],
238
+ "events": [],
239
+ "validations": [],
240
+ "stateBindings": [],
241
+ "children": []
242
+ },
243
+ {
244
+ "elementId": "btn_geri_yukle",
245
+ "name": "btn_geri_yukle",
246
+ "type": "button",
247
+ "kind": "component",
248
+ "props": {
249
+ "text": {
250
+ "type": "static",
251
+ "ref": null,
252
+ "data": "Satın almaları geri yükle"
253
+ },
254
+ "variant": {
255
+ "type": "static",
256
+ "ref": null,
257
+ "data": "link"
258
+ }
259
+ },
260
+ "appearance": {
261
+ "marginType": "none",
262
+ "widthType": "fill"
263
+ },
264
+ "blocks": [],
265
+ "events": [],
266
+ "validations": [],
267
+ "stateBindings": [],
268
+ "children": []
269
+ },
270
+ {
271
+ "elementId": "txt_yenileme",
272
+ "name": "txt_yenileme",
273
+ "type": "text",
274
+ "kind": "component",
275
+ "props": {
276
+ "content": {
277
+ "type": "static",
278
+ "ref": null,
279
+ "data": "Abonelik, seçtiğin dönemin sonunda otomatik yenilenir. Yenilemeden en az 24 saat önce App Store ya da Google Play hesap ayarlarından iptal edebilirsin. Ödeme, satın almayı onayladığında mağaza hesabından alınır."
280
+ },
281
+ "type": {
282
+ "type": "static",
283
+ "ref": null,
284
+ "data": "small"
285
+ }
286
+ },
287
+ "appearance": {
288
+ "marginType": "none",
289
+ "widthType": "fill"
290
+ },
291
+ "blocks": [],
292
+ "events": [],
293
+ "validations": [],
294
+ "stateBindings": [],
295
+ "children": []
296
+ },
297
+ {
298
+ "elementId": "btn_kosullar",
299
+ "name": "btn_kosullar",
300
+ "type": "button",
301
+ "kind": "component",
302
+ "props": {
303
+ "text": {
304
+ "type": "static",
305
+ "ref": null,
306
+ "data": "Kullanım koşulları"
307
+ },
308
+ "variant": {
309
+ "type": "static",
310
+ "ref": null,
311
+ "data": "link"
312
+ },
313
+ "href": {
314
+ "type": "static",
315
+ "ref": null,
316
+ "data": "https://www.apple.com/legal/internet-services/itunes/dev/stdeula/"
317
+ }
318
+ },
319
+ "appearance": {
320
+ "marginType": "none",
321
+ "widthType": "fill"
322
+ },
323
+ "blocks": [],
324
+ "events": [],
325
+ "validations": [],
326
+ "stateBindings": [],
327
+ "children": []
328
+ },
329
+ {
330
+ "elementId": "btn_gizlilik",
331
+ "name": "btn_gizlilik",
332
+ "type": "button",
333
+ "kind": "component",
334
+ "props": {
335
+ "text": {
336
+ "type": "static",
337
+ "ref": null,
338
+ "data": "Gizlilik"
339
+ },
340
+ "variant": {
341
+ "type": "static",
342
+ "ref": null,
343
+ "data": "link"
344
+ },
345
+ "href": {
346
+ "type": "static",
347
+ "ref": null,
348
+ "data": "<mobile_store_get settings.urls.privacyPolicy>"
349
+ }
350
+ },
351
+ "appearance": {
352
+ "marginType": "none",
353
+ "widthType": "fill"
354
+ },
355
+ "blocks": [],
356
+ "events": [],
357
+ "validations": [],
358
+ "stateBindings": [],
359
+ "children": []
360
+ }
361
+ ]
362
+ },
363
+ {
364
+ "elementId": "premium_acik",
365
+ "name": "premium_acik",
366
+ "type": "container",
367
+ "kind": "component",
368
+ "props": {
369
+ "direction": {
370
+ "type": "static",
371
+ "ref": null,
372
+ "data": "column"
373
+ },
374
+ "gap": {
375
+ "type": "static",
376
+ "ref": null,
377
+ "data": "small"
378
+ },
379
+ "isHidden": {
380
+ "type": "code",
381
+ "ref": "{{ !Entitlements.premium }}",
382
+ "data": null
383
+ }
384
+ },
385
+ "appearance": {
386
+ "marginType": "none",
387
+ "widthType": "fill"
388
+ },
389
+ "blocks": [],
390
+ "events": [],
391
+ "validations": [],
392
+ "stateBindings": [],
393
+ "children": [
394
+ {
395
+ "elementId": "txt_acik_baslik",
396
+ "name": "txt_acik_baslik",
397
+ "type": "text",
398
+ "kind": "component",
399
+ "props": {
400
+ "content": {
401
+ "type": "static",
402
+ "ref": null,
403
+ "data": "Premium açıldı"
404
+ },
405
+ "type": {
406
+ "type": "static",
407
+ "ref": null,
408
+ "data": "h2"
409
+ }
410
+ },
411
+ "appearance": {
412
+ "marginType": "none",
413
+ "widthType": "fill"
414
+ },
415
+ "blocks": [],
416
+ "events": [],
417
+ "validations": [],
418
+ "stateBindings": [],
419
+ "children": []
420
+ },
421
+ {
422
+ "elementId": "txt_acik_metin",
423
+ "name": "txt_acik_metin",
424
+ "type": "text",
425
+ "kind": "component",
426
+ "props": {
427
+ "content": {
428
+ "type": "static",
429
+ "ref": null,
430
+ "data": "Bütün özellikler açık. Teşekkürler!"
431
+ }
432
+ },
433
+ "appearance": {
434
+ "marginType": "none",
435
+ "widthType": "fill"
436
+ },
437
+ "blocks": [],
438
+ "events": [],
439
+ "validations": [],
440
+ "stateBindings": [],
441
+ "children": []
442
+ }
443
+ ]
444
+ }
445
+ ]
446
+ }
447
+ }
448
+ ],
449
+ "restoreFlowCreateArgs": {
450
+ "host": "page",
451
+ "hostId": "<teklif sayfasının id'si>",
452
+ "name": "geri-yukle",
453
+ "slug": "geri-yukle",
454
+ "steps": [
455
+ {
456
+ "stepId": "start",
457
+ "name": "start",
458
+ "type": "start",
459
+ "kind": "normal",
460
+ "args": {},
461
+ "branches": [
462
+ {
463
+ "name": "always",
464
+ "nextStepId": "geri_yukle"
465
+ }
466
+ ]
467
+ },
468
+ {
469
+ "stepId": "geri_yukle",
470
+ "name": "geri_yukle",
471
+ "type": "restore-purchases",
472
+ "kind": "normal",
473
+ "args": {},
474
+ "branches": [
475
+ {
476
+ "name": "always",
477
+ "nextStepId": "geri_geldi"
478
+ },
479
+ {
480
+ "name": "error",
481
+ "nextStepId": "geri_olmadi"
482
+ }
483
+ ]
484
+ },
485
+ {
486
+ "stepId": "geri_geldi",
487
+ "name": "geri_geldi",
488
+ "type": "alert",
489
+ "kind": "normal",
490
+ "args": {
491
+ "message": "{{ Entitlements.premium ? 'Premium geri yüklendi' : 'Bu hesapta geri yüklenecek satın alma yok' }}",
492
+ "alertType": "info"
493
+ },
494
+ "branches": [
495
+ {
496
+ "name": "always",
497
+ "nextStepId": null
498
+ }
499
+ ]
500
+ },
501
+ {
502
+ "stepId": "geri_olmadi",
503
+ "name": "geri_olmadi",
504
+ "type": "alert",
505
+ "kind": "normal",
506
+ "args": {
507
+ "message": "Geri yükleme yapılamadı: {{ Steps.geri_yukle.error.message }}",
508
+ "alertType": "error"
509
+ },
510
+ "branches": [
511
+ {
512
+ "name": "always",
513
+ "nextStepId": null
514
+ }
515
+ ]
516
+ }
517
+ ],
518
+ "errorSteps": []
519
+ },
520
+ "purchaseFlowCreateArgs": {
521
+ "host": "page",
522
+ "hostId": "<teklif sayfasının id'si>",
523
+ "name": "satin-al",
524
+ "slug": "satin-al",
525
+ "steps": [
526
+ {
527
+ "stepId": "start",
528
+ "name": "start",
529
+ "type": "start",
530
+ "kind": "normal",
531
+ "args": {},
532
+ "branches": [
533
+ {
534
+ "name": "always",
535
+ "nextStepId": "satin_al"
536
+ }
537
+ ]
538
+ },
539
+ {
540
+ "stepId": "satin_al",
541
+ "name": "satin_al",
542
+ "type": "purchase",
543
+ "kind": "normal",
544
+ "args": {
545
+ "value": "{{ plan_secim.value }}"
546
+ },
547
+ "branches": [
548
+ {
549
+ "name": "always",
550
+ "nextStepId": "basari"
551
+ },
552
+ {
553
+ "name": "error",
554
+ "nextStepId": "durum"
555
+ }
556
+ ]
557
+ },
558
+ {
559
+ "stepId": "basari",
560
+ "name": "basari",
561
+ "type": "alert",
562
+ "kind": "normal",
563
+ "args": {
564
+ "message": "Premium açıldı, teşekkürler!",
565
+ "alertType": "success"
566
+ },
567
+ "branches": [
568
+ {
569
+ "name": "always",
570
+ "nextStepId": null
571
+ }
572
+ ]
573
+ },
574
+ {
575
+ "stepId": "durum",
576
+ "name": "durum",
577
+ "type": "condition",
578
+ "kind": "normal",
579
+ "args": {
580
+ "rules": [
581
+ {
582
+ "id": "01a16594-0000-7000-8000-0000000000c1",
583
+ "expression": "Steps.satin_al.error.status === 'pending'",
584
+ "type": "if"
585
+ },
586
+ {
587
+ "id": "01a16594-0000-7000-8000-0000000000c2",
588
+ "expression": "Steps.satin_al.error.status !== 'cancelled'",
589
+ "type": "else-if"
590
+ },
591
+ {
592
+ "id": "01a16594-0000-7000-8000-0000000000c3",
593
+ "expression": "",
594
+ "type": "else"
595
+ }
596
+ ]
597
+ },
598
+ "branches": [
599
+ {
600
+ "name": "01a16594-0000-7000-8000-0000000000c1",
601
+ "nextStepId": "bekliyor"
602
+ },
603
+ {
604
+ "name": "01a16594-0000-7000-8000-0000000000c2",
605
+ "nextStepId": "olmadi"
606
+ },
607
+ {
608
+ "name": "01a16594-0000-7000-8000-0000000000c3",
609
+ "nextStepId": null
610
+ }
611
+ ]
612
+ },
613
+ {
614
+ "stepId": "bekliyor",
615
+ "name": "bekliyor",
616
+ "type": "alert",
617
+ "kind": "normal",
618
+ "args": {
619
+ "message": "Ödeme onay bekliyor; onaylanınca Premium kendiliğinden açılır.",
620
+ "alertType": "warning"
621
+ },
622
+ "branches": [
623
+ {
624
+ "name": "always",
625
+ "nextStepId": null
626
+ }
627
+ ]
628
+ },
629
+ {
630
+ "stepId": "olmadi",
631
+ "name": "olmadi",
632
+ "type": "alert",
633
+ "kind": "normal",
634
+ "args": {
635
+ "message": "Satın alma tamamlanamadı: {{ Steps.satin_al.error.message }}",
636
+ "alertType": "error"
637
+ },
638
+ "branches": [
639
+ {
640
+ "name": "always",
641
+ "nextStepId": null
642
+ }
643
+ ]
644
+ }
645
+ ],
646
+ "errorSteps": []
647
+ },
648
+ "bindOps": [
649
+ {
650
+ "op": "set_event",
651
+ "target": "btn_devam",
652
+ "event": "click",
653
+ "eventValue": "<satin-al akış id>"
654
+ },
655
+ {
656
+ "op": "set_event",
657
+ "target": "btn_geri_yukle",
658
+ "event": "click",
659
+ "eventValue": "<geri-yukle akış id>"
660
+ }
661
+ ]
662
+ }
@@ -12,7 +12,7 @@
12
12
  "networkError": "Yanıt hiç alınamadıysa (bağlantı yok; saklanan okumalarda 8 sn süre sınırı da) ve kayıt yoksa adım hata dalına gider: Steps.<ad>.error.network true, status 503. 503'ü sunucu da döner — 'bağlantı yok' için network'e bakın (MOB-033 bilgi notu; status == 503 && !network sunucu arızasını ayıran doğru desendir, not almaz). network alanı yalnız veri önbelleği açık uygulamada yazılır. Saklanmayan isteklerde süre sınırı yoktur: yanıt vermeyen sunucuda adım bekler.",
13
13
  "stale": "Önbellek son başarılı yanıtı aynen verir: her çağrıda değişen bir GET (sayaç, zaman, rastgele) ağ yokken eski değerini döner. Parametreler ve veri dili isteğin parçasıdır; başka parametreli çağrı başka kayıttır.",
14
14
  "detailFromSteps": "Satırlar ve güncelleme satırı SETTER adımıyla yazılır: `{{ Steps.… }}` kod bağı ilk çizimde okunur, Steps'e yazmak düğümü yeniden okutmaz (mobile-list-detail-form ile aynı desen).",
15
- "preview": "Önizleme (/dev, Studio, page_screenshot) önbellek KULLANMAZ — ayar açık olsa da her okuma ağdan gider ve cache alanı hiç yazılmaz; güncelleme satırı önizlemede gizli kalır. page_screenshot ağı kesemez: çevrimdışı davranış yalnız cihazda (uçak modu) görülür.",
15
+ "preview": "Önizleme (/dev, Studio, page_screenshot) önbellek KULLANMAZ — ayar açık olsa da her okuma ağdan gider ve cache alanı hiç yazılmaz; güncelleme satırı önizlemede gizli kalır. page_screenshot network eylemiyle ağı keser (SCR-020) ama önbellek olmadığı için okuma hata yolundan döner; önbellekli davranış yalnız cihazda (uçak modu) görülür.",
16
16
  "verify": "page_runtime_get ile sayfa paketi ve akış okunur; page_screenshot({ applicationSlug: '<uygulama>', pageSlug: 'siparisler' }) satırları çizer, txt_guncelleme görünmez."
17
17
  },
18
18
  "pages": [
@@ -12,7 +12,7 @@
12
12
  "visibility": "Kaydın sonucu akışa dönmez. Bekleyen ve reddedilen sayısı Device.offline.queue = { pending, rejected }, reddedilenler Device.offline.rejected (id, service, at, status, code, message). Kod adımında Page.offline.list(), Page.offline.count(), Page.offline.sync() ve Page.offline.resolve(id, 'retry' | 'discard').",
13
13
  "sync": "Gönderim: bağlantının dönüşü, uygulamanın ön plana dönüşü ve ağla soğuk açılış. Sıra kuyruğa giriş zamanı; tek tek; 4xx kaydı reddeder ve sıra sürer, oturum (401/403), 408, 429, 5xx ve ağ hatası sırayı durdurur.",
14
14
  "limits": "Kuyruktaki kayda bağlı ikinci işlem yok: queued yolu Steps.<ad>.data okumaz (dönen kimliği bekleyen adım çevrimdışıyken koşamaz). Dosya parametreli çağrı kuyruğa girmez — adım error'a gider, Steps.<ad>.error.code = 'fileNotQueued'. Kayıt 7 günde gönderilemezse 'expired' ile reddedilir. Kayıtlar kullanıcıya bağlıdır: başkasının bekleyeni gönderilmez, çıkışta silinmez.",
15
- "preview": "Studio önizlemesi ve web çalışma zamanında kuyruk yoktur (barındırıcı depo vermez): queued dalı hiç koşmaz. page_screenshot ağı kesemez; davranış yalnız cihazda görülür. Açık ekran ilk çizildiği kopyayla kalır: akışa eklenen queued dalı ekran bir sonraki açılışta etkindir.",
15
+ "preview": "Studio önizlemesi ve web çalışma zamanında kuyruk yoktur (barındırıcı depo vermez): queued dalı hiç koşmaz. page_screenshot network eylemiyle ağı keser (SCR-020) ama yazma error dalından gider; kuyruklu davranış yalnız cihazda görülür. Açık ekran ilk çizildiği kopyayla kalır: akışa eklenen queued dalı ekran bir sonraki açılışta etkindir.",
16
16
  "verify": "microservice_get ile offlineWritable, flow_get ile queued dalı okunur. Cihazda: bağlantıyı kes, dozu işaretle (queued dalı koşar), bağlantıyı aç; row_list'te tek kayıt."
17
17
  },
18
18
  "microservicePatchArgs": {