@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
package/dist/tools/queries.js
CHANGED
|
@@ -6,10 +6,57 @@ import { unmappedMembers, withUnmappedMembers } from '../knowledge/schemaGuard.j
|
|
|
6
6
|
import { handle } from '../platform/responses.js';
|
|
7
7
|
import { z } from 'zod';
|
|
8
8
|
import { evaluatePolicy, enforcePolicy, attachFindings } from '../knowledge/policy.js';
|
|
9
|
-
import { policyRules } from '../knowledge/rules.js';
|
|
9
|
+
import { policyRules, rawQueryParameterNames } from '../knowledge/rules.js';
|
|
10
|
+
import { PlatformApiError } from '../platform/errors.js';
|
|
10
11
|
import { constraintSummary } from '../knowledge/backendConstraints.js';
|
|
11
12
|
const policyOverrideParam = z.boolean().optional()
|
|
12
13
|
.describe('true: politika block bulgularını warn\'a indirir (bilinçli istisna; yanıtta işaretlenir)');
|
|
14
|
+
function inferredParameterType(value) {
|
|
15
|
+
if (typeof value === 'number')
|
|
16
|
+
return Number.isInteger(value) ? 'number' : 'float';
|
|
17
|
+
if (typeof value === 'boolean')
|
|
18
|
+
return 'bool';
|
|
19
|
+
if (Array.isArray(value))
|
|
20
|
+
return 'array';
|
|
21
|
+
if (value !== null && typeof value === 'object')
|
|
22
|
+
return 'object';
|
|
23
|
+
return 'text';
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* G-13 — `PreviewQueryCommand` değeri yalnız `parameters[].value`'dan okur; üst düzey `parameters`
|
|
27
|
+
* argümanı şemada yokken SDK tarafından hata vermeden atılıyordu ve sorgu NULL'la koşuyordu.
|
|
28
|
+
* Argüman artık komutun kendi alanına bağlanır.
|
|
29
|
+
*/
|
|
30
|
+
function bindPreviewParameters(definition, parameters, notes) {
|
|
31
|
+
const names = Object.keys(parameters ?? {});
|
|
32
|
+
if (parameters === undefined || names.length === 0)
|
|
33
|
+
return definition;
|
|
34
|
+
const rows = (Array.isArray(definition.parameters) ? definition.parameters : []);
|
|
35
|
+
const conflicts = names.filter(name => {
|
|
36
|
+
const row = rows.find(entry => entry?.name === name);
|
|
37
|
+
return row !== undefined && row.value !== undefined && JSON.stringify(row.value) !== JSON.stringify(parameters[name]);
|
|
38
|
+
});
|
|
39
|
+
if (conflicts.length > 0) {
|
|
40
|
+
throw new PlatformApiError(`parameters ile definition.parameters aynı adı farklı değerle taşıyor: ${conflicts.map(name => `'${name}'`).join(', ')}. Değeri tek yerde verin.`, 400);
|
|
41
|
+
}
|
|
42
|
+
const bound = rows.map(row => typeof row?.name === 'string' && row.name in parameters ? { ...row, value: parameters[row.name] } : row);
|
|
43
|
+
const added = names.filter(name => !rows.some(row => row?.name === name));
|
|
44
|
+
notes.push(`parameters definition.parameters[].value'ya bağlandı: ${names.join(', ')}${added.length > 0 ? ` (tipi değerden çıkarılıp eklenen satır: ${added.join(', ')})` : ''}`);
|
|
45
|
+
return {
|
|
46
|
+
...definition,
|
|
47
|
+
parameters: [...bound, ...added.map(name => ({ name, type: inferredParameterType(parameters[name]), value: parameters[name] }))]
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
/** `language` sayılmaz: platform `{{language}}` kullanan sorguya değeri kendisi ekler (`PreviewQueryCommand.cs`). */
|
|
51
|
+
function unboundPreviewParameters(definition) {
|
|
52
|
+
const rows = (Array.isArray(definition.parameters) ? definition.parameters : []);
|
|
53
|
+
return rawQueryParameterNames(definition.rawQuery)
|
|
54
|
+
.filter(name => name.toLowerCase() !== 'language')
|
|
55
|
+
.filter(name => {
|
|
56
|
+
const value = rows.find(row => row?.name === name)?.value;
|
|
57
|
+
return value === undefined || value === null || (typeof value === 'string' && value.trim() === '');
|
|
58
|
+
});
|
|
59
|
+
}
|
|
13
60
|
export function registerQueryTools(server, platform) {
|
|
14
61
|
const config = platform.config;
|
|
15
62
|
server.registerTool('query_list', {
|
|
@@ -26,7 +73,7 @@ export function registerQueryTools(server, platform) {
|
|
|
26
73
|
}, handle(config, ({ project, environment, id }) => platform.tenant('GET', project, `/queries/${id}`, { environment })));
|
|
27
74
|
server.registerTool('query_create', {
|
|
28
75
|
title: 'Query oluştur',
|
|
29
|
-
description: "Yeni query tanımlar (ham SQL). definition = CreateQueryCommand gövdesi. AGREGASYON VE RAPORLAMANIN YOLU BUDUR (SUM/COUNT/AVG/GROUP BY, dönemsel özet, KPI) — view_* bir TAM METİN ARAMA indeksidir, özet üretmez (09-02 M-3). VAR OLAN SATIRLARDAN TÜRETİLEN SATIR YAZMANIN DA YOLU BUDUR: 'INSERT … SELECT' kaydedip query kaynaklı bir uçtan çalıştırmak, geçmiş/hareket/junction tablosunu TEK çağrıda doldurur ve hiçbir id elle taşınmaz (ölçüldü 2026-09-07; reçete platform_guide('entity') §'Toplu ve türetilmiş satır'). Kayıt sırasında gövde bir kez ÇALIŞTIRILIR ama geri alınır — yazan sorguyu kaydetmek satır bırakmaz ve 'returnScheme' boş döner. Kayıtlı query'nin parametreleri parameterScheme ile tanımlanır ve runtime'da bağlanır; tüketimi source:'query' microservice'idir. PARAMETRENİN DEĞERİ HER ZAMAN ÇAĞRIDAN GELİR (body → query-string → header): parametreye ifade kaynağı verilemez (parameters[].source komut şemasında yoktur, platform sessizce atar) ve middleware'in kurduğu user bu yola girmez. Kimlik/tenant kapsamı sunucu tarafında zorlanacaksa sorguyu bir workflow query adımından çağırın — reçete platform_guide('microservice') §'Kimlik kapsaması × uç kaynağı'. BOŞ STRING parametre NULL'a çevrilir: '= @p' koşulu hiçbir satırla eşleşmez ve sorgu sessizce 0 satır döner — 'filtre yok' için (@p IS NULL OR ...) yazın ya da sentinel kullanın. Yorum içindeki belirteç parametre sayılmaz. SQL çalıştırılamazsa kayıt YİNE de oluşur: returnScheme boş kalır ve yanıttaki message nedeni söyler — SQL'i düzeltip query_update ile kaydedin. SORGUNUN KENDİ AÇIKLAMASI VAR: `description` alanını doldurun — sorgu listesinde ad ve slug dışında ipucu yoktur ve ucun açıklaması (MS-014) bunun yerine geçmez, çünkü bir sorgu birden çok uçtan tüketilir; boş bırakılırsa gateway `QRY-006` uyarısı düşürür (yazmayı durdurmaz). " + constraintSummary('CreateQueryCommand'),
|
|
76
|
+
description: "Yeni query tanımlar (ham SQL). definition = CreateQueryCommand gövdesi. AGREGASYON VE RAPORLAMANIN YOLU BUDUR (SUM/COUNT/AVG/GROUP BY, dönemsel özet, KPI) — view_* bir TAM METİN ARAMA indeksidir, özet üretmez (09-02 M-3). VAR OLAN SATIRLARDAN TÜRETİLEN SATIR YAZMANIN DA YOLU BUDUR: 'INSERT … SELECT' kaydedip query kaynaklı bir uçtan çalıştırmak, geçmiş/hareket/junction tablosunu TEK çağrıda doldurur ve hiçbir id elle taşınmaz (ölçüldü 2026-09-07; reçete platform_guide('entity') §'Toplu ve türetilmiş satır'). Kayıt sırasında gövde bir kez ÇALIŞTIRILIR ama geri alınır — yazan sorguyu kaydetmek satır bırakmaz ve 'returnScheme' boş döner. Kayıtlı query'nin parametreleri parameterScheme ile tanımlanır ve runtime'da bağlanır; tüketimi source:'query' microservice'idir. PARAMETRENİN DEĞERİ HER ZAMAN ÇAĞRIDAN GELİR (body → query-string → header): parametreye ifade kaynağı verilemez (parameters[].source komut şemasında yoktur, platform sessizce atar) ve middleware'in kurduğu user bu yola girmez. Kimlik/tenant kapsamı sunucu tarafında zorlanacaksa sorguyu bir workflow query adımından çağırın — reçete platform_guide('microservice') §'Kimlik kapsaması × uç kaynağı'. BOŞ STRING parametre NULL'a çevrilir: '= @p' koşulu hiçbir satırla eşleşmez ve sorgu sessizce 0 satır döner — 'filtre yok' için (@p IS NULL OR ...) yazın ya da sentinel kullanın; (@p = '' OR ...) kalıbı hiçbir zaman eşleşmez ve gateway `QRY-007` uyarısı düşürür. Yorum içindeki belirteç parametre sayılmaz. SQL çalıştırılamazsa kayıt YİNE de oluşur: returnScheme boş kalır ve yanıttaki message nedeni söyler — SQL'i düzeltip query_update ile kaydedin. SORGUNUN KENDİ AÇIKLAMASI VAR: `description` alanını doldurun — sorgu listesinde ad ve slug dışında ipucu yoktur ve ucun açıklaması (MS-014) bunun yerine geçmez, çünkü bir sorgu birden çok uçtan tüketilir; boş bırakılırsa gateway `QRY-006` uyarısı düşürür (yazmayı durdurmaz). " + constraintSummary('CreateQueryCommand'),
|
|
30
77
|
inputSchema: { project: projectParam, environment: environmentParam, definition: definitionParam, policyOverride: policyOverrideParam },
|
|
31
78
|
annotations: writes
|
|
32
79
|
}, handle(config, async ({ project, environment, definition, policyOverride }) => {
|
|
@@ -59,12 +106,31 @@ export function registerQueryTools(server, platform) {
|
|
|
59
106
|
server.registerTool('query_preview', {
|
|
60
107
|
title: 'Query önizle',
|
|
61
108
|
description: "Kaydedilmemiş query tanımını datasource üzerinde çalıştırır. definition = PreviewQueryCommand gövdesi. Preview ROLLBACK edilir: yazan bir sorgu (INSERT/UPDATE/DELETE) çalışır, affectedRowCount gerçek sayıyı döner ama SATIR KALMAZ (ölçüldü, 09-04 Y-19) — yazmayı doğrulamak için sorguyu kaydedip microservice/workflow üzerinden çalıştırın. YANITTA ROLLBACK İŞARETİ YOKTUR: 2026-09-07'de ölçüldü, yazan sorgunun yanıtı yalnız { affectedRowCount, elapsedMilliseconds } taşıyor — sayı başarı gibi görünür, tek kanıt sonradan row_list çekmektir. BOŞ STRING parametre NULL'a çevrilir (üç koşuda ölçüldü): '= @p' hiçbir satırla eşleşmez, 0 satır döner ve hata yoktur. Davranış kuralları: platform_guide('microservice'). " + constraintSummary('PreviewQueryCommand'),
|
|
62
|
-
inputSchema: {
|
|
109
|
+
inputSchema: {
|
|
110
|
+
project: projectParam,
|
|
111
|
+
environment: environmentParam,
|
|
112
|
+
datasourceId: guid,
|
|
113
|
+
definition: definitionParam,
|
|
114
|
+
parameters: z.record(z.unknown()).optional()
|
|
115
|
+
.describe("Önizleme değerleri (ad → değer). definition.parameters[] içindeki aynı adlı satırın value'suna yazılır; satır yoksa tipi değerden çıkarılarak eklenir (tam sayı → number, ondalık → float, true/false → bool, diğerleri → text). Aynı ad definition.parameters'ta FARKLI bir value ile de varsa çağrı gönderilmez."),
|
|
116
|
+
language: languageParam,
|
|
117
|
+
policyOverride: policyOverrideParam
|
|
118
|
+
},
|
|
63
119
|
annotations: writes
|
|
64
|
-
}, handle(config, async ({ project, environment, datasourceId, definition, language, policyOverride }) => {
|
|
65
|
-
const findings = enforcePolicy(evaluatePolicy(config, policyRules, 'query', definition, { operation: 'preview' }, policyOverride));
|
|
120
|
+
}, handle(config, async ({ project, environment, datasourceId, definition: given, parameters, language, policyOverride }) => {
|
|
66
121
|
const notes = [];
|
|
122
|
+
const definition = bindPreviewParameters(given, parameters, notes);
|
|
123
|
+
const findings = enforcePolicy(evaluatePolicy(config, policyRules, 'query', definition, { operation: 'preview' }, policyOverride));
|
|
67
124
|
const headers = languageHeader(language, notes);
|
|
68
|
-
|
|
125
|
+
const payload = await platform.tenant('POST', project, `/queries/${datasourceId}/preview`, { environment, body: definition, headers });
|
|
126
|
+
const unbound = unboundPreviewParameters(definition);
|
|
127
|
+
const withUnbound = unbound.length > 0 && payload && typeof payload === 'object' && !Array.isArray(payload)
|
|
128
|
+
? {
|
|
129
|
+
...payload,
|
|
130
|
+
unboundParameters: unbound,
|
|
131
|
+
unboundParametersNote: "rawQuery bu parametrelere başvuruyor ama değerleri yok ya da boş string (platform boş string'i NULL'a çevirir) — sorgu onları NULL ile koştu. Değeri üst düzey 'parameters' ya da definition.parameters[].value ile verin."
|
|
132
|
+
}
|
|
133
|
+
: payload;
|
|
134
|
+
return attachFindings(withNormalization(withUnbound, notes), findings);
|
|
69
135
|
}));
|
|
70
136
|
}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { guid, pagingParams, readOnly } from './common.js';
|
|
2
|
+
import { handle } from '../platform/responses.js';
|
|
3
|
+
import { z } from 'zod';
|
|
4
|
+
const revisionModule = z.enum([
|
|
5
|
+
'entity',
|
|
6
|
+
'query',
|
|
7
|
+
'view',
|
|
8
|
+
'data_transfer_object',
|
|
9
|
+
'microservice',
|
|
10
|
+
'workflow',
|
|
11
|
+
'flow',
|
|
12
|
+
'page',
|
|
13
|
+
'layout',
|
|
14
|
+
'component',
|
|
15
|
+
'variable',
|
|
16
|
+
'application',
|
|
17
|
+
'role',
|
|
18
|
+
'folder'
|
|
19
|
+
]).describe('Tanım türü; defter yalnız bu kökleri izler');
|
|
20
|
+
const environmentName = z.string().min(1).optional()
|
|
21
|
+
.describe("Ortam adı, ör. 'development' ya da bir dal adı; boşsa DEFAULT_ENVIRONMENT");
|
|
22
|
+
export function summarizeElements(elements) {
|
|
23
|
+
if (!Array.isArray(elements) || elements.length === 0)
|
|
24
|
+
return 'fark yok';
|
|
25
|
+
const lines = [];
|
|
26
|
+
for (const element of elements.slice(0, 20)) {
|
|
27
|
+
if (!element || typeof element !== 'object')
|
|
28
|
+
continue;
|
|
29
|
+
const { kind, label, path, before, after } = element;
|
|
30
|
+
const where = (typeof label === 'string' && label.length > 0 ? label : String(path ?? '')) || '(kök)';
|
|
31
|
+
const short = (value) => {
|
|
32
|
+
if (value === null || value === undefined)
|
|
33
|
+
return '—';
|
|
34
|
+
const text = typeof value === 'string' ? value : JSON.stringify(value);
|
|
35
|
+
return text.length > 60 ? `${text.slice(0, 57)}…` : text;
|
|
36
|
+
};
|
|
37
|
+
if (kind === 'add')
|
|
38
|
+
lines.push(`+ ${where} = ${short(after)}`);
|
|
39
|
+
else if (kind === 'delete')
|
|
40
|
+
lines.push(`- ${where} (${short(before)})`);
|
|
41
|
+
else
|
|
42
|
+
lines.push(`~ ${where}: ${short(before)} → ${short(after)}`);
|
|
43
|
+
}
|
|
44
|
+
if (elements.length > lines.length)
|
|
45
|
+
lines.push(`… ve ${elements.length - lines.length} değişiklik daha`);
|
|
46
|
+
return lines.join('\n');
|
|
47
|
+
}
|
|
48
|
+
export function registerRevisionTools(server, platform) {
|
|
49
|
+
const config = platform.config;
|
|
50
|
+
const defaultEnvironment = () => config.defaultEnvironment;
|
|
51
|
+
server.registerTool('revision_list', {
|
|
52
|
+
title: 'Tanım revizyonlarını listele',
|
|
53
|
+
description: "Bir ortamdaki tanım yazmalarını en yeniden eskiye listeler: hangi kayıt, kaçıncı revizyon, hangi işlem (create|update|delete), kim yaptı ve nereden geldi (source: studio|mcp|merge|deployment|template|revert|backfill). Gövde bu uçta DÖNMEZ — tek bir sürümün gövdesi için revision_get, iki sürüm arasındaki fark için revision_diff kullanın. source='mcp' satırları bu gateway üzerinden yapılan değişikliklerdir; bir kaydı değiştirmeden önce son revizyona bakmak, başka birinin üstüne yazmayı önler.",
|
|
54
|
+
inputSchema: {
|
|
55
|
+
projectId: guid,
|
|
56
|
+
environment: environmentName,
|
|
57
|
+
module: revisionModule.optional(),
|
|
58
|
+
recordId: guid.optional().describe('Tek bir tanım kaydının geçmişi'),
|
|
59
|
+
correlationId: z.string().min(1).optional().describe('Aynı komutun ya da merge activity id\'sinin yazdığı bütün revizyonlar'),
|
|
60
|
+
since: z.string().min(1).optional().describe("ISO tarih; bu andan sonraki revizyonlar"),
|
|
61
|
+
...pagingParams
|
|
62
|
+
},
|
|
63
|
+
annotations: readOnly
|
|
64
|
+
}, handle(config, ({ projectId, environment, ...rest }) => platform.org('GET', `/revisions/${projectId}`, { query: { environment: environment ?? defaultEnvironment(), ...rest } })));
|
|
65
|
+
server.registerTool('revision_get', {
|
|
66
|
+
title: 'Tek revizyonu gövdesiyle oku',
|
|
67
|
+
description: "Bir revizyonu tam gövdesiyle (payload) döner — kaydın o andaki hali, deployment ve merge'ün taşıdığı biçimin aynısı. Entity revizyonlarında ddlDelta o yazmada eklenen/değişen/silinen alan adlarını taşır. Büyük sayfalarda gövde MB'lar tutabilir ve yanıt kırpılır; ne değiştiğini anlamak için önce revision_diff deneyin.",
|
|
68
|
+
inputSchema: { projectId: guid, id: guid.describe('revision_list çıktısındaki satır id\'si') },
|
|
69
|
+
annotations: readOnly
|
|
70
|
+
}, handle(config, ({ projectId, id }) => platform.org('GET', `/revisions/${projectId}/${id}`)));
|
|
71
|
+
server.registerTool('revision_diff', {
|
|
72
|
+
title: 'İki revizyon arasındaki farkı al',
|
|
73
|
+
description: "Bir tanım kaydının iki sürümü arasındaki farkı alan bazlı döner: her satırda path, label, kind (add|update|delete) ve before/after değerleri. from/to boş bırakılırsa son iki revizyon karşılaştırılır. Yanıta ayrıca summaryText eklenir — farkın tek bakışta okunur özeti. Merge ekranıyla aynı diff motorunu kullanır.",
|
|
74
|
+
inputSchema: {
|
|
75
|
+
projectId: guid,
|
|
76
|
+
environment: environmentName,
|
|
77
|
+
module: revisionModule,
|
|
78
|
+
recordId: guid,
|
|
79
|
+
from: z.number().int().min(0).optional().describe('Başlangıç revizyon numarası'),
|
|
80
|
+
to: z.number().int().min(0).optional().describe('Bitiş revizyon numarası')
|
|
81
|
+
},
|
|
82
|
+
annotations: readOnly
|
|
83
|
+
}, handle(config, async ({ projectId, environment, ...rest }) => {
|
|
84
|
+
const payload = await platform.org('GET', `/revisions/${projectId}/diff`, {
|
|
85
|
+
query: { environment: environment ?? defaultEnvironment(), ...rest }
|
|
86
|
+
});
|
|
87
|
+
if (!payload || typeof payload !== 'object')
|
|
88
|
+
return payload;
|
|
89
|
+
const data = payload.data;
|
|
90
|
+
if (!data || typeof data !== 'object')
|
|
91
|
+
return payload;
|
|
92
|
+
return { ...payload, summaryText: summarizeElements(data.elements) };
|
|
93
|
+
}));
|
|
94
|
+
}
|