@exellix/graph-composer 2.10.0 → 2.12.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/CHANGELOG.md +29 -0
- package/README.md +2 -2
- package/dist/aiTaskProfile.d.ts +10 -8
- package/dist/aiTaskProfile.d.ts.map +1 -1
- package/dist/aiTaskProfile.js +27 -19
- package/dist/canonicalGraphDocument.d.ts.map +1 -1
- package/dist/canonicalGraphDocument.js +22 -60
- package/dist/canonicalGraphWarnings.d.ts.map +1 -1
- package/dist/canonicalGraphWarnings.js +2 -1
- package/dist/catalogMatchAssist.d.ts.map +1 -1
- package/dist/catalogMatchAssist.js +10 -2
- package/dist/cataloxCatalogBridge.js +1 -1
- package/dist/exampleGeneration.d.ts.map +1 -1
- package/dist/exampleGeneration.js +7 -17
- package/dist/graphComposerActions.d.ts.map +1 -1
- package/dist/graphComposerActions.js +1 -10
- package/dist/graphComposerOutputValidation.d.ts +1 -1
- package/dist/graphComposerOutputValidation.d.ts.map +1 -1
- package/dist/graphComposerOutputValidation.js +8 -5
- package/dist/graphEntryContract.d.ts +0 -23
- package/dist/graphEntryContract.d.ts.map +1 -1
- package/dist/graphEntryContract.js +1 -125
- package/dist/graphEntryOutputValidation.d.ts +0 -1
- package/dist/graphEntryOutputValidation.d.ts.map +1 -1
- package/dist/graphEntryOutputValidation.js +3 -48
- package/dist/graphEntryPostProcess.d.ts.map +1 -1
- package/dist/graphEntryPostProcess.js +3 -7
- package/dist/index.d.ts +3 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/types.d.ts +4 -2
- package/dist/types.d.ts.map +1 -1
- package/examples/network-vuln-subnet-triage.v2.json +0 -3
- package/functions/graph-composer/meta.json +1 -1
- package/functions/graph-composer/prompts/action-create.md +9 -7
- package/functions/graph-composer/prompts/action-review-concept.md +3 -3
- package/functions/graph-composer/prompts/judge-rules.md +2 -2
- package/functions/graph-composer/prompts/shared/graph-format.md +2 -2
- package/functions/graph-composer/prompts/shared/structural-validation.md +2 -2
- package/package.json +18 -17
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,34 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 2.12.0 — Graphenix 2.7.3 + webQueryTemplate authoring
|
|
4
|
+
|
|
5
|
+
### Breaking
|
|
6
|
+
|
|
7
|
+
- **Legacy web scope:** Create/modify validation rejects `webScoping` on task nodes and requirements; canonicalizer strips `aiTaskProfile.webScoping` if present. Use **`webQueryTemplate`** / **`webQueryTemplates[]`** under **`taskConfiguration.aiTaskProfile`**.
|
|
8
|
+
- **Narrix web keys:** Validation rejects `enableWebScope`, `forceWebScope`, `webScopeQuestions` on **`taskConfiguration.narrix`** (discovery-only narrix remains).
|
|
9
|
+
|
|
10
|
+
### Changed
|
|
11
|
+
|
|
12
|
+
- **Peer / dev:** `@exellix/graph-engine` **^8.6.0**, `@exellix/ai-tasks` **^10.0.13**, `@exellix/ai-skills` **^6.12.5**.
|
|
13
|
+
- **npm overrides** — `@x12i/graphenix-*` **^2.7.3** (format ^2.0.0).
|
|
14
|
+
- **Prompts / judge rules** — aligned with webQueryTemplate + no legacy narrix web keys.
|
|
15
|
+
|
|
16
|
+
### Downstream
|
|
17
|
+
|
|
18
|
+
- **graphs-studio:** `docs/handoff/graphs-studio-graphenix-2.7.3.md` — pin composer **2.12.0** + engine **8.6.0**.
|
|
19
|
+
|
|
20
|
+
## 2.11.0 — Graphenix 2.7.0 + CR-006 alignment
|
|
21
|
+
|
|
22
|
+
### Breaking
|
|
23
|
+
|
|
24
|
+
- **CR-006:** Removed `suggestGraphEntryInputs` action, `GraphEntryInputRow` / `inputs` patch types, `validateGraphEntryInputRows`, and entity-binding helpers tied to graph-entry inputs. Graphs must not declare `metadata.graphEntry.inputs`.
|
|
25
|
+
|
|
26
|
+
### Changed
|
|
27
|
+
|
|
28
|
+
- **Peer / dev dependencies:** `@exellix/graph-engine` ^8.5.0, `@exellix/ai-tasks` ^10.0.9, `@exellix/ai-skills` ^6.12.3.
|
|
29
|
+
- **npm overrides** — `@x12i/graphenix-*` **^2.7.0** (format ^2.0.0).
|
|
30
|
+
- **`buildGraphEntryExampleGuidance`** — uses `requiredExecutionPaths` only (no inputs-based schema).
|
|
31
|
+
|
|
3
32
|
## 2.10.0 — Graphenix 2.5.0 jobMemory.context alignment
|
|
4
33
|
|
|
5
34
|
### Changed
|
package/README.md
CHANGED
|
@@ -26,7 +26,7 @@ FuncX pack / example-generation contract: [docs/funcx-generic-pack-spec.md](./do
|
|
|
26
26
|
## Install
|
|
27
27
|
|
|
28
28
|
```bash
|
|
29
|
-
npm install @exellix/graph-composer @exellix/graph-engine@^8.
|
|
29
|
+
npm install @exellix/graph-composer @exellix/graph-engine@^8.6.0 @exellix/ai-tasks@^10.0.13
|
|
30
30
|
```
|
|
31
31
|
|
|
32
32
|
Requires **Node.js 20+** (Catalox embedder and this package align on `>=20`).
|
|
@@ -298,7 +298,7 @@ graph-composer explain-basic
|
|
|
298
298
|
| `validateSuggestCatalogResolutionOutput`, `validateSuggestCatalogCreationsOutput`, `validateSuggestScopingNeedMatchOutput`, `validateSuggestScopingMapCreationOutput`, `validateReviewConceptOutput` | Offline output validators for tests / hosts. |
|
|
299
299
|
| Types: `GraphComposerInput`, `GraphComposerAgentInput`, `GraphComposerIntent`, `CatalogCandidates`, `ScopingMapCandidate`, `NarrixTemplateCandidate`, … | See `dist/index.d.ts`. |
|
|
300
300
|
| `loadCatalogCandidatesFromCatalox`, `createCatalox`, `unifiedCatalogItemToSkillDescriptor`, … | Build `catalogCandidates` from **Catalox** catalogs; see [`docs/catalog-metadb-end-state-contract.md`](./docs/catalog-metadb-end-state-contract.md). |
|
|
301
|
-
| `reportTaskNodeProtocolGaps` | Offline list of **AI task** nodes violating **`taskConfiguration.aiTaskProfile`** (pre/post, **`
|
|
301
|
+
| `reportTaskNodeProtocolGaps` | Offline list of **AI task** nodes violating **`taskConfiguration.aiTaskProfile`** (pre/post, **`webQueryTemplate`** when web scope is needed, **`inputSynthesis`** fields when synthesis is on). See `docs/task-node-execution-protocol.md`. |
|
|
302
302
|
| `collectCanonicalGraphWarnings` | Warn-first **`@exellix/graph-engine`** canonical checks (top-level keys, metadata placement, memory paths, model profile aliases). |
|
|
303
303
|
| `collectGraphOrchestratorInvokeWarnings` | Authoring: **`taskConfiguration.llmCall.reasoningEffort`**, reject **`maxTokens`** on **`modelConfig`**. |
|
|
304
304
|
| **Studio preflight** | **`analyzeTaskNodeRunTaskRequest`**, **`analyzeRunTaskRequest`**, **`buildSkillRequestAnalysisPacket`**, **`formatSkillRequestAnalysisMarkdown`**, **`FUNCX_ANALYZE_GATEWAY_INVOKE_REQUEST_ID`** — moved from graph-engine / ai-tasks 8.6; see [`docs/graph-entry-agent-contract.md`](./docs/graph-entry-agent-contract.md). |
|
package/dist/aiTaskProfile.d.ts
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import type { SkillDescriptor } from "./types.js";
|
|
2
2
|
/**
|
|
3
|
-
* Web
|
|
3
|
+
* Web scope for this node: Rendrix query template compiled to PRE `webScope` unit (Graphenix 2.7.3+).
|
|
4
4
|
* See `docs/task-node-execution-protocol.md`.
|
|
5
5
|
*/
|
|
6
|
-
export type
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
6
|
+
export type WebQueryTemplateConfig = {
|
|
7
|
+
webQueryTemplate?: string;
|
|
8
|
+
webQueryTemplates?: string[];
|
|
9
|
+
webScopeOptions?: Record<string, unknown>;
|
|
10
10
|
};
|
|
11
11
|
export type InputSynthesisDestination = "job" | "task" | "execution";
|
|
12
12
|
/**
|
|
@@ -44,12 +44,14 @@ export type InputSynthesisNodeConfig = {
|
|
|
44
44
|
export type AiTaskProfileMetadata = {
|
|
45
45
|
preStrategyKey: string;
|
|
46
46
|
postStrategyKey: string;
|
|
47
|
-
|
|
47
|
+
webQueryTemplate?: string;
|
|
48
|
+
webQueryTemplates?: string[];
|
|
49
|
+
webScopeOptions?: Record<string, unknown>;
|
|
48
50
|
inputSynthesis?: InputSynthesisNodeConfig;
|
|
49
51
|
};
|
|
50
52
|
/** Built-in worox-graph local skills — no aiTaskProfile required. */
|
|
51
53
|
export declare const DEFAULT_LOCAL_SKILL_KEYS: readonly string[];
|
|
52
|
-
export type TaskNodeProtocolIssueCode = "missing_preStrategyKey" | "missing_postStrategyKey" | "
|
|
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";
|
|
53
55
|
export type TaskNodeProtocolGap = {
|
|
54
56
|
nodeId: string;
|
|
55
57
|
skillKey: string;
|
|
@@ -57,7 +59,7 @@ export type TaskNodeProtocolGap = {
|
|
|
57
59
|
};
|
|
58
60
|
/**
|
|
59
61
|
* Lists **AI task** nodes that violate the **task node execution protocol**
|
|
60
|
-
* (pre/post strategies, web
|
|
62
|
+
* (pre/post strategies, web query template, input synthesis strategy).
|
|
61
63
|
*/
|
|
62
64
|
export declare function reportTaskNodeProtocolGaps(graph: object, options?: {
|
|
63
65
|
utilitySkills?: SkillDescriptor[];
|
|
@@ -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,
|
|
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"}
|
package/dist/aiTaskProfile.js
CHANGED
|
@@ -26,16 +26,14 @@ function readAiTaskProfileFromRecord(container) {
|
|
|
26
26
|
const p = readRecord(raw);
|
|
27
27
|
if (p === undefined)
|
|
28
28
|
return {};
|
|
29
|
-
const
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
web = { enabled, ...(questions !== undefined && questions.length > 0 ? { questions } : {}) };
|
|
38
|
-
}
|
|
29
|
+
const legacyWebScoping = p.webScoping !== undefined;
|
|
30
|
+
const webQueryTemplate = nonEmptyString(p.webQueryTemplate)
|
|
31
|
+
? p.webQueryTemplate.trim()
|
|
32
|
+
: undefined;
|
|
33
|
+
const qraw = p.webQueryTemplates;
|
|
34
|
+
const webQueryTemplates = Array.isArray(qraw)
|
|
35
|
+
? qraw.filter((x) => nonEmptyString(x)).map((s) => s.trim())
|
|
36
|
+
: undefined;
|
|
39
37
|
const synRaw = readRecord(p.inputSynthesis);
|
|
40
38
|
let synthesis;
|
|
41
39
|
if (synRaw !== undefined) {
|
|
@@ -72,10 +70,19 @@ function readAiTaskProfileFromRecord(container) {
|
|
|
72
70
|
return {
|
|
73
71
|
pre: nonEmptyString(p.preStrategyKey) ? p.preStrategyKey.trim() : undefined,
|
|
74
72
|
post: nonEmptyString(p.postStrategyKey) ? p.postStrategyKey.trim() : undefined,
|
|
75
|
-
...(
|
|
73
|
+
...(webQueryTemplate !== undefined ? { webQueryTemplate } : {}),
|
|
74
|
+
...(webQueryTemplates !== undefined && webQueryTemplates.length > 0
|
|
75
|
+
? { webQueryTemplates }
|
|
76
|
+
: {}),
|
|
77
|
+
...(legacyWebScoping ? { legacyWebScoping: true } : {}),
|
|
76
78
|
...(synthesis !== undefined ? { synthesis } : {}),
|
|
77
79
|
};
|
|
78
80
|
}
|
|
81
|
+
function hasWebQueryAuthoring(profile) {
|
|
82
|
+
if (nonEmptyString(profile.webQueryTemplate))
|
|
83
|
+
return true;
|
|
84
|
+
return (profile.webQueryTemplates?.length ?? 0) > 0;
|
|
85
|
+
}
|
|
79
86
|
function hasSynthesisPipelineConflict(node) {
|
|
80
87
|
const tc = readRecord(node.taskConfiguration);
|
|
81
88
|
const profile = readRecord(tc?.aiTaskProfile);
|
|
@@ -109,7 +116,7 @@ function localSkillKeySet(utilitySkills, extraLocal) {
|
|
|
109
116
|
}
|
|
110
117
|
/**
|
|
111
118
|
* Lists **AI task** nodes that violate the **task node execution protocol**
|
|
112
|
-
* (pre/post strategies, web
|
|
119
|
+
* (pre/post strategies, web query template, input synthesis strategy).
|
|
113
120
|
*/
|
|
114
121
|
export function reportTaskNodeProtocolGaps(graph, options) {
|
|
115
122
|
const localKeys = localSkillKeySet(options?.utilitySkills, options?.extraLocalSkillKeys);
|
|
@@ -136,20 +143,21 @@ export function reportTaskNodeProtocolGaps(graph, options) {
|
|
|
136
143
|
const fromMeta = readAiTaskProfileFromRecord(meta);
|
|
137
144
|
const pre = fromTaskConfig.pre ?? fromMeta.pre;
|
|
138
145
|
const post = fromTaskConfig.post ?? fromMeta.post;
|
|
139
|
-
const
|
|
146
|
+
const webQueryTemplate = fromTaskConfig.webQueryTemplate ?? fromMeta.webQueryTemplate;
|
|
147
|
+
const webQueryTemplates = fromTaskConfig.webQueryTemplates ?? fromMeta.webQueryTemplates;
|
|
148
|
+
const legacyWebScoping = fromTaskConfig.legacyWebScoping === true || fromMeta.legacyWebScoping === true;
|
|
140
149
|
const synthesis = fromTaskConfig.synthesis ?? fromMeta.synthesis;
|
|
141
150
|
const issues = [];
|
|
142
151
|
if (pre === undefined)
|
|
143
152
|
issues.push("missing_preStrategyKey");
|
|
144
153
|
if (post === undefined)
|
|
145
154
|
issues.push("missing_postStrategyKey");
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
if (wsEnabled && questions.length === 0) {
|
|
149
|
-
issues.push("web_scoping_enabled_without_questions");
|
|
155
|
+
if (legacyWebScoping) {
|
|
156
|
+
issues.push("legacy_web_scoping");
|
|
150
157
|
}
|
|
151
|
-
if (
|
|
152
|
-
|
|
158
|
+
if (hasWebQueryAuthoring({ webQueryTemplate, webQueryTemplates }) &&
|
|
159
|
+
webQueryTemplate === "input.question") {
|
|
160
|
+
issues.push("web_query_template_invalid");
|
|
153
161
|
}
|
|
154
162
|
if (synthesis?.enabled === true) {
|
|
155
163
|
if (!nonEmptyString(synthesis.catalogId)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"canonicalGraphDocument.d.ts","sourceRoot":"","sources":["../src/canonicalGraphDocument.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"canonicalGraphDocument.d.ts","sourceRoot":"","sources":["../src/canonicalGraphDocument.ts"],"names":[],"mappings":"AAAA;;GAEG;AA0ZH,qFAAqF;AACrF,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAc7E;AAyBD,wBAAgB,8BAA8B,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAkCtF;AAED,wBAAgB,6BAA6B,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAWpF"}
|
|
@@ -33,6 +33,7 @@ const FORBIDDEN_GRAPH_RESPONSE_KEYS = [
|
|
|
33
33
|
"mappingPreset",
|
|
34
34
|
];
|
|
35
35
|
const FORBIDDEN_NARRIX_WEB_KEYS = [
|
|
36
|
+
"enableWebScope",
|
|
36
37
|
"webScopeQuestions",
|
|
37
38
|
"webScoping",
|
|
38
39
|
"webScopeTemplates",
|
|
@@ -234,45 +235,8 @@ function canonicalizeTaskConfigurationExecutionStrategies(node) {
|
|
|
234
235
|
}
|
|
235
236
|
return changed;
|
|
236
237
|
}
|
|
237
|
-
function
|
|
238
|
-
const raw = narrix.webScopeQuestions;
|
|
239
|
-
if (!Array.isArray(raw))
|
|
240
|
-
return [];
|
|
241
|
-
const out = [];
|
|
242
|
-
for (const item of raw) {
|
|
243
|
-
if (typeof item === "string" && item.trim() !== "") {
|
|
244
|
-
out.push(item.trim());
|
|
245
|
-
continue;
|
|
246
|
-
}
|
|
247
|
-
const o = readRecord(item);
|
|
248
|
-
const q = o?.question;
|
|
249
|
-
if (typeof q === "string" && q.trim() !== "")
|
|
250
|
-
out.push(q.trim());
|
|
251
|
-
}
|
|
252
|
-
return out;
|
|
253
|
-
}
|
|
254
|
-
function mergeWebScopingFromNarrix(taskConfiguration, narrix) {
|
|
238
|
+
function stripForbiddenNarrixWebKeys(narrix) {
|
|
255
239
|
let changed = false;
|
|
256
|
-
const questions = extractWebQuestionsFromNarrix(narrix);
|
|
257
|
-
const enabled = narrix.enableWebScope === true ||
|
|
258
|
-
narrix.forceWebScope === true ||
|
|
259
|
-
questions.length > 0;
|
|
260
|
-
const profile = {
|
|
261
|
-
...readRecord(taskConfiguration.aiTaskProfile),
|
|
262
|
-
};
|
|
263
|
-
const existingWeb = readRecord(profile.webScoping);
|
|
264
|
-
const existingQuestions = Array.isArray(existingWeb?.questions)
|
|
265
|
-
? existingWeb.questions.filter((x) => nonEmptyString(x))
|
|
266
|
-
: [];
|
|
267
|
-
if (questions.length > 0 || enabled) {
|
|
268
|
-
const mergedQuestions = [...new Set([...existingQuestions, ...questions])];
|
|
269
|
-
profile.webScoping = {
|
|
270
|
-
enabled: existingWeb?.enabled === true || enabled || mergedQuestions.length > 0,
|
|
271
|
-
...(mergedQuestions.length > 0 ? { questions: mergedQuestions } : {}),
|
|
272
|
-
};
|
|
273
|
-
taskConfiguration.aiTaskProfile = profile;
|
|
274
|
-
changed = true;
|
|
275
|
-
}
|
|
276
240
|
for (const k of FORBIDDEN_NARRIX_WEB_KEYS) {
|
|
277
241
|
if (k in narrix) {
|
|
278
242
|
delete narrix[k];
|
|
@@ -281,14 +245,28 @@ function mergeWebScopingFromNarrix(taskConfiguration, narrix) {
|
|
|
281
245
|
}
|
|
282
246
|
return changed;
|
|
283
247
|
}
|
|
284
|
-
function
|
|
248
|
+
function rejectLegacyWebScopingOnProfile(taskConfiguration) {
|
|
249
|
+
const profile = readRecord(taskConfiguration.aiTaskProfile);
|
|
250
|
+
if (profile === undefined || !("webScoping" in profile))
|
|
251
|
+
return false;
|
|
252
|
+
delete profile.webScoping;
|
|
253
|
+
taskConfiguration.aiTaskProfile = profile;
|
|
254
|
+
return true;
|
|
255
|
+
}
|
|
256
|
+
function canonicalizeNarrixWebOnNode(node) {
|
|
257
|
+
const tc = readRecord(node.taskConfiguration);
|
|
258
|
+
if (tc === undefined)
|
|
259
|
+
return false;
|
|
285
260
|
let changed = false;
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
261
|
+
const narrix = readRecord(tc.narrix);
|
|
262
|
+
if (narrix !== undefined && stripForbiddenNarrixWebKeys(narrix)) {
|
|
263
|
+
changed = true;
|
|
264
|
+
}
|
|
265
|
+
if (rejectLegacyWebScopingOnProfile(tc)) {
|
|
266
|
+
changed = true;
|
|
291
267
|
}
|
|
268
|
+
if (changed)
|
|
269
|
+
node.taskConfiguration = tc;
|
|
292
270
|
return changed;
|
|
293
271
|
}
|
|
294
272
|
function liftSkillKeyAndVariables(node) {
|
|
@@ -398,22 +376,6 @@ function removeLegacySynthesisFlags(node) {
|
|
|
398
376
|
node.taskConfiguration = { ...tc, aiTaskProfile: nextProfile };
|
|
399
377
|
return true;
|
|
400
378
|
}
|
|
401
|
-
function canonicalizeNarrixWebOnNode(node) {
|
|
402
|
-
const tc = readRecord(node.taskConfiguration);
|
|
403
|
-
if (tc === undefined)
|
|
404
|
-
return false;
|
|
405
|
-
let changed = false;
|
|
406
|
-
const narrix = readRecord(tc.narrix);
|
|
407
|
-
if (narrix !== undefined && mergeWebScopingFromNarrix(tc, narrix)) {
|
|
408
|
-
changed = true;
|
|
409
|
-
}
|
|
410
|
-
if (narrix !== undefined && stripForbiddenNarrixWebKeys(narrix)) {
|
|
411
|
-
changed = true;
|
|
412
|
-
}
|
|
413
|
-
if (changed)
|
|
414
|
-
node.taskConfiguration = tc;
|
|
415
|
-
return changed;
|
|
416
|
-
}
|
|
417
379
|
/** Convert record-keyed `nodes` to an array; returns whether conversion happened. */
|
|
418
380
|
export function normalizeNodesToArray(graph) {
|
|
419
381
|
const nodes = graph.nodes;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"canonicalGraphWarnings.d.ts","sourceRoot":"","sources":["../src/canonicalGraphWarnings.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"canonicalGraphWarnings.d.ts","sourceRoot":"","sources":["../src/canonicalGraphWarnings.ts"],"names":[],"mappings":"AAmIA;;;GAGG;AACH,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAgIrE"}
|
|
@@ -53,6 +53,7 @@ const FORBIDDEN_TASK_METADATA_EXECUTION_KEYS = new Set([
|
|
|
53
53
|
"woroxContractTarget",
|
|
54
54
|
]);
|
|
55
55
|
const FORBIDDEN_NARRIX_WEB_KEYS = [
|
|
56
|
+
"enableWebScope",
|
|
56
57
|
"webScopeQuestions",
|
|
57
58
|
"webScoping",
|
|
58
59
|
"webScopeTemplates",
|
|
@@ -165,7 +166,7 @@ export function collectCanonicalGraphWarnings(graph) {
|
|
|
165
166
|
if (narrix !== undefined) {
|
|
166
167
|
for (const k of FORBIDDEN_NARRIX_WEB_KEYS) {
|
|
167
168
|
if (k in narrix) {
|
|
168
|
-
warnings.push(`${prefix}: taskConfiguration.narrix.${k} is forbidden — author web scope under taskConfiguration.aiTaskProfile.
|
|
169
|
+
warnings.push(`${prefix}: taskConfiguration.narrix.${k} is forbidden — author web scope under taskConfiguration.aiTaskProfile.webQueryTemplate.`);
|
|
169
170
|
}
|
|
170
171
|
}
|
|
171
172
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"catalogMatchAssist.d.ts","sourceRoot":"","sources":["../src/catalogMatchAssist.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C,OAAO,KAAK,EAEV,kBAAkB,EAGlB,eAAe,EAChB,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"catalogMatchAssist.d.ts","sourceRoot":"","sources":["../src/catalogMatchAssist.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C,OAAO,KAAK,EAEV,kBAAkB,EAGlB,eAAe,EAChB,MAAM,YAAY,CAAC;AA0KpB,MAAM,MAAM,yBAAyB,GAAG;IACtC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF;;;GAGG;AACH,wBAAsB,sBAAsB,CAC1C,KAAK,EAAE,kBAAkB,GAAG;IAC1B,SAAS,EAAE,QAAQ,GAAG,YAAY,CAAC;IACnC,QAAQ,EAAE,eAAe,EAAE,CAAC;IAC5B,aAAa,EAAE,eAAe,EAAE,CAAC;CAClC,EACD,IAAI,EAAE,yBAAyB,GAC9B,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC,CAmF9C"}
|
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
import { matchLists } from "@x12i/funcx/functions";
|
|
2
2
|
import { resolveFuncxModel } from "./funcxModel.js";
|
|
3
|
+
function readRecord(v) {
|
|
4
|
+
if (v === null || v === undefined || typeof v !== "object" || Array.isArray(v)) {
|
|
5
|
+
return undefined;
|
|
6
|
+
}
|
|
7
|
+
return v;
|
|
8
|
+
}
|
|
3
9
|
function mergeBySkillKey(a, b) {
|
|
4
10
|
if (!b?.length)
|
|
5
11
|
return [...a];
|
|
@@ -93,6 +99,8 @@ function narrixNodeSummary(node) {
|
|
|
93
99
|
return null;
|
|
94
100
|
}
|
|
95
101
|
const n = narrix;
|
|
102
|
+
const tc = readRecord(node.taskConfiguration);
|
|
103
|
+
const profile = readRecord(tc?.aiTaskProfile);
|
|
96
104
|
const id = typeof node.id === "string" ? node.id : "(no-id)";
|
|
97
105
|
const skillKey = typeof node.skillKey === "string" ? node.skillKey : undefined;
|
|
98
106
|
return {
|
|
@@ -101,9 +109,9 @@ function narrixNodeSummary(node) {
|
|
|
101
109
|
narrix: {
|
|
102
110
|
datasetId: n.datasetId,
|
|
103
111
|
layer: n.layer,
|
|
104
|
-
enableWebScope: n.enableWebScope,
|
|
105
112
|
narrativeTypeIds: n.narrativeTypeIds,
|
|
106
113
|
},
|
|
114
|
+
webQueryTemplate: typeof profile?.webQueryTemplate === "string" ? profile.webQueryTemplate : undefined,
|
|
107
115
|
};
|
|
108
116
|
}
|
|
109
117
|
function skillCatalogItems(skills) {
|
|
@@ -131,7 +139,7 @@ function narrixCatalogItems(templates) {
|
|
|
131
139
|
datasetId: t.datasetId,
|
|
132
140
|
layer: t.layer,
|
|
133
141
|
narrativeTypeIds: t.narrativeTypeIds ?? [],
|
|
134
|
-
|
|
142
|
+
...(t.webQueryTemplate !== undefined ? { webQueryTemplate: t.webQueryTemplate } : {}),
|
|
135
143
|
tags: t.tags ?? [],
|
|
136
144
|
}));
|
|
137
145
|
}
|
|
@@ -127,7 +127,7 @@ export function unifiedCatalogItemToNarrixTemplateCandidate(item) {
|
|
|
127
127
|
datasetId: pickStr(d.datasetId) ?? pickStr(d.dataset_id),
|
|
128
128
|
layer: pickStr(d.layer),
|
|
129
129
|
narrativeTypeIds: pickStrArray(d.narrativeTypeIds) ?? pickStrArray(d.narrative_type_ids),
|
|
130
|
-
|
|
130
|
+
webQueryTemplate: pickStr(d.webQueryTemplate) ?? pickStr(d.web_query_template),
|
|
131
131
|
tags: pickStrArray(d.tags),
|
|
132
132
|
};
|
|
133
133
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"exampleGeneration.d.ts","sourceRoot":"","sources":["../src/exampleGeneration.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,EACtB,mBAAmB,EACnB,iBAAiB,EACjB,KAAK,oBAAoB,EACzB,KAAK,4BAA4B,EACjC,KAAK,4BAA4B,EACjC,KAAK,yBAAyB,EAC9B,KAAK,uBAAuB,EAC5B,KAAK,uBAAuB,EAC7B,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"exampleGeneration.d.ts","sourceRoot":"","sources":["../src/exampleGeneration.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,EACtB,mBAAmB,EACnB,iBAAiB,EACjB,KAAK,oBAAoB,EACzB,KAAK,4BAA4B,EACjC,KAAK,4BAA4B,EACjC,KAAK,yBAAyB,EAC9B,KAAK,uBAAuB,EAC5B,KAAK,uBAAuB,EAC7B,MAAM,uBAAuB,CAAC;AAI/B,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,YAAY,CAAC;AAI7D,MAAM,MAAM,mCAAmC,GAAG,oBAAoB,GAAG;IACvE,+DAA+D;IAC/D,UAAU,EAAE,OAAO,CAAC;IACpB,oFAAoF;IACpF,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,uEAAuE;IACvE,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,iDAAiD;IACjD,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC;CACtB,CAAC;AA0DF,wBAAgB,8BAA8B,CAC5C,aAAa,EAAE,MAAM,GAAG,SAAS,EACjC,QAAQ,GAAE,MAAM,EAAO,GACtB,MAAM,EAAE,CASV;AAED,wBAAsB,6BAA6B,CACjD,MAAM,EAAE,mCAAmC,GAC1C,OAAO,CAAC,yBAAyB,CAAC,CAcpC;AAED,wBAAgB,8BAA8B,CAC5C,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,GAAG,SAAS,EACxD,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACtC,cAAc,CAAC,EAAE,0BAA0B,EAC3C,aAAa,GAAE,MAAM,EAAO,GAC3B,MAAM,EAAE,CA0BV;AAED,MAAM,MAAM,oCAAoC,GAAG,oBAAoB,GAAG;IACxE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC;IAC9C,cAAc,CAAC,EAAE,0BAA0B,CAAC;IAC5C,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC;IACrB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB,CAAC;AAEF,wBAAsB,8BAA8B,CAClD,MAAM,EAAE,oCAAoC,GAC3C,OAAO,CAAC,yBAAyB,CAAC,CAmCpC;AAED,OAAO,EACL,sBAAsB,EACtB,mBAAmB,EACnB,iBAAiB,EACjB,KAAK,4BAA4B,EACjC,KAAK,4BAA4B,EACjC,KAAK,yBAAyB,EAC9B,KAAK,uBAAuB,EAC5B,KAAK,uBAAuB,GAC7B,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { generateContentExample, generateJsonExample, generateMdExample, } from "@x12i/funcx/functions";
|
|
2
|
-
import {
|
|
2
|
+
import { resolveEffectiveGraphEntry, } from "./graphEntryContract.js";
|
|
3
3
|
function asObject(v) {
|
|
4
4
|
return v !== null && typeof v === "object" && !Array.isArray(v)
|
|
5
5
|
? v
|
|
@@ -74,24 +74,11 @@ export function buildGraphEntryExampleGuidance(graphEntry, graphConcept, entityB
|
|
|
74
74
|
const entry = resolveEffectiveGraphEntry(graphEntry !== undefined && typeof graphEntry === "object"
|
|
75
75
|
? graphEntry
|
|
76
76
|
: undefined);
|
|
77
|
-
const inputs = Array.isArray(entry.inputs) ? entry.inputs : [];
|
|
78
|
-
const pathHints = inputs
|
|
79
|
-
.slice(0, 12)
|
|
80
|
-
.map((row, i) => {
|
|
81
|
-
const r = row;
|
|
82
|
-
const path = typeof r.path === "string" ? r.path : "";
|
|
83
|
-
const kind = typeof r.kind === "string" ? r.kind : "scalar";
|
|
84
|
-
return path ? `${i + 1}. ${kind} @ ${path}` : undefined;
|
|
85
|
-
})
|
|
86
|
-
.filter((x) => x !== undefined);
|
|
87
77
|
const hints = [
|
|
88
78
|
"Generate example rows for metadata.graphEntry.exampleInputs (graph job-start contract).",
|
|
89
79
|
"Each example value must be a string; use format json with parseable JSON in value.",
|
|
90
|
-
"Paths
|
|
80
|
+
"Paths are dot-paths under execution.input (e.g. execution.input.subnetId).",
|
|
91
81
|
];
|
|
92
|
-
if (pathHints.length > 0) {
|
|
93
|
-
hints.push(`Declared entry inputs: ${pathHints.join(" | ")}.`);
|
|
94
|
-
}
|
|
95
82
|
if (entityBindings?.coreEntityCollectionId) {
|
|
96
83
|
hints.push(`Core entity collection: ${entityBindings.coreEntityCollectionId}.`);
|
|
97
84
|
}
|
|
@@ -99,6 +86,10 @@ export function buildGraphEntryExampleGuidance(graphEntry, graphConcept, entityB
|
|
|
99
86
|
if (typeof expected === "string" && expected.trim()) {
|
|
100
87
|
hints.push(`Concept expectedInput: ${truncate(expected)}.`);
|
|
101
88
|
}
|
|
89
|
+
const requiredPaths = entry.requiredExecutionPaths;
|
|
90
|
+
if (Array.isArray(requiredPaths) && requiredPaths.length > 0) {
|
|
91
|
+
hints.push(`Required execution paths: ${requiredPaths.join(", ")}.`);
|
|
92
|
+
}
|
|
102
93
|
return [...hints, ...extraGuidance];
|
|
103
94
|
}
|
|
104
95
|
export async function generateGraphEntryInputExample(params) {
|
|
@@ -108,8 +99,7 @@ export async function generateGraphEntryInputExample(params) {
|
|
|
108
99
|
: graph !== undefined
|
|
109
100
|
? resolveEffectiveGraphEntry(graph)
|
|
110
101
|
: {};
|
|
111
|
-
const
|
|
112
|
-
const jsonSchema = buildGraphEntryExampleJsonSchema(inputs, entityBindings);
|
|
102
|
+
const jsonSchema = { type: "object", additionalProperties: true };
|
|
113
103
|
const concept = graph !== null && graph !== undefined && typeof graph === "object"
|
|
114
104
|
? graph.metadata?.graphConcept
|
|
115
105
|
: undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"graphComposerActions.d.ts","sourceRoot":"","sources":["../src/graphComposerActions.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACtD,OAAO,EACL,KAAK,eAAe,EASrB,MAAM,oCAAoC,CAAC;
|
|
1
|
+
{"version":3,"file":"graphComposerActions.d.ts","sourceRoot":"","sources":["../src/graphComposerActions.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACtD,OAAO,EACL,KAAK,eAAe,EASrB,MAAM,oCAAoC,CAAC;AAW5C,MAAM,MAAM,mBAAmB,GAAG,mBAAmB,CAAC,QAAQ,CAAC,CAAC;AAEhE,MAAM,MAAM,6BAA6B,GAAG;IAC1C,QAAQ,CAAC,MAAM,EAAE,mBAAmB,CAAC;IACrC,uDAAuD;IACvD,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,yDAAyD;IACzD,QAAQ,CAAC,cAAc,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3C,QAAQ,CAAC,qBAAqB,EAAE,OAAO,CAAC;IACxC,oDAAoD;IACpD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,cAAc,EAAE,eAAe,CAAC;CAC1C,CAAC;AAaF,eAAO,MAAM,8BAA8B,EAAE,SAAS,6BAA6B,EA8LvE,CAAC;AAYb,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,MAAM,GACb,6BAA6B,CAQ/B;AAED,wBAAgB,6BAA6B,CAC3C,QAAQ,EAAE,MAAM,GACf,6BAA6B,GAAG,SAAS,CAE3C;AAED,uEAAuE;AACvE,wBAAgB,+BAA+B,IAAI,MAAM,EAAE,CAQ1D;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,mBAAmB,GAAG,MAAM,CAS1E"}
|
|
@@ -2,7 +2,7 @@ import { readFileSync, existsSync } from "node:fs";
|
|
|
2
2
|
import path from "node:path";
|
|
3
3
|
import { graphComposerPackRoot } from "./packDir.js";
|
|
4
4
|
import { validateCreateModifyOutput, validateExplainOutput, validateSuggestCatalogCreationsOutput, validateSuggestCatalogResolutionOutput, validateSuggestConceptOutput, validateSuggestScopingMapCreationOutput, validateSuggestScopingNeedMatchOutput, validateReviewConceptOutput, } from "./graphComposerOutputValidation.js";
|
|
5
|
-
import { validateReviewGraphEntryContractOutput,
|
|
5
|
+
import { validateReviewGraphEntryContractOutput, validateSuggestGraphEntryExamplesOutput, validateSuggestGraphEntryConditionsOutput, validateSuggestJobModelDefaultsOutput, validateSuggestJobKnowledgeRefsOutput, validateSuggestGraphExecutionDefaultsOutput, } from "./graphEntryOutputValidation.js";
|
|
6
6
|
import { GRAPH_ENTRY_SHARED_INCLUDES } from "./graphEntryPostProcess.js";
|
|
7
7
|
function readPromptRelative(rel) {
|
|
8
8
|
const root = graphComposerPackRoot();
|
|
@@ -142,15 +142,6 @@ export const GRAPH_COMPOSER_ACTION_REGISTRY = [
|
|
|
142
142
|
toolDescription: "Review job-start graphEntry contract, job defaults, and alignment with graphConcept Lane 1. Returns verdict, graph-scoped findings, optional partial patches. No graph JSON.",
|
|
143
143
|
validateOutput: validateReviewGraphEntryContractOutput,
|
|
144
144
|
},
|
|
145
|
-
{
|
|
146
|
-
action: "suggestGraphEntryInputs",
|
|
147
|
-
promptFile: "action-suggest-graph-entry-inputs.md",
|
|
148
|
-
sharedIncludes: GRAPH_ENTRY_SHARED_INCLUDES,
|
|
149
|
-
requiresExistingGraph: true,
|
|
150
|
-
toolName: "graph_suggest_graph_entry_inputs",
|
|
151
|
-
toolDescription: "Propose metadata.graphEntry.inputs rows (execution.input.* paths). No graph JSON.",
|
|
152
|
-
validateOutput: validateSuggestGraphEntryInputsOutput,
|
|
153
|
-
},
|
|
154
145
|
{
|
|
155
146
|
action: "suggestGraphEntryExamples",
|
|
156
147
|
promptFile: "action-suggest-graph-entry-examples.md",
|
|
@@ -4,7 +4,7 @@ export type OutputValidationContext = {
|
|
|
4
4
|
input?: GraphComposerInput;
|
|
5
5
|
};
|
|
6
6
|
export type OutputValidator = (out: Record<string, unknown>, ctx?: OutputValidationContext) => void;
|
|
7
|
-
export { validateReviewGraphEntryContractOutput,
|
|
7
|
+
export { validateReviewGraphEntryContractOutput, validateSuggestGraphEntryExamplesOutput, validateSuggestGraphEntryConditionsOutput, validateSuggestJobModelDefaultsOutput, validateSuggestJobKnowledgeRefsOutput, validateSuggestGraphExecutionDefaultsOutput, } from "./graphEntryOutputValidation.js";
|
|
8
8
|
export declare function validateExplainOutput(out: Record<string, unknown>, _ctx?: OutputValidationContext): void;
|
|
9
9
|
export declare function validateReviewConceptOutput(out: Record<string, unknown>, _ctx?: OutputValidationContext): void;
|
|
10
10
|
/**
|
|
@@ -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,
|
|
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"}
|
|
@@ -3,7 +3,7 @@ import { collectAuthoringGraphValidationWarnings } from "./authoringGraphValidat
|
|
|
3
3
|
import { collectCanonicalGraphWarnings } from "./canonicalGraphWarnings.js";
|
|
4
4
|
import { assertCanonicalGraphDocument } from "./graphEngineBridge.js";
|
|
5
5
|
import { canonicalizeGraphModel, reportTaskNodeInputsLayoutIssues, taskNodeInputsLayoutWarningMessage, } from "./taskNodeTaskVariable.js";
|
|
6
|
-
export { validateReviewGraphEntryContractOutput,
|
|
6
|
+
export { validateReviewGraphEntryContractOutput, validateSuggestGraphEntryExamplesOutput, validateSuggestGraphEntryConditionsOutput, validateSuggestJobModelDefaultsOutput, validateSuggestJobKnowledgeRefsOutput, validateSuggestGraphExecutionDefaultsOutput, } from "./graphEntryOutputValidation.js";
|
|
7
7
|
const PRIMARY_INTENT_TYPES = new Set([
|
|
8
8
|
"question",
|
|
9
9
|
"decision",
|
|
@@ -229,9 +229,12 @@ function validateReviewConceptCoreTaskPatchItem(t, ctxPrefix) {
|
|
|
229
229
|
}
|
|
230
230
|
}
|
|
231
231
|
if ("webScoping" in t && t.webScoping !== undefined) {
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
232
|
+
throw new Error(`${ctxPrefix}.webScoping is not allowed — use requirements.webQueryTemplate or aiTaskProfile.webQueryTemplate on materialized nodes`);
|
|
233
|
+
}
|
|
234
|
+
if ("webQueryTemplate" in t && t.webQueryTemplate !== undefined) {
|
|
235
|
+
const wqt = t.webQueryTemplate;
|
|
236
|
+
if (typeof wqt !== "string" || wqt.trim() === "") {
|
|
237
|
+
throw new Error(`${ctxPrefix}.webQueryTemplate must be a non-empty string when present`);
|
|
235
238
|
}
|
|
236
239
|
}
|
|
237
240
|
if ("synthesis" in t && t.synthesis !== undefined) {
|
|
@@ -516,7 +519,7 @@ export function validateCreateModifyOutput(out, ctx) {
|
|
|
516
519
|
utilitySkills: ctx?.input?.utilitySkills,
|
|
517
520
|
});
|
|
518
521
|
if (gaps.length > 0) {
|
|
519
|
-
throw new Error(`create/modify graph violates task node protocol (taskConfiguration.aiTaskProfile /
|
|
522
|
+
throw new Error(`create/modify graph violates task node protocol (taskConfiguration.aiTaskProfile / webQueryTemplate / inputSynthesis): ${JSON.stringify(gaps)}`);
|
|
520
523
|
}
|
|
521
524
|
try {
|
|
522
525
|
assertCanonicalGraphDocument(canonicalized);
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import type { GraphConceptEntityBindings } from "./types.js";
|
|
2
1
|
export type ComposerAgentSurface = "graph-entry" | "task-node";
|
|
3
2
|
/** Studio `buildGraphEntryAgentContext` envelope (FR-G1). */
|
|
4
3
|
export type GraphEntryAgentContext = {
|
|
@@ -18,15 +17,6 @@ export type TaskNodeAgentContext = {
|
|
|
18
17
|
lastRunMeta?: Record<string, unknown>;
|
|
19
18
|
};
|
|
20
19
|
export type GraphComposerAgentContext = GraphEntryAgentContext | TaskNodeAgentContext;
|
|
21
|
-
export type GraphEntryInputKind = "scalar" | "record";
|
|
22
|
-
export type GraphEntryInputRow = {
|
|
23
|
-
kind?: GraphEntryInputKind | string;
|
|
24
|
-
path: string;
|
|
25
|
-
required?: boolean;
|
|
26
|
-
entityIds?: string[];
|
|
27
|
-
label?: string;
|
|
28
|
-
description?: string;
|
|
29
|
-
};
|
|
30
20
|
export type GraphEntryExampleFormat = "json" | "markdown" | "text";
|
|
31
21
|
export type GraphEntryExampleRow = {
|
|
32
22
|
path?: string;
|
|
@@ -39,7 +29,6 @@ export type GraphEntryConditionsPatch = {
|
|
|
39
29
|
aiCondition?: Record<string, unknown>;
|
|
40
30
|
};
|
|
41
31
|
export type GraphEntryPatch = {
|
|
42
|
-
inputs?: GraphEntryInputRow[];
|
|
43
32
|
exampleInputs?: GraphEntryExampleRow[];
|
|
44
33
|
conditions?: GraphEntryConditionsPatch;
|
|
45
34
|
};
|
|
@@ -83,21 +72,9 @@ export type GraphResponsePatch = {
|
|
|
83
72
|
studio?: Record<string, unknown>;
|
|
84
73
|
};
|
|
85
74
|
export declare const GRAPH_ENTRY_FINDING_CATEGORIES: Set<string>;
|
|
86
|
-
export declare const GRAPH_ENTRY_PATH_PREFIX = "execution.input.";
|
|
87
75
|
export declare const GRAPH_EXECUTION_PATCH_ALLOWLIST: Set<string>;
|
|
88
76
|
/** Read `metadata.graphEntry` and normalize legacy `exampleInput` → `exampleInputs`. */
|
|
89
77
|
export declare function resolveEffectiveGraphEntry(graphOrEntry: object | Record<string, unknown> | undefined): Record<string, unknown>;
|
|
90
|
-
export declare function isValidGraphEntryPath(path: string): boolean;
|
|
91
|
-
export declare function validateGraphEntryPaths(paths: string[]): string[];
|
|
92
|
-
/** Infer JSON Schema for example generation from declared graph-entry inputs (FR-G4). */
|
|
93
|
-
export declare function buildGraphEntryExampleJsonSchema(inputs: GraphEntryInputRow[] | unknown[], _entityBindings?: GraphConceptEntityBindings): Record<string, unknown>;
|
|
94
|
-
export type EntityBindingMismatch = {
|
|
95
|
-
inputPath: string;
|
|
96
|
-
entityIds: string[];
|
|
97
|
-
message: string;
|
|
98
|
-
};
|
|
99
|
-
/** FR-G3: flag when graphEntry.inputs[].entityIds disagree with graphConcept.entityBindings. */
|
|
100
|
-
export declare function findGraphEntryEntityBindingMismatches(inputs: GraphEntryInputRow[] | unknown[], graphConcept: Record<string, unknown> | undefined): EntityBindingMismatch[];
|
|
101
78
|
export declare function parseJsonExampleValue(value: string): {
|
|
102
79
|
ok: boolean;
|
|
103
80
|
error?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"graphEntryContract.d.ts","sourceRoot":"","sources":["../src/graphEntryContract.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"graphEntryContract.d.ts","sourceRoot":"","sources":["../src/graphEntryContract.ts"],"names":[],"mappings":"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"}
|