@exellix/graph-composer 2.15.2 → 2.16.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/CHANGELOG.md CHANGED
@@ -1,5 +1,22 @@
1
1
  # Changelog
2
2
 
3
+ ## 2.16.1 — Web synthesis alignment (graph-engine 9.3.1 / ai-tasks 10.4.1)
4
+
5
+ ### Changed
6
+
7
+ - **`@exellix/graph-engine` ^9.3.1** — `webSynthesis` host patch emits `pipelinePhase`; plan validated after host patches.
8
+ - **Peer/dev pins:** `@exellix/ai-tasks` **^10.4.1** (unchanged from 2.16.0 intent).
9
+ - **Docs:** `task-node-execution-protocol.md` — `pipelinePhase` compiled unit example for `webSynthesis`.
10
+
11
+ ## 2.16.0 — Input synthesis sources + graph-engine 9.3.0
12
+
13
+ ### Changed
14
+
15
+ - **`@exellix/graph-engine` ^9.3.0** — native Graphenix `inputSources` compile path.
16
+ - **Peer/dev pins:** `@exellix/ai-tasks` **^10.3.0**, `@exellix/ai-skills` **^6.14.0**.
17
+ - **Prompts:** `structural-validation.md`, `judge-rules.md` — `inputSources` read-scope rules.
18
+ - **Docs:** `task-node-execution-protocol.md`, `worox-graph.md` — `synthesizedInput` runtime row.
19
+
3
20
  ## 2.15.2 — Logxer 5.1.0 + graph-engine 9.2.4
4
21
 
5
22
  ### Changed
@@ -7,6 +7,8 @@ export type WebQueryTemplateConfig = {
7
7
  webQueryTemplate?: string;
8
8
  webQueryTemplates?: string[];
9
9
  webScopeOptions?: Record<string, unknown>;
10
+ /** Model/profile for web-only synthesis; inactive when absent, empty, or `"off"`. */
11
+ webSynthesizerModel?: string | null;
10
12
  };
11
13
  export type InputSynthesisDestination = "job" | "task" | "execution";
12
14
  /**
@@ -31,8 +33,13 @@ export type InputSynthesisNodeConfig = {
31
33
  destination?: InputSynthesisDestination;
32
34
  /** Non-empty when `enabled` is true. */
33
35
  outputKey?: string;
34
- /** Non-empty memory paths when `enabled` is true. */
36
+ /** Non-empty memory paths when `enabled` is true (advanced / legacy). */
35
37
  sources?: string[];
38
+ /**
39
+ * Semantic PRE input selectors: `input`, `jobMemory`, `jobMemory.context` (one or more).
40
+ * When set, drives synthesizedInput vs synthesizedContext write targets.
41
+ */
42
+ inputSources?: string[];
36
43
  /** Optional extra hint for ai-tasks templates (not validated by graph-composer). */
37
44
  mode?: string;
38
45
  };
@@ -47,11 +54,12 @@ export type AiTaskProfileMetadata = {
47
54
  webQueryTemplate?: string;
48
55
  webQueryTemplates?: string[];
49
56
  webScopeOptions?: Record<string, unknown>;
57
+ webSynthesizerModel?: string | null;
50
58
  inputSynthesis?: InputSynthesisNodeConfig;
51
59
  };
52
60
  /** Built-in worox-graph local skills — no aiTaskProfile required. */
53
61
  export declare const DEFAULT_LOCAL_SKILL_KEYS: readonly string[];
54
- export type TaskNodeProtocolIssueCode = "missing_preStrategyKey" | "missing_postStrategyKey" | "legacy_web_scoping" | "web_query_template_invalid" | "synthesis_enabled_without_catalogId" | "synthesis_enabled_without_strategyKey" | "synthesis_enabled_without_outputKey" | "synthesis_enabled_without_sources" | "synthesis_enabled_without_destination" | "synthesis_pipeline_conflict";
62
+ export type TaskNodeProtocolIssueCode = "missing_preStrategyKey" | "missing_postStrategyKey" | "legacy_web_scoping" | "web_query_template_invalid" | "web_synthesizer_model_invalid" | "synthesis_enabled_without_catalogId" | "synthesis_enabled_without_strategyKey" | "synthesis_enabled_without_outputKey" | "synthesis_enabled_without_sources" | "synthesis_enabled_without_inputSources_or_sources" | "synthesis_enabled_without_destination" | "synthesis_pipeline_conflict";
55
63
  export type TaskNodeProtocolGap = {
56
64
  nodeId: string;
57
65
  skillKey: string;
@@ -1 +1 @@
1
- {"version":3,"file":"aiTaskProfile.d.ts","sourceRoot":"","sources":["../src/aiTaskProfile.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD;;;GAGG;AACH,MAAM,MAAM,sBAAsB,GAAG;IACnC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7B,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC3C,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG,KAAK,GAAG,MAAM,GAAG,WAAW,CAAC;AAErE;;;GAGG;AACH,MAAM,MAAM,wBAAwB,GAAG;IACrC,OAAO,EAAE,OAAO,CAAC;IACjB;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,wFAAwF;IACxF,WAAW,CAAC,EAAE,yBAAyB,CAAC;IACxC,wCAAwC;IACxC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qDAAqD;IACrD,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,oFAAoF;IACpF,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF;;;;GAIG;AACH,MAAM,MAAM,qBAAqB,GAAG;IAClC,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7B,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC1C,cAAc,CAAC,EAAE,wBAAwB,CAAC;CAC3C,CAAC;AAEF,qEAAqE;AACrE,eAAO,MAAM,wBAAwB,EAAE,SAAS,MAAM,EAK5C,CAAC;AAEX,MAAM,MAAM,yBAAyB,GACjC,wBAAwB,GACxB,yBAAyB,GACzB,oBAAoB,GACpB,4BAA4B,GAC5B,qCAAqC,GACrC,uCAAuC,GACvC,qCAAqC,GACrC,mCAAmC,GACnC,uCAAuC,GACvC,6BAA6B,CAAC;AAElC,MAAM,MAAM,mBAAmB,GAAG;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,yBAAyB,EAAE,CAAC;CACrC,CAAC;AAkIF;;;GAGG;AACH,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE;IACR,aAAa,CAAC,EAAE,eAAe,EAAE,CAAC;IAClC,mBAAmB,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;CACxC,GACA,mBAAmB,EAAE,CA0EvB"}
1
+ {"version":3,"file":"aiTaskProfile.d.ts","sourceRoot":"","sources":["../src/aiTaskProfile.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD;;;GAGG;AACH,MAAM,MAAM,sBAAsB,GAAG;IACnC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7B,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC1C,qFAAqF;IACrF,mBAAmB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACrC,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG,KAAK,GAAG,MAAM,GAAG,WAAW,CAAC;AAErE;;;GAGG;AACH,MAAM,MAAM,wBAAwB,GAAG;IACrC,OAAO,EAAE,OAAO,CAAC;IACjB;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,wFAAwF;IACxF,WAAW,CAAC,EAAE,yBAAyB,CAAC;IACxC,wCAAwC;IACxC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,yEAAyE;IACzE,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,oFAAoF;IACpF,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF;;;;GAIG;AACH,MAAM,MAAM,qBAAqB,GAAG;IAClC,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7B,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC1C,mBAAmB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,cAAc,CAAC,EAAE,wBAAwB,CAAC;CAC3C,CAAC;AAEF,qEAAqE;AACrE,eAAO,MAAM,wBAAwB,EAAE,SAAS,MAAM,EAK5C,CAAC;AAEX,MAAM,MAAM,yBAAyB,GACjC,wBAAwB,GACxB,yBAAyB,GACzB,oBAAoB,GACpB,4BAA4B,GAC5B,+BAA+B,GAC/B,qCAAqC,GACrC,uCAAuC,GACvC,qCAAqC,GACrC,mCAAmC,GACnC,mDAAmD,GACnD,uCAAuC,GACvC,6BAA6B,CAAC;AAElC,MAAM,MAAM,mBAAmB,GAAG;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,yBAAyB,EAAE,CAAC;CACrC,CAAC;AAqJF;;;GAGG;AACH,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE;IACR,aAAa,CAAC,EAAE,eAAe,EAAE,CAAC;IAClC,mBAAmB,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;CACxC,GACA,mBAAmB,EAAE,CA4FvB"}
@@ -34,6 +34,20 @@ function readAiTaskProfileFromRecord(container) {
34
34
  const webQueryTemplates = Array.isArray(qraw)
35
35
  ? qraw.filter((x) => nonEmptyString(x)).map((s) => s.trim())
36
36
  : undefined;
37
+ const wsmRaw = p.webSynthesizerModel;
38
+ let webSynthesizerModel;
39
+ if (!("webSynthesizerModel" in p)) {
40
+ webSynthesizerModel = undefined;
41
+ }
42
+ else if (wsmRaw === null) {
43
+ webSynthesizerModel = null;
44
+ }
45
+ else if (typeof wsmRaw === "string") {
46
+ webSynthesizerModel = wsmRaw;
47
+ }
48
+ else {
49
+ webSynthesizerModel = undefined;
50
+ }
37
51
  const synRaw = readRecord(p.inputSynthesis);
38
52
  let synthesis;
39
53
  if (synRaw !== undefined) {
@@ -57,6 +71,10 @@ function readAiTaskProfileFromRecord(container) {
57
71
  const sources = Array.isArray(sourcesRaw)
58
72
  ? sourcesRaw.filter((x) => nonEmptyString(x)).map((s) => s.trim())
59
73
  : undefined;
74
+ const inputSourcesRaw = synRaw.inputSources;
75
+ const inputSources = Array.isArray(inputSourcesRaw)
76
+ ? inputSourcesRaw.filter((x) => nonEmptyString(x)).map((s) => s.trim())
77
+ : undefined;
60
78
  synthesis = {
61
79
  enabled,
62
80
  ...(catalogId !== undefined ? { catalogId } : {}),
@@ -64,6 +82,7 @@ function readAiTaskProfileFromRecord(container) {
64
82
  ...(outputKey !== undefined ? { outputKey } : {}),
65
83
  ...(destination !== undefined ? { destination } : {}),
66
84
  ...(sources !== undefined && sources.length > 0 ? { sources } : {}),
85
+ ...(inputSources !== undefined && inputSources.length > 0 ? { inputSources } : {}),
67
86
  ...(mode !== undefined ? { mode } : {}),
68
87
  };
69
88
  }
@@ -75,6 +94,7 @@ function readAiTaskProfileFromRecord(container) {
75
94
  ? { webQueryTemplates }
76
95
  : {}),
77
96
  ...(legacyWebScoping ? { legacyWebScoping: true } : {}),
97
+ ...("webSynthesizerModel" in p ? { webSynthesizerModel } : {}),
78
98
  ...(synthesis !== undefined ? { synthesis } : {}),
79
99
  };
80
100
  }
@@ -159,6 +179,20 @@ export function reportTaskNodeProtocolGaps(graph, options) {
159
179
  webQueryTemplate === "input.question") {
160
180
  issues.push("web_query_template_invalid");
161
181
  }
182
+ const tcProfile = readRecord(taskConfiguration)?.aiTaskProfile;
183
+ const metaProfile = readRecord(meta)?.aiTaskProfile;
184
+ for (const rawProfile of [tcProfile, metaProfile]) {
185
+ const pr = readRecord(rawProfile);
186
+ if (pr === undefined)
187
+ continue;
188
+ if ("webSynthesizerModel" in pr &&
189
+ pr.webSynthesizerModel !== undefined &&
190
+ pr.webSynthesizerModel !== null &&
191
+ typeof pr.webSynthesizerModel !== "string") {
192
+ issues.push("web_synthesizer_model_invalid");
193
+ break;
194
+ }
195
+ }
162
196
  if (synthesis?.enabled === true) {
163
197
  if (!nonEmptyString(synthesis.catalogId)) {
164
198
  issues.push("synthesis_enabled_without_catalogId");
@@ -169,8 +203,10 @@ export function reportTaskNodeProtocolGaps(graph, options) {
169
203
  if (!nonEmptyString(synthesis.outputKey)) {
170
204
  issues.push("synthesis_enabled_without_outputKey");
171
205
  }
172
- if (!synthesis.sources || synthesis.sources.length === 0) {
173
- issues.push("synthesis_enabled_without_sources");
206
+ const hasSources = (synthesis.sources?.length ?? 0) > 0;
207
+ const hasInputSources = (synthesis.inputSources?.length ?? 0) > 0;
208
+ if (!hasSources && !hasInputSources) {
209
+ issues.push("synthesis_enabled_without_inputSources_or_sources");
174
210
  }
175
211
  if (synthesis.destination === undefined) {
176
212
  issues.push("synthesis_enabled_without_destination");
@@ -1 +1 @@
1
- {"version":3,"file":"graphComposerOutputValidation.d.ts","sourceRoot":"","sources":["../src/graphComposerOutputValidation.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,kBAAkB,EAAwB,MAAM,YAAY,CAAC;AAE3E,mHAAmH;AACnH,MAAM,MAAM,uBAAuB,GAAG;IACpC,KAAK,CAAC,EAAE,kBAAkB,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG,CAC5B,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5B,GAAG,CAAC,EAAE,uBAAuB,KAC1B,IAAI,CAAC;AAEV,OAAO,EACL,sCAAsC,EACtC,uCAAuC,EACvC,yCAAyC,EACzC,qCAAqC,EACrC,qCAAqC,EACrC,2CAA2C,GAC5C,MAAM,iCAAiC,CAAC;AAuBzC,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5B,IAAI,CAAC,EAAE,uBAAuB,GAC7B,IAAI,CAIN;AAwYD,wBAAgB,2BAA2B,CACzC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5B,IAAI,CAAC,EAAE,uBAAuB,GAC7B,IAAI,CAwGN;AAED;;;;GAIG;AACH,wBAAgB,uCAAuC,CACrD,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5B,KAAK,EAAE;IAAE,aAAa,CAAC,EAAE,OAAO,CAAA;CAAE,GACjC,IAAI,CAqCN;AAuBD,wBAAgB,4BAA4B,CAC1C,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5B,IAAI,CAAC,EAAE,uBAAuB,GAC7B,IAAI,CAmBN;AAsBD,wBAAgB,0BAA0B,CACxC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5B,GAAG,CAAC,EAAE,uBAAuB,GAC5B,IAAI,CA+BN;AAmBD,wBAAgB,sCAAsC,CACpD,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5B,IAAI,CAAC,EAAE,uBAAuB,GAC7B,IAAI,CAkDN;AAED,wBAAgB,qCAAqC,CACnD,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5B,IAAI,CAAC,EAAE,uBAAuB,GAC7B,IAAI,CAiCN;AAUD,wBAAgB,qCAAqC,CACnD,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5B,IAAI,CAAC,EAAE,uBAAuB,GAC7B,IAAI,CAwDN;AAED,wBAAgB,uCAAuC,CACrD,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5B,IAAI,CAAC,EAAE,uBAAuB,GAC7B,IAAI,CAwDN"}
1
+ {"version":3,"file":"graphComposerOutputValidation.d.ts","sourceRoot":"","sources":["../src/graphComposerOutputValidation.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,kBAAkB,EAAwB,MAAM,YAAY,CAAC;AAE3E,mHAAmH;AACnH,MAAM,MAAM,uBAAuB,GAAG;IACpC,KAAK,CAAC,EAAE,kBAAkB,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG,CAC5B,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5B,GAAG,CAAC,EAAE,uBAAuB,KAC1B,IAAI,CAAC;AAEV,OAAO,EACL,sCAAsC,EACtC,uCAAuC,EACvC,yCAAyC,EACzC,qCAAqC,EACrC,qCAAqC,EACrC,2CAA2C,GAC5C,MAAM,iCAAiC,CAAC;AAuBzC,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5B,IAAI,CAAC,EAAE,uBAAuB,GAC7B,IAAI,CAIN;AA+YD,wBAAgB,2BAA2B,CACzC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5B,IAAI,CAAC,EAAE,uBAAuB,GAC7B,IAAI,CAwGN;AAED;;;;GAIG;AACH,wBAAgB,uCAAuC,CACrD,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5B,KAAK,EAAE;IAAE,aAAa,CAAC,EAAE,OAAO,CAAA;CAAE,GACjC,IAAI,CAqCN;AAuBD,wBAAgB,4BAA4B,CAC1C,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5B,IAAI,CAAC,EAAE,uBAAuB,GAC7B,IAAI,CAmBN;AAsBD,wBAAgB,0BAA0B,CACxC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5B,GAAG,CAAC,EAAE,uBAAuB,GAC5B,IAAI,CA+BN;AAmBD,wBAAgB,sCAAsC,CACpD,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5B,IAAI,CAAC,EAAE,uBAAuB,GAC7B,IAAI,CAkDN;AAED,wBAAgB,qCAAqC,CACnD,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5B,IAAI,CAAC,EAAE,uBAAuB,GAC7B,IAAI,CAiCN;AAUD,wBAAgB,qCAAqC,CACnD,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5B,IAAI,CAAC,EAAE,uBAAuB,GAC7B,IAAI,CAwDN;AAED,wBAAgB,uCAAuC,CACrD,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5B,IAAI,CAAC,EAAE,uBAAuB,GAC7B,IAAI,CAwDN"}
@@ -237,6 +237,11 @@ function validateReviewConceptCoreTaskPatchItem(t, ctxPrefix) {
237
237
  throw new Error(`${ctxPrefix}.webQueryTemplate must be a non-empty string when present`);
238
238
  }
239
239
  }
240
+ if ("webSynthesizerModel" in t && t.webSynthesizerModel !== undefined && t.webSynthesizerModel !== null) {
241
+ if (typeof t.webSynthesizerModel !== "string") {
242
+ throw new Error(`${ctxPrefix}.webSynthesizerModel must be a string, null, or omitted when present`);
243
+ }
244
+ }
240
245
  if ("synthesis" in t && t.synthesis !== undefined) {
241
246
  const syn = t.synthesis;
242
247
  if (syn === null || typeof syn !== "object" || Array.isArray(syn)) {
@@ -1,5 +1,5 @@
1
1
  /** Precedence layer ids (lowest number = wins when present). Matches @exellix/graph-engine 7.2. */
2
- export type GraphModelLayerSource = "runtime.nodes.modelConfig" | "node.taskConfiguration.modelConfig" | "runtime.modelConfig" | "graph.modelConfig" | "graph-engine.default";
2
+ export type GraphModelLayerSource = "runtime.nodes.modelConfig" | "node.taskConfiguration.modelConfig" | "runtime.modelConfig" | "graph.modelConfig" | "modelConfig.incomplete";
3
3
  export type GraphModelLayerPhase = "preActionModel" | "skillModel" | "postActionModel";
4
4
  /** Same three slots as `GraphAiModelConfig` in @exellix/graph-engine (profile names or concrete ids). */
5
5
  export type GraphModelProfilesTriple = {
@@ -27,15 +27,17 @@ export type GraphModelLayerStackEntry = {
27
27
  export type NodeGraphModelLayers = {
28
28
  nodeId: string;
29
29
  skillKey: string;
30
- winning: Pick<GraphModelLayerStackEntry, "source" | "sourcePath" | "layerColor" | "layerOrder" | "profiles" | "providerIds">;
30
+ winning: Pick<GraphModelLayerStackEntry, "source" | "sourcePath" | "layerColor" | "layerOrder" | "providerIds"> & {
31
+ profiles?: GraphModelProfilesTriple;
32
+ };
31
33
  /** All declared tiers on this graph/run (map layers), highest precedence first. */
32
34
  stack: GraphModelLayerStackEntry[];
33
35
  };
34
36
  export type GraphModelLayersAnalysis = {
35
37
  analyzedAt: string;
36
- /** False when `runtime` was omitted — analysis reflects model JSON + engine default only. */
38
+ /** False when `runtime` was omitted — analysis reflects model JSON only. */
37
39
  runtimeIncluded: boolean;
38
- graphDefaultProfiles: GraphModelProfilesTriple;
40
+ graphDefaultProfiles?: GraphModelProfilesTriple;
39
41
  graphDefaultProviderIds?: GraphModelProfilesTriple;
40
42
  nodes: NodeGraphModelLayers[];
41
43
  };
@@ -1 +1 @@
1
- {"version":3,"file":"graphModelLayers.d.ts","sourceRoot":"","sources":["../src/graphModelLayers.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"graphModelLayers.d.ts","sourceRoot":"","sources":["../src/graphModelLayers.ts"],"names":[],"mappings":"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"}
@@ -2,7 +2,7 @@
2
2
  * Model resolution map for worox graphs: which graph-engine profile names apply per AI node,
3
3
  * which precedence layer wins — without registry resolution (execute-time owns provider ids).
4
4
  */
5
- import { DEFAULT_GRAPH_AI_MODEL_PROFILE_CONFIG, isGraphAiModelConfig, isModelConfigSelection, looksLikeConcreteModelId, resolveGraphAiModelConfig, } from "./graphEngineBridge.js";
5
+ import { isGraphAiModelConfig, isModelConfigSelection, looksLikeConcreteModelId, resolveGraphAiModelConfig, } from "./graphEngineBridge.js";
6
6
  import { DEFAULT_LOCAL_SKILL_KEYS } from "./aiTaskProfile.js";
7
7
  const LAYER_META = {
8
8
  "runtime.nodes.modelConfig": {
@@ -25,10 +25,10 @@ const LAYER_META = {
25
25
  layerColor: "#2563eb",
26
26
  label: "graph default model",
27
27
  },
28
- "graph-engine.default": {
28
+ "modelConfig.incomplete": {
29
29
  layerOrder: 5,
30
30
  layerColor: "#6b7280",
31
- label: "engine default (@exellix/graph-engine)",
31
+ label: "modelConfig incomplete (execute will fail)",
32
32
  },
33
33
  };
34
34
  /** Distinct accent per profile name for MAIN slot badges in UIs. */
@@ -135,9 +135,8 @@ async function resolveWinningTier(tiers) {
135
135
  }
136
136
  }
137
137
  return {
138
- source: "graph-engine.default",
139
- sourcePath: "@exellix/graph-engine DEFAULT_GRAPH_AI_MODEL_PROFILE_CONFIG",
140
- profiles: { ...DEFAULT_GRAPH_AI_MODEL_PROFILE_CONFIG },
138
+ source: "modelConfig.incomplete",
139
+ sourcePath: "graph.modelConfig / node.taskConfiguration.modelConfig",
141
140
  };
142
141
  }
143
142
  /**
@@ -155,19 +154,21 @@ export async function analyzeGraphModelLayers(graph, options) {
155
154
  const runtimeIncluded = runtime !== undefined;
156
155
  const locals = localSkillKeys(options);
157
156
  const graphTier = describeModelConfigTier(g.modelConfig, "graph.modelConfig");
158
- const graphDefaultProfiles = graphTier.profiles ?? { ...DEFAULT_GRAPH_AI_MODEL_PROFILE_CONFIG };
159
- const normalizedGraphDefault = await normalizeProfilesTriple(graphDefaultProfiles, {
160
- graphId,
161
- });
162
- const graphDefaultProviderIds = providerIdsFromConcreteSlots(normalizedGraphDefault);
157
+ const graphDefaultProfiles = graphTier.profiles;
158
+ const normalizedGraphDefault = graphDefaultProfiles != null
159
+ ? await normalizeProfilesTriple(graphDefaultProfiles, { graphId })
160
+ : undefined;
161
+ const graphDefaultProviderIds = normalizedGraphDefault != null
162
+ ? providerIdsFromConcreteSlots(normalizedGraphDefault)
163
+ : undefined;
163
164
  const nodes = [];
164
165
  const nodeList = g.nodes;
165
166
  if (!Array.isArray(nodeList)) {
166
167
  return {
167
168
  analyzedAt: new Date().toISOString(),
168
169
  runtimeIncluded,
169
- graphDefaultProfiles: normalizedGraphDefault,
170
- graphDefaultProviderIds,
170
+ ...(normalizedGraphDefault != null ? { graphDefaultProfiles: normalizedGraphDefault } : {}),
171
+ ...(graphDefaultProviderIds !== undefined ? { graphDefaultProviderIds } : {}),
171
172
  nodes,
172
173
  };
173
174
  }
@@ -214,11 +215,10 @@ export async function analyzeGraphModelLayers(graph, options) {
214
215
  });
215
216
  }
216
217
  const winning = await resolveWinningTier(tiers);
217
- const winningProfiles = await normalizeProfilesTriple(winning.profiles, {
218
- graphId,
219
- nodeId,
220
- });
221
- const winningProviderIds = providerIdsFromConcreteSlots(winningProfiles);
218
+ const winningProfiles = winning.profiles != null
219
+ ? await normalizeProfilesTriple(winning.profiles, { graphId, nodeId })
220
+ : undefined;
221
+ const winningProviderIds = winningProfiles != null ? providerIdsFromConcreteSlots(winningProfiles) : undefined;
222
222
  const stack = [];
223
223
  const pushTier = async (tier) => {
224
224
  const described = describeModelConfigTier(tier.value, tier.basePath);
@@ -236,12 +236,19 @@ export async function analyzeGraphModelLayers(graph, options) {
236
236
  for (const tier of tiers) {
237
237
  await pushTier(tier);
238
238
  }
239
- const defaultProfiles = await normalizeProfilesTriple(DEFAULT_GRAPH_AI_MODEL_PROFILE_CONFIG, { graphId, nodeId });
240
- const defaultEntry = buildStackEntry("graph-engine.default", "@exellix/graph-engine DEFAULT_GRAPH_AI_MODEL_PROFILE_CONFIG", defaultProfiles, winning.source === "graph-engine.default", tiers.length === 0
241
- ? "no modelConfig on graph or node — engine default applies"
242
- : undefined, providerIdsFromConcreteSlots(defaultProfiles));
243
- if (defaultEntry !== undefined) {
244
- stack.push(defaultEntry);
239
+ if (winning.source === "modelConfig.incomplete") {
240
+ const meta = LAYER_META["modelConfig.incomplete"];
241
+ stack.push({
242
+ source: "modelConfig.incomplete",
243
+ sourcePath: winning.sourcePath,
244
+ layerColor: meta.layerColor,
245
+ layerOrder: meta.layerOrder,
246
+ active: true,
247
+ profiles: { preActionModel: "—", skillModel: "—", postActionModel: "—" },
248
+ conditionalNote: tiers.length === 0
249
+ ? "no modelConfig on graph or node — declare preActionModel, skillModel, postActionModel"
250
+ : "declared modelConfig cases are incomplete — all three slots required at execute",
251
+ });
245
252
  }
246
253
  stack.sort((a, b) => a.layerOrder - b.layerOrder);
247
254
  nodes.push({
@@ -252,7 +259,7 @@ export async function analyzeGraphModelLayers(graph, options) {
252
259
  sourcePath: winning.sourcePath,
253
260
  layerColor: LAYER_META[winning.source].layerColor,
254
261
  layerOrder: LAYER_META[winning.source].layerOrder,
255
- profiles: winningProfiles,
262
+ ...(winningProfiles != null ? { profiles: winningProfiles } : {}),
256
263
  ...(winningProviderIds !== undefined ? { providerIds: winningProviderIds } : {}),
257
264
  },
258
265
  stack,
@@ -261,8 +268,8 @@ export async function analyzeGraphModelLayers(graph, options) {
261
268
  return {
262
269
  analyzedAt: new Date().toISOString(),
263
270
  runtimeIncluded,
264
- graphDefaultProfiles: normalizedGraphDefault,
265
- graphDefaultProviderIds,
271
+ ...(normalizedGraphDefault != null ? { graphDefaultProfiles: normalizedGraphDefault } : {}),
272
+ ...(graphDefaultProviderIds !== undefined ? { graphDefaultProviderIds } : {}),
266
273
  nodes,
267
274
  };
268
275
  }
@@ -300,13 +307,16 @@ export async function stampGraphModelLayersOnGraph(graph, options) {
300
307
  if (layer === undefined)
301
308
  continue;
302
309
  const meta = { ...readRecord(node.metadata) };
303
- meta.graphModelLayers = {
304
- ...layer,
305
- profileAccents: {
310
+ const profileAccents = layer.winning.profiles != null
311
+ ? {
306
312
  preActionModel: graphModelProfileAccent(layer.winning.profiles.preActionModel),
307
313
  skillModel: graphModelProfileAccent(layer.winning.profiles.skillModel),
308
314
  postActionModel: graphModelProfileAccent(layer.winning.profiles.postActionModel),
309
- },
315
+ }
316
+ : undefined;
317
+ meta.graphModelLayers = {
318
+ ...layer,
319
+ ...(profileAccents != null ? { profileAccents } : {}),
310
320
  legend: graphModelLayerLegend(),
311
321
  };
312
322
  node.metadata = meta;
@@ -316,13 +326,17 @@ export async function stampGraphModelLayersOnGraph(graph, options) {
316
326
  analyzedAt: analysis.analyzedAt,
317
327
  runtimeIncluded: analysis.runtimeIncluded,
318
328
  legend: graphModelLayerLegend(),
319
- graphDefault: {
320
- profiles: analysis.graphDefaultProfiles,
321
- ...(analysis.graphDefaultProviderIds !== undefined
322
- ? { providerIds: analysis.graphDefaultProviderIds }
323
- : {}),
324
- },
325
- note: "Planning overlay only. Profile/choice keys come from graph JSON and graph-engine defaults; concrete provider ids are resolved at execute time by ai-tasks. Runtime model overlays are analysis-only — graph-engine 7.7+ rejects them at execute time.",
329
+ ...(analysis.graphDefaultProfiles != null
330
+ ? {
331
+ graphDefault: {
332
+ profiles: analysis.graphDefaultProfiles,
333
+ ...(analysis.graphDefaultProviderIds !== undefined
334
+ ? { providerIds: analysis.graphDefaultProviderIds }
335
+ : {}),
336
+ },
337
+ }
338
+ : {}),
339
+ note: "Planning overlay only. Profile/choice keys come from graph JSON; concrete provider ids are resolved at execute time by ai-tasks. Missing or partial modelConfig fails at execute — no engine default fill-in. Runtime model overlays are analysis-only — graph-engine 7.7+ rejects them at execute time.",
326
340
  };
327
341
  g.metadata = rootMeta;
328
342
  return graph;
package/dist/types.d.ts CHANGED
@@ -86,6 +86,8 @@ export type GraphConceptCoreTaskPatchItem = {
86
86
  requirements?: GraphConceptRequirementsPatch;
87
87
  /** Rendrix web query template for PRE webScope (Graphenix 2.7.3+). */
88
88
  webQueryTemplate?: string;
89
+ /** Optional model for web-only synthesis; `"off"` or empty disables. */
90
+ webSynthesizerModel?: string | null;
89
91
  synthesis?: Record<string, unknown>;
90
92
  };
91
93
  export type GraphConceptPatch = {
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
@@ -81,6 +81,10 @@
81
81
  "$ref": "#/$defs/GraphConceptRequirementsPatch"
82
82
  },
83
83
  "webQueryTemplate": { "type": "string" },
84
+ "webSynthesizerModel": {
85
+ "description": "Model/profile for web-only synthesis after webScope; omit, empty, or off to disable",
86
+ "anyOf": [{ "type": "string" }, { "type": "null" }]
87
+ },
84
88
  "synthesis": { "type": "object" }
85
89
  }
86
90
  },
@@ -18,7 +18,7 @@ Weighted rules passed to aifunctions-js for scoring model outputs. **Source of t
18
18
  { "rule": "For reviewConcept: when a single requirement value cannot be chosen with confidence, include requirementOptions with ranked candidates and/or catalogProposals or findings with structured proposal — not only free-text findings summaries", "weight": 2 },
19
19
  { "rule": "For create/modify: every AI task node must include taskConfiguration.aiTaskProfile.preStrategyKey and postStrategyKey (non-empty); core skill stays skillKey", "weight": 3 },
20
20
  { "rule": "For create/modify: use inputsConfig (not inputs) on task nodes; executionMapping (not outputMapping) for task result wiring; taskVariable for question and variable refs (jobVariables.* / taskVariables.*)", "weight": 3 },
21
- { "rule": "For create/modify: when web scope is needed, taskConfiguration.aiTaskProfile.webQueryTemplate must be a non-empty Rendrix template; when inputSynthesis.enabled is true, catalogId and strategyKey must be non-empty", "weight": 3 },
21
+ { "rule": "For create/modify: when web scope is needed, taskConfiguration.aiTaskProfile.webQueryTemplate must be a non-empty Rendrix template; optional webSynthesizerModel must be string/null/off when present; when inputSynthesis.enabled is true, catalogId and strategyKey must be non-empty and inputSources and/or sources must declare read scope", "weight": 3 },
22
22
  { "rule": "For create/modify: returned graph must pass offline task-node protocol (pre/post, webQueryTemplate, inputSynthesis) on taskConfiguration.aiTaskProfile", "weight": 3 },
23
23
  { "rule": "In locked mode, no skillKey outside the provided catalog may appear in nodes", "weight": 3 },
24
24
  { "rule": "In extensible mode, every novel skillKey must have a corresponding requiredSkills entry with all required fields", "weight": 2 },
@@ -44,6 +44,7 @@ A graph is a single JSON object. Top-level fields (canonical root keys only):
44
44
  "preStrategyKey": "<pre-strategy-row-id>",
45
45
  "postStrategyKey": "<post-strategy-row-id>",
46
46
  "webQueryTemplate": "Optional Rendrix template, e.g. Patch status for input.cveId (wrap field paths in Rendrix double-brace syntax in real graph JSON)",
47
+ "webSynthesizerModel": "Optional model/profile for web-only synthesis (cheap, pro/default, or off to disable)",
47
48
  "inputSynthesis": { "enabled": false }
48
49
  },
49
50
  "narrix": { "datasetId": "<optional>", "layer": "<optional>" },
@@ -68,7 +69,7 @@ A graph is a single JSON object. Top-level fields (canonical root keys only):
68
69
  | Planning / UX | `metadata.*` | `graphReadability`, `catalogBinding`, `name`, `description` — **not** `aiTaskProfile` or `narrix`. |
69
70
  | Result wiring | `executionMapping` | Writes into execution memory after the task succeeds. |
70
71
 
71
- - **AI task nodes** must include **`taskConfiguration.aiTaskProfile`** with non-empty **`preStrategyKey`** and **`postStrategyKey`** (deployment catalog row ids). Add **`taskConfiguration.narrix`** when discovery applies. Add **`webQueryTemplate`** (and optional **`webScopeOptions`**) / **`inputSynthesis`** under **`aiTaskProfile`** when needed. Do **not** author **`webScoping`**, **`narrix.enableWebScope`**, or **`narrix.webScopeQuestions`**. Legacy **`metadata.aiTaskProfile`** is dual-read and canonicalized to **`taskConfiguration`** on output — do not author new graphs under `metadata`.
72
+ - **AI task nodes** must include **`taskConfiguration.aiTaskProfile`** with non-empty **`preStrategyKey`** and **`postStrategyKey`** (deployment catalog row ids). Add **`taskConfiguration.narrix`** when discovery applies. Add **`webQueryTemplate`** (optional **`webScopeOptions`**, **`webSynthesizerModel`**) / **`inputSynthesis`** under **`aiTaskProfile`** when needed. When **`inputSynthesis.enabled`**, set **`inputSources`** (`input`, `jobMemory`, `jobMemory.context` — one or more) and/or **`sources`** memory paths; `input`-only → `executionMemory.synthesizedInput`, job-memory → `executionMemory.synthesizedContext`, both → prefer `executionMemory.synthesizedInput` for preAction input. **`webSynthesizerModel`**: omit, empty, or `"off"` → web search only; non-empty model → synthesize `webContext` to `synthesizedContext.contextMarkdown` via PRE `webSynthesis` (independent of `inputSynthesis`). Do **not** author **`webScoping`**, **`narrix.enableWebScope`**, or **`narrix.webScopeQuestions`**. Legacy **`metadata.aiTaskProfile`** is dual-read and canonicalized to **`taskConfiguration`** on output — do not author new graphs under `metadata`.
72
73
  - **`taskConfiguration.llmCall`** (MAIN tuning only): optional **`temperature`**, **`topP`**, **`reasoningEffort`** (`not-applicable` | `none` | `low` | `medium` | `high`), **`timeoutMs`**, **`outputExpectation`**. Do **not** author **`maxTokens`**, **`max_completion_tokens`**, or **`maxTokensCap`** — Optimixer owns completion budget at invoke. Do **not** set **`llmCall.model`** on graph JSON (runtime resolves from **`skillModel`**).
73
74
  - **`modelConfig`** cases hold **`@x12i/ai-profiles` profile names only** in three slots — never token caps or provider ids on graph JSON.
74
75
  - `skillKey` must come from the provided skill catalog unless extensible mode is active.
@@ -10,8 +10,8 @@ Before returning any graph (create/modify only), verify:
10
10
  8. If `maxNodes` is set, the total node count does not exceed it.
11
11
  9. All `skillKey` values exist in the provided catalog (unless extensible mode is active).
12
12
  10. For every **AI task** node, include **`taskConfiguration.aiTaskProfile.preStrategyKey`** and **`postStrategyKey`** (non-empty strings matching deployment PRE/POST strategy catalog row ids). Omit only on local/utility skills.
13
- 11. When web scope is needed, set non-empty **`taskConfiguration.aiTaskProfile.webQueryTemplate`** (Rendrix string with `input.<fieldName>` refs in double-brace syntax). Optional **`webQueryTemplates[]`** for pack mode. Do **not** author **`webScoping`** or web keys on **`narrix`**.
14
- 12. When **`inputSynthesis.enabled`** is `true`, set non-empty **`inputSynthesis.catalogId`**, **`strategyKey`**, **`outputKey`**, **`sources`** (memory paths), and **`destination`** (`job`, `task`, or `execution`). Do not add manual PRE `synthesized-context` steps when profile synthesis is enabled.
13
+ 11. When web scope is needed, set non-empty **`taskConfiguration.aiTaskProfile.webQueryTemplate`** (Rendrix string with `input.<fieldName>` refs in double-brace syntax). Optional **`webQueryTemplates[]`** for pack mode. Optional **`webSynthesizerModel`**: omit/empty/`"off"` for raw web only; non-empty model runs web-only synthesis to **`executionMemory.synthesizedContext.contextMarkdown`**. Do **not** author **`webScoping`** or web keys on **`narrix`**.
14
+ 12. When **`inputSynthesis.enabled`** is `true`, set non-empty **`inputSynthesis.catalogId`**, **`strategyKey`**, **`outputKey`**, and **`destination`** (`job`, `task`, or `execution`). Declare read scope with **`inputSources`** (`input`, `jobMemory`, `jobMemory.context` — one or more) **and/or** **`sources`** (memory paths); at least one must be non-empty. `input`-only → `executionMemory.synthesizedInput`; job-memory selectors → `executionMemory.synthesizedContext`; both → prefer `executionMemory.synthesizedInput` for preAction input. Do not add manual PRE `synthesized-context` steps when profile synthesis is enabled.
15
15
  13. Do not author deprecated task-node **`inputs`** or **`outputMapping`** — use **`inputsConfig`** and **`executionMapping`**.
16
16
  14. **Narrix** belongs under **`taskConfiguration.narrix`** (`datasetId`, `layer`, `narrativeTypeIds` when needed). Discovery only — no web fields on `narrix`.
17
17
  15. **`metadata`** is for planning fields (`graphReadability`, `catalogBinding`, …) only.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@exellix/graph-composer",
3
- "version": "2.15.2",
3
+ "version": "2.16.1",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -64,8 +64,8 @@
64
64
  },
65
65
  "homepage": "https://github.com/woroces/graph-composer#readme",
66
66
  "peerDependencies": {
67
- "@exellix/ai-skills": "^6.13.1",
68
- "@exellix/ai-tasks": "^10.2.2"
67
+ "@exellix/ai-skills": "^6.14.0",
68
+ "@exellix/ai-tasks": "^10.4.1"
69
69
  },
70
70
  "peerDependenciesMeta": {
71
71
  "@exellix/ai-tasks": {
@@ -76,15 +76,15 @@
76
76
  }
77
77
  },
78
78
  "dependencies": {
79
- "@exellix/graph-engine": "^9.2.4",
79
+ "@exellix/graph-engine": "^9.3.1",
80
80
  "@x12i/catalox": "^5.10.1",
81
81
  "@x12i/env": "^4.0.3",
82
82
  "@x12i/funcx": "^4.9.14",
83
83
  "@x12i/logxer": "^5.1.0"
84
84
  },
85
85
  "devDependencies": {
86
- "@exellix/ai-skills": "^6.13.1",
87
- "@exellix/ai-tasks": "^10.2.2",
86
+ "@exellix/ai-skills": "^6.14.0",
87
+ "@exellix/ai-tasks": "^10.4.1",
88
88
  "@types/node": "^26.0.1",
89
89
  "@x12i/rendrix": "^4.3.0",
90
90
  "tsx": "^4.22.4",