@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,121 +0,0 @@
1
- const guide = 'ngapps://guides/decision';
2
- /**
3
- * b-81 `FeelExpressionResolver.FunctionNames` ile birebir. Backend doğrulayıcısı her ifadeyi YAZIMDA
4
- * ayrıştırır ve listede olmayan çağrıyı 422 ile reddeder (içe aktarma dahil); gateway istek gitmeden
5
- * uyarır (DMN-002). Denetim sözcük tabanlı ve sezgisel olduğu için block değil warn.
6
- */
7
- export const feelFunctionNames = new Set([
8
- 'years and months duration', 'date and time', 'string length', 'upper case', 'lower case', 'starts with', 'ends with',
9
- 'list contains', 'substring before', 'substring after', 'distinct values', 'index of', 'get value',
10
- 'date', 'time', 'duration', 'substring', 'contains', 'matches', 'replace', 'string', 'number', 'not',
11
- 'count', 'sum', 'product', 'min', 'max', 'mean', 'all', 'any', 'append', 'concatenate', 'flatten', 'reverse',
12
- 'abs', 'floor', 'ceiling', 'decimal', 'modulo', 'sqrt', 'odd', 'even'
13
- ]);
14
- const feelKeywords = new Set(['if', 'then', 'else', 'and', 'or', 'in', 'between', 'return', 'satisfies', 'for', 'some', 'every', 'function', 'instance', 'of']);
15
- const wildcardEntries = new Set(['', '-']);
16
- function asObjects(value) {
17
- return (Array.isArray(value) ? value : []).filter((entry) => Boolean(entry) && typeof entry === 'object' && !Array.isArray(entry));
18
- }
19
- function asStrings(value) {
20
- return (Array.isArray(value) ? value : []).map(entry => typeof entry === 'string' ? entry : '');
21
- }
22
- function normalizedEntry(entry) {
23
- return entry.replace(/\s+/g, ' ').trim();
24
- }
25
- /**
26
- * Çok sözcüklü FEEL işlev adı ("string length(") sözcük dizisinin SONEKİdir: önündeki "if"
27
- * gibi anahtar sözcükler ve değişken adları çağrının parçası değildir. Bilinen bir sonek yoksa
28
- * anahtar sözcükler atılıp kalan dizi bilinmeyen işlev adı sayılır.
29
- */
30
- export function unknownFeelFunctions(expression) {
31
- const withoutStrings = expression.replace(/"(?:[^"\\]|\\.)*"/g, '""');
32
- const unknown = [];
33
- for (const match of withoutStrings.matchAll(/([A-Za-z_][A-Za-z0-9_]*(?:[ \t]+[A-Za-z_][A-Za-z0-9_]*)*)[ \t]*\(/g)) {
34
- const words = (match[1] ?? '').split(/[ \t]+/);
35
- if (feelKeywords.has(words[words.length - 1]))
36
- continue;
37
- const isKnown = words.some((_, index) => feelFunctionNames.has(words.slice(index).join(' ')));
38
- if (isKnown)
39
- continue;
40
- let firstNameIndex = 0;
41
- while (firstNameIndex < words.length && feelKeywords.has(words[firstNameIndex]))
42
- firstNameIndex++;
43
- const name = words.slice(firstNameIndex).join(' ');
44
- if (name !== '' && !unknown.includes(name))
45
- unknown.push(name);
46
- }
47
- return unknown;
48
- }
49
- function decisionExpressions(decision) {
50
- const expressions = [];
51
- asObjects(decision.inputs).forEach((input, index) => {
52
- if (typeof input.expression === 'string')
53
- expressions.push({ path: `/inputs/${index}/expression`, expression: input.expression });
54
- if (typeof input.allowedValues === 'string')
55
- expressions.push({ path: `/inputs/${index}/allowedValues`, expression: input.allowedValues });
56
- });
57
- asObjects(decision.outputs).forEach((output, index) => {
58
- if (typeof output.defaultOutputEntry === 'string')
59
- expressions.push({ path: `/outputs/${index}/defaultOutputEntry`, expression: output.defaultOutputEntry });
60
- });
61
- asObjects(decision.rules).forEach((rule, ruleIndex) => {
62
- asStrings(rule.inputEntries).forEach((entry, entryIndex) => expressions.push({ path: `/rules/${ruleIndex}/inputEntries/${entryIndex}`, expression: entry }));
63
- asStrings(rule.outputEntries).forEach((entry, entryIndex) => expressions.push({ path: `/rules/${ruleIndex}/outputEntries/${entryIndex}`, expression: entry }));
64
- });
65
- if (typeof decision.literalExpression === 'string')
66
- expressions.push({ path: '/literalExpression', expression: decision.literalExpression });
67
- return expressions;
68
- }
69
- /**
70
- * DMN-001 (block): `unique` tabloda iki kural her girdi sütununda aynı testi ya da joker (`-`)
71
- * taşıyorsa aynı girdi ikisini de eşler ve motor 422 `DecisionHitPolicyViolated` döner. Denetim
72
- * statik ve temkinlidir: yalnız KESİN çakışmayı yakalar, kesişen aralıkları (`< 10` ve `< 20`)
73
- * yakalamaz — o çakışma `decision_preview` ile görülür.
74
- * DMN-002 (warn): b-81 FEEL alt kümesinde olmayan işlev çağrısı; backend yazımı 422 ile reddeder.
75
- */
76
- export function decisionFindings(decision) {
77
- const findings = [];
78
- const hitPolicy = typeof decision.hitPolicy === 'string' ? decision.hitPolicy : 'unique';
79
- const kind = typeof decision.kind === 'string' ? decision.kind : 'table';
80
- if (kind === 'table' && hitPolicy === 'unique') {
81
- const rules = asObjects(decision.rules);
82
- const columnCount = asObjects(decision.inputs).length;
83
- for (let left = 0; left < rules.length; left++) {
84
- for (let right = left + 1; right < rules.length; right++) {
85
- const leftEntries = asStrings(rules[left].inputEntries).map(normalizedEntry);
86
- const rightEntries = asStrings(rules[right].inputEntries).map(normalizedEntry);
87
- const overlaps = Array.from({ length: Math.max(columnCount, leftEntries.length, rightEntries.length) }, (_, column) => {
88
- const leftEntry = leftEntries[column] ?? '';
89
- const rightEntry = rightEntries[column] ?? '';
90
- return wildcardEntries.has(leftEntry) || wildcardEntries.has(rightEntry) || leftEntry === rightEntry;
91
- }).every(Boolean);
92
- if (!overlaps)
93
- continue;
94
- const leftId = String(rules[left].id ?? `#${left + 1}`);
95
- const rightId = String(rules[right].id ?? `#${right + 1}`);
96
- findings.push({
97
- ruleId: 'DMN-001',
98
- severity: 'block',
99
- message: `'${String(decision.slug ?? '')}' unique tablosunda '${leftId}' ve '${rightId}' kuralları aynı girdiyi eşler (her sütunda aynı test ya da '-'); değerlendirme 422 DecisionHitPolicyViolated döner. Kuralları ayırın ya da hitPolicy 'first' / 'priority' / 'collect' seçin.`,
100
- guide
101
- });
102
- }
103
- }
104
- }
105
- const unknownByName = new Map();
106
- for (const { path, expression } of decisionExpressions(decision)) {
107
- for (const name of unknownFeelFunctions(expression)) {
108
- if (!unknownByName.has(name))
109
- unknownByName.set(name, path);
110
- }
111
- }
112
- for (const [name, path] of unknownByName) {
113
- findings.push({
114
- ruleId: 'DMN-002',
115
- severity: 'warn',
116
- message: `FEEL işlevi '${name}' (${path}) motorun alt kümesinde yok; backend yazımı (create, update, patch, DMN içe aktarma) 422 ile reddeder. Desteklenenler platform_guide('decision') §FEEL; ör. yuvarlama için decimal(x, 0), floor, ceiling.`,
117
- guide
118
- });
119
- }
120
- return findings;
121
- }
@@ -1,59 +0,0 @@
1
- import { FUNCTIONS_NAMESPACE } from './functionGuards.js';
2
- /**
3
- * İstemci ifade preamble'ının ayrılmış adları — `zeyrek-frontend/packages/ng-apps-flow/src/
4
- * flow-execution.functions.ts` `EXPRESSION_PRELUDE_NAMES` ile BİREBİR (elle aynalanır, sürüklenmeyi
5
- * `test/expression-prelude-parity.test.ts` yakalar). Runtime `Components` anahtarlarını
6
- * `key.replace('-', '')` (YALNIZ ilk tire) ile tanımlayıcıya çevirir ve bu kümedeki adı uyarıyla
7
- * ELER: o komponent sayfadaki hiçbir ifadede görünmez (ARC-143, PAGE-009).
8
- */
9
- export const EXPRESSION_PRELUDE_NAMES = [
10
- 'payload',
11
- FUNCTIONS_NAMESPACE,
12
- 'machine',
13
- 'params',
14
- '_PROXY_TAG',
15
- '_STATE_PROXY_TAG',
16
- 'Components',
17
- 'Page',
18
- '_stripProxy',
19
- '_buildPath',
20
- '_resolveStateProxy',
21
- '_stripStateProxy',
22
- 'log',
23
- '_statePathValue',
24
- 'createStateScopeProxy',
25
- 'state',
26
- 'Steps',
27
- 'error',
28
- 'Widget',
29
- 'LocalStorage',
30
- 'Device',
31
- 'Section',
32
- 'Row',
33
- 'RowIndex',
34
- '_eventSourceId',
35
- '_eventSourceNode',
36
- 'event',
37
- 'item',
38
- 'self',
39
- 'addSetters',
40
- '_rawComponents',
41
- '_eventParams',
42
- 'repeaterId',
43
- 'setComponentProperty',
44
- 'getComponentProperty',
45
- 'resetForm',
46
- 't',
47
- 'cookie',
48
- '__fnArgs'
49
- ];
50
- const RESERVED_EXPRESSION_NAMES = new Set(EXPRESSION_PRELUDE_NAMES);
51
- /**
52
- * Komponent adının runtime'daki ifade tanımlayıcısı ayrılmışsa o tanımlayıcıyı döndürür. Tire
53
- * işleme runtime'la aynıdır (yalnız ilk `-` silinir): `ite-m` → `item` gizlenir, `i-te-m` →
54
- * `ite-m` gizlenmez.
55
- */
56
- export function reservedExpressionName(componentName) {
57
- const identifier = componentName.replace('-', '');
58
- return RESERVED_EXPRESSION_NAMES.has(identifier) ? identifier : undefined;
59
- }
@@ -1,58 +0,0 @@
1
- /**
2
- * MS-023 — tablo kaynaklı ucun ÇAĞRI PARAMETRESİ adı ve kök filtre alias'ı.
3
- *
4
- * Runtime kuralı (`PostgreSqlRelationHandler`): bir filtrenin alanı önce alias'tan çözülür —
5
- * `GetField` alias'ı ya ANA ENTITY'nin SLUG'ıyla ya da bir join alias'ıyla eşler, başka hiçbir
6
- * değeri tanımaz. Çözülen filtrenin çağrı parametresi ise `ResolveSingleField`'da
7
- * `alias == mainEntity.Slug ? field.Slug : '<alias>.<field.Slug>'` olur. Tasarım zamanındaki
8
- * `parameterScheme` üretimi (`Microservice.SourceEntityParameterScheme`) AYNI kuralı uygular, yani
9
- * uç çağrılabilir olduğu sürece şemadaki ad runtime'ın beklediği addır.
10
- *
11
- * Kusur tek bir yerde doğar: kök filtrenin alias'ı entity slug'ından FARKLI verilirse
12
- * (`sourceParameters.alias`'ı entity slug'ı sanmak yaygın hata) filtre runtime'da hiç çözülmez.
13
- * Zorunlu filtrede sonuç 400 `FilterFieldNotResolvedException`'dır ve parametre HANGİ adla
14
- * gönderilirse gönderilsin değişmez; `parameterScheme` ise nitelikli adı (`kredi.id`) gösterip
15
- * "adı yanlış yazmışım" izlenimi verir.
16
- *
17
- * Ölçüm 2026-09-20 (`rehber-basit/tb119-get`, entity slug `tb119_urun`):
18
- * alias 'u' → parameterScheme 'u.kod' · çağrı 400 FilterFieldNotResolvedException
19
- * alias 'tb119_urun' → parameterScheme 'kod' · çağrı 200
20
- *
21
- * Bu yüzden gateway adı YENİDEN ADLANDIRMAZ (çalışmayan bir ucu çalışıyormuş gibi gösterirdi);
22
- * çözülmeyen alias'ı işaretler ve düzeltince parametrenin hangi ad olacağını söyler.
23
- */
24
- function collectJoinAliases(joins, into) {
25
- for (const join of Array.isArray(joins) ? joins : []) {
26
- if (!join || typeof join !== 'object')
27
- continue;
28
- const record = join;
29
- if (typeof record.alias === 'string' && record.alias !== '')
30
- into.add(record.alias);
31
- collectJoinAliases(record.joins, into);
32
- }
33
- }
34
- export function unresolvedParameterAliases(definition) {
35
- if (String(definition.source ?? '') !== 'table')
36
- return [];
37
- const sourceParameters = (definition.sourceParameters ?? {});
38
- const joinAliases = new Set();
39
- collectJoinAliases(sourceParameters.joins, joinAliases);
40
- const scheme = Array.isArray(definition.parameterScheme) ? definition.parameterScheme : [];
41
- return scheme
42
- .map(entry => String(entry?.name ?? ''))
43
- .filter(name => name.includes('.'))
44
- .map(name => ({ name, alias: name.slice(0, name.indexOf('.')), field: name.slice(name.indexOf('.') + 1) }))
45
- .filter(entry => entry.alias !== '' && !joinAliases.has(entry.alias));
46
- }
47
- export function parameterAliasWarning(entries, entitySlug) {
48
- if (entries.length === 0)
49
- return undefined;
50
- const lines = entries.map(entry => `'${entry.name}' (alias '${entry.alias}')`);
51
- const target = entitySlug === undefined
52
- ? "entity'nin SLUG'ı (entity_get ile okuyun; sourceParameters.alias DEĞİL)"
53
- : `'${entitySlug}'`;
54
- return `MS-023 — bu ucun ${lines.join(' · ')} parametresi runtime'da ÇÖZÜLMEZ: nitelikli adın alias'ı ne bir join alias'ı ne de entity slug'ı. `
55
- + `Kök filtrenin alias'ı ${target} olmak zorundadır (PostgreSqlRelationHandler.GetField); bu hâliyle zorunlu filtre 400 FilterFieldNotResolvedException verir ve parametreyi HANGİ adla gönderirseniz gönderin sonuç değişmez. `
56
- + `Alias düzeltilince çağrı parametresi nitelenmemiş alan slug'ı olur: ${entries.map(entry => `'${entry.field}'`).join(' · ')}. `
57
- + "Düzeltme: microservice_patch { op: 'replace', path: '/sourceParameters/filters/<i>/alias', value: '<entity slug>' }. Ölçüldü 2026-09-20.";
58
- }
@@ -1,94 +0,0 @@
1
- /**
2
- * b-91 süreç madenciliği dışa aktarımının gateway tarafı denetimi. Resmî IEEE XES XSD'si ve OCEL 2.0
3
- * JSON şeması için doğrulayıcı kütüphane (libxml, ajv) paket onayı ister; bu yüzden denetim
4
- * **yapısaldır** ve yanıtta `validation: 'structural'` diye adlandırılır — dış aracın açıp
5
- * açmayacağının kanıtı değildir, bozuk ya da eksik dosyayı ilk elden yakalar.
6
- */
7
- const maxProblems = 20;
8
- /** ISO 8601 tarih-saat; `Date.parse` tek başına '1' gibi değerleri de tarih sayar */
9
- const isIsoTimestamp = (value) => !!value && /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}(:\d{2}(\.\d+)?)?(Z|[+-]\d{2}:?\d{2})$/.test(value) && !Number.isNaN(Date.parse(value));
10
- /**
11
- * XES: kök `log` ve `xes.version`, her iz `trace` en az bir `concept:name` taşır, her olayda
12
- * `concept:name` ve ayrıştırılabilir `time:timestamp` vardır.
13
- */
14
- export function checkXes(xml) {
15
- const problems = [];
16
- const root = /^\s*(?:<\?xml[^>]*\?>\s*)?(?:<!--[\s\S]*?-->\s*)*<log\b([^>]*)>/.exec(xml);
17
- if (!root)
18
- problems.push("kök öğe 'log' değil");
19
- else if (!/\bxes\.version="[^"]+"/.test(root[1] ?? ''))
20
- problems.push("'log' öğesinde xes.version yok");
21
- const traces = [...xml.matchAll(/<trace\b[^>]*>([\s\S]*?)<\/trace>/g)];
22
- let eventCount = 0;
23
- traces.forEach((trace, traceIndex) => {
24
- const body = trace[1] ?? '';
25
- const events = [...body.matchAll(/<event\b[^>]*>([\s\S]*?)<\/event>/g)];
26
- const traceAttributes = body.replace(/<event\b[^>]*>[\s\S]*?<\/event>/g, '');
27
- const topLevelAttributes = traceAttributes.replace(/<(string|date|int|float|boolean|id|list|container)\b[^>]*[^/]>[\s\S]*?<\/\1>/g, '');
28
- if (!/<string\b[^>]*key="concept:name"/.test(topLevelAttributes))
29
- problems.push(`iz ${traceIndex + 1}: concept:name yok`);
30
- events.forEach((event, eventIndex) => {
31
- const eventBody = event[1] ?? '';
32
- const timestamp = /<date\b[^>]*key="time:timestamp"[^>]*value="([^"]*)"/.exec(eventBody)?.[1];
33
- eventCount++;
34
- if (!/key="concept:name"/.test(eventBody))
35
- problems.push(`iz ${traceIndex + 1} olay ${eventIndex + 1}: concept:name yok`);
36
- if (!isIsoTimestamp(timestamp))
37
- problems.push(`iz ${traceIndex + 1} olay ${eventIndex + 1}: time:timestamp yok ya da tarih değil`);
38
- });
39
- });
40
- return { validated: problems.length === 0, validation: 'structural', problems: problems.slice(0, maxProblems), traceCount: traces.length, eventCount };
41
- }
42
- /**
43
- * OCEL 2.0 JSON: dört dizi var; her nesne ve olay türü bildirilmiş; olay zamanı tarih; her
44
- * ilişki var olan bir nesneye bakar.
45
- */
46
- export function checkOcel(text) {
47
- let parsed;
48
- try {
49
- parsed = JSON.parse(text);
50
- }
51
- catch {
52
- return { validated: false, validation: 'structural', problems: ['JSON ayrıştırılamadı'], objectCount: 0, eventCount: 0 };
53
- }
54
- if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {
55
- return { validated: false, validation: 'structural', problems: ['kök değer nesne değil'], objectCount: 0, eventCount: 0 };
56
- }
57
- const log = parsed;
58
- const problems = [];
59
- for (const key of ['objectTypes', 'eventTypes', 'objects', 'events']) {
60
- if (!Array.isArray(log[key]))
61
- problems.push(`'${key}' dizisi yok`);
62
- }
63
- const entries = (value, name) => {
64
- const list = Array.isArray(value) ? value : [];
65
- const invalid = list.filter(entry => !entry || typeof entry !== 'object').length;
66
- if (invalid > 0)
67
- problems.push(`'${name}' içinde nesne olmayan ${invalid} kayıt`);
68
- return list.filter(entry => entry && typeof entry === 'object');
69
- };
70
- const objects = entries(log.objects, 'objects');
71
- const events = entries(log.events, 'events');
72
- const objectTypes = new Set(entries(log.objectTypes, 'objectTypes').map(objectType => objectType.name));
73
- const eventTypes = new Set(entries(log.eventTypes, 'eventTypes').map(eventType => eventType.name));
74
- const objectIds = new Set(objects.map(ocelObject => ocelObject.id));
75
- for (const ocelObject of objects) {
76
- if (!objectTypes.has(ocelObject.type))
77
- problems.push(`nesne ${ocelObject.id}: tür '${ocelObject.type}' objectTypes'ta yok`);
78
- for (const relationship of ocelObject.relationships ?? []) {
79
- if (!objectIds.has(relationship.objectId))
80
- problems.push(`nesne ${ocelObject.id}: ilişki '${relationship.objectId}' nesnelerde yok`);
81
- }
82
- }
83
- for (const event of events) {
84
- if (!eventTypes.has(event.type))
85
- problems.push(`olay ${event.id}: tür '${event.type}' eventTypes'ta yok`);
86
- if (!isIsoTimestamp(event.time))
87
- problems.push(`olay ${event.id}: time ISO 8601 tarih-saat değil`);
88
- for (const relationship of event.relationships ?? []) {
89
- if (!objectIds.has(relationship.objectId))
90
- problems.push(`olay ${event.id}: ilişki '${relationship.objectId}' nesnelerde yok`);
91
- }
92
- }
93
- return { validated: problems.length === 0, validation: 'structural', problems: problems.slice(0, maxProblems), objectCount: objects.length, eventCount: events.length };
94
- }