@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.
- package/.env.example +2 -2
- package/.env.production.example +8 -0
- package/README.md +9 -8
- package/dist/config.js +18 -3
- package/dist/knowledge/backendConstraints.js +88 -0
- package/dist/knowledge/componentCatalog.js +415 -68
- package/dist/knowledge/componentEvents.js +120 -25
- package/dist/knowledge/functionGuards.js +134 -0
- package/dist/knowledge/normalize.js +512 -25
- package/dist/knowledge/outlines.js +31 -0
- package/dist/knowledge/policy.js +14 -5
- package/dist/knowledge/propTypes.js +5 -4
- package/dist/knowledge/rules.js +453 -6
- package/dist/knowledge/styleResolve.js +6 -1
- package/dist/platform/csv.js +123 -0
- package/dist/platform/errors.js +62 -3
- package/dist/platform/http.js +11 -2
- package/dist/platform/responses.js +16 -4
- package/dist/platform/screenshot.js +98 -9
- package/dist/platform/strictArguments.js +32 -0
- package/dist/platform/writeDiff.js +6 -3
- package/dist/resources/examples/flow-call-function.json +66 -0
- package/dist/resources/examples/function-total.json +70 -0
- package/dist/resources/examples/microfunction-node-sum.json +56 -0
- package/dist/resources/examples/page-dynamic-form.json +1 -1
- package/dist/resources/examples/page-sign-in.json +2 -2
- package/dist/resources/guides/component.md +14 -2
- package/dist/resources/guides/entity.md +321 -17
- package/dist/resources/guides/expressions.md +9 -0
- package/dist/resources/guides/functions.md +262 -0
- package/dist/resources/guides/getting-started.md +7 -0
- package/dist/resources/guides/layout.md +6 -0
- package/dist/resources/guides/merge.md +231 -0
- package/dist/resources/guides/microfunction.md +166 -0
- package/dist/resources/guides/microservice.md +166 -7
- package/dist/resources/guides/modify-existing.md +23 -0
- package/dist/resources/guides/page.md +101 -22
- package/dist/resources/guides/translation.md +35 -10
- package/dist/resources/guides/workflow.md +51 -2
- package/dist/resources/schema-fingerprint.json +4 -4
- package/dist/resources/schemas/AnalyzeImportQuery.json +51 -0
- package/dist/resources/schemas/ApplyMergePlanCommand.json +19 -0
- package/dist/resources/schemas/CreateBulkRowCommand.json +3 -0
- package/dist/resources/schemas/CreateEnvironmentCommand.json +31 -0
- package/dist/resources/schemas/CreateGlobalFunctionCommand.json +95 -0
- package/dist/resources/schemas/CreateImportPlanCommand.json +278 -0
- package/dist/resources/schemas/CreateMergePlanCommand.json +34 -0
- package/dist/resources/schemas/CreateMicrofunctionCommand.json +117 -0
- package/dist/resources/schemas/CreateMicrofunctionRuntimeCommand.json +51 -0
- package/dist/resources/schemas/CreateMicroserviceCommand.json +123 -2
- package/dist/resources/schemas/CreateWorkflowCommand.json +17 -3
- package/dist/resources/schemas/DataJobDto.json +267 -0
- package/dist/resources/schemas/ExportRowsCommand.json +172 -0
- package/dist/resources/schemas/Filter.json +3 -1
- package/dist/resources/schemas/GetRowsQuery.json +3 -1
- package/dist/resources/schemas/GlobalFunctionDto.json +89 -0
- package/dist/resources/schemas/GlobalFunctionUpdateResultDto.json +249 -0
- package/dist/resources/schemas/ImportAnalysisDto.json +401 -0
- package/dist/resources/schemas/ImportPlanDto.json +260 -0
- package/dist/resources/schemas/ImportSampleDto.json +90 -0
- package/dist/resources/schemas/InvokeMicrofunctionCommand.json +25 -0
- package/dist/resources/schemas/PreviewMicroserviceCommand.json +123 -2
- package/dist/resources/schemas/PreviewWorkflowCommand.json +17 -3
- package/dist/resources/schemas/ResolveMergeConflictsCommand.json +58 -0
- package/dist/resources/schemas/RevertMergePlanCommand.json +19 -0
- package/dist/resources/schemas/RunImportCommand.json +62 -0
- package/dist/resources/schemas/StepDto.json +17 -3
- package/dist/resources/schemas/UpdateBulkRowCommand.json +3 -0
- package/dist/resources/schemas/UpdateEntityCommand.json +3 -1
- package/dist/resources/schemas/UpdateGlobalFunctionCommand.json +66 -0
- package/dist/resources/schemas/UpdateMicrofunctionCommand.json +121 -0
- package/dist/resources/schemas/UpdateMicrofunctionRuntimeCommand.json +54 -0
- package/dist/resources/schemas/UpdateMicroserviceCommand.json +123 -2
- package/dist/resources/schemas/UpdateWorkflowCommand.json +17 -3
- package/dist/server.js +17 -4
- package/dist/tools/activities.js +40 -0
- package/dist/tools/automations.js +14 -5
- package/dist/tools/common.js +16 -0
- package/dist/tools/dependencies.js +1 -1
- package/dist/tools/environments.js +52 -0
- package/dist/tools/files.js +51 -50
- package/dist/tools/flows.js +104 -5
- package/dist/tools/functions.js +331 -0
- package/dist/tools/importSchemas.js +79 -0
- package/dist/tools/imports.js +241 -0
- package/dist/tools/layouts.js +4 -4
- package/dist/tools/merges.js +113 -0
- package/dist/tools/microfunctions.js +155 -0
- package/dist/tools/microservices.js +112 -9
- package/dist/tools/pages.js +188 -66
- package/dist/tools/platformInfo.js +4 -1
- package/dist/tools/queries.js +72 -6
- package/dist/tools/revisions.js +94 -0
- package/dist/tools/rows.js +342 -22
- package/dist/tools/screenWrite.js +11 -2
- package/dist/tools/templates.js +32 -5
- package/dist/tools/workflows.js +28 -6
- 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
|
-
|
|
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
|
|
341
|
-
|
|
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: {
|
|
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
|
}
|