@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.
Files changed (203) hide show
  1. package/.env.example +0 -15
  2. package/README.md +5 -5
  3. package/dist/config.js +0 -37
  4. package/dist/index.js +0 -2
  5. package/dist/knowledge/backendConstraints.js +1 -18
  6. package/dist/knowledge/boxSections.js +184 -0
  7. package/dist/knowledge/componentCatalog.js +232 -562
  8. package/dist/knowledge/componentEvents.js +21 -141
  9. package/dist/knowledge/layoutSummary.js +2 -140
  10. package/dist/knowledge/normalize.js +67 -236
  11. package/dist/knowledge/outlines.js +0 -36
  12. package/dist/knowledge/policy.js +4 -18
  13. package/dist/knowledge/reservedTables.js +0 -79
  14. package/dist/knowledge/rules.js +21 -319
  15. package/dist/knowledge/schemaGuard.js +0 -11
  16. package/dist/knowledge/styleResolve.js +38 -55
  17. package/dist/knowledge/themeResolve.js +3 -3
  18. package/dist/observability/trace.js +3 -6
  19. package/dist/platform/diagnostics.js +4 -10
  20. package/dist/platform/domSummary.js +1 -1
  21. package/dist/platform/errors.js +10 -162
  22. package/dist/platform/http.js +8 -29
  23. package/dist/platform/responses.js +5 -39
  24. package/dist/platform/{capture/capture.js → screenshot.js} +519 -105
  25. package/dist/platform/secrets.js +1 -17
  26. package/dist/platform/strictArguments.js +12 -68
  27. package/dist/platform/tokenVault.js +4 -187
  28. package/dist/resources/examples/layout-app-shell.json +707 -229
  29. package/dist/resources/examples/page-detail-profile.json +1 -2
  30. package/dist/resources/examples/page-dynamic-form.json +2 -3
  31. package/dist/resources/examples/page-flex-sections.json +1 -1
  32. package/dist/resources/examples/page-html-embed.json +1 -1
  33. package/dist/resources/examples/workflow-basic.json +2 -8
  34. package/dist/resources/guides/component.md +4 -91
  35. package/dist/resources/guides/entity.md +8 -50
  36. package/dist/resources/guides/expressions.md +5 -14
  37. package/dist/resources/guides/functions.md +1 -1
  38. package/dist/resources/guides/getting-started.md +1 -38
  39. package/dist/resources/guides/layout.md +58 -55
  40. package/dist/resources/guides/microservice.md +2 -81
  41. package/dist/resources/guides/middleware.md +2 -44
  42. package/dist/resources/guides/page.md +75 -454
  43. package/dist/resources/guides/theme.md +2 -8
  44. package/dist/resources/guides/translation.md +1 -1
  45. package/dist/resources/guides/workflow.md +1 -58
  46. package/dist/resources/rules.js +5 -11
  47. package/dist/resources/schema-fingerprint.json +5 -7
  48. package/dist/resources/schemas/CreateEntityCommand.json +0 -118
  49. package/dist/resources/schemas/CreateMicroserviceCommand.json +1 -13
  50. package/dist/resources/schemas/CreateQueryCommand.json +0 -4
  51. package/dist/resources/schemas/CreateWorkflowCommand.json +1 -143
  52. package/dist/resources/schemas/DataJobDto.json +1 -6
  53. package/dist/resources/schemas/GlobalFunctionUpdateResultDto.json +1 -21
  54. package/dist/resources/schemas/MicroserviceDto.json +3 -15
  55. package/dist/resources/schemas/PreviewMicroserviceCommand.json +1 -10
  56. package/dist/resources/schemas/PreviewWorkflowCommand.json +1 -22
  57. package/dist/resources/schemas/StepDto.json +1 -22
  58. package/dist/resources/schemas/UpdateEntityCommand.json +0 -118
  59. package/dist/resources/schemas/UpdateMicroserviceCommand.json +1 -13
  60. package/dist/resources/schemas/UpdateQueryCommand.json +0 -4
  61. package/dist/resources/schemas/UpdateViewCommand.json +2 -0
  62. package/dist/resources/schemas/UpdateWorkflowCommand.json +1 -143
  63. package/dist/server.js +1 -27
  64. package/dist/tools/access.js +2 -369
  65. package/dist/tools/applications.js +3 -60
  66. package/dist/tools/common.js +0 -7
  67. package/dist/tools/components.js +14 -118
  68. package/dist/tools/datasources.js +3 -3
  69. package/dist/tools/dependencies.js +1 -1
  70. package/dist/tools/deployments.js +2 -2
  71. package/dist/tools/designSchemaPatch.js +18 -34
  72. package/dist/tools/dtos.js +5 -36
  73. package/dist/tools/entities.js +12 -79
  74. package/dist/tools/externalComponents.js +5 -26
  75. package/dist/tools/flows.js +14 -122
  76. package/dist/tools/folders.js +1 -1
  77. package/dist/tools/imports.js +2 -5
  78. package/dist/tools/layouts.js +17 -50
  79. package/dist/tools/merges.js +1 -1
  80. package/dist/tools/microservices.js +25 -77
  81. package/dist/tools/pages.js +112 -465
  82. package/dist/tools/platformInfo.js +8 -27
  83. package/dist/tools/projects.js +9 -71
  84. package/dist/tools/rows.js +13 -69
  85. package/dist/tools/schemaOps.js +1 -61
  86. package/dist/tools/screenWrite.js +8 -37
  87. package/dist/tools/screens.js +5 -95
  88. package/dist/tools/templates.js +1 -26
  89. package/dist/tools/translations.js +1 -1
  90. package/dist/tools/variables.js +5 -11
  91. package/dist/tools/workflows.js +5 -10
  92. package/package.json +2 -2
  93. package/dist/knowledge/access.js +0 -802
  94. package/dist/knowledge/case.js +0 -41
  95. package/dist/knowledge/connectDataBind.js +0 -819
  96. package/dist/knowledge/connectDataDefinition.js +0 -341
  97. package/dist/knowledge/connectDataExecute.js +0 -93
  98. package/dist/knowledge/connectDataRules.js +0 -128
  99. package/dist/knowledge/decision.js +0 -121
  100. package/dist/knowledge/expressionPrelude.js +0 -59
  101. package/dist/knowledge/microserviceParameters.js +0 -58
  102. package/dist/knowledge/mining.js +0 -94
  103. package/dist/knowledge/mobileComponentCatalog.js +0 -859
  104. package/dist/knowledge/mobileComponentEvents.js +0 -239
  105. package/dist/knowledge/platform/lint.js +0 -385
  106. package/dist/knowledge/platform/mobile.js +0 -142
  107. package/dist/knowledge/platform/mobileLayoutLint.js +0 -324
  108. package/dist/knowledge/platform/mobileRules.js +0 -231
  109. package/dist/knowledge/platform/mobileSpacing.js +0 -82
  110. package/dist/knowledge/platform/mobileTabs.js +0 -108
  111. package/dist/knowledge/platform/nativeBoxModel.js +0 -44
  112. package/dist/knowledge/platform/profile.js +0 -25
  113. package/dist/knowledge/platform/resolve.js +0 -122
  114. package/dist/knowledge/platform/web.js +0 -39
  115. package/dist/knowledge/process.js +0 -510
  116. package/dist/knowledge/rowFilter.js +0 -43
  117. package/dist/knowledge/styleResolveNative.js +0 -527
  118. package/dist/platform/argumentAliases.js +0 -128
  119. package/dist/platform/bodyFile.js +0 -103
  120. package/dist/platform/capture/actions.js +0 -333
  121. package/dist/platform/capture/browser.js +0 -1
  122. package/dist/platform/capture/console-log.js +0 -122
  123. package/dist/platform/capture/index.js +0 -11
  124. package/dist/platform/capture/readiness.js +0 -103
  125. package/dist/platform/capture/summary.js +0 -77
  126. package/dist/platform/capture/target.js +0 -5
  127. package/dist/platform/capture/targets/studio-mobile.js +0 -15
  128. package/dist/platform/capture/targets/studio-web.js +0 -5
  129. package/dist/platform/impersonation.js +0 -45
  130. package/dist/platform/jsonArray.js +0 -24
  131. package/dist/platform/schemaReadMemory.js +0 -60
  132. package/dist/resources/examples/bpm-gorev-kontrol.json +0 -294
  133. package/dist/resources/examples/bpm-iso-dokuman.json +0 -228
  134. package/dist/resources/examples/bpm-satinalma.json +0 -376
  135. package/dist/resources/examples/connect-data-convert-verify.json +0 -107
  136. package/dist/resources/examples/connect-data-dropdown-roles.json +0 -66
  137. package/dist/resources/examples/connect-data-edit-m2m.json +0 -73
  138. package/dist/resources/examples/connect-data-query-params.json +0 -50
  139. package/dist/resources/examples/connect-data-table-entity.json +0 -147
  140. package/dist/resources/examples/connect-data-workflow-microservice.json +0 -65
  141. package/dist/resources/examples/mobile-app-shell-drawer.json +0 -243
  142. package/dist/resources/examples/mobile-app-shell-stack.json +0 -157
  143. package/dist/resources/examples/mobile-app-shell-tab.json +0 -208
  144. package/dist/resources/examples/mobile-form-screen.json +0 -365
  145. package/dist/resources/examples/mobile-list-detail-form.json +0 -672
  146. package/dist/resources/guides/access.md +0 -796
  147. package/dist/resources/guides/bpm.md +0 -686
  148. package/dist/resources/guides/case.md +0 -153
  149. package/dist/resources/guides/decision.md +0 -185
  150. package/dist/resources/guides/mobile-layout.md +0 -193
  151. package/dist/resources/guides/mobile.md +0 -495
  152. package/dist/resources/read.js +0 -41
  153. package/dist/resources/schemas/AccessExplanationDto.json +0 -144
  154. package/dist/resources/schemas/AccessMatrixDto.json +0 -170
  155. package/dist/resources/schemas/AccessPermissionDto.json +0 -57
  156. package/dist/resources/schemas/AccessPolicyDto.json +0 -223
  157. package/dist/resources/schemas/AccessResourceDto.json +0 -86
  158. package/dist/resources/schemas/AppSessionDto.json +0 -53
  159. package/dist/resources/schemas/ConnectDataDescribeDto.json +0 -344
  160. package/dist/resources/schemas/ConnectDataRequestModel.json +0 -202
  161. package/dist/resources/schemas/ConnectDataResultDto.json +0 -421
  162. package/dist/resources/schemas/ConnectorCredentialDto.json +0 -70
  163. package/dist/resources/schemas/ConvertConnectDataToMicroserviceCommand.json +0 -37
  164. package/dist/resources/schemas/CreateAccessPolicyCommand.json +0 -209
  165. package/dist/resources/schemas/CreateDecisionCommand.json +0 -221
  166. package/dist/resources/schemas/CreateProcessDefinitionCommand.json +0 -1337
  167. package/dist/resources/schemas/DecisionDto.json +0 -302
  168. package/dist/resources/schemas/DetachConnectDataMicroserviceCommand.json +0 -28
  169. package/dist/resources/schemas/ExplainAccessQuery.json +0 -33
  170. package/dist/resources/schemas/GenerateProcessDocumentCommand.json +0 -116
  171. package/dist/resources/schemas/OrganizationProjectDto.json +0 -335
  172. package/dist/resources/schemas/OrganizationSchemaDto.json +0 -196
  173. package/dist/resources/schemas/OrganizationSchemaVersionDto.json +0 -207
  174. package/dist/resources/schemas/PatchProcessDefinitionCommand.json +0 -76
  175. package/dist/resources/schemas/ProcessDefinitionDto.json +0 -1480
  176. package/dist/resources/schemas/ProcessSimulationDto.json +0 -96
  177. package/dist/resources/schemas/SaveConnectorCredentialCommand.json +0 -90
  178. package/dist/resources/schemas/SaveProcessEventSourceCommand.json +0 -61
  179. package/dist/resources/schemas/SaveProcessMailSourceCommand.json +0 -89
  180. package/dist/resources/schemas/SignProcessTaskCommand.json +0 -73
  181. package/dist/resources/schemas/SimulateProcessDefinitionQuery.json +0 -92
  182. package/dist/resources/schemas/UpdateAccessPolicyCommand.json +0 -209
  183. package/dist/resources/schemas/UpdateDecisionCommand.json +0 -216
  184. package/dist/resources/schemas/UpdateProcessDefinitionCommand.json +0 -1357
  185. package/dist/resources/schemas/ValidateProcessDefinitionQuery.json +0 -1339
  186. package/dist/tools/accessOperations.js +0 -135
  187. package/dist/tools/accessPolicies.js +0 -170
  188. package/dist/tools/accessRuntime.js +0 -203
  189. package/dist/tools/bpm.js +0 -343
  190. package/dist/tools/bpmGovernance.js +0 -266
  191. package/dist/tools/bpmOperations.js +0 -230
  192. package/dist/tools/bpmReporting.js +0 -154
  193. package/dist/tools/bpmRouting.js +0 -150
  194. package/dist/tools/bpmRuntime.js +0 -396
  195. package/dist/tools/case.js +0 -178
  196. package/dist/tools/caseRuntime.js +0 -89
  197. package/dist/tools/connectData.js +0 -449
  198. package/dist/tools/connectors.js +0 -193
  199. package/dist/tools/decisions.js +0 -206
  200. package/dist/tools/mobile.js +0 -221
  201. package/dist/tools/modules.js +0 -48
  202. package/dist/tools/organizationStructure.js +0 -137
  203. package/dist/tools/profileWrite.js +0 -92
@@ -1,8 +1,6 @@
1
- import { invalidScreenEventNames, invalidWidgetTypeNodes, nestedRepeaterNodes, nestedRepeaterMessage, blockSizeNote, heightTypeNote, sizeStringNote, droppableStatesNote } from '../knowledge/normalize.js';
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 { reservedExpressionName } from '../knowledge/expressionPrelude.js';
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' && reservedExpressionName(name) === FUNCTIONS_NAMESPACE) {
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. `platform` yalnız PAGE-013 mesajının önerisini seçer
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, platform) {
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, platform), 400);
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), ...droppableStatesNote(catalog.states)];
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
  }
@@ -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 = jsonArray(z.array(z.record(z.unknown())))
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 = jsonArray(z.array(z.record(z.unknown())))
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, nativeTheme) {
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
- // Mobil uygulama: stil CSS değil React Native nesnesidir (`shell` kutu, `text` metin).
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, nativeTheme));
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
  }
@@ -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 | process-definition (yalnız aktif sürüm; kurulumda yeni kimlik, uygulama/workflow/sayfa/DTO kimlikleri yeniden eşlenir, var olan aynı slug'lı tanımda yeni sürüm yayınlanır ve uyarlama korunur) | business-calendar … (platform Module enum değeri, kebab-case)")
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' }), false);
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
  }));
@@ -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, ...(entry.storage ? { storage: entry.storage } : {}) }));
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, storage?}] dizisi döndürür; storage yoksa değişken bellektedir. Sayfada okuma yolu: state.page.<key> (uygulama düzeyinde state.app.<key>).",
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>' }. State varsayılan olarak BELLEKTEDİR: sayfa her açıldığında value'dan başlar. Mobil uygulamada kalıcı olması için variables[].storage verin (platform_guide('mobile') §Kalıcı state).",
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. storage vermediğiniz değişkenin kayıttaki saklama türü korunur.",
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,
@@ -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 = jsonArray(z.array(z.record(z.unknown())).min(1))
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 bir JavaScript İFADESİDİR ve parantezli nesne yazılır: \"({ id: 1 })\" — nesne gönderilirse platform 'Unexpected end of input' ile 500 döner; '{' ile başlayan metin blok olarak ayrıştırılır, 'JSON.stringify(…)' metni nesne değil string üretir — ikisi de sessizce input: {} ile koşardı ve WF-016 ile istek gitmeden durur (38/M-12). 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'),
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.30",
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
+ }