@appaflytech/zeyrek-ai-mcp 0.0.30 → 0.0.32
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 +0 -15
- package/README.md +5 -5
- package/dist/config.js +0 -37
- package/dist/index.js +0 -2
- package/dist/knowledge/backendConstraints.js +1 -18
- package/dist/knowledge/boxSections.js +184 -0
- package/dist/knowledge/componentCatalog.js +232 -562
- package/dist/knowledge/componentEvents.js +21 -141
- package/dist/knowledge/layoutSummary.js +2 -140
- package/dist/knowledge/normalize.js +67 -236
- package/dist/knowledge/outlines.js +0 -36
- package/dist/knowledge/policy.js +4 -18
- package/dist/knowledge/reservedTables.js +0 -79
- package/dist/knowledge/rules.js +21 -319
- package/dist/knowledge/schemaGuard.js +0 -11
- package/dist/knowledge/styleResolve.js +38 -55
- package/dist/knowledge/themeResolve.js +3 -3
- package/dist/observability/trace.js +3 -6
- package/dist/platform/diagnostics.js +4 -10
- package/dist/platform/domSummary.js +1 -1
- package/dist/platform/errors.js +10 -162
- package/dist/platform/http.js +8 -29
- package/dist/platform/responses.js +5 -39
- package/dist/platform/{capture/capture.js → screenshot.js} +519 -105
- package/dist/platform/secrets.js +1 -17
- package/dist/platform/strictArguments.js +12 -68
- package/dist/platform/tokenVault.js +4 -187
- package/dist/resources/examples/layout-app-shell.json +707 -229
- package/dist/resources/examples/page-detail-profile.json +1 -2
- package/dist/resources/examples/page-dynamic-form.json +2 -3
- package/dist/resources/examples/page-flex-sections.json +1 -1
- package/dist/resources/examples/page-html-embed.json +1 -1
- package/dist/resources/examples/workflow-basic.json +2 -8
- package/dist/resources/guides/component.md +4 -91
- package/dist/resources/guides/entity.md +8 -50
- package/dist/resources/guides/expressions.md +5 -14
- package/dist/resources/guides/functions.md +1 -1
- package/dist/resources/guides/getting-started.md +1 -38
- package/dist/resources/guides/layout.md +58 -55
- package/dist/resources/guides/microservice.md +2 -81
- package/dist/resources/guides/middleware.md +2 -44
- package/dist/resources/guides/page.md +75 -454
- package/dist/resources/guides/theme.md +2 -8
- package/dist/resources/guides/translation.md +1 -1
- package/dist/resources/guides/workflow.md +1 -58
- package/dist/resources/rules.js +5 -11
- package/dist/resources/schema-fingerprint.json +5 -7
- package/dist/resources/schemas/CreateEntityCommand.json +0 -118
- package/dist/resources/schemas/CreateMicroserviceCommand.json +1 -13
- package/dist/resources/schemas/CreateQueryCommand.json +0 -4
- package/dist/resources/schemas/CreateWorkflowCommand.json +1 -143
- package/dist/resources/schemas/DataJobDto.json +1 -6
- package/dist/resources/schemas/GlobalFunctionUpdateResultDto.json +1 -21
- package/dist/resources/schemas/MicroserviceDto.json +3 -15
- package/dist/resources/schemas/PreviewMicroserviceCommand.json +1 -10
- package/dist/resources/schemas/PreviewWorkflowCommand.json +1 -22
- package/dist/resources/schemas/StepDto.json +1 -22
- package/dist/resources/schemas/UpdateEntityCommand.json +0 -118
- package/dist/resources/schemas/UpdateMicroserviceCommand.json +1 -13
- package/dist/resources/schemas/UpdateQueryCommand.json +0 -4
- package/dist/resources/schemas/UpdateViewCommand.json +2 -0
- package/dist/resources/schemas/UpdateWorkflowCommand.json +1 -143
- package/dist/server.js +1 -27
- package/dist/tools/access.js +2 -369
- package/dist/tools/applications.js +3 -60
- package/dist/tools/common.js +0 -7
- package/dist/tools/components.js +14 -118
- package/dist/tools/datasources.js +3 -3
- package/dist/tools/dependencies.js +1 -1
- package/dist/tools/deployments.js +2 -2
- package/dist/tools/designSchemaPatch.js +18 -34
- package/dist/tools/dtos.js +5 -36
- package/dist/tools/entities.js +12 -79
- package/dist/tools/externalComponents.js +5 -26
- package/dist/tools/flows.js +14 -122
- package/dist/tools/folders.js +1 -1
- package/dist/tools/imports.js +2 -5
- package/dist/tools/layouts.js +17 -50
- package/dist/tools/merges.js +1 -1
- package/dist/tools/microservices.js +25 -77
- package/dist/tools/pages.js +112 -465
- package/dist/tools/platformInfo.js +8 -27
- package/dist/tools/projects.js +9 -71
- package/dist/tools/rows.js +13 -69
- package/dist/tools/schemaOps.js +1 -61
- package/dist/tools/screenWrite.js +8 -37
- package/dist/tools/screens.js +5 -95
- package/dist/tools/templates.js +1 -26
- package/dist/tools/translations.js +1 -1
- package/dist/tools/variables.js +5 -11
- package/dist/tools/workflows.js +5 -10
- package/package.json +2 -2
- package/dist/knowledge/access.js +0 -802
- package/dist/knowledge/case.js +0 -41
- package/dist/knowledge/connectDataBind.js +0 -819
- package/dist/knowledge/connectDataDefinition.js +0 -341
- package/dist/knowledge/connectDataExecute.js +0 -93
- package/dist/knowledge/connectDataRules.js +0 -128
- package/dist/knowledge/decision.js +0 -121
- package/dist/knowledge/expressionPrelude.js +0 -59
- package/dist/knowledge/microserviceParameters.js +0 -58
- package/dist/knowledge/mining.js +0 -94
- package/dist/knowledge/mobileComponentCatalog.js +0 -859
- package/dist/knowledge/mobileComponentEvents.js +0 -239
- package/dist/knowledge/platform/lint.js +0 -385
- package/dist/knowledge/platform/mobile.js +0 -142
- package/dist/knowledge/platform/mobileLayoutLint.js +0 -324
- package/dist/knowledge/platform/mobileRules.js +0 -231
- package/dist/knowledge/platform/mobileSpacing.js +0 -82
- package/dist/knowledge/platform/mobileTabs.js +0 -108
- package/dist/knowledge/platform/nativeBoxModel.js +0 -44
- package/dist/knowledge/platform/profile.js +0 -25
- package/dist/knowledge/platform/resolve.js +0 -122
- package/dist/knowledge/platform/web.js +0 -39
- package/dist/knowledge/process.js +0 -510
- package/dist/knowledge/rowFilter.js +0 -43
- package/dist/knowledge/styleResolveNative.js +0 -527
- package/dist/platform/argumentAliases.js +0 -128
- package/dist/platform/bodyFile.js +0 -103
- package/dist/platform/capture/actions.js +0 -333
- package/dist/platform/capture/browser.js +0 -1
- package/dist/platform/capture/console-log.js +0 -122
- package/dist/platform/capture/index.js +0 -11
- package/dist/platform/capture/readiness.js +0 -103
- package/dist/platform/capture/summary.js +0 -77
- package/dist/platform/capture/target.js +0 -5
- package/dist/platform/capture/targets/studio-mobile.js +0 -15
- package/dist/platform/capture/targets/studio-web.js +0 -5
- package/dist/platform/impersonation.js +0 -45
- package/dist/platform/jsonArray.js +0 -24
- package/dist/platform/schemaReadMemory.js +0 -60
- package/dist/resources/examples/bpm-gorev-kontrol.json +0 -294
- package/dist/resources/examples/bpm-iso-dokuman.json +0 -228
- package/dist/resources/examples/bpm-satinalma.json +0 -376
- package/dist/resources/examples/connect-data-convert-verify.json +0 -107
- package/dist/resources/examples/connect-data-dropdown-roles.json +0 -66
- package/dist/resources/examples/connect-data-edit-m2m.json +0 -73
- package/dist/resources/examples/connect-data-query-params.json +0 -50
- package/dist/resources/examples/connect-data-table-entity.json +0 -147
- package/dist/resources/examples/connect-data-workflow-microservice.json +0 -65
- package/dist/resources/examples/mobile-app-shell-drawer.json +0 -243
- package/dist/resources/examples/mobile-app-shell-stack.json +0 -157
- package/dist/resources/examples/mobile-app-shell-tab.json +0 -208
- package/dist/resources/examples/mobile-form-screen.json +0 -365
- package/dist/resources/examples/mobile-list-detail-form.json +0 -672
- package/dist/resources/guides/access.md +0 -796
- package/dist/resources/guides/bpm.md +0 -686
- package/dist/resources/guides/case.md +0 -153
- package/dist/resources/guides/decision.md +0 -185
- package/dist/resources/guides/mobile-layout.md +0 -193
- package/dist/resources/guides/mobile.md +0 -495
- package/dist/resources/read.js +0 -41
- package/dist/resources/schemas/AccessExplanationDto.json +0 -144
- package/dist/resources/schemas/AccessMatrixDto.json +0 -170
- package/dist/resources/schemas/AccessPermissionDto.json +0 -57
- package/dist/resources/schemas/AccessPolicyDto.json +0 -223
- package/dist/resources/schemas/AccessResourceDto.json +0 -86
- package/dist/resources/schemas/AppSessionDto.json +0 -53
- package/dist/resources/schemas/ConnectDataDescribeDto.json +0 -344
- package/dist/resources/schemas/ConnectDataRequestModel.json +0 -202
- package/dist/resources/schemas/ConnectDataResultDto.json +0 -421
- package/dist/resources/schemas/ConnectorCredentialDto.json +0 -70
- package/dist/resources/schemas/ConvertConnectDataToMicroserviceCommand.json +0 -37
- package/dist/resources/schemas/CreateAccessPolicyCommand.json +0 -209
- package/dist/resources/schemas/CreateDecisionCommand.json +0 -221
- package/dist/resources/schemas/CreateProcessDefinitionCommand.json +0 -1337
- package/dist/resources/schemas/DecisionDto.json +0 -302
- package/dist/resources/schemas/DetachConnectDataMicroserviceCommand.json +0 -28
- package/dist/resources/schemas/ExplainAccessQuery.json +0 -33
- package/dist/resources/schemas/GenerateProcessDocumentCommand.json +0 -116
- package/dist/resources/schemas/OrganizationProjectDto.json +0 -335
- package/dist/resources/schemas/OrganizationSchemaDto.json +0 -196
- package/dist/resources/schemas/OrganizationSchemaVersionDto.json +0 -207
- package/dist/resources/schemas/PatchProcessDefinitionCommand.json +0 -76
- package/dist/resources/schemas/ProcessDefinitionDto.json +0 -1480
- package/dist/resources/schemas/ProcessSimulationDto.json +0 -96
- package/dist/resources/schemas/SaveConnectorCredentialCommand.json +0 -90
- package/dist/resources/schemas/SaveProcessEventSourceCommand.json +0 -61
- package/dist/resources/schemas/SaveProcessMailSourceCommand.json +0 -89
- package/dist/resources/schemas/SignProcessTaskCommand.json +0 -73
- package/dist/resources/schemas/SimulateProcessDefinitionQuery.json +0 -92
- package/dist/resources/schemas/UpdateAccessPolicyCommand.json +0 -209
- package/dist/resources/schemas/UpdateDecisionCommand.json +0 -216
- package/dist/resources/schemas/UpdateProcessDefinitionCommand.json +0 -1357
- package/dist/resources/schemas/ValidateProcessDefinitionQuery.json +0 -1339
- package/dist/tools/accessOperations.js +0 -135
- package/dist/tools/accessPolicies.js +0 -170
- package/dist/tools/accessRuntime.js +0 -203
- package/dist/tools/bpm.js +0 -343
- package/dist/tools/bpmGovernance.js +0 -266
- package/dist/tools/bpmOperations.js +0 -230
- package/dist/tools/bpmReporting.js +0 -154
- package/dist/tools/bpmRouting.js +0 -150
- package/dist/tools/bpmRuntime.js +0 -396
- package/dist/tools/case.js +0 -178
- package/dist/tools/caseRuntime.js +0 -89
- package/dist/tools/connectData.js +0 -449
- package/dist/tools/connectors.js +0 -193
- package/dist/tools/decisions.js +0 -206
- package/dist/tools/mobile.js +0 -221
- package/dist/tools/modules.js +0 -48
- package/dist/tools/organizationStructure.js +0 -137
- package/dist/tools/profileWrite.js +0 -92
|
@@ -1,8 +1,6 @@
|
|
|
1
|
-
import { invalidScreenEventNames, invalidWidgetTypeNodes, nestedRepeaterNodes, nestedRepeaterMessage, blockSizeNote, heightTypeNote, sizeStringNote
|
|
2
|
-
import { catalogTypeRules, schemaCatalogErrors, schemaCatalogMessage } from '../knowledge/componentCatalog.js';
|
|
1
|
+
import { invalidScreenEventNames, invalidWidgetTypeNodes, nestedRepeaterNodes, nestedRepeaterMessage, blockSizeNote, heightTypeNote, sizeStringNote } from '../knowledge/normalize.js';
|
|
3
2
|
import { FUNCTIONS_NAMESPACE } from '../knowledge/functionGuards.js';
|
|
4
|
-
import {
|
|
5
|
-
import { applyCatalogLayoutRules, applyCatalogLayoutRulesFrom, fetchCatalogComponents } from './components.js';
|
|
3
|
+
import { applyCatalogLayoutRules } from './components.js';
|
|
6
4
|
import { PlatformApiError } from '../platform/errors.js';
|
|
7
5
|
const GUARD_CODES = {
|
|
8
6
|
page: { events: 'PAGE-011', widgets: 'PAGE-012', noun: 'sayfa', tree: 'schema' },
|
|
@@ -20,16 +18,11 @@ export function invalidComponentNames(nodes) {
|
|
|
20
18
|
if (typeof name === 'string' && name.length > 0 && !/^[A-Za-z_$][A-Za-z0-9_$]*$/.test(name.replace(/-/g, ''))) {
|
|
21
19
|
found.push(`'${name}' (${node.elementId ?? '?'})`);
|
|
22
20
|
}
|
|
23
|
-
else if (typeof name === 'string' &&
|
|
21
|
+
else if (typeof name === 'string' && name.replace(/-/g, '') === FUNCTIONS_NAMESPACE) {
|
|
24
22
|
// K1: preamble her komponent için `const <ad> = Components["<ad>"]` üretir; `Functions` adlı
|
|
25
23
|
// komponent kullanıcı fonksiyonlarının ad alanını ezer ve sayfadaki her Functions.x() ölür.
|
|
26
24
|
found.push(`'${name}' (${node.elementId ?? '?'}) — ayrılmış ad: ${FUNCTIONS_NAMESPACE} kullanıcı fonksiyonlarının ad alanıdır (K1)`);
|
|
27
25
|
}
|
|
28
|
-
else if (typeof name === 'string' && reservedExpressionName(name) !== undefined) {
|
|
29
|
-
// ARC-143: runtime preamble adıyla çakışan komponenti uyarıyla eler — komponent sayfadaki hiçbir
|
|
30
|
-
// ifadede görünmez. Eşleme runtime'ın tire kuralıyla (yalnız ilk `-`) yapılır.
|
|
31
|
-
found.push(`'${name}' (${node.elementId ?? '?'}) — ayrılmış ad: ${reservedExpressionName(name)} ifade preamble'ının adıdır; runtime bu komponenti ifadelerden gizler (ARC-143)`);
|
|
32
|
-
}
|
|
33
26
|
found.push(...invalidComponentNames(node.children));
|
|
34
27
|
}
|
|
35
28
|
return found;
|
|
@@ -42,10 +35,9 @@ export function invalidComponentNames(nodes) {
|
|
|
42
35
|
* PAGE-009 ve PAGE-013'ün layout ayağı 2026-09-09'da eklendi: ikisi de yalnız sayfa yollarında
|
|
43
36
|
* koşuyordu, oysa layout `views`'ü aynı runtime'dan geçer — bozuk ad o layout'a bağlı HER
|
|
44
37
|
* sayfanın ifadelerini öldürür, iç içe repeater'ın geri yazma kırılması ise yapısaldır ve
|
|
45
|
-
* barındıranın sayfa mı layout mu olduğuna bakmaz.
|
|
46
|
-
* (mobilde `grouped-list`); denetimlerin kendisi iki platformda aynıdır.
|
|
38
|
+
* barındıranın sayfa mı layout mu olduğuna bakmaz.
|
|
47
39
|
*/
|
|
48
|
-
export function assertScreenWriteGuards(kind, screen
|
|
40
|
+
export function assertScreenWriteGuards(kind, screen) {
|
|
49
41
|
const codes = GUARD_CODES[kind];
|
|
50
42
|
const badEvents = invalidScreenEventNames(screen.events, codes.events);
|
|
51
43
|
if (badEvents.length > 0)
|
|
@@ -57,13 +49,12 @@ export function assertScreenWriteGuards(kind, screen, platform) {
|
|
|
57
49
|
if (badNames.length > 0) {
|
|
58
50
|
throw new PlatformApiError(`PAGE-009 — komponent adı JS tanımlayıcısı değil ya da ayrılmış (istek gönderilmedi): ${badNames.join(' · ')}. `
|
|
59
51
|
+ 'Runtime her komponent için `const <ad> = Components["<ad>"]` üretir; boşluklu ya da geçersiz bir ad '
|
|
60
|
-
+ 'SAYFADAKİ TÜM ifadeleri "Missing initializer in const declaration" ile öldürür (layout adları her sayfaya sızar)
|
|
61
|
-
+ 'ifade preamble\'ının ayrılmış adını (Page, state, item, t, event, Row …) taşıyan komponent ise ifadelerden gizlenir. '
|
|
52
|
+
+ 'SAYFADAKİ TÜM ifadeleri "Missing initializer in const declaration" ile öldürür (layout adları her sayfaya sızar). '
|
|
62
53
|
+ `name alanını elementId ile aynı yaz; okunabilir Türkçe başlık için props.title / props.text / props.label kullan (${codes.noun} ${codes.tree}).`, 400);
|
|
63
54
|
}
|
|
64
55
|
const nested = nestedRepeaterNodes(screen.schema);
|
|
65
56
|
if (nested.length > 0)
|
|
66
|
-
throw new PlatformApiError(nestedRepeaterMessage(nested
|
|
57
|
+
throw new PlatformApiError(nestedRepeaterMessage(nested), 400);
|
|
67
58
|
}
|
|
68
59
|
/**
|
|
69
60
|
* Katalog kurallarını (blok sınırı · auto-height · boyut string'i) ağaca uygular ve
|
|
@@ -74,25 +65,5 @@ export async function screenCatalogNotes(platform, project, environment, applica
|
|
|
74
65
|
if (!Array.isArray(nodes) || nodes.length === 0)
|
|
75
66
|
return [];
|
|
76
67
|
const catalog = await applyCatalogLayoutRules(platform, project, environment, applicationId, nodes);
|
|
77
|
-
return [...blockSizeNote(catalog.clamped), ...heightTypeNote(catalog.heights), ...sizeStringNote(catalog.sizes)
|
|
78
|
-
}
|
|
79
|
-
/**
|
|
80
|
-
* TB-123 / S2-33 — TAM ŞEMA yazan yolların kapısı: `screenCatalogNotes`'un yaptığı yerleşim
|
|
81
|
-
* normalizasyonuna katalog DOĞRULAMASINI ekler ve geçersiz enum/prop'ta isteği hiç göndermez.
|
|
82
|
-
*
|
|
83
|
-
* Neden yalnız bu yollarda: micro-op ucunda platformun kendi doğrulama duvarı zaten koşuyor
|
|
84
|
-
* (`invalid-enum-value` · `unknown-prop` · `invalid-appearance`), tam şema PUT/POST'unda ise
|
|
85
|
-
* koşmuyordu — aynı geçersiz değer bir yoldan 400, öbüründen 200 dönüyordu. Katalog okunamazsa
|
|
86
|
-
* doğrulama susar ve yazma eskisi gibi geçer: bilinmeyen sözlük yüzünden geçerli bir gövdeyi
|
|
87
|
-
* bloklamak, denetimi atlamaktan kötüdür.
|
|
88
|
-
*/
|
|
89
|
-
export async function assertScreenCatalog(platform, project, environment, applicationId, nodes, tool) {
|
|
90
|
-
if (!Array.isArray(nodes) || nodes.length === 0)
|
|
91
|
-
return [];
|
|
92
|
-
const components = await fetchCatalogComponents(platform, project, environment, applicationId).catch(() => []);
|
|
93
|
-
const errors = schemaCatalogErrors(nodes, catalogTypeRules(components));
|
|
94
|
-
if (errors.length > 0)
|
|
95
|
-
throw new PlatformApiError(schemaCatalogMessage(errors, tool), 400);
|
|
96
|
-
const catalog = applyCatalogLayoutRulesFrom(components, nodes);
|
|
97
|
-
return [...blockSizeNote(catalog.clamped), ...heightTypeNote(catalog.heights), ...sizeStringNote(catalog.sizes), ...droppableStatesNote(catalog.states)];
|
|
68
|
+
return [...blockSizeNote(catalog.clamped), ...heightTypeNote(catalog.heights), ...sizeStringNote(catalog.sizes)];
|
|
98
69
|
}
|
package/dist/tools/screens.js
CHANGED
|
@@ -1,115 +1,33 @@
|
|
|
1
1
|
import { PlatformApiError } from '../platform/errors.js';
|
|
2
2
|
import { resolveNodeStyleReport } from '../knowledge/styleResolve.js';
|
|
3
|
-
import { nodeNativeStyle } from '../knowledge/styleResolveNative.js';
|
|
4
|
-
import { jsonArray } from '../platform/jsonArray.js';
|
|
5
3
|
import { z } from 'zod';
|
|
6
4
|
export const hostParam = z.enum(['page', 'layout', 'component'])
|
|
7
5
|
.describe("Akışın barındırıcısı: page | layout | component (widget de component'tir)");
|
|
8
|
-
export const schemaParam =
|
|
6
|
+
export const schemaParam = z.array(z.record(z.unknown()))
|
|
9
7
|
.describe('Komponent ağacı (DesignComponentManagementSchema listesi); verilmezse mevcut şema korunur');
|
|
10
|
-
export const eventsParam =
|
|
8
|
+
export const eventsParam = z.array(z.record(z.unknown()))
|
|
11
9
|
.describe("Sayfa/layout düzeyi olaylar: [{ name, value }] — value bir flow id'sidir");
|
|
12
10
|
export const modeParam = z.enum(['summary', 'subtree', 'full']).optional().describe("summary (varsayılan): yalnız id/elementId/name/type ağacı — hedef bulmak için bunu kullanın. subtree: componentId ile tek alt ağaç. full: tüm şema.");
|
|
13
|
-
/**
|
|
14
|
-
* Şema ağacındaki TÜM düğümler (kök + iç içe çocuklar); page_get, page_create özeti, page_update
|
|
15
|
-
* ve page_schema_get aynı sayımı kullanır. Parçalı okumanın `deferred` yer tutucuları düğüm değildir.
|
|
16
|
-
*/
|
|
17
|
-
export function countSchemaNodes(nodes) {
|
|
18
|
-
return (nodes ?? []).reduce((total, node) => node.deferred === true ? total : total + 1 + countSchemaNodes(node.children), 0);
|
|
19
|
-
}
|
|
20
|
-
function schemaNodeKey(node) {
|
|
21
|
-
return typeof node.elementId === 'string' ? node.elementId : String(node.id);
|
|
22
|
-
}
|
|
23
|
-
function schemaNodeKeys(nodes) {
|
|
24
|
-
return (nodes ?? []).flatMap(node => [schemaNodeKey(node), ...schemaNodeKeys(node.children)]);
|
|
25
|
-
}
|
|
26
|
-
/** `stored` ağacında olup `sent` ağacında olmayan düğümlerin elementId'leri, ön-sırayla (PAGE-041). */
|
|
27
|
-
export function missingElementIds(stored, sent) {
|
|
28
|
-
const kept = new Set(schemaNodeKeys(sent));
|
|
29
|
-
return schemaNodeKeys(stored).filter(key => !kept.has(key));
|
|
30
|
-
}
|
|
31
|
-
/**
|
|
32
|
-
* ZM-28: şemayı her biri `budgetChars` karakteri (JSON uzunluğu, `shrink` ile aynı ölçü) aşmayan
|
|
33
|
-
* parçalara böler. Ön-sıra ve deterministik: alt ağacı sığan düğüm BÜTÜN alınır, sığmayan kabuk olarak
|
|
34
|
-
* yazılır ve çocuklarına inilir; parçaların birleşimi orijinal şemanın birebir aynısıdır.
|
|
35
|
-
*/
|
|
36
|
-
export function splitSchemaIntoParts(schema, budgetChars) {
|
|
37
|
-
const parts = [];
|
|
38
|
-
let current = [];
|
|
39
|
-
let currentChars = 2;
|
|
40
|
-
const place = (item, chars) => {
|
|
41
|
-
if (current.length > 0 && currentChars + 1 + chars > budgetChars) {
|
|
42
|
-
parts.push(current);
|
|
43
|
-
current = [];
|
|
44
|
-
currentChars = 2;
|
|
45
|
-
}
|
|
46
|
-
currentChars += (current.length > 0 ? 1 : 0) + chars;
|
|
47
|
-
current.push(item);
|
|
48
|
-
};
|
|
49
|
-
const visit = (node, parentElementId, index) => {
|
|
50
|
-
const whole = { parentElementId, index, node };
|
|
51
|
-
const wholeChars = JSON.stringify(whole).length;
|
|
52
|
-
if (2 + wholeChars <= budgetChars) {
|
|
53
|
-
place(whole, wholeChars);
|
|
54
|
-
return;
|
|
55
|
-
}
|
|
56
|
-
const children = Array.isArray(node.children) ? node.children : [];
|
|
57
|
-
const shell = {
|
|
58
|
-
parentElementId,
|
|
59
|
-
index,
|
|
60
|
-
node: { ...node, children: children.map(child => ({ elementId: schemaNodeKey(child), deferred: true })) }
|
|
61
|
-
};
|
|
62
|
-
const shellChars = JSON.stringify(shell).length;
|
|
63
|
-
if (children.length === 0 || 2 + shellChars > budgetChars) {
|
|
64
|
-
throw new PlatformApiError(`'${schemaNodeKey(node)}' (${String(node.type)}) düğümünün kendi gövdesi ${children.length === 0 ? wholeChars : shellChars} karakter; parça bütçesi ${budgetChars} karakter olduğu için tek düğüm bile bir yanıta sığmıyor. Düğümün büyük prop'unu page_schema_patch (replace_prop) ile küçültün ya da parçalara bölün; sonra cursor:'0' ile yeniden okuyun.`, 400);
|
|
65
|
-
}
|
|
66
|
-
place(shell, shellChars);
|
|
67
|
-
children.forEach((child, childIndex) => visit(child, schemaNodeKey(node), childIndex));
|
|
68
|
-
};
|
|
69
|
-
schema.forEach((node, index) => visit(node, null, index));
|
|
70
|
-
if (current.length > 0 || parts.length === 0)
|
|
71
|
-
parts.push(current);
|
|
72
|
-
return parts;
|
|
73
|
-
}
|
|
74
|
-
/** Opak parçalı okuma cursor'ı: sürüm değişince eski cursor reddedilir. */
|
|
75
|
-
export function encodeSchemaCursor(version, partIndex) {
|
|
76
|
-
return `${version}:${partIndex}`;
|
|
77
|
-
}
|
|
78
|
-
/** `'0'` sürümsüz ilk parçadır; `<sürüm>:<parça>` sürümü taşır. Çözülemeyen cursor `undefined`. */
|
|
79
|
-
export function decodeSchemaCursor(cursor) {
|
|
80
|
-
if (/^\d+$/.test(cursor))
|
|
81
|
-
return { partIndex: Number(cursor) };
|
|
82
|
-
const separator = cursor.lastIndexOf(':');
|
|
83
|
-
const partIndex = cursor.slice(separator + 1);
|
|
84
|
-
if (separator < 0 || !/^\d+$/.test(partIndex))
|
|
85
|
-
return undefined;
|
|
86
|
-
return { version: cursor.slice(0, separator), partIndex: Number(partIndex) };
|
|
87
|
-
}
|
|
88
11
|
/**
|
|
89
12
|
* Ağacı yalnız kimlik alanlarına indirger; hedef aramak için okunur boyutta tutar.
|
|
90
13
|
* `styleSource` verilirse (undefined DEĞİLSE) her düğüme efektif stil raporu da
|
|
91
14
|
* yazılır: tema componentStyles → preset → düğümün kendi stili kaskadı.
|
|
92
15
|
*/
|
|
93
|
-
export function summarize(node, styleSource
|
|
16
|
+
export function summarize(node, styleSource) {
|
|
94
17
|
const summary = {
|
|
95
18
|
id: node.id,
|
|
96
19
|
elementId: node.elementId,
|
|
97
20
|
name: node.name,
|
|
98
21
|
type: node.type
|
|
99
22
|
};
|
|
100
|
-
|
|
101
|
-
if (nativeTheme !== undefined) {
|
|
102
|
-
const { shell, text, warnings } = nodeNativeStyle(node, nativeTheme, styleSource ?? undefined);
|
|
103
|
-
summary.nativeStyle = { shell, text, ...(warnings.length > 0 ? { warnings } : {}) };
|
|
104
|
-
}
|
|
105
|
-
else if (styleSource !== undefined) {
|
|
23
|
+
if (styleSource !== undefined) {
|
|
106
24
|
const report = resolveNodeStyleReport(node, styleSource ?? undefined);
|
|
107
25
|
if (report.resolvedStyle !== undefined)
|
|
108
26
|
summary.resolvedStyle = report.resolvedStyle;
|
|
109
27
|
summary.styleLayers = report.styleLayers;
|
|
110
28
|
}
|
|
111
29
|
if (Array.isArray(node.children) && node.children.length > 0) {
|
|
112
|
-
summary.children = node.children.map(child => summarize(child, styleSource
|
|
30
|
+
summary.children = node.children.map(child => summarize(child, styleSource));
|
|
113
31
|
}
|
|
114
32
|
return summary;
|
|
115
33
|
}
|
|
@@ -178,11 +96,6 @@ export function flowPath(host, applicationId, hostId, flowId) {
|
|
|
178
96
|
: `/components/${applicationId}/${hostId}/flows`;
|
|
179
97
|
return flowId ? `${root}/${flowId}` : root;
|
|
180
98
|
}
|
|
181
|
-
/**
|
|
182
|
-
* Sayfa PUT gövdesi okunan sayfadan kurulur ve o sayfanın sürümünü `baseVersion` olarak taşır:
|
|
183
|
-
* platform sürümsüz sayfa PUT'unu reddeder (`plans/mobil-plantcare-acigi` b-05, K11). Gövde
|
|
184
|
-
* okunduğu andaki sayfanın üstüne yazar; ajanın planladığı sürümü `page_update` kendisi koyar.
|
|
185
|
-
*/
|
|
186
99
|
export function pageUpdateBody(page, overrides = {}) {
|
|
187
100
|
const layout = (page.layout ?? {});
|
|
188
101
|
return {
|
|
@@ -197,9 +110,6 @@ export function pageUpdateBody(page, overrides = {}) {
|
|
|
197
110
|
middlewareIds: page.middlewareIds ?? [],
|
|
198
111
|
roleIds: Array.isArray(page.roleIds) ? page.roleIds : identifiers(page.roles),
|
|
199
112
|
layoutId: page.layoutId ?? layout.id ?? null,
|
|
200
|
-
baseVersion: page.version === undefined || page.version === null ? undefined : String(page.version),
|
|
201
|
-
isAnonymous: page.isAnonymous ?? false,
|
|
202
|
-
isLoginPage: page.isLoginPage ?? false,
|
|
203
113
|
...overrides
|
|
204
114
|
};
|
|
205
115
|
}
|
package/dist/tools/templates.js
CHANGED
|
@@ -48,7 +48,7 @@ export function registerTemplateTools(server, platform) {
|
|
|
48
48
|
description: "Şablonun bir modüldeki kayıtlarını listeler (project_create'in templateOptions.filters'ını doldurmak için).",
|
|
49
49
|
inputSchema: {
|
|
50
50
|
id: guid,
|
|
51
|
-
module: z.string().describe("Module değeri: entity | microservice | workflow | page | layout | component | query | view | variable | global-function (fonksiyonlar, iki kaynak) | flow
|
|
51
|
+
module: z.string().describe("Module değeri: entity | microservice | workflow | page | layout | component | query | view | variable | global-function (fonksiyonlar, iki kaynak) | flow … (platform Module enum değeri, kebab-case)")
|
|
52
52
|
},
|
|
53
53
|
annotations: readOnly
|
|
54
54
|
}, handle(config, ({ id, module }) => platform.org('GET', `/templates/${id}/items`, { query: { module } })));
|
|
@@ -77,31 +77,6 @@ export function registerTemplateTools(server, platform) {
|
|
|
77
77
|
normalized.push(await defaultTemplateEnvironmentNote(platform, projectId));
|
|
78
78
|
return withNormalization(await platform.org('POST', `/projects/${projectId}/templates`, { form }), normalized);
|
|
79
79
|
}));
|
|
80
|
-
server.registerTool('template_application_create', {
|
|
81
|
-
title: 'Uygulamayı şablon olarak yayımla',
|
|
82
|
-
description: "Tek bir APPLICATION'dan yeni bir şablon sürümü üretir (POST /applications/{id}/templates). Sistem modülü şablonları (kompleks proje açılışında otomatik kurulanlar) uygulama kaynaklıdır: aynı ad + aynı applicationId ile çağırmak MEVCUT şablona yeni SÜRÜM ekler, template_create ise proje kaynaklı AYRI bir kayıt açar ve 'system_module_slug' işaretini taşımaz. 'systemModuleSlug' benzersizdir: başka bir şablonda kullanılıyorsa platform reddeder. environmentId boşsa platform projenin production OLMAYAN ilk environment'ını paketler.",
|
|
83
|
-
inputSchema: {
|
|
84
|
-
applicationId: guid,
|
|
85
|
-
name: z.string().min(1),
|
|
86
|
-
version: z.string().min(1).describe("Sürüm etiketi, ör. '1.0.0'"),
|
|
87
|
-
description: z.string().optional(),
|
|
88
|
-
changeLog: z.string().optional(),
|
|
89
|
-
systemModuleSlug: z.string().min(1).optional().describe("Sistem modülü işareti (ör. 'access'); kompleks proje açılışında otomatik kurulan şablonu bu alan belirler"),
|
|
90
|
-
environmentId: guid.optional().describe("Paketlenecek environment; boşsa production OLMAYAN ilk environment paketlenir")
|
|
91
|
-
},
|
|
92
|
-
annotations: writes
|
|
93
|
-
}, handle(config, async ({ applicationId, name, version, description, changeLog, systemModuleSlug, environmentId }) => {
|
|
94
|
-
const body = { name, version };
|
|
95
|
-
if (description)
|
|
96
|
-
body.description = description;
|
|
97
|
-
if (changeLog)
|
|
98
|
-
body.changeLog = changeLog;
|
|
99
|
-
if (systemModuleSlug)
|
|
100
|
-
body.systemModuleSlug = systemModuleSlug;
|
|
101
|
-
if (environmentId)
|
|
102
|
-
body.environmentId = environmentId;
|
|
103
|
-
return platform.org('POST', `/applications/${applicationId}/templates`, { body });
|
|
104
|
-
}));
|
|
105
80
|
server.registerTool('template_check_updates', {
|
|
106
81
|
title: 'Şablon güncellemesi var mı',
|
|
107
82
|
description: 'Şablondan kurulmuş projenin kaynak şablonunda yeni sürüm var mı kontrol eder.',
|
|
@@ -46,7 +46,7 @@ export function registerTranslationTools(server, platform) {
|
|
|
46
46
|
throw new Error("'keys' ya da 'deletedKeys' parametrelerinden en az biri dolu olmalı.");
|
|
47
47
|
}
|
|
48
48
|
const body = { keys: keys ?? [], deletedKeys: deletedKeys ?? [] };
|
|
49
|
-
const findings = enforcePolicy(evaluatePolicy(config, policyRules, 'translation', body, { operation: 'update' })
|
|
49
|
+
const findings = enforcePolicy(evaluatePolicy(config, policyRules, 'translation', body, { operation: 'update' }));
|
|
50
50
|
const languages = await languageFindings(platform, project, keys ?? []);
|
|
51
51
|
return attachFindings(await platform.tenant('PUT', project, `/translations/${applicationId}`, { environment, body }), [...findings, ...languages]);
|
|
52
52
|
}));
|
package/dist/tools/variables.js
CHANGED
|
@@ -1,15 +1,11 @@
|
|
|
1
1
|
import { parseVariableEntries, mergeVariableEntries, withNormalization } from '../knowledge/normalize.js';
|
|
2
2
|
import { guid, projectParam, environmentParam, readOnly, writes, updates, destructive } from './common.js';
|
|
3
|
-
import { STATE_STORAGE_KINDS } from '../knowledge/platform/profile.js';
|
|
4
|
-
import { variableProfileWarnings } from './profileWrite.js';
|
|
5
3
|
import { handle } from '../platform/responses.js';
|
|
6
4
|
import { z } from 'zod';
|
|
7
5
|
const variablePath = (applicationId, pageId) => pageId ? `/variables/${applicationId}/${pageId}` : `/variables/${applicationId}`;
|
|
8
6
|
const variablesParam = z.array(z.object({
|
|
9
7
|
key: z.string().min(1).describe("Değişken adı; sayfada state.page.<key> ile okunur"),
|
|
10
|
-
value: z.unknown().describe('Herhangi bir JSON değeri; nesne verirseniz alanlarına state.page.<key>.<alan> ile erişilir')
|
|
11
|
-
storage: z.enum(['memory', ...STATE_STORAGE_KINDS]).optional()
|
|
12
|
-
.describe("Değerin yaşadığı yer (yalnız mobil uygulamada uygulanır, MOB-014). Verilmezse kayıttaki tür korunur; yeni değişkende bellektir — state her sayfa açılışında buradaki value'dan başlar. 'device': cihaz deposu (AsyncStorage karşılığı), uygulama kapanıp açılınca son yazılan değer geri gelir. 'secure': güvenli depo (expo-secure-store), token gibi gizli ve küçük değerler için. 'memory': türü kaldırır. Çıkışta ikisi de silinir.")
|
|
8
|
+
value: z.unknown().describe('Herhangi bir JSON değeri; nesne verirseniz alanlarına state.page.<key>.<alan> ile erişilir')
|
|
13
9
|
})).min(1).describe("Değişken listesi: [{ key: 'MyTest', value: { isActive: true } }]. Gateway bunu platformun beklediği JSON string'e çevirir.");
|
|
14
10
|
const replaceParam = z.boolean().optional()
|
|
15
11
|
.describe('true: seti komple bunlarla değiştir (diğer değişkenler silinir). Varsayılan false — gateway mevcut setle birleştirir.');
|
|
@@ -26,7 +22,7 @@ export function registerVariableTools(server, platform) {
|
|
|
26
22
|
}
|
|
27
23
|
};
|
|
28
24
|
const write = async (method, { project, environment, applicationId, pageId, variables, replace }) => {
|
|
29
|
-
const incoming = variables.map(entry => ({ key: entry.key, value: entry.value
|
|
25
|
+
const incoming = variables.map(entry => ({ key: entry.key, value: entry.value ?? null }));
|
|
30
26
|
const existing = replace === true ? [] : await readEntries(project, environment, applicationId, pageId);
|
|
31
27
|
const merged = mergeVariableEntries(existing, incoming, replace === true);
|
|
32
28
|
const response = await platform.tenant(method, project, variablePath(applicationId, pageId), {
|
|
@@ -37,11 +33,9 @@ export function registerVariableTools(server, platform) {
|
|
|
37
33
|
data: JSON.stringify(merged.entries)
|
|
38
34
|
}
|
|
39
35
|
});
|
|
40
|
-
const platformWarnings = await variableProfileWarnings(platform, applicationId, merged.entries.filter(entry => incoming.some(current => current.key === entry.key)));
|
|
41
36
|
return withNormalization({
|
|
42
37
|
scope: pageId ? 'page' : 'application',
|
|
43
38
|
variables: merged.entries.map(entry => entry.key),
|
|
44
|
-
...(platformWarnings.length > 0 ? { platformWarnings } : {}),
|
|
45
39
|
response
|
|
46
40
|
}, [
|
|
47
41
|
...merged.fixes,
|
|
@@ -50,7 +44,7 @@ export function registerVariableTools(server, platform) {
|
|
|
50
44
|
};
|
|
51
45
|
server.registerTool('variable_list', {
|
|
52
46
|
title: 'Değişkenleri getir',
|
|
53
|
-
description: "Application (pageId verilirse sayfa) değişken setini getirir. Platform seti tek kayıtta ve JSON STRING olarak tutar; gateway çözüp [{key, value
|
|
47
|
+
description: "Application (pageId verilirse sayfa) değişken setini getirir. Platform seti tek kayıtta ve JSON STRING olarak tutar; gateway çözüp [{key, value}] dizisi döndürür. Sayfada okuma yolu: state.page.<key> (uygulama düzeyinde state.app.<key>).",
|
|
54
48
|
inputSchema: { project: projectParam, environment: environmentParam, applicationId: guid, pageId: guid.optional() },
|
|
55
49
|
annotations: readOnly
|
|
56
50
|
}, handle(config, async ({ project, environment, applicationId, pageId }) => ({
|
|
@@ -67,7 +61,7 @@ export function registerVariableTools(server, platform) {
|
|
|
67
61
|
}, handle(config, ({ project, environment, applicationId }) => platform.tenant('GET', project, `/variables/${applicationId}/pages`, { environment })));
|
|
68
62
|
server.registerTool('variable_create', {
|
|
69
63
|
title: 'Değişken tanımla',
|
|
70
|
-
description: "Application (pageId verilirse sayfa) değişkeni tanımlar. Platform uygulama/sayfa başına TEK kayıt tutar ve seti komple değiştirir; gateway mevcut setle birleştirir (replace: true ile ezersiniz). Sayfada kullanım: prop { type:'code', ref:\"{{ state.page.<key>.<alan> }}\" } ya da flow'da value { type:'state', ref:'<key>' }.
|
|
64
|
+
description: "Application (pageId verilirse sayfa) değişkeni tanımlar. Platform uygulama/sayfa başına TEK kayıt tutar ve seti komple değiştirir; gateway mevcut setle birleştirir (replace: true ile ezersiniz). Sayfada kullanım: prop { type:'code', ref:\"{{ state.page.<key>.<alan> }}\" } ya da flow'da value { type:'state', ref:'<key>' }.",
|
|
71
65
|
inputSchema: {
|
|
72
66
|
project: projectParam,
|
|
73
67
|
environment: environmentParam,
|
|
@@ -80,7 +74,7 @@ export function registerVariableTools(server, platform) {
|
|
|
80
74
|
}, handle(config, input => write('POST', input)));
|
|
81
75
|
server.registerTool('variable_update', {
|
|
82
76
|
title: 'Değişken güncelle',
|
|
83
|
-
description: "Var olan değişken setini günceller (variable_create zaten kayıt varsa update'e düşer; ikisi de aynı sonucu verir). Anahtar bazında birleştirir, replace: true ile seti komple değiştirir.
|
|
77
|
+
description: "Var olan değişken setini günceller (variable_create zaten kayıt varsa update'e düşer; ikisi de aynı sonucu verir). Anahtar bazında birleştirir, replace: true ile seti komple değiştirir.",
|
|
84
78
|
inputSchema: {
|
|
85
79
|
project: projectParam,
|
|
86
80
|
environment: environmentParam,
|
package/dist/tools/workflows.js
CHANGED
|
@@ -5,20 +5,18 @@ import { workflowOutline, resolvePart, resolvePatchOperations } from '../knowled
|
|
|
5
5
|
import { patchResult, baseVersionOf } from '../platform/patch.js';
|
|
6
6
|
import { writeDiff, withWriteDiff } from '../platform/writeDiff.js';
|
|
7
7
|
import { policyRules, microfunctionStepFindings, workflowStepFindings, undefinedInputFieldFindings } from '../knowledge/rules.js';
|
|
8
|
-
import { identityMiddlewareFindings } from '../knowledge/access.js';
|
|
9
8
|
import { languageHeader } from '../knowledge/languageCodes.js';
|
|
10
9
|
import { handle } from '../platform/responses.js';
|
|
11
10
|
import { existingMatch, ifExistsParam, listAll, platformRename, withOutcome, withRename } from '../platform/ifExists.js';
|
|
12
11
|
import { outlineWrite, recordWriteViewParam } from '../platform/writeView.js';
|
|
13
12
|
import fastJsonPatch from 'fast-json-patch';
|
|
14
|
-
import { jsonArray } from '../platform/jsonArray.js';
|
|
15
13
|
import { z } from 'zod';
|
|
16
14
|
import { constraintSummary } from '../knowledge/backendConstraints.js';
|
|
17
15
|
import { unmappedMembers, introducedUnmappedMembers, withUnmappedMembers } from '../knowledge/schemaGuard.js';
|
|
18
16
|
const workflowIfExistsParam = ifExistsParam('workflow', 'mevcut workflow\'u bu tanımla tam gövde günceller (id\'si korunur; workflow_update ile aynı yazma)');
|
|
19
17
|
const policyOverrideParam = z.boolean().optional()
|
|
20
18
|
.describe('true: politika block bulgularını warn\'a indirir (bilinçli istisna; yanıtta işaretlenir)');
|
|
21
|
-
const patchOperationsParam =
|
|
19
|
+
const patchOperationsParam = z.array(z.record(z.unknown())).min(1)
|
|
22
20
|
.describe("RFC 6902 JSON Patch işlemleri. Step hedeflerken İNDEKS YERİNE SEÇİCİ kullanın: { op: 'replace', path: '/steps[id=<stepId>]/rule/expression', value: '…' } — saklanan steps sırası gönderdiğiniz sıra DEĞİLDİR, indeks yolu sessizce başka adımı yazar. Seçici gövde platforma gitmeden indekse çevrilir; çözülemezse istek hiç gönderilmez. '/steps[name=setUser]/rule/joins' ve düz '/steps/2/...' de kabul edilir; yanıt her op'un hangi adıma indiğini patchTargets ile döner.");
|
|
23
21
|
/**
|
|
24
22
|
* Platform `set-user` step'i için `StepRule.Name`'i BOŞ döndürür (adı sabit: 'user') ve DTO
|
|
@@ -125,8 +123,7 @@ export function registerWorkflowTools(server, platform) {
|
|
|
125
123
|
const stepFindings = [
|
|
126
124
|
...await microfunctionStepFindings(platform, project, environment, definition, definition.type, policyOverride),
|
|
127
125
|
...await workflowStepFindings(platform, project, environment, applicationId, definition, definition.type, policyOverride),
|
|
128
|
-
...await undefinedInputFieldFindings(platform, project, environment, definition, definition.type, policyOverride)
|
|
129
|
-
...await identityMiddlewareFindings(platform, project, environment, definition, definition.type, policyOverride)
|
|
126
|
+
...await undefinedInputFieldFindings(platform, project, environment, definition, definition.type, policyOverride)
|
|
130
127
|
];
|
|
131
128
|
const bodyFindings = (operation) => evaluatePolicy(config, policyRules, 'workflow', definition, { operation, workflowKind: definition.type }, policyOverride);
|
|
132
129
|
const createFindings = enforcePolicy([...bodyFindings('create'), ...stepFindings]);
|
|
@@ -167,8 +164,7 @@ export function registerWorkflowTools(server, platform) {
|
|
|
167
164
|
...evaluatePolicy(config, policyRules, 'workflow', definition, { operation: 'update', workflowKind: definition.type }, policyOverride),
|
|
168
165
|
...await microfunctionStepFindings(platform, project, environment, definition, definition.type, policyOverride),
|
|
169
166
|
...await workflowStepFindings(platform, project, environment, applicationId, definition, definition.type, policyOverride),
|
|
170
|
-
...await undefinedInputFieldFindings(platform, project, environment, definition, definition.type, policyOverride)
|
|
171
|
-
...await identityMiddlewareFindings(platform, project, environment, definition, definition.type, policyOverride)
|
|
167
|
+
...await undefinedInputFieldFindings(platform, project, environment, definition, definition.type, policyOverride)
|
|
172
168
|
]);
|
|
173
169
|
const drift = unmappedMembers('UpdateWorkflowCommand', definition);
|
|
174
170
|
const payload = await platform.tenant('PUT', project, `/workflows/${applicationId}/${id}`, { environment, body: definition });
|
|
@@ -190,8 +186,7 @@ export function registerWorkflowTools(server, platform) {
|
|
|
190
186
|
...evaluatePolicy(config, policyRules, 'workflow', patched, { operation: 'update', workflowKind: patched.type }, policyOverride),
|
|
191
187
|
...await microfunctionStepFindings(platform, project, environment, patched, patched.type, policyOverride),
|
|
192
188
|
...await workflowStepFindings(platform, project, environment, applicationId, patched, patched.type, policyOverride),
|
|
193
|
-
...await undefinedInputFieldFindings(platform, project, environment, patched, patched.type, policyOverride)
|
|
194
|
-
...await identityMiddlewareFindings(platform, project, environment, patched, patched.type, policyOverride)
|
|
189
|
+
...await undefinedInputFieldFindings(platform, project, environment, patched, patched.type, policyOverride)
|
|
195
190
|
]);
|
|
196
191
|
const drift = introducedUnmappedMembers('UpdateWorkflowCommand', (current?.data ?? current), patched);
|
|
197
192
|
// Gövde değil FARK gönderilir: gateway normalizasyonları da op'a çevrilsin diye net diff
|
|
@@ -223,7 +218,7 @@ export function registerWorkflowTools(server, platform) {
|
|
|
223
218
|
}, handle(config, ({ project, environment, id }) => platform.tenant('POST', project, `/workflows/clone/${id}`, { environment })));
|
|
224
219
|
server.registerTool('workflow_preview', {
|
|
225
220
|
title: 'Workflow önizle',
|
|
226
|
-
description: "Kaydedilmemiş workflow tanımını çalıştırır; kaydetmeden önce her akışı preview ile doğrulayın. definition = PreviewWorkflowCommand gövdesi. Test girdisi 'previewPayload' anahtarıyla verilir ('parameters'/'input' ÇALIŞMAZ), değişkenler 'previewVariables'. previewPayload STRING
|
|
221
|
+
description: "Kaydedilmemiş workflow tanımını çalıştırır; kaydetmeden önce her akışı preview ile doğrulayın. definition = PreviewWorkflowCommand gövdesi. Test girdisi 'previewPayload' anahtarıyla verilir ('parameters'/'input' ÇALIŞMAZ), değişkenler 'previewVariables'. previewPayload STRING olmalıdır (JSON.stringify(...) ya da \"({ id: 1 })\") — nesne gönderilirse platform 'Unexpected end of input' ile 500 döner. Akışın parameterDtoId'si YOKSA previewPayload verilmez (platform 400 döner; gateway alanı düşürüp gatewayNormalized ile bildirir). Preview tek transaction'da koşar ve sonunda ROLLBACK edilir: table create/update step'leri kalıcı satır YAZMAZ (ölçüldü, İK koşusu W-1). Tek istisna code step içindeki dış HTTP çağrılarıdır — onlar geri alınamaz. Yanıt WorkflowPreviewDto: steps[] (her adım: step{id,name,type}, input[] ifade→değer, output, hasError, errorType, errorMessage, errorDetail, elapsedMilliseconds, nextStep, children[] loop/alt akış, automations[]), input, output, executionSuccess. executionSuccess YALNIZ son adıma bakar; gateway tüm ağacı tarayıp hata bulursa yanıta 'runtimeErrors' ekler — HTTP 200 akışın geçtiği anlamına gelmez, ÖNCE bu alana bakın; 'input' boşsa girdi hiç bağlanmamıştır. Kayıtlı bir akışı çalıştırmadan sınamak için workflow_get gövdesini (steps + kayıtlı previewPayload/previewVariables) olduğu gibi verin — Studio'nun Önizleme düğmesi de bunu yapar. Zamanlanmış işin akışında previewPayload vermeyin (iş girdisiz koşar); job geçmişi hatayı mesaj olarak yazar, adım izini burada görün (platform_guide('microservice') §Zamanlanmış işin gerçek sonucunu görmek). Okuma rehberi: platform_guide('workflow') §Önizleme çıktısını okumak. " + constraintSummary('PreviewWorkflowCommand'),
|
|
227
222
|
inputSchema: { project: projectParam, environment: environmentParam, applicationId: guid, definition: definitionParam, policyOverride: policyOverrideParam, language: languageParam },
|
|
228
223
|
annotations: writes
|
|
229
224
|
}, handle(config, async ({ project, environment, applicationId, definition, policyOverride, language }) => {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@appaflytech/zeyrek-ai-mcp",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.32",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Zeyrek (NgApps) platform APIs as MCP tools — data, logic and Studio design surface in one gateway",
|
|
6
6
|
"license": "UNLICENSED",
|
|
@@ -60,4 +60,4 @@
|
|
|
60
60
|
"typescript": "^5.7.2",
|
|
61
61
|
"vitest": "^3.0.0"
|
|
62
62
|
}
|
|
63
|
-
}
|
|
63
|
+
}
|