Skip to content

Commit 36a972b

Browse files
akoclaude
andcommitted
fix: parse nanoflow activities, flows, and return type from BSON
The nanoflow parser was only reading Name, Documentation, and Parameters, skipping ObjectCollection (activities), Flows (sequence/annotation flows), and MicroflowReturnType. This caused DESCRIBE NANOFLOW to always show an empty body and catalog.nanoflows to report 0 activities. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 9997a3c commit 36a972b

File tree

1 file changed

+62
-6
lines changed

1 file changed

+62
-6
lines changed

sdk/mpr/parser_nanoflow.go

Lines changed: 62 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -40,12 +40,68 @@ func (r *Reader) parseNanoflow(unitID, containerID string, contents []byte) (*mi
4040
nf.Excluded = excluded
4141
}
4242

43-
// Parse parameters
44-
if params, ok := raw["Parameters"].([]any); ok {
45-
for _, p := range params {
46-
if paramMap, ok := p.(map[string]any); ok {
47-
param := parseMicroflowParameter(paramMap)
48-
nf.Parameters = append(nf.Parameters, param)
43+
// Parse parameters (same format variants as microflows)
44+
var paramsArray any
45+
if mpc, ok := raw["MicroflowParameterCollection"]; ok {
46+
if mpcMap := extractBsonMap(mpc); mpcMap != nil {
47+
paramsArray = mpcMap["Parameters"]
48+
}
49+
} else {
50+
paramKey := "MicroflowParameters"
51+
if _, ok := raw[paramKey]; !ok {
52+
paramKey = "Parameters"
53+
}
54+
paramsArray = raw[paramKey]
55+
}
56+
for _, p := range extractBsonSlice(paramsArray) {
57+
if paramMap := extractBsonMap(p); paramMap != nil {
58+
param := parseMicroflowParameter(paramMap)
59+
nf.Parameters = append(nf.Parameters, param)
60+
}
61+
}
62+
63+
// Parse return type (uses same BSON key as microflows)
64+
if rt, ok := raw["MicroflowReturnType"].(map[string]any); ok {
65+
nf.ReturnType = parseMicroflowDataType(rt)
66+
}
67+
68+
// Parse object collection (activities)
69+
if oc := extractBsonMap(raw["ObjectCollection"]); oc != nil {
70+
nf.ObjectCollection = parseMicroflowObjectCollection(oc)
71+
}
72+
73+
// Also extract parameters from ObjectCollection.Objects (modern format)
74+
if len(nf.Parameters) == 0 {
75+
if ocRaw := extractBsonMap(raw["ObjectCollection"]); ocRaw != nil {
76+
for _, obj := range extractBsonSlice(ocRaw["Objects"]) {
77+
if objMap := extractBsonMap(obj); objMap != nil {
78+
if typeName, _ := objMap["$Type"].(string); typeName == "Microflows$MicroflowParameter" {
79+
param := parseMicroflowParameter(objMap)
80+
nf.Parameters = append(nf.Parameters, param)
81+
}
82+
}
83+
}
84+
}
85+
}
86+
87+
// Parse Flows array (SequenceFlows and AnnotationFlows at root level)
88+
if flowsRaw := raw["Flows"]; flowsRaw != nil {
89+
if nf.ObjectCollection == nil {
90+
nf.ObjectCollection = &microflows.MicroflowObjectCollection{}
91+
}
92+
for _, f := range extractBsonSlice(flowsRaw) {
93+
if flowMap := extractBsonMap(f); flowMap != nil {
94+
typeName, _ := flowMap["$Type"].(string)
95+
switch typeName {
96+
case "Microflows$AnnotationFlow":
97+
if af := parseAnnotationFlow(flowMap); af != nil {
98+
nf.ObjectCollection.AnnotationFlows = append(nf.ObjectCollection.AnnotationFlows, af)
99+
}
100+
default:
101+
if flow := parseSequenceFlow(flowMap); flow != nil {
102+
nf.ObjectCollection.Flows = append(nf.ObjectCollection.Flows, flow)
103+
}
104+
}
49105
}
50106
}
51107
}

0 commit comments

Comments
 (0)