@vaudience/aigentflow-flow-validator 0.27.0 → 0.28.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/PARITY.md +64 -1
- package/README.md +3 -1
- package/dist/cli.js +281 -167
- package/dist/index.cjs +276 -165
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.js +276 -165
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/cli.js
CHANGED
|
@@ -455,7 +455,7 @@ function validateBasicStructure(flow, issues) {
|
|
|
455
455
|
// src/spec/aigentflow-spec.json
|
|
456
456
|
var aigentflow_spec_default = {
|
|
457
457
|
$comment: "Vendored enum surface mirrored from the AIgentFlow Go reference implementation. Regenerate / review on every flow-YAML schema change. See PARITY.md. Values here are public protocol/type names only.",
|
|
458
|
-
specVersion: "2.
|
|
458
|
+
specVersion: "2.837.0",
|
|
459
459
|
inputSchemaVersion: 1,
|
|
460
460
|
executorSchemes: [
|
|
461
461
|
"a2a",
|
|
@@ -486,6 +486,7 @@ var aigentflow_spec_default = {
|
|
|
486
486
|
"messenger",
|
|
487
487
|
"mock",
|
|
488
488
|
"mqtt",
|
|
489
|
+
"nexus",
|
|
489
490
|
"opencorporates",
|
|
490
491
|
"openmeteo",
|
|
491
492
|
"overpass",
|
|
@@ -556,12 +557,9 @@ var aigentflow_spec_default = {
|
|
|
556
557
|
"step_failed",
|
|
557
558
|
"mission_started",
|
|
558
559
|
"mission_completed",
|
|
559
|
-
"dfm_suggestion",
|
|
560
560
|
"timer",
|
|
561
561
|
"request_turn",
|
|
562
562
|
"mission_recovered",
|
|
563
|
-
"campaign_child_completed",
|
|
564
|
-
"campaign_child_failed",
|
|
565
563
|
"human_response",
|
|
566
564
|
"human_input"
|
|
567
565
|
],
|
|
@@ -577,15 +575,6 @@ var aigentflow_spec_default = {
|
|
|
577
575
|
"aif_ask_human",
|
|
578
576
|
"aif_flow_list",
|
|
579
577
|
"aif_mission_reflect",
|
|
580
|
-
"aif_signal_complete",
|
|
581
|
-
"aif_signal_need_human",
|
|
582
|
-
"aif_signal_delegate",
|
|
583
|
-
"aif_signal_need_tool",
|
|
584
|
-
"aif_signal_modify_flow",
|
|
585
|
-
"aif_campaign_spawn",
|
|
586
|
-
"aif_campaign_status",
|
|
587
|
-
"aif_campaign_results",
|
|
588
|
-
"aif_campaign_cancel",
|
|
589
578
|
"aif_memory_plan",
|
|
590
579
|
"aif_memory_record",
|
|
591
580
|
"aif_memory_recall",
|
|
@@ -756,23 +745,13 @@ var aigentflow_spec_default = {
|
|
|
756
745
|
"fn_urldecode"
|
|
757
746
|
],
|
|
758
747
|
orchestratorToolAllow: {
|
|
759
|
-
$comment: "An orchestrator tool is offered only if it passes BOTH orchestrator.tools (empty = every tool) AND the inline exons definition's tools.allow (absent = no narrowing).
|
|
748
|
+
$comment: "An orchestrator tool is offered only if it passes BOTH orchestrator.tools (empty = every tool) AND the inline exons definition's tools.allow (absent = no narrowing). Only the lifecycle tools are exempt from tools.allow. A removed signal or campaign tool name (removedSignalSurfaces.tools, removedCampaignSurfaces.tools) is never reported as withheld: it is refused as signal_removed / campaign_removed. Reference: validateOrchestratorToolAllowWithholds (v2.760.0, signal and campaign arms removed in 2.834.0 / 2.836.0).",
|
|
760
749
|
warningField: "orchestrator.exons",
|
|
761
750
|
askHumanTool: "aif_ask_human",
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
"
|
|
766
|
-
"aif_signal_need_human",
|
|
767
|
-
"aif_signal_delegate",
|
|
768
|
-
"aif_signal_need_tool",
|
|
769
|
-
"aif_signal_modify_flow"
|
|
770
|
-
],
|
|
771
|
-
campaignTools: [
|
|
772
|
-
"aif_campaign_cancel",
|
|
773
|
-
"aif_campaign_results",
|
|
774
|
-
"aif_campaign_spawn",
|
|
775
|
-
"aif_campaign_status"
|
|
751
|
+
lifecycleTools: [
|
|
752
|
+
"aif_mission_complete",
|
|
753
|
+
"aif_mission_fail",
|
|
754
|
+
"aif_request_turn"
|
|
776
755
|
]
|
|
777
756
|
},
|
|
778
757
|
exons: {
|
|
@@ -780,7 +759,7 @@ var aigentflow_spec_default = {
|
|
|
780
759
|
frontmatterDelimiter: "---"
|
|
781
760
|
},
|
|
782
761
|
removedAgentSurfaces: {
|
|
783
|
-
$comment: "AIgentFlow no longer runs agents of its own. executor_removed (ERROR): a step or loop sub-step whose executor scheme (text before '://', whitespace-trimmed, lower-cased) is in removedSchemes, or a top-level key in flowKeys (field = the key). agentic_param_removed (ERROR): an ai:// step or loop sub-step whose query carries ANY key of aiParams, on presence alone (null and false included); ONE finding per step, the keys sorted and joined by ', '. Only the paramScheme scheme is checked for params. A templated executor (containing templateActionOpen) is not judged. A step on a removed scheme yields ONLY executor_removed: no unknown_executor_scheme, executor-URL shape or inline-exons finding. Fields: steps.<id> and steps.<id>.loop.steps[<index>]. Not refused: aiv://, atlas
|
|
762
|
+
$comment: "AIgentFlow no longer runs agents of its own. executor_removed (ERROR): a step or loop sub-step whose executor scheme (text before '://', whitespace-trimmed, lower-cased) is in removedSchemes, or a top-level key in flowKeys (field = the key). agentic_param_removed (ERROR): an ai:// step or loop sub-step whose query carries ANY key of aiParams, on presence alone (null and false included); ONE finding per step, the keys sorted and joined by ', '. Only the paramScheme scheme is checked for params. A templated executor (containing templateActionOpen) is not judged. A step on a removed scheme yields ONLY executor_removed: no unknown_executor_scheme, executor-URL shape or inline-exons finding. Fields: steps.<id> and steps.<id>.loop.steps[<index>]. Not refused: aiv://, nexus:// (alias atlas://), ai:// tools / tool_choice / autofix / content_parts / stream, flow-level tool_discovery / discoverable_tools, the orchestrator block's own keys. Messages fill %s (the step id as written in the finding, then the scheme or the key list).",
|
|
784
763
|
removedSchemes: ["exons", "agent"],
|
|
785
764
|
paramScheme: "ai",
|
|
786
765
|
aiParams: [
|
|
@@ -804,7 +783,56 @@ var aigentflow_spec_default = {
|
|
|
804
783
|
schemeMessageFormat: "step %q uses %s://, which AIgentFlow no longer runs: its own agent chains were removed",
|
|
805
784
|
paramsMessageFormat: "step %q sets %s on ai://: AIgentFlow's own agent loop (agentic mode) was removed, so these parameters no longer exist",
|
|
806
785
|
flowKeyMessageFormat: "the flow-level key %q belonged to a removed agent surface and is no longer read",
|
|
807
|
-
suggestion:
|
|
786
|
+
suggestion: `Rebuild the step: a tool-using agent becomes nexus://agent/run (agent: "@org/name", prompt, capabilities); one tool becomes nexus://capability/<ref>; a plain prompt becomes ai://<provider>/chat or a prompt-only aiv://<org>/<name>. A nexus:// step acts as the person responsible for the run: who started it, who last saved its schedule or webhook trigger, or a flow:// child's parent. What cannot be converted: a run with no person (one started by a service or key that names nobody; share links no longer exist), and a step that needs an inline .exons spec, an arbitrary MCP server URL or signals. For those, start the flow from a person, a schedule or a trigger, or use a routine in Nexus`
|
|
787
|
+
},
|
|
788
|
+
removedSignalSurfaces: {
|
|
789
|
+
$comment: "AIgentFlow 2.834.0 removed agent signals and dynamic flow modification (DFM). signal_removed (ERROR): (a) orchestrator.enable_signals: true (field orchestrator.enable_signals); (b) one of tools named in orchestrator.tools, orchestrator.deny_tools, orchestrator.require_approval_for (field = that list) or in the orchestrator .exons definition's tools.allow (field orchestrator.exons) - ONE finding per list, the removed names in list order, each once; (c) stepKey on a step or loop sub-step whose scheme is stepKeyScheme (field steps.<id> / steps.<id>.loop.steps[<index>]). flow_modification_removed (ERROR): (a) orchestrator.triggers holds a trigger of a type in triggers (ONE finding, field orchestrator.triggers); (b) flowModificationStepKey in a step's or loop sub-step's query (any scheme). Step keys are judged on map PRESENCE (null and false included). Steps skipped: templated executors, removed schemes (removedAgentSurfaces.removedSchemes) and the schemes in stepSkipSchemes (a flow:// query carries the CHILD's inputs). removed_key_ignored (WARNING, never an error): checkpoint.pre_dfm with any non-null value, and orchestrator.enable_signals: false. A YAML null on either block key is absent. Tool and trigger names match exactly and case-sensitively. The removed names left the orchestrator tool and trigger registries, but they are TOLERATED by the unknown-name checks, and enable_signals / pre_dfm stay in knownKeys, so the only finding is the new code. Order: the orchestrator block (enable_signals, then the lists, then triggers), then steps by id with loop sub-steps after their parent. Reference: aigentflow.removed.signalsurfaces.go.",
|
|
790
|
+
signalRemovedCode: "signal_removed",
|
|
791
|
+
flowModificationRemovedCode: "flow_modification_removed",
|
|
792
|
+
removedKeyIgnoredCode: "removed_key_ignored",
|
|
793
|
+
tools: [
|
|
794
|
+
"aif_signal_complete",
|
|
795
|
+
"aif_signal_need_human",
|
|
796
|
+
"aif_signal_delegate",
|
|
797
|
+
"aif_signal_need_tool",
|
|
798
|
+
"aif_signal_modify_flow"
|
|
799
|
+
],
|
|
800
|
+
triggers: [
|
|
801
|
+
"dfm_suggestion"
|
|
802
|
+
],
|
|
803
|
+
stepKey: "enable_signals",
|
|
804
|
+
stepKeyScheme: "aiv",
|
|
805
|
+
flowModificationStepKey: "flow_modification_allowed",
|
|
806
|
+
stepSkipSchemes: [
|
|
807
|
+
"flow"
|
|
808
|
+
],
|
|
809
|
+
enableSignalsMessage: "the orchestrator sets enable_signals: true: AIgentFlow's agent signals were removed in 2.834.0, so the tools it asks for no longer exist",
|
|
810
|
+
toolNamesMessageFormat: "%s names %s: AIgentFlow's agent signal tools were removed in 2.834.0",
|
|
811
|
+
stepKeyMessageFormat: "step %q sets enable_signals: AIgentFlow's agent signals were removed in 2.834.0, so the parameter no longer exists",
|
|
812
|
+
triggersMessage: "orchestrator.triggers names dfm_suggestion: dynamic flow modification was removed in 2.834.0, so nothing raises that trigger",
|
|
813
|
+
flowModificationStepMessageFormat: "step %q sets flow_modification_allowed: dynamic flow modification was removed in 2.834.0",
|
|
814
|
+
ignoredKeyMessageFormat: "%s is ignored: it configured AIgentFlow's agent signals / dynamic flow modification, removed in 2.834.0. AIgentFlow may have written this key into the flow itself; the flow runs as if it were absent",
|
|
815
|
+
ignoredKeySuggestion: "Remove the key; nothing reads it",
|
|
816
|
+
suggestion: "Signals and dynamic flow modification were removed in 2.834.0. aif_signal_need_human: add an async://human/<operation> step where the person must answer (inside a nexus://agent/run step, the atlas approval wait asks the person). aif_signal_delegate: run the other work as a flow:// step, or route with next: conditions. aif_signal_complete: an orchestrator ends the mission with aif_mission_complete. aif_signal_need_tool: no replacement; give the agent the capability in atlas. aif_signal_modify_flow, dfm_suggestion and flow_modification_allowed: no replacement; declare every step the flow may run and choose between them with next: conditions"
|
|
817
|
+
},
|
|
818
|
+
removedCampaignSurfaces: {
|
|
819
|
+
$comment: "AIgentFlow 2.836.0 removed campaigns. campaign_removed (ERROR): (a) the flow-root key flowKey with ANY non-null value (field campaign; the block is refused whole and nothing inside it is judged: no campaign rule, retired-key or unknown-key finding); (b) one of tools in orchestrator.tools, orchestrator.deny_tools, orchestrator.require_approval_for (field = the list) or the orchestrator .exons definition's tools.allow (field orchestrator.exons) - ONE finding per list, names in list order, each once; (c) orchestrator.triggers holding a trigger of a type in triggers (ONE finding, field orchestrator.triggers, the removed types in order, each once). Steps are never judged. Names match exactly and case-sensitively, and are tolerated by the unknown-name checks. There is no removed_key_ignored warning for campaigns. Order: block, then the lists (tools, deny_tools, require_approval_for, tools.allow), then triggers. Reference: aigentflow.removed.campaignsurfaces.go.",
|
|
820
|
+
code: "campaign_removed",
|
|
821
|
+
flowKey: "campaign",
|
|
822
|
+
tools: [
|
|
823
|
+
"aif_campaign_spawn",
|
|
824
|
+
"aif_campaign_status",
|
|
825
|
+
"aif_campaign_results",
|
|
826
|
+
"aif_campaign_cancel"
|
|
827
|
+
],
|
|
828
|
+
triggers: [
|
|
829
|
+
"campaign_child_completed",
|
|
830
|
+
"campaign_child_failed"
|
|
831
|
+
],
|
|
832
|
+
blockMessage: "the flow declares a campaign: block: campaigns were removed in 2.836.0, so nothing would spawn or track its child missions",
|
|
833
|
+
toolNamesMessageFormat: "%s names %s: AIgentFlow's campaign tools were removed in 2.836.0",
|
|
834
|
+
triggersMessageFormat: "orchestrator.triggers names %s: campaigns were removed in 2.836.0, so no child mission raises that trigger",
|
|
835
|
+
suggestion: "Campaigns were removed in 2.836.0. Fan the work out inside one flow instead: a for_each step whose executor is flow://stored/<flow_id> runs the child flow once per item and hands the next step every result (.data.<step>, in item order), so a coordinator -> workers -> synthesiser campaign becomes a plan step -> a for_each over flow:// -> a synthesis step (a fixed set of different workers is next: parallel: with a rendezvous). When each worker is an agent, make the worker a nexus://agent/run step (the for_each step itself, or a step of the child flow): it runs as the person responsible for the run, and a flow:// child inherits its parent's. Delete the campaign: block, the aif_campaign_* tool names and the campaign_child_* triggers"
|
|
808
836
|
},
|
|
809
837
|
executorConfigEnvScopes: {
|
|
810
838
|
$comment: "executor_config may expand only the environment variables of the key it is written under. A value is a reference when it starts with referencePrefix and ends with referenceSuffix around a non-empty name. Checked fields: fields, plus every string value of extra (prefixed extraFieldPrefix in the message). A key absent from scopes has an EMPTY scope and refuses every reference. scopes is the reference's executorConfigEnvScope evaluated for every key with a non-empty scope. Reference: ValidateExecutorConfigEnvScopes (v2.597.0).",
|
|
@@ -1031,20 +1059,21 @@ var aigentflow_spec_default = {
|
|
|
1031
1059
|
]
|
|
1032
1060
|
},
|
|
1033
1061
|
atlasExecutor: {
|
|
1034
|
-
$comment: "
|
|
1035
|
-
scheme: "
|
|
1062
|
+
$comment: "nexus://<provider>/<resource> (alias atlas://, the same rules for both spellings since AIgentFlow 2.835.0; the scheme match is exact and case-sensitive against scheme and aliases): calls an agent or a capability in Nexus. An AigentChat-shaped nexus://<org>/<agent> (the executor removed in 2.819.0) is atlas_operation_unknown. Codes keep the atlas_ prefix. Providers are agent (the one resource is run) and capability (the resource is a capability reference). All findings are ERRORS, field = the step (loop sub-steps use the composite step id and the sub-step path). Templated executors, unparsable URLs and other schemes are skipped. A literal agent and literal capabilities keep a step from being steered by data: query.agent and every string anywhere in query.capabilities and query.model may not contain templateActionOpen, while prompt, inputs and capability args may. agent, prompt and prompt_template count as present only when they are non-empty strings after trimming whitespace. A message format takes the quoted step id first. A URL the shared executor-URL shape refuses (a dot or colon in a reference, say) is still judged here, split at the first slash after the scheme.",
|
|
1063
|
+
scheme: "nexus",
|
|
1064
|
+
aliases: ["atlas"],
|
|
1036
1065
|
providerAgent: "agent",
|
|
1037
1066
|
providerCapability: "capability",
|
|
1038
1067
|
agentResource: "run",
|
|
1039
1068
|
capabilityRefPattern: "^[A-Za-z0-9][A-Za-z0-9_-]{0,127}$",
|
|
1040
1069
|
operationUnknown: {
|
|
1041
1070
|
code: "atlas_operation_unknown",
|
|
1042
|
-
messageFormat: "step %s uses %s, which is not
|
|
1043
|
-
suggestion: "Use
|
|
1071
|
+
messageFormat: "step %s uses %s, which is not a Nexus operation. The providers are agent (resource run) and capability (resource: a capability reference).",
|
|
1072
|
+
suggestion: "Use nexus://agent/run or nexus://capability/<capability-ref>."
|
|
1044
1073
|
},
|
|
1045
1074
|
agentMissing: {
|
|
1046
1075
|
code: "atlas_agent_missing",
|
|
1047
|
-
messageFormat: "step %s runs
|
|
1076
|
+
messageFormat: "step %s runs a Nexus agent but query.agent is missing, empty or not a string.",
|
|
1048
1077
|
suggestion: "Set query.agent to the agent to run, written out as a literal such as @acme/reporter."
|
|
1049
1078
|
},
|
|
1050
1079
|
agentNotLiteral: {
|
|
@@ -1059,7 +1088,7 @@ var aigentflow_spec_default = {
|
|
|
1059
1088
|
},
|
|
1060
1089
|
promptMissing: {
|
|
1061
1090
|
code: "atlas_prompt_missing",
|
|
1062
|
-
messageFormat: "step %s runs
|
|
1091
|
+
messageFormat: "step %s runs a Nexus agent with neither query.prompt nor query.prompt_template.",
|
|
1063
1092
|
suggestion: "Set exactly one of query.prompt or query.prompt_template."
|
|
1064
1093
|
},
|
|
1065
1094
|
promptBoth: {
|
|
@@ -1069,7 +1098,7 @@ var aigentflow_spec_default = {
|
|
|
1069
1098
|
},
|
|
1070
1099
|
capabilityRefInvalid: {
|
|
1071
1100
|
code: "atlas_capability_ref_invalid",
|
|
1072
|
-
messageFormat: "step %s uses
|
|
1101
|
+
messageFormat: "step %s uses nexus://capability/%s, which is not a valid capability reference.",
|
|
1073
1102
|
suggestion: "A capability reference starts with a letter or digit and continues with letters, digits, _ and - up to 128 characters in all."
|
|
1074
1103
|
},
|
|
1075
1104
|
modelNotLiteral: {
|
|
@@ -1666,20 +1695,6 @@ var aigentflow_spec_default = {
|
|
|
1666
1695
|
BillingConfig: {
|
|
1667
1696
|
max_credits: "scalar"
|
|
1668
1697
|
},
|
|
1669
|
-
CampaignChildFlowDef: {
|
|
1670
|
-
alias: "scalar",
|
|
1671
|
-
flow_id: "scalar",
|
|
1672
|
-
flow_name: "scalar"
|
|
1673
|
-
},
|
|
1674
|
-
CampaignConfig: {
|
|
1675
|
-
child_flows: "list<CampaignChildFlowDef>",
|
|
1676
|
-
max_concurrent: "scalar",
|
|
1677
|
-
max_credits_per_child: "scalar",
|
|
1678
|
-
max_depth: "scalar",
|
|
1679
|
-
max_total_children: "scalar",
|
|
1680
|
-
on_children_complete: "scalar",
|
|
1681
|
-
shared_memory: "scalar"
|
|
1682
|
-
},
|
|
1683
1698
|
Checkpoint: {
|
|
1684
1699
|
exact: "map<any>",
|
|
1685
1700
|
fields: "map<FieldMatcher>",
|
|
@@ -1813,7 +1828,7 @@ var aigentflow_spec_default = {
|
|
|
1813
1828
|
Flow: {
|
|
1814
1829
|
aigentflow_version: "scalar",
|
|
1815
1830
|
billing: "BillingConfig",
|
|
1816
|
-
campaign: "
|
|
1831
|
+
campaign: "any",
|
|
1817
1832
|
checkpoint: "CheckpointConfig",
|
|
1818
1833
|
classification: "FlowClassification",
|
|
1819
1834
|
compliance: "FlowCompliance",
|
|
@@ -2128,10 +2143,7 @@ var KNOWN_KEYS = aigentflow_spec_default.knownKeys;
|
|
|
2128
2143
|
var ORCHESTRATOR_TOOL_ALLOW = {
|
|
2129
2144
|
warningField: aigentflow_spec_default.orchestratorToolAllow.warningField,
|
|
2130
2145
|
askHumanTool: aigentflow_spec_default.orchestratorToolAllow.askHumanTool,
|
|
2131
|
-
|
|
2132
|
-
lifecycleTools: aigentflow_spec_default.orchestratorToolAllow.lifecycleTools,
|
|
2133
|
-
signalTools: aigentflow_spec_default.orchestratorToolAllow.signalTools,
|
|
2134
|
-
campaignTools: aigentflow_spec_default.orchestratorToolAllow.campaignTools
|
|
2146
|
+
lifecycleTools: aigentflow_spec_default.orchestratorToolAllow.lifecycleTools
|
|
2135
2147
|
};
|
|
2136
2148
|
var EXONS = {
|
|
2137
2149
|
/** The YAML frontmatter delimiter line. */
|
|
@@ -2150,6 +2162,45 @@ var REMOVED_AGENT_SURFACES = {
|
|
|
2150
2162
|
flowKeyMessageFormat: removed.flowKeyMessageFormat,
|
|
2151
2163
|
suggestion: removed.suggestion
|
|
2152
2164
|
};
|
|
2165
|
+
var signal = aigentflow_spec_default.removedSignalSurfaces;
|
|
2166
|
+
var REMOVED_SIGNAL_SURFACES = {
|
|
2167
|
+
signalRemovedCode: signal.signalRemovedCode,
|
|
2168
|
+
flowModificationRemovedCode: signal.flowModificationRemovedCode,
|
|
2169
|
+
removedKeyIgnoredCode: signal.removedKeyIgnoredCode,
|
|
2170
|
+
tools: signal.tools,
|
|
2171
|
+
triggers: signal.triggers,
|
|
2172
|
+
stepKey: signal.stepKey,
|
|
2173
|
+
stepKeyScheme: signal.stepKeyScheme,
|
|
2174
|
+
flowModificationStepKey: signal.flowModificationStepKey,
|
|
2175
|
+
stepSkipSchemes: new Set(signal.stepSkipSchemes),
|
|
2176
|
+
enableSignalsMessage: signal.enableSignalsMessage,
|
|
2177
|
+
toolNamesMessageFormat: signal.toolNamesMessageFormat,
|
|
2178
|
+
stepKeyMessageFormat: signal.stepKeyMessageFormat,
|
|
2179
|
+
triggersMessage: signal.triggersMessage,
|
|
2180
|
+
flowModificationStepMessageFormat: signal.flowModificationStepMessageFormat,
|
|
2181
|
+
ignoredKeyMessageFormat: signal.ignoredKeyMessageFormat,
|
|
2182
|
+
ignoredKeySuggestion: signal.ignoredKeySuggestion,
|
|
2183
|
+
suggestion: signal.suggestion
|
|
2184
|
+
};
|
|
2185
|
+
var campaign = aigentflow_spec_default.removedCampaignSurfaces;
|
|
2186
|
+
var REMOVED_CAMPAIGN_SURFACES = {
|
|
2187
|
+
code: campaign.code,
|
|
2188
|
+
flowKey: campaign.flowKey,
|
|
2189
|
+
tools: campaign.tools,
|
|
2190
|
+
triggers: campaign.triggers,
|
|
2191
|
+
blockMessage: campaign.blockMessage,
|
|
2192
|
+
toolNamesMessageFormat: campaign.toolNamesMessageFormat,
|
|
2193
|
+
triggersMessageFormat: campaign.triggersMessageFormat,
|
|
2194
|
+
suggestion: campaign.suggestion
|
|
2195
|
+
};
|
|
2196
|
+
var REMOVED_ORCHESTRATOR_TOOLS = /* @__PURE__ */ new Set([
|
|
2197
|
+
...signal.tools,
|
|
2198
|
+
...campaign.tools
|
|
2199
|
+
]);
|
|
2200
|
+
var REMOVED_ORCHESTRATOR_TRIGGERS = /* @__PURE__ */ new Set([
|
|
2201
|
+
...signal.triggers,
|
|
2202
|
+
...campaign.triggers
|
|
2203
|
+
]);
|
|
2153
2204
|
var EXECUTOR_CONFIG_ENV_SCOPES = {
|
|
2154
2205
|
referencePrefix: aigentflow_spec_default.executorConfigEnvScopes.referencePrefix,
|
|
2155
2206
|
referenceSuffix: aigentflow_spec_default.executorConfigEnvScopes.referenceSuffix,
|
|
@@ -2246,6 +2297,8 @@ var FUNCTION_OPERATIONS = {
|
|
|
2246
2297
|
var atlas = aigentflow_spec_default.atlasExecutor;
|
|
2247
2298
|
var ATLAS_EXECUTOR = {
|
|
2248
2299
|
scheme: atlas.scheme,
|
|
2300
|
+
/** The canonical scheme (nexus) and its aliases (atlas): one set of rules. */
|
|
2301
|
+
schemes: /* @__PURE__ */ new Set([atlas.scheme, ...atlas.aliases]),
|
|
2249
2302
|
providerAgent: atlas.providerAgent,
|
|
2250
2303
|
providerCapability: atlas.providerCapability,
|
|
2251
2304
|
agentResource: atlas.agentResource,
|
|
@@ -2460,16 +2513,14 @@ function validateOrchestratorExons(flow, issues) {
|
|
|
2460
2513
|
suggestion: "Remove requirements.resources, and narrow the agent with tools.mcp_servers and tools.allow"
|
|
2461
2514
|
});
|
|
2462
2515
|
}
|
|
2463
|
-
warnOrchestratorToolWithheld(
|
|
2516
|
+
warnOrchestratorToolWithheld(orch, report, issues);
|
|
2464
2517
|
}
|
|
2465
|
-
function warnOrchestratorToolWithheld(
|
|
2518
|
+
function warnOrchestratorToolWithheld(orch, report, issues) {
|
|
2466
2519
|
if (!report.toolsAllowDeclared) return;
|
|
2467
2520
|
const cfg = ORCHESTRATOR_TOOL_ALLOW;
|
|
2468
2521
|
const exempt = new Set(cfg.lifecycleTools);
|
|
2469
|
-
const signals = typeof orch.enable_signals === "boolean" ? orch.enable_signals : cfg.enableSignalsDefault;
|
|
2470
|
-
if (signals) for (const t of cfg.signalTools) exempt.add(t);
|
|
2471
2522
|
const allow = new Set(report.toolsAllow);
|
|
2472
|
-
const withheld = (name) => !allow.has(name) && !exempt.has(name);
|
|
2523
|
+
const withheld = (name) => !allow.has(name) && !exempt.has(name) && !REMOVED_ORCHESTRATOR_TOOLS.has(name);
|
|
2473
2524
|
const warn = (message) => issues.warn({ field: cfg.warningField, code: CODE_TOOL_WITHHELD, message });
|
|
2474
2525
|
const named = [];
|
|
2475
2526
|
if (isArray(orch.tools)) {
|
|
@@ -2492,11 +2543,6 @@ function warnOrchestratorToolWithheld(flow, orch, report, issues) {
|
|
|
2492
2543
|
`the orchestrator's exons definition has a tools.allow list that does not name ${cfg.askHumanTool}, so this orchestrator can never ask a person a question: human intervention is off. Add ${cfg.askHumanTool} to tools.allow if a human should be reachable, or ignore this if the orchestrator is meant to run unattended.`
|
|
2493
2544
|
);
|
|
2494
2545
|
}
|
|
2495
|
-
if (isRecord(flow.campaign) && !cfg.campaignTools.some((name) => !withheld(name))) {
|
|
2496
|
-
warn(
|
|
2497
|
-
`this flow declares a campaign, but the orchestrator's exons definition has a tools.allow list that names none of the campaign tools (${cfg.campaignTools.join(", ")}), so no child mission can be spawned or tracked. Add the campaign tools the orchestrator needs to tools.allow.`
|
|
2498
|
-
);
|
|
2499
|
-
}
|
|
2500
2546
|
}
|
|
2501
2547
|
|
|
2502
2548
|
// src/validators/executors.ts
|
|
@@ -2613,9 +2659,9 @@ function validateRemovedFlowKeys(flow, issues) {
|
|
|
2613
2659
|
}
|
|
2614
2660
|
function checkAtlasStep(executor, query, stepField, stepID, issues) {
|
|
2615
2661
|
if (executor.includes(TEMPLATE_ACTION_OPEN)) return;
|
|
2616
|
-
const
|
|
2617
|
-
if (!executor.
|
|
2618
|
-
const rest = executor.slice(
|
|
2662
|
+
const sep = executor.indexOf(SCHEME_SEPARATOR);
|
|
2663
|
+
if (sep < 0 || !ATLAS_EXECUTOR.schemes.has(executor.slice(0, sep))) return;
|
|
2664
|
+
const rest = executor.slice(sep + SCHEME_SEPARATOR.length);
|
|
2619
2665
|
const slash = rest.indexOf("/");
|
|
2620
2666
|
const provider = slash < 0 ? rest : rest.slice(0, slash);
|
|
2621
2667
|
const resource = slash < 0 ? "" : rest.slice(slash + 1);
|
|
@@ -3828,49 +3874,6 @@ function flowHasOrchestratorYieldEdge(flow) {
|
|
|
3828
3874
|
}
|
|
3829
3875
|
return false;
|
|
3830
3876
|
}
|
|
3831
|
-
var GO_INT64_FLOAT_LIMIT = 2 ** 63;
|
|
3832
|
-
function decodeGoInt(v) {
|
|
3833
|
-
if (typeof v !== "number" || Number.isNaN(v)) return null;
|
|
3834
|
-
if (v >= GO_INT64_FLOAT_LIMIT) return null;
|
|
3835
|
-
if (v === -Infinity) return -GO_INT64_FLOAT_LIMIT;
|
|
3836
|
-
return Math.trunc(v);
|
|
3837
|
-
}
|
|
3838
|
-
function validateCampaignChildFlows(campaign, issues) {
|
|
3839
|
-
const field = "campaign.child_flows";
|
|
3840
|
-
const raw = campaign.child_flows;
|
|
3841
|
-
if (raw !== void 0 && raw !== null && !Array.isArray(raw)) {
|
|
3842
|
-
issues.error({ field, message: "campaign.child_flows must be a list", code: "invalid_type" });
|
|
3843
|
-
return;
|
|
3844
|
-
}
|
|
3845
|
-
const entries = (Array.isArray(raw) ? raw : []).map((entry, i) => ({ entry, i })).filter(({ entry }) => entry !== null);
|
|
3846
|
-
if (entries.length === 0) {
|
|
3847
|
-
issues.error({
|
|
3848
|
-
field,
|
|
3849
|
-
message: "campaign requires at least one entry in child_flows",
|
|
3850
|
-
code: "campaign_no_child_flows"
|
|
3851
|
-
});
|
|
3852
|
-
return;
|
|
3853
|
-
}
|
|
3854
|
-
for (const { entry, i } of entries) {
|
|
3855
|
-
if (!isRecord(entry)) {
|
|
3856
|
-
issues.error({
|
|
3857
|
-
field: `${field}[${i}]`,
|
|
3858
|
-
message: "each campaign.child_flows entry must be a mapping",
|
|
3859
|
-
code: "invalid_type"
|
|
3860
|
-
});
|
|
3861
|
-
continue;
|
|
3862
|
-
}
|
|
3863
|
-
const id = issues.stringOf(entry, "flow_id", `${field}[${i}]`);
|
|
3864
|
-
const name = issues.stringOf(entry, "flow_name", `${field}[${i}]`);
|
|
3865
|
-
if (id !== null && id !== "" || name !== null && name !== "") continue;
|
|
3866
|
-
issues.error({
|
|
3867
|
-
field: `${field}[${i}]`,
|
|
3868
|
-
message: `campaign.child_flows[${i}] needs a flow_id or a flow_name`,
|
|
3869
|
-
code: "campaign_child_flow_no_id",
|
|
3870
|
-
suggestion: "Name the child flow with flow_name, or pin it with flow_id"
|
|
3871
|
-
});
|
|
3872
|
-
}
|
|
3873
|
-
}
|
|
3874
3877
|
function validateOrchestratorCampaign(flow, issues, opts) {
|
|
3875
3878
|
const hasOrchestrator = isRecord(flow.orchestrator);
|
|
3876
3879
|
if (hasOrchestrator) {
|
|
@@ -3926,6 +3929,7 @@ function validateOrchestratorCampaign(flow, issues, opts) {
|
|
|
3926
3929
|
const trigger = rawTrigger;
|
|
3927
3930
|
const base = `orchestrator.triggers[${i}]`;
|
|
3928
3931
|
const type = issues.stringOf(trigger, "type", base);
|
|
3932
|
+
if (type !== null && REMOVED_ORCHESTRATOR_TRIGGERS.has(type)) return;
|
|
3929
3933
|
if (type === null || !ORCHESTRATOR_TRIGGERS.has(type)) {
|
|
3930
3934
|
issues.error({
|
|
3931
3935
|
field: `${base}.type`,
|
|
@@ -3956,7 +3960,9 @@ function validateOrchestratorCampaign(flow, issues, opts) {
|
|
|
3956
3960
|
if (Array.isArray(orch.tools)) {
|
|
3957
3961
|
orch.tools.forEach((raw, i) => {
|
|
3958
3962
|
const tool = issues.stringAt(raw, `orchestrator.tools[${i}]`);
|
|
3959
|
-
if (tool === null || ORCHESTRATOR_TOOLS.has(tool))
|
|
3963
|
+
if (tool === null || ORCHESTRATOR_TOOLS.has(tool) || REMOVED_ORCHESTRATOR_TOOLS.has(tool)) {
|
|
3964
|
+
return;
|
|
3965
|
+
}
|
|
3960
3966
|
const finding = {
|
|
3961
3967
|
field: `orchestrator.tools[${i}]`,
|
|
3962
3968
|
message: `Unrecognised orchestrator tool name '${tool}'`,
|
|
@@ -3977,47 +3983,6 @@ function validateOrchestratorCampaign(flow, issues, opts) {
|
|
|
3977
3983
|
});
|
|
3978
3984
|
}
|
|
3979
3985
|
}
|
|
3980
|
-
if (flow.campaign !== void 0 && flow.campaign !== null) {
|
|
3981
|
-
if (!hasOrchestrator) {
|
|
3982
|
-
issues.error({
|
|
3983
|
-
field: "campaign",
|
|
3984
|
-
message: "campaign requires an orchestrator block",
|
|
3985
|
-
code: "campaign_requires_orchestrator"
|
|
3986
|
-
});
|
|
3987
|
-
}
|
|
3988
|
-
const campaign = flow.campaign;
|
|
3989
|
-
if (isRecord(campaign)) {
|
|
3990
|
-
const cap = campaign.max_credits_per_child;
|
|
3991
|
-
if (cap !== void 0 && cap !== null) {
|
|
3992
|
-
const decoded = decodeGoInt(cap);
|
|
3993
|
-
if (decoded === null) {
|
|
3994
|
-
issues.error({
|
|
3995
|
-
field: "campaign.max_credits_per_child",
|
|
3996
|
-
message: `campaign.max_credits_per_child must be a number of credits, got '${String(cap)}'`,
|
|
3997
|
-
code: "invalid_type"
|
|
3998
|
-
});
|
|
3999
|
-
} else if (decoded < 0) {
|
|
4000
|
-
issues.error({
|
|
4001
|
-
field: "campaign.max_credits_per_child",
|
|
4002
|
-
message: "campaign: max_credits_per_child must be >= 0",
|
|
4003
|
-
code: "campaign_invalid_max_credits_per_child"
|
|
4004
|
-
});
|
|
4005
|
-
}
|
|
4006
|
-
}
|
|
4007
|
-
validateCampaignChildFlows(campaign, issues);
|
|
4008
|
-
}
|
|
4009
|
-
const target = isRecord(campaign) ? issues.stringOf(campaign, "on_children_complete", "campaign") : null;
|
|
4010
|
-
if (target !== null && target !== "") {
|
|
4011
|
-
const steps = isRecord(flow.steps) ? flow.steps : {};
|
|
4012
|
-
if (!(target in steps)) {
|
|
4013
|
-
issues.error({
|
|
4014
|
-
field: "campaign.on_children_complete",
|
|
4015
|
-
message: `campaign.on_children_complete references unknown step '${target}'`,
|
|
4016
|
-
code: "campaign_handoff_step_unknown"
|
|
4017
|
-
});
|
|
4018
|
-
}
|
|
4019
|
-
}
|
|
4020
|
-
}
|
|
4021
3986
|
}
|
|
4022
3987
|
|
|
4023
3988
|
// src/validators/credentialBindings.ts
|
|
@@ -5143,10 +5108,6 @@ var CODE_UNKNOWN_YAML_KEY = "unknown_yaml_key";
|
|
|
5143
5108
|
var KEY_BUDGET = "budget";
|
|
5144
5109
|
var KEY_MAX_RETRIES = "max_retries";
|
|
5145
5110
|
var REMOVED_IN = "v2.721.0";
|
|
5146
|
-
var KEY_BUDGET_MAX_PER_CHILD = "budget_max_per_child";
|
|
5147
|
-
var BUDGET_MAX_PER_CHILD_REMOVED_IN = "v2.728.0";
|
|
5148
|
-
var BUDGET_MAX_PER_CHILD_MESSAGE = `\`campaign.budget_max_per_child\` (USD) was removed from the grammar in AIgentFlow ${BUDGET_MAX_PER_CHILD_REMOVED_IN} because it capped nothing, and AIgentFlow refuses to save a flow that declares it.`;
|
|
5149
|
-
var BUDGET_MAX_PER_CHILD_SUGGESTION = "Use `campaign.max_credits_per_child: N` (a whole number of credits) \u2014 it is checked before each agentic turn of a child, and a spawn may lower it with `max_credits`.";
|
|
5150
5111
|
var BUDGET_MESSAGE = `The flow-level \`budget:\` key was removed from the grammar in AIgentFlow ${REMOVED_IN} because nothing read it (it limited no spend), and AIgentFlow refuses to save a flow that declares it.`;
|
|
5151
5112
|
var BUDGET_SUGGESTION = "Delete it. To cap spend use `billing: { max_credits: N }` \u2014 it caps the credit reservation and refuses further agentic turns (agentic ai://, exons://, the orchestrator); plain chat steps and flow:// sub-flows are not checked against it.";
|
|
5152
5113
|
function maxRetriesMessage(owner) {
|
|
@@ -5174,15 +5135,6 @@ function validateRetiredKeys(flow, issues) {
|
|
|
5174
5135
|
suggestion: MAX_RETRIES_SUGGESTION
|
|
5175
5136
|
});
|
|
5176
5137
|
}
|
|
5177
|
-
const campaign = root.campaign;
|
|
5178
|
-
if (isRecord(campaign) && declares(campaign, KEY_BUDGET_MAX_PER_CHILD)) {
|
|
5179
|
-
issues.error({
|
|
5180
|
-
field: `campaign.${KEY_BUDGET_MAX_PER_CHILD}`,
|
|
5181
|
-
message: BUDGET_MAX_PER_CHILD_MESSAGE,
|
|
5182
|
-
code: CODE_UNKNOWN_YAML_KEY,
|
|
5183
|
-
suggestion: BUDGET_MAX_PER_CHILD_SUGGESTION
|
|
5184
|
-
});
|
|
5185
|
-
}
|
|
5186
5138
|
const steps = flow.steps;
|
|
5187
5139
|
if (!isRecord(steps)) return;
|
|
5188
5140
|
for (const [stepID, rawStep] of Object.entries(steps)) {
|
|
@@ -6010,6 +5962,167 @@ function validateFamilies(flow, steps, issues) {
|
|
|
6010
5962
|
}
|
|
6011
5963
|
}
|
|
6012
5964
|
|
|
5965
|
+
// src/validators/removedSignalCampaign.ts
|
|
5966
|
+
var TEMPLATE_ACTION_OPEN3 = "{{";
|
|
5967
|
+
function fill(format, ...args) {
|
|
5968
|
+
let i = 0;
|
|
5969
|
+
return format.replace(/%[qs]/g, () => args[i++] ?? "");
|
|
5970
|
+
}
|
|
5971
|
+
function stringEntries(m, key) {
|
|
5972
|
+
const raw = m[key];
|
|
5973
|
+
return Array.isArray(raw) ? raw.filter((v) => typeof v === "string") : [];
|
|
5974
|
+
}
|
|
5975
|
+
function triggerTypes(orch) {
|
|
5976
|
+
const raw = orch.triggers;
|
|
5977
|
+
if (!Array.isArray(raw)) return [];
|
|
5978
|
+
const out = [];
|
|
5979
|
+
for (const t of raw) {
|
|
5980
|
+
if (isRecord(t) && typeof t.type === "string") out.push(t.type);
|
|
5981
|
+
}
|
|
5982
|
+
return out;
|
|
5983
|
+
}
|
|
5984
|
+
function namesIn(names, removed2) {
|
|
5985
|
+
const found = [];
|
|
5986
|
+
for (const name of names) {
|
|
5987
|
+
if (removed2.includes(name) && !found.includes(name)) found.push(name);
|
|
5988
|
+
}
|
|
5989
|
+
return found;
|
|
5990
|
+
}
|
|
5991
|
+
function orchestratorToolsAllow(orch) {
|
|
5992
|
+
const source = orch.exons;
|
|
5993
|
+
if (typeof source !== "string" || source === "") return [];
|
|
5994
|
+
const report = inspectExonsFrontmatter(source);
|
|
5995
|
+
if (report.parseError !== null || !report.specRead || !report.toolsAllowDeclared) return [];
|
|
5996
|
+
return [...report.toolsAllow];
|
|
5997
|
+
}
|
|
5998
|
+
function validateRemovedOrchestratorSurfaces(flow, issues) {
|
|
5999
|
+
const sig = REMOVED_SIGNAL_SURFACES;
|
|
6000
|
+
const camp = REMOVED_CAMPAIGN_SURFACES;
|
|
6001
|
+
const orch = isRecord(flow.orchestrator) ? flow.orchestrator : null;
|
|
6002
|
+
const lists = orch === null ? [] : [
|
|
6003
|
+
...["tools", "deny_tools", "require_approval_for"].map((key) => ({
|
|
6004
|
+
field: `orchestrator.${key}`,
|
|
6005
|
+
names: stringEntries(orch, key)
|
|
6006
|
+
})),
|
|
6007
|
+
{ field: "orchestrator.exons", names: orchestratorToolsAllow(orch) }
|
|
6008
|
+
];
|
|
6009
|
+
if (orch !== null) {
|
|
6010
|
+
if (orch.enable_signals === true) {
|
|
6011
|
+
issues.error({
|
|
6012
|
+
field: "orchestrator.enable_signals",
|
|
6013
|
+
code: sig.signalRemovedCode,
|
|
6014
|
+
message: sig.enableSignalsMessage,
|
|
6015
|
+
suggestion: sig.suggestion
|
|
6016
|
+
});
|
|
6017
|
+
}
|
|
6018
|
+
for (const list of lists) {
|
|
6019
|
+
const named = namesIn(list.names, sig.tools);
|
|
6020
|
+
if (named.length === 0) continue;
|
|
6021
|
+
issues.error({
|
|
6022
|
+
field: list.field,
|
|
6023
|
+
code: sig.signalRemovedCode,
|
|
6024
|
+
message: fill(sig.toolNamesMessageFormat, list.field, named.join(", ")),
|
|
6025
|
+
suggestion: sig.suggestion
|
|
6026
|
+
});
|
|
6027
|
+
}
|
|
6028
|
+
if (namesIn(triggerTypes(orch), sig.triggers).length > 0) {
|
|
6029
|
+
issues.error({
|
|
6030
|
+
field: "orchestrator.triggers",
|
|
6031
|
+
code: sig.flowModificationRemovedCode,
|
|
6032
|
+
message: sig.triggersMessage,
|
|
6033
|
+
suggestion: sig.suggestion
|
|
6034
|
+
});
|
|
6035
|
+
}
|
|
6036
|
+
}
|
|
6037
|
+
const block = flow[camp.flowKey];
|
|
6038
|
+
if (block !== void 0 && block !== null) {
|
|
6039
|
+
issues.error({
|
|
6040
|
+
field: camp.flowKey,
|
|
6041
|
+
code: camp.code,
|
|
6042
|
+
message: camp.blockMessage,
|
|
6043
|
+
suggestion: camp.suggestion
|
|
6044
|
+
});
|
|
6045
|
+
}
|
|
6046
|
+
if (orch !== null) {
|
|
6047
|
+
for (const list of lists) {
|
|
6048
|
+
const named = namesIn(list.names, camp.tools);
|
|
6049
|
+
if (named.length === 0) continue;
|
|
6050
|
+
issues.error({
|
|
6051
|
+
field: list.field,
|
|
6052
|
+
code: camp.code,
|
|
6053
|
+
message: fill(camp.toolNamesMessageFormat, list.field, named.join(", ")),
|
|
6054
|
+
suggestion: camp.suggestion
|
|
6055
|
+
});
|
|
6056
|
+
}
|
|
6057
|
+
const triggers = namesIn(triggerTypes(orch), camp.triggers);
|
|
6058
|
+
if (triggers.length > 0) {
|
|
6059
|
+
issues.error({
|
|
6060
|
+
field: "orchestrator.triggers",
|
|
6061
|
+
code: camp.code,
|
|
6062
|
+
message: fill(camp.triggersMessageFormat, triggers.join(", ")),
|
|
6063
|
+
suggestion: camp.suggestion
|
|
6064
|
+
});
|
|
6065
|
+
}
|
|
6066
|
+
}
|
|
6067
|
+
const judgeStep = (executor, query, field, stepID) => {
|
|
6068
|
+
if (typeof executor !== "string" || executor === "") return;
|
|
6069
|
+
if (executor.includes(TEMPLATE_ACTION_OPEN3)) return;
|
|
6070
|
+
const scheme = removedExecutorScheme(executor);
|
|
6071
|
+
if (REMOVED_AGENT_SURFACES.schemes.has(scheme) || sig.stepSkipSchemes.has(scheme)) return;
|
|
6072
|
+
if (!isRecord(query)) return;
|
|
6073
|
+
const quoted = JSON.stringify(stepID);
|
|
6074
|
+
if (Object.prototype.hasOwnProperty.call(query, sig.flowModificationStepKey)) {
|
|
6075
|
+
issues.error({
|
|
6076
|
+
field,
|
|
6077
|
+
code: sig.flowModificationRemovedCode,
|
|
6078
|
+
stepId: stepID,
|
|
6079
|
+
message: fill(sig.flowModificationStepMessageFormat, quoted),
|
|
6080
|
+
suggestion: sig.suggestion
|
|
6081
|
+
});
|
|
6082
|
+
}
|
|
6083
|
+
if (scheme === sig.stepKeyScheme && Object.prototype.hasOwnProperty.call(query, sig.stepKey)) {
|
|
6084
|
+
issues.error({
|
|
6085
|
+
field,
|
|
6086
|
+
code: sig.signalRemovedCode,
|
|
6087
|
+
stepId: stepID,
|
|
6088
|
+
message: fill(sig.stepKeyMessageFormat, quoted),
|
|
6089
|
+
suggestion: sig.suggestion
|
|
6090
|
+
});
|
|
6091
|
+
}
|
|
6092
|
+
};
|
|
6093
|
+
const steps = flow.steps;
|
|
6094
|
+
if (isRecord(steps)) {
|
|
6095
|
+
for (const stepID of Object.keys(steps).sort()) {
|
|
6096
|
+
const step = steps[stepID];
|
|
6097
|
+
if (!isRecord(step)) continue;
|
|
6098
|
+
judgeStep(step.executor, step.query, `steps.${stepID}`, stepID);
|
|
6099
|
+
const loop = step.loop;
|
|
6100
|
+
if (!isRecord(loop) || !Array.isArray(loop.steps)) continue;
|
|
6101
|
+
loop.steps.forEach((sub, i) => {
|
|
6102
|
+
if (!isRecord(sub)) return;
|
|
6103
|
+
const subID = issues.stringOf(sub, "id", `steps.${stepID}.loop.steps[${i}]`) ?? String(i);
|
|
6104
|
+
judgeStep(
|
|
6105
|
+
sub.executor,
|
|
6106
|
+
sub.query,
|
|
6107
|
+
`steps.${stepID}.loop.steps[${i}]`,
|
|
6108
|
+
`${stepID}.${subID}`
|
|
6109
|
+
);
|
|
6110
|
+
});
|
|
6111
|
+
}
|
|
6112
|
+
}
|
|
6113
|
+
const ignored = (field) => issues.warn({
|
|
6114
|
+
field,
|
|
6115
|
+
code: sig.removedKeyIgnoredCode,
|
|
6116
|
+
message: fill(sig.ignoredKeyMessageFormat, field),
|
|
6117
|
+
suggestion: sig.ignoredKeySuggestion
|
|
6118
|
+
});
|
|
6119
|
+
if (orch !== null && orch.enable_signals === false) ignored("orchestrator.enable_signals");
|
|
6120
|
+
const checkpoint = flow.checkpoint;
|
|
6121
|
+
if (isRecord(checkpoint) && checkpoint.pre_dfm !== void 0 && checkpoint.pre_dfm !== null) {
|
|
6122
|
+
ignored("checkpoint.pre_dfm");
|
|
6123
|
+
}
|
|
6124
|
+
}
|
|
6125
|
+
|
|
6013
6126
|
// src/validators/complianceResidency.ts
|
|
6014
6127
|
function own2(m, key) {
|
|
6015
6128
|
if (!isRecord(m) || !Object.prototype.hasOwnProperty.call(m, key)) return void 0;
|
|
@@ -7487,6 +7600,7 @@ function validateParsed(flow, opts, sources) {
|
|
|
7487
7600
|
validateCredentialEndpointPairing(f, issues);
|
|
7488
7601
|
validateExamples(f, issues);
|
|
7489
7602
|
validateOrchestratorExons(f, issues);
|
|
7603
|
+
validateRemovedOrchestratorSurfaces(f, issues);
|
|
7490
7604
|
validateResidencyEnforcement(f, issues);
|
|
7491
7605
|
validateUnknownKeys(f, issues);
|
|
7492
7606
|
const templateStats = validateTemplates(f, issues, opts);
|