@appaflytech/zeyrek-ai-mcp 0.0.24 → 0.0.26

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 (81) hide show
  1. package/.env.example +0 -15
  2. package/dist/config.js +0 -11
  3. package/dist/index.js +0 -2
  4. package/dist/knowledge/componentCatalog.js +25 -13
  5. package/dist/knowledge/componentEvents.js +6 -13
  6. package/dist/knowledge/normalize.js +17 -68
  7. package/dist/knowledge/rules.js +49 -137
  8. package/dist/knowledge/styleResolve.js +4 -50
  9. package/dist/knowledge/themeResolve.js +3 -3
  10. package/dist/observability/trace.js +1 -1
  11. package/dist/platform/diagnostics.js +4 -10
  12. package/dist/platform/domSummary.js +1 -1
  13. package/dist/platform/http.js +7 -23
  14. package/dist/platform/responses.js +2 -6
  15. package/dist/platform/{capture/capture.js → screenshot.js} +514 -52
  16. package/dist/platform/secrets.js +0 -9
  17. package/dist/platform/strictArguments.js +12 -68
  18. package/dist/platform/tokenVault.js +4 -187
  19. package/dist/resources/examples/workflow-http-step.json +2 -2
  20. package/dist/resources/guides/component.md +1 -6
  21. package/dist/resources/guides/expressions.md +2 -2
  22. package/dist/resources/guides/functions.md +1 -1
  23. package/dist/resources/guides/layout.md +7 -11
  24. package/dist/resources/guides/microfunction.md +28 -0
  25. package/dist/resources/guides/microservice.md +4 -10
  26. package/dist/resources/guides/middleware.md +1 -5
  27. package/dist/resources/guides/page.md +55 -215
  28. package/dist/resources/guides/theme.md +1 -4
  29. package/dist/resources/guides/translation.md +1 -1
  30. package/dist/resources/guides/workflow.md +9 -12
  31. package/dist/resources/schema-fingerprint.json +2 -2
  32. package/dist/resources/schemas/CreateWorkflowCommand.json +3 -0
  33. package/dist/resources/schemas/PreviewWorkflowCommand.json +3 -0
  34. package/dist/resources/schemas/StepDto.json +12 -9
  35. package/dist/resources/schemas/UpdateWorkflowCommand.json +3 -0
  36. package/dist/server.js +1 -3
  37. package/dist/tools/applications.js +3 -60
  38. package/dist/tools/components.js +10 -50
  39. package/dist/tools/datasources.js +1 -1
  40. package/dist/tools/designSchemaPatch.js +6 -16
  41. package/dist/tools/externalComponents.js +4 -25
  42. package/dist/tools/flows.js +6 -79
  43. package/dist/tools/layouts.js +12 -44
  44. package/dist/tools/microservices.js +10 -26
  45. package/dist/tools/pages.js +67 -303
  46. package/dist/tools/platformInfo.js +2 -6
  47. package/dist/tools/rows.js +1 -7
  48. package/dist/tools/schemaOps.js +1 -1
  49. package/dist/tools/screenWrite.js +5 -6
  50. package/dist/tools/screens.js +3 -90
  51. package/dist/tools/workflows.js +1 -1
  52. package/package.json +1 -1
  53. package/dist/knowledge/mobileComponentCatalog.js +0 -801
  54. package/dist/knowledge/mobileComponentEvents.js +0 -225
  55. package/dist/knowledge/platform/lint.js +0 -312
  56. package/dist/knowledge/platform/mobile.js +0 -78
  57. package/dist/knowledge/platform/mobileRules.js +0 -182
  58. package/dist/knowledge/platform/mobileTabs.js +0 -108
  59. package/dist/knowledge/platform/profile.js +0 -20
  60. package/dist/knowledge/platform/resolve.js +0 -122
  61. package/dist/knowledge/platform/web.js +0 -38
  62. package/dist/knowledge/styleResolveNative.js +0 -510
  63. package/dist/platform/argumentAliases.js +0 -128
  64. package/dist/platform/bodyFile.js +0 -103
  65. package/dist/platform/capture/actions.js +0 -333
  66. package/dist/platform/capture/browser.js +0 -1
  67. package/dist/platform/capture/console-log.js +0 -80
  68. package/dist/platform/capture/index.js +0 -11
  69. package/dist/platform/capture/readiness.js +0 -103
  70. package/dist/platform/capture/summary.js +0 -77
  71. package/dist/platform/capture/target.js +0 -5
  72. package/dist/platform/capture/targets/studio-mobile.js +0 -15
  73. package/dist/platform/capture/targets/studio-web.js +0 -5
  74. package/dist/platform/schemaReadMemory.js +0 -60
  75. package/dist/resources/examples/mobile-app-shell-drawer.json +0 -209
  76. package/dist/resources/examples/mobile-app-shell-stack.json +0 -123
  77. package/dist/resources/examples/mobile-app-shell-tab.json +0 -174
  78. package/dist/resources/examples/mobile-list-detail-form.json +0 -656
  79. package/dist/resources/guides/mobile.md +0 -419
  80. package/dist/tools/mobile.js +0 -203
  81. package/dist/tools/profileWrite.js +0 -45
@@ -9,8 +9,6 @@ import { applyPropTypesToSchema, isSetPropTypeOp, setPropTypeErrors } from '../k
9
9
  import { writeDiff, withWriteDiff } from '../platform/writeDiff.js';
10
10
  import { PlatformApiError } from '../platform/errors.js';
11
11
  import { handle } from '../platform/responses.js';
12
- import { applicationTypeField, resolveProfile } from '../knowledge/platform/resolve.js';
13
- import { screenProfileWarnings } from './profileWrite.js';
14
12
  import { z } from 'zod';
15
13
  const patchOperationsParam = z.array(z.record(z.unknown())).min(1)
16
14
  .describe("JSON Patch listesi (RFC 6902): { op, path, value }. Yol seçici alabilir — '/views/0/children[elementId=baslik]/props/content/data'.");
@@ -48,13 +46,7 @@ export function registerLayoutTools(server, platform) {
48
46
  description: "Layout'u komponent ağacı (views), widget'ları, akışları ve olaylarıyla getirir.",
49
47
  inputSchema: { project: projectParam, environment: environmentParam, applicationId: guid, id: guid },
50
48
  annotations: readOnly
51
- }, handle(config, async ({ project, environment, applicationId, id }) => {
52
- const response = await platform.tenant('GET', project, `/layouts/${applicationId}/${id}`, { environment });
53
- const typeField = applicationTypeField(await resolveProfile(platform, applicationId));
54
- return response && typeof response === 'object' && !Array.isArray(response) && Object.keys(typeField).length > 0
55
- ? { ...response, ...typeField }
56
- : response;
57
- }));
49
+ }, handle(config, ({ project, environment, applicationId, id }) => platform.tenant('GET', project, `/layouts/${applicationId}/${id}`, { environment })));
58
50
  server.registerTool('layout_schema_get', {
59
51
  title: "Layout komponent ağacını oku",
60
52
  description: "Layout'un komponent ağacını (views) okur — page_schema_get'in layout karşılığı. Ağaçta hedefli değişiklik için layout_schema_patch (sayfa ile aynı micro-op sözlüğü, PATCH /layouts/{app}/{id}/schema). Ad/parametre/olay alanlarında ya da düz JSON Patch yolu gerektiğinde layout_patch — o araç buradaki updatedAt'i expectedUpdatedAt olarak kabul eder. Tam ağacı kendiniz yazacaksanız layout_update.",
@@ -69,21 +61,20 @@ export function registerLayoutTools(server, platform) {
69
61
  annotations: readOnly
70
62
  }, handle(config, async ({ project, environment, applicationId, id, mode, componentId }) => {
71
63
  const layout = await fetchHost(platform, 'layout', project, environment, applicationId, id);
72
- const typeField = applicationTypeField(await resolveProfile(platform, applicationId));
73
64
  const audit = layout.audit;
74
65
  const updatedAt = audit?.updatedAt ?? audit?.createdAt;
75
66
  const views = (layout.views ?? []);
76
67
  if (mode === 'full')
77
- return { updatedAt, ...typeField, views };
68
+ return { updatedAt, views };
78
69
  if (mode === 'subtree') {
79
70
  if (!componentId)
80
71
  throw new PlatformApiError("mode='subtree' için componentId zorunludur.");
81
72
  const subtree = findNode(views, componentId);
82
73
  if (!subtree)
83
74
  throw new PlatformApiError(`Layout'ta '${componentId}' id'li bir komponent yok; layout_schema_get'i summary kipinde çağırıp hedefi doğrulayın.`);
84
- return { updatedAt, ...typeField, views: subtree };
75
+ return { updatedAt, views: subtree };
85
76
  }
86
- return { updatedAt, ...typeField, views: views.map(node => summarize(node)) };
77
+ return { updatedAt, views: views.map(node => summarize(node)) };
87
78
  }));
88
79
  server.registerTool('layout_create', {
89
80
  title: 'Layout oluştur',
@@ -99,28 +90,19 @@ export function registerLayoutTools(server, platform) {
99
90
  },
100
91
  annotations: writes
101
92
  }, handle(config, async ({ project, environment, applicationId, name, views, events, parameters }) => {
102
- const resolved = await resolveProfile(platform, applicationId);
103
- assertScreenWriteGuards('layout', { schema: views, events }, resolved.profile.platform);
93
+ assertScreenWriteGuards('layout', { schema: views, events });
104
94
  const fixed = normalizeComponentDefaults(views);
105
95
  const catalogNotes = await screenCatalogNotes(platform, project, environment, applicationId, views);
106
- const gaps = [
107
- ...(resolved.profile.layout.blocksMeaningful ? verticalGapWarnings(views ?? [], 'LAY-003 (uyarı)') : []),
108
- ...flexSizeWarnings(views ?? [], 'LAY-007 (uyarı)', 'LAY-008 (uyarı)'),
109
- ...spacingLayerWarnings(views ?? [], 'LAY-010 (uyarı)', 'LAY-011 (uyarı)'),
110
- ...await screenProfileWarnings(platform, resolved, project, environment, applicationId, { kind: 'layout', nodes: views ?? [] })
111
- ];
96
+ const gaps = [...verticalGapWarnings(views ?? [], 'LAY-003 (uyarı)'), ...flexSizeWarnings(views ?? [], 'LAY-007 (uyarı)', 'LAY-008 (uyarı)'), ...spacingLayerWarnings(views ?? [], 'LAY-010 (uyarı)', 'LAY-011 (uyarı)')];
112
97
  const response = await platform.tenant('POST', project, `/layouts/${applicationId}`, {
113
98
  environment,
114
99
  body: { name, views: views ?? [], events: events ?? [], parameters: parameters ?? null }
115
100
  });
116
101
  const drops = writeDiff({ name, views: views ?? [], events: events ?? [] }, response);
117
102
  const normalized = withWriteDiff(withNormalization(response, [...componentDefaultsNote(fixed), ...catalogNotes, ...slotWarning(views)]), drops);
118
- const typeField = applicationTypeField(resolved);
119
- if (!normalized || typeof normalized !== 'object')
103
+ if (gaps.length === 0 || !normalized || typeof normalized !== 'object')
120
104
  return normalized;
121
- if (gaps.length === 0)
122
- return Object.keys(typeField).length === 0 ? normalized : { ...normalized, ...typeField };
123
- return { ...normalized, ...typeField, layoutWarnings: gaps };
105
+ return { ...normalized, layoutWarnings: gaps };
124
106
  }));
125
107
  server.registerTool('layout_update', {
126
108
  title: 'Layout güncelle',
@@ -138,21 +120,13 @@ export function registerLayoutTools(server, platform) {
138
120
  annotations: updates
139
121
  }, handle(config, async ({ project, environment, applicationId, id, ...changes }) => {
140
122
  const overrides = Object.fromEntries(Object.entries(changes).filter(([, value]) => value !== undefined));
141
- const resolved = overrides.views === undefined ? undefined : await resolveProfile(platform, applicationId);
142
- assertScreenWriteGuards('layout', { schema: overrides.views, events: overrides.events }, resolved?.profile.platform);
123
+ assertScreenWriteGuards('layout', { schema: overrides.views, events: overrides.events });
143
124
  const current = await fetchHost(platform, 'layout', project, environment, applicationId, id);
144
125
  const fixed = normalizeComponentDefaults(overrides.views);
145
126
  const catalogNotes = await screenCatalogNotes(platform, project, environment, applicationId, overrides.views);
146
127
  const body = layoutUpdateBody({ ...current, applicationId }, overrides);
147
128
  await platform.tenant('PUT', project, `/layouts/${applicationId}/${id}`, { environment, body });
148
- const gaps = overrides.views === undefined || !resolved
149
- ? []
150
- : [
151
- ...(resolved.profile.layout.blocksMeaningful ? verticalGapWarnings(body.views, 'LAY-003 (uyarı)') : []),
152
- ...flexSizeWarnings(body.views, 'LAY-007 (uyarı)', 'LAY-008 (uyarı)'),
153
- ...spacingLayerWarnings(body.views, 'LAY-010 (uyarı)', 'LAY-011 (uyarı)'),
154
- ...await screenProfileWarnings(platform, resolved, project, environment, applicationId, { kind: 'layout', nodes: body.views })
155
- ];
129
+ const gaps = overrides.views === undefined ? [] : [...verticalGapWarnings(body.views, 'LAY-003 (uyarı)'), ...flexSizeWarnings(body.views, 'LAY-007 (uyarı)', 'LAY-008 (uyarı)'), ...spacingLayerWarnings(body.views, 'LAY-010 (uyarı)', 'LAY-011 (uyarı)')];
156
130
  const summary = { id, changed: Object.keys(overrides), preserved: { viewNodes: body.views.length } };
157
131
  if (gaps.length > 0)
158
132
  summary.layoutWarnings = gaps;
@@ -206,8 +180,7 @@ export function registerLayoutTools(server, platform) {
206
180
  const overrides = Object.fromEntries(['name', 'views', 'events', 'parameters']
207
181
  .filter(key => patched[key] !== undefined)
208
182
  .map(key => [key, patched[key]]));
209
- const profile = await resolveProfile(platform, applicationId);
210
- assertScreenWriteGuards('layout', { schema: overrides.views, events: overrides.events }, profile.profile.platform);
183
+ assertScreenWriteGuards('layout', { schema: overrides.views, events: overrides.events });
211
184
  const fixed = normalizeComponentDefaults(overrides.views);
212
185
  const catalogNotes = await screenCatalogNotes(platform, project, environment, applicationId, overrides.views);
213
186
  const body = layoutUpdateBody({ ...current, applicationId }, overrides);
@@ -220,12 +193,7 @@ export function registerLayoutTools(server, platform) {
220
193
  body: { baseVersion: baseVersionOf(document, 'layout_get'), ops: netOps }
221
194
  });
222
195
  const written = patchResult(saved, finalDocument);
223
- const gaps = [
224
- ...(profile.profile.layout.blocksMeaningful ? verticalGapWarnings(body.views, 'LAY-003 (uyarı)') : []),
225
- ...flexSizeWarnings(body.views, 'LAY-007 (uyarı)', 'LAY-008 (uyarı)'),
226
- ...spacingLayerWarnings(body.views, 'LAY-010 (uyarı)', 'LAY-011 (uyarı)'),
227
- ...await screenProfileWarnings(platform, profile, project, environment, applicationId, { kind: 'layout', nodes: body.views })
228
- ];
196
+ const gaps = [...verticalGapWarnings(body.views, 'LAY-003 (uyarı)'), ...flexSizeWarnings(body.views, 'LAY-007 (uyarı)', 'LAY-008 (uyarı)'), ...spacingLayerWarnings(body.views, 'LAY-010 (uyarı)', 'LAY-011 (uyarı)')];
229
197
  const summary = {
230
198
  id,
231
199
  applied: patchOps.length,
@@ -6,14 +6,13 @@ import { normalizeMicroserviceDefinition, normalizeMicroservicePatchOps, withNor
6
6
  import { evaluatePolicy, enforcePolicy, attachFindings } from '../knowledge/policy.js';
7
7
  import { microserviceOutline, workflowOutline, resolvePart, resolvePatchOperations } from '../knowledge/outlines.js';
8
8
  import { patchResult, baseVersionOf } from '../platform/patch.js';
9
- import { filterOperatorError, policyRules } from '../knowledge/rules.js';
9
+ import { policyRules } from '../knowledge/rules.js';
10
10
  import { writeDiff, withWriteDiff } from '../platform/writeDiff.js';
11
- import { identityHeaders, resolveIdentity } from '../platform/tokenVault.js';
11
+ import { identityHeaders } from '../platform/tokenVault.js';
12
12
  import { PlatformApiError } from '../platform/errors.js';
13
13
  import { existingMatch, ifExistsParam, listAll, platformRename, withOutcome, withRename } from '../platform/ifExists.js';
14
14
  import { outlineWrite, recordWriteViewParam } from '../platform/writeView.js';
15
15
  import { handle } from '../platform/responses.js';
16
- import { headersForMode } from '../platform/http.js';
17
16
  import fastJsonPatch from 'fast-json-patch';
18
17
  import { z } from 'zod';
19
18
  import { constraintSummary } from '../knowledge/backendConstraints.js';
@@ -69,7 +68,7 @@ async function queryScopeFindings(platform, project, environment, definition) {
69
68
  }
70
69
  const patchOperationsParam = z.array(z.record(z.unknown())).min(1)
71
70
  .describe("RFC 6902 JSON Patch işlemleri; path'leri view:'outline'/'part' ile keşfedin. Dizi öğelerinde indeks yerine seçici kullanılabilir: '/sourceParameters/joins[alias=customers]/path' — seçici gövde platforma gitmeden indekse çevrilir, çözülemezse istek hiç gönderilmez.");
72
- const asUserParam = z.string().min(1).optional().describe("Uygulama üyesinin kimliği: istek gateway'in servis jetonu yerine bu kimlikle gider. Jeton HEM Authorization başlığında HEM NG_AccessToken çerezinde taşınır, böylece jetonu ÇEREZDEN okuyan middleware de geçer — uca middleware bağlandığı anda bu alan olmadan çağrı 401 döner (09-05 koşusu S-21). ÜÇ ŞEKİL kabul edilir: (1) TERCİH EDİLEN `test:<ad>` — gateway kök .env'deki MCP_TEST_USER_<AD> satırıyla giriş ucunu kendisi çağırır, jetonu kasadan yeniden kullanır (satırı insan yazar), (2) `tok_…` referansı (giriş ucunu çağırdığınızda yanıtın tokenRefs alanında döner; ömür MCP_TOKEN_TTL_MINUTES, MCP_STATE_DIR varsa gateway yeniden başlayınca da çözülür), (3) ham JWT. anonymous ile birlikte verilemez.");
71
+ const asUserParam = z.string().min(1).optional().describe("Uygulama üyesinin kimliği: istek gateway'in servis jetonu yerine bu kimlikle gider. Jeton HEM Authorization başlığında HEM NG_AccessToken çerezinde taşınır, böylece jetonu ÇEREZDEN okuyan middleware de geçer — uca middleware bağlandığı anda bu alan olmadan çağrı 401 döner (09-05 koşusu S-21). İKİ ŞEKİL kabul edilir: (1) ham JWT, (2) `tok_…` referansı (giriş ucunu çağırdığınızda yanıtın tokenRefs alanında döner, 15 dk geçerli). anonymous ile birlikte verilemez.");
73
72
  const cookiesParam = z.record(z.string()).optional().describe("İsteğe eklenecek çerezler (ad → değer): uygulamanın KENDİ oturum çerezi buraya verilir (ör. { CORE_Token: '<jwt>' }). asUser verildiğinde gateway NG_AccessToken çerezini zaten kendisi kurar; bu alan yalnız uygulama başka bir çerez adı okuyorsa gerekir. anonymous ile birlikte verilemez.");
74
73
  const executeInput = {
75
74
  project: projectParam,
@@ -190,13 +189,6 @@ function unboundQueryParameters(value, into = []) {
190
189
  unboundQueryParameters(entry, into);
191
190
  return into;
192
191
  }
193
- /** Çağrının dinamik filtresi (`filters`, sorguda ya da gövdede) bilinen işleçlerle mi — değilse istek gitmez (g-03). */
194
- function assertFilterOperators(tool, bound) {
195
- const bodyFilters = bound.body && !Array.isArray(bound.body) ? bound.body.filters : undefined;
196
- const error = filterOperatorError(tool, bound.query?.filters) ?? filterOperatorError(tool, bodyFilters);
197
- if (error)
198
- throw new PlatformApiError(error, 400);
199
- }
200
192
  function executePath(prefix, application, microservice, routeParams) {
201
193
  const routeSuffix = routeParams && routeParams.length > 0
202
194
  ? `/${routeParams.map(encodeURIComponent).join('/')}`
@@ -414,20 +406,14 @@ export function registerMicroserviceTools(server, platform) {
414
406
  }, handle(config, ({ project, environment, id }) => platform.tenant('POST', project, `/microservices/${id}/clone`, { environment })));
415
407
  server.registerTool('microservice_execute', {
416
408
  title: 'Microservice çalıştır',
417
- description: "Kayıtlı microservice'i gerçek runtime yolundan çalıştırır (POST /{project}/m/{application}/{microservice SLUG'ı}). Dönen httpStatus microservice'in kendi sonucudur (hata da geçerli çıktıdır); beklenmedik sonuçta microservice_debug ile adım adım inceleyin. Anonim erişim testi için anonymous: true. Yanıt 'headers' alanı VARSAYILAN OLARAK yalnız iş başlıklarını taşır (küçük harf): content-type, content-length, content-disposition, location, total-count (sayfalı tablo akışlarının okuduğu sözleşme), x-request-id, traceparent. Ucun response adımında kendi yazdığı başlıkları ya da sunucu başlıklarını görmek için includeHeaders:'all'; hiç başlık istemiyorsanız 'none'. set-cookie/authorization her kipte elenir.",
418
- inputSchema: {
419
- ...executeInput,
420
- includeHeaders: z.enum(['none', 'essential', 'all']).optional().describe("Yanıttaki 'headers' alanı. essential (varsayılan): content-type, content-length, content-disposition, location, total-count, x-request-id, traceparent. all: platformun döndüğü bütün başlıklar (gizliler hariç) — ucun kendi yazdığı başlığı doğrulamak için. none: başlık yok")
421
- },
409
+ description: "Kayıtlı microservice'i gerçek runtime yolundan çalıştırır (POST /{project}/m/{application}/{microservice SLUG'ı}). Dönen httpStatus microservice'in kendi sonucudur (hata da geçerli çıktıdır); beklenmedik sonuçta microservice_debug ile adım adım inceleyin. Anonim erişim testi için anonymous: true. Yanıt 'headers' alanında platformun döndüğü header'ları taşır (küçük harf; ör. headers['total-count'] — sayfalı tablo akışlarının okuduğu sözleşme; set-cookie/authorization elenir).",
410
+ inputSchema: executeInput,
422
411
  annotations: writes
423
- }, handle(config, async ({ project, environment, application, microservice, method, routeParams, query, body, parameters, headers, anonymous, asUser, cookies, language, includeHeaders }) => {
412
+ }, handle(config, async ({ project, environment, application, microservice, method, routeParams, query, body, parameters, headers, anonymous, asUser, cookies, language }) => {
424
413
  const notes = [];
425
- const member = anonymous === true ? asUser : await resolveIdentity(asUser, platform, project, environment);
426
- const requestHeaders = { ...runIdentity(anonymous, member, cookies, headers), ...languageHeader(language, notes) };
414
+ const requestHeaders = { ...runIdentity(anonymous, asUser, cookies, headers), ...languageHeader(language, notes) };
427
415
  const bound = bindCallParameters(method, parameters, query, body, notes);
428
- assertFilterOperators('microservice_execute', bound);
429
- const raw = await platform.tenantRaw(method, project, executePath('m', application, microservice, routeParams), { environment, query: bound.query, body: bound.body, headers: requestHeaders, anonymous, mirrorAuthorizationCookie: true });
430
- return withNormalization({ ...raw, headers: headersForMode(raw.headers, includeHeaders ?? 'essential') }, notes);
416
+ return withNormalization(await platform.tenantRaw(method, project, executePath('m', application, microservice, routeParams), { environment, query: bound.query, body: bound.body, headers: requestHeaders, anonymous, mirrorAuthorizationCookie: true }), notes);
431
417
  }));
432
418
  server.registerTool('microservice_debug', {
433
419
  title: 'Microservice debug',
@@ -436,10 +422,8 @@ export function registerMicroserviceTools(server, platform) {
436
422
  annotations: writes
437
423
  }, handle(config, async ({ project, environment, application, microservice, method, routeParams, query, body, parameters, headers, anonymous, asUser, cookies, language }) => {
438
424
  const notes = [];
439
- const member = anonymous === true ? asUser : await resolveIdentity(asUser, platform, project, environment);
440
- const requestHeaders = { ...runIdentity(anonymous, member, cookies, headers), ...languageHeader(language, notes) };
425
+ const requestHeaders = { ...runIdentity(anonymous, asUser, cookies, headers), ...languageHeader(language, notes) };
441
426
  const bound = bindCallParameters(method, parameters, query, body, notes);
442
- assertFilterOperators('microservice_debug', bound);
443
427
  const payload = await platform.tenantRaw(method, project, executePath('debug', application, microservice, routeParams), { environment, query: bound.query, body: bound.body, headers: requestHeaders, anonymous, mirrorAuthorizationCookie: true });
444
428
  const unbound = unboundQueryParameters(payload.body);
445
429
  return withNormalization({
@@ -490,7 +474,7 @@ export function registerMicroserviceTools(server, platform) {
490
474
  const findings = enforcePolicy(evaluatePolicy(config, policyRules, 'microservice', definition, { operation: 'preview' }, policyOverride));
491
475
  // Önizleme de ucun middleware'lerini koşturur: kimlik verilmezse korumalı uç 401 döner ve kuru
492
476
  // koşu aracı tam gerektiği anda kullanılamaz hâle gelir (09-05 koşusu S-21).
493
- const payload = await platform.tenantRaw('POST', project, `/microservices/${resolvedApplicationId}/preview`, { environment, body: definition, headers: { ...identityHeaders(await resolveIdentity(asUser, platform, project, environment), cookies, undefined), ...languageHeader(language, normalized) }, mirrorAuthorizationCookie: true });
477
+ const payload = await platform.tenantRaw('POST', project, `/microservices/${resolvedApplicationId}/preview`, { environment, body: definition, headers: { ...identityHeaders(asUser, cookies, undefined), ...languageHeader(language, normalized) }, mirrorAuthorizationCookie: true });
494
478
  return attachFindings(withResolved(withNormalization(payload, normalized), [...resolver.resolved, ...hydrated]), findings);
495
479
  }));
496
480
  server.registerTool('microservice_job_history', {