@appaflytech/zeyrek-ai-mcp 0.0.6 → 0.0.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (98) hide show
  1. package/.env.example +2 -2
  2. package/.env.production.example +8 -0
  3. package/README.md +9 -8
  4. package/dist/config.js +18 -3
  5. package/dist/knowledge/backendConstraints.js +88 -0
  6. package/dist/knowledge/componentCatalog.js +415 -68
  7. package/dist/knowledge/componentEvents.js +120 -25
  8. package/dist/knowledge/functionGuards.js +134 -0
  9. package/dist/knowledge/normalize.js +512 -25
  10. package/dist/knowledge/outlines.js +31 -0
  11. package/dist/knowledge/policy.js +14 -5
  12. package/dist/knowledge/propTypes.js +5 -4
  13. package/dist/knowledge/rules.js +453 -6
  14. package/dist/knowledge/styleResolve.js +6 -1
  15. package/dist/platform/csv.js +123 -0
  16. package/dist/platform/errors.js +62 -3
  17. package/dist/platform/http.js +11 -2
  18. package/dist/platform/responses.js +16 -4
  19. package/dist/platform/screenshot.js +98 -9
  20. package/dist/platform/strictArguments.js +32 -0
  21. package/dist/platform/writeDiff.js +6 -3
  22. package/dist/resources/examples/flow-call-function.json +66 -0
  23. package/dist/resources/examples/function-total.json +70 -0
  24. package/dist/resources/examples/microfunction-node-sum.json +56 -0
  25. package/dist/resources/examples/page-dynamic-form.json +1 -1
  26. package/dist/resources/examples/page-sign-in.json +2 -2
  27. package/dist/resources/guides/component.md +14 -2
  28. package/dist/resources/guides/entity.md +321 -17
  29. package/dist/resources/guides/expressions.md +9 -0
  30. package/dist/resources/guides/functions.md +262 -0
  31. package/dist/resources/guides/getting-started.md +7 -0
  32. package/dist/resources/guides/layout.md +6 -0
  33. package/dist/resources/guides/merge.md +231 -0
  34. package/dist/resources/guides/microfunction.md +166 -0
  35. package/dist/resources/guides/microservice.md +166 -7
  36. package/dist/resources/guides/modify-existing.md +23 -0
  37. package/dist/resources/guides/page.md +101 -22
  38. package/dist/resources/guides/translation.md +35 -10
  39. package/dist/resources/guides/workflow.md +51 -2
  40. package/dist/resources/schema-fingerprint.json +4 -4
  41. package/dist/resources/schemas/AnalyzeImportQuery.json +51 -0
  42. package/dist/resources/schemas/ApplyMergePlanCommand.json +19 -0
  43. package/dist/resources/schemas/CreateBulkRowCommand.json +3 -0
  44. package/dist/resources/schemas/CreateEnvironmentCommand.json +31 -0
  45. package/dist/resources/schemas/CreateGlobalFunctionCommand.json +95 -0
  46. package/dist/resources/schemas/CreateImportPlanCommand.json +278 -0
  47. package/dist/resources/schemas/CreateMergePlanCommand.json +34 -0
  48. package/dist/resources/schemas/CreateMicrofunctionCommand.json +117 -0
  49. package/dist/resources/schemas/CreateMicrofunctionRuntimeCommand.json +51 -0
  50. package/dist/resources/schemas/CreateMicroserviceCommand.json +123 -2
  51. package/dist/resources/schemas/CreateWorkflowCommand.json +17 -3
  52. package/dist/resources/schemas/DataJobDto.json +267 -0
  53. package/dist/resources/schemas/ExportRowsCommand.json +172 -0
  54. package/dist/resources/schemas/Filter.json +3 -1
  55. package/dist/resources/schemas/GetRowsQuery.json +3 -1
  56. package/dist/resources/schemas/GlobalFunctionDto.json +89 -0
  57. package/dist/resources/schemas/GlobalFunctionUpdateResultDto.json +249 -0
  58. package/dist/resources/schemas/ImportAnalysisDto.json +401 -0
  59. package/dist/resources/schemas/ImportPlanDto.json +260 -0
  60. package/dist/resources/schemas/ImportSampleDto.json +90 -0
  61. package/dist/resources/schemas/InvokeMicrofunctionCommand.json +25 -0
  62. package/dist/resources/schemas/PreviewMicroserviceCommand.json +123 -2
  63. package/dist/resources/schemas/PreviewWorkflowCommand.json +17 -3
  64. package/dist/resources/schemas/ResolveMergeConflictsCommand.json +58 -0
  65. package/dist/resources/schemas/RevertMergePlanCommand.json +19 -0
  66. package/dist/resources/schemas/RunImportCommand.json +62 -0
  67. package/dist/resources/schemas/StepDto.json +17 -3
  68. package/dist/resources/schemas/UpdateBulkRowCommand.json +3 -0
  69. package/dist/resources/schemas/UpdateEntityCommand.json +3 -1
  70. package/dist/resources/schemas/UpdateGlobalFunctionCommand.json +66 -0
  71. package/dist/resources/schemas/UpdateMicrofunctionCommand.json +121 -0
  72. package/dist/resources/schemas/UpdateMicrofunctionRuntimeCommand.json +54 -0
  73. package/dist/resources/schemas/UpdateMicroserviceCommand.json +123 -2
  74. package/dist/resources/schemas/UpdateWorkflowCommand.json +17 -3
  75. package/dist/server.js +17 -4
  76. package/dist/tools/activities.js +40 -0
  77. package/dist/tools/automations.js +14 -5
  78. package/dist/tools/common.js +16 -0
  79. package/dist/tools/dependencies.js +1 -1
  80. package/dist/tools/environments.js +52 -0
  81. package/dist/tools/files.js +51 -50
  82. package/dist/tools/flows.js +104 -5
  83. package/dist/tools/functions.js +331 -0
  84. package/dist/tools/importSchemas.js +79 -0
  85. package/dist/tools/imports.js +241 -0
  86. package/dist/tools/layouts.js +4 -4
  87. package/dist/tools/merges.js +113 -0
  88. package/dist/tools/microfunctions.js +155 -0
  89. package/dist/tools/microservices.js +112 -9
  90. package/dist/tools/pages.js +188 -66
  91. package/dist/tools/platformInfo.js +4 -1
  92. package/dist/tools/queries.js +72 -6
  93. package/dist/tools/revisions.js +94 -0
  94. package/dist/tools/rows.js +342 -22
  95. package/dist/tools/screenWrite.js +11 -2
  96. package/dist/tools/templates.js +32 -5
  97. package/dist/tools/workflows.js +28 -6
  98. package/package.json +3 -1
@@ -76,11 +76,14 @@ const executeInput = {
76
76
  query: z.record(z.unknown()).optional(),
77
77
  body: z.union([z.record(z.unknown()), z.array(z.record(z.unknown()))]).optional()
78
78
  .describe('İstek gövdesi: tek nesne ya da nesne dizisi (bulk uçlar için)'),
79
+ parameters: z.record(z.unknown()).optional()
80
+ .describe("Ucun çağrı parametreleri (ad → değer) — query kaynaklı ucun sorgu parametreleri ve tablo ucunun filtreleri. Platform değeri body → query-string → header sırasıyla arar; gateway GET/DELETE'te query-string'e, POST/PUT'ta gövdeye koyar ve nereye koyduğunu gatewayNormalized ile söyler. Aynı ad 'query'/'body'de FARKLI değerle de verilirse çağrı gönderilmez. Boş string platformda NULL'a çevrilir."),
79
81
  headers: z.record(z.string()).optional().describe("İsteğe eklenecek header'lar. 'Authorization' verirseniz gateway KENDİ token'ını KOYMAZ — istek tamamen sizin kimliğinizle gider (middleware'li uçları üye token'ıyla test etmenin yolu budur)"),
80
82
  anonymous: z.boolean().optional().describe("true: istek HİÇBİR Authorization header'ı olmadan gider — 'korumalı uç tokensız ne döner?' sorusunun cevabı budur (korumalı uçtan 401, anonim uçtan 200 beklenir). Gateway normalde her çağrıya kendi token'ını koyduğu için bu bayrak olmadan anonim erişim testi yapılamaz."),
81
83
  asUser: asUserParam,
82
84
  cookies: cookiesParam,
83
- language: languageParam
85
+ language: languageParam,
86
+ expectFailure: z.boolean().optional().describe("true: bu çağrıda bir hata dönmesi BEKLENİYOR (kasıtlı negatif test — yanlış parola, yetkisiz erişim, geçersiz gövde). Yanıt yine httpStatus'u/hatayı taşır, ama ölçüm aracı bu satırı plansız hata saymaz (page_screenshot'taki expectFailure deseniyle aynı).")
84
87
  };
85
88
  /**
86
89
  * `anonymous` ile kimlik birlikte verilemez: biri kimliksiz isteği, diğeri belirli bir üyenin
@@ -132,6 +135,56 @@ async function middlewareChain(platform, project, environment, application, micr
132
135
  return { middlewareNote: `Middleware zinciri çözülemedi: ${error instanceof Error ? error.message : String(error)}. Uca bağlı middleware'leri microservice_get ile okuyabilirsiniz.` };
133
136
  }
134
137
  }
138
+ /**
139
+ * G-13 — üst düzey `parameters` isteğin platformun okuduğu yerine bağlanır.
140
+ *
141
+ * Platform çağrı parametresini `MicroserviceExecuteParameter.FindValue` ile body → query-string →
142
+ * header sırasıyla arar. GET/DELETE isteğinde gövde taşınmadığı için değer query-string'e, yazan
143
+ * yöntemde gövdeye (tek nesne) konur; gövdede tipi (sayı, bool) korunur. Aynı ad çağrıda iki
144
+ * farklı değerle geldiğinde hangisinin kazanacağını tahmin ettirmek yerine istek gönderilmez.
145
+ */
146
+ function bindCallParameters(method, parameters, query, body, notes) {
147
+ const names = Object.keys(parameters ?? {});
148
+ if (parameters === undefined || names.length === 0)
149
+ return { query, body };
150
+ const intoQuery = method === 'GET' || method === 'DELETE';
151
+ if (!intoQuery && Array.isArray(body)) {
152
+ throw new PlatformApiError(`parameters (${names.join(', ')}) ${method} isteğinde gövdeye bağlanır, ama body bir DİZİ (bulk). Platform parametreyi yalnız gövdenin İLK öğesinden okur — değerleri body[0]'a yazın ya da parameters'ı kaldırın.`, 400);
153
+ }
154
+ const target = (intoQuery ? query : body) ?? {};
155
+ const conflicts = names.filter(name => name in target && JSON.stringify(target[name]) !== JSON.stringify(parameters[name]));
156
+ if (conflicts.length > 0) {
157
+ throw new PlatformApiError(`parameters ile ${intoQuery ? 'query' : 'body'} aynı adı farklı değerle taşıyor: ${conflicts.map(name => `'${name}'`).join(', ')}. Değeri tek yerde verin.`, 400);
158
+ }
159
+ const merged = { ...target, ...parameters };
160
+ notes.push(`parameters ${intoQuery ? "query-string'e" : 'gövdeye'} bağlandı (${method}): ${names.join(', ')}`);
161
+ return intoQuery ? { query: merged, body } : { query, body: merged };
162
+ }
163
+ /**
164
+ * Debug ağacında query düğümünün parametre satırı değer NULL bağlandığında `value` taşır ama
165
+ * gateway yanıtı `prune` ile null alanlardan temizlediği için satır ANAHTARSIZ görünür — G-13'te
166
+ * kökü veren tek iz bu yokluktu. Yokluğu okumak zorunda kalmamak için satırlar adıyla listelenir.
167
+ */
168
+ function unboundQueryParameters(value, into = []) {
169
+ if (Array.isArray(value)) {
170
+ for (const entry of value)
171
+ unboundQueryParameters(entry, into);
172
+ return into;
173
+ }
174
+ if (!value || typeof value !== 'object')
175
+ return into;
176
+ const node = value;
177
+ if (node.type === 'query' && Array.isArray(node.input)) {
178
+ for (const row of node.input) {
179
+ if (row?.source === 'query' && row.member === 'parameter' && (row.value === null || row.value === undefined || row.value === '')) {
180
+ into.push({ step: String(node.name ?? '(adsız query)'), parameter: String(row.expression ?? '') });
181
+ }
182
+ }
183
+ }
184
+ for (const entry of Object.values(node))
185
+ unboundQueryParameters(entry, into);
186
+ return into;
187
+ }
135
188
  function executePath(prefix, application, microservice, routeParams) {
136
189
  const routeSuffix = routeParams && routeParams.length > 0
137
190
  ? `/${routeParams.map(encodeURIComponent).join('/')}`
@@ -324,21 +377,33 @@ export function registerMicroserviceTools(server, platform) {
324
377
  description: "Kayıtlı microservice'i gerçek runtime yolundan çalıştırır (POST /{project}/m/{application}/{microservice SLUG'ı}). Dönen httpStatus microservice'in kendi sonucudur (hata da geçerli çıktıdır); beklenmedik sonuçta microservice_debug ile adım adım inceleyin. Anonim erişim testi için anonymous: true. Yanıt 'headers' alanında platformun döndüğü header'ları taşır (küçük harf; ör. headers['total-count'] — sayfalı tablo akışlarının okuduğu sözleşme; set-cookie/authorization elenir).",
325
378
  inputSchema: executeInput,
326
379
  annotations: writes
327
- }, handle(config, async ({ project, environment, application, microservice, method, routeParams, query, body, headers, anonymous, asUser, cookies, language }) => {
380
+ }, handle(config, async ({ project, environment, application, microservice, method, routeParams, query, body, parameters, headers, anonymous, asUser, cookies, language }) => {
328
381
  const notes = [];
329
382
  const requestHeaders = { ...runIdentity(anonymous, asUser, cookies, headers), ...languageHeader(language, notes) };
330
- return withNormalization(await platform.tenantRaw(method, project, executePath('m', application, microservice, routeParams), { environment, query, body, headers: requestHeaders, anonymous, mirrorAuthorizationCookie: true }), notes);
383
+ const bound = bindCallParameters(method, parameters, query, body, notes);
384
+ return withNormalization(await platform.tenantRaw(method, project, executePath('m', application, microservice, routeParams), { environment, query: bound.query, body: bound.body, headers: requestHeaders, anonymous, mirrorAuthorizationCookie: true }), notes);
331
385
  }));
332
386
  server.registerTool('microservice_debug', {
333
387
  title: 'Microservice debug',
334
- description: "Microservice'i debug modunda çalıştırır; yanıtta adım adım executionItems ağacı döner (her adımın girdi/çıktısı). executionItems YALNIZ ucun kendi adımlarını kapsar — ucun ÖNÜNDE koşan middleware'ler ayrıca 'middlewares' alanında adım özetiyle listelenir (09-04 Y-04).",
388
+ description: "Microservice'i debug modunda çalıştırır; yanıtta adım adım executionItems ağacı döner (her adımın girdi/çıktısı). executionItems YALNIZ ucun kendi adımlarını kapsar — ucun ÖNÜNDE koşan middleware'ler ayrıca 'middlewares' alanında adım özetiyle listelenir (09-04 Y-04). Değeri NULL bağlanan query parametreleri 'unboundParameters' alanında adıyla listelenir (ağaçta bu satırların value anahtarı görünmez).",
335
389
  inputSchema: executeInput,
336
390
  annotations: writes
337
- }, handle(config, async ({ project, environment, application, microservice, method, routeParams, query, body, headers, anonymous, asUser, cookies, language }) => {
391
+ }, handle(config, async ({ project, environment, application, microservice, method, routeParams, query, body, parameters, headers, anonymous, asUser, cookies, language }) => {
338
392
  const notes = [];
339
393
  const requestHeaders = { ...runIdentity(anonymous, asUser, cookies, headers), ...languageHeader(language, notes) };
340
- const payload = await platform.tenantRaw(method, project, executePath('debug', application, microservice, routeParams), { environment, query, body, headers: requestHeaders, anonymous, mirrorAuthorizationCookie: true });
341
- return withNormalization({ ...payload, ...await middlewareChain(platform, project, environment, application, microservice, payload?.httpStatus) }, notes);
394
+ const bound = bindCallParameters(method, parameters, query, body, notes);
395
+ const payload = await platform.tenantRaw(method, project, executePath('debug', application, microservice, routeParams), { environment, query: bound.query, body: bound.body, headers: requestHeaders, anonymous, mirrorAuthorizationCookie: true });
396
+ const unbound = unboundQueryParameters(payload.body);
397
+ return withNormalization({
398
+ ...payload,
399
+ ...(unbound.length > 0
400
+ ? {
401
+ unboundParameters: unbound,
402
+ unboundParametersNote: "Bu query parametreleri NULL bağlandı: çağrıda yoklar ya da değerleri boş string'di (platform boş string'i NULL'a çevirir). Parametreyi 'parameters' (ya da GET'te 'query', POST/PUT'ta 'body') ile verin; ad sorgunun parametre adıyla birebir aynı olmalı."
403
+ }
404
+ : {}),
405
+ ...await middlewareChain(platform, project, environment, application, microservice, payload.httpStatus)
406
+ }, notes);
342
407
  }));
343
408
  server.registerTool('microservice_preview', {
344
409
  title: 'Microservice önizle',
@@ -382,8 +447,46 @@ export function registerMicroserviceTools(server, platform) {
382
447
  }));
383
448
  server.registerTool('microservice_job_history', {
384
449
  title: 'Job geçmişi',
385
- description: 'Zamanlanmış (job tipli) microservice\'in çalışma geçmişini listeler.',
386
- inputSchema: { project: projectParam, environment: environmentParam, id: guid, ...pagingParams },
450
+ description: 'Zamanlanmış (job tipli) microservice\'in çalışma geçmişini listeler. status ile yalnız running | completed | failed koşular süzülür; order TriggeredAt | CompletedAt | ExecutionStatus | DurationMs.',
451
+ inputSchema: {
452
+ project: projectParam,
453
+ environment: environmentParam,
454
+ id: guid,
455
+ status: z.enum(['running', 'completed', 'failed']).optional().describe('Yalnız bu durumdaki koşular'),
456
+ ...pagingParams
457
+ },
387
458
  annotations: readOnly
388
459
  }, handle(config, ({ project, environment, id, ...query }) => platform.tenant('GET', project, `/microservices/${id}/job-history`, { environment, query })));
460
+ server.registerTool('microservice_schedule_get', {
461
+ title: 'Zamanlama durumu',
462
+ description: 'Zamanlanmış (schedule-job) microservice\'in canlı zamanlama durumunu döner: state (scheduled | paused | notScheduled | error | ended), isRunning, nextFireTimeUtc, previousFireTimeUtc, sıradaki 5 koşu (upcomingFireTimesUtc), cron + timeZoneId, serverTimeUtc ve son koşunun özeti (lastExecution). "Bir sonraki sefer ne zaman koşacak?" sorusunu cron\'u yorumlamadan buradan cevaplayın. paused iken nextFireTimeUtc null ve upcoming boştur. notScheduled: kayıt var ama zamanlayıcıda trigger yok — en geç 5 dk içinde uzlaştırma kurar ya da servisi kaydedin (microservice_update). ended: tanımın sonraki koşusu yok (once geçti, end on/after doldu). schedule alanı tanımın kendisidir. Schedule tipli olmayan servis 400 döner.',
463
+ inputSchema: { project: projectParam, environment: environmentParam, id: guid },
464
+ annotations: readOnly
465
+ }, handle(config, ({ project, environment, id }) => platform.tenant('GET', project, `/microservices/${id}/schedule`, { environment })));
466
+ server.registerTool('microservice_schedule_forecast', {
467
+ title: 'Zamanlama öngörüsü',
468
+ description: 'Bir zamanlama tanımını (typeParameters.schedule biçimi) KAYDETMEDEN doğrular ve sıradaki 5 koşuyu UTC olarak döner: { isValid, errors[{property,message}], upcomingFireTimesUtc[] }. microservice_create/update öncesi tanımın beklenen saatlerde koştuğunu buradan görün; alan listesi için platform_guide(\'microservice\') §Zamanlanmış iş.',
469
+ inputSchema: {
470
+ project: projectParam,
471
+ environment: environmentParam,
472
+ schedule: z.record(z.unknown()).describe('ScheduleDefinition: mode, timeZoneId, startAt, every, unit, timeOfDay, daysOfWeek, daysOfMonth, cronExpression, end')
473
+ },
474
+ annotations: readOnly
475
+ }, handle(config, ({ project, environment, schedule }) => platform.tenant('POST', project, '/microservices/schedule/preview', { environment, body: { schedule } })));
476
+ server.registerTool('microservice_schedule_control', {
477
+ title: 'Zamanlamayı yönet',
478
+ description: 'Zamanlanmış microservice\'i duraklatır (pause), sürdürür (resume) ya da cron\'u beklemeden bir kez koşturur (trigger). pause/resume yalnız zamanlayıcıdaki durumu değiştirir, tanımı değil; duraklatma cron güncellemesi ve deployment senkronundan sonra da korunur. resume: duraklatılmışken bir koşu kaçırıldıysa iş bir kez hemen koşar. trigger KUYRUĞA ALIR, sonucu beklemez: deployment ya da template kurulumu sürüyorsa koşu veto edilir ve geçmişe hiç düşmez — sonucu microservice_job_history ile doğrulayın. Zamanlayıcıda kaydı olmayan iş 400 (ScheduleJobNotRegisteredException) döner. Production ortamında üç eylem de 400 CantWriteInProductionException ile reddedilir; trigger ayrıca deployment/template kurulumu sürerken reddedilir.',
479
+ inputSchema: {
480
+ project: projectParam,
481
+ environment: environmentParam,
482
+ id: guid,
483
+ action: z.enum(['pause', 'resume', 'trigger']).describe('pause | resume | trigger')
484
+ },
485
+ annotations: writes
486
+ }, handle(config, async ({ project, environment, id, action }) => {
487
+ await platform.tenant('POST', project, `/microservices/${id}/schedule/${action}`, { environment });
488
+ return action === 'trigger'
489
+ ? { action, accepted: true, note: 'Kuyruğa alındı; koşuyu microservice_job_history ile doğrulayın.' }
490
+ : { action, accepted: true, note: 'Güncel durum için microservice_schedule_get.' };
491
+ }));
389
492
  }