@exellix/graph-engine 8.6.0 → 8.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -55,7 +55,7 @@ npm install @exellix/graph-engine
55
55
 
56
56
  **Upstream tasks SDK:** This package depends on **`@exellix/ai-tasks` ^8.6.8** and **`@x12i/funcx` 4.4.4** (see **`package.json`**). Graph-engine emits **`RunTaskRequest`** shapes that match the ai-tasks **8.x** closed schema (mandatory **`executionStrategies`**, three-slot **`modelConfig`**, **`xynthesized`**, optional **`smartInput`**, no legacy root mirrors). Pin compatible versions in your app lockfile. Optional CI improvement: fail or warn when the resolved ai-tasks major/minor drifts outside an allowlist (not enforced in-repo today).
57
57
 
58
- ### Execution matrix hosts (`@exellix/exellix-runtime`) — documentation only for the engine
58
+ ### Execution matrix hosts (`@x12i/exellix-runtime`) — documentation only for the engine
59
59
 
60
60
  Matrix **claim**, **rows**, and **retry policy** live outside this package. If your host wires **matrix → graph run**, see [.docs/execution-matrix-handoff.md](.docs/execution-matrix-handoff.md) for how **you** should inject `runtime.executeGraph`, compile **`GraphModelObject` → plan**, resolve **`metadata.graphEntry` per model**, seed **`runtime.executionMemory`**, and pass **`runtime.jobId`**. Helpers such as **`buildMatrixJobForGraphRun`** align **`id`** and **`job.jobId`** on the `job` object so you can call **`runtime.executeGraph({ plan, runtime: { jobId: job.jobId, job, … } })`**. Those exports are **optional helpers for callers**; they do **not** expand graph-engine’s role beyond **executing the single run** when invoked.
61
61
 
@@ -329,7 +329,7 @@ When **`taskConfiguration.aiTaskProfile.inputSynthesis`** is enabled, graph-engi
329
329
 
330
330
  1. **Engine PRE/POST strategy utilities (ai-tasks only):** `taskConfiguration.aiTaskProfile.preStrategyKey` / `postStrategyKey` → extra **`runTask`** calls via **`@exellix/ai-tasks`** before/after MAIN; outputs stored at **`execution.xynthesis.pre`** / **`execution.xynthesis.post`** (historical slot names).
331
331
  2. **`executionPipeline` inside ai-tasks:** e.g. PRE **`synthesized-context`** + MAIN direct — still **one** outbound MAIN `runTask` handled inside `@exellix/ai-tasks`.
332
- 3. **Narrix web scope inside ai-tasks:** when **`taskConfiguration.aiTaskProfile.webScoping.enabled`** is true, graph-engine forwards a `narrix` payload with `enableWebScope` / `webScopeQuestions`. The actual web fetch + skip rules run **inside `@exellix/ai-tasks`** (`@exellix/narrix-web-scoper`); graph-engine has **no local web phase** in 5.x.
332
+ 3. **Narrix web scope inside ai-tasks:** when **`taskConfiguration.aiTaskProfile.webScoping.enabled`** is true, graph-engine forwards a `narrix` payload with `enableWebScope` / `webScopeQuestions`. The actual web fetch + skip rules run **inside `@exellix/ai-tasks`** (`@x12i/narrix-web-scoper`); graph-engine has **no local web phase** in 5.x.
333
333
 
334
334
  `synthesize` finalizers are a fourth outbound task-call shape: the finalizer is still a graph model node, but its terminal utility `runTask` uses the same run identity, diagnostics, `llmCall`, and resolved model config as the rest of the graph run.
335
335
 
@@ -0,0 +1,37 @@
1
+ export type GraphRunPersistencyLink = {
2
+ /** Relation descriptor key (result entity → source entity). */
3
+ relationKey?: string;
4
+ /** Dot-path on the new record where the source recordId/entityId FK is written. */
5
+ fkPath?: string;
6
+ type?: 'oneToOne' | 'oneToMany' | 'manyToOne' | 'manyToMany';
7
+ /** Content type the relation targets on the source (default: source job contentType). */
8
+ targetContentType?: string;
9
+ };
10
+ export type GraphRunPersistency = {
11
+ /** Target object type; default `same-as-input`. */
12
+ entityId: string | 'same-as-input';
13
+ /** Result collection content type; default {@link DEFAULT_GRAPH_RUN_PERSISTENCY_CONTENT_TYPE}. */
14
+ contentType: string;
15
+ /** When true (default), always insert a new result record with a new recordId. */
16
+ newRecord?: boolean;
17
+ /** Cross-object link intent; auto-derived when {@link entityId} differs from the job source. */
18
+ link?: GraphRunPersistencyLink;
19
+ };
20
+ export type GraphRunContract = {
21
+ graphId: string;
22
+ persistency: GraphRunPersistency | null;
23
+ graphVersion?: string;
24
+ };
25
+ /** Parse a work/job/graph persistency object (partial fields allowed). */
26
+ export declare function parseGraphRunPersistency(raw: unknown): GraphRunPersistency | null;
27
+ /** Work/job overrides win over graph defaults; partial overrides merge field-by-field. */
28
+ export declare function mergeGraphRunPersistency(base: GraphRunPersistency | null, override: GraphRunPersistency | null): GraphRunPersistency | null;
29
+ /** Apply a run/work/job persistency override onto a resolved graph contract. */
30
+ export declare function applyGraphRunContractOverride(contract: GraphRunContract, persistencyOverride: unknown): GraphRunContract;
31
+ /** Read graph document version from published graph JSON (`version` or `metadata.version`). */
32
+ export declare function readGraphDocumentVersion(graphDoc: unknown): string | undefined;
33
+ /** Resolve graph-run contract from published graph JSON (GRX-NOTE-001). */
34
+ export declare function resolveGraphRunContract(graphId: string, graphDoc: unknown): GraphRunContract;
35
+ export declare function loadGraphRunContracts(graphIds: string[], graphLoader: {
36
+ loadGraph(graphId: string): Promise<unknown>;
37
+ }): Promise<GraphRunContract[]>;
@@ -0,0 +1,130 @@
1
+ import { DEFAULT_GRAPH_RUN_PERSISTENCY_CONTENT_TYPE } from './persistencyDefaults.js';
2
+ const RELATION_TYPES = new Set(['oneToOne', 'oneToMany', 'manyToOne', 'manyToMany']);
3
+ function asRecord(value) {
4
+ if (!value || typeof value !== 'object' || Array.isArray(value))
5
+ return null;
6
+ return value;
7
+ }
8
+ function readLink(raw) {
9
+ const link = asRecord(raw);
10
+ if (!link)
11
+ return undefined;
12
+ const out = {};
13
+ if (typeof link.relationKey === 'string' && link.relationKey.length > 0) {
14
+ out.relationKey = link.relationKey;
15
+ }
16
+ if (typeof link.fkPath === 'string' && link.fkPath.length > 0) {
17
+ out.fkPath = link.fkPath;
18
+ }
19
+ if (typeof link.type === 'string' && RELATION_TYPES.has(link.type)) {
20
+ out.type = link.type;
21
+ }
22
+ if (typeof link.targetContentType === 'string' && link.targetContentType.length > 0) {
23
+ out.targetContentType = link.targetContentType;
24
+ }
25
+ return Object.keys(out).length > 0 ? out : undefined;
26
+ }
27
+ function normalizePersistency(raw) {
28
+ const entityIdRaw = raw.entityId;
29
+ const entityId = entityIdRaw === 'same-as-input'
30
+ ? 'same-as-input'
31
+ : typeof entityIdRaw === 'string' && entityIdRaw.length > 0
32
+ ? entityIdRaw
33
+ : 'same-as-input';
34
+ const contentTypeRaw = raw.contentType;
35
+ const contentType = typeof contentTypeRaw === 'string' && contentTypeRaw.length > 0
36
+ ? contentTypeRaw
37
+ : DEFAULT_GRAPH_RUN_PERSISTENCY_CONTENT_TYPE;
38
+ const newRecord = raw.newRecord === false ? false : true;
39
+ const link = readLink(raw.link);
40
+ return {
41
+ entityId,
42
+ contentType,
43
+ newRecord,
44
+ ...(link ? { link } : {}),
45
+ };
46
+ }
47
+ /** Parse a work/job/graph persistency object (partial fields allowed). */
48
+ export function parseGraphRunPersistency(raw) {
49
+ const rec = asRecord(raw);
50
+ if (!rec)
51
+ return null;
52
+ return normalizePersistency(rec);
53
+ }
54
+ /** Work/job overrides win over graph defaults; partial overrides merge field-by-field. */
55
+ export function mergeGraphRunPersistency(base, override) {
56
+ if (!override)
57
+ return base;
58
+ if (!base)
59
+ return override;
60
+ return {
61
+ entityId: override.entityId,
62
+ contentType: override.contentType,
63
+ newRecord: override.newRecord !== undefined ? override.newRecord : base.newRecord,
64
+ link: override.link ? { ...base.link, ...override.link } : base.link,
65
+ };
66
+ }
67
+ function mergeRawPersistency(base, rawOverride) {
68
+ const overrideRec = asRecord(rawOverride);
69
+ if (!overrideRec)
70
+ return base;
71
+ const merged = {
72
+ ...(base
73
+ ? {
74
+ entityId: base.entityId,
75
+ contentType: base.contentType,
76
+ ...(base.newRecord === false ? { newRecord: false } : {}),
77
+ ...(base.link ? { link: { ...base.link } } : {}),
78
+ }
79
+ : {}),
80
+ ...overrideRec,
81
+ };
82
+ const overrideLink = asRecord(overrideRec.link);
83
+ if (base?.link && overrideLink) {
84
+ merged.link = { ...base.link, ...overrideLink };
85
+ }
86
+ return normalizePersistency(merged);
87
+ }
88
+ /** Apply a run/work/job persistency override onto a resolved graph contract. */
89
+ export function applyGraphRunContractOverride(contract, persistencyOverride) {
90
+ return {
91
+ ...contract,
92
+ persistency: mergeRawPersistency(contract.persistency, persistencyOverride),
93
+ };
94
+ }
95
+ function readPersistency(graph) {
96
+ const response = asRecord(graph.response);
97
+ const fromResponse = asRecord(response?.persistency);
98
+ if (fromResponse) {
99
+ return normalizePersistency(fromResponse);
100
+ }
101
+ const metadata = asRecord(graph.metadata);
102
+ const graphResponse = asRecord(metadata?.graphResponse);
103
+ const legacy = asRecord(graphResponse?.persistency);
104
+ if (legacy) {
105
+ return normalizePersistency(legacy);
106
+ }
107
+ return null;
108
+ }
109
+ /** Read graph document version from published graph JSON (`version` or `metadata.version`). */
110
+ export function readGraphDocumentVersion(graphDoc) {
111
+ const graph = asRecord(graphDoc) ?? {};
112
+ const metadata = asRecord(graph.metadata);
113
+ if (typeof graph.version === 'string')
114
+ return graph.version;
115
+ if (typeof metadata?.version === 'string')
116
+ return metadata.version;
117
+ return undefined;
118
+ }
119
+ /** Resolve graph-run contract from published graph JSON (GRX-NOTE-001). */
120
+ export function resolveGraphRunContract(graphId, graphDoc) {
121
+ const graph = asRecord(graphDoc) ?? {};
122
+ return {
123
+ graphId,
124
+ persistency: readPersistency(graph),
125
+ graphVersion: readGraphDocumentVersion(graph),
126
+ };
127
+ }
128
+ export async function loadGraphRunContracts(graphIds, graphLoader) {
129
+ return Promise.all(graphIds.map(async (graphId) => resolveGraphRunContract(graphId, await graphLoader.loadGraph(graphId))));
130
+ }
@@ -0,0 +1,2 @@
1
+ /** Default result content type for graph-run persistency. */
2
+ export declare const DEFAULT_GRAPH_RUN_PERSISTENCY_CONTENT_TYPE = "inferences";
@@ -0,0 +1,2 @@
1
+ /** Default result content type for graph-run persistency. */
2
+ export const DEFAULT_GRAPH_RUN_PERSISTENCY_CONTENT_TYPE = 'inferences';
@@ -79,7 +79,7 @@ export type { BuildTaskNodeRunTaskRequestArgs, BuildTaskNodeRunTaskRequestResult
79
79
  /** Re-exported from `@exellix/ai-tasks` — preflight validation without `runTask`. */
80
80
  export { validateRunTaskConfig, validateRunTaskInvoke, analyzeExpectedRunTaskInput, checkExpectedInputAgainstRequest, collectSmartInputValidationIssues, buildRunTaskValidationContext, validateParsedOutput, listTokens, analyzeTemplateResolution, renderSmartInput, extractTokenNamesFromStrings, getSkillTokens, getSkillContent, } from '@exellix/ai-tasks';
81
81
  export type { RunTaskValidationIssue, RunTaskValidationResult, RunTaskInvokeValidationResult, ExpectedRunTaskInputPath, AnalyzeExpectedRunTaskInputResult, ValidateRunTaskInvokeParams, RunTaskTemplateResolver, OutputValidationResult, } from '@exellix/ai-tasks';
82
- export { buildExellixGraphRuntimeObjects, setRuntimeObjectsLastJobId, summarizeRuntimeObjectsForPlayground, EXELLIX_GRAPH_RUNTIME_PACKAGE_NAME, EXELLIX_AI_TASKS_PACKAGE_NAME, } from './runtime/runtimeObjects.js';
82
+ export { buildExellixGraphRuntimeObjects, setRuntimeObjectsLastJobId, summarizeRuntimeObjectsForPlayground, X12I_GRAPH_RUNTIME_PACKAGE_NAME, X12I_AI_TASKS_PACKAGE_NAME, } from './runtime/runtimeObjects.js';
83
83
  export type { ActivixQueryableClient, LogxerQueryableClient, LogxerLogLine, PackageRuntimeObjects, RuntimeObjects, BuildExellixGraphRuntimeObjectsInput, RuntimeObjectsObservabilitySummary, } from './runtime/runtimeObjects.js';
84
84
  export type { GetJobLogsInput, GetJobLogsResult, QueryableLogLine } from '@x12i/logxer';
85
85
  export { assertCanonicalGraphDocument, assertCanonicalTaskNode, getCanonicalGraphDocumentViolations, CANONICAL_GRAPH_TOP_LEVEL_KEYS, } from './runtime/validateCanonicalGraphDocument.js';
@@ -120,5 +120,7 @@ export type { CreatePlaygroundReporterOptions, PlaygroundDebugArtifact, Playgrou
120
120
  export { getNodeScopingQuestion, getNodeMemoryShape, getNodeNarrixDiscovery, fetchNodeScopingData, inspectNode, resolveNodeSkillKey, getGraphNodes, getGraphCatalogs, inspectGraph, collectPredicatePaths, executionMemoryPathTail, executionMemoryTailsMatch, getNodeExecutionMemoryWriteTails, getNodeControlDependencies, getNodeSideEffects, inspectFinalizer, inspectNodeContract, inspectGraphContracts, EXELLIX_VIRTUAL_GRAPH_ENTRY_NODE_ID, EXELLIX_VIRTUAL_GRAPH_RESPONSE_NODE_ID, EXELLIX_VIRTUAL_BOUNDARY_NODE_METADATA_KEY, EXELLIX_VIRTUAL_BOUNDARY_EDGE_FLAG_KEY, getVirtualGraphEntryLayer, getVirtualGraphResponseLayer, materializeVirtualBoundaryDiagram, stripMaterializedVirtualBoundaryDiagram, validateCatalogPlanning, isCatalogBinding, isCatalogRequestEntry, inspectGraphModelSelection, } from './inspection/index.js';
121
121
  export type { GraphModelSelectionInspection, NodeModelSelection, ModelSelectionSource, NodeScopingQuestion, NodeScopeSource, NodeScopeTarget, NodeScopingData, NodeMemoryShape, MemoryPath, NodeNarrixDiscovery, NodeInspection, GraphInspection, NodeIOEdge, GraphCatalogs, CatalogBindingSummary, CatalogPlanningValidationIssue, GraphVirtualIO, GraphVirtualIONode, GraphVirtualIOEdge, GraphVirtualIONodeRole, VirtualGraphEntryLayer, VirtualGraphResponseLayer, MaterializeVirtualBoundaryDiagramOptions, MaterializedVirtualBoundaryDiagram, MaterializedVirtualBoundaryDiagramMeta, InspectNodeContractOptions, LocalSkillKey, NodeExecutionType, FactProvenance, ProvenancedSection, NodeInputBindingEntry, ScopedDataDependency, NodeInputContract, ExecutionMemoryWriteSpec, NodeOutputContract, NodeSideEffects, ControlBranchEntry, NodeControlContract, NodeValidationContract, FinalizerContractInspection, NodeContractInspection, GraphContractsInspection, } from './inspection/index.js';
122
122
  export type { NarrixPreProcessorConfig, NarrixModeKey, NarrixRunInput, NarrixScope, ResolvedNarrixWirePayload, LocalTaskHandler, LocalTaskContext, } from './types/narrix.js';
123
+ export { resolveGraphRunContract, loadGraphRunContracts, readGraphDocumentVersion, parseGraphRunPersistency, mergeGraphRunPersistency, applyGraphRunContractOverride, type GraphRunContract, type GraphRunPersistency, type GraphRunPersistencyLink, } from './contract/graphRunContract.js';
124
+ export { DEFAULT_GRAPH_RUN_PERSISTENCY_CONTENT_TYPE } from './contract/persistencyDefaults.js';
123
125
  export { shutdownMemorixRuntime } from './runtime/localSkills/memorixRuntime.js';
124
126
  export type { ScopedDataReaderConfig, ScopedDataReaderOutput, ScopedDataReaderPackOutput, ScopedAnswerAssemblerConfig, ScopedAnswerAssemblerOutput, ScopedAnswerWriterConfig, ScopedAnswerWriterOutput, } from './runtime/localSkills/index.js';
package/dist/src/index.js CHANGED
@@ -60,7 +60,7 @@ export { runTaskResponseSucceeded } from './runtime/runTaskResponse.js';
60
60
  export { buildTaskNodeRunTaskRequest, validateTaskNodeRunTaskConfig, validateTaskNodeRunTaskInvoke, } from './runtime/taskNodeRunTaskPreflight.js';
61
61
  /** Re-exported from `@exellix/ai-tasks` — preflight validation without `runTask`. */
62
62
  export { validateRunTaskConfig, validateRunTaskInvoke, analyzeExpectedRunTaskInput, checkExpectedInputAgainstRequest, collectSmartInputValidationIssues, buildRunTaskValidationContext, validateParsedOutput, listTokens, analyzeTemplateResolution, renderSmartInput, extractTokenNamesFromStrings, getSkillTokens, getSkillContent, } from '@exellix/ai-tasks';
63
- export { buildExellixGraphRuntimeObjects, setRuntimeObjectsLastJobId, summarizeRuntimeObjectsForPlayground, EXELLIX_GRAPH_RUNTIME_PACKAGE_NAME, EXELLIX_AI_TASKS_PACKAGE_NAME, } from './runtime/runtimeObjects.js';
63
+ export { buildExellixGraphRuntimeObjects, setRuntimeObjectsLastJobId, summarizeRuntimeObjectsForPlayground, X12I_GRAPH_RUNTIME_PACKAGE_NAME, X12I_AI_TASKS_PACKAGE_NAME, } from './runtime/runtimeObjects.js';
64
64
  export { assertCanonicalGraphDocument, assertCanonicalTaskNode, getCanonicalGraphDocumentViolations, CANONICAL_GRAPH_TOP_LEVEL_KEYS, } from './runtime/validateCanonicalGraphDocument.js';
65
65
  export { assertCanonicalGraphRuntimeObject } from './runtime/validateCanonicalGraphRuntime.js';
66
66
  export { GRAPH_ENTRY_STUDIO_ONLY_KEYS, GRAPH_METADATA_STUDIO_ONLY_KEYS, stripGraphModelStudioFields, primaryRuntimeInputFromStudioDocument, getGraphEntryStudioOnlyKeyViolations, getGraphMetadataStudioOnlyKeyViolations, } from './runtime/graphModelStudioSeparation.js';
@@ -88,5 +88,8 @@ export { composeEventEmitters } from './runtime/events.js';
88
88
  export { createPlaygroundReporter } from './playground/index.js';
89
89
  // Graph Inspection API
90
90
  export { getNodeScopingQuestion, getNodeMemoryShape, getNodeNarrixDiscovery, fetchNodeScopingData, inspectNode, resolveNodeSkillKey, getGraphNodes, getGraphCatalogs, inspectGraph, collectPredicatePaths, executionMemoryPathTail, executionMemoryTailsMatch, getNodeExecutionMemoryWriteTails, getNodeControlDependencies, getNodeSideEffects, inspectFinalizer, inspectNodeContract, inspectGraphContracts, EXELLIX_VIRTUAL_GRAPH_ENTRY_NODE_ID, EXELLIX_VIRTUAL_GRAPH_RESPONSE_NODE_ID, EXELLIX_VIRTUAL_BOUNDARY_NODE_METADATA_KEY, EXELLIX_VIRTUAL_BOUNDARY_EDGE_FLAG_KEY, getVirtualGraphEntryLayer, getVirtualGraphResponseLayer, materializeVirtualBoundaryDiagram, stripMaterializedVirtualBoundaryDiagram, validateCatalogPlanning, isCatalogBinding, isCatalogRequestEntry, inspectGraphModelSelection, } from './inspection/index.js';
91
+ // Graph-run contract (GRX-NOTE-001) — persistency intent from published graph JSON
92
+ export { resolveGraphRunContract, loadGraphRunContracts, readGraphDocumentVersion, parseGraphRunPersistency, mergeGraphRunPersistency, applyGraphRunContractOverride, } from './contract/graphRunContract.js';
93
+ export { DEFAULT_GRAPH_RUN_PERSISTENCY_CONTENT_TYPE } from './contract/persistencyDefaults.js';
91
94
  export { shutdownMemorixRuntime } from './runtime/localSkills/memorixRuntime.js';
92
95
  // Web context rendering — consume execution.webContext → markdown for prompts (Layer 04)
@@ -1,4 +1,4 @@
1
- import { EXELLIX_GRAPH_RUNTIME_PACKAGE_NAME } from '../runtime/runtimeObjects.js';
1
+ import { X12I_GRAPH_RUNTIME_PACKAGE_NAME } from '../runtime/runtimeObjects.js';
2
2
  /** Recommended Mongo indexes for exellix-graph Activix streams (see `@x12i/activix` README). */
3
3
  export const ACTIVIX_EXELLIX_RUN_CONTEXT_INDEXES = [
4
4
  { keys: { 'runContext.jobId': 1 } },
@@ -55,5 +55,5 @@ export function buildNodeActivixRunContext(args) {
55
55
  };
56
56
  }
57
57
  export function activixExellixCollectionRegistryOwner() {
58
- return { package: EXELLIX_GRAPH_RUNTIME_PACKAGE_NAME };
58
+ return { package: X12I_GRAPH_RUNTIME_PACKAGE_NAME };
59
59
  }
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Host helpers for execution-matrix style orchestrators (e.g. `@exellix/exellix-runtime`).
2
+ * Host helpers for execution-matrix style orchestrators (e.g. `@x12i/exellix-runtime`).
3
3
  *
4
4
  * Graph-engine does not call matrix claim APIs; the host injects `executeGraph` and supplies
5
5
  * a `{ plan, runtime }` request with per-graph `GraphEntryContract` + seeded
@@ -83,7 +83,7 @@ export declare function buildMatrixJobForGraphRun(input: {
83
83
  export declare function isExecuteGraphResultFailed(result: ExecuteGraphResult): boolean;
84
84
  /**
85
85
  * Creates a long-lived graph runtime and exposes `executeGraph` for injection into matrix claim
86
- * processors (`ProcessMatrixClaimDeps.executeGraph` in `@exellix/exellix-runtime`, etc.).
86
+ * processors (`ProcessMatrixClaimDeps.executeGraph` in `@x12i/exellix-runtime`, etc.).
87
87
  */
88
88
  export declare function createMatrixHostGraphExecutor(options: ExellixGraphRuntimeOptions): {
89
89
  executeGraph: (input: ExecuteGraphInput) => Promise<ExecuteGraphResult>;
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Host helpers for execution-matrix style orchestrators (e.g. `@exellix/exellix-runtime`).
2
+ * Host helpers for execution-matrix style orchestrators (e.g. `@x12i/exellix-runtime`).
3
3
  *
4
4
  * Graph-engine does not call matrix claim APIs; the host injects `executeGraph` and supplies
5
5
  * a `{ plan, runtime }` request with per-graph `GraphEntryContract` + seeded
@@ -92,7 +92,7 @@ export function isExecuteGraphResultFailed(result) {
92
92
  }
93
93
  /**
94
94
  * Creates a long-lived graph runtime and exposes `executeGraph` for injection into matrix claim
95
- * processors (`ProcessMatrixClaimDeps.executeGraph` in `@exellix/exellix-runtime`, etc.).
95
+ * processors (`ProcessMatrixClaimDeps.executeGraph` in `@x12i/exellix-runtime`, etc.).
96
96
  */
97
97
  export function createMatrixHostGraphExecutor(options) {
98
98
  const { executeGraph } = createExellixGraphRuntime(options);
@@ -1,10 +1,10 @@
1
- import { EXELLIX_GRAPH_RUNTIME_PACKAGE_NAME } from './runtimeObjects.js';
1
+ import { X12I_GRAPH_RUNTIME_PACKAGE_NAME } from './runtimeObjects.js';
2
2
  /** Canonical filter key for graph-engine's own log lines. */
3
3
  export const GRAPH_ENGINE_RUNTIME_SERVICE = 'graph-engine';
4
4
  /** Wrapper attribution when graph-engine proxies a downstream Logxer record. */
5
5
  export const GRAPH_ENGINE_PROXY_RUNTIME_IDENTITY = {
6
6
  service: GRAPH_ENGINE_RUNTIME_SERVICE,
7
- libraryPackage: EXELLIX_GRAPH_RUNTIME_PACKAGE_NAME,
7
+ libraryPackage: X12I_GRAPH_RUNTIME_PACKAGE_NAME,
8
8
  };
9
9
  function isRecord(value) {
10
10
  return value != null && typeof value === 'object' && !Array.isArray(value);
@@ -1,6 +1,6 @@
1
1
  const logxer = await import('@x12i/logxer');
2
2
  import { ExellixGraphErrorCode } from '../errors/exellixGraphErrorCodes.js';
3
- import { EXELLIX_GRAPH_RUNTIME_PACKAGE_NAME } from './runtimeObjects.js';
3
+ import { X12I_GRAPH_RUNTIME_PACKAGE_NAME } from './runtimeObjects.js';
4
4
  import { normalizeGraphEngineLogMeta, } from './graphEngineLogMeta.js';
5
5
  export { GRAPH_ENGINE_RUNTIME_SERVICE, GRAPH_ENGINE_PROXY_RUNTIME_IDENTITY, extractOriginRuntimeIdentity, normalizeGraphEngineLogMeta, } from './graphEngineLogMeta.js';
6
6
  /** Env prefix for package-level log level: `GRAPH_ENGINE_LOGS_LEVEL` (canonical). */
@@ -116,7 +116,7 @@ function wrapGraphEngineLogxer(inner) {
116
116
  /** Factory for a graph-engine Logxer instance (logxer 4.5+ stack pass-through). */
117
117
  export function createGraphEngineLogxer(options) {
118
118
  const inner = logxer.createLogxer({
119
- packageName: EXELLIX_GRAPH_RUNTIME_PACKAGE_NAME,
119
+ packageName: X12I_GRAPH_RUNTIME_PACKAGE_NAME,
120
120
  envPrefix: GRAPH_ENGINE_LOGXER_ENV_PREFIX,
121
121
  debugNamespace: 'graph-engine',
122
122
  }, buildGraphEngineLogxerConfig(options?.logging));
@@ -4,9 +4,9 @@
4
4
  */
5
5
  import type { GetJobLogsInput, GetJobLogsResult, QueryableLogLine } from '@x12i/logxer';
6
6
  /** Published npm name of this package (root layer in composed observability). */
7
- export declare const EXELLIX_GRAPH_RUNTIME_PACKAGE_NAME: "@exellix/graph-engine";
7
+ export declare const X12I_GRAPH_RUNTIME_PACKAGE_NAME: "@exellix/graph-engine";
8
8
  /** Task layer package name in {@link RuntimeObjects.packagesRuntimeObjects}. */
9
- export declare const EXELLIX_AI_TASKS_PACKAGE_NAME: "@exellix/ai-tasks";
9
+ export declare const X12I_AI_TASKS_PACKAGE_NAME: "@exellix/ai-tasks";
10
10
  export type ActivixQueryableClient = {
11
11
  getJobActivities(input: {
12
12
  jobId: string;
@@ -43,15 +43,15 @@ export type BuildExellixGraphRuntimeObjectsInput = {
43
43
  graphLogxerClient?: LogxerQueryableClient;
44
44
  /**
45
45
  * Partial subtree from `@exellix/ai-tasks` when that package exports `runtimeObjects`.
46
- * Nested `packagesRuntimeObjects` are appended after the ai-tasks row without overwriting entries.
46
+ * Nested `packagesRuntimeObjects` are appended after the x12i-tasks row without overwriting entries.
47
47
  */
48
48
  aiTasksRuntimeObjects?: Pick<RuntimeObjects, 'activixClient' | 'logxerClient'> & {
49
49
  packagesRuntimeObjects?: PackageRuntimeObjects[];
50
50
  };
51
51
  };
52
52
  /**
53
- * Builds the composed {@link RuntimeObjects} for exellix-graph: graph-level clients at the root,
54
- * then an `@exellix/ai-tasks` package row plus any nested package rows from ai-tasks (flattened as siblings).
53
+ * Builds the composed {@link RuntimeObjects} for x12i-graph: graph-level clients at the root,
54
+ * then an `@exellix/ai-tasks` package row plus any nested package rows from x12i-tasks (flattened as siblings).
55
55
  */
56
56
  export declare function buildExellixGraphRuntimeObjects(input: BuildExellixGraphRuntimeObjectsInput): RuntimeObjects;
57
57
  /**
@@ -1,17 +1,17 @@
1
1
  /** Published npm name of this package (root layer in composed observability). */
2
- export const EXELLIX_GRAPH_RUNTIME_PACKAGE_NAME = '@exellix/graph-engine';
2
+ export const X12I_GRAPH_RUNTIME_PACKAGE_NAME = '@exellix/graph-engine';
3
3
  /** Task layer package name in {@link RuntimeObjects.packagesRuntimeObjects}. */
4
- export const EXELLIX_AI_TASKS_PACKAGE_NAME = '@exellix/ai-tasks';
4
+ export const X12I_AI_TASKS_PACKAGE_NAME = '@exellix/ai-tasks';
5
5
  /**
6
- * Builds the composed {@link RuntimeObjects} for exellix-graph: graph-level clients at the root,
7
- * then an `@exellix/ai-tasks` package row plus any nested package rows from ai-tasks (flattened as siblings).
6
+ * Builds the composed {@link RuntimeObjects} for x12i-graph: graph-level clients at the root,
7
+ * then an `@exellix/ai-tasks` package row plus any nested package rows from x12i-tasks (flattened as siblings).
8
8
  */
9
9
  export function buildExellixGraphRuntimeObjects(input) {
10
10
  const ai = input.aiTasksRuntimeObjects;
11
11
  const tail = [...(ai?.packagesRuntimeObjects ?? [])];
12
12
  const packagesRuntimeObjects = [
13
13
  {
14
- name: EXELLIX_AI_TASKS_PACKAGE_NAME,
14
+ name: X12I_AI_TASKS_PACKAGE_NAME,
15
15
  activixClient: ai?.activixClient,
16
16
  logxerClient: ai?.logxerClient,
17
17
  },
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Optional task metadata aligned with `@x12i/graph-composer` authoring / `reportTaskNodeProtocolGaps`.
2
+ * Optional task metadata aligned with `@exellix/graph-composer` authoring / `reportTaskNodeProtocolGaps`.
3
3
  * Web scope is authored via {@link AiTaskProfileMetadata.webQueryTemplate} (Graphenix 2.7.3+ PRE `webScope` unit).
4
4
  */
5
5
  export type AiTaskProfileInputSynthesis = {
@@ -18,7 +18,7 @@ export type AiTaskProfileInputSynthesis = {
18
18
  };
19
19
  /**
20
20
  * PRE/POST strategies, optional web query template, optional input synthesis for AI task nodes.
21
- * `@x12i/graph-composer` requires `preStrategyKey` / `postStrategyKey` for validated AI nodes.
21
+ * `@exellix/graph-composer` requires `preStrategyKey` / `postStrategyKey` for validated AI nodes.
22
22
  *
23
23
  * **Web scope (Graphenix 2.7.3+):** Non-empty `webQueryTemplate` (or `webQueryTemplates[]`) compiles to a PRE
24
24
  * `webScope` unit; graph-engine does not merge web intent into `taskConfiguration.narrix`.
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Optional task metadata aligned with `@x12i/graph-composer` authoring / `reportTaskNodeProtocolGaps`.
2
+ * Optional task metadata aligned with `@exellix/graph-composer` authoring / `reportTaskNodeProtocolGaps`.
3
3
  * Web scope is authored via {@link AiTaskProfileMetadata.webQueryTemplate} (Graphenix 2.7.3+ PRE `webScope` unit).
4
4
  */
5
5
  export function hasWebScopeAuthoring(profile) {
@@ -1,13 +1,13 @@
1
- # graphs-studio — Graphenix 2.7.3 alignment handoff
2
-
3
- Shipped with **@exellix/graph-engine@8.6.0** / **@exellix/graph-composer@2.12.0**.
4
-
5
- Full checklist: see Exellix monorepo `docs/handoff/graphs-studio-graphenix-2.7.3.md` (canonical copy). Summary:
6
-
7
- 1. **Web scope:** `taskConfiguration.aiTaskProfile.webQueryTemplate` — remove `webScoping` and narrix web keys.
8
- 2. **Graph entry:** no `graphEntry.inputs` (CR-006); use `requiredExecutionPaths` + jobs-ui data sources.
9
- 3. **Persistency:** `response.persistency` with `newRecord` + optional `link` (Graphenix 2.7.3).
10
- 4. **Preflight:** show `nodePlan.invokeContract.pipeline`, not root `RunTaskRequest.narrix`.
11
- 5. **CRS-FRS-005:** PRE synthesis export parity still pending in studio (separate track).
12
-
13
- Pin: `graph-engine ^8.6.0`, `graph-composer ^2.12.0`, `ai-tasks ^10.0.12+`, `graphenix ^2.7.3`.
1
+ # graphs-studio — Graphenix 2.7.3 alignment handoff
2
+
3
+ Shipped with **@exellix/graph-engine@8.6.0** / **@exellix/graph-composer@2.12.0**.
4
+
5
+ Full checklist: see Exellix monorepo `docs/handoff/graphs-studio-graphenix-2.7.3.md` (canonical copy). Summary:
6
+
7
+ 1. **Web scope:** `taskConfiguration.aiTaskProfile.webQueryTemplate` — remove `webScoping` and narrix web keys.
8
+ 2. **Graph entry:** no `graphEntry.inputs` (CR-006); use `requiredExecutionPaths` + jobs-ui data sources.
9
+ 3. **Persistency:** `response.persistency` with `newRecord` + optional `link` (Graphenix 2.7.3).
10
+ 4. **Preflight:** show `nodePlan.invokeContract.pipeline`, not root `RunTaskRequest.narrix`.
11
+ 5. **CRS-FRS-005:** PRE synthesis export parity still pending in studio (separate track).
12
+
13
+ Pin: `graph-engine ^8.6.0`, `graph-composer ^2.12.0`, `ai-tasks ^10.0.12+`, `graphenix ^2.7.3`.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@exellix/graph-engine",
3
- "version": "8.6.0",
3
+ "version": "8.7.0",
4
4
  "type": "module",
5
5
  "description": "Graph executor SDK",
6
6
  "main": "dist/src/index.js",
@@ -27,7 +27,7 @@
27
27
  "prebuild": "node scripts/clean-dist.mjs",
28
28
  "build": "tsc",
29
29
  "test": "npm run build && npm run check:no-legacy && tsx --test --test-force-exit --test-timeout=180000 --test-concurrency=2 tests/model-alias-canonical.test.ts tests/model-alias-execute.test.ts tests/model-alias-strategy.test.ts tests/model-alias-subnets.test.ts tests/ai-tasks-error-propagation.test.ts tests/reports-fixtures-pre-synthesis.test.ts tests/passthrough-parity.test.ts tests/step-retry-llm-call.test.ts tests/run-log-diagnostics.test.ts",
30
- "test:full": "npm run build && npm run check:no-legacy && tsx --test --test-force-exit --test-timeout=180000 --test-concurrency=2 tests/graph-engine.test.ts tests/passthrough-parity.test.ts tests/task-node-run-task-preflight.test.ts tests/reports-fixtures-pre-synthesis.test.ts tests/model-alias-canonical.test.ts tests/model-alias-execute.test.ts tests/model-alias-strategy.test.ts tests/model-alias-subnets.test.ts tests/compile-host-patches.test.ts tests/reference-fixtures-compile.test.ts tests/step-retry-llm-call.test.ts",
30
+ "test:full": "npm run build && npm run check:no-legacy && tsx --test --test-force-exit --test-timeout=180000 --test-concurrency=2 tests/graph-engine.test.ts tests/graph-run-contract.test.ts tests/passthrough-parity.test.ts tests/task-node-run-task-preflight.test.ts tests/reports-fixtures-pre-synthesis.test.ts tests/model-alias-canonical.test.ts tests/model-alias-execute.test.ts tests/model-alias-strategy.test.ts tests/model-alias-subnets.test.ts tests/compile-host-patches.test.ts tests/reference-fixtures-compile.test.ts tests/step-retry-llm-call.test.ts",
31
31
  "test:live": "npm run run:pre-synthesis",
32
32
  "test:subnets-graph-fixture": "npm run build && node --test tests/subnets-graph.fixture.test.mjs",
33
33
  "test:subnets-graph-live": "npm run build && node --env-file=.env --test tests/subnets-graph.live.test.mjs",
@@ -46,7 +46,8 @@
46
46
  "license": "exellix-license",
47
47
  "repository": {
48
48
  "type": "git",
49
- "url": "git@github.com:exellix/graph-engine.git"
49
+ "url": "git+ssh://git@github.com/exellix/exellix-engine-mono-repo.git",
50
+ "directory": "graph-engine"
50
51
  },
51
52
  "publishConfig": {
52
53
  "registry": "https://registry.npmjs.org/",
@@ -57,23 +58,23 @@
57
58
  "@exellix/ai-tasks": "^10.0.13",
58
59
  "@x12i/activix": "^8.6.3",
59
60
  "@x12i/catalox": "^5.9.8",
60
- "@x12i/env": "^4.0.1",
61
+ "@x12i/env": "^4.0.3",
61
62
  "@x12i/funcx": "^4.9.13",
62
63
  "@x12i/graphenix": "^2.5.0",
63
- "@x12i/graphenix-authoring-format": "^2.7.3",
64
- "@x12i/graphenix-core": "^2.7.3",
65
- "@x12i/graphenix-executable-contracts": "^2.7.3",
66
- "@x12i/graphenix-executable-format": "^2.7.3",
67
- "@x12i/graphenix-execute-envelope": "^2.7.3",
64
+ "@x12i/graphenix-authoring-format": "^2.8.1",
65
+ "@x12i/graphenix-core": "^2.8.1",
66
+ "@x12i/graphenix-executable-contracts": "^2.8.1",
67
+ "@x12i/graphenix-executable-format": "^2.8.1",
68
+ "@x12i/graphenix-execute-envelope": "^2.8.1",
68
69
  "@x12i/graphenix-format": "^2.0.0",
69
- "@x12i/graphenix-plan-compiler": "^2.7.3",
70
- "@x12i/graphenix-plan-format": "^2.7.3",
71
- "@x12i/graphenix-task-node-format": "^2.7.3",
72
- "@x12i/graphenix-trace-format": "^2.7.3",
70
+ "@x12i/graphenix-plan-compiler": "^2.8.1",
71
+ "@x12i/graphenix-plan-format": "^2.8.1",
72
+ "@x12i/graphenix-task-node-format": "^2.8.1",
73
+ "@x12i/graphenix-trace-format": "^2.8.1",
73
74
  "@x12i/logxer": "^4.6.0",
74
- "@x12i/memorix-descriptors": "1.10.0",
75
- "@x12i/memorix-retrieval": "1.14.0",
76
- "@x12i/memorix-writer": "1.3.0",
75
+ "@x12i/memorix-descriptors": "^1.10.0",
76
+ "@x12i/memorix-retrieval": "^1.15.0",
77
+ "@x12i/memorix-writer": "^1.3.0",
77
78
  "@x12i/rendrix": "^4.3.0",
78
79
  "@x12i/runx": "^1.3.2"
79
80
  },