@appaflytech/zeyrek-ai-mcp 0.0.35 → 0.0.37
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 +15 -0
- package/README.md +5 -5
- package/dist/config.js +37 -0
- package/dist/index.js +2 -0
- package/dist/knowledge/access.js +802 -0
- package/dist/knowledge/backendConstraints.js +18 -1
- package/dist/knowledge/case.js +41 -0
- package/dist/knowledge/componentCatalog.js +655 -424
- package/dist/knowledge/componentEvents.js +140 -23
- package/dist/knowledge/connectDataBind.js +843 -0
- package/dist/knowledge/connectDataDefinition.js +344 -0
- package/dist/knowledge/connectDataExecute.js +93 -0
- package/dist/knowledge/connectDataRules.js +128 -0
- package/dist/knowledge/decision.js +121 -0
- package/dist/knowledge/expressionPrelude.js +59 -0
- package/dist/knowledge/layoutSummary.js +140 -2
- package/dist/knowledge/microserviceParameters.js +58 -0
- package/dist/knowledge/mining.js +94 -0
- package/dist/knowledge/mobileComponentCatalog.js +864 -0
- package/dist/knowledge/mobileComponentEvents.js +239 -0
- package/dist/knowledge/mobileStore.js +321 -0
- package/dist/knowledge/normalize.js +235 -84
- package/dist/knowledge/outlines.js +36 -0
- package/dist/knowledge/platform/lint.js +385 -0
- package/dist/knowledge/platform/mobile.js +142 -0
- package/dist/knowledge/platform/mobileLayoutLint.js +324 -0
- package/dist/knowledge/platform/mobileRules.js +231 -0
- package/dist/knowledge/platform/mobileSpacing.js +82 -0
- package/dist/knowledge/platform/mobileTabs.js +108 -0
- package/dist/knowledge/platform/nativeBoxModel.js +44 -0
- package/dist/knowledge/platform/profile.js +25 -0
- package/dist/knowledge/platform/resolve.js +122 -0
- package/dist/knowledge/platform/web.js +39 -0
- package/dist/knowledge/policy.js +18 -4
- package/dist/knowledge/process.js +510 -0
- package/dist/knowledge/reservedTables.js +79 -0
- package/dist/knowledge/rowFilter.js +43 -0
- package/dist/knowledge/rules.js +423 -37
- package/dist/knowledge/schemaGuard.js +11 -0
- package/dist/knowledge/styleResolve.js +53 -19
- package/dist/knowledge/styleResolveNative.js +527 -0
- package/dist/knowledge/themeResolve.js +4 -4
- package/dist/knowledge/themeSchema.js +1 -2
- package/dist/observability/trace.js +6 -3
- package/dist/platform/argumentAliases.js +128 -0
- package/dist/platform/bodyFile.js +103 -0
- package/dist/platform/capture/actions.js +398 -0
- package/dist/platform/capture/browser.js +1 -0
- package/dist/platform/capture/capture.js +683 -0
- package/dist/platform/capture/console-log.js +122 -0
- package/dist/platform/capture/index.js +11 -0
- package/dist/platform/capture/readiness.js +103 -0
- package/dist/platform/capture/summary.js +77 -0
- package/dist/platform/capture/target.js +5 -0
- package/dist/platform/capture/targets/studio-mobile.js +15 -0
- package/dist/platform/capture/targets/studio-web.js +5 -0
- package/dist/platform/diagnostics.js +10 -4
- package/dist/platform/domSummary.js +1 -1
- package/dist/platform/errors.js +163 -10
- package/dist/platform/http.js +29 -8
- package/dist/platform/impersonation.js +45 -0
- package/dist/platform/jsonArray.js +24 -0
- package/dist/platform/responses.js +39 -5
- package/dist/platform/schemaReadMemory.js +60 -0
- package/dist/platform/secrets.js +19 -1
- package/dist/platform/strictArguments.js +68 -12
- package/dist/platform/tokenVault.js +187 -4
- package/dist/resources/examples/bpm-gorev-kontrol.json +294 -0
- package/dist/resources/examples/bpm-iso-dokuman.json +228 -0
- package/dist/resources/examples/bpm-satinalma.json +376 -0
- package/dist/resources/examples/connect-data-convert-verify.json +107 -0
- package/dist/resources/examples/connect-data-dropdown-roles.json +66 -0
- package/dist/resources/examples/connect-data-edit-m2m.json +73 -0
- package/dist/resources/examples/connect-data-query-params.json +50 -0
- package/dist/resources/examples/connect-data-table-entity.json +147 -0
- package/dist/resources/examples/connect-data-workflow-microservice.json +65 -0
- package/dist/resources/examples/middleware-authenticate.json +1 -1
- package/dist/resources/examples/mobile-app-shell-drawer.json +244 -0
- package/dist/resources/examples/mobile-app-shell-stack.json +157 -0
- package/dist/resources/examples/mobile-app-shell-tab.json +208 -0
- package/dist/resources/examples/mobile-form-screen.json +365 -0
- package/dist/resources/examples/mobile-list-detail-form.json +703 -0
- package/dist/resources/examples/page-detail-profile.json +2 -1
- package/dist/resources/examples/page-dynamic-form.json +3 -2
- package/dist/resources/examples/page-flex-sections.json +1 -1
- package/dist/resources/examples/page-html-embed.json +1 -1
- package/dist/resources/examples/workflow-basic.json +8 -2
- package/dist/resources/guides/access.md +810 -0
- package/dist/resources/guides/bpm.md +691 -0
- package/dist/resources/guides/case.md +153 -0
- package/dist/resources/guides/component.md +93 -6
- package/dist/resources/guides/decision.md +185 -0
- package/dist/resources/guides/entity.md +50 -8
- package/dist/resources/guides/expressions.md +14 -5
- package/dist/resources/guides/functions.md +1 -1
- package/dist/resources/guides/getting-started.md +38 -1
- package/dist/resources/guides/layout.md +11 -7
- package/dist/resources/guides/merge.md +37 -3
- package/dist/resources/guides/microservice.md +87 -2
- package/dist/resources/guides/middleware.md +68 -4
- package/dist/resources/guides/mobile-layout.md +193 -0
- package/dist/resources/guides/mobile-publish.md +124 -0
- package/dist/resources/guides/mobile.md +549 -0
- package/dist/resources/guides/page.md +463 -83
- package/dist/resources/guides/theme.md +8 -3
- package/dist/resources/guides/translation.md +1 -1
- package/dist/resources/guides/workflow.md +58 -1
- package/dist/resources/read.js +41 -0
- package/dist/resources/rules.js +11 -5
- package/dist/resources/schema-fingerprint.json +7 -5
- package/dist/resources/schemas/AccessExplanationDto.json +144 -0
- package/dist/resources/schemas/AccessMatrixDto.json +170 -0
- package/dist/resources/schemas/AccessPermissionDto.json +57 -0
- package/dist/resources/schemas/AccessPolicyDto.json +223 -0
- package/dist/resources/schemas/AccessResourceDto.json +86 -0
- package/dist/resources/schemas/AppSessionDto.json +53 -0
- package/dist/resources/schemas/ConnectDataDescribeDto.json +344 -0
- package/dist/resources/schemas/ConnectDataRequestModel.json +202 -0
- package/dist/resources/schemas/ConnectDataResultDto.json +421 -0
- package/dist/resources/schemas/ConnectorCredentialDto.json +70 -0
- package/dist/resources/schemas/ConvertConnectDataToMicroserviceCommand.json +37 -0
- package/dist/resources/schemas/CreateAccessPolicyCommand.json +209 -0
- package/dist/resources/schemas/CreateDecisionCommand.json +221 -0
- package/dist/resources/schemas/CreateEntityCommand.json +118 -0
- package/dist/resources/schemas/CreateMicroserviceCommand.json +13 -1
- package/dist/resources/schemas/CreateProcessDefinitionCommand.json +1337 -0
- package/dist/resources/schemas/CreateQueryCommand.json +4 -0
- package/dist/resources/schemas/CreateWorkflowCommand.json +146 -1
- package/dist/resources/schemas/DataJobDto.json +6 -1
- package/dist/resources/schemas/DecisionDto.json +302 -0
- package/dist/resources/schemas/DetachConnectDataMicroserviceCommand.json +28 -0
- package/dist/resources/schemas/ExplainAccessQuery.json +33 -0
- package/dist/resources/schemas/GenerateProcessDocumentCommand.json +116 -0
- package/dist/resources/schemas/GlobalFunctionUpdateResultDto.json +25 -1
- package/dist/resources/schemas/MicroserviceDto.json +15 -3
- package/dist/resources/schemas/OrganizationProjectDto.json +335 -0
- package/dist/resources/schemas/OrganizationSchemaDto.json +196 -0
- package/dist/resources/schemas/OrganizationSchemaVersionDto.json +207 -0
- package/dist/resources/schemas/PatchProcessDefinitionCommand.json +76 -0
- package/dist/resources/schemas/PreviewMicroserviceCommand.json +10 -1
- package/dist/resources/schemas/PreviewWorkflowCommand.json +25 -1
- package/dist/resources/schemas/ProcessDefinitionDto.json +1480 -0
- package/dist/resources/schemas/ProcessSimulationDto.json +96 -0
- package/dist/resources/schemas/SaveConnectorCredentialCommand.json +90 -0
- package/dist/resources/schemas/SaveProcessEventSourceCommand.json +61 -0
- package/dist/resources/schemas/SaveProcessMailSourceCommand.json +89 -0
- package/dist/resources/schemas/SignProcessTaskCommand.json +73 -0
- package/dist/resources/schemas/SimulateProcessDefinitionQuery.json +92 -0
- package/dist/resources/schemas/StartMobileBuildCommand.json +54 -0
- package/dist/resources/schemas/StepDto.json +25 -1
- package/dist/resources/schemas/UpdateAccessPolicyCommand.json +209 -0
- package/dist/resources/schemas/UpdateDecisionCommand.json +216 -0
- package/dist/resources/schemas/UpdateEntityCommand.json +118 -0
- package/dist/resources/schemas/UpdateMicroserviceCommand.json +13 -1
- package/dist/resources/schemas/UpdateProcessDefinitionCommand.json +1357 -0
- package/dist/resources/schemas/UpdateQueryCommand.json +4 -0
- package/dist/resources/schemas/UpdateViewCommand.json +0 -2
- package/dist/resources/schemas/UpdateWorkflowCommand.json +146 -1
- package/dist/resources/schemas/UpsertMobileStoreSettingsCommand.json +274 -0
- package/dist/resources/schemas/ValidateProcessDefinitionQuery.json +1339 -0
- package/dist/server.js +31 -1
- package/dist/tools/access.js +369 -2
- package/dist/tools/accessOperations.js +135 -0
- package/dist/tools/accessPolicies.js +170 -0
- package/dist/tools/accessRuntime.js +203 -0
- package/dist/tools/applications.js +60 -3
- package/dist/tools/bpm.js +343 -0
- package/dist/tools/bpmGovernance.js +266 -0
- package/dist/tools/bpmOperations.js +230 -0
- package/dist/tools/bpmReporting.js +154 -0
- package/dist/tools/bpmRouting.js +150 -0
- package/dist/tools/bpmRuntime.js +396 -0
- package/dist/tools/case.js +178 -0
- package/dist/tools/caseRuntime.js +89 -0
- package/dist/tools/common.js +10 -1
- package/dist/tools/components.js +118 -14
- package/dist/tools/connectData.js +450 -0
- package/dist/tools/connectors.js +193 -0
- package/dist/tools/datasources.js +3 -3
- package/dist/tools/decisions.js +206 -0
- package/dist/tools/dependencies.js +1 -1
- package/dist/tools/deployments.js +38 -3
- package/dist/tools/designSchemaPatch.js +34 -9
- package/dist/tools/dtos.js +36 -5
- package/dist/tools/entities.js +79 -12
- package/dist/tools/externalComponents.js +26 -5
- package/dist/tools/flows.js +119 -17
- package/dist/tools/folders.js +1 -1
- package/dist/tools/imports.js +5 -2
- package/dist/tools/layouts.js +50 -17
- package/dist/tools/merges.js +2 -2
- package/dist/tools/microservices.js +77 -25
- package/dist/tools/mobile.js +280 -0
- package/dist/tools/mobileStore.js +556 -0
- package/dist/tools/modules.js +48 -0
- package/dist/tools/organizationStructure.js +137 -0
- package/dist/tools/pages.js +465 -98
- package/dist/tools/platformInfo.js +28 -8
- package/dist/tools/profileWrite.js +92 -0
- package/dist/tools/projects.js +71 -9
- package/dist/tools/rows.js +69 -13
- package/dist/tools/schemaOps.js +61 -1
- package/dist/tools/screenWrite.js +36 -7
- package/dist/tools/screens.js +95 -5
- package/dist/tools/templates.js +26 -1
- package/dist/tools/translations.js +1 -1
- package/dist/tools/variables.js +11 -5
- package/dist/tools/workflows.js +10 -5
- package/package.json +2 -2
- package/dist/platform/screenshot.js +0 -1162
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { maskSecretText } from '../secrets.js';
|
|
2
|
+
const bufferLimit = 20;
|
|
3
|
+
const reportLimit = 5;
|
|
4
|
+
const textLimit = 300;
|
|
5
|
+
const stackLines = 5;
|
|
6
|
+
const clip = (text) => (text.length > textLimit ? `${text.slice(0, textLimit - 1)}…` : text);
|
|
7
|
+
/**
|
|
8
|
+
* Gateway'in KENDİ ayarının ürettiği satırlar: kare bağlamı "hareketi azalt" ile açılır (SCR-014) ve reanimated bunu
|
|
9
|
+
* geliştirme kipinde uyarır. Sayfanın kusuru değildir; her donuk karede `consoleErrors`'a düşüp ajanı yanıltıyordu.
|
|
10
|
+
*/
|
|
11
|
+
const selfInduced = [/^\[Reanimated\] Reduced motion setting is enabled/];
|
|
12
|
+
/**
|
|
13
|
+
* Çekim boyunca tarayıcı konsolunun hata/uyarı satırları ve yakalanmamış istisnalar. Koşuda sayfa
|
|
14
|
+
* çizilmediğinde `page_screenshot` yalnız "runtime hiç render olmadı" diyordu; nedeni bulmak için
|
|
15
|
+
* ajan kendi Playwright betiğini yazıp Studio paketinin sıkıştırılmış kaynağını okudu
|
|
16
|
+
* (plans/mobil-plantcare-acigi g-06). Aynı metin tekrarlanırsa sayaç artar, satır eklenmez; metin
|
|
17
|
+
* kırpılır ve kimlik parçaları maskelenir.
|
|
18
|
+
*/
|
|
19
|
+
export function createPageConsoleLog() {
|
|
20
|
+
const consoleRecords = [];
|
|
21
|
+
const pageErrorRecords = [];
|
|
22
|
+
return {
|
|
23
|
+
onConsole(message) {
|
|
24
|
+
const type = message.type();
|
|
25
|
+
const level = type === 'error' ? 'error' : type === 'warning' ? 'warning' : undefined;
|
|
26
|
+
if (!level)
|
|
27
|
+
return;
|
|
28
|
+
if (selfInduced.some(pattern => pattern.test(message.text())))
|
|
29
|
+
return;
|
|
30
|
+
const text = clip(maskSecretText(message.text()));
|
|
31
|
+
const existing = consoleRecords.find(record => record.level === level && record.text === text);
|
|
32
|
+
if (existing)
|
|
33
|
+
existing.count += 1;
|
|
34
|
+
else if (consoleRecords.length < bufferLimit)
|
|
35
|
+
consoleRecords.push({ level, text, count: 1 });
|
|
36
|
+
},
|
|
37
|
+
onPageError(error) {
|
|
38
|
+
if (pageErrorRecords.length >= bufferLimit)
|
|
39
|
+
return;
|
|
40
|
+
const message = clip(maskSecretText(error instanceof Error ? `${error.name}: ${error.message}` : String(error)));
|
|
41
|
+
const stack = error instanceof Error && error.stack
|
|
42
|
+
? maskSecretText(error.stack.split('\n').slice(1, stackLines + 1).map(line => line.trim()).join('\n'))
|
|
43
|
+
: undefined;
|
|
44
|
+
if (!pageErrorRecords.some(record => record.message === message))
|
|
45
|
+
pageErrorRecords.push({ message, ...(stack ? { stack } : {}) });
|
|
46
|
+
},
|
|
47
|
+
/** Önce hatalar, sonra uyarılar; en çok beş kayıt. `skip` sınırdan ÖNCE eler (ör. defterde zaten olan satır). */
|
|
48
|
+
consoleErrors(skip) {
|
|
49
|
+
const kept = skip ? consoleRecords.filter(record => !skip(record)) : consoleRecords;
|
|
50
|
+
return [...kept.filter(record => record.level === 'error'), ...kept.filter(record => record.level === 'warning')].slice(0, reportLimit);
|
|
51
|
+
},
|
|
52
|
+
pageErrors() {
|
|
53
|
+
return pageErrorRecords.slice(0, reportLimit);
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
const expressionsPerElement = 2;
|
|
58
|
+
/**
|
|
59
|
+
* Akış hata defterini ikiye ayırır (plans/zm-bulgulari-kapanisi g-06): akış adımı hataları `runtimeErrors`'ta kalır,
|
|
60
|
+
* prop ifadesi hataları `expressionErrors` olur — öğe başına en çok iki kayıt. Yalnız "Expression error" toast'ı
|
|
61
|
+
* vardı; ajan hangi öğenin hangi prop'unun patladığını DOM'daki toast metninden çıkaramıyordu.
|
|
62
|
+
*/
|
|
63
|
+
export function splitExpressionErrors(records) {
|
|
64
|
+
const perElement = new Map();
|
|
65
|
+
const expressionErrors = [];
|
|
66
|
+
for (const record of records) {
|
|
67
|
+
if (record.kind !== 'expression' || typeof record.element !== 'string')
|
|
68
|
+
continue;
|
|
69
|
+
const seen = perElement.get(record.element) ?? 0;
|
|
70
|
+
if (seen >= expressionsPerElement)
|
|
71
|
+
continue;
|
|
72
|
+
perElement.set(record.element, seen + 1);
|
|
73
|
+
expressionErrors.push({
|
|
74
|
+
elementId: record.element,
|
|
75
|
+
prop: record.property ?? '?',
|
|
76
|
+
...(typeof record.code === 'string' && record.code ? { expression: clip(maskSecretText(record.code)) } : {}),
|
|
77
|
+
message: clip(maskSecretText(record.message ?? '')),
|
|
78
|
+
count: record.count ?? 1
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
return { flowErrors: records.filter(record => record.kind !== 'expression'), expressionErrors };
|
|
82
|
+
}
|
|
83
|
+
/** Runtime'ın konsol satırı (`@ng-apps/flow` `expressionErrorLine`) defterdeki bir kaydın kopyası mı? Çift sayılmasın. */
|
|
84
|
+
export function isExpressionEcho(expressionErrors, text) {
|
|
85
|
+
return expressionErrors.some(record => text.startsWith(`[ng-apps] expression ${record.elementId}.${record.prop}:`));
|
|
86
|
+
}
|
|
87
|
+
export function expressionErrorsNote(expressionErrors) {
|
|
88
|
+
const names = expressionErrors.map(record => `${record.elementId}.${record.prop}${record.count > 1 ? ` (${record.count}×)` : ''}`);
|
|
89
|
+
return `${expressionErrors.length} ifade hatası: ${names.join(', ')} — bu prop'lar çizimde boş/varsayılan değerde kaldı ("Expression error" toast'ının nedeni). expression + message hangi bağlamanın neden patladığını söyler; ifadeyi page_schema_patch ile düzeltin (ör. null korumalı ?.).`;
|
|
90
|
+
}
|
|
91
|
+
const failureLimit = 3;
|
|
92
|
+
/**
|
|
93
|
+
* Çizilemeyen sayfanın hata metnine eklenen nedenler: çöken düğümler, yakalanmamış istisnalar, konsol
|
|
94
|
+
* hataları — bu sırayla, her birinden en çok üç; uyarılar eklenmez. Hiçbiri yoksa boş. Yalnız ilk neden
|
|
95
|
+
* yazılırken sayfa istisnası React'in bileşeni adlandıran konsol satırını gizliyordu.
|
|
96
|
+
*/
|
|
97
|
+
export function describePageFailure(log, renderErrors) {
|
|
98
|
+
const crashed = renderErrors.slice(0, failureLimit).map(record => `${record.elementId ?? '?'} — ${record.message}`);
|
|
99
|
+
const thrown = log.pageErrors().slice(0, failureLimit).map(record => `${record.message}${record.stack ? ` (${record.stack.split('\n')[0]})` : ''}`);
|
|
100
|
+
const logged = log.consoleErrors().filter(record => record.level === 'error').slice(0, failureLimit).map(record => record.text);
|
|
101
|
+
return [
|
|
102
|
+
crashed.length ? ` Çöken düğüm: ${crashed.join('; ')}.` : '',
|
|
103
|
+
thrown.length ? ` Sayfa istisnası: ${thrown.join('; ')}.` : '',
|
|
104
|
+
logged.length ? ` Konsol hatası: ${logged.join('; ')}.` : ''
|
|
105
|
+
].join('');
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Mobil çizicinin hata sınırlarının bıraktığı işaretler (`data-ng-render-error`). Düğümün dış sınırı
|
|
109
|
+
* (kancaları çöken düğüm) yer tutucuyu kendi kabuğunun dışında çizer ve kimliği işaretin üstünde taşır
|
|
110
|
+
* (`data-ng-render-error-id`); taşımıyorsa en yakın kabuk düğümdür.
|
|
111
|
+
*/
|
|
112
|
+
export const renderErrorsScript = "Array.from(document.querySelectorAll('[data-ng-render-error]')).slice(0, 20).map(function (el) { var own = el.getAttribute('data-ng-render-error-id'); var owner = own ? null : el.closest('[data-element-id]'); return { elementId: own || (owner ? owner.getAttribute('data-element-id') : undefined), message: el.getAttribute('data-ng-render-error') || '' }; })";
|
|
113
|
+
export function parseRenderErrors(value) {
|
|
114
|
+
if (!Array.isArray(value))
|
|
115
|
+
return [];
|
|
116
|
+
return value
|
|
117
|
+
.filter((entry) => entry !== null && typeof entry === 'object')
|
|
118
|
+
.map(entry => ({
|
|
119
|
+
...(typeof entry.elementId === 'string' ? { elementId: entry.elementId } : {}),
|
|
120
|
+
message: clip(maskSecretText(typeof entry.message === 'string' ? entry.message : ''))
|
|
121
|
+
}));
|
|
122
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ekran görüntüsü çekirdeği (plans/mobil-uygulama-expo G3): tarayıcı sözleşmesi, hazırlık kararı,
|
|
3
|
+
* etkileşim eylemleri, DOM özeti ve çekim döngüsü ayrı modüllerde; platforma göre değişen
|
|
4
|
+
* kısım yakalama HEDEFİDİR (`target.ts`, `targets/*`).
|
|
5
|
+
*/
|
|
6
|
+
export * from './browser.js';
|
|
7
|
+
export * from './actions.js';
|
|
8
|
+
export * from './summary.js';
|
|
9
|
+
export * from './readiness.js';
|
|
10
|
+
export * from './capture.js';
|
|
11
|
+
export * from './console-log.js';
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Kare ne zaman hazır? (G-30 → B-6, 2026-09-07)
|
|
3
|
+
*
|
|
4
|
+
* `delayMs` TAHMİNDİ; 09-05'te runtime koşan akış sayacını yayınlamaya başladı (`@ng-apps/flow`
|
|
5
|
+
* → flow-runtime-errors.ts) ve bekleme "running sıfır, completed > 0" olunca bitiyordu. Bu şart
|
|
6
|
+
* mount akışı OLMAYAN sayfada (giriş ekranı) hiç sağlanmaz; akış tetiklemeyen `set` eylemi de
|
|
7
|
+
* `completed`'ı artırmaz. 09-06·2 koşusunda üç eylemli giriş denemesi bu yüzden 47 sn sürdü;
|
|
8
|
+
* sentetik ölçümde sayfa 0.3 sn'de hazırken aynı çağrı 48 sn'ydi — süre sayfanın değil, bu
|
|
9
|
+
* döngünün. Hazırlık artık TEK anlık görüntüden okunur: akış sayacı + Studio'nun yükleme
|
|
10
|
+
* iskeleti (`ViewDetail.svelte` → `.view-detail > .bx--skeleton__placeholder`) + runtime
|
|
11
|
+
* düğümleri (`[data-element-id]`) + hata/bulunamadı hâli + adres. Karar `decideReadiness`'ta.
|
|
12
|
+
*
|
|
13
|
+
* Yüklenmemiş kare ASLA dönmez: bütçe dolduğunda sayfa hâlâ hazır değilse çağrı hatayla düşer
|
|
14
|
+
* (`captureUnready: true` teşhis kipi dışında). Bozuk sayfayı görmek istiyorsan hata mesajı
|
|
15
|
+
* neyin görüldüğünü zaten söyler.
|
|
16
|
+
*/
|
|
17
|
+
export const readinessScript = `(function () { /* readinessSnapshot */
|
|
18
|
+
var activity = window.__ngAppsFlowActivity;
|
|
19
|
+
return {
|
|
20
|
+
activity: activity && typeof activity.running === 'number' && typeof activity.completed === 'number' ? { running: activity.running, completed: activity.completed } : null,
|
|
21
|
+
runtimeNodes: document.querySelectorAll('[data-element-id]').length,
|
|
22
|
+
skeleton: !!document.querySelector('.view-detail > .bx--skeleton__placeholder'),
|
|
23
|
+
viewDetail: !!document.querySelector('.view-detail'),
|
|
24
|
+
errorState: !!document.querySelector('.view-detail__error, .view-detail .error-page'),
|
|
25
|
+
readyState: String(document.readyState),
|
|
26
|
+
href: String(location.href)
|
|
27
|
+
};
|
|
28
|
+
})()`;
|
|
29
|
+
/** Okunan değer gerçekten sayaç mı; değilse sayfa sayaç yayınlamıyordur (eski runtime). */
|
|
30
|
+
export function isFlowActivity(activity) {
|
|
31
|
+
if (!activity || typeof activity !== 'object')
|
|
32
|
+
return false;
|
|
33
|
+
const { running, completed } = activity;
|
|
34
|
+
return typeof running === 'number' && typeof completed === 'number';
|
|
35
|
+
}
|
|
36
|
+
/** Tarayıcıdan dönen değer anlık görüntü mü; yönlendirme sırasında evaluate düşer ve undefined kalır. */
|
|
37
|
+
export function parseReadiness(raw) {
|
|
38
|
+
if (!raw || typeof raw !== 'object')
|
|
39
|
+
return undefined;
|
|
40
|
+
const value = raw;
|
|
41
|
+
if (typeof value.runtimeNodes !== 'number' || typeof value.href !== 'string')
|
|
42
|
+
return undefined;
|
|
43
|
+
return {
|
|
44
|
+
activity: isFlowActivity(value.activity) ? { running: value.activity.running, completed: value.activity.completed } : null,
|
|
45
|
+
runtimeNodes: value.runtimeNodes,
|
|
46
|
+
skeleton: value.skeleton === true,
|
|
47
|
+
viewDetail: value.viewDetail === true,
|
|
48
|
+
errorState: value.errorState === true,
|
|
49
|
+
readyState: String(value.readyState ?? ''),
|
|
50
|
+
href: value.href
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
/** `/dev` ve `/view` aynı sayfadır (Studio `hooks.ts` reroute); yönlendirme kararı yalnız yoldan verilir. */
|
|
54
|
+
export function runtimePath(url) {
|
|
55
|
+
try {
|
|
56
|
+
return new URL(url).pathname.replace(/^\/dev\//, '/view/').replace(/\/+$/, '');
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
return url;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
/** "Hiç akış koşmadı" kararı için DOM'un kaç yoklama değişmemesi gerekir (~600 ms = eski settleMs). */
|
|
63
|
+
const quietPolls = 5;
|
|
64
|
+
/** Sayaç yayınlanmayan runtime'da tek kanıt DOM durulmasıdır; daha uzun beklenir (~1 sn). */
|
|
65
|
+
const legacyQuietPolls = 8;
|
|
66
|
+
/** Runtime dışına yönlendirme: hedef sayfanın kendi JS'i çizmeyi bitirsin (~1.5 sn). */
|
|
67
|
+
const redirectQuietPolls = 12;
|
|
68
|
+
/**
|
|
69
|
+
* Tek anlık görüntüden "kare alınabilir" kararı; iki uçta da yanlış beklememek için tek yerde.
|
|
70
|
+
* `quiet` görüntünün kaç yoklamadır değişmediğidir, `completedBefore` bu beklemenin başındaki
|
|
71
|
+
* bitmiş akış sayısı (sayfa değiştiyse çağıran sıfırlar). İskelet görünüyorsa hiçbir karar yok.
|
|
72
|
+
*/
|
|
73
|
+
export function decideReadiness(snapshot, quiet, completedBefore, baselineUrl) {
|
|
74
|
+
if (snapshot.skeleton)
|
|
75
|
+
return undefined;
|
|
76
|
+
const { activity } = snapshot;
|
|
77
|
+
const idle = activity !== null && activity.running === 0;
|
|
78
|
+
if (idle && activity.completed > completedBefore && snapshot.runtimeNodes > 0)
|
|
79
|
+
return 'ready';
|
|
80
|
+
if (idle && snapshot.runtimeNodes > 0 && quiet >= quietPolls)
|
|
81
|
+
return 'ready-no-flows';
|
|
82
|
+
if (activity === null && snapshot.runtimeNodes > 0 && quiet >= legacyQuietPolls)
|
|
83
|
+
return 'ready-no-counter';
|
|
84
|
+
if (idle && snapshot.errorState && quiet >= quietPolls)
|
|
85
|
+
return 'error';
|
|
86
|
+
if (!snapshot.viewDetail && snapshot.readyState === 'complete' && baselineUrl !== undefined && runtimePath(snapshot.href) !== runtimePath(baselineUrl) && quiet >= redirectQuietPolls)
|
|
87
|
+
return 'redirected';
|
|
88
|
+
return undefined;
|
|
89
|
+
}
|
|
90
|
+
/** Hata mesajı için: bütçe dolduğunda sayfada NE görüldü. */
|
|
91
|
+
export function describeUnready(readiness, apiNote) {
|
|
92
|
+
const snapshot = readiness.snapshot;
|
|
93
|
+
const suffix = apiNote === undefined ? '' : ` · ${apiNote}`;
|
|
94
|
+
if (!snapshot)
|
|
95
|
+
return `tarayıcı sayfayı hiç değerlendiremedi (sürekli yönlendirme ya da bağlam düştü)${suffix}`;
|
|
96
|
+
if (snapshot.skeleton)
|
|
97
|
+
return `sayfa hâlâ yükleme iskeletinde${suffix}`;
|
|
98
|
+
if (snapshot.activity && snapshot.activity.running > 0)
|
|
99
|
+
return `${snapshot.activity.running} akış hâlâ koşuyor (${snapshot.activity.completed} bitti)${suffix}`;
|
|
100
|
+
if (snapshot.runtimeNodes === 0)
|
|
101
|
+
return `runtime hiç render olmadı — data-element-id taşıyan düğüm yok${snapshot.viewDetail ? '' : ', .view-detail kabı da yok'}${suffix}`;
|
|
102
|
+
return `sayfa durulmadı (${snapshot.runtimeNodes} düğüm, sayaç ${snapshot.activity ? `${snapshot.activity.running} koşan / ${snapshot.activity.completed} biten` : 'yok'})${suffix}`;
|
|
103
|
+
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NE GÖRÜNÜYOR — resimsiz (S-5). Aynı sayfa yüklemesinden çıkan üçüncü çıktı: her KÖK runtime
|
|
3
|
+
* düğümünün görünürlüğü, metni, satır sayısı, açık sekmesi, değeri ve hata metinleri.
|
|
4
|
+
*
|
|
5
|
+
* Kök düğüm = kimliğinde `__` OLMAYAN düğüm; iç roller (`tbl__row-3`) satır sayısına dönüşür,
|
|
6
|
+
* listeye girmez. Tavan 300 düğüm, metin 80 karakter (K3) — özet bir kareyi değiştirmeli, onun
|
|
7
|
+
* kadar pahalı olmamalı. Tip `data-component-type`'tan gelir (frontend f-02); runtime basmıyorsa
|
|
8
|
+
* alan YAZILMAZ ve `typed: false` döner — `layoutReportUnavailable` ile aynı dürüstlük kuralı.
|
|
9
|
+
*/
|
|
10
|
+
export function domSummaryScript(viewportHeight) {
|
|
11
|
+
return `(function () { /* domSummary */
|
|
12
|
+
var MAX = 300;
|
|
13
|
+
var CUT = 80;
|
|
14
|
+
// Görünür alanın GERÇEK boyu: fullPage ve clip yolları viewport'u içerik boyuna büyütür ve
|
|
15
|
+
// o anda window.innerHeight = içerik yüksekliği olur — her düğüm "ekran içinde" görünürdü ve
|
|
16
|
+
// "kart katlanmanın altında mı" sorusu HER ZAMAN 'visible' cevabı alırdı (B-10).
|
|
17
|
+
var VH = ${Math.max(Math.round(viewportHeight), 1)};
|
|
18
|
+
var clean = function (value) { return String(value || '').replace(/\\s+/g, ' ').trim(); };
|
|
19
|
+
// Mobil sekme çubuğu '__tabs' bir KÖK satırdır (öğeleri '__tabs__item-<slug>' iç roldür, K14);
|
|
20
|
+
// web runtime bu kimliği hiç basmaz.
|
|
21
|
+
var ROOT_SELECTOR = '[data-element-id]:not([data-element-id*="__"]), [data-element-id="__tabs"]';
|
|
22
|
+
var isRoot = function (element) { var id = String(element.getAttribute('data-element-id') || ''); return id.indexOf('__') < 0 || id === '__tabs'; };
|
|
23
|
+
var all = Array.prototype.slice.call(document.querySelectorAll('[data-element-id]'));
|
|
24
|
+
var roots = all.filter(isRoot);
|
|
25
|
+
var typed = false;
|
|
26
|
+
var nodes = roots.slice(0, MAX).map(function (node) {
|
|
27
|
+
var id = node.getAttribute('data-element-id');
|
|
28
|
+
var type = node.getAttribute('data-component-type');
|
|
29
|
+
if (type) typed = true;
|
|
30
|
+
// Bir olgu, ONU TAŞIYAN düğüme yazılır: en yakın kök ata bu düğüm değilse o olgu
|
|
31
|
+
// çocuğundur ve orada zaten listelenecektir (B-8). Aksi hâlde aynı değer üç satırda çıkar.
|
|
32
|
+
var owned = function (element) { return !!element && element.closest(ROOT_SELECTOR) === node; };
|
|
33
|
+
var rect = node.getBoundingClientRect();
|
|
34
|
+
var visible = typeof node.checkVisibility === 'function'
|
|
35
|
+
? !!node.checkVisibility({ checkVisibilityCSS: true, checkOpacity: true })
|
|
36
|
+
: (rect.width > 0 && rect.height > 0);
|
|
37
|
+
var inViewport = rect.bottom > 0 && rect.right > 0 && rect.top < VH && rect.left < (window.innerWidth || 0);
|
|
38
|
+
// Kap düğümün innerText'i ÇOCUKLARININ metnidir; metin yalnız YAPRAK köklerde yazılır.
|
|
39
|
+
var nested = Array.prototype.slice.call(node.querySelectorAll('[data-element-id]'))
|
|
40
|
+
.some(isRoot);
|
|
41
|
+
var text = nested ? '' : clean(node.innerText);
|
|
42
|
+
if (text.length > CUT) text = text.slice(0, CUT) + '…';
|
|
43
|
+
var rows = document.querySelectorAll('[data-element-id^="' + id + '__row-"]').length;
|
|
44
|
+
var tab = node.querySelector('[role="tab"][aria-selected="true"]');
|
|
45
|
+
var field = node.querySelector('input, select, textarea');
|
|
46
|
+
var chosen = node.querySelector('.selected-item');
|
|
47
|
+
var holder = field || chosen;
|
|
48
|
+
var value = !owned(holder) ? '' : (field ? (field.type === 'password' ? '***' : clean(field.value)) : clean(chosen.textContent));
|
|
49
|
+
var media = node.querySelector('img, svg, canvas, video, iframe');
|
|
50
|
+
// İç içe <li> hem grubu hem alt mesajları sayıyordu: tek grup + 2 alt hata 3 görünüyordu (B-7).
|
|
51
|
+
var errorItems = Array.prototype.slice.call(node.querySelectorAll('.form-validation-errors li:not(:has(li))'))
|
|
52
|
+
.filter(owned).map(function (item) { return clean(item.textContent); });
|
|
53
|
+
// aria-invalid hem köke hem input'a yazılabiliyor (Password.svelte); yalnız ALANLAR sayılır.
|
|
54
|
+
var invalid = Array.prototype.slice.call(node.querySelectorAll('input[aria-invalid="true"], select[aria-invalid="true"], textarea[aria-invalid="true"]')).filter(owned).length;
|
|
55
|
+
var summary = { elementId: id, visible: !!visible, inViewport: !!inViewport };
|
|
56
|
+
if (type) summary.type = type;
|
|
57
|
+
if (text) summary.text = text;
|
|
58
|
+
if (rows > 0) summary.rows = rows;
|
|
59
|
+
if (owned(tab)) summary.activeTab = clean(tab.textContent);
|
|
60
|
+
if (value) summary.value = value;
|
|
61
|
+
if (visible && !text && !media && !nested) summary.empty = true;
|
|
62
|
+
if (errorItems.length > 0) summary.errors = errorItems;
|
|
63
|
+
else if (invalid > 0) summary.errors = ['aria-invalid: ' + invalid];
|
|
64
|
+
return summary;
|
|
65
|
+
});
|
|
66
|
+
var messages = [];
|
|
67
|
+
Array.prototype.slice.call(document.querySelectorAll('.ng-toast')).forEach(function (toast) {
|
|
68
|
+
var name = String(toast.className || '');
|
|
69
|
+
var kind = name.indexOf('ng-toast--error') >= 0 ? 'toast/error' : (name.indexOf('ng-toast--success') >= 0 ? 'toast/success' : 'toast');
|
|
70
|
+
messages.push({ kind: kind, text: clean(toast.innerText).slice(0, 160) });
|
|
71
|
+
});
|
|
72
|
+
Array.prototype.slice.call(document.querySelectorAll('.view-detail__error, .error-page')).forEach(function (node) {
|
|
73
|
+
messages.push({ kind: 'error', text: clean(node.innerText).slice(0, 160) });
|
|
74
|
+
});
|
|
75
|
+
return { nodes: nodes, messages: messages, truncated: roots.length > MAX, typed: typed };
|
|
76
|
+
})()`;
|
|
77
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mobil uygulama: `@ng-apps/ui-native` `NativeRuntime`, Studio'da react-native-web ile çizilir
|
|
3
|
+
* (plans/mobil-uygulama-expo F5). Ağaçta `<form>` yoktur — `submit` runtime'ın yayımladığı köprüyle
|
|
4
|
+
* form düğümünün `submit` olayını makineye iletir (`web-runtime-host.tsx` `__ngAppsSubmitForm`).
|
|
5
|
+
* Sekme çubuğu `__tabs`, öğeleri `__tabs__item-<sayfa slug'ı>` kimliğini taşır (K14). Açılır
|
|
6
|
+
* listenin tetikleyicisi `role="combobox"`, seçenekleri `role="option"` + `data-value` taşır ve liste
|
|
7
|
+
* `Modal` katmanında açılır (`ng-apps-ui-native` `dropdown`).
|
|
8
|
+
*/
|
|
9
|
+
export const studioMobileTarget = Object.freeze({
|
|
10
|
+
name: 'studio-mobile',
|
|
11
|
+
submitBridge: '__ngAppsSubmitForm',
|
|
12
|
+
optionSelector: '[role="option"][data-value], [role="treeitem"][data-value]',
|
|
13
|
+
optionsOutsideNode: true,
|
|
14
|
+
platformNote: 'Mobil uygulama: kare Studio\'daki react-native-web çizimidir (/dev|/view) — cihazdaki native çizimle yapısal olarak (düğüm, sıra, ölçü modu, renk) aynı, piksel olarak değil.'
|
|
15
|
+
});
|
|
@@ -5,8 +5,9 @@ const MAX_NOTES = 8;
|
|
|
5
5
|
const MAX_NOTE_CHARS = 240;
|
|
6
6
|
const MAX_DROPS = 5;
|
|
7
7
|
export const diagnosticsParam = z.enum(['compact', 'full']).optional().describe("Yanıttaki gatewayNormalized / silentlyDropped listelerinin boyu. compact (varsayılan): aynı not tekilleşir, uzun not kısalır (en fazla 8); aynı yolun düşmeleri tek satırda sayıyla toplanır (en fazla 5 grup); droppedCount her zaman tam sayıdır. full: listelerin tamamı.");
|
|
8
|
-
|
|
9
|
-
|
|
8
|
+
/** `adjustable`: tool `diagnostics` parametresini alıyor mu — kısaltma notu yalnız alan tool'a onu önerir (g-08). */
|
|
9
|
+
export function runWithDiagnostics(mode, run, adjustable = true) {
|
|
10
|
+
return activeMode.run({ mode, adjustable }, run);
|
|
10
11
|
}
|
|
11
12
|
/**
|
|
12
13
|
* Tanılama listeleri her yazma çağrısında yanıta girer ve aynı gerekçe cümlesi çağrı başına tekrar
|
|
@@ -18,7 +19,7 @@ export function runWithDiagnostics(mode, run) {
|
|
|
18
19
|
* listeyi görür; kısaltma yalnız `diagnostics` parametresini taşıyan yazma tool'larında devreye girer.
|
|
19
20
|
*/
|
|
20
21
|
export function compactDiagnostics(payload) {
|
|
21
|
-
if (activeMode.getStore() !== 'compact')
|
|
22
|
+
if (activeMode.getStore()?.mode !== 'compact')
|
|
22
23
|
return payload;
|
|
23
24
|
if (!payload || typeof payload !== 'object' || Array.isArray(payload))
|
|
24
25
|
return payload;
|
|
@@ -58,7 +59,12 @@ export function compactDiagnostics(payload) {
|
|
|
58
59
|
}
|
|
59
60
|
if (hidden.length === 0)
|
|
60
61
|
return result;
|
|
61
|
-
return {
|
|
62
|
+
return {
|
|
63
|
+
...result,
|
|
64
|
+
diagnosticsNote: activeMode.getStore()?.adjustable === false
|
|
65
|
+
? 'Kısaltıldı; tam liste gateway günlüğünde (bu tool diagnostics parametresi almaz).'
|
|
66
|
+
: "Kısaltıldı; yazmayı tekrarlamayın. Tam liste: sonraki çağrıda diagnostics:'full'."
|
|
67
|
+
};
|
|
62
68
|
}
|
|
63
69
|
/**
|
|
64
70
|
* Aynı yolun farklı öğelerindeki düşmeler (`selectFields[fieldId=a].path`, `selectFields[fieldId=b].path`, …)
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
* (card) · GİZLİ" 200 karakterdir.
|
|
8
8
|
*
|
|
9
9
|
* Katman saftır: tarayıcıdan gelen anlık görüntüyü doğrular ve biçimler. Toplama işi
|
|
10
|
-
* `
|
|
10
|
+
* `capture/summary.ts` `domSummaryScript`'te, sunum `pages.ts`'te.
|
|
11
11
|
*/
|
|
12
12
|
function text(value) {
|
|
13
13
|
return typeof value === 'string' && value.length > 0 ? value : undefined;
|