@exellix/graph-engine 7.5.0 → 7.5.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.
@@ -33,7 +33,6 @@ export { readExecutionVariableBuckets, seedGraphVariableBucketsOnExecution, mirr
33
33
  export type { ExecutionVariableBuckets } from './runtime/executionVariableBuckets.js';
34
34
  export { resolveTaskNodeInputsForRunTask, resolveTaskNodeTaskVariableForRunTask, resolveTaskNodeInputBindingsForRunTask, } from './runtime/resolveTaskNodeInputs.js';
35
35
  export { readTaskNodeInputsConfig, readTaskNodeModelInputSurface, isNodeInputsConfigSelectorType, } from './runtime/readTaskNodeInputsConfig.js';
36
- export type { TaskNodeInputsConfigCarrier } from './runtime/readTaskNodeInputsConfig.js';
37
36
  export { mergeMemory } from './runtime/memory.js';
38
37
  export { selectByPath, writeByPath, parsePath } from './runtime/pathExpr.js';
39
38
  export type { PathSegment } from './runtime/pathExpr.js';
@@ -51,7 +50,7 @@ export { assertGraphAiProfileNameString as assertGraphModelAliasString } from '.
51
50
  export { isGraphAiModelConfig, isModelConfigSelection, isEmptyConditionWhen, conditionWhenSignature, countDefaultModelConfigCases, } from './runtime/modelConfigSelection.js';
52
51
  export { GRAPH_ENGINE_MEMORY_PATH_ROOTS, splitGraphEngineMemoryPath, isAllowedGraphEngineMemoryPath, graphEngineMemoryPathValidationMessage, } from './runtime/graphEngineMemoryPaths.js';
53
52
  export { buildRunTaskMainInput, extractCallerInputsBag, buildGraphEngineMemoryResolutionRoot, buildGraphEngineMemoryResolutionRootFromWorkingMemory, resolveGraphEngineMemoryPathValue, } from './runtime/resolveGraphEngineMemoryPaths.js';
54
- export { mirrorRuntimeInputRawOnExecutionMemory, mirrorStructuredInputOntoExecutionMemory, } from './runtime/materializeStructuredRunTaskInput.js';
53
+ export { mirrorStructuredInputOntoExecutionMemory, } from './runtime/materializeStructuredRunTaskInput.js';
55
54
  export { buildRunTaskTaskConfigurationForward } from './runtime/buildRunTaskTaskConfigurationForward.js';
56
55
  export { normalizeSmartInputPath, collectSmartInputPaths, normalizeSmartInputConfigForRunTask, } from './runtime/smartInputPaths.js';
57
56
  export { evaluateTaskNodeMainReadiness, buildMainReadinessResolutionRoot, resolveMainReadinessPolicy, collectInputSynthesisSourcePaths, } from './runtime/taskNodeMainReadiness.js';
@@ -79,7 +78,7 @@ export type { RunTaskValidationIssue, RunTaskValidationResult, RunTaskInvokeVali
79
78
  export { buildExellixGraphRuntimeObjects, setRuntimeObjectsLastJobId, summarizeRuntimeObjectsForPlayground, EXELLIX_GRAPH_RUNTIME_PACKAGE_NAME, EXELLIX_AI_TASKS_PACKAGE_NAME, } from './runtime/runtimeObjects.js';
80
79
  export type { ActivixQueryableClient, LogxerQueryableClient, LogxerLogLine, PackageRuntimeObjects, RuntimeObjects, BuildExellixGraphRuntimeObjectsInput, RuntimeObjectsObservabilitySummary, } from './runtime/runtimeObjects.js';
81
80
  export type { GetJobLogsInput, GetJobLogsResult, QueryableLogLine } from '@x12i/logxer';
82
- export { assertCanonicalGraphDocument, getCanonicalGraphDocumentViolations, CANONICAL_GRAPH_TOP_LEVEL_KEYS, } from './runtime/validateCanonicalGraphDocument.js';
81
+ export { assertCanonicalGraphDocument, assertCanonicalTaskNode, getCanonicalGraphDocumentViolations, CANONICAL_GRAPH_TOP_LEVEL_KEYS, } from './runtime/validateCanonicalGraphDocument.js';
83
82
  export { GRAPH_ENTRY_STUDIO_ONLY_KEYS, GRAPH_METADATA_STUDIO_ONLY_KEYS, stripGraphModelStudioFields, primaryRuntimeInputFromStudioDocument, getGraphEntryStudioOnlyKeyViolations, getGraphMetadataStudioOnlyKeyViolations, getGraphEntryEmptyInputPathViolations, } from './runtime/graphModelStudioSeparation.js';
84
83
  export type { GraphStudioDocument } from './runtime/graphModelStudioSeparation.js';
85
84
  export { computeGraphDocumentContentSha256, stableStringifyGraphDocument, } from './runtime/graphDocumentFingerprint.js';
package/dist/src/index.js CHANGED
@@ -40,7 +40,7 @@ export { assertGraphAiProfileNameString as assertGraphModelAliasString } from '.
40
40
  export { isGraphAiModelConfig, isModelConfigSelection, isEmptyConditionWhen, conditionWhenSignature, countDefaultModelConfigCases, } from './runtime/modelConfigSelection.js';
41
41
  export { GRAPH_ENGINE_MEMORY_PATH_ROOTS, splitGraphEngineMemoryPath, isAllowedGraphEngineMemoryPath, graphEngineMemoryPathValidationMessage, } from './runtime/graphEngineMemoryPaths.js';
42
42
  export { buildRunTaskMainInput, extractCallerInputsBag, buildGraphEngineMemoryResolutionRoot, buildGraphEngineMemoryResolutionRootFromWorkingMemory, resolveGraphEngineMemoryPathValue, } from './runtime/resolveGraphEngineMemoryPaths.js';
43
- export { mirrorRuntimeInputRawOnExecutionMemory, mirrorStructuredInputOntoExecutionMemory, } from './runtime/materializeStructuredRunTaskInput.js';
43
+ export { mirrorStructuredInputOntoExecutionMemory, } from './runtime/materializeStructuredRunTaskInput.js';
44
44
  export { buildRunTaskTaskConfigurationForward } from './runtime/buildRunTaskTaskConfigurationForward.js';
45
45
  export { normalizeSmartInputPath, collectSmartInputPaths, normalizeSmartInputConfigForRunTask, } from './runtime/smartInputPaths.js';
46
46
  export { evaluateTaskNodeMainReadiness, buildMainReadinessResolutionRoot, resolveMainReadinessPolicy, collectInputSynthesisSourcePaths, } from './runtime/taskNodeMainReadiness.js';
@@ -58,7 +58,7 @@ export { buildTaskNodeRunTaskRequest, validateTaskNodeRunTaskConfig, validateTas
58
58
  /** Re-exported from `@exellix/ai-tasks` — preflight validation and analysis without `runTask`. */
59
59
  export { validateRunTaskConfig, validateRunTaskInvoke, analyzeExpectedRunTaskInput, checkExpectedInputAgainstRequest, collectSmartInputValidationIssues, buildRunTaskValidationContext, analyzeRunTaskRequest, validateParsedOutput, analyzeSkillRequest, buildSkillRequestAnalysisPacket, formatSkillRequestAnalysisMarkdown, listTokens, analyzeTemplateResolution, renderSmartInput, extractTokenNamesFromStrings, getSkillTokens, getSkillContent, } from '@exellix/ai-tasks';
60
60
  export { buildExellixGraphRuntimeObjects, setRuntimeObjectsLastJobId, summarizeRuntimeObjectsForPlayground, EXELLIX_GRAPH_RUNTIME_PACKAGE_NAME, EXELLIX_AI_TASKS_PACKAGE_NAME, } from './runtime/runtimeObjects.js';
61
- export { assertCanonicalGraphDocument, getCanonicalGraphDocumentViolations, CANONICAL_GRAPH_TOP_LEVEL_KEYS, } from './runtime/validateCanonicalGraphDocument.js';
61
+ export { assertCanonicalGraphDocument, assertCanonicalTaskNode, getCanonicalGraphDocumentViolations, CANONICAL_GRAPH_TOP_LEVEL_KEYS, } from './runtime/validateCanonicalGraphDocument.js';
62
62
  export { GRAPH_ENTRY_STUDIO_ONLY_KEYS, GRAPH_METADATA_STUDIO_ONLY_KEYS, stripGraphModelStudioFields, primaryRuntimeInputFromStudioDocument, getGraphEntryStudioOnlyKeyViolations, getGraphMetadataStudioOnlyKeyViolations, getGraphEntryEmptyInputPathViolations, } from './runtime/graphModelStudioSeparation.js';
63
63
  export { computeGraphDocumentContentSha256, stableStringifyGraphDocument, } from './runtime/graphDocumentFingerprint.js';
64
64
  export { migrateLegacyGraphResponse, migrateLegacyGraphResponseDefinition, } from './runtime/graphResponseMigration.js';
@@ -240,10 +240,8 @@ export function getNodeScopingQuestion(node) {
240
240
  const task = node;
241
241
  const readability = task.metadata?.graphReadability;
242
242
  const name = readability?.title;
243
- const legacyInputsConfig = readTaskNodeInputsConfig(task);
244
243
  const question = readability?.asks ??
245
- (typeof task.taskVariable?.question === 'string' ? task.taskVariable.question : undefined) ??
246
- (typeof legacyInputsConfig.question === 'string' ? legacyInputsConfig.question : undefined);
244
+ (typeof task.taskVariable?.question === 'string' ? task.taskVariable.question : undefined);
247
245
  const kind = readability?.kind;
248
246
  // Sources
249
247
  const sources = [];
@@ -8,7 +8,7 @@ import { resolveExecutionPipelineForTaskNode } from "./resolveExecutionPipelineF
8
8
  import { resolveTaskNodeInputsForRunTask } from "./resolveTaskNodeInputs.js";
9
9
  import { assertAiTasksNodeExtensionsValid } from "../inspection/validateAiTasksNodeExtensions.js";
10
10
  import { buildRunTaskMainInput, extractCallerInputsBag } from "./resolveGraphEngineMemoryPaths.js";
11
- import { mirrorRuntimeInputRawOnExecutionMemory, mirrorStructuredInputOntoExecutionMemory, } from "./materializeStructuredRunTaskInput.js";
11
+ import { mirrorStructuredInputOntoExecutionMemory, } from "./materializeStructuredRunTaskInput.js";
12
12
  import { buildMainReadinessResolutionRoot, evaluateTaskNodeMainReadiness, resolveMainReadinessPolicy, } from "./taskNodeMainReadiness.js";
13
13
  import { mergeXynthesizedPatchIntoExecution, seedGraphRunExecutionState, xynthesizedOutboundForNode, } from "./graphRunExecutionSeed.js";
14
14
  import { buildTaskNodeJobContext } from "./buildTaskNodeJobContext.js";
@@ -253,7 +253,6 @@ function normalizeRuntimeExecutionMemory(runtime) {
253
253
  if (isPlainRecord(runtime.inputs)) {
254
254
  execution.inputs = { ...runtime.inputs };
255
255
  }
256
- mirrorRuntimeInputRawOnExecutionMemory(execution);
257
256
  return execution;
258
257
  }
259
258
  function normalizeRuntimeOutputsMemory(runtime) {
@@ -681,7 +680,6 @@ export function createExellixGraphRuntime(opts) {
681
680
  const clearSynthForTask = input.clearSynthesizedContextPerNode === true &&
682
681
  hasSynthesizedContextPreStep &&
683
682
  hasExistingSynthesizedContext;
684
- mirrorRuntimeInputRawOnExecutionMemory(executionRec);
685
683
  const nodeBindings = resolveTaskNodeInputsForRunTask({
686
684
  node: input.node,
687
685
  execution: executionRec,
@@ -171,7 +171,7 @@ function executeAggregateQuestionDriven(args) {
171
171
  path: `config.items.${outKey}.nodeId`,
172
172
  });
173
173
  }
174
- const questionPath = spec.questionPath ?? 'inputs.question';
174
+ const questionPath = spec.questionPath ?? 'taskVariable.question';
175
175
  const question = getByDotPath(node, questionPath);
176
176
  if (typeof question !== 'string' || question.length === 0) {
177
177
  throw createFinalizerError({
@@ -1,5 +1,5 @@
1
1
  import { selectByPath } from './pathExpr.js';
2
- import { isNodeInputsConfigSelectorType, readTaskNodeModelInputSurface, } from './readTaskNodeInputsConfig.js';
2
+ import { readTaskNodeModelInputSurface, } from './readTaskNodeInputsConfig.js';
3
3
  const GRAPH_RESPONSE_MAPPING_ERROR_CODE = 'GRAPH_RESPONSE_MAPPING_INVALID';
4
4
  const OMIT = Symbol('graphResponseMapping.omit');
5
5
  const FORBIDDEN_GRAPH_RESPONSE_KEYS = [
@@ -30,7 +30,6 @@ function isSupportedSelector(v) {
30
30
  v.type === 'executionPath' ||
31
31
  v.type === 'nodeMetadata' ||
32
32
  v.type === 'nodeInputsConfig' ||
33
- v.type === 'nodeInputs' ||
34
33
  v.type === 'literal' ||
35
34
  v.type === 'firstPresent');
36
35
  }
@@ -94,7 +93,7 @@ function resolveSelector(selector, context, path, missing) {
94
93
  }
95
94
  return presentOrMissing(selectByPath(node.metadata, sourcePath), missing);
96
95
  }
97
- if (isNodeInputsConfigSelectorType(selector.type)) {
96
+ if (selector.type === 'nodeInputsConfig') {
98
97
  const inputSelector = selector;
99
98
  const nodeId = assertNonEmptyString(inputSelector.nodeId, `${path}.nodeId`, `${selector.type}.nodeId`);
100
99
  const sourcePath = assertNonEmptyString(inputSelector.path, `${path}.path`, `${selector.type}.path`);
@@ -1,8 +1,3 @@
1
- /**
2
- * Ensures `executionMemory.input.raw` holds the active MAIN payload for PRE synthesis paths
3
- * (e.g. `inputsConfig` bindings with `path: "input.raw"`).
4
- */
5
- export declare function mirrorRuntimeInputRawOnExecutionMemory(executionMemory: Record<string, unknown>): void;
6
1
  /**
7
2
  * Mirrors MAIN task input onto `executionMemory.input` for the current graph run.
8
3
  */
@@ -1,24 +1,6 @@
1
1
  function isPlainObject(v) {
2
2
  return v != null && typeof v === 'object' && !Array.isArray(v);
3
3
  }
4
- /**
5
- * Ensures `executionMemory.input.raw` holds the active MAIN payload for PRE synthesis paths
6
- * (e.g. `inputsConfig` bindings with `path: "input.raw"`).
7
- */
8
- export function mirrorRuntimeInputRawOnExecutionMemory(executionMemory) {
9
- const main = executionMemory.input;
10
- if (main === undefined)
11
- return;
12
- const raw = isPlainObject(main)
13
- ? (() => {
14
- const copy = { ...main };
15
- delete copy.raw;
16
- return copy;
17
- })()
18
- : main;
19
- const prev = isPlainObject(executionMemory.input) ? executionMemory.input : {};
20
- executionMemory.input = { ...prev, raw };
21
- }
22
4
  /**
23
5
  * Mirrors MAIN task input onto `executionMemory.input` for the current graph run.
24
6
  */
@@ -1,22 +1,11 @@
1
1
  import type { TaskNode } from '../types/refs.js';
2
- export type TaskNodeInputsConfigCarrier = TaskNode & {
3
- /** Runtime payload bindings (`executionMemoryPath`); canonical task-node field. */
4
- inputsConfig?: Record<string, unknown>;
5
- /** @deprecated Prefer `inputsConfig`. */
6
- inputBindings?: Record<string, unknown>;
7
- /**
8
- * @deprecated Prefer `inputsConfig` — collides with `runtime.inputs` (caller bag)
9
- * and `RunTaskRequest.inputs` on the wire.
10
- */
11
- inputs?: Record<string, unknown>;
12
- };
13
2
  /**
14
- * Reads a task node's runtime binding recipe with backward-compatible fallbacks.
3
+ * Reads a task node's runtime binding recipe (`inputsConfig` only).
15
4
  * Finalizers use `FinalizerNode.inputs` directly; this helper is for task nodes only.
16
5
  */
17
6
  export declare function readTaskNodeInputsConfig(node: TaskNode): Record<string, unknown>;
18
7
  /**
19
- * Model surface for graph.response selectors (`nodeInputsConfig` / legacy `nodeInputs`):
8
+ * Model surface for graph.response `nodeInputsConfig` selectors:
20
9
  * runtime bindings plus `taskVariable` (taskVariable wins on key collision).
21
10
  */
22
11
  export declare function readTaskNodeModelInputSurface(node: TaskNode): Record<string, unknown>;
@@ -1,17 +1,16 @@
1
1
  /**
2
- * Reads a task node's runtime binding recipe with backward-compatible fallbacks.
2
+ * Reads a task node's runtime binding recipe (`inputsConfig` only).
3
3
  * Finalizers use `FinalizerNode.inputs` directly; this helper is for task nodes only.
4
4
  */
5
5
  export function readTaskNodeInputsConfig(node) {
6
- const n = node;
7
- const recipe = n.inputsConfig ?? n.inputBindings ?? n.inputs;
6
+ const recipe = node.inputsConfig;
8
7
  if (recipe != null && typeof recipe === 'object' && !Array.isArray(recipe)) {
9
8
  return recipe;
10
9
  }
11
10
  return {};
12
11
  }
13
12
  /**
14
- * Model surface for graph.response selectors (`nodeInputsConfig` / legacy `nodeInputs`):
13
+ * Model surface for graph.response `nodeInputsConfig` selectors:
15
14
  * runtime bindings plus `taskVariable` (taskVariable wins on key collision).
16
15
  */
17
16
  export function readTaskNodeModelInputSurface(node) {
@@ -23,5 +22,5 @@ export function readTaskNodeModelInputSurface(node) {
23
22
  return bindings;
24
23
  }
25
24
  export function isNodeInputsConfigSelectorType(type) {
26
- return type === 'nodeInputsConfig' || type === 'nodeInputs';
25
+ return type === 'nodeInputsConfig';
27
26
  }
@@ -8,9 +8,7 @@ export declare function resolveTaskNodeTaskVariableForRunTask(args: {
8
8
  node: TaskNode;
9
9
  buckets: ExecutionVariableBuckets;
10
10
  }): Record<string, unknown>;
11
- /**
12
- * Resolves runtime payload bindings from `node.inputsConfig` only (plus deprecated aliases).
13
- */
11
+ /** Resolves runtime payload bindings from `node.inputsConfig` only. */
14
12
  export declare function resolveTaskNodeInputBindingsForRunTask(args: {
15
13
  node: TaskNode;
16
14
  execution: Record<string, unknown>;
@@ -81,9 +81,7 @@ function resolveTaskVariableValue(val, buckets) {
81
81
  }
82
82
  return Object.keys(nested).length > 0 ? nested : val;
83
83
  }
84
- /**
85
- * Resolves runtime payload bindings from `node.inputsConfig` only (plus deprecated aliases).
86
- */
84
+ /** Resolves runtime payload bindings from `node.inputsConfig` only. */
87
85
  export function resolveTaskNodeInputBindingsForRunTask(args) {
88
86
  const recipe = readTaskNodeInputsConfig(args.node);
89
87
  const out = {};
@@ -102,39 +100,16 @@ export function resolveTaskNodeInputBindingsForRunTask(args) {
102
100
  }
103
101
  return out;
104
102
  }
105
- /** Legacy literals / variable refs still under deprecated `inputs`. */
106
- function resolveLegacyTaskVariableFromInputBindings(args) {
107
- const recipe = readTaskNodeInputsConfig(args.node);
108
- const out = {};
109
- for (const [key, val] of Object.entries(recipe)) {
110
- if (isExecutionMemoryBinding(val))
111
- continue;
112
- if (isPlainObject(val) && typeof val.$path === 'string') {
113
- const p = val.$path.trim();
114
- if (!p.startsWith('variables.') && !p.startsWith('jobVariables.') && !p.startsWith('taskVariables.')) {
115
- continue;
116
- }
117
- }
118
- const resolved = resolveTaskVariableValue(val, args.buckets);
119
- if (resolved !== undefined)
120
- out[key] = resolved;
121
- }
122
- return out;
123
- }
124
103
  /**
125
104
  * Resolves task-node model input for MAIN `RunTaskRequest.input`:
126
105
  * `taskVariable` plus execution-memory bindings (separate buckets, no merge).
127
106
  */
128
107
  export function resolveTaskNodeInputsForRunTask(args) {
129
108
  const buckets = readExecutionVariableBuckets(args.execution);
130
- const legacyTaskVar = resolveLegacyTaskVariableFromInputBindings({
131
- node: args.node,
132
- buckets,
133
- });
134
109
  const taskVariable = resolveTaskNodeTaskVariableForRunTask({ node: args.node, buckets });
135
110
  const bindings = resolveTaskNodeInputBindingsForRunTask({
136
111
  node: args.node,
137
112
  execution: args.execution,
138
113
  });
139
- return { ...legacyTaskVar, ...taskVariable, ...bindings };
114
+ return { ...taskVariable, ...bindings };
140
115
  }
@@ -7,7 +7,7 @@ import { resolveExecutionPipelineForTaskNode } from './resolveExecutionPipelineF
7
7
  import { resolveTaskNodeInputsForRunTask } from './resolveTaskNodeInputs.js';
8
8
  import { assertAiTasksNodeExtensionsValid } from '../inspection/validateAiTasksNodeExtensions.js';
9
9
  import { buildRunTaskMainInput, extractCallerInputsBag } from './resolveGraphEngineMemoryPaths.js';
10
- import { mirrorRuntimeInputRawOnExecutionMemory, mirrorStructuredInputOntoExecutionMemory, } from './materializeStructuredRunTaskInput.js';
10
+ import { mirrorStructuredInputOntoExecutionMemory, } from './materializeStructuredRunTaskInput.js';
11
11
  import { xynthesizedOutboundForNode } from './graphRunExecutionSeed.js';
12
12
  import { buildTaskNodeJobContext } from './buildTaskNodeJobContext.js';
13
13
  import { resolveNarrixForTaskNode } from './resolveNarrixForTaskNode.js';
@@ -76,7 +76,6 @@ export async function buildTaskNodeRunTaskRequest(args) {
76
76
  const clearSynthForTask = args.clearSynthesizedContextPerNode === true &&
77
77
  hasSynthesizedContextPreStep &&
78
78
  hasExistingSynthesizedContext;
79
- mirrorRuntimeInputRawOnExecutionMemory(execution);
80
79
  const nodeBindings = resolveTaskNodeInputsForRunTask({ node, execution });
81
80
  const jobContext = buildTaskNodeJobContext({
82
81
  node,
@@ -382,6 +382,34 @@ function assertGraphResponseDefinition(value, path, context) {
382
382
  if (!Object.prototype.hasOwnProperty.call(value, 'shape')) {
383
383
  throw new ExellixGraphError(ExellixGraphErrorCode.NON_CANONICAL_GRAPH_DOCUMENT, `${path}.shape is required.`, context);
384
384
  }
385
+ assertGraphResponseShapeNoLegacy(value.shape, `${path}.shape`, context);
386
+ }
387
+ function isExecutionMemoryPathBinding(val) {
388
+ return isPlainObject(val) && val.type === 'executionMemoryPath' && typeof val.path === 'string';
389
+ }
390
+ function assertForbidInputRawExecutionPath(dotPath, label, context) {
391
+ if (dotPath === 'input.raw' || dotPath.endsWith('.raw')) {
392
+ throw new ExellixGraphError(ExellixGraphErrorCode.NON_CANONICAL_TASK_NODE, `${label}: executionMemoryPath "${dotPath}" is forbidden — bind to "input" (flat MAIN bucket). input.raw mirroring was removed.`, context);
393
+ }
394
+ }
395
+ function assertGraphResponseShapeNoLegacy(shape, path, context) {
396
+ if (Array.isArray(shape)) {
397
+ shape.forEach((item, index) => assertGraphResponseShapeNoLegacy(item, `${path}[${index}]`, context));
398
+ return;
399
+ }
400
+ if (!isPlainObject(shape))
401
+ return;
402
+ if (shape.type === 'nodeInputs') {
403
+ throw new ExellixGraphError(ExellixGraphErrorCode.NON_CANONICAL_GRAPH_DOCUMENT, `${path}.type "nodeInputs" was removed; use nodeInputsConfig.`, context);
404
+ }
405
+ if (shape.type === 'firstPresent' && Array.isArray(shape.sources)) {
406
+ shape.sources.forEach((source, index) => assertGraphResponseShapeNoLegacy(source, `${path}.sources[${index}]`, context));
407
+ }
408
+ for (const [key, val] of Object.entries(shape)) {
409
+ if (key === 'type' || key === 'nodeId' || key === 'path' || key === 'value' || key === 'sources')
410
+ continue;
411
+ assertGraphResponseShapeNoLegacy(val, `${path}.${key}`, context);
412
+ }
385
413
  }
386
414
  function findFinalizerType(node) {
387
415
  if (!isPlainObject(node))
@@ -494,6 +522,23 @@ export function assertCanonicalTaskNode(node, context) {
494
522
  }
495
523
  }
496
524
  }
525
+ if ('inputs' in taskNode && taskNode.inputs !== undefined) {
526
+ throw new ExellixGraphError(ExellixGraphErrorCode.NON_CANONICAL_TASK_NODE, `Task node "${String(node.id)}": node.inputs was removed — use inputsConfig for executionMemoryPath bindings and taskVariable for prompt literals.`, { jobId: context?.jobId, graphId: context?.graphId, nodeId: String(node.id) });
527
+ }
528
+ if ('inputBindings' in taskNode && taskNode.inputBindings !== undefined) {
529
+ throw new ExellixGraphError(ExellixGraphErrorCode.NON_CANONICAL_TASK_NODE, `Task node "${String(node.id)}": node.inputBindings was removed — use inputsConfig.`, { jobId: context?.jobId, graphId: context?.graphId, nodeId: String(node.id) });
530
+ }
531
+ const inputsConfig = taskNode.inputsConfig;
532
+ if (inputsConfig !== undefined) {
533
+ if (!isPlainObject(inputsConfig) || Array.isArray(inputsConfig)) {
534
+ throw new ExellixGraphError(ExellixGraphErrorCode.NON_CANONICAL_TASK_NODE, `Task node "${String(node.id)}": inputsConfig must be a plain object when present.`, { jobId: context?.jobId, graphId: context?.graphId, nodeId: String(node.id) });
535
+ }
536
+ for (const [bindingKey, bindingVal] of Object.entries(inputsConfig)) {
537
+ if (isExecutionMemoryPathBinding(bindingVal)) {
538
+ assertForbidInputRawExecutionPath(bindingVal.path, `Task node "${String(node.id)}": inputsConfig.${bindingKey}`, { jobId: context?.jobId, graphId: context?.graphId, nodeId: String(node.id) });
539
+ }
540
+ }
541
+ }
497
542
  }
498
543
  /**
499
544
  * Throws {@link ExellixGraphError} when the value is not a canonical graph document
@@ -149,12 +149,6 @@ export type GraphResponseSelector = {
149
149
  type: 'nodeInputsConfig';
150
150
  nodeId: string;
151
151
  path: string;
152
- }
153
- /** @deprecated Use `nodeInputsConfig`. */
154
- | {
155
- type: 'nodeInputs';
156
- nodeId: string;
157
- path: string;
158
152
  } | {
159
153
  type: 'literal';
160
154
  value: unknown;
@@ -194,7 +188,7 @@ export type QuestionDrivenItemSpec = {
194
188
  nodeId: string;
195
189
  /**
196
190
  * Dot-path under the node definition to read the question from.
197
- * Default: "inputs.question"
191
+ * Default: "taskVariable.question"
198
192
  */
199
193
  questionPath?: string;
200
194
  /**
@@ -222,11 +216,6 @@ export type FinalizerMemoryRef = {
222
216
  path: string;
223
217
  optional?: boolean;
224
218
  };
225
- /**
226
- * @deprecated Renamed and unified with {@link FinalizerMemoryRef}. Sections are now
227
- * `Record<outputKey, FinalizerMemoryRef>` instead of `{ path, title }`.
228
- */
229
- export type ReportSchemaSectionSpec = FinalizerMemoryRef;
230
219
  export type AggregateFinalizerConfig = {
231
220
  /** Build the output object field-by-field from named finalizer `inputs`. */
232
221
  strategy: 'object-map';
@@ -428,16 +417,10 @@ export interface TaskNode {
428
417
  }>;
429
418
  };
430
419
  /**
431
- * Runtime payload bindings only (`executionMemoryPath` / legacy memory `$path` refs).
420
+ * Runtime payload bindings only (`executionMemoryPath` / memory `$path` refs).
432
421
  * See `taskVariable` for prompts and graph-variable hooks.
433
422
  */
434
423
  inputsConfig?: Record<string, unknown>;
435
- /** @deprecated Prefer `inputsConfig`. */
436
- inputBindings?: Record<string, unknown>;
437
- /**
438
- * @deprecated Prefer `inputsConfig` — name collides with `runtime.inputs` (caller bag).
439
- */
440
- inputs?: Record<string, any>;
441
424
  /**
442
425
  * Dynamic task configuration: prompts, literals, and `{ "$path": "variables.*" }` refs.
443
426
  * Not execution-memory payload wires (those belong in `inputsConfig`).
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@exellix/graph-engine",
3
- "version": "7.5.0",
3
+ "version": "7.5.1",
4
4
  "type": "module",
5
5
  "description": "Graph executor SDK",
6
6
  "main": "dist/src/index.js",