@appaflytech/zeyrek-ai-mcp 0.0.31 → 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 (205) 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 +233 -568
  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 -366
  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/middleware-authenticate.json +1 -1
  30. package/dist/resources/examples/page-detail-profile.json +1 -2
  31. package/dist/resources/examples/page-dynamic-form.json +2 -3
  32. package/dist/resources/examples/page-flex-sections.json +1 -1
  33. package/dist/resources/examples/page-html-embed.json +1 -1
  34. package/dist/resources/examples/workflow-basic.json +2 -8
  35. package/dist/resources/guides/component.md +5 -92
  36. package/dist/resources/guides/entity.md +8 -50
  37. package/dist/resources/guides/expressions.md +5 -14
  38. package/dist/resources/guides/functions.md +1 -1
  39. package/dist/resources/guides/getting-started.md +1 -38
  40. package/dist/resources/guides/layout.md +58 -55
  41. package/dist/resources/guides/merge.md +3 -37
  42. package/dist/resources/guides/microservice.md +2 -87
  43. package/dist/resources/guides/middleware.md +4 -68
  44. package/dist/resources/guides/page.md +75 -456
  45. package/dist/resources/guides/theme.md +2 -8
  46. package/dist/resources/guides/translation.md +1 -1
  47. package/dist/resources/guides/workflow.md +1 -58
  48. package/dist/resources/rules.js +5 -11
  49. package/dist/resources/schema-fingerprint.json +5 -7
  50. package/dist/resources/schemas/CreateEntityCommand.json +0 -118
  51. package/dist/resources/schemas/CreateMicroserviceCommand.json +1 -13
  52. package/dist/resources/schemas/CreateQueryCommand.json +0 -4
  53. package/dist/resources/schemas/CreateWorkflowCommand.json +1 -146
  54. package/dist/resources/schemas/DataJobDto.json +1 -6
  55. package/dist/resources/schemas/GlobalFunctionUpdateResultDto.json +1 -21
  56. package/dist/resources/schemas/MicroserviceDto.json +3 -15
  57. package/dist/resources/schemas/PreviewMicroserviceCommand.json +1 -10
  58. package/dist/resources/schemas/PreviewWorkflowCommand.json +1 -25
  59. package/dist/resources/schemas/StepDto.json +1 -25
  60. package/dist/resources/schemas/UpdateEntityCommand.json +0 -118
  61. package/dist/resources/schemas/UpdateMicroserviceCommand.json +1 -13
  62. package/dist/resources/schemas/UpdateQueryCommand.json +0 -4
  63. package/dist/resources/schemas/UpdateViewCommand.json +2 -0
  64. package/dist/resources/schemas/UpdateWorkflowCommand.json +1 -146
  65. package/dist/server.js +1 -27
  66. package/dist/tools/access.js +2 -369
  67. package/dist/tools/applications.js +3 -60
  68. package/dist/tools/common.js +0 -7
  69. package/dist/tools/components.js +14 -118
  70. package/dist/tools/datasources.js +3 -3
  71. package/dist/tools/dependencies.js +1 -1
  72. package/dist/tools/deployments.js +3 -38
  73. package/dist/tools/designSchemaPatch.js +18 -34
  74. package/dist/tools/dtos.js +5 -36
  75. package/dist/tools/entities.js +12 -79
  76. package/dist/tools/externalComponents.js +5 -26
  77. package/dist/tools/flows.js +14 -122
  78. package/dist/tools/folders.js +1 -1
  79. package/dist/tools/imports.js +2 -5
  80. package/dist/tools/layouts.js +17 -50
  81. package/dist/tools/merges.js +2 -2
  82. package/dist/tools/microservices.js +25 -77
  83. package/dist/tools/pages.js +112 -465
  84. package/dist/tools/platformInfo.js +8 -27
  85. package/dist/tools/projects.js +9 -71
  86. package/dist/tools/rows.js +13 -69
  87. package/dist/tools/schemaOps.js +1 -61
  88. package/dist/tools/screenWrite.js +8 -37
  89. package/dist/tools/screens.js +5 -95
  90. package/dist/tools/templates.js +1 -26
  91. package/dist/tools/translations.js +1 -1
  92. package/dist/tools/variables.js +5 -11
  93. package/dist/tools/workflows.js +5 -10
  94. package/package.json +1 -1
  95. package/dist/knowledge/access.js +0 -802
  96. package/dist/knowledge/case.js +0 -41
  97. package/dist/knowledge/connectDataBind.js +0 -819
  98. package/dist/knowledge/connectDataDefinition.js +0 -341
  99. package/dist/knowledge/connectDataExecute.js +0 -93
  100. package/dist/knowledge/connectDataRules.js +0 -128
  101. package/dist/knowledge/decision.js +0 -121
  102. package/dist/knowledge/expressionPrelude.js +0 -59
  103. package/dist/knowledge/microserviceParameters.js +0 -58
  104. package/dist/knowledge/mining.js +0 -94
  105. package/dist/knowledge/mobileComponentCatalog.js +0 -859
  106. package/dist/knowledge/mobileComponentEvents.js +0 -239
  107. package/dist/knowledge/platform/lint.js +0 -385
  108. package/dist/knowledge/platform/mobile.js +0 -142
  109. package/dist/knowledge/platform/mobileLayoutLint.js +0 -324
  110. package/dist/knowledge/platform/mobileRules.js +0 -231
  111. package/dist/knowledge/platform/mobileSpacing.js +0 -82
  112. package/dist/knowledge/platform/mobileTabs.js +0 -108
  113. package/dist/knowledge/platform/nativeBoxModel.js +0 -44
  114. package/dist/knowledge/platform/profile.js +0 -25
  115. package/dist/knowledge/platform/resolve.js +0 -122
  116. package/dist/knowledge/platform/web.js +0 -39
  117. package/dist/knowledge/process.js +0 -510
  118. package/dist/knowledge/rowFilter.js +0 -43
  119. package/dist/knowledge/styleResolveNative.js +0 -527
  120. package/dist/platform/argumentAliases.js +0 -128
  121. package/dist/platform/bodyFile.js +0 -103
  122. package/dist/platform/capture/actions.js +0 -333
  123. package/dist/platform/capture/browser.js +0 -1
  124. package/dist/platform/capture/console-log.js +0 -122
  125. package/dist/platform/capture/index.js +0 -11
  126. package/dist/platform/capture/readiness.js +0 -103
  127. package/dist/platform/capture/summary.js +0 -77
  128. package/dist/platform/capture/target.js +0 -5
  129. package/dist/platform/capture/targets/studio-mobile.js +0 -15
  130. package/dist/platform/capture/targets/studio-web.js +0 -5
  131. package/dist/platform/impersonation.js +0 -45
  132. package/dist/platform/jsonArray.js +0 -24
  133. package/dist/platform/schemaReadMemory.js +0 -60
  134. package/dist/resources/examples/bpm-gorev-kontrol.json +0 -294
  135. package/dist/resources/examples/bpm-iso-dokuman.json +0 -228
  136. package/dist/resources/examples/bpm-satinalma.json +0 -376
  137. package/dist/resources/examples/connect-data-convert-verify.json +0 -107
  138. package/dist/resources/examples/connect-data-dropdown-roles.json +0 -66
  139. package/dist/resources/examples/connect-data-edit-m2m.json +0 -73
  140. package/dist/resources/examples/connect-data-query-params.json +0 -50
  141. package/dist/resources/examples/connect-data-table-entity.json +0 -147
  142. package/dist/resources/examples/connect-data-workflow-microservice.json +0 -65
  143. package/dist/resources/examples/mobile-app-shell-drawer.json +0 -243
  144. package/dist/resources/examples/mobile-app-shell-stack.json +0 -157
  145. package/dist/resources/examples/mobile-app-shell-tab.json +0 -208
  146. package/dist/resources/examples/mobile-form-screen.json +0 -365
  147. package/dist/resources/examples/mobile-list-detail-form.json +0 -672
  148. package/dist/resources/guides/access.md +0 -810
  149. package/dist/resources/guides/bpm.md +0 -691
  150. package/dist/resources/guides/case.md +0 -153
  151. package/dist/resources/guides/decision.md +0 -185
  152. package/dist/resources/guides/mobile-layout.md +0 -193
  153. package/dist/resources/guides/mobile.md +0 -495
  154. package/dist/resources/read.js +0 -41
  155. package/dist/resources/schemas/AccessExplanationDto.json +0 -144
  156. package/dist/resources/schemas/AccessMatrixDto.json +0 -170
  157. package/dist/resources/schemas/AccessPermissionDto.json +0 -57
  158. package/dist/resources/schemas/AccessPolicyDto.json +0 -223
  159. package/dist/resources/schemas/AccessResourceDto.json +0 -86
  160. package/dist/resources/schemas/AppSessionDto.json +0 -53
  161. package/dist/resources/schemas/ConnectDataDescribeDto.json +0 -344
  162. package/dist/resources/schemas/ConnectDataRequestModel.json +0 -202
  163. package/dist/resources/schemas/ConnectDataResultDto.json +0 -421
  164. package/dist/resources/schemas/ConnectorCredentialDto.json +0 -70
  165. package/dist/resources/schemas/ConvertConnectDataToMicroserviceCommand.json +0 -37
  166. package/dist/resources/schemas/CreateAccessPolicyCommand.json +0 -209
  167. package/dist/resources/schemas/CreateDecisionCommand.json +0 -221
  168. package/dist/resources/schemas/CreateProcessDefinitionCommand.json +0 -1337
  169. package/dist/resources/schemas/DecisionDto.json +0 -302
  170. package/dist/resources/schemas/DetachConnectDataMicroserviceCommand.json +0 -28
  171. package/dist/resources/schemas/ExplainAccessQuery.json +0 -33
  172. package/dist/resources/schemas/GenerateProcessDocumentCommand.json +0 -116
  173. package/dist/resources/schemas/OrganizationProjectDto.json +0 -335
  174. package/dist/resources/schemas/OrganizationSchemaDto.json +0 -196
  175. package/dist/resources/schemas/OrganizationSchemaVersionDto.json +0 -207
  176. package/dist/resources/schemas/PatchProcessDefinitionCommand.json +0 -76
  177. package/dist/resources/schemas/ProcessDefinitionDto.json +0 -1480
  178. package/dist/resources/schemas/ProcessSimulationDto.json +0 -96
  179. package/dist/resources/schemas/SaveConnectorCredentialCommand.json +0 -90
  180. package/dist/resources/schemas/SaveProcessEventSourceCommand.json +0 -61
  181. package/dist/resources/schemas/SaveProcessMailSourceCommand.json +0 -89
  182. package/dist/resources/schemas/SignProcessTaskCommand.json +0 -73
  183. package/dist/resources/schemas/SimulateProcessDefinitionQuery.json +0 -92
  184. package/dist/resources/schemas/UpdateAccessPolicyCommand.json +0 -209
  185. package/dist/resources/schemas/UpdateDecisionCommand.json +0 -216
  186. package/dist/resources/schemas/UpdateProcessDefinitionCommand.json +0 -1357
  187. package/dist/resources/schemas/ValidateProcessDefinitionQuery.json +0 -1339
  188. package/dist/tools/accessOperations.js +0 -135
  189. package/dist/tools/accessPolicies.js +0 -170
  190. package/dist/tools/accessRuntime.js +0 -203
  191. package/dist/tools/bpm.js +0 -343
  192. package/dist/tools/bpmGovernance.js +0 -266
  193. package/dist/tools/bpmOperations.js +0 -230
  194. package/dist/tools/bpmReporting.js +0 -154
  195. package/dist/tools/bpmRouting.js +0 -150
  196. package/dist/tools/bpmRuntime.js +0 -396
  197. package/dist/tools/case.js +0 -178
  198. package/dist/tools/caseRuntime.js +0 -89
  199. package/dist/tools/connectData.js +0 -449
  200. package/dist/tools/connectors.js +0 -193
  201. package/dist/tools/decisions.js +0 -206
  202. package/dist/tools/mobile.js +0 -221
  203. package/dist/tools/modules.js +0 -48
  204. package/dist/tools/organizationStructure.js +0 -137
  205. 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
- }