@appaflytech/zeyrek-ai-mcp 0.0.62 → 0.0.63
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.
- package/.env.example +6 -0
- package/dist/config.js +2 -0
- package/dist/knowledge/backendConstraints.js +2 -2
- package/dist/knowledge/mobileStore.js +24 -4
- package/dist/knowledge/normalize.js +10 -0
- package/dist/knowledge/platform/mobileLayoutLint.js +8 -0
- package/dist/knowledge/platform/mobileRules.js +6 -0
- package/dist/knowledge/rules.js +89 -0
- package/dist/observability/gapSink.js +43 -0
- package/dist/platform/argumentAliases.js +6 -0
- package/dist/platform/capture/actions.js +71 -2
- package/dist/platform/capture/capture.js +5 -2
- package/dist/platform/responses.js +5 -2
- package/dist/platform/writeDiff.js +52 -1
- package/dist/resources/examples/middleware-password-reset.json +1281 -0
- package/dist/resources/examples/mobile-reorder-persist.json +33 -7
- package/dist/resources/examples/workflow-email-step.json +67 -0
- package/dist/resources/guides/deployment.md +13 -1
- package/dist/resources/guides/entity.md +7 -0
- package/dist/resources/guides/expressions.md +5 -0
- package/dist/resources/guides/getting-started.md +15 -30
- package/dist/resources/guides/microservice.md +30 -2
- package/dist/resources/guides/middleware.md +83 -3
- package/dist/resources/guides/mobile-layout.md +35 -3
- package/dist/resources/guides/mobile-publish.md +33 -1
- package/dist/resources/guides/mobile-steps.md +12 -2
- package/dist/resources/guides/mobile.md +11 -8
- package/dist/resources/guides/page.md +28 -3
- package/dist/resources/guides/workflow.md +30 -1
- package/dist/resources/schema-fingerprint.json +2 -2
- package/dist/tools/applications.js +6 -3
- package/dist/tools/common.js +8 -0
- package/dist/tools/designSchemaPatch.js +4 -1
- package/dist/tools/flows.js +14 -4
- package/dist/tools/layouts.js +3 -1
- package/dist/tools/microservices.js +8 -2
- package/dist/tools/mobileStore.js +13 -2
- package/dist/tools/pages.js +27 -12
- package/dist/tools/platformInfo.js +15 -6
- package/dist/tools/workflows.js +4 -2
- package/package.json +1 -1
|
@@ -2,6 +2,7 @@ import { listKnowledgeFiles, readKnowledgeFile } from '../resources/knowledge.js
|
|
|
2
2
|
import { readToolResource } from '../resources/read.js';
|
|
3
3
|
import { splitGuideSections } from '../knowledge/guideSections.js';
|
|
4
4
|
import { PlatformApiError } from '../platform/errors.js';
|
|
5
|
+
import { deliverGapReport } from '../observability/gapSink.js';
|
|
5
6
|
import { logCapabilityGap } from '../observability/trace.js';
|
|
6
7
|
import { handle } from '../platform/responses.js';
|
|
7
8
|
import { readOnly } from './common.js';
|
|
@@ -174,9 +175,9 @@ export function registerPlatformTools(server, platform) {
|
|
|
174
175
|
// hoşgörülüdür; çeviri yapıldığında yanıt bunu normalizedFrom ile söyler.
|
|
175
176
|
server.registerTool('platform_gap_report', {
|
|
176
177
|
title: 'Kabiliyet boşluğu bildir',
|
|
177
|
-
description: "Yapmak İSTEDİĞİNİZ ama platform desteklemediği için yapamadığınız her noktada BUNU ÇAĞIRIN — tasarımı sessizce küçültmeyin. Bu çağrı
|
|
178
|
+
description: "Yapmak İSTEDİĞİNİZ ama platform desteklemediği için yapamadığınız her noktada BUNU ÇAĞIRIN — tasarımı sessizce küçültmeyin. Bu çağrı platform API'sine gitmez: günlüğe 'KABİLİYET BOŞLUĞU' bloğu yazar ve GAP_REPORT_WEBHOOK_URL tanımlıysa kaydı ekibin webhook'una gönderir; yanıttaki delivered kaydın ekibe ulaşıp ulaşmadığını söyler (webhook · log-only · webhook-failed). Hata günlüğünde görünmeyen bu kayıtlar ürün yol haritasının girdisidir. Önce rehbere bakıp (platform_guide; hazır komponent yetmiyorsa tek seferlik için 'html' kaçış kapısı, kalıcı bir ihtiyaç içinse 'external-component' — kendi komponentinizi yazıp yayınlayabilirsiniz) gerçekten desteklenmediğinden emin olun: desteklenen bir şeyi 'yok' diye bildirmek yanlış yol haritası üretir.",
|
|
178
179
|
inputSchema: {
|
|
179
|
-
project: z.string().min(1).optional().describe("Boşluğun görüldüğü proje (ad ya da slug); kayda yazılır.
|
|
180
|
+
project: z.string().min(1).optional().describe("Boşluğun görüldüğü proje (ad ya da slug); kayda yazılır. Platform API'sine gitmez, proje yalnız bağlamdır"),
|
|
180
181
|
goal: z.string().min(1).optional().describe('Ne yapmak istediniz — kullanıcıya görünen sonuç olarak yazın ("randevu listesini hasta adına göre süzmek"). Eşanlamlı kabul edilir: title · summary · what.'),
|
|
181
182
|
blocker: z.string().min(1).optional().describe('Neden yapamadınız — hangi kabiliyetin eksik olduğu ("uçta X yok", "komponentte Y prop\'u yok"). Eşanlamlı kabul edilir: reason · problem · missing · description.'),
|
|
182
183
|
severity: z.string().optional().describe("YOL HARİTASINDAKİ SIRAYI BU ALAN BELİRLER, doldurun. blocker: özellik hiç yapılamadı · workaround: daha kötü bir yolla yapıldı · cosmetic: yalnız görsel/ergonomik kayıp. Eşanlamlılar çevrilir (critical/high/blocking→blocker, medium/major→workaround, low/minor/nit→cosmetic). TANINMAYAN değer reddedilir; verilmezse kayıt düşer ama yanıt 'incomplete' ile uyarır ve bildirim orta kovaya yazılır."),
|
|
@@ -191,22 +192,30 @@ export function registerPlatformTools(server, platform) {
|
|
|
191
192
|
missing: z.string().optional().describe('blocker ile aynı alan (eşanlamlı)'),
|
|
192
193
|
description: z.string().optional().describe('blocker ile aynı alan (eşanlamlı)')
|
|
193
194
|
},
|
|
194
|
-
annotations: readOnly
|
|
195
|
+
annotations: { ...readOnly, openWorldHint: true }
|
|
195
196
|
}, handle(config, async (input) => {
|
|
196
197
|
const gap = normalizeGapReport(input);
|
|
197
|
-
|
|
198
|
+
const record = { goal: gap.goal, blocker: gap.blocker, severity: gap.severity, module: gap.module, attempted: gap.attempted, workaround: gap.workaround, project: input.project };
|
|
199
|
+
logCapabilityGap(record);
|
|
200
|
+
const delivered = await deliverGapReport(config.gapReportWebhookUrl, record);
|
|
201
|
+
const deliveryNote = {
|
|
202
|
+
webhook: 'Günlüğe yazıldı ve ekibe iletildi.',
|
|
203
|
+
'log-only': 'Yalnız bu makinedeki günlüğe yazıldı — ekibe ulaşmadı (GAP_REPORT_WEBHOOK_URL tanımlı değil).',
|
|
204
|
+
'webhook-failed': "Ekibin webhook'una ulaşılamadı, kayıt bu makinedeki günlükte duruyor."
|
|
205
|
+
}[delivered];
|
|
198
206
|
return {
|
|
199
207
|
recorded: true,
|
|
208
|
+
delivered,
|
|
200
209
|
...(input.project ? { project: input.project } : {}),
|
|
201
210
|
severity: gap.severity,
|
|
202
211
|
module: gap.module ?? null,
|
|
203
212
|
...(Object.keys(gap.normalizedFrom).length > 0 ? { normalizedFrom: gap.normalizedFrom } : {}),
|
|
204
213
|
...(gap.incomplete.length > 0 ? { incomplete: gap.incomplete } : {}),
|
|
205
214
|
note: gap.incomplete.length > 0
|
|
206
|
-
?
|
|
215
|
+
? `${deliveryNote} Kayıt eksik: ${gap.incomplete.join(', ')}.`
|
|
207
216
|
+ (gap.incomplete.includes('severity') ? ` Şiddet verilmediği için kayıt '${gap.severity}' olarak düştü — yol haritasındaki sırayı bu alan belirler, blocker'sa bunu açıkça yazın.` : '')
|
|
208
217
|
+ ' Bir sonraki bildirimde bu alanları da doldurun — eksik kayıt yol haritasında sırasını kaybeder. Kullanıcıya da tek cümleyle söyleyin: neyi yapamadınız ve yerine ne yaptınız.'
|
|
209
|
-
:
|
|
218
|
+
: `${deliveryNote} Kullanıcıya da tek cümleyle söyleyin: neyi yapamadınız ve yerine ne yaptınız.`
|
|
210
219
|
};
|
|
211
220
|
}));
|
|
212
221
|
}
|
package/dist/tools/workflows.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { guid, projectParam, environmentParam, definitionParam, pagingParams, readOnly, writes, updates, destructive, microOps, languageParam } from './common.js';
|
|
1
|
+
import { guid, projectParam, environmentParam, definitionParam, pagingParams, readOnly, writes, updates, destructive, microOps, languageParam, unchangedPatch } from './common.js';
|
|
2
2
|
import { normalizeWorkflowDefinition, withNormalization } from '../knowledge/normalize.js';
|
|
3
3
|
import { evaluatePolicy, enforcePolicy, attachFindings } from '../knowledge/policy.js';
|
|
4
4
|
import { workflowOutline, resolvePart, resolvePatchOperations } from '../knowledge/outlines.js';
|
|
@@ -224,6 +224,8 @@ export function registerWorkflowTools(server, platform) {
|
|
|
224
224
|
// Gövde değil FARK gönderilir: gateway normalizasyonları da op'a çevrilsin diye net diff
|
|
225
225
|
// okunan kayıt ile son hâl arasından hesaplanır (tam PUT yok, yalnız değişen alanlar yazılır).
|
|
226
226
|
const netOps = fastJsonPatch.compare(definition, patched);
|
|
227
|
+
if (netOps.length === 0)
|
|
228
|
+
return attachFindings(unchangedPatch(operations.length), findings);
|
|
227
229
|
const saved = await platform.tenant('PATCH', project, `/workflows/${applicationId}/${id}`, {
|
|
228
230
|
environment,
|
|
229
231
|
body: { baseVersion: baseVersionOf(definition, 'workflow_get'), ops: netOps }
|
|
@@ -272,7 +274,7 @@ export function registerWorkflowTools(server, platform) {
|
|
|
272
274
|
}));
|
|
273
275
|
server.registerTool('workflow_step_schema', {
|
|
274
276
|
title: 'Step şeması üret',
|
|
275
|
-
description: "Verilen step tanımı için girdi/çıktı şemasını üretir (parameterScheme / returnScheme); step yazarken definition'ı doğrulamanın en hızlı yolu. type:'workflow' adımında (rule.workflowId) çağrılan akışın parametre ve dönüş DTO'sunu döner — alt akışa girdi YALNIZ rule.expression ile geçer, nesne literalinin anahtarları bu parameterScheme'in alanlarıdır (WF-032; platform_guide('workflow') §Workflow adımı). 'workflow' adımında returnBehavior çağrılan akışın dönüş biçimidir (array → liste). returnScheme adımın GÖVDESİDİR; koşumda her adım { data, meta, error } zarfındadır — 'http' adımında gövde tipsizdir (<adım>.data), durum kodu <adım>.meta.httpStatusCode. ŞEMA ALAN ADLARINI VERİR, HANGİ ALANIN ÇALIŞTIĞINI DEĞİL — iki ölçülmüş sapma (2026-09-16): (1) 'workflow' adımında workflowId boşken parameterScheme/returnScheme boş döner ve şema girdinin rule.expression ile bağlandığını söylemez; (2) 'email' adımında
|
|
277
|
+
description: "Verilen step tanımı için girdi/çıktı şemasını üretir (parameterScheme / returnScheme); step yazarken definition'ı doğrulamanın en hızlı yolu. type:'workflow' adımında (rule.workflowId) çağrılan akışın parametre ve dönüş DTO'sunu döner — alt akışa girdi YALNIZ rule.expression ile geçer, nesne literalinin anahtarları bu parameterScheme'in alanlarıdır (WF-032; platform_guide('workflow') §Workflow adımı). 'workflow' adımında returnBehavior çağrılan akışın dönüş biçimidir (array → liste). returnScheme adımın GÖVDESİDİR; koşumda her adım { data, meta, error } zarfındadır — 'http' adımında gövde tipsizdir (<adım>.data), durum kodu <adım>.meta.httpStatusCode. ŞEMA ALAN ADLARINI VERİR, HANGİ ALANIN ÇALIŞTIĞINI DEĞİL — iki ölçülmüş sapma (2026-09-16): (1) 'workflow' adımında workflowId boşken parameterScheme/returnScheme boş döner ve şema girdinin rule.expression ile bağlandığını söylemez; (2) 'email' adımında alıcı YALNIZ rule.expression ile verilir ve { to, cc, bcc } adres dizgisi listeleri döndürür — \"({ to: [input.email] })\"; şemadaki expression.to/cc/bcc bu ifadenin döndürdüğü şekildir, kural düzeyinde send/toMail/sendTo yazılırsa platform atar (WF-037; platform_guide('workflow') §Email adımı). Sözleşmenin ölçülmüş hâli: ngapps://examples/workflow-http-step · workflow-call-workflow · workflow-loop-step · workflow-email-step ve platform_guide('workflow').",
|
|
276
278
|
inputSchema: { project: projectParam, environment: environmentParam, applicationId: guid, id: guid, step: definitionParam },
|
|
277
279
|
annotations: readOnly
|
|
278
280
|
}, handle(config, ({ project, environment, applicationId, id, step }) => platform.tenant('POST', project, `/workflows/${applicationId}/${id}/steps/schema`, { environment, body: step })));
|
package/package.json
CHANGED