@appaflytech/zeyrek-ai-mcp 0.0.16 → 0.0.18
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/README.md +14 -13
- package/dist/knowledge/rules.js +21 -0
- package/dist/platform/diagnostics.js +85 -0
- package/dist/platform/ifExists.js +129 -0
- package/dist/platform/responses.js +2 -1
- package/dist/platform/strictArguments.js +22 -2
- package/dist/platform/writeDiff.js +58 -31
- package/dist/platform/writeView.js +17 -0
- package/dist/resources/guides/functions.md +31 -2
- package/dist/resources/guides/getting-started.md +35 -0
- package/dist/resources/schema-fingerprint.json +3 -3
- package/dist/resources/schemas/GlobalFunctionUpdateResultDto.json +18 -0
- package/dist/tools/designSchemaPatch.js +3 -3
- package/dist/tools/flows.js +35 -41
- package/dist/tools/functions.js +20 -10
- package/dist/tools/microservices.js +39 -11
- package/dist/tools/pages.js +55 -12
- package/dist/tools/workflows.js +39 -12
- package/package.json +6 -1
package/dist/tools/workflows.js
CHANGED
|
@@ -7,10 +7,13 @@ import { writeDiff, withWriteDiff } from '../platform/writeDiff.js';
|
|
|
7
7
|
import { policyRules, microfunctionStepFindings, workflowStepFindings, undefinedInputFieldFindings } from '../knowledge/rules.js';
|
|
8
8
|
import { languageHeader } from '../knowledge/languageCodes.js';
|
|
9
9
|
import { handle } from '../platform/responses.js';
|
|
10
|
+
import { existingMatch, ifExistsParam, listAll, platformRename, withOutcome, withRename } from '../platform/ifExists.js';
|
|
11
|
+
import { outlineWrite, recordWriteViewParam } from '../platform/writeView.js';
|
|
10
12
|
import fastJsonPatch from 'fast-json-patch';
|
|
11
13
|
import { z } from 'zod';
|
|
12
14
|
import { constraintSummary } from '../knowledge/backendConstraints.js';
|
|
13
15
|
import { unmappedMembers, introducedUnmappedMembers, withUnmappedMembers } from '../knowledge/schemaGuard.js';
|
|
16
|
+
const workflowIfExistsParam = ifExistsParam('workflow', 'mevcut workflow\'u bu tanımla tam gövde günceller (id\'si korunur; workflow_update ile aynı yazma)');
|
|
14
17
|
const policyOverrideParam = z.boolean().optional()
|
|
15
18
|
.describe('true: politika block bulgularını warn\'a indirir (bilinçli istisna; yanıtta işaretlenir)');
|
|
16
19
|
const patchOperationsParam = z.array(z.record(z.unknown())).min(1)
|
|
@@ -111,27 +114,51 @@ export function registerWorkflowTools(server, platform) {
|
|
|
111
114
|
}));
|
|
112
115
|
server.registerTool('workflow_create', {
|
|
113
116
|
title: 'Workflow oluştur',
|
|
114
|
-
description: "Yeni workflow tanımlar (definition = CreateWorkflowCommand). type: 'workflow' | 'automation' | 'middleware'. İlk kullanımdan önce platform_guide('workflow') okuyun: DTO-önce akışı, branch bağlama (branches[].nextStepId), tip×step matrisi. Her adım ve akışın kendisi 'description' taşımak ZORUNDADIR (WF-024, block): adımın NE İŞE YARADIĞINI 1-2 cümleyle yazın — Studio kanvasında ⓘ ikonu olarak görünür; mekanizmayı değil niyeti yazın. Middleware (istek öncesi koşan guard/setter, user değişkeni, alfabetik sıra) için platform_guide('middleware') + ngapps://examples/middleware-authenticate. Adımın gerçek bir tuzağı varsa (idempotent değil, kapsam adımda değil, dış bağımlılık, sessiz düşen dal) 'caution' alanına yazın — OPSİYONELDİR, tuzak yoksa boş bırakın; doldurma metin yazmayın. Gövde politika kontrolünden geçer. " + constraintSummary('CreateWorkflowCommand'),
|
|
115
|
-
inputSchema: { project: projectParam, environment: environmentParam, applicationId: guid, definition: definitionParam, policyOverride: policyOverrideParam },
|
|
117
|
+
description: "Yeni workflow tanımlar (definition = CreateWorkflowCommand). type: 'workflow' | 'automation' | 'middleware'. Uygulamada aynı ad ya da slug'da workflow varsa (tipten bağımsız) varsayılan olarak YAZMAZ ve mevcut kaydın id'sini döner (WF-034 — gönderilseydi platform '<ad> (1)' adıyla ikinci bir kayıt açardı); tekrar çalıştırılabilir yazma için ifExists:'update' verin, yanıttaki outcome 'created' | 'updated' olur. Mevcut workflow'lar okunamazsa da yazmaz. İlk kullanımdan önce platform_guide('workflow') okuyun: DTO-önce akışı, branch bağlama (branches[].nextStepId), tip×step matrisi. Her adım ve akışın kendisi 'description' taşımak ZORUNDADIR (WF-024, block): adımın NE İŞE YARADIĞINI 1-2 cümleyle yazın — Studio kanvasında ⓘ ikonu olarak görünür; mekanizmayı değil niyeti yazın. Middleware (istek öncesi koşan guard/setter, user değişkeni, alfabetik sıra) için platform_guide('middleware') + ngapps://examples/middleware-authenticate. Adımın gerçek bir tuzağı varsa (idempotent değil, kapsam adımda değil, dış bağımlılık, sessiz düşen dal) 'caution' alanına yazın — OPSİYONELDİR, tuzak yoksa boş bırakın; doldurma metin yazmayın. Gövde politika kontrolünden geçer. " + constraintSummary('CreateWorkflowCommand'),
|
|
118
|
+
inputSchema: { project: projectParam, environment: environmentParam, applicationId: guid, definition: definitionParam, ifExists: workflowIfExistsParam, view: recordWriteViewParam, policyOverride: policyOverrideParam },
|
|
116
119
|
annotations: writes
|
|
117
|
-
}, handle(config, async ({ project, environment, applicationId, definition, policyOverride }) => {
|
|
120
|
+
}, handle(config, async ({ project, environment, applicationId, definition, ifExists, view, policyOverride }) => {
|
|
118
121
|
const normalized = normalizeWorkflowDefinition(definition);
|
|
119
|
-
|
|
120
|
-
|
|
122
|
+
// Politika ÖNCE koşar: block alan istek platforma hiç gitmez, var-mı listesi de okunmaz.
|
|
123
|
+
const stepFindings = [
|
|
121
124
|
...await microfunctionStepFindings(platform, project, environment, definition, definition.type, policyOverride),
|
|
122
125
|
...await workflowStepFindings(platform, project, environment, applicationId, definition, definition.type, policyOverride),
|
|
123
126
|
...await undefinedInputFieldFindings(platform, project, environment, definition, definition.type, policyOverride)
|
|
124
|
-
]
|
|
125
|
-
const
|
|
126
|
-
const
|
|
127
|
-
|
|
127
|
+
];
|
|
128
|
+
const bodyFindings = (operation) => evaluatePolicy(config, policyRules, 'workflow', definition, { operation, workflowKind: definition.type }, policyOverride);
|
|
129
|
+
const createFindings = enforcePolicy([...bodyFindings('create'), ...stepFindings]);
|
|
130
|
+
const existing = await existingMatch({
|
|
131
|
+
code: 'WF-034',
|
|
132
|
+
noun: 'workflow',
|
|
133
|
+
where: 'bu uygulamada',
|
|
134
|
+
name: typeof definition.name === 'string' ? definition.name : undefined,
|
|
135
|
+
slug: typeof definition.slug === 'string' ? definition.slug : undefined,
|
|
136
|
+
id: typeof definition.id === 'string' ? definition.id : undefined,
|
|
137
|
+
idParam: 'definition.id',
|
|
138
|
+
ifExists,
|
|
139
|
+
list: () => listAll(platform, project, environment, `/workflows/${applicationId}`),
|
|
140
|
+
listTool: 'workflow_list',
|
|
141
|
+
copyCheck: 'kullanılıp kullanılmadığını workflow_dependencies ile kontrol edip gerekirse silin',
|
|
142
|
+
updateTool: 'id ile workflow_update',
|
|
143
|
+
kind: { key: 'type', value: definition.type }
|
|
144
|
+
});
|
|
145
|
+
// Kayıt bulunduysa yazma bir UPDATE'tir: gövde kuralları workflow_update ile aynı kipte yeniden
|
|
146
|
+
// değerlendirilir (R-1). Adım denetimleri operasyondan bağımsızdır, tekrar koşmaz.
|
|
147
|
+
const findings = existing === undefined ? createFindings : enforcePolicy([...bodyFindings('update'), ...stepFindings]);
|
|
148
|
+
const drift = unmappedMembers(existing === undefined ? 'CreateWorkflowCommand' : 'UpdateWorkflowCommand', definition);
|
|
149
|
+
const payload = existing === undefined
|
|
150
|
+
? await platform.tenant('POST', project, `/workflows/${applicationId}`, { environment, body: definition })
|
|
151
|
+
: await platform.tenant('PUT', project, `/workflows/${applicationId}/${String(existing.id)}`, { environment, body: definition });
|
|
152
|
+
const saved = payload?.data;
|
|
153
|
+
const rename = ifExists === 'duplicate' ? platformRename(definition, saved, 'dash') : { sent: definition };
|
|
154
|
+
return attachFindings(withUnmappedMembers(withWriteDiff(withRename(withNormalization(withOutcome(outlineWrite(payload, view, ['type']), existing), normalized), rename.renamed), writeDiff(rename.sent, payload)), drift), findings);
|
|
128
155
|
}));
|
|
129
156
|
server.registerTool('workflow_update', {
|
|
130
157
|
title: 'Workflow güncelle',
|
|
131
158
|
description: 'Workflow tanımını günceller (definition = UpdateWorkflowCommand, tam gövde). Hedefli değişiklik için workflow_patch tercih edin. Her adım ve akışın kendisi \'description\' taşımak ZORUNDADIR (WF-024, block). Adımın gerçek bir tuzağı varsa (idempotent değil, kapsam adımda değil, dış bağımlılık, sessiz düşen dal) \'caution\' alanına yazın — OPSİYONELDİR, tuzak yoksa boş bırakın; doldurma metin yazmayın. Gövde politika kontrolünden geçer. ' + constraintSummary('UpdateWorkflowCommand'),
|
|
132
|
-
inputSchema: { project: projectParam, environment: environmentParam, applicationId: guid, id: guid, definition: definitionParam, policyOverride: policyOverrideParam },
|
|
159
|
+
inputSchema: { project: projectParam, environment: environmentParam, applicationId: guid, id: guid, definition: definitionParam, view: recordWriteViewParam, policyOverride: policyOverrideParam },
|
|
133
160
|
annotations: updates
|
|
134
|
-
}, handle(config, async ({ project, environment, applicationId, id, definition, policyOverride }) => {
|
|
161
|
+
}, handle(config, async ({ project, environment, applicationId, id, definition, view, policyOverride }) => {
|
|
135
162
|
const normalized = normalizeWorkflowDefinition(definition);
|
|
136
163
|
const findings = enforcePolicy([
|
|
137
164
|
...evaluatePolicy(config, policyRules, 'workflow', definition, { operation: 'update', workflowKind: definition.type }, policyOverride),
|
|
@@ -141,7 +168,7 @@ export function registerWorkflowTools(server, platform) {
|
|
|
141
168
|
]);
|
|
142
169
|
const drift = unmappedMembers('UpdateWorkflowCommand', definition);
|
|
143
170
|
const payload = await platform.tenant('PUT', project, `/workflows/${applicationId}/${id}`, { environment, body: definition });
|
|
144
|
-
return attachFindings(withUnmappedMembers(withWriteDiff(withNormalization(payload, normalized), writeDiff(definition, payload)), drift), findings);
|
|
171
|
+
return attachFindings(withUnmappedMembers(withWriteDiff(withNormalization(outlineWrite(payload, view, ['type']), normalized), writeDiff(definition, payload)), drift), findings);
|
|
145
172
|
}));
|
|
146
173
|
server.registerTool('workflow_patch', {
|
|
147
174
|
title: 'Workflow\'a patch uygula',
|
package/package.json
CHANGED
|
@@ -1,9 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@appaflytech/zeyrek-ai-mcp",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.18",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Zeyrek (NgApps) platform APIs as MCP tools — data, logic and Studio design surface in one gateway",
|
|
6
6
|
"license": "UNLICENSED",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "git+https://github.com/zeyrek-v2/zeyrek-app.git",
|
|
10
|
+
"directory": "zeyrek-mcp"
|
|
11
|
+
},
|
|
7
12
|
"engines": {
|
|
8
13
|
"node": ">=20"
|
|
9
14
|
},
|