@appaflytech/zeyrek-ai-mcp 0.0.5 → 0.0.7

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 (145) hide show
  1. package/.env.example +2 -2
  2. package/.env.production.example +9 -1
  3. package/README.md +14 -38
  4. package/dist/config.js +36 -3
  5. package/dist/knowledge/backendConstraints.js +982 -0
  6. package/dist/knowledge/componentCatalog.js +549 -92
  7. package/dist/knowledge/componentEvents.js +120 -25
  8. package/dist/knowledge/coverage.js +43 -0
  9. package/dist/knowledge/flowGuards.js +30 -0
  10. package/dist/knowledge/functionGuards.js +134 -0
  11. package/dist/knowledge/guideSections.js +49 -0
  12. package/dist/knowledge/hydrate.js +97 -0
  13. package/dist/knowledge/languageCodes.js +36 -0
  14. package/dist/knowledge/languages.js +105 -0
  15. package/dist/knowledge/layoutSummary.js +10 -0
  16. package/dist/knowledge/localization.js +51 -0
  17. package/dist/knowledge/normalize.js +500 -16
  18. package/dist/knowledge/outlines.js +167 -12
  19. package/dist/knowledge/policy.js +14 -5
  20. package/dist/knowledge/propTypes.js +80 -0
  21. package/dist/knowledge/rules.js +961 -44
  22. package/dist/knowledge/schemaGuard.js +199 -0
  23. package/dist/knowledge/styleResolve.js +63 -4
  24. package/dist/observability/trace.js +27 -3
  25. package/dist/platform/csv.js +123 -0
  26. package/dist/platform/errors.js +107 -6
  27. package/dist/platform/http.js +34 -4
  28. package/dist/platform/patch.js +27 -0
  29. package/dist/platform/refs.js +104 -0
  30. package/dist/platform/responses.js +25 -6
  31. package/dist/platform/screenshot.js +544 -16
  32. package/dist/platform/secrets.js +40 -0
  33. package/dist/platform/tokenVault.js +89 -0
  34. package/dist/platform/writeDiff.js +281 -0
  35. package/dist/resources/examples/flow-call-function.json +66 -0
  36. package/dist/resources/examples/function-total.json +70 -0
  37. package/dist/resources/examples/layout-app-shell.json +1 -1
  38. package/dist/resources/examples/microfunction-node-sum.json +56 -0
  39. package/dist/resources/examples/microservice-table-list.json +2 -4
  40. package/dist/resources/examples/page-dynamic-form.json +3 -3
  41. package/dist/resources/examples/page-flex-sections.json +99 -0
  42. package/dist/resources/examples/page-sign-in.json +4 -3
  43. package/dist/resources/guides/component.md +81 -8
  44. package/dist/resources/guides/entity.md +712 -20
  45. package/dist/resources/guides/expressions.md +47 -2
  46. package/dist/resources/guides/external-component.md +9 -0
  47. package/dist/resources/guides/functions.md +262 -0
  48. package/dist/resources/guides/getting-started.md +82 -7
  49. package/dist/resources/guides/layout.md +53 -10
  50. package/dist/resources/guides/merge.md +231 -0
  51. package/dist/resources/guides/microfunction.md +166 -0
  52. package/dist/resources/guides/microservice.md +287 -15
  53. package/dist/resources/guides/middleware.md +89 -1
  54. package/dist/resources/guides/modify-existing.md +23 -0
  55. package/dist/resources/guides/page.md +402 -49
  56. package/dist/resources/guides/translation.md +150 -8
  57. package/dist/resources/guides/view.md +16 -1
  58. package/dist/resources/guides/workflow.md +199 -28
  59. package/dist/resources/knowledge.js +5 -0
  60. package/dist/resources/rules.js +27 -0
  61. package/dist/resources/schema-fingerprint.json +8 -0
  62. package/dist/resources/schemas/AnalyzeImportQuery.json +51 -0
  63. package/dist/resources/schemas/ApplyMergePlanCommand.json +19 -0
  64. package/dist/resources/schemas/CreateBulkRowCommand.json +36 -0
  65. package/dist/resources/schemas/CreateDatasourceCommand.json +15 -6
  66. package/dist/resources/schemas/CreateDiscoveredEntitiesCommand.json +19 -8
  67. package/dist/resources/schemas/CreateEntityCommand.json +52 -12
  68. package/dist/resources/schemas/CreateEnvironmentCommand.json +31 -0
  69. package/dist/resources/schemas/CreateGlobalFunctionCommand.json +95 -0
  70. package/dist/resources/schemas/CreateImportPlanCommand.json +278 -0
  71. package/dist/resources/schemas/CreateMergePlanCommand.json +34 -0
  72. package/dist/resources/schemas/CreateMicrofunctionCommand.json +117 -0
  73. package/dist/resources/schemas/CreateMicrofunctionRuntimeCommand.json +51 -0
  74. package/dist/resources/schemas/CreateMicroserviceCommand.json +145 -3
  75. package/dist/resources/schemas/CreateQueryCommand.json +56 -3
  76. package/dist/resources/schemas/CreateRowCommand.json +38 -0
  77. package/dist/resources/schemas/CreateViewCommand.json +13 -10
  78. package/dist/resources/schemas/CreateWorkflowCommand.json +106 -14
  79. package/dist/resources/schemas/DataJobDto.json +267 -0
  80. package/dist/resources/schemas/ExportRowsCommand.json +172 -0
  81. package/dist/resources/schemas/Filter.json +3 -1
  82. package/dist/resources/schemas/GetRowsQuery.json +6 -1
  83. package/dist/resources/schemas/GlobalFunctionDto.json +89 -0
  84. package/dist/resources/schemas/GlobalFunctionUpdateResultDto.json +249 -0
  85. package/dist/resources/schemas/ImportAnalysisDto.json +401 -0
  86. package/dist/resources/schemas/ImportPlanDto.json +260 -0
  87. package/dist/resources/schemas/ImportSampleDto.json +90 -0
  88. package/dist/resources/schemas/InvokeMicrofunctionCommand.json +25 -0
  89. package/dist/resources/schemas/PreviewMicroserviceCommand.json +135 -1
  90. package/dist/resources/schemas/PreviewQueryCommand.json +5 -2
  91. package/dist/resources/schemas/PreviewWorkflowCommand.json +45 -9
  92. package/dist/resources/schemas/ResolveMergeConflictsCommand.json +58 -0
  93. package/dist/resources/schemas/RevertMergePlanCommand.json +19 -0
  94. package/dist/resources/schemas/RunImportCommand.json +62 -0
  95. package/dist/resources/schemas/StepDto.json +34 -3
  96. package/dist/resources/schemas/UpdateBulkRowCommand.json +36 -0
  97. package/dist/resources/schemas/UpdateDatasourceCommand.json +15 -6
  98. package/dist/resources/schemas/UpdateEntityCommand.json +52 -11
  99. package/dist/resources/schemas/UpdateGlobalFunctionCommand.json +66 -0
  100. package/dist/resources/schemas/UpdateMicrofunctionCommand.json +121 -0
  101. package/dist/resources/schemas/UpdateMicrofunctionRuntimeCommand.json +54 -0
  102. package/dist/resources/schemas/UpdateMicroserviceCommand.json +147 -4
  103. package/dist/resources/schemas/UpdateQueryCommand.json +13 -3
  104. package/dist/resources/schemas/UpdateRowCommand.json +40 -0
  105. package/dist/resources/schemas/UpdateViewCommand.json +15 -10
  106. package/dist/resources/schemas/UpdateWorkflowCommand.json +106 -14
  107. package/dist/server.js +17 -1
  108. package/dist/tools/access.js +3 -3
  109. package/dist/tools/activities.js +40 -0
  110. package/dist/tools/applications.js +1 -1
  111. package/dist/tools/automations.js +76 -34
  112. package/dist/tools/common.js +55 -0
  113. package/dist/tools/components.js +16 -7
  114. package/dist/tools/datasources.js +83 -21
  115. package/dist/tools/dependencies.js +1 -1
  116. package/dist/tools/deployments.js +34 -2
  117. package/dist/tools/dtos.js +25 -12
  118. package/dist/tools/entities.js +113 -28
  119. package/dist/tools/environments.js +52 -0
  120. package/dist/tools/externalComponents.js +9 -3
  121. package/dist/tools/files.js +57 -42
  122. package/dist/tools/flows.js +205 -13
  123. package/dist/tools/folders.js +7 -2
  124. package/dist/tools/functions.js +331 -0
  125. package/dist/tools/globalFunctions.js +63 -0
  126. package/dist/tools/importSchemas.js +79 -0
  127. package/dist/tools/imports.js +241 -0
  128. package/dist/tools/layouts.js +103 -29
  129. package/dist/tools/merges.js +113 -0
  130. package/dist/tools/microfunctions.js +155 -0
  131. package/dist/tools/microservices.js +270 -40
  132. package/dist/tools/organizations.js +5 -6
  133. package/dist/tools/pages.js +421 -104
  134. package/dist/tools/platformInfo.js +155 -11
  135. package/dist/tools/projects.js +183 -33
  136. package/dist/tools/queries.js +32 -10
  137. package/dist/tools/revisions.js +94 -0
  138. package/dist/tools/rows.js +484 -50
  139. package/dist/tools/screenWrite.js +68 -0
  140. package/dist/tools/screens.js +28 -0
  141. package/dist/tools/templates.js +32 -5
  142. package/dist/tools/translations.js +24 -8
  143. package/dist/tools/views.js +20 -10
  144. package/dist/tools/workflows.js +56 -21
  145. package/package.json +7 -2
@@ -0,0 +1,105 @@
1
+ /**
2
+ * Projenin dil durumunu `project_get` / `/p/{slug}` yanıtından okur.
3
+ *
4
+ * `ProjectDto.Languages` null alanları serileştirmede DÜŞÜYOR: dili kurulmamış projede yanıtta
5
+ * `languages` diye bir anahtar hiç yok — "boş liste" bile görünmüyor (canlı doğrulama 2026-09-09,
6
+ * `mcp-benchmark-2026-09-09`). Ajan bu yüzden eksikliği fark edemiyordu; yokluk ile boş dizi
7
+ * runtime açısından aynı şeydir ve burada aynı şekilde temsil edilir.
8
+ *
9
+ * Alan var ama beklenmedik şekildeyse (dizi değilse) `undefined` döner: gateway o durumda
10
+ * SUSAR, "dil yok" diye uydurmaz.
11
+ */
12
+ export function readProjectLanguages(payload) {
13
+ const data = payload?.data;
14
+ if (!data || typeof data !== 'object')
15
+ return undefined;
16
+ const record = data;
17
+ const raw = record.languages;
18
+ if (raw !== undefined && raw !== null && !Array.isArray(raw))
19
+ return undefined;
20
+ const languages = Array.isArray(raw) ? raw.filter((entry) => typeof entry === 'string') : [];
21
+ const defaultLanguage = typeof record.defaultLanguage === 'string' && record.defaultLanguage !== ''
22
+ ? record.defaultLanguage
23
+ : undefined;
24
+ return { languages, defaultLanguage };
25
+ }
26
+ /**
27
+ * Dil verilmeden açılan projeye gateway'in tohumladığı ayar.
28
+ *
29
+ * Backend'in create ucu (`CreateOrganizationProjectCommand`) `Languages`/`DefaultLanguage` alanı
30
+ * TAŞIMAZ: proje ikisi de `null` doğar ve o hâlde yazılan her çeviri runtime'da ham anahtar olarak
31
+ * çizilir (`S-15`). Tohum bu durumu doğuştan imkânsız kılar.
32
+ *
33
+ * TEK DİL: ikinci bir dil tohumlamak `language-selector`'ı her yeni uygulamada iki seçenekle
34
+ * çizerdi ve ikincisi hep boş olurdu. Çok dilli uygulama kuran çağıran `languages`'ı açıkça verir.
35
+ *
36
+ * Backend de aynı tohumu kendi kurucusunda yazıyor (`ProjectConstants.DefaultLanguages`), ama o
37
+ * değişiklik dağıtılana kadar çalışan platform hâlâ dilsiz proje doğuruyor — gateway bu yüzden
38
+ * tohumu koşulsuz yazar. İki taraf aynı değeri tuttuğu için fazladan PUT zararsızdır; backend
39
+ * sürümü kesinleştiğinde bu adım yalnız `languages` açıkça verildiğinde koşacak şekilde daraltılır.
40
+ */
41
+ export const SEED_LANGUAGES = ['en'];
42
+ export const SEED_DEFAULT_LANGUAGE = 'en';
43
+ /**
44
+ * Çağıranın verdiğini olduğu gibi kullanır, eksiği tamamlar, hiçbiri yoksa tohumu döndürür.
45
+ * `defaultLanguage` her zaman `languages` içindedir — PRJ-002 bunu 422 ile zorunlu tutuyor.
46
+ */
47
+ export function resolveSeedLanguages(languages, defaultLanguage) {
48
+ if (!languages?.length && defaultLanguage === undefined) {
49
+ return { languages: SEED_LANGUAGES, defaultLanguage: SEED_DEFAULT_LANGUAGE, seeded: true };
50
+ }
51
+ const resolved = languages?.length ? languages : [defaultLanguage];
52
+ return { languages: resolved, defaultLanguage: defaultLanguage ?? resolved[0], seeded: false };
53
+ }
54
+ /** Runtime'ın çeviri çözümü kayıtlı bir aktif dil ya da varsayılan dil olmadan anahtara düşer. */
55
+ export function runtimeResolvesTranslations(state) {
56
+ return state.languages.length > 0 && state.defaultLanguage !== undefined;
57
+ }
58
+ const CHAIN = "runtime aktif dil → varsayılan dil → ANAHTARIN KENDİSİ zincirini izler (zeyrek-frontend/packages/ng-apps-screen-builder/src/translation.functions.ts, resolveTranslation); ilk iki halka boşsa ekrana çeviri değil ham anahtar basılır";
59
+ const WHY_SILENT = "Backend dil kodunu yalnız 184 kodluk ISO sözlüğüne göre doğruluyor (TR-001, ProjectConstants.SupportedLanguages), projenin kendi languages listesine göre DEĞİL — yazma bu yüzden 200 dönüyor ve hiçbir katman uyarmıyor.";
60
+ function quoted(codes) {
61
+ return codes.map(code => `'${code}'`).join(', ');
62
+ }
63
+ /**
64
+ * TR-002 — çeviri yazmasını projenin dil listesine bağlar.
65
+ *
66
+ * Ölçüm: 2026-09-09 1. koşu `S-15`. 15 anahtar × 2 dil yazıldı (200), 15 prop `translation` tipine
67
+ * bağlandı (200), şema doğru kuruldu — ama proje `languages` taşımadığı için runtime her etiketi
68
+ * ham anahtar olarak çizdi. Koşunun en pahalı sessiz düşmesiydi: yalnız ekrana bakınca görülüyor,
69
+ * rubrikte yanlış "tam" puanına mal oldu. Kontrol yazmayı DURDURMAZ (satırlar geçerli ve sonradan
70
+ * çözülebilir hale gelir), yüksek sesle söyler.
71
+ */
72
+ export function translationLanguageFindings(state, writtenCodes, projectSlug) {
73
+ const codes = [...new Set(writtenCodes)].sort();
74
+ // Proje okunamadıysa ya da çağrı yalnız silme yapıyorsa söylenecek bir şey yok.
75
+ if (!state || codes.length === 0)
76
+ return [];
77
+ const guide = 'ngapps://guides/translation';
78
+ if (state.languages.length === 0) {
79
+ return [{
80
+ ruleId: 'TR-002',
81
+ severity: 'warn',
82
+ message: `'${projectSlug}' projesinde 'languages' listesi TANIMLI DEĞİL: bu yazma platformda başarılı olacak ve satırlar veritabanına düşecek ama RUNTIME HİÇBİRİNİ ÇÖZEMEYECEK — ${CHAIN}. Yazılan kod: ${quoted(codes)}. Düzeltme (yazmadan önce ya da hemen sonra): project_update(id, languages: [${quoted(codes)}], defaultLanguage: '${codes[0]}'). ${WHY_SILENT}`,
83
+ guide
84
+ }];
85
+ }
86
+ const findings = [];
87
+ const undeclared = codes.filter(code => !state.languages.includes(code));
88
+ if (undeclared.length > 0) {
89
+ findings.push({
90
+ ruleId: 'TR-002',
91
+ severity: 'warn',
92
+ message: `${quoted(undeclared)} kodu '${projectSlug}' projesinin languages listesinde yok (tanımlı: ${quoted(state.languages)}): satırlar yazılır ama runtime o dile hiç geçemez, o dil seçiliyken ${CHAIN}. Düzeltme: project_update(id, languages: [${quoted([...state.languages, ...undeclared])}]). ${WHY_SILENT}`,
93
+ guide
94
+ });
95
+ }
96
+ if (state.defaultLanguage === undefined) {
97
+ findings.push({
98
+ ruleId: 'TR-002',
99
+ severity: 'warn',
100
+ message: `'${projectSlug}' projesinde languages kurulu (${quoted(state.languages)}) ama 'defaultLanguage' YOK: runtime kayıtlı bir dil seçimi bulamadığında varsayılana düşer, o da boş olduğu için aktif dil hiç seçilmez ve ilk açılışta her etiket ham anahtar olarak çizilir. Düzeltme: project_update(id, defaultLanguage: '${state.languages[0]}').`,
101
+ guide
102
+ });
103
+ }
104
+ return findings;
105
+ }
@@ -0,0 +1,10 @@
1
+ export function summarizeLayout(boxes, viewport) {
2
+ const outside = (box) => box.x + box.width <= 0 || box.y + box.height <= 0 || box.x >= viewport.width || box.y >= viewport.height;
3
+ return {
4
+ nodeCount: boxes.length,
5
+ overflowing: boxes.filter(box => box.overflowX || box.overflowY).map(box => box.elementId),
6
+ outsideViewport: boxes.filter(box => box.width > 0 && box.height > 0 && outside(box)).map(box => box.elementId),
7
+ zeroSized: boxes.filter(box => box.width === 0 || box.height === 0).map(box => box.elementId),
8
+ truncated: boxes.length >= 500
9
+ };
10
+ }
@@ -0,0 +1,51 @@
1
+ import { RefResolveError } from '../platform/refs.js';
2
+ /**
3
+ * FK slug'ı TAHMİN EDİLMEZ: rehber "satırı elle kurmadan önce mutlaka entity_get ile doğrula"
4
+ * diyor, gateway de aynısını yapar — companion'ın alanları arasında `relationId` ana entity'ye
5
+ * işaret edeni arar. Eşleşme yoksa uydurulmuş bir slug'la yanlış satır yazmaktansa hata verilir.
6
+ */
7
+ export async function findLocalizationCompanion(resolver, main) {
8
+ const companionSlug = `${main.slug}_localization`;
9
+ // Bağ ÖNCE id'den okunur: ad kalıbı ('{slug}_localization') platformun ürettiği kolaylıktır,
10
+ // sözleşme değil — companion yeniden adlandırılırsa slug yolu "companion yok" der ve ajan var
11
+ // olan bir entity'yi yeniden kurmaya çalışır. `localizationEntityId` entity'nin kendi alanıdır
12
+ // (b-03) ve entity_get onu döndürür; eski platform sürümünde boş gelir, o zaman slug yoluna
13
+ // düşülür.
14
+ const linkedId = await resolver.entityRecord(main)
15
+ .then(record => {
16
+ const value = record.localizationEntityId;
17
+ return typeof value === 'string' && value.length > 0 ? value : undefined;
18
+ })
19
+ .catch(() => undefined);
20
+ const companion = await (linkedId ? resolver.entity(linkedId) : Promise.reject(new RefResolveError('link yok')))
21
+ .catch(() => resolver.entity(companionSlug))
22
+ .catch((error) => {
23
+ // YALNIZ "yok" hâli dostane mesaja çevrilir; belirsizlik / HTTP / yetki hataları olduğu gibi
24
+ // geçer — hepsini "companion yok" diye yutmak ajana var olan bir entity'yi kurdurur.
25
+ if (error instanceof RefResolveError && /diye bir entity yok/.test(error.message)) {
26
+ throw new RefResolveError(`'${main.slug}' için companion entity yok — entity'de isLocalized alan yok ya da companion henüz kurulmadı (ne 'localizationEntityId' bağı ne de '${companionSlug}' adı bulundu). platform_guide('entity') §'Çoklu dilli alan'.`);
27
+ }
28
+ throw error;
29
+ });
30
+ const fields = await resolver.entityFields(companion);
31
+ const candidates = fields.filter(field => field.relationType !== 'none' && field.relationId === main.entityId);
32
+ const [fk] = candidates;
33
+ if (!fk) {
34
+ throw new RefResolveError(`'${companionSlug}' içinde relationId '${main.entityId}' olan bir ilişki alanı yok; FK tahmin edilmez. Alanlar: ${fields.map(field => field.slug).join(', ')}`);
35
+ }
36
+ if (candidates.length > 1) {
37
+ throw new RefResolveError(`'${companionSlug}' içinde '${main.slug}'a işaret eden birden çok ilişki alanı var (${candidates.map(field => field.slug).join(', ')}); hangisinin FK olduğu tahmin edilmez — dil satırlarını row_create ile elle yazın.`);
38
+ }
39
+ return { entityId: companion.entityId, datasourceId: companion.datasourceId, slug: companion.slug, fkSlug: fk.slug, languageSlug: 'language' };
40
+ }
41
+ export function localizationRows(companion, mainRowId, localizations) {
42
+ return Object.entries(localizations).map(([language, values]) => ({ [companion.fkSlug]: mainRowId, [companion.languageSlug]: language, ...values }));
43
+ }
44
+ /**
45
+ * Platform tanımadığı gövde alanını SESSİZCE düşürür; `X-Unmapped-Members` üretim dışı ortamda
46
+ * ilk tanınmayan alanın JSON yolunu döner. `localizations` orada görünüyorsa platform b-07 öncesi
47
+ * sürümdedir ve dil satırları hiç yazılmamıştır — gateway o zaman companion'a kendisi yazar.
48
+ */
49
+ export function platformIgnoredLocalizations(headers) {
50
+ return (headers['x-unmapped-members'] ?? '').split(/[.,\s]+/).some(segment => segment.toLowerCase() === 'localizations');
51
+ }