pi-codemcp 1.3.0 → 1.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/sidecar/tool_catalog.py +42 -17
package/package.json
CHANGED
package/sidecar/tool_catalog.py
CHANGED
|
@@ -1047,42 +1047,67 @@ def _resolve_ref(ref: str, root: JsonSchema) -> JsonObject:
|
|
|
1047
1047
|
def _merge_all_of(
|
|
1048
1048
|
schema: JsonObject,
|
|
1049
1049
|
root: JsonSchema,
|
|
1050
|
-
) ->
|
|
1051
|
-
merged_properties: JsonObject = {}
|
|
1052
|
-
merged_required: list[JsonValue] = []
|
|
1053
|
-
additional_properties: JsonValue = True
|
|
1054
|
-
has_additional_properties = False
|
|
1050
|
+
) -> JsonSchema | None:
|
|
1055
1051
|
raw_members = schema.get("allOf")
|
|
1056
1052
|
if not isinstance(raw_members, list):
|
|
1057
1053
|
return None
|
|
1054
|
+
# Sibling constraints (type, properties, ...) apply on top of allOf members.
|
|
1055
|
+
parts: list[JsonObject] = [{key: value for key, value in schema.items() if key != "allOf"}]
|
|
1058
1056
|
for member in raw_members:
|
|
1059
1057
|
if not isinstance(member, dict):
|
|
1060
1058
|
return None
|
|
1061
1059
|
ref = member.get("$ref")
|
|
1062
|
-
|
|
1063
|
-
|
|
1064
|
-
|
|
1065
|
-
|
|
1060
|
+
parts.append(_resolve_ref(ref, root) if isinstance(ref, str) else member)
|
|
1061
|
+
|
|
1062
|
+
declared_types: set[str] = set()
|
|
1063
|
+
for part in parts:
|
|
1064
|
+
part_type = part.get("type")
|
|
1065
|
+
if isinstance(part_type, str):
|
|
1066
|
+
declared_types.add(part_type)
|
|
1067
|
+
if len(declared_types) > 1:
|
|
1068
|
+
return None
|
|
1069
|
+
merged_type = declared_types.pop() if declared_types else None
|
|
1070
|
+
|
|
1071
|
+
if merged_type == "object" or (
|
|
1072
|
+
merged_type is None and any("properties" in part for part in parts)
|
|
1073
|
+
):
|
|
1074
|
+
return _merge_object_parts(parts)
|
|
1075
|
+
|
|
1076
|
+
if merged_type is None:
|
|
1077
|
+
# Annotation-only allOf (descriptions, patterns, ...): no type information.
|
|
1078
|
+
return True
|
|
1079
|
+
merged: JsonObject = {"type": merged_type}
|
|
1080
|
+
for part in parts:
|
|
1081
|
+
if "items" in part and "items" not in merged:
|
|
1082
|
+
merged["items"] = part["items"]
|
|
1083
|
+
return merged
|
|
1084
|
+
|
|
1085
|
+
|
|
1086
|
+
def _merge_object_parts(parts: list[JsonObject]) -> JsonObject:
|
|
1087
|
+
merged_properties: JsonObject = {}
|
|
1088
|
+
merged_required: list[JsonValue] = []
|
|
1089
|
+
additional_properties: JsonValue = True
|
|
1090
|
+
has_additional_properties = False
|
|
1091
|
+
for part in parts:
|
|
1092
|
+
raw_properties = part.get("properties")
|
|
1066
1093
|
if isinstance(raw_properties, dict):
|
|
1067
1094
|
merged_properties.update(raw_properties)
|
|
1068
|
-
raw_required =
|
|
1095
|
+
raw_required = part.get("required")
|
|
1069
1096
|
if isinstance(raw_required, list):
|
|
1070
1097
|
for required in raw_required:
|
|
1071
1098
|
if isinstance(required, str) and required not in merged_required:
|
|
1072
1099
|
merged_required.append(required)
|
|
1073
|
-
if "additionalProperties" in
|
|
1074
|
-
additional_properties = JSON_VALUE_ADAPTER.validate_python(
|
|
1075
|
-
resolved["additionalProperties"]
|
|
1076
|
-
)
|
|
1100
|
+
if "additionalProperties" in part:
|
|
1101
|
+
additional_properties = JSON_VALUE_ADAPTER.validate_python(part["additionalProperties"])
|
|
1077
1102
|
has_additional_properties = True
|
|
1078
|
-
|
|
1103
|
+
merged_object: JsonObject = {
|
|
1079
1104
|
"type": "object",
|
|
1080
1105
|
"properties": merged_properties,
|
|
1081
1106
|
"required": merged_required,
|
|
1082
1107
|
}
|
|
1083
1108
|
if has_additional_properties:
|
|
1084
|
-
|
|
1085
|
-
return
|
|
1109
|
+
merged_object["additionalProperties"] = additional_properties
|
|
1110
|
+
return merged_object
|
|
1086
1111
|
|
|
1087
1112
|
|
|
1088
1113
|
def _dedupe(blocks: Iterable[str]) -> list[str]:
|