@appaflytech/zeyrek-ai-mcp 0.0.32 → 0.0.33

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 (167) hide show
  1. package/.env.example +15 -0
  2. package/dist/config.js +11 -0
  3. package/dist/index.js +2 -0
  4. package/dist/knowledge/access.js +802 -0
  5. package/dist/knowledge/case.js +41 -0
  6. package/dist/knowledge/componentCatalog.js +82 -213
  7. package/dist/knowledge/componentEvents.js +21 -19
  8. package/dist/knowledge/connectDataBind.js +819 -0
  9. package/dist/knowledge/connectDataDefinition.js +341 -0
  10. package/dist/knowledge/connectDataExecute.js +93 -0
  11. package/dist/knowledge/connectDataRules.js +128 -0
  12. package/dist/knowledge/decision.js +121 -0
  13. package/dist/knowledge/expressionPrelude.js +59 -0
  14. package/dist/knowledge/layoutSummary.js +140 -2
  15. package/dist/knowledge/microserviceParameters.js +58 -0
  16. package/dist/knowledge/mining.js +94 -0
  17. package/dist/knowledge/mobileComponentCatalog.js +864 -0
  18. package/dist/knowledge/mobileComponentEvents.js +239 -0
  19. package/dist/knowledge/mobileStore.js +227 -0
  20. package/dist/knowledge/normalize.js +121 -35
  21. package/dist/knowledge/platform/lint.js +385 -0
  22. package/dist/knowledge/platform/mobile.js +142 -0
  23. package/dist/knowledge/platform/mobileLayoutLint.js +324 -0
  24. package/dist/knowledge/platform/mobileRules.js +231 -0
  25. package/dist/knowledge/platform/mobileSpacing.js +82 -0
  26. package/dist/knowledge/platform/mobileTabs.js +108 -0
  27. package/dist/knowledge/platform/nativeBoxModel.js +44 -0
  28. package/dist/knowledge/platform/profile.js +25 -0
  29. package/dist/knowledge/platform/resolve.js +122 -0
  30. package/dist/knowledge/platform/web.js +39 -0
  31. package/dist/knowledge/process.js +510 -0
  32. package/dist/knowledge/rowFilter.js +43 -0
  33. package/dist/knowledge/rules.js +291 -19
  34. package/dist/knowledge/styleResolve.js +55 -38
  35. package/dist/knowledge/styleResolveNative.js +527 -0
  36. package/dist/knowledge/themeResolve.js +3 -3
  37. package/dist/observability/trace.js +1 -1
  38. package/dist/platform/argumentAliases.js +128 -0
  39. package/dist/platform/bodyFile.js +103 -0
  40. package/dist/platform/capture/actions.js +333 -0
  41. package/dist/platform/capture/browser.js +1 -0
  42. package/dist/platform/{screenshot.js → capture/capture.js} +81 -519
  43. package/dist/platform/capture/console-log.js +122 -0
  44. package/dist/platform/capture/index.js +11 -0
  45. package/dist/platform/capture/readiness.js +103 -0
  46. package/dist/platform/capture/summary.js +77 -0
  47. package/dist/platform/capture/target.js +5 -0
  48. package/dist/platform/capture/targets/studio-mobile.js +15 -0
  49. package/dist/platform/capture/targets/studio-web.js +5 -0
  50. package/dist/platform/diagnostics.js +10 -4
  51. package/dist/platform/domSummary.js +1 -1
  52. package/dist/platform/http.js +23 -7
  53. package/dist/platform/impersonation.js +45 -0
  54. package/dist/platform/jsonArray.js +24 -0
  55. package/dist/platform/responses.js +6 -2
  56. package/dist/platform/schemaReadMemory.js +60 -0
  57. package/dist/platform/secrets.js +9 -0
  58. package/dist/platform/strictArguments.js +68 -12
  59. package/dist/platform/tokenVault.js +187 -4
  60. package/dist/resources/examples/bpm-gorev-kontrol.json +294 -0
  61. package/dist/resources/examples/bpm-iso-dokuman.json +228 -0
  62. package/dist/resources/examples/bpm-satinalma.json +376 -0
  63. package/dist/resources/examples/connect-data-convert-verify.json +107 -0
  64. package/dist/resources/examples/connect-data-dropdown-roles.json +66 -0
  65. package/dist/resources/examples/connect-data-edit-m2m.json +73 -0
  66. package/dist/resources/examples/connect-data-query-params.json +50 -0
  67. package/dist/resources/examples/connect-data-table-entity.json +147 -0
  68. package/dist/resources/examples/connect-data-workflow-microservice.json +65 -0
  69. package/dist/resources/examples/layout-app-shell.json +229 -707
  70. package/dist/resources/examples/mobile-app-shell-drawer.json +244 -0
  71. package/dist/resources/examples/mobile-app-shell-stack.json +157 -0
  72. package/dist/resources/examples/mobile-app-shell-tab.json +208 -0
  73. package/dist/resources/examples/mobile-form-screen.json +365 -0
  74. package/dist/resources/examples/mobile-list-detail-form.json +703 -0
  75. package/dist/resources/examples/page-flex-sections.json +1 -1
  76. package/dist/resources/guides/access.md +796 -0
  77. package/dist/resources/guides/bpm.md +686 -0
  78. package/dist/resources/guides/case.md +153 -0
  79. package/dist/resources/guides/component.md +10 -2
  80. package/dist/resources/guides/decision.md +185 -0
  81. package/dist/resources/guides/expressions.md +14 -5
  82. package/dist/resources/guides/functions.md +1 -1
  83. package/dist/resources/guides/layout.md +55 -58
  84. package/dist/resources/guides/microservice.md +9 -2
  85. package/dist/resources/guides/middleware.md +34 -2
  86. package/dist/resources/guides/mobile-layout.md +193 -0
  87. package/dist/resources/guides/mobile.md +578 -0
  88. package/dist/resources/guides/page.md +221 -92
  89. package/dist/resources/guides/theme.md +8 -2
  90. package/dist/resources/guides/translation.md +1 -1
  91. package/dist/resources/guides/workflow.md +7 -1
  92. package/dist/resources/read.js +41 -0
  93. package/dist/resources/schema-fingerprint.json +4 -4
  94. package/dist/resources/schemas/AccessExplanationDto.json +144 -0
  95. package/dist/resources/schemas/AccessMatrixDto.json +170 -0
  96. package/dist/resources/schemas/AccessPermissionDto.json +57 -0
  97. package/dist/resources/schemas/AccessPolicyDto.json +223 -0
  98. package/dist/resources/schemas/AccessResourceDto.json +86 -0
  99. package/dist/resources/schemas/AppSessionDto.json +53 -0
  100. package/dist/resources/schemas/ConnectDataDescribeDto.json +344 -0
  101. package/dist/resources/schemas/ConnectDataRequestModel.json +202 -0
  102. package/dist/resources/schemas/ConnectDataResultDto.json +421 -0
  103. package/dist/resources/schemas/ConnectorCredentialDto.json +70 -0
  104. package/dist/resources/schemas/ConvertConnectDataToMicroserviceCommand.json +37 -0
  105. package/dist/resources/schemas/CreateAccessPolicyCommand.json +209 -0
  106. package/dist/resources/schemas/CreateDecisionCommand.json +221 -0
  107. package/dist/resources/schemas/CreateProcessDefinitionCommand.json +1337 -0
  108. package/dist/resources/schemas/DecisionDto.json +302 -0
  109. package/dist/resources/schemas/DetachConnectDataMicroserviceCommand.json +28 -0
  110. package/dist/resources/schemas/ExplainAccessQuery.json +33 -0
  111. package/dist/resources/schemas/GenerateProcessDocumentCommand.json +116 -0
  112. package/dist/resources/schemas/GlobalFunctionUpdateResultDto.json +3 -1
  113. package/dist/resources/schemas/MicroserviceDto.json +2 -2
  114. package/dist/resources/schemas/OrganizationProjectDto.json +335 -0
  115. package/dist/resources/schemas/OrganizationSchemaDto.json +196 -0
  116. package/dist/resources/schemas/OrganizationSchemaVersionDto.json +207 -0
  117. package/dist/resources/schemas/PatchProcessDefinitionCommand.json +76 -0
  118. package/dist/resources/schemas/ProcessDefinitionDto.json +1480 -0
  119. package/dist/resources/schemas/ProcessSimulationDto.json +96 -0
  120. package/dist/resources/schemas/SaveConnectorCredentialCommand.json +90 -0
  121. package/dist/resources/schemas/SaveProcessEventSourceCommand.json +61 -0
  122. package/dist/resources/schemas/SaveProcessMailSourceCommand.json +89 -0
  123. package/dist/resources/schemas/SignProcessTaskCommand.json +73 -0
  124. package/dist/resources/schemas/SimulateProcessDefinitionQuery.json +92 -0
  125. package/dist/resources/schemas/StartMobileBuildCommand.json +54 -0
  126. package/dist/resources/schemas/UpdateAccessPolicyCommand.json +209 -0
  127. package/dist/resources/schemas/UpdateDecisionCommand.json +216 -0
  128. package/dist/resources/schemas/UpdateProcessDefinitionCommand.json +1357 -0
  129. package/dist/resources/schemas/UpsertMobileStoreSettingsCommand.json +259 -0
  130. package/dist/resources/schemas/ValidateProcessDefinitionQuery.json +1339 -0
  131. package/dist/server.js +7 -1
  132. package/dist/tools/accessOperations.js +135 -0
  133. package/dist/tools/accessPolicies.js +170 -0
  134. package/dist/tools/accessRuntime.js +203 -0
  135. package/dist/tools/applications.js +60 -3
  136. package/dist/tools/bpm.js +343 -0
  137. package/dist/tools/bpmGovernance.js +266 -0
  138. package/dist/tools/bpmOperations.js +230 -0
  139. package/dist/tools/bpmReporting.js +154 -0
  140. package/dist/tools/bpmRouting.js +150 -0
  141. package/dist/tools/bpmRuntime.js +396 -0
  142. package/dist/tools/case.js +178 -0
  143. package/dist/tools/caseRuntime.js +89 -0
  144. package/dist/tools/components.js +103 -12
  145. package/dist/tools/connectData.js +449 -0
  146. package/dist/tools/connectors.js +193 -0
  147. package/dist/tools/datasources.js +1 -1
  148. package/dist/tools/decisions.js +206 -0
  149. package/dist/tools/designSchemaPatch.js +22 -16
  150. package/dist/tools/externalComponents.js +25 -4
  151. package/dist/tools/flows.js +79 -6
  152. package/dist/tools/layouts.js +44 -12
  153. package/dist/tools/microservices.js +32 -10
  154. package/dist/tools/mobile.js +221 -0
  155. package/dist/tools/mobileStore.js +268 -0
  156. package/dist/tools/modules.js +48 -0
  157. package/dist/tools/organizationStructure.js +137 -0
  158. package/dist/tools/pages.js +391 -92
  159. package/dist/tools/platformInfo.js +7 -2
  160. package/dist/tools/profileWrite.js +92 -0
  161. package/dist/tools/rows.js +7 -1
  162. package/dist/tools/schemaOps.js +33 -1
  163. package/dist/tools/screenWrite.js +15 -7
  164. package/dist/tools/screens.js +90 -3
  165. package/dist/tools/variables.js +11 -5
  166. package/package.json +2 -2
  167. package/dist/knowledge/boxSections.js +0 -184
@@ -1,6 +1,44 @@
1
1
  import { guid, pagingParams, readOnly, writes, updates, destructive } from './common.js';
2
2
  import { handle } from '../platform/responses.js';
3
+ import { forgetApplication, readApplicationPlatform, resolveApplication } from '../knowledge/platform/resolve.js';
4
+ import { mobileTabsProblems, readMobileTabs } from '../knowledge/platform/mobileTabs.js';
5
+ import { findingLine } from '../knowledge/platform/profile.js';
3
6
  import { z } from 'zod';
7
+ /**
8
+ * MOB-007 (sekme ayarı) — `properties.mobile.tabs` yazan mobil uygulama çağrısının denetimi. Yazım
9
+ * platforma YİNE gider (D3; backend `properties`'i doğrulamaz): bulgu `platformWarnings`'e düşer.
10
+ * Sayfa ve widget listesi okunamazsa o denetimler atlanır, biçim denetimi yine koşar.
11
+ */
12
+ export async function mobileTabsWarnings(platform, applicationId, projectSlug, homepageId, properties) {
13
+ const tabs = readMobileTabs(properties);
14
+ if (tabs === undefined)
15
+ return [];
16
+ const pages = applicationId && projectSlug
17
+ ? await platform.tenant('GET', projectSlug, `/pages/${applicationId}`, { query: { pageIndex: 0, pageLength: 200 } })
18
+ .then(response => (response?.data ?? []).map(page => ({ id: String(page.id ?? '') })))
19
+ .catch(() => undefined)
20
+ : undefined;
21
+ const widgetIds = applicationId && projectSlug
22
+ ? await platform.tenant('GET', projectSlug, `/components/${applicationId}`, { query: { pageIndex: 0, pageLength: 999 } })
23
+ .then(response => new Set((response?.data ?? []).filter(entry => entry.kind === 'widget').map(entry => String(entry.id ?? ''))))
24
+ .catch(() => undefined)
25
+ : undefined;
26
+ return mobileTabsProblems(tabs, {
27
+ ...(pages ? { pages } : {}),
28
+ ...(homepageId ? { homepageId } : {}),
29
+ ...(widgetIds ? { widgetIds } : {})
30
+ }).map(message => findingLine({
31
+ code: 'MOB-007',
32
+ severity: 'warn',
33
+ message,
34
+ guide: "platform_guide('mobile') §Gezinme"
35
+ }));
36
+ }
37
+ function withPlatformWarnings(response, warnings) {
38
+ if (warnings.length === 0 || !response || typeof response !== 'object' || Array.isArray(response))
39
+ return response;
40
+ return { ...response, platformWarnings: warnings };
41
+ }
4
42
  export function registerApplicationTools(server, platform) {
5
43
  const config = platform.config;
6
44
  server.registerTool('application_list', {
@@ -34,7 +72,14 @@ export function registerApplicationTools(server, platform) {
34
72
  notFoundPageId: guid.optional()
35
73
  },
36
74
  annotations: writes
37
- }, handle(config, ({ projectId, ...body }) => platform.org('POST', `/applications/${projectId}`, { body })));
75
+ }, handle(config, async ({ projectId, ...body }) => {
76
+ const warnings = readApplicationPlatform(body.type) === 'mobile'
77
+ ? await mobileTabsWarnings(platform, undefined, undefined, undefined, body.properties)
78
+ : [];
79
+ const response = await platform.org('POST', `/applications/${projectId}`, { body });
80
+ forgetApplication(platform);
81
+ return withPlatformWarnings(response, warnings);
82
+ }));
38
83
  server.registerTool('application_update', {
39
84
  title: 'Application güncelle',
40
85
  description: 'Application bilgilerini günceller; homepageId zorunludur (mevcut değeri application_get ile alın).',
@@ -49,11 +94,23 @@ export function registerApplicationTools(server, platform) {
49
94
  notFoundPageId: guid.optional()
50
95
  },
51
96
  annotations: updates
52
- }, handle(config, ({ id, ...body }) => platform.org('PUT', `/applications/${id}`, { body })));
97
+ }, handle(config, async ({ id, ...body }) => {
98
+ const current = await resolveApplication(platform, id);
99
+ const warnings = current?.platform === 'mobile'
100
+ ? await mobileTabsWarnings(platform, id, current.projectSlug, body.homepageId, body.properties)
101
+ : [];
102
+ const response = await platform.org('PUT', `/applications/${id}`, { body });
103
+ forgetApplication(platform, id);
104
+ return withPlatformWarnings(response, warnings);
105
+ }));
53
106
  server.registerTool('application_delete', {
54
107
  title: 'Application sil',
55
108
  description: 'Application\'ı kalıcı olarak siler.',
56
109
  inputSchema: { id: guid },
57
110
  annotations: destructive
58
- }, handle(config, args => platform.org('DELETE', `/applications/${args.id}`)));
111
+ }, handle(config, async (args) => {
112
+ const response = await platform.org('DELETE', `/applications/${args.id}`);
113
+ forgetApplication(platform, args.id);
114
+ return response;
115
+ }));
59
116
  }
@@ -0,0 +1,343 @@
1
+ import { guid, projectParam, environmentParam, definitionParam, pagingParams, asUserIdParam, readOnly, writes, updates, destructive, microOps } from './common.js';
2
+ import { normalizeProcessDefinition, overridePatchFindings, processNodeSchemas, bpmnExtensionFindings, staleScenarioFindings } from '../knowledge/process.js';
3
+ import { evaluatePolicy, enforcePolicy, attachFindings, applyPolicyMode, PolicyBlockError } from '../knowledge/policy.js';
4
+ import { processOutline, resolvePart, resolvePatchOperations } from '../knowledge/outlines.js';
5
+ import { unmappedMembers, withUnmappedMembers } from '../knowledge/schemaGuard.js';
6
+ import { constraintSummary } from '../knowledge/backendConstraints.js';
7
+ import { writeDiff, withWriteDiff } from '../platform/writeDiff.js';
8
+ import { withNormalization } from '../knowledge/normalize.js';
9
+ import { impersonationHeaders } from '../platform/impersonation.js';
10
+ import { identityHeaders } from '../platform/tokenVault.js';
11
+ import { PlatformApiError } from '../platform/errors.js';
12
+ import { baseVersionOf } from '../platform/patch.js';
13
+ import { policyRules } from '../knowledge/rules.js';
14
+ import { handle } from '../platform/responses.js';
15
+ import fastJsonPatch from 'fast-json-patch';
16
+ import { z } from 'zod';
17
+ const policyOverrideParam = z.boolean().optional()
18
+ .describe("true: politika block bulgularını warn'a indirir (bilinçli istisna; yanıtta işaretlenir)");
19
+ const patchOperationsParam = z.array(z.record(z.unknown())).min(1)
20
+ .describe("RFC 6902 JSON Patch işlemleri, yollar tanım modeline göre. Düğüm hedeflerken İNDEKS YERİNE SEÇİCİ: { op: 'replace', path: '/nodes[id=kontrol-onay]/policy', value: 'all' }; bölge içi düğüm '/nodes[id=bolge]/nodes[id=onay]/…'. Platform seçicisiz sayısal '/nodes/2' yolunu reddeder. Yeni düğüm '/nodes/-'.");
21
+ export function assertProcessNotProduction(tool, environment, config) {
22
+ if ((environment ?? config.defaultEnvironment) !== 'production')
23
+ return;
24
+ throw new PolicyBlockError([{
25
+ ruleId: 'BPM-001',
26
+ severity: 'block',
27
+ message: `${tool}: süreç yayını ve yürütmesi production'a gönderilmez. Hedef 'development' ya da bir dal olmalı; production'a taşıma insan onaylı deployment işidir.`,
28
+ guide: 'ngapps://guides/bpm'
29
+ }], false);
30
+ }
31
+ /**
32
+ * BPM uçları (`/bpm/*`) platform şemasıyla `[Authorize]` edilir: uygulama oturumu jetonunu
33
+ * `Authorization` başlığına koymak kimlik doğrulamayı düşürür ve 401 verir (ölçüldü 2026-09-22,
34
+ * S-1 koşusu). Uygulama kullanıcısı adına iş yapmanın desteklenen yolu `impersonated-user-id`
35
+ * başlığıdır: `AppSessionMiddleware` platform yolundaki istekte çerezi okumaz ama kimliği
36
+ * doğrulanmış istekte bu başlığı görürse özneyi o kullanıcı olarak kurar (production dışında).
37
+ */
38
+ export async function bpmIdentityHeaders(platform, tool, project, environment, identity) {
39
+ const eye = await impersonationHeaders(platform, tool, project, environment, identity, { runtime: true });
40
+ return eye ?? identityHeaders(identity.asUser, undefined, undefined);
41
+ }
42
+ const asUserIdBpmParam = asUserIdParam
43
+ .describe("Parolasız kullanıcı gözü (users satır id'si): istek gateway kimliğiyle gider ve 'impersonated-user-id' başlığını taşır, platform özneyi o kullanıcı olarak kurar. /bpm/* uçları platform şemasıyla [Authorize] edildiği için UYGULAMA JETONU bu uçlarda 401 alabilir — parolasız yol budur. Yalnız development ya da dal; asUser ile birlikte verilemez.");
44
+ const asUserParam = z.string().min(1).optional()
45
+ .describe("Uygulama yöneticisinin kimliği (ham JWT ya da access_session_create tokenRefs'teki tok_… referansı). Uyarlama yazımı zorunlu ister (BPM-013): Studio jetonu uyarlama yazamaz.");
46
+ const overrideOperations = ['save', 'reset', 'migrate-open'];
47
+ function overrideOutline(view) {
48
+ const definitionOverride = (view.override ?? null);
49
+ return {
50
+ definitionId: view.definitionId ?? null,
51
+ slug: view.slug ?? null,
52
+ activeVersionNumber: view.activeVersionNumber ?? null,
53
+ overrideRevision: view.overrideRevision ?? 0,
54
+ isReadOnly: view.isReadOnly === true,
55
+ conflictState: definitionOverride?.conflictState ?? 'none',
56
+ conflictDetail: definitionOverride?.conflictDetail ?? null,
57
+ patch: definitionOverride?.patch ?? [],
58
+ editableScopes: view.editableScopes ?? [],
59
+ outline: {
60
+ ...processOutline({ id: view.definitionId, slug: view.slug, definition: view.effectiveModel ?? {} }),
61
+ hint: "Etkin tanım (aktif sürüm + uyarlama). Uyarlamayı process_override_update ile değiştirin; process_definition_patch geliştiricinin taslağını değiştirir, uyarlamayı değil."
62
+ }
63
+ };
64
+ }
65
+ export function dataOf(payload) {
66
+ const record = (payload ?? {});
67
+ return (record.data && typeof record.data === 'object' ? record.data : record);
68
+ }
69
+ export function registerBpmTools(server, platform) {
70
+ const config = platform.config;
71
+ server.registerTool('process_definition_list', {
72
+ title: 'Süreç tanımlarını listele',
73
+ description: "Süreç (BPM) tanımlarını listeler: slug, ad, aktif sürüm. Süreç ≠ workflow: süreç insan görevlerinde bekleyen durumlu akıştır, workflow tek istekte biten sunucu akışıdır. view:'export' projedeki bütün tanımları (tüm sürümler, taslak, RACI) ve iş takvimlerini yedek olarak döner — { exportedAt, calendars[], definitions[] }; geri yükleme process_definition_create { restore }. Yedek büyüktür, yalnız yedek için çağırın; yetki process.manage.",
74
+ inputSchema: { project: projectParam, environment: environmentParam, view: z.enum(['list', 'export']).optional().describe('varsayılan list'), searchTerm: z.string().optional(), applicationId: guid.optional(), ...pagingParams },
75
+ annotations: readOnly
76
+ }, handle(config, ({ project, environment, view, ...query }) => view === 'export'
77
+ ? platform.tenant('GET', project, '/bpm/export-definitions', { environment })
78
+ : platform.tenant('GET', project, '/bpm/definitions', { environment, query })));
79
+ server.registerTool('process_definition_get', {
80
+ title: 'Süreç tanımını getir',
81
+ description: "Süreç tanımını getirir. Önce view:'outline' (düğüm · tür · derece · atama · SLA · bölge olayları); tek düğüm için view:'part', part:'definition.nodes[id=<düğüm>]'. Tam gövde son çaredir.",
82
+ inputSchema: {
83
+ project: projectParam,
84
+ environment: environmentParam,
85
+ id: guid,
86
+ view: z.enum(['full', 'outline', 'part']).optional().describe('varsayılan outline'),
87
+ part: z.string().optional().describe("view:'part' için yol, ör. definition.nodes[id=onay]")
88
+ },
89
+ annotations: readOnly
90
+ }, handle(config, async ({ project, environment, id, view, part }) => {
91
+ const payload = await platform.tenant('GET', project, `/bpm/definitions/${id}`, { environment });
92
+ const definition = dataOf(payload);
93
+ if (view === 'full')
94
+ return payload;
95
+ if (view === 'part') {
96
+ if (!part)
97
+ throw new Error("view:'part' için 'part' parametresi zorunlu.");
98
+ return { part, value: resolvePart(definition, part) };
99
+ }
100
+ return processOutline(definition);
101
+ }));
102
+ server.registerTool('process_definition_create', {
103
+ title: 'Süreç tanımı oluştur',
104
+ description: "Yeni süreç tanımı yazar (taslak sürüm). bpmn verilirse BPMN 2.0 XML'den tanım oluşturur (POST bpm/definitions/import-bpmn; ≤ 256 KB, büyük dosya için boş tanım + process_bpmn_update { filePath }; zeyrek: uzantısız XML'de derece locked, insan adımı ataması yer tutucu 'initiator' — BPM-016 uyarısı; workflow'suz serviceTask 422). İlk kullanımdan önce platform_guide('bpm') okuyun; altın örnekler ngapps://examples/bpm-gorev-kontrol, bpm-satinalma, bpm-iso-dokuman. Tanım ve HER düğüm 'description' taşır (BPM-002, block). Tanım 'analysis: { purpose, summary }', HER düğüm 'analysis: { what, data, why, example }' taşır, her metin { en, tr } iş diliyle; example adımın gerçek hayattan küçük bir vakası (BPM-023, block; Studio'nun Analiz dokümanı sekmesi okur — platform_guide('bpm') § Analiz dokümanı). Kısa biçimler (assignee: 'unit-manager of initiator', sla: 'P2D', edges: [[from, to]]) gateway'de tam biçime çevrilir ve gatewayNormalized ile bildirilir. Yanıt outline'dır; yayın için process_definition_preview ardından process_definition_publish. " + constraintSummary('CreateProcessDefinitionCommand'),
105
+ inputSchema: {
106
+ project: projectParam,
107
+ environment: environmentParam,
108
+ applicationId: guid.optional(),
109
+ definition: definitionParam.optional().describe('yeni tanım; restore ya da bpmn verilmezse zorunlu'),
110
+ bpmn: z.string().min(1).max(256_000).optional().describe('BPMN 2.0 XML — definition ve restore yerine'),
111
+ restore: z.object({
112
+ exportedAt: z.string().min(10).max(40),
113
+ calendars: z.array(z.record(z.unknown())).max(500),
114
+ definitions: z.array(z.record(z.unknown())).max(1000),
115
+ confirmOverwrite: z.literal(true).describe('YIKICI: aynı kodlu takvimler ve değişmiş aktif sürümler üzerine yazılır — bilerek true verin')
116
+ }).optional().describe("YIKICI geri yükleme — process_definition_list { view: 'export' } çıktısının data'sı + confirmOverwrite: true. Takvimler üzerine yazılır; tanımlar içe aktarılır (aktif sürümü farklı olan yeni sürümle YAYINLANIR; hedefte yayınlanmamış farklı taslak varsa o tanım atlanır ve skippedSlugs'ta döner); yedekte olmayan tanım silinmez, emekliye ayrılmaz. Her aktif/taslak sürüm BPM kurallarından geçer (BPM-002 …). production'a gitmez (BPM-001)."),
117
+ policyOverride: policyOverrideParam
118
+ },
119
+ annotations: writes
120
+ }, handle(config, async ({ project, environment, applicationId, definition, bpmn, restore, policyOverride }) => {
121
+ if (bpmn) {
122
+ if (definition || restore)
123
+ throw new PlatformApiError('process_definition_create: bpmn, definition ve restore birlikte verilmez (istek gönderilmedi).', 400);
124
+ const bpmnFindings = config.policyMode === 'off' ? [] : applyPolicyMode(config, bpmnExtensionFindings(bpmn), policyOverride);
125
+ return attachFindings(processOutline(dataOf(await platform.tenant('POST', project, '/bpm/definitions/import-bpmn', { environment, body: { applicationId, xml: bpmn } }))), bpmnFindings);
126
+ }
127
+ if (restore) {
128
+ if (definition)
129
+ throw new PlatformApiError('process_definition_create: definition ve restore birlikte verilmez (istek gönderilmedi).', 400);
130
+ assertProcessNotProduction('process_definition_create', environment, config);
131
+ const restoreFindings = enforcePolicy(restore.definitions.flatMap(restoredDefinition => (restoredDefinition.versions ?? [])
132
+ .filter(version => (version.state === 'active' || version.state === 'draft') && version.model)
133
+ .flatMap(version => evaluatePolicy(config, policyRules, 'process', version.model, { operation: 'create' }, policyOverride))));
134
+ const { confirmOverwrite: _confirmOverwrite, ...restoreBody } = restore;
135
+ return attachFindings(await platform.tenant('POST', project, '/bpm/export-definitions', { environment, body: restoreBody }), restoreFindings);
136
+ }
137
+ if (!definition)
138
+ throw new PlatformApiError('process_definition_create: definition zorunlu (ya da yedekten geri yükleme için restore) (istek gönderilmedi).', 400);
139
+ const normalized = normalizeProcessDefinition(definition);
140
+ const findings = enforcePolicy(evaluatePolicy(config, policyRules, 'process', definition, { operation: 'create' }, policyOverride));
141
+ const drift = unmappedMembers('CreateProcessDefinitionCommand', { applicationId, definition });
142
+ const payload = await platform.tenant('POST', project, '/bpm/definitions', { environment, body: { applicationId, definition } });
143
+ const saved = dataOf(payload);
144
+ return attachFindings(withUnmappedMembers(withWriteDiff(withNormalization(processOutline(saved), normalized), writeDiff(definition, saved.definition)), drift), findings);
145
+ }));
146
+ server.registerTool('process_definition_update', {
147
+ title: 'Süreç tanımını güncelle',
148
+ description: "Taslak sürümü tam gövdeyle günceller (definition = tanım modeli). Hedefli değişiklik için process_definition_patch tercih edin. Yayınlanmış tanımda slug değişmez. Tanım ve her düğüm 'description' taşır (BPM-002). İki dilli 'analysis' tanımda ve her düğümde zorunludur (BPM-023). " + constraintSummary('UpdateProcessDefinitionCommand'),
149
+ inputSchema: { project: projectParam, environment: environmentParam, id: guid, definition: definitionParam, policyOverride: policyOverrideParam },
150
+ annotations: updates
151
+ }, handle(config, async ({ project, environment, id, definition, policyOverride }) => {
152
+ const normalized = normalizeProcessDefinition(definition);
153
+ const findings = enforcePolicy(evaluatePolicy(config, policyRules, 'process', definition, { operation: 'update' }, policyOverride));
154
+ const payload = await platform.tenant('PUT', project, `/bpm/definitions/${id}`, { environment, body: { definition } });
155
+ const saved = dataOf(payload);
156
+ return attachFindings(withWriteDiff(withNormalization(processOutline(saved), normalized), writeDiff(definition, saved.definition)), findings);
157
+ }));
158
+ server.registerTool('process_definition_patch', {
159
+ title: "Süreç tanımına patch uygula",
160
+ description: "Tam gövdeyi bağlama almadan hedefli değişiklik: gateway okunan kaydın 'version'ını baseVersion olarak gönderir, platform seçicileri (/nodes[id=x]) çözer ve taslağa yazar; kayıt bu arada değiştiyse 409 döner ve hiçbir op uygulanmaz. Gateway yazmadan önce yamalanmış tanımı yerelde politika kontrolünden geçirir. Analizi olmayan eski bir tanım her yamada BPM-023'e takılır: eksik 'analysis' alanlarını aynı yamaya ekleyin. Yanıt { applied, newVersion, patchTargets, outline }.",
161
+ inputSchema: {
162
+ project: projectParam,
163
+ environment: environmentParam,
164
+ id: guid,
165
+ operations: patchOperationsParam.optional(),
166
+ ops: patchOperationsParam.optional().describe("'operations' ile aynı alan (eşanlamlı)"),
167
+ policyOverride: policyOverrideParam
168
+ },
169
+ annotations: updates
170
+ }, handle(config, async ({ project, environment, id, operations: givenOperations, ops, policyOverride }) => {
171
+ const operations = microOps('process_definition_patch', ops, givenOperations);
172
+ const current = dataOf(await platform.tenant('GET', project, `/bpm/definitions/${id}`, { environment }));
173
+ const model = structuredClone((current.definition ?? {}));
174
+ const notes = [];
175
+ try {
176
+ const resolved = resolvePatchOperations(model, operations, 'process_definition_get');
177
+ const patched = fastJsonPatch.applyPatch(model, resolved.operations, true, false).newDocument;
178
+ enforcePolicy(evaluatePolicy(config, policyRules, 'process', patched, { operation: 'update' }, policyOverride));
179
+ }
180
+ catch (error) {
181
+ if (error instanceof PolicyBlockError)
182
+ throw error;
183
+ notes.push(`yerel politika denetimi atlandı (yol yerelde çözülemedi: ${error instanceof Error ? error.message : String(error)}); platform doğrulaması yine çalışır`);
184
+ }
185
+ const saved = dataOf(await platform.tenant('PATCH', project, `/bpm/definitions/${id}`, {
186
+ environment,
187
+ body: { baseVersion: baseVersionOf(current, 'process_definition_get'), ops: operations }
188
+ }));
189
+ return withNormalization({
190
+ applied: saved.applied ?? operations.length,
191
+ newVersion: saved.newVersion ?? null,
192
+ patchTargets: saved.patchTargets ?? [],
193
+ outline: processOutline((saved.data ?? {}))
194
+ }, notes);
195
+ }));
196
+ server.registerTool('process_definition_delete', {
197
+ title: 'Süreç tanımını sil',
198
+ description: 'Süreç tanımını siler. Açık örneği (running, waiting-timer, suspended, faulted) olan tanım silinmez (422 ProcessOpen); önce process_instance_list ile kontrol edin.',
199
+ inputSchema: { project: projectParam, environment: environmentParam, id: guid },
200
+ annotations: destructive
201
+ }, handle(config, ({ project, environment, id }) => platform.tenant('DELETE', project, `/bpm/definitions/${id}`, { environment })));
202
+ server.registerTool('process_definition_clone', {
203
+ title: 'Süreç tanımını klonla',
204
+ description: 'Tanımın güncel modelinden yeni slug ile taslak kopya oluşturur.',
205
+ inputSchema: { project: projectParam, environment: environmentParam, id: guid, slug: z.string().min(1).max(100) },
206
+ annotations: writes
207
+ }, handle(config, async ({ project, environment, id, slug }) => processOutline(dataOf(await platform.tenant('POST', project, `/bpm/definitions/${id}/clone`, { environment, body: { slug } })))));
208
+ server.registerTool('process_definition_preview', {
209
+ title: 'Süreç tanımını önizle',
210
+ description: "YAN ETKİSİZ: tanımı platform doğrulayıcısından geçirir (422 kodlarıyla aynı bulgular) ve id verilirse kuru koşu yapar — her insan adımında KİM görev alacak listesi (org ağacından çözülür, satır/bildirim/görev yazılmaz). Kaydedilmemiş gövde için definition verin; kayıtlı tanım için id (+ subjectRowId, vars, initiatorUserId). Yayından önce findings boş ve steps beklenen kişileri göstermeli. Transaction açmaz, geri alınacak yazma yoktur; kurallar platform_guide('bpm') §Simülasyon ve test.",
211
+ inputSchema: {
212
+ project: projectParam,
213
+ environment: environmentParam,
214
+ id: guid.optional(),
215
+ applicationId: guid.optional(),
216
+ definition: definitionParam.optional(),
217
+ subjectRowId: z.string().max(64).optional(),
218
+ initiatorUserId: z.string().max(64).optional(),
219
+ vars: z.record(z.unknown()).optional()
220
+ },
221
+ annotations: readOnly
222
+ }, handle(config, async ({ project, environment, id, applicationId, definition, subjectRowId, initiatorUserId, vars }) => {
223
+ if (!id && !definition)
224
+ throw new Error("process_definition_preview: 'id' ya da 'definition' verin.");
225
+ if (id && definition)
226
+ throw new Error("process_definition_preview: 'id' ve 'definition' birlikte verilmez — doğrulama kaydedilmemiş gövdeyi, kuru koşu kayıtlı modeli okur ve sonuçlar iki ayrı modele ait olur. Önce process_definition_update ile kaydedin, sonra yalnız id ile önizleyin.");
227
+ const normalized = definition ? normalizeProcessDefinition(definition) : [];
228
+ const validation = dataOf(await platform.tenant('POST', project, id ? `/bpm/definitions/${id}/validate` : '/bpm/definitions/validate', {
229
+ environment,
230
+ body: definition ? { applicationId, definition } : {}
231
+ }));
232
+ const simulation = id
233
+ ? dataOf(await platform.tenant('POST', project, `/bpm/definitions/${id}/simulate`, { environment, body: { subjectRowId, initiatorUserId, vars } }))
234
+ : undefined;
235
+ return withNormalization({
236
+ findings: validation.findings ?? [],
237
+ isValid: validation.isValid ?? null,
238
+ steps: simulation?.steps ?? null,
239
+ note: id ? undefined : "Kuru koşu (kim yapar) yalnız kayıtlı tanımda çalışır; önce process_definition_create, sonra id ile preview."
240
+ }, normalized);
241
+ }));
242
+ server.registerTool('process_definition_publish', {
243
+ title: 'Süreç sürümünü yayınla',
244
+ description: "Taslak sürümü aktif yapar (önceki aktif 'retiring' olur; açık örnekler kendi sürümünde biter). reason verilirse yayın isteği açılır (POST publish-request): aktif sürüm ya da taslak publishPolicy: four-eyes ve ortamda process-publish süreci kuruluysa sürüm YAYINLANMAZ — { isPublished: false, request { id, state: pending, instanceId, changeCount } } döner, onay görevi tanım sahibine düşer, onaylanınca yayınlanır (ret rejected; taslak sonradan değişirse superseded). Onay gerekmiyorsa istek doğrudan yayınlar (isPublished: true). reason'sız çağrı onay gereken tanımda 403 PublishApprovalRequired alır. Gateway taslak sağlamasında yeşil koşmamış senaryoyu uyarır (BPM-015); requireGreenScenarios: true tanımda platform 422 ScenarioFailed döner — istek açılırken de. Yalnız isteyenden farklı kullanıcının onayı yayınlar. Yayın öncesi platform doğrulaması 422 ile durdurabilir. production hedefi istek gitmeden durur (BPM-001).",
245
+ inputSchema: { project: projectParam, environment: environmentParam, id: guid, reason: z.string().min(1).max(1000).optional().describe('yayın gerekçesi; verilirse dört göz isteği açılır') },
246
+ annotations: writes
247
+ }, handle(config, async ({ project, environment, id, reason }) => {
248
+ assertProcessNotProduction('process_definition_publish', environment, config);
249
+ const findings = config.policyMode === 'off'
250
+ ? []
251
+ : await platform.tenant('GET', project, `/bpm/definitions/${id}`, { environment })
252
+ .then(async (current) => staleScenarioFindings(dataOf(current), dataOf(await platform.tenant('GET', project, '/bpm/test-scenarios', { environment, query: { definitionId: id } }))))
253
+ .then(staleFindings => applyPolicyMode(config, staleFindings), () => []);
254
+ if (!reason)
255
+ return attachFindings(processOutline(dataOf(await platform.tenant('POST', project, `/bpm/definitions/${id}/versions`, { environment }))), findings);
256
+ const publishResult = dataOf(await platform.tenant('POST', project, `/bpm/definitions/${id}/publish-request`, { environment, body: { reason } }));
257
+ const publishRequest = (publishResult.request ?? null);
258
+ return attachFindings({
259
+ isPublished: publishResult.isPublished === true,
260
+ request: publishRequest ? { id: publishRequest.id, state: publishRequest.state, instanceId: publishRequest.instanceId ?? null, versionNumber: publishRequest.versionNumber ?? null, changeCount: Array.isArray(publishRequest.changes) ? publishRequest.changes.length : 0 } : null,
261
+ note: publishResult.isPublished === true ? undefined : 'Onay bekliyor: onay görevi tanım sahibine düştü; process_task_list ile izleyin. Onay gelmeden sürüm aktif olmaz.',
262
+ outline: processOutline((publishResult.definition ?? {}))
263
+ }, findings);
264
+ }));
265
+ server.registerTool('process_override_get', {
266
+ title: 'Süreç uyarlamasını getir',
267
+ description: "Uygulama yöneticisinin ortam uyarlamasını getirir: aktif sürüm, overrideRevision, conflictState (conflicted ise conflictDetail — yeni sürüm uyarlanan bölgeyi kaldırdı ya da kilitledi, yeni örnekler varsayılanla başlar), patch, editableScopes (düğüm · derece · editableParams · limits) ve etkin tanımın outline'ı. view:'studio' salt okunur görünümdür (isReadOnly: true); output:'full' temel ve etkin modelin tam gövdesi. Kurallar platform_guide('bpm') §Uyarlama.",
268
+ inputSchema: {
269
+ project: projectParam,
270
+ environment: environmentParam,
271
+ id: guid,
272
+ view: z.enum(['admin', 'studio']).optional().describe('varsayılan admin'),
273
+ output: z.enum(['outline', 'full']).optional().describe('varsayılan outline'),
274
+ asUser: asUserParam,
275
+ asUserId: asUserIdBpmParam
276
+ },
277
+ annotations: readOnly
278
+ }, handle(config, async ({ project, environment, id, view, output, asUser, asUserId }) => {
279
+ const payload = await platform.tenant('GET', project, `/bpm/definitions/${id}/override`, { environment, query: view ? { view } : undefined, headers: await bpmIdentityHeaders(platform, 'process_override_get', project, environment, { asUser, asUserId }) });
280
+ return output === 'full' ? payload : overrideOutline(dataOf(payload));
281
+ }));
282
+ server.registerTool('process_override_update', {
283
+ title: 'Süreç uyarlamasını yaz',
284
+ description: "Uyarlama yazımının tek kapısı: operation save (varsayılan; patch = JSON Patch, seçicili yollar '/nodes[id=bolge]/nodes/-'; mode append mevcut uyarlamanın sonuna ekler, replace tümünü değiştirir) | reset (varsayılana dön) | migrate-open (açık örnekleri güncel uyarlamaya taşı; açık düğümü etkin tanımda olmayan örnek atlanır). Gateway aktif sürüm ve revizyonu okuyup iyimser kilitle gönderir (409 → yeniden okuyun) ve istek gitmeden denetler: kilitli yol BPM-010, bölgenin izin vermediği atama kuralı BPM-011, bölge adım/tür sınırı BPM-012. asUser ZORUNLU (BPM-013); production hedefi durur (BPM-001). Yanıt applied op listesi + güncel uyarlama outline'ı.",
285
+ inputSchema: {
286
+ project: projectParam,
287
+ environment: environmentParam,
288
+ id: guid,
289
+ operation: z.enum(overrideOperations).optional().describe('varsayılan save'),
290
+ patch: patchOperationsParam.optional().describe("save için JSON Patch işlemleri, temel (aktif sürüm) modele göre; düğüm hedeflerken seçici: '/nodes[id=kontrol-bolgesi]/nodes/-'"),
291
+ mode: z.enum(['append', 'replace']).optional().describe('save için; varsayılan append (çatışmalı uyarlamada yalnız verilen işlemler yazılır)'),
292
+ policyOverride: policyOverrideParam,
293
+ asUser: asUserParam,
294
+ asUserId: asUserIdBpmParam
295
+ },
296
+ annotations: writes
297
+ }, handle(config, async ({ project, environment, id, operation, patch, mode, policyOverride, asUser, asUserId }) => {
298
+ assertProcessNotProduction('process_override_update', environment, config);
299
+ if (!asUser && !asUserId) {
300
+ throw new PolicyBlockError([{
301
+ ruleId: 'BPM-013',
302
+ severity: 'block',
303
+ message: "process_override_update kimliksiz gönderilmez: uyarlama uygulama yöneticisi adına yazılır, Studio jetonu 403 alır. İki yol var — development'ta parolasız 'asUserId' (users satır id'si) ya da 'asUser' (access_session_create tokenRefs'teki tok_… değeri).",
304
+ guide: 'ngapps://guides/bpm'
305
+ }]);
306
+ }
307
+ const headers = await bpmIdentityHeaders(platform, 'process_override_update', project, environment, { asUser, asUserId });
308
+ if (operation === 'reset')
309
+ return overrideOutline(dataOf(await platform.tenant('POST', project, `/bpm/definitions/${id}/override/reset`, { environment, headers })));
310
+ if (operation === 'migrate-open')
311
+ return dataOf(await platform.tenant('POST', project, `/bpm/definitions/${id}/override/migrate-open`, { environment, headers }));
312
+ if (!patch)
313
+ throw new Error("process_override_update: operation save için 'patch' zorunlu.");
314
+ const view = dataOf(await platform.tenant('GET', project, `/bpm/definitions/${id}/override`, { environment, headers }));
315
+ const currentOverride = (view.override ?? null);
316
+ const isConflicted = currentOverride?.conflictState === 'conflicted';
317
+ const basePatch = mode === 'replace' || isConflicted ? [] : (currentOverride?.patch ?? []);
318
+ const fullPatch = [...basePatch, ...patch];
319
+ const { findings, notes } = config.policyMode === 'off' ? { findings: [], notes: [] } : overridePatchFindings((view.baseModel ?? {}), fullPatch);
320
+ const policyFindings = enforcePolicy(applyPolicyMode(config, findings, policyOverride));
321
+ if (isConflicted && mode !== 'replace')
322
+ notes.push('mevcut uyarlama çatışmalı (conflicted) olduğu için eklenmedi; yalnız verilen işlemler yazıldı');
323
+ const saved = dataOf(await platform.tenant('PUT', project, `/bpm/definitions/${id}/override`, {
324
+ environment,
325
+ headers,
326
+ body: { baseVersion: view.activeVersionNumber, overrideRevision: view.overrideRevision ?? 0, patch: fullPatch }
327
+ }));
328
+ return attachFindings(withNormalization({ applied: patch.map(entry => `${String(entry.op)} ${String(entry.path)}`), ...overrideOutline(saved) }, notes), policyFindings);
329
+ }));
330
+ server.registerTool('process_step_schema', {
331
+ title: 'Süreç düğüm şeması',
332
+ description: "Düğüm türlerinin alanlarını, zorunlularını ve örneğini döner (start, user-task, approval, service, notify, gateway, timer, wait, send, manual, script, sub-process, region, end). Düğüm yazarken tahmin yerine buradan okuyun.",
333
+ inputSchema: { type: z.string().optional().describe('tek tür; boşsa hepsi') },
334
+ annotations: readOnly
335
+ }, handle(config, async ({ type }) => {
336
+ if (!type)
337
+ return { nodeTypes: processNodeSchemas.map(schema => ({ type: schema.type, purpose: schema.purpose, required: schema.required })) };
338
+ const schema = processNodeSchemas.find(candidate => candidate.type === type);
339
+ if (!schema)
340
+ throw new Error(`Bilinmeyen düğüm türü '${type}'. Türler: ${processNodeSchemas.map(candidate => candidate.type).join(', ')}.`);
341
+ return schema;
342
+ }));
343
+ }