@exellix/graph-composer 2.2.1 → 2.4.2

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.
Files changed (56) hide show
  1. package/README.md +4 -3
  2. package/dist/catalogMatchAssist.d.ts +1 -2
  3. package/dist/catalogMatchAssist.d.ts.map +1 -1
  4. package/dist/catalogMatchAssist.js +3 -4
  5. package/dist/cataloxCatalogBridge.d.ts +1 -2
  6. package/dist/cataloxCatalogBridge.d.ts.map +1 -1
  7. package/dist/cataloxCatalogBridge.js +2 -2
  8. package/dist/exampleGeneration.d.ts +11 -0
  9. package/dist/exampleGeneration.d.ts.map +1 -1
  10. package/dist/exampleGeneration.js +54 -0
  11. package/dist/funcxModel.d.ts +8 -0
  12. package/dist/funcxModel.d.ts.map +1 -0
  13. package/dist/funcxModel.js +10 -0
  14. package/dist/graphComposerActions.d.ts.map +1 -1
  15. package/dist/graphComposerActions.js +65 -0
  16. package/dist/graphComposerOutputValidation.d.ts +1 -0
  17. package/dist/graphComposerOutputValidation.d.ts.map +1 -1
  18. package/dist/graphComposerOutputValidation.js +1 -0
  19. package/dist/graphEntryContract.d.ts +114 -0
  20. package/dist/graphEntryContract.d.ts.map +1 -0
  21. package/dist/graphEntryContract.js +206 -0
  22. package/dist/graphEntryOutputValidation.d.ts +9 -0
  23. package/dist/graphEntryOutputValidation.d.ts.map +1 -0
  24. package/dist/graphEntryOutputValidation.js +276 -0
  25. package/dist/graphEntryPostProcess.d.ts +11 -0
  26. package/dist/graphEntryPostProcess.d.ts.map +1 -0
  27. package/dist/graphEntryPostProcess.js +114 -0
  28. package/dist/graphModelLayers.d.ts +19 -0
  29. package/dist/graphModelLayers.d.ts.map +1 -1
  30. package/dist/graphModelLayers.js +109 -9
  31. package/dist/index.d.ts +6 -4
  32. package/dist/index.d.ts.map +1 -1
  33. package/dist/index.js +6 -4
  34. package/dist/modelConfigPatchMerge.d.ts +6 -0
  35. package/dist/modelConfigPatchMerge.d.ts.map +1 -0
  36. package/dist/modelConfigPatchMerge.js +38 -0
  37. package/dist/runGraphComposer.d.ts +3 -2
  38. package/dist/runGraphComposer.d.ts.map +1 -1
  39. package/dist/runGraphComposer.js +25 -11
  40. package/dist/scopingNeedMatchAssist.d.ts +1 -2
  41. package/dist/scopingNeedMatchAssist.d.ts.map +1 -1
  42. package/dist/scopingNeedMatchAssist.js +3 -3
  43. package/dist/types.d.ts +8 -1
  44. package/dist/types.d.ts.map +1 -1
  45. package/functions/graph-composer/meta.json +130 -4
  46. package/functions/graph-composer/prompts/README.md +8 -0
  47. package/functions/graph-composer/prompts/action-review-graph-entry-contract.md +37 -0
  48. package/functions/graph-composer/prompts/action-suggest-graph-entry-conditions.md +13 -0
  49. package/functions/graph-composer/prompts/action-suggest-graph-entry-examples.md +14 -0
  50. package/functions/graph-composer/prompts/action-suggest-graph-entry-inputs.md +14 -0
  51. package/functions/graph-composer/prompts/action-suggest-graph-execution-defaults.md +15 -0
  52. package/functions/graph-composer/prompts/action-suggest-job-knowledge-refs.md +12 -0
  53. package/functions/graph-composer/prompts/action-suggest-job-model-defaults.md +14 -0
  54. package/functions/graph-composer/prompts/shared/graph-entry-scope.md +19 -0
  55. package/functions/graph-composer/prompts/shared/request-context.md +2 -1
  56. package/package.json +8 -7
@@ -0,0 +1,206 @@
1
+ export const GRAPH_ENTRY_FINDING_CATEGORIES = new Set([
2
+ "graph_entry",
3
+ "expected_input",
4
+ "job_models",
5
+ "job_knowledge",
6
+ "graph_execution",
7
+ "graph_conditions",
8
+ ]);
9
+ export const GRAPH_ENTRY_PATH_PREFIX = "execution.input.";
10
+ export const GRAPH_EXECUTION_PATCH_ALLOWLIST = new Set([
11
+ "failFast",
12
+ "nodeTimeoutMs",
13
+ "mode",
14
+ "goalNodeId",
15
+ "dimension",
16
+ "outputMode",
17
+ "coreObjective",
18
+ "nodesResponses",
19
+ "flowOutline",
20
+ "pipeline",
21
+ ]);
22
+ function asObject(v) {
23
+ return v !== null && typeof v === "object" && !Array.isArray(v)
24
+ ? v
25
+ : undefined;
26
+ }
27
+ /** Read `metadata.graphEntry` and normalize legacy `exampleInput` → `exampleInputs`. */
28
+ export function resolveEffectiveGraphEntry(graphOrEntry) {
29
+ const root = asObject(graphOrEntry);
30
+ const fromMeta = asObject(root?.metadata)?.graphEntry;
31
+ const entry = asObject(fromMeta) ??
32
+ (root && "inputs" in root ? root : undefined) ??
33
+ {};
34
+ const out = { ...entry };
35
+ if (!Array.isArray(out.exampleInputs)) {
36
+ const legacy = out.exampleInput;
37
+ if (legacy !== undefined && legacy !== null) {
38
+ if (Array.isArray(legacy)) {
39
+ out.exampleInputs = legacy;
40
+ }
41
+ else if (typeof legacy === "object" && !Array.isArray(legacy)) {
42
+ out.exampleInputs = [legacy];
43
+ }
44
+ }
45
+ }
46
+ return out;
47
+ }
48
+ export function isValidGraphEntryPath(path) {
49
+ const p = path.trim();
50
+ return p.startsWith(GRAPH_ENTRY_PATH_PREFIX) && p.length > GRAPH_ENTRY_PATH_PREFIX.length;
51
+ }
52
+ export function validateGraphEntryPaths(paths) {
53
+ const invalid = [];
54
+ for (const path of paths) {
55
+ if (!isValidGraphEntryPath(path))
56
+ invalid.push(path);
57
+ }
58
+ return invalid;
59
+ }
60
+ function pathTail(path) {
61
+ return path.startsWith(GRAPH_ENTRY_PATH_PREFIX)
62
+ ? path.slice(GRAPH_ENTRY_PATH_PREFIX.length)
63
+ : path;
64
+ }
65
+ function schemaPropertyForTail(tail, kind) {
66
+ const segments = tail.split(".").filter(Boolean);
67
+ if (segments.length === 0) {
68
+ return { type: "object", additionalProperties: true };
69
+ }
70
+ if (kind === "record" && segments.length === 1) {
71
+ return {
72
+ type: "object",
73
+ additionalProperties: true,
74
+ description: `Record at execution.input.${segments[0]}`,
75
+ };
76
+ }
77
+ const last = segments[segments.length - 1];
78
+ if (last === "raw" || tail.endsWith(".raw")) {
79
+ return { type: "string", description: "Raw caller payload" };
80
+ }
81
+ return { type: ["string", "number", "boolean", "object", "array", "null"] };
82
+ }
83
+ /** Infer JSON Schema for example generation from declared graph-entry inputs (FR-G4). */
84
+ export function buildGraphEntryExampleJsonSchema(inputs, _entityBindings) {
85
+ const rows = Array.isArray(inputs) ? inputs : [];
86
+ const properties = {};
87
+ const required = [];
88
+ for (const row of rows) {
89
+ const r = asObject(row);
90
+ if (!r || typeof r.path !== "string")
91
+ continue;
92
+ const tail = pathTail(r.path);
93
+ if (!tail)
94
+ continue;
95
+ const kind = typeof r.kind === "string" ? r.kind : "scalar";
96
+ const topKey = tail.split(".")[0];
97
+ if (!(topKey in properties)) {
98
+ if (tail.includes(".") || kind === "scalar") {
99
+ const nestedTail = tail;
100
+ if (nestedTail === topKey) {
101
+ properties[topKey] = schemaPropertyForTail(tail, kind);
102
+ }
103
+ else {
104
+ properties[topKey] = {
105
+ type: "object",
106
+ properties: {
107
+ [nestedTail.slice(topKey.length + 1)]: schemaPropertyForTail(nestedTail, kind),
108
+ },
109
+ };
110
+ }
111
+ }
112
+ else {
113
+ properties[topKey] = schemaPropertyForTail(tail, kind);
114
+ }
115
+ }
116
+ if (r.required === true && !required.includes(topKey)) {
117
+ required.push(topKey);
118
+ }
119
+ }
120
+ if (Object.keys(properties).length === 0) {
121
+ return {
122
+ type: "object",
123
+ properties: {
124
+ raw: { type: "string", description: "Default execution.input.raw" },
125
+ },
126
+ additionalProperties: true,
127
+ };
128
+ }
129
+ return {
130
+ type: "object",
131
+ properties,
132
+ ...(required.length > 0 ? { required } : {}),
133
+ additionalProperties: true,
134
+ };
135
+ }
136
+ /** FR-G3: flag when graphEntry.inputs[].entityIds disagree with graphConcept.entityBindings. */
137
+ export function findGraphEntryEntityBindingMismatches(inputs, graphConcept) {
138
+ const concept = asObject(graphConcept);
139
+ const eb = asObject(concept?.entityBindings);
140
+ const allowed = new Set();
141
+ if (eb?.coreEntityCollectionId)
142
+ allowed.add(eb.coreEntityCollectionId);
143
+ for (const id of eb?.supportingEntityCollectionIds ?? []) {
144
+ if (typeof id === "string")
145
+ allowed.add(id);
146
+ }
147
+ if (eb?.targetEntityCollectionId)
148
+ allowed.add(eb.targetEntityCollectionId);
149
+ if (allowed.size === 0)
150
+ return [];
151
+ const mismatches = [];
152
+ const rows = Array.isArray(inputs) ? inputs : [];
153
+ for (const row of rows) {
154
+ const r = asObject(row);
155
+ if (!r?.entityIds || !Array.isArray(r.entityIds) || r.entityIds.length === 0) {
156
+ continue;
157
+ }
158
+ const bad = r.entityIds.filter((id) => typeof id === "string" && !allowed.has(id));
159
+ if (bad.length > 0) {
160
+ mismatches.push({
161
+ inputPath: r.path,
162
+ entityIds: bad,
163
+ message: `entityIds [${bad.join(", ")}] not in graphConcept.entityBindings`,
164
+ });
165
+ }
166
+ }
167
+ return mismatches;
168
+ }
169
+ export function parseJsonExampleValue(value) {
170
+ const trimmed = value.trim();
171
+ if (trimmed === "")
172
+ return { ok: false, error: "empty value" };
173
+ try {
174
+ JSON.parse(trimmed);
175
+ return { ok: true };
176
+ }
177
+ catch (e) {
178
+ return {
179
+ ok: false,
180
+ error: e instanceof Error ? e.message : String(e),
181
+ };
182
+ }
183
+ }
184
+ /** Resolve graph-entry context from request (agentContext preferred, analysisContext legacy). */
185
+ export function resolveGraphEntryContextFromInput(input) {
186
+ const ac = input.agentContext;
187
+ if (ac?.surface === "graph-entry")
188
+ return ac;
189
+ const legacy = asObject(input.analysisContext);
190
+ if (legacy?.surface === "graph-entry") {
191
+ return legacy;
192
+ }
193
+ return undefined;
194
+ }
195
+ export function assertGraphEntryAgentSurface(input, action) {
196
+ if (input.agentContext !== undefined && input.agentContext.surface !== "graph-entry") {
197
+ throw new Error(`${action} requires agentContext.surface === "graph-entry" (got ${input.agentContext.surface})`);
198
+ }
199
+ const legacy = asObject(input.analysisContext);
200
+ if (legacy !== undefined &&
201
+ "surface" in legacy &&
202
+ legacy.surface !== undefined &&
203
+ legacy.surface !== "graph-entry") {
204
+ throw new Error(`${action} requires analysisContext.surface === "graph-entry" when surface is set`);
205
+ }
206
+ }
@@ -0,0 +1,9 @@
1
+ import type { OutputValidationContext } from "./graphComposerOutputValidation.js";
2
+ export declare function validateSuggestGraphEntryInputsOutput(out: Record<string, unknown>, ctx?: OutputValidationContext): void;
3
+ export declare function validateSuggestGraphEntryExamplesOutput(out: Record<string, unknown>, ctx?: OutputValidationContext): void;
4
+ export declare function validateSuggestGraphEntryConditionsOutput(out: Record<string, unknown>, ctx?: OutputValidationContext): void;
5
+ export declare function validateSuggestJobModelDefaultsOutput(out: Record<string, unknown>, ctx?: OutputValidationContext): void;
6
+ export declare function validateSuggestJobKnowledgeRefsOutput(out: Record<string, unknown>, ctx?: OutputValidationContext): void;
7
+ export declare function validateSuggestGraphExecutionDefaultsOutput(out: Record<string, unknown>, ctx?: OutputValidationContext): void;
8
+ export declare function validateReviewGraphEntryContractOutput(out: Record<string, unknown>, ctx?: OutputValidationContext): void;
9
+ //# sourceMappingURL=graphEntryOutputValidation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graphEntryOutputValidation.d.ts","sourceRoot":"","sources":["../src/graphEntryOutputValidation.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,oCAAoC,CAAC;AAgLlF,wBAAgB,qCAAqC,CACnD,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5B,GAAG,CAAC,EAAE,uBAAuB,GAC5B,IAAI,CAIN;AAED,wBAAgB,uCAAuC,CACrD,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5B,GAAG,CAAC,EAAE,uBAAuB,GAC5B,IAAI,CAUN;AAED,wBAAgB,yCAAyC,CACvD,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5B,GAAG,CAAC,EAAE,uBAAuB,GAC5B,IAAI,CAWN;AAED,wBAAgB,qCAAqC,CACnD,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5B,GAAG,CAAC,EAAE,uBAAuB,GAC5B,IAAI,CAWN;AAED,wBAAgB,qCAAqC,CACnD,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5B,GAAG,CAAC,EAAE,uBAAuB,GAC5B,IAAI,CAaN;AAED,wBAAgB,2CAA2C,CACzD,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5B,GAAG,CAAC,EAAE,uBAAuB,GAC5B,IAAI,CAeN;AAED,wBAAgB,sCAAsC,CACpD,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5B,GAAG,CAAC,EAAE,uBAAuB,GAC5B,IAAI,CA0EN"}
@@ -0,0 +1,276 @@
1
+ import { assertGraphEntryAgentSurface, GRAPH_ENTRY_FINDING_CATEGORIES, GRAPH_ENTRY_PATH_PREFIX, GRAPH_EXECUTION_PATCH_ALLOWLIST, isValidGraphEntryPath, parseJsonExampleValue, } from "./graphEntryContract.js";
2
+ function assertNoGraph(out, action) {
3
+ if ("graph" in out && out.graph !== undefined) {
4
+ throw new Error(`${action} action must not return a graph object`);
5
+ }
6
+ }
7
+ function assertStringField(o, key, ctx) {
8
+ const v = o[key];
9
+ if (typeof v !== "string" || v.trim() === "") {
10
+ throw new Error(`${ctx}.${key} must be a non-empty string`);
11
+ }
12
+ }
13
+ function validateGraphEntryInputRows(rows, ctx) {
14
+ for (let i = 0; i < rows.length; i++) {
15
+ const row = rows[i];
16
+ if (row === null || typeof row !== "object" || Array.isArray(row)) {
17
+ throw new Error(`${ctx}[${i}] must be an object`);
18
+ }
19
+ const r = row;
20
+ if (typeof r.path !== "string" || !isValidGraphEntryPath(r.path)) {
21
+ throw new Error(`${ctx}[${i}].path must be a non-empty string starting with ${GRAPH_ENTRY_PATH_PREFIX}`);
22
+ }
23
+ if (r.kind !== undefined) {
24
+ const k = r.kind;
25
+ if (k !== "scalar" && k !== "record" && typeof k !== "string") {
26
+ throw new Error(`${ctx}[${i}].kind must be scalar, record, or string`);
27
+ }
28
+ }
29
+ if (r.required !== undefined && typeof r.required !== "boolean") {
30
+ throw new Error(`${ctx}[${i}].required must be a boolean when present`);
31
+ }
32
+ if (r.entityIds !== undefined) {
33
+ if (!Array.isArray(r.entityIds)) {
34
+ throw new Error(`${ctx}[${i}].entityIds must be an array when present`);
35
+ }
36
+ for (let j = 0; j < r.entityIds.length; j++) {
37
+ if (typeof r.entityIds[j] !== "string") {
38
+ throw new Error(`${ctx}[${i}].entityIds[${j}] must be a string`);
39
+ }
40
+ }
41
+ }
42
+ }
43
+ }
44
+ function validateGraphEntryExampleRows(rows, ctx) {
45
+ for (let i = 0; i < rows.length; i++) {
46
+ const row = rows[i];
47
+ if (row === null || typeof row !== "object" || Array.isArray(row)) {
48
+ throw new Error(`${ctx}[${i}] must be an object`);
49
+ }
50
+ const r = row;
51
+ if (typeof r.format !== "string" || r.format.trim() === "") {
52
+ throw new Error(`${ctx}[${i}].format must be a non-empty string`);
53
+ }
54
+ if (typeof r.value !== "string") {
55
+ throw new Error(`${ctx}[${i}].value must be a string`);
56
+ }
57
+ if (r.format === "json") {
58
+ const check = parseJsonExampleValue(r.value);
59
+ if (!check.ok) {
60
+ throw new Error(`${ctx}[${i}].value must be valid JSON when format is json: ${check.error}`);
61
+ }
62
+ }
63
+ }
64
+ }
65
+ function validateOptionalGraphEntryPatch(patch, fieldName, requireInputs, requireExamples) {
66
+ if (patch === undefined)
67
+ return;
68
+ if (patch === null || typeof patch !== "object" || Array.isArray(patch)) {
69
+ throw new Error(`${fieldName} must be a plain object when present`);
70
+ }
71
+ const p = patch;
72
+ if (p.inputs !== undefined) {
73
+ if (!Array.isArray(p.inputs)) {
74
+ throw new Error(`${fieldName}.inputs must be an array when present`);
75
+ }
76
+ validateGraphEntryInputRows(p.inputs, `${fieldName}.inputs`);
77
+ }
78
+ else if (requireInputs) {
79
+ throw new Error(`${fieldName} must include inputs array`);
80
+ }
81
+ if (p.exampleInputs !== undefined) {
82
+ if (!Array.isArray(p.exampleInputs)) {
83
+ throw new Error(`${fieldName}.exampleInputs must be an array when present`);
84
+ }
85
+ validateGraphEntryExampleRows(p.exampleInputs, `${fieldName}.exampleInputs`);
86
+ }
87
+ else if (requireExamples) {
88
+ throw new Error(`${fieldName} must include exampleInputs array`);
89
+ }
90
+ if (p.conditions !== undefined) {
91
+ if (p.conditions === null || typeof p.conditions !== "object" || Array.isArray(p.conditions)) {
92
+ throw new Error(`${fieldName}.conditions must be a plain object when present`);
93
+ }
94
+ }
95
+ }
96
+ function validateGraphEntryFindings(findings, action) {
97
+ for (let i = 0; i < findings.length; i++) {
98
+ const row = findings[i];
99
+ if (row === null || typeof row !== "object" || Array.isArray(row)) {
100
+ throw new Error(`${action} findings[${i}] must be an object`);
101
+ }
102
+ const f = row;
103
+ if (f.scopeType !== undefined && f.scopeType !== "graph") {
104
+ throw new Error(`${action} findings[${i}].scopeType must be "graph" when present`);
105
+ }
106
+ assertStringField(f, "category", `${action} findings[${i}]`);
107
+ assertStringField(f, "severity", `${action} findings[${i}]`);
108
+ assertStringField(f, "summary", `${action} findings[${i}]`);
109
+ const sev = f.severity;
110
+ if (!["info", "warning", "error"].includes(sev)) {
111
+ throw new Error(`${action} findings[${i}].severity must be info, warning, or error`);
112
+ }
113
+ if (f.suggestedChange !== undefined &&
114
+ typeof f.suggestedChange !== "string") {
115
+ throw new Error(`${action} findings[${i}].suggestedChange must be a string when present`);
116
+ }
117
+ }
118
+ }
119
+ function validateRequirementOptions(opts, ctx) {
120
+ if (opts === undefined)
121
+ return;
122
+ if (!Array.isArray(opts)) {
123
+ throw new Error(`${ctx} must be an array when present`);
124
+ }
125
+ for (let i = 0; i < opts.length; i++) {
126
+ const row = opts[i];
127
+ if (row === null || typeof row !== "object" || Array.isArray(row)) {
128
+ throw new Error(`${ctx}[${i}] must be an object`);
129
+ }
130
+ }
131
+ }
132
+ function validatePagentiRefs(refs, ctx) {
133
+ for (let i = 0; i < refs.length; i++) {
134
+ const row = refs[i];
135
+ if (row === null || typeof row !== "object" || Array.isArray(row)) {
136
+ throw new Error(`${ctx}[${i}] must be an object`);
137
+ }
138
+ const r = row;
139
+ if (typeof r.catalogId !== "string" || r.catalogId.trim() === "") {
140
+ throw new Error(`${ctx}[${i}].catalogId must be a non-empty string`);
141
+ }
142
+ if (typeof r.itemId !== "string" || r.itemId.trim() === "") {
143
+ throw new Error(`${ctx}[${i}].itemId must be a non-empty string`);
144
+ }
145
+ }
146
+ }
147
+ function graphEntrySurfaceCheck(ctx, action) {
148
+ if (!ctx?.input || !action)
149
+ return;
150
+ assertGraphEntryAgentSurface(ctx.input, action);
151
+ }
152
+ export function validateSuggestGraphEntryInputsOutput(out, ctx) {
153
+ graphEntrySurfaceCheck(ctx, "suggestGraphEntryInputs");
154
+ assertNoGraph(out, "suggestGraphEntryInputs");
155
+ validateOptionalGraphEntryPatch(out.graphEntryPatch, "graphEntryPatch", true);
156
+ }
157
+ export function validateSuggestGraphEntryExamplesOutput(out, ctx) {
158
+ graphEntrySurfaceCheck(ctx, "suggestGraphEntryExamples");
159
+ assertNoGraph(out, "suggestGraphEntryExamples");
160
+ validateOptionalGraphEntryPatch(out.graphEntryPatch, "graphEntryPatch", false, true);
161
+ validateRequirementOptions(out.requirementOptions, "requirementOptions");
162
+ }
163
+ export function validateSuggestGraphEntryConditionsOutput(out, ctx) {
164
+ graphEntrySurfaceCheck(ctx, "suggestGraphEntryConditions");
165
+ assertNoGraph(out, "suggestGraphEntryConditions");
166
+ const patch = out.graphEntryPatch;
167
+ if (patch === null || typeof patch !== "object" || Array.isArray(patch)) {
168
+ throw new Error("suggestGraphEntryConditions must include graphEntryPatch object");
169
+ }
170
+ const p = patch;
171
+ if (p.conditions === undefined) {
172
+ throw new Error("graphEntryPatch.conditions is required for suggestGraphEntryConditions");
173
+ }
174
+ }
175
+ export function validateSuggestJobModelDefaultsOutput(out, ctx) {
176
+ graphEntrySurfaceCheck(ctx, "suggestJobModelDefaults");
177
+ assertNoGraph(out, "suggestJobModelDefaults");
178
+ const patch = out.modelConfigPatch;
179
+ if (patch === null || typeof patch !== "object" || Array.isArray(patch)) {
180
+ throw new Error("suggestJobModelDefaults must include modelConfigPatch object");
181
+ }
182
+ const p = patch;
183
+ if (p.mode !== undefined && p.mode !== "appendCase" && p.mode !== "replaceDefault") {
184
+ throw new Error('modelConfigPatch.mode must be "appendCase" or "replaceDefault"');
185
+ }
186
+ }
187
+ export function validateSuggestJobKnowledgeRefsOutput(out, ctx) {
188
+ graphEntrySurfaceCheck(ctx, "suggestJobKnowledgeRefs");
189
+ assertNoGraph(out, "suggestJobKnowledgeRefs");
190
+ const patch = out.jobPagentiKnowledgePatch;
191
+ if (patch === null || typeof patch !== "object" || Array.isArray(patch)) {
192
+ throw new Error("suggestJobKnowledgeRefs must include jobPagentiKnowledgePatch object");
193
+ }
194
+ const p = patch;
195
+ const refs = p.refs ?? p.append;
196
+ if (refs === undefined || !Array.isArray(refs)) {
197
+ throw new Error("jobPagentiKnowledgePatch must include refs or append array");
198
+ }
199
+ validatePagentiRefs(refs, "jobPagentiKnowledgePatch");
200
+ }
201
+ export function validateSuggestGraphExecutionDefaultsOutput(out, ctx) {
202
+ graphEntrySurfaceCheck(ctx, "suggestGraphExecutionDefaults");
203
+ assertNoGraph(out, "suggestGraphExecutionDefaults");
204
+ const patch = out.graphExecutionPatch;
205
+ if (patch === null || typeof patch !== "object" || Array.isArray(patch)) {
206
+ throw new Error("suggestGraphExecutionDefaults must include graphExecutionPatch object");
207
+ }
208
+ const p = patch;
209
+ for (const key of Object.keys(p)) {
210
+ if (!GRAPH_EXECUTION_PATCH_ALLOWLIST.has(key)) {
211
+ throw new Error(`graphExecutionPatch.${key} is not an allowed key (${[...GRAPH_EXECUTION_PATCH_ALLOWLIST].join(", ")})`);
212
+ }
213
+ }
214
+ }
215
+ export function validateReviewGraphEntryContractOutput(out, ctx) {
216
+ graphEntrySurfaceCheck(ctx, "reviewGraphEntryContract");
217
+ assertNoGraph(out, "reviewGraphEntryContract");
218
+ if ("changelog" in out && out.changelog !== undefined) {
219
+ throw new Error("reviewGraphEntryContract must not return changelog");
220
+ }
221
+ const verdict = out.verdict;
222
+ if (verdict === null ||
223
+ verdict === undefined ||
224
+ typeof verdict !== "object" ||
225
+ Array.isArray(verdict)) {
226
+ throw new Error("reviewGraphEntryContract must include verdict object");
227
+ }
228
+ const v = verdict;
229
+ if (typeof v.coherent !== "boolean") {
230
+ throw new Error("reviewGraphEntryContract.verdict.coherent must be a boolean");
231
+ }
232
+ if (typeof v.summary !== "string" || v.summary.trim() === "") {
233
+ throw new Error("reviewGraphEntryContract.verdict.summary must be non-empty");
234
+ }
235
+ if (!Array.isArray(out.findings)) {
236
+ throw new Error("reviewGraphEntryContract must include findings array");
237
+ }
238
+ validateGraphEntryFindings(out.findings, "reviewGraphEntryContract");
239
+ for (const f of out.findings) {
240
+ const cat = f.category;
241
+ if (!GRAPH_ENTRY_FINDING_CATEGORIES.has(cat)) {
242
+ // allow custom categories but prefer known set — no throw
243
+ }
244
+ }
245
+ validateOptionalGraphEntryPatch(out.graphEntryPatch, "graphEntryPatch");
246
+ validateOptionalGraphEntryPatch(out.suggestedGraphEntryPatch, "suggestedGraphEntryPatch");
247
+ if (out.modelConfigPatch !== undefined) {
248
+ validateSuggestJobModelDefaultsOutput({ action: "reviewGraphEntryContract", modelConfigPatch: out.modelConfigPatch }, ctx);
249
+ }
250
+ if (out.jobPagentiKnowledgePatch !== undefined) {
251
+ validateSuggestJobKnowledgeRefsOutput({
252
+ action: "reviewGraphEntryContract",
253
+ jobPagentiKnowledgePatch: out.jobPagentiKnowledgePatch,
254
+ }, ctx);
255
+ }
256
+ if (out.graphExecutionPatch !== undefined) {
257
+ validateSuggestGraphExecutionDefaultsOutput({
258
+ action: "reviewGraphEntryContract",
259
+ graphExecutionPatch: out.graphExecutionPatch,
260
+ }, ctx);
261
+ }
262
+ if (out.graphResponsePatch !== undefined) {
263
+ if (out.graphResponsePatch === null ||
264
+ typeof out.graphResponsePatch !== "object" ||
265
+ Array.isArray(out.graphResponsePatch)) {
266
+ throw new Error("graphResponsePatch must be a plain object when present");
267
+ }
268
+ }
269
+ if (out.graphConceptPatch !== undefined) {
270
+ const gcp = out.graphConceptPatch;
271
+ if (gcp === null || typeof gcp !== "object" || Array.isArray(gcp)) {
272
+ throw new Error("graphConceptPatch must be a plain object when present");
273
+ }
274
+ }
275
+ validateRequirementOptions(out.requirementOptions, "requirementOptions");
276
+ }
@@ -0,0 +1,11 @@
1
+ import type { GraphComposerInput } from "./types.js";
2
+ export declare const GRAPH_ENTRY_SHARED_INCLUDES: readonly string[];
3
+ /** Alias suggestedGraphEntryPatch → graphEntryPatch when latter empty. */
4
+ export declare function normalizeReviewGraphEntryComposerOutput(out: Record<string, unknown>): void;
5
+ export declare function processSuggestJobModelDefaultsOutput(shaped: Record<string, unknown>, existingGraph: object): void;
6
+ export declare function repairGraphEntryExampleRows(shaped: Record<string, unknown>, existingGraph: object): void;
7
+ export declare function processSuggestGraphEntryExamplesOutput(shaped: Record<string, unknown>, input: GraphComposerInput, options: {
8
+ repairWithLlm?: boolean;
9
+ client?: import("@x12i/funcx").Client;
10
+ }): Promise<void>;
11
+ //# sourceMappingURL=graphEntryPostProcess.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graphEntryPostProcess.d.ts","sourceRoot":"","sources":["../src/graphEntryPostProcess.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAQrD,eAAO,MAAM,2BAA2B,EAAE,SAAS,MAAM,EAAuB,CAAC;AAQjF,0EAA0E;AAC1E,wBAAgB,uCAAuC,CACrD,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC3B,IAAI,CAaN;AAED,wBAAgB,oCAAoC,CAClD,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,aAAa,EAAE,MAAM,GACpB,IAAI,CAQN;AAED,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,aAAa,EAAE,MAAM,GACpB,IAAI,CA6BN;AAED,wBAAsB,sCAAsC,CAC1D,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,KAAK,EAAE,kBAAkB,EACzB,OAAO,EAAE;IAAE,aAAa,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,aAAa,EAAE,MAAM,CAAA;CAAE,GAC1E,OAAO,CAAC,IAAI,CAAC,CAqDf"}
@@ -0,0 +1,114 @@
1
+ import { parseJsonExampleValue, resolveEffectiveGraphEntry, } from "./graphEntryContract.js";
2
+ import { applyModelConfigPatchGuard } from "./modelConfigPatchMerge.js";
3
+ const GRAPH_ENTRY_SHARED = [
4
+ "shared/request-context.md",
5
+ "shared/graph-format.md",
6
+ "shared/graph-entry-scope.md",
7
+ ];
8
+ export const GRAPH_ENTRY_SHARED_INCLUDES = GRAPH_ENTRY_SHARED;
9
+ function asObject(v) {
10
+ return v !== null && typeof v === "object" && !Array.isArray(v)
11
+ ? v
12
+ : undefined;
13
+ }
14
+ /** Alias suggestedGraphEntryPatch → graphEntryPatch when latter empty. */
15
+ export function normalizeReviewGraphEntryComposerOutput(out) {
16
+ const cur = out.graphEntryPatch;
17
+ const has = cur !== null &&
18
+ cur !== undefined &&
19
+ typeof cur === "object" &&
20
+ !Array.isArray(cur) &&
21
+ Object.keys(cur).length > 0;
22
+ if (has)
23
+ return;
24
+ const alt = out.suggestedGraphEntryPatch;
25
+ if (alt !== null && typeof alt === "object" && !Array.isArray(alt)) {
26
+ out.graphEntryPatch = alt;
27
+ }
28
+ }
29
+ export function processSuggestJobModelDefaultsOutput(shaped, existingGraph) {
30
+ const raw = shaped.modelConfigPatch;
31
+ if (raw === null || typeof raw !== "object" || Array.isArray(raw))
32
+ return;
33
+ const guarded = applyModelConfigPatchGuard(raw, existingGraph);
34
+ shaped.modelConfigPatch = guarded;
35
+ }
36
+ export function repairGraphEntryExampleRows(shaped, existingGraph) {
37
+ const patch = asObject(shaped.graphEntryPatch);
38
+ if (!patch || !Array.isArray(patch.exampleInputs))
39
+ return;
40
+ const rows = patch.exampleInputs;
41
+ for (const row of rows) {
42
+ if (row.format === "json" && typeof row.value === "string") {
43
+ const check = parseJsonExampleValue(row.value);
44
+ if (!check.ok && row.value.trim().startsWith("{")) {
45
+ try {
46
+ const reparsed = JSON.stringify(JSON.parse(row.value.trim()));
47
+ row.value = reparsed;
48
+ }
49
+ catch {
50
+ /* keep original; validation will fail */
51
+ }
52
+ }
53
+ }
54
+ }
55
+ const entry = resolveEffectiveGraphEntry(existingGraph);
56
+ const inputs = Array.isArray(entry.inputs) ? entry.inputs : [];
57
+ const requiredPaths = inputs
58
+ .filter((r) => {
59
+ const o = asObject(r);
60
+ return o?.required === true && typeof o.path === "string";
61
+ })
62
+ .map((r) => asObject(r).path);
63
+ if (requiredPaths.length > 0 && rows.length === 0) {
64
+ shaped._graphEntryExamplesIncomplete = true;
65
+ }
66
+ }
67
+ export async function processSuggestGraphEntryExamplesOutput(shaped, input, options) {
68
+ repairGraphEntryExampleRows(shaped, input.existingGraph);
69
+ if (!options.repairWithLlm || options.client === undefined)
70
+ return;
71
+ const patch = asObject(shaped.graphEntryPatch);
72
+ const examples = patch?.exampleInputs;
73
+ const needsRepair = shaped._graphEntryExamplesIncomplete === true ||
74
+ !Array.isArray(examples) ||
75
+ examples.length === 0 ||
76
+ (Array.isArray(examples) &&
77
+ examples.some((row) => {
78
+ const r = asObject(row);
79
+ if (!r || r.format !== "json")
80
+ return false;
81
+ return typeof r.value === "string" && !parseJsonExampleValue(r.value).ok;
82
+ }));
83
+ if (!needsRepair || input.existingGraph === undefined)
84
+ return;
85
+ try {
86
+ const { generateGraphEntryInputExample } = await import("./exampleGeneration.js");
87
+ const ctx = input.agentContext;
88
+ const entityBindings = ctx?.surface === "graph-entry"
89
+ ? ctx.graphConcept?.entityBindings
90
+ : undefined;
91
+ const gen = await generateGraphEntryInputExample({
92
+ graph: input.existingGraph,
93
+ entityBindings,
94
+ client: options.client,
95
+ });
96
+ const value = typeof gen.example === "string"
97
+ ? gen.example
98
+ : JSON.stringify(gen.example ?? {});
99
+ if (!patch) {
100
+ shaped.graphEntryPatch = {
101
+ exampleInputs: [{ format: "json", value, path: "execution.input.raw" }],
102
+ };
103
+ }
104
+ else {
105
+ patch.exampleInputs = [
106
+ { format: "json", value, path: "execution.input.raw" },
107
+ ];
108
+ }
109
+ delete shaped._graphEntryExamplesIncomplete;
110
+ }
111
+ catch {
112
+ /* LLM repair optional */
113
+ }
114
+ }
@@ -88,4 +88,23 @@ export declare function resolveGraphModelProfileName(profileName: string): Promi
88
88
  modelId: string;
89
89
  formatted: string;
90
90
  }>;
91
+ export type FormatNodeModelLabelOptions = {
92
+ /** When true (default), append resolved provider id when it differs from the profile name. */
93
+ includeProviderIds?: boolean;
94
+ /**
95
+ * `main` — one line for canvas badges (MAIN / skillModel only).
96
+ * `triple` — PRE · MAIN · POST profile names.
97
+ * `tripleWithSource` — triple plus winning layer path (e.g. graph.modelConfig).
98
+ */
99
+ mode?: "main" | "triple" | "tripleWithSource";
100
+ };
101
+ /** Read `metadata.graphModelLayers` stamped by `stampGraphModelLayersOnGraph`. */
102
+ export declare function readNodeGraphModelLayersFromNode(node: unknown): NodeGraphModelLayers | undefined;
103
+ /**
104
+ * Human-readable model label for graph canvas / Agent View (graphs-studio).
105
+ * Requires `stampGraphModelLayersOnGraph` (or equivalent `metadata.graphModelLayers` on the node).
106
+ */
107
+ export declare function formatNodeWinningModelLabel(nodeOrLayers: unknown, options?: FormatNodeModelLabelOptions): string | undefined;
108
+ /** Label for graph-root default from `metadata.graphModelLayersSummary`. */
109
+ export declare function formatGraphDefaultModelLabel(graph: object, options?: FormatNodeModelLabelOptions): string | undefined;
91
110
  //# sourceMappingURL=graphModelLayers.d.ts.map
@@ -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":"AAcA,mGAAmG;AACnG,MAAM,MAAM,qBAAqB,GAC7B,2BAA2B,GAC3B,oCAAoC,GACpC,qBAAqB,GACrB,mBAAmB,GACnB,sBAAsB,CAAC;AAE3B,MAAM,MAAM,oBAAoB,GAAG,gBAAgB,GAAG,YAAY,GAAG,iBAAiB,CAAC;AAEvF,yGAAyG;AACzG,MAAM,MAAM,wBAAwB,GAAG;IACrC,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG;IACtC,+CAA+C;IAC/C,MAAM,EAAE,qBAAqB,CAAC;IAC9B,kEAAkE;IAClE,UAAU,EAAE,MAAM,CAAC;IACnB,sEAAsE;IACtE,UAAU,EAAE,MAAM,CAAC;IACnB,iEAAiE;IACjE,UAAU,EAAE,MAAM,CAAC;IACnB,8FAA8F;IAC9F,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,wBAAwB,CAAC;IACnC,2EAA2E;IAC3E,WAAW,CAAC,EAAE,wBAAwB,CAAC;IACvC,0FAA0F;IAC1F,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,IAAI,CACX,yBAAyB,EACzB,QAAQ,GAAG,YAAY,GAAG,YAAY,GAAG,YAAY,GAAG,UAAU,GAAG,aAAa,CACnF,CAAC;IACF,mFAAmF;IACnF,KAAK,EAAE,yBAAyB,EAAE,CAAC;CACpC,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG;IACrC,UAAU,EAAE,MAAM,CAAC;IACnB,6FAA6F;IAC7F,eAAe,EAAE,OAAO,CAAC;IACzB,oBAAoB,EAAE,wBAAwB,CAAC;IAC/C,uBAAuB,CAAC,EAAE,wBAAwB,CAAC;IACnD,KAAK,EAAE,oBAAoB,EAAE,CAAC;CAC/B,CAAC;AAEF,MAAM,MAAM,8BAA8B,GAAG;IAC3C,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,WAAW,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,SAAS,CAAC,CAAC;CAC/D,CAAC;AAEF,MAAM,MAAM,8BAA8B,GAAG;IAC3C;;;OAGG;IACH,OAAO,CAAC,EAAE,8BAA8B,CAAC;IACzC,aAAa,CAAC,EAAE,QAAQ,CAAC;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAChD,mBAAmB,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;CACxC,CAAC;AAsLF;;;;;;;GAOG;AACH,wBAAsB,uBAAuB,CAC3C,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,8BAA8B,GACvC,OAAO,CAAC,wBAAwB,CAAC,CAuInC;AAED,sDAAsD;AACtD,wBAAgB,uBAAuB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAGnE;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,KAAK,CAAC;IAC7C,MAAM,EAAE,qBAAqB,CAAC;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC,CAKD;AAED;;;GAGG;AACH,wBAAsB,4BAA4B,CAAC,CAAC,SAAS,MAAM,EACjE,KAAK,EAAE,CAAC,EACR,OAAO,CAAC,EAAE,8BAA8B,GACvC,OAAO,CAAC,CAAC,CAAC,CAyCZ;AAED,sFAAsF;AACtF,wBAAsB,4BAA4B,CAChD,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,CAWpF;AAED,MAAM,MAAM,2BAA2B,GAAG;IACxC,8FAA8F;IAC9F,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B;;;;OAIG;IACH,IAAI,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,kBAAkB,CAAC;CAC/C,CAAC;AAsBF,kFAAkF;AAClF,wBAAgB,gCAAgC,CAC9C,IAAI,EAAE,OAAO,GACZ,oBAAoB,GAAG,SAAS,CAelC;AAED;;;GAGG;AACH,wBAAgB,2BAA2B,CACzC,YAAY,EAAE,OAAO,EACrB,OAAO,CAAC,EAAE,2BAA2B,GACpC,MAAM,GAAG,SAAS,CAkCpB;AAED,4EAA4E;AAC5E,wBAAgB,4BAA4B,CAC1C,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,2BAA2B,GACpC,MAAM,GAAG,SAAS,CAsBpB"}