@beehexa/hexasync-template-engine 2608.21.2 → 2610.3.1
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/dist/capabilityPolicy.d.ts +29 -0
- package/dist/capabilityPolicy.d.ts.map +1 -0
- package/dist/capabilityPolicy.js +46 -0
- package/dist/capabilityPolicy.js.map +1 -0
- package/dist/compositeFlow.d.ts +23 -0
- package/dist/compositeFlow.d.ts.map +1 -0
- package/dist/compositeFlow.js +350 -0
- package/dist/compositeFlow.js.map +1 -0
- package/dist/connectionEditing.d.ts +124 -0
- package/dist/connectionEditing.d.ts.map +1 -0
- package/dist/connectionEditing.js +122 -0
- package/dist/connectionEditing.js.map +1 -0
- package/dist/editDiagnostics.d.ts +80 -0
- package/dist/editDiagnostics.d.ts.map +1 -0
- package/dist/editDiagnostics.js +130 -0
- package/dist/editDiagnostics.js.map +1 -0
- package/dist/extensionRegistry.d.ts +31 -0
- package/dist/extensionRegistry.d.ts.map +1 -0
- package/dist/extensionRegistry.js +48 -0
- package/dist/extensionRegistry.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -1
- package/dist/layout.d.ts +414 -0
- package/dist/layout.d.ts.map +1 -0
- package/dist/layout.js +460 -0
- package/dist/layout.js.map +1 -0
- package/dist/nodeExtensions.d.ts +17 -0
- package/dist/nodeExtensions.d.ts.map +1 -0
- package/dist/nodeExtensions.js +39 -0
- package/dist/nodeExtensions.js.map +1 -0
- package/dist/nodeResolution.d.ts +29 -0
- package/dist/nodeResolution.d.ts.map +1 -0
- package/dist/nodeResolution.js +77 -0
- package/dist/nodeResolution.js.map +1 -0
- package/dist/presentationOverlay.d.ts +29 -0
- package/dist/presentationOverlay.d.ts.map +1 -0
- package/dist/presentationOverlay.js +128 -0
- package/dist/presentationOverlay.js.map +1 -0
- package/dist/presentationReconciliation.d.ts +59 -0
- package/dist/presentationReconciliation.d.ts.map +1 -0
- package/dist/presentationReconciliation.js +54 -0
- package/dist/presentationReconciliation.js.map +1 -0
- package/dist/presentationStorage.d.ts +168 -0
- package/dist/presentationStorage.d.ts.map +1 -0
- package/dist/presentationStorage.js +405 -0
- package/dist/presentationStorage.js.map +1 -0
- package/dist/semanticTransactions.d.ts +107 -0
- package/dist/semanticTransactions.d.ts.map +1 -0
- package/dist/semanticTransactions.js +86 -0
- package/dist/semanticTransactions.js.map +1 -0
- package/dist/stepFormEditing.d.ts +47 -0
- package/dist/stepFormEditing.d.ts.map +1 -0
- package/dist/stepFormEditing.js +259 -0
- package/dist/stepFormEditing.js.map +1 -0
- package/dist/themeStyles.d.ts +26 -0
- package/dist/themeStyles.d.ts.map +1 -0
- package/dist/themeStyles.js +71 -0
- package/dist/themeStyles.js.map +1 -0
- package/dist/visualResources.d.ts +30 -0
- package/dist/visualResources.d.ts.map +1 -0
- package/dist/visualResources.js +89 -0
- package/dist/visualResources.js.map +1 -0
- package/dist/vnextFlow.d.ts +57 -0
- package/dist/vnextFlow.d.ts.map +1 -0
- package/dist/vnextFlow.js +333 -0
- package/dist/vnextFlow.js.map +1 -0
- package/package.json +16 -12
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
const CORE = new Set(['task', 'decision', 'start', 'end', 'exception', 'event', 'subprocess', 'unknown']);
|
|
2
|
+
const geometry = (id, width, height, definition) => ({
|
|
3
|
+
kind: definition && typeof definition === 'object' ? definition.kind ?? id : id,
|
|
4
|
+
width, height,
|
|
5
|
+
perimeter: { kind: id === 'decision' ? 'diamond' : id === 'start' || id === 'end' || id === 'event' ? 'ellipse' : 'rectangle', width, height },
|
|
6
|
+
hitTest: { kind: 'shape', bounds: { x: 0, y: 0, width, height } },
|
|
7
|
+
focus: { kind: 'outline', inset: 2 }, fallback: { kind: 'rectangle' },
|
|
8
|
+
...(definition && typeof definition === 'object' ? { definition } : {}),
|
|
9
|
+
});
|
|
10
|
+
const diagnostic = (code, extensionId) => ({ severity: 'error', code, extensionId, message: `Extension '${extensionId}' is not registered.` });
|
|
11
|
+
const componentFallback = (value) => { const row = value && typeof value === 'object' ? value : {}; return { kind: 'text', accessibleName: typeof row.accessibleName === 'string' ? row.accessibleName : 'Unavailable component', text: typeof row.text === 'string' ? row.text : 'Unavailable component' }; };
|
|
12
|
+
const formFallback = (value) => { const row = value && typeof value === 'object' ? value : {}; return { kind: 'inspection', accessibleName: typeof row.accessibleName === 'string' ? row.accessibleName : 'Unavailable form', fields: Array.isArray(row.fields) ? row.fields.filter(field => typeof field === 'string') : [] }; };
|
|
13
|
+
export function resolveShape(id, options) {
|
|
14
|
+
if (CORE.has(id))
|
|
15
|
+
return { status: 'resolved', id, geometry: geometry(id, options.width, options.height), diagnostics: [] };
|
|
16
|
+
const registered = options.registry?.resolve('shape', id);
|
|
17
|
+
if (registered !== undefined)
|
|
18
|
+
return { status: 'resolved', id, geometry: geometry(id, options.width, options.height, registered), diagnostics: [] };
|
|
19
|
+
return { status: 'resolved-with-fallback', id: 'unknown', geometry: geometry('unknown', options.width, options.height), diagnostics: [diagnostic('SHAPE_REGISTRY_REF_MISSING', id)] };
|
|
20
|
+
}
|
|
21
|
+
export function resolveComponent(id, options) {
|
|
22
|
+
const registration = options.registry.resolve('component', id);
|
|
23
|
+
if (!registration)
|
|
24
|
+
return { status: 'fallback', content: { kind: 'text', accessibleName: 'Unavailable component', text: 'Unavailable component' }, diagnostics: [diagnostic('COMPONENT_REGISTRY_REF_MISSING', id)] };
|
|
25
|
+
if (registration.renderer === options.renderer)
|
|
26
|
+
return { status: 'resolved', content: registration, diagnostics: [] };
|
|
27
|
+
const fallback = registration.fallback;
|
|
28
|
+
return { status: 'fallback', content: componentFallback(fallback), diagnostics: [] };
|
|
29
|
+
}
|
|
30
|
+
export function resolveForm(id, options) {
|
|
31
|
+
const registration = options.registry.resolve('form', id);
|
|
32
|
+
if (!registration)
|
|
33
|
+
return { status: 'fallback', form: { kind: 'inspection', accessibleName: 'Unavailable form', fields: [] }, diagnostics: [diagnostic('FORM_REGISTRY_REF_MISSING', id)] };
|
|
34
|
+
if (registration.renderer === options.renderer)
|
|
35
|
+
return { status: 'resolved', form: registration, diagnostics: [] };
|
|
36
|
+
const fallback = registration.fallback;
|
|
37
|
+
return { status: 'fallback', form: formFallback(fallback), diagnostics: [] };
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=nodeExtensions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nodeExtensions.js","sourceRoot":"","sources":["../src/nodeExtensions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export interface ResolutionDiagnostic {
|
|
2
|
+
readonly severity: 'error';
|
|
3
|
+
readonly code: 'INVALID_RESOLUTION_DEFINITION' | 'RESOLVER_NOT_REGISTERED' | 'RESOLVER_EXECUTION_FAILED' | 'EXPRESSION_TIMEOUT' | 'EXPRESSION_OUTPUT_LIMIT';
|
|
4
|
+
readonly resolverId?: string;
|
|
5
|
+
readonly message: string;
|
|
6
|
+
}
|
|
7
|
+
export type ResolutionResult = {
|
|
8
|
+
readonly status: 'resolved';
|
|
9
|
+
readonly value: unknown;
|
|
10
|
+
readonly diagnostics: readonly ResolutionDiagnostic[];
|
|
11
|
+
} | {
|
|
12
|
+
readonly status: 'unresolved';
|
|
13
|
+
readonly diagnostics: readonly ResolutionDiagnostic[];
|
|
14
|
+
};
|
|
15
|
+
export interface ResolutionLimits {
|
|
16
|
+
readonly maxDepth: number;
|
|
17
|
+
readonly maxContextBytes: number;
|
|
18
|
+
readonly maxOutputBytes: number;
|
|
19
|
+
readonly timeoutMs: number;
|
|
20
|
+
}
|
|
21
|
+
export interface ResolutionOptions {
|
|
22
|
+
readonly functions?: Readonly<Record<string, (context: Readonly<Record<string, unknown>>) => unknown | Promise<unknown>>>;
|
|
23
|
+
readonly expressionProviders?: Readonly<Record<string, {
|
|
24
|
+
readonly evaluate: (request: Readonly<Record<string, unknown>>) => unknown | Promise<unknown>;
|
|
25
|
+
}>>;
|
|
26
|
+
readonly limits?: Partial<ResolutionLimits>;
|
|
27
|
+
}
|
|
28
|
+
export declare function resolveNodeValue(definition: Readonly<Record<string, unknown>>, context: Readonly<Record<string, unknown>>, options?: ResolutionOptions): Promise<ResolutionResult>;
|
|
29
|
+
//# sourceMappingURL=nodeResolution.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nodeResolution.d.ts","sourceRoot":"","sources":["../src/nodeResolution.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,oBAAoB;IAAG,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,+BAA+B,GAAG,yBAAyB,GAAG,2BAA2B,GAAG,oBAAoB,GAAG,yBAAyB,CAAC;IAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE;AACzR,MAAM,MAAM,gBAAgB,GAAG;IAAE,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,WAAW,EAAE,SAAS,oBAAoB,EAAE,CAAA;CAAE,GAAG;IAAE,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAAC,QAAQ,CAAC,WAAW,EAAE,SAAS,oBAAoB,EAAE,CAAA;CAAE,CAAC;AAC1O,MAAM,WAAW,gBAAgB;IAAG,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAAE;AAC9J,MAAM,WAAW,iBAAiB;IAAG,QAAQ,CAAC,SAAS,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE;QAAE,QAAQ,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;KAAE,CAAC,CAAC,CAAC;IAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAA;CAAE;AAczW,wBAAsB,gBAAgB,CAAC,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EAAE,OAAO,GAAE,iBAAsB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAa5L"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
const DEFAULT_LIMITS = { maxDepth: 8, maxContextBytes: 64_000, maxOutputBytes: 16_000, timeoutMs: 100 };
|
|
2
|
+
const bytes = (value) => new TextEncoder().encode(JSON.stringify(value) ?? 'null').length;
|
|
3
|
+
const bound = (value, depth, maxDepth) => {
|
|
4
|
+
if (depth >= maxDepth || value === null || typeof value !== 'object')
|
|
5
|
+
return depth >= maxDepth && typeof value === 'object' ? undefined : value;
|
|
6
|
+
if (Array.isArray(value))
|
|
7
|
+
return value.map(item => bound(item, depth + 1, maxDepth)).filter(item => item !== undefined);
|
|
8
|
+
const result = {};
|
|
9
|
+
for (const [key, child] of Object.entries(value)) {
|
|
10
|
+
const next = bound(child, depth + 1, maxDepth);
|
|
11
|
+
if (next !== undefined)
|
|
12
|
+
result[key] = next;
|
|
13
|
+
}
|
|
14
|
+
return result;
|
|
15
|
+
};
|
|
16
|
+
const boundedContext = (context, limits) => {
|
|
17
|
+
const candidate = bound(context, 0, limits.maxDepth);
|
|
18
|
+
if (bytes(candidate) <= limits.maxContextBytes)
|
|
19
|
+
return candidate;
|
|
20
|
+
const result = {};
|
|
21
|
+
for (const [key, value] of Object.entries(candidate)) {
|
|
22
|
+
result[key] = value;
|
|
23
|
+
if (bytes(result) > limits.maxContextBytes)
|
|
24
|
+
delete result[key];
|
|
25
|
+
}
|
|
26
|
+
return result;
|
|
27
|
+
};
|
|
28
|
+
const unresolved = (code, message, resolverId) => ({ status: 'unresolved', diagnostics: [{ severity: 'error', code, message, ...(resolverId === undefined ? {} : { resolverId }) }] });
|
|
29
|
+
export async function resolveNodeValue(definition, context, options = {}) {
|
|
30
|
+
if (definition.kind === 'literal')
|
|
31
|
+
return { status: 'resolved', value: definition.value, diagnostics: [] };
|
|
32
|
+
if (definition.kind === 'fields' && Array.isArray(definition.fields)) {
|
|
33
|
+
for (const field of definition.fields)
|
|
34
|
+
if (typeof field === 'string' && context[field] !== undefined && context[field] !== null)
|
|
35
|
+
return { status: 'resolved', value: context[field], diagnostics: [] };
|
|
36
|
+
return { status: 'resolved', value: definition.fallback, diagnostics: [] };
|
|
37
|
+
}
|
|
38
|
+
if (definition.kind === 'function') {
|
|
39
|
+
const id = typeof definition.ref === 'string' ? definition.ref : '';
|
|
40
|
+
const resolver = options.functions?.[id];
|
|
41
|
+
if (!resolver)
|
|
42
|
+
return unresolved('RESOLVER_NOT_REGISTERED', `Registered function '${id}' was not found.`, id);
|
|
43
|
+
try {
|
|
44
|
+
return { status: 'resolved', value: await resolver(context), diagnostics: [] };
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
return unresolved('RESOLVER_EXECUTION_FAILED', `Registered function '${id}' failed.`, id);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
if (definition.kind === 'expression') {
|
|
51
|
+
const id = typeof definition.provider === 'string' ? definition.provider : '';
|
|
52
|
+
const provider = options.expressionProviders?.[id];
|
|
53
|
+
if (!provider)
|
|
54
|
+
return unresolved('RESOLVER_NOT_REGISTERED', `Expression provider '${id}' was not found.`, id);
|
|
55
|
+
const limits = { ...DEFAULT_LIMITS, ...options.limits };
|
|
56
|
+
if (Object.values(limits).some(value => !Number.isFinite(value) || value <= 0))
|
|
57
|
+
return unresolved('INVALID_RESOLUTION_DEFINITION', 'Expression limits must be positive finite numbers.', id);
|
|
58
|
+
const controller = new AbortController();
|
|
59
|
+
let timer;
|
|
60
|
+
try {
|
|
61
|
+
const timeout = new Promise((_, reject) => { timer = setTimeout(() => { controller.abort(); reject(new Error('timeout')); }, limits.timeoutMs); });
|
|
62
|
+
const value = await Promise.race([provider.evaluate({ source: definition.source, context: boundedContext(context, limits), limits, signal: controller.signal }), timeout]);
|
|
63
|
+
if (bytes(value) > limits.maxOutputBytes)
|
|
64
|
+
return unresolved('EXPRESSION_OUTPUT_LIMIT', `Expression provider '${id}' exceeded its output budget.`, id);
|
|
65
|
+
return { status: 'resolved', value, diagnostics: [] };
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
return controller.signal.aborted ? unresolved('EXPRESSION_TIMEOUT', `Expression provider '${id}' exceeded its deadline.`, id) : unresolved('RESOLVER_EXECUTION_FAILED', `Expression provider '${id}' failed.`, id);
|
|
69
|
+
}
|
|
70
|
+
finally {
|
|
71
|
+
if (timer !== undefined)
|
|
72
|
+
clearTimeout(timer);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return unresolved('INVALID_RESOLUTION_DEFINITION', 'Node resolution definition is invalid.');
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=nodeResolution.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nodeResolution.js","sourceRoot":"","sources":["../src/nodeResolution.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export type PresentationJson = null | boolean | number | string | readonly PresentationJson[] | PresentationJsonObject;
|
|
2
|
+
export interface PresentationJsonObject {
|
|
3
|
+
readonly [key: string]: PresentationJson;
|
|
4
|
+
}
|
|
5
|
+
export interface PresentationState {
|
|
6
|
+
readonly viewport?: PresentationJsonObject;
|
|
7
|
+
readonly theme?: PresentationJson;
|
|
8
|
+
readonly nodes: Readonly<Record<string, PresentationJsonObject>>;
|
|
9
|
+
readonly ports: Readonly<Record<string, PresentationJsonObject>>;
|
|
10
|
+
readonly edges: Readonly<Record<string, PresentationJsonObject>>;
|
|
11
|
+
}
|
|
12
|
+
export interface SerializePresentationOverlayInput {
|
|
13
|
+
readonly sourceText: string;
|
|
14
|
+
readonly sourceFingerprint: string;
|
|
15
|
+
readonly schemaVersion: number;
|
|
16
|
+
readonly canonicalKeys: Readonly<Record<string, string>>;
|
|
17
|
+
readonly defaults: PresentationState;
|
|
18
|
+
readonly presentation: PresentationState;
|
|
19
|
+
}
|
|
20
|
+
export interface SerializedPresentationOverlay extends PresentationJsonObject {
|
|
21
|
+
readonly schemaVersion: number;
|
|
22
|
+
readonly sourceFingerprint: string;
|
|
23
|
+
readonly nodes: Readonly<Record<string, PresentationJsonObject>>;
|
|
24
|
+
readonly ports: Readonly<Record<string, PresentationJsonObject>>;
|
|
25
|
+
readonly edges: Readonly<Record<string, PresentationJsonObject>>;
|
|
26
|
+
}
|
|
27
|
+
/** Serializes presentation-only deltas without modifying the workflow source or caller-owned values. */
|
|
28
|
+
export declare function serializePresentationOverlay(input: SerializePresentationOverlayInput): SerializedPresentationOverlay;
|
|
29
|
+
//# sourceMappingURL=presentationOverlay.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"presentationOverlay.d.ts","sourceRoot":"","sources":["../src/presentationOverlay.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,gBAAgB,GAAG,IAAI,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,gBAAgB,EAAE,GAAG,sBAAsB,CAAC;AACvH,MAAM,WAAW,sBAAsB;IAAG,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,gBAAgB,CAAA;CAAE;AAEpF,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,QAAQ,CAAC,EAAE,sBAAsB,CAAC;IAC3C,QAAQ,CAAC,KAAK,CAAC,EAAE,gBAAgB,CAAC;IAClC,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC,CAAC;IACjE,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC,CAAC;IACjE,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC,CAAC;CAClE;AAED,MAAM,WAAW,iCAAiC;IAChD,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,aAAa,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACzD,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,CAAC;IACrC,QAAQ,CAAC,YAAY,EAAE,iBAAiB,CAAC;CAC1C;AAED,MAAM,WAAW,6BAA8B,SAAQ,sBAAsB;IAC3E,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC,CAAC;IACjE,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC,CAAC;IACjE,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC,CAAC;CAClE;AA6DD,wGAAwG;AACxG,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,iCAAiC,GAAG,6BAA6B,CAoDpH"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
const isObject = (value) => value !== null && typeof value === 'object' && !Array.isArray(value);
|
|
2
|
+
const validateJson = (value, path, ancestors = new WeakSet()) => {
|
|
3
|
+
if (value === null || typeof value === 'string' || typeof value === 'boolean')
|
|
4
|
+
return;
|
|
5
|
+
if (typeof value === 'number') {
|
|
6
|
+
if (!Number.isFinite(value))
|
|
7
|
+
throw new TypeError(`${path} must contain only finite numbers.`);
|
|
8
|
+
return;
|
|
9
|
+
}
|
|
10
|
+
if (typeof value !== 'object')
|
|
11
|
+
throw new TypeError(`${path} must be JSON-serializable.`);
|
|
12
|
+
if (ancestors.has(value))
|
|
13
|
+
throw new TypeError(`${path} must not contain cyclic references.`);
|
|
14
|
+
if (!Array.isArray(value) && ![Object.prototype, null].includes(Object.getPrototypeOf(value))) {
|
|
15
|
+
throw new TypeError(`${path} must contain only plain objects and arrays.`);
|
|
16
|
+
}
|
|
17
|
+
ancestors.add(value);
|
|
18
|
+
if (Array.isArray(value))
|
|
19
|
+
value.forEach((item, index) => validateJson(item, `${path}[${index}]`, ancestors));
|
|
20
|
+
else
|
|
21
|
+
Object.keys(value).sort().forEach(key => validateJson(value[key], `${path}.${key}`, ancestors));
|
|
22
|
+
ancestors.delete(value);
|
|
23
|
+
};
|
|
24
|
+
const equal = (left, right) => {
|
|
25
|
+
if (left === right)
|
|
26
|
+
return true;
|
|
27
|
+
if (Array.isArray(left) || Array.isArray(right)) {
|
|
28
|
+
return Array.isArray(left) && Array.isArray(right) && left.length === right.length && left.every((item, index) => equal(item, right[index]));
|
|
29
|
+
}
|
|
30
|
+
if (!isObject(left) || !isObject(right))
|
|
31
|
+
return false;
|
|
32
|
+
const leftKeys = Object.keys(left).sort();
|
|
33
|
+
const rightKeys = Object.keys(right).sort();
|
|
34
|
+
return leftKeys.length === rightKeys.length && leftKeys.every((key, index) => key === rightKeys[index] && equal(left[key], right[key]));
|
|
35
|
+
};
|
|
36
|
+
const clone = (value) => {
|
|
37
|
+
if (Array.isArray(value))
|
|
38
|
+
return Object.freeze(value.map(clone));
|
|
39
|
+
if (isObject(value))
|
|
40
|
+
return Object.freeze(Object.fromEntries(Object.keys(value).sort().map(key => [key, clone(value[key])])));
|
|
41
|
+
return value;
|
|
42
|
+
};
|
|
43
|
+
const delta = (value, defaultValue) => {
|
|
44
|
+
if (equal(value, defaultValue))
|
|
45
|
+
return undefined;
|
|
46
|
+
if (!isObject(value) || !isObject(defaultValue))
|
|
47
|
+
return clone(value);
|
|
48
|
+
const entries = Object.keys(value).sort().flatMap(key => {
|
|
49
|
+
const child = delta(value[key], defaultValue[key]);
|
|
50
|
+
return child === undefined ? [] : [[key, child]];
|
|
51
|
+
});
|
|
52
|
+
return entries.length === 0 ? undefined : Object.freeze(Object.fromEntries(entries));
|
|
53
|
+
};
|
|
54
|
+
const elementDeltas = (values, defaults, canonicalIdentities, label) => Object.freeze(Object.fromEntries(Object.keys(values).sort().flatMap(identity => {
|
|
55
|
+
if (!identity.trim() || !canonicalIdentities.has(identity))
|
|
56
|
+
throw new Error(`${label} key '${identity}' is not a declared canonical identity.`);
|
|
57
|
+
if (!isObject(values[identity]))
|
|
58
|
+
throw new TypeError('Presentation element values must be objects.');
|
|
59
|
+
const value = delta(values[identity], defaults[identity]);
|
|
60
|
+
return value === undefined ? [] : [[identity, value]];
|
|
61
|
+
})));
|
|
62
|
+
/** Serializes presentation-only deltas without modifying the workflow source or caller-owned values. */
|
|
63
|
+
export function serializePresentationOverlay(input) {
|
|
64
|
+
if (typeof input.sourceText !== 'string')
|
|
65
|
+
throw new TypeError('sourceText must be a string.');
|
|
66
|
+
if (typeof input.sourceFingerprint !== 'string' || !input.sourceFingerprint.trim())
|
|
67
|
+
throw new TypeError('sourceFingerprint must be a non-blank string.');
|
|
68
|
+
if (!Number.isSafeInteger(input.schemaVersion) || input.schemaVersion < 1)
|
|
69
|
+
throw new RangeError('schemaVersion must be a positive safe integer.');
|
|
70
|
+
validateJson(input.canonicalKeys, 'canonicalKeys');
|
|
71
|
+
validateJson(input.defaults, 'defaults');
|
|
72
|
+
validateJson(input.presentation, 'presentation');
|
|
73
|
+
if (!isObject(input.canonicalKeys))
|
|
74
|
+
throw new TypeError('canonicalKeys must be an object.');
|
|
75
|
+
for (const [name, identity] of Object.entries(input.canonicalKeys)) {
|
|
76
|
+
if (!name.trim() || typeof identity !== 'string')
|
|
77
|
+
throw new TypeError('canonicalKeys must map non-blank names to string identities.');
|
|
78
|
+
}
|
|
79
|
+
for (const state of [input.defaults, input.presentation]) {
|
|
80
|
+
const unsupported = Object.keys(state).find(key => !['viewport', 'theme', 'nodes', 'ports', 'edges'].includes(key));
|
|
81
|
+
if (unsupported !== undefined)
|
|
82
|
+
throw new Error('Presentation state contains an unsupported field.');
|
|
83
|
+
}
|
|
84
|
+
for (const section of ['nodes', 'ports', 'edges']) {
|
|
85
|
+
if (!isObject(input.defaults[section]) || !isObject(input.presentation[section]))
|
|
86
|
+
throw new TypeError(`${section} must be an object.`);
|
|
87
|
+
for (const value of Object.values(input.defaults[section]))
|
|
88
|
+
if (!isObject(value))
|
|
89
|
+
throw new TypeError(`Default ${section} values must be objects.`);
|
|
90
|
+
}
|
|
91
|
+
if (input.defaults.viewport !== undefined && !isObject(input.defaults.viewport))
|
|
92
|
+
throw new TypeError('Default viewport must be an object.');
|
|
93
|
+
if (input.presentation.viewport !== undefined && !isObject(input.presentation.viewport))
|
|
94
|
+
throw new TypeError('Presentation viewport must be an object.');
|
|
95
|
+
const canonicalIdentities = Object.values(input.canonicalKeys);
|
|
96
|
+
if (new Set(canonicalIdentities).size !== Object.keys(input.canonicalKeys).length || canonicalIdentities.some(identity => !identity.trim())) {
|
|
97
|
+
throw new Error('canonicalKeys must contain unique, non-blank identities.');
|
|
98
|
+
}
|
|
99
|
+
const identitiesBySection = {
|
|
100
|
+
nodes: new Set(canonicalIdentities.filter(identity => identity.includes('|node|'))),
|
|
101
|
+
ports: new Set(canonicalIdentities.filter(identity => identity.includes('|port|'))),
|
|
102
|
+
edges: new Set(canonicalIdentities.filter(identity => identity.includes('|route|') || identity.includes('|edge|'))),
|
|
103
|
+
};
|
|
104
|
+
if (identitiesBySection.nodes.size + identitiesBySection.ports.size + identitiesBySection.edges.size !== canonicalIdentities.length) {
|
|
105
|
+
throw new Error('Every canonical identity must declare a node, port, route, or edge kind.');
|
|
106
|
+
}
|
|
107
|
+
for (const section of ['nodes', 'ports', 'edges']) {
|
|
108
|
+
const invalidIdentity = Object.keys(input.defaults[section]).find(identity => !identitiesBySection[section].has(identity));
|
|
109
|
+
if (invalidIdentity !== undefined)
|
|
110
|
+
throw new Error(`Default ${section} key '${invalidIdentity}' is not a declared canonical identity for that section.`);
|
|
111
|
+
}
|
|
112
|
+
const topLevel = ['theme', 'viewport'].flatMap(key => {
|
|
113
|
+
const value = input.presentation[key];
|
|
114
|
+
if (value === undefined)
|
|
115
|
+
return [];
|
|
116
|
+
const difference = delta(value, input.defaults[key]);
|
|
117
|
+
return difference === undefined ? [] : [[key, difference]];
|
|
118
|
+
});
|
|
119
|
+
return Object.freeze({
|
|
120
|
+
schemaVersion: input.schemaVersion,
|
|
121
|
+
sourceFingerprint: input.sourceFingerprint,
|
|
122
|
+
...Object.fromEntries(topLevel),
|
|
123
|
+
nodes: elementDeltas(input.presentation.nodes, input.defaults.nodes, identitiesBySection.nodes, 'Node'),
|
|
124
|
+
ports: elementDeltas(input.presentation.ports, input.defaults.ports, identitiesBySection.ports, 'Port'),
|
|
125
|
+
edges: elementDeltas(input.presentation.edges, input.defaults.edges, identitiesBySection.edges, 'Edge'),
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=presentationOverlay.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"presentationOverlay.js","sourceRoot":"","sources":["../src/presentationOverlay.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import type { WorkflowGraph } from '@beehexa/hexasync-template-model';
|
|
2
|
+
import type { PresentationJsonObject, SerializedPresentationOverlay } from './presentationOverlay.js';
|
|
3
|
+
type ElementKind = 'node' | 'port' | 'edge';
|
|
4
|
+
export interface PresentationSelection {
|
|
5
|
+
readonly nodeIds: readonly string[];
|
|
6
|
+
readonly edgeIds: readonly string[];
|
|
7
|
+
readonly portIds?: readonly string[];
|
|
8
|
+
}
|
|
9
|
+
export interface PresentationOrphan {
|
|
10
|
+
readonly kind: ElementKind;
|
|
11
|
+
readonly canonicalId: string;
|
|
12
|
+
readonly override: PresentationJsonObject;
|
|
13
|
+
readonly reason: 'identity-missing' | 'unknown-identity' | 'fingerprint-mismatch';
|
|
14
|
+
readonly provenance: 'previous-topology' | 'orphan-record' | 'untrusted-overlay';
|
|
15
|
+
}
|
|
16
|
+
export interface PresentationReconciliationDiagnostic {
|
|
17
|
+
readonly code: 'PRESENTATION_ORPHANED_OVERRIDE' | 'PRESENTATION_UNKNOWN_OVERRIDE_IDENTITY' | 'PRESENTATION_OVERLAY_FINGERPRINT_MISMATCH' | 'PRESENTATION_REVISION_CONFLICT';
|
|
18
|
+
readonly severity: 'warning' | 'error';
|
|
19
|
+
readonly message: string;
|
|
20
|
+
readonly recoverable: true;
|
|
21
|
+
readonly elementId?: string;
|
|
22
|
+
}
|
|
23
|
+
export interface PresentationConflictAction {
|
|
24
|
+
readonly id: 'reload' | 'overwrite' | 'save-copy';
|
|
25
|
+
readonly label: string;
|
|
26
|
+
}
|
|
27
|
+
export interface ReconcilePresentationOverlayInput {
|
|
28
|
+
readonly previousGraph: Pick<WorkflowGraph, 'sourceFingerprint' | 'nodes' | 'ports' | 'edges'>;
|
|
29
|
+
readonly nextGraph: Pick<WorkflowGraph, 'sourceFingerprint' | 'nodes' | 'ports' | 'edges'>;
|
|
30
|
+
readonly overlay: SerializedPresentationOverlay;
|
|
31
|
+
readonly overlayRevision: number | null;
|
|
32
|
+
readonly expectedOverlayRevision: number | null;
|
|
33
|
+
readonly selection?: PresentationSelection;
|
|
34
|
+
readonly orphans?: readonly PresentationOrphan[];
|
|
35
|
+
/** Storage callbacks are intentionally ignored. Persistence belongs to the caller's adapter. */
|
|
36
|
+
readonly save?: unknown;
|
|
37
|
+
}
|
|
38
|
+
export interface ReconciledPresentationOverlayResult {
|
|
39
|
+
readonly status: 'reconciled';
|
|
40
|
+
readonly overlay: SerializedPresentationOverlay;
|
|
41
|
+
readonly placementRequest: {
|
|
42
|
+
readonly newNodeIds: readonly string[];
|
|
43
|
+
};
|
|
44
|
+
readonly selection?: PresentationSelection;
|
|
45
|
+
readonly orphans: readonly PresentationOrphan[];
|
|
46
|
+
readonly diagnostics: readonly PresentationReconciliationDiagnostic[];
|
|
47
|
+
}
|
|
48
|
+
export interface PresentationRevisionConflictResult {
|
|
49
|
+
readonly status: 'conflict';
|
|
50
|
+
readonly expectedRevision: number | null;
|
|
51
|
+
readonly actualRevision: number | null;
|
|
52
|
+
readonly actions: readonly PresentationConflictAction[];
|
|
53
|
+
readonly diagnostics: readonly PresentationReconciliationDiagnostic[];
|
|
54
|
+
}
|
|
55
|
+
export type PresentationReconciliationResult = ReconciledPresentationOverlayResult | PresentationRevisionConflictResult;
|
|
56
|
+
/** Reconciles presentation data by exact canonical identity and provenance only. */
|
|
57
|
+
export declare function reconcilePresentationOverlay(input: ReconcilePresentationOverlayInput): PresentationReconciliationResult;
|
|
58
|
+
export {};
|
|
59
|
+
//# sourceMappingURL=presentationReconciliation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"presentationReconciliation.d.ts","sourceRoot":"","sources":["../src/presentationReconciliation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
const sections = ['nodes', 'ports', 'edges'];
|
|
2
|
+
const sectionKind = Object.freeze({ nodes: 'node', ports: 'port', edges: 'edge' });
|
|
3
|
+
const cloneJson = (value) => {
|
|
4
|
+
if (Array.isArray(value))
|
|
5
|
+
return Object.freeze(value.map(cloneJson));
|
|
6
|
+
if (value !== null && typeof value === 'object') {
|
|
7
|
+
const object = value;
|
|
8
|
+
return Object.freeze(Object.fromEntries(Object.keys(object).sort().map(key => [key, cloneJson(object[key])])));
|
|
9
|
+
}
|
|
10
|
+
return value;
|
|
11
|
+
};
|
|
12
|
+
const cloneObject = (value) => cloneJson(value);
|
|
13
|
+
const identities = (graph) => Object.freeze({ nodes: new Set(graph.nodes.map(({ id }) => id)), ports: new Set(graph.ports.map(({ id }) => id)), edges: new Set(graph.edges.map(({ id }) => id)) });
|
|
14
|
+
const keyOf = (kind, id) => kind + "\0" + id;
|
|
15
|
+
const compareText = (a, b) => a < b ? -1 : a > b ? 1 : 0;
|
|
16
|
+
const compareOrphans = (a, b) => compareText(a.kind, b.kind) || compareText(a.canonicalId, b.canonicalId) || compareText(JSON.stringify(cloneObject(a.override)), JSON.stringify(cloneObject(b.override))) || compareText(a.reason, b.reason) || compareText(a.provenance, b.provenance);
|
|
17
|
+
const conflictActions = Object.freeze([Object.freeze({ id: 'reload', label: 'Reload latest presentation' }), Object.freeze({ id: 'overwrite', label: 'Overwrite latest presentation' }), Object.freeze({ id: 'save-copy', label: 'Save as a copy' })]);
|
|
18
|
+
const conflict = (input) => Object.freeze({ status: 'conflict', expectedRevision: input.expectedOverlayRevision, actualRevision: input.overlayRevision, actions: conflictActions, diagnostics: Object.freeze([Object.freeze({ code: 'PRESENTATION_REVISION_CONFLICT', severity: 'error', message: 'The presentation changed after it was loaded. Reload, overwrite, or save a copy before continuing.', recoverable: true })]) });
|
|
19
|
+
/** Reconciles presentation data by exact canonical identity and provenance only. */
|
|
20
|
+
export function reconcilePresentationOverlay(input) {
|
|
21
|
+
if (input.overlayRevision !== input.expectedOverlayRevision)
|
|
22
|
+
return conflict(input);
|
|
23
|
+
const previous = identities(input.previousGraph);
|
|
24
|
+
const next = identities(input.nextGraph);
|
|
25
|
+
const trustedFingerprint = input.overlay.sourceFingerprint === input.previousGraph.sourceFingerprint;
|
|
26
|
+
const retained = { nodes: [], ports: [], edges: [] };
|
|
27
|
+
const orphanByKey = new Map();
|
|
28
|
+
const diagnostics = [];
|
|
29
|
+
for (const orphan of [...(input.orphans ?? [])].sort(compareOrphans))
|
|
30
|
+
orphanByKey.set(keyOf(orphan.kind, orphan.canonicalId), Object.freeze({ ...orphan, override: cloneObject(orphan.override) }));
|
|
31
|
+
if (!trustedFingerprint)
|
|
32
|
+
diagnostics.push(Object.freeze({ code: 'PRESENTATION_OVERLAY_FINGERPRINT_MISMATCH', severity: 'warning', message: 'The presentation overlay belongs to a different source fingerprint and all active overrides were quarantined.', recoverable: true }));
|
|
33
|
+
for (const section of sections) {
|
|
34
|
+
const kind = sectionKind[section];
|
|
35
|
+
for (const canonicalId of Object.keys(input.overlay[section]).sort()) {
|
|
36
|
+
const override = cloneObject(input.overlay[section][canonicalId]);
|
|
37
|
+
const knownBefore = previous[section].has(canonicalId);
|
|
38
|
+
const knownOrphan = orphanByKey.has(keyOf(kind, canonicalId));
|
|
39
|
+
if (trustedFingerprint && knownBefore && next[section].has(canonicalId)) {
|
|
40
|
+
retained[section].push([canonicalId, override]);
|
|
41
|
+
orphanByKey.delete(keyOf(kind, canonicalId));
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
const reason = !trustedFingerprint ? 'fingerprint-mismatch' : knownBefore || knownOrphan ? 'identity-missing' : 'unknown-identity';
|
|
45
|
+
orphanByKey.set(keyOf(kind, canonicalId), Object.freeze({ kind, canonicalId, override, reason, provenance: knownBefore && trustedFingerprint ? 'previous-topology' : knownOrphan ? 'orphan-record' : 'untrusted-overlay' }));
|
|
46
|
+
diagnostics.push(Object.freeze({ code: !trustedFingerprint ? 'PRESENTATION_OVERLAY_FINGERPRINT_MISMATCH' : reason === 'unknown-identity' ? 'PRESENTATION_UNKNOWN_OVERRIDE_IDENTITY' : 'PRESENTATION_ORPHANED_OVERRIDE', severity: 'warning', message: !trustedFingerprint ? `Presentation override was quarantined because its source fingerprint does not match.` : reason === 'unknown-identity' ? `Presentation override has no trusted canonical or orphan provenance and was quarantined.` : `Presentation override no longer has a matching canonical identity and was retained for recovery.`, elementId: canonicalId, recoverable: true }));
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
const selection = input.selection === undefined ? undefined : Object.freeze({ nodeIds: Object.freeze(input.selection.nodeIds.filter(id => next.nodes.has(id)).sort()), edgeIds: Object.freeze(input.selection.edgeIds.filter(id => next.edges.has(id)).sort()), ...(input.selection.portIds === undefined ? {} : { portIds: Object.freeze(input.selection.portIds.filter(id => next.ports.has(id)).sort()) }) });
|
|
50
|
+
const metadata = Object.keys(input.overlay).filter(name => !['schemaVersion', 'sourceFingerprint', ...sections].includes(name)).sort().map(name => [name, cloneJson(input.overlay[name])]);
|
|
51
|
+
const overlay = Object.freeze(Object.fromEntries([...metadata, ['schemaVersion', input.overlay.schemaVersion], ['sourceFingerprint', input.nextGraph.sourceFingerprint], ['nodes', Object.freeze(Object.fromEntries(retained.nodes))], ['ports', Object.freeze(Object.fromEntries(retained.ports))], ['edges', Object.freeze(Object.fromEntries(retained.edges))]]));
|
|
52
|
+
return Object.freeze({ status: 'reconciled', overlay, placementRequest: Object.freeze({ newNodeIds: Object.freeze(input.nextGraph.nodes.map(({ id }) => id).filter(id => !previous.nodes.has(id)).sort()) }), ...(selection === undefined ? {} : { selection }), orphans: Object.freeze([...orphanByKey.values()].sort(compareOrphans)), diagnostics: Object.freeze(diagnostics) });
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=presentationReconciliation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"presentationReconciliation.js","sourceRoot":"","sources":["../src/presentationReconciliation.ts"],"names":[],"mappings":"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"}
|