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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pi-codemcp",
3
- "version": "1.3.0",
3
+ "version": "1.3.1",
4
4
  "description": "Typed, sandboxed Code Mode access to configured MCP servers for Pi",
5
5
  "type": "module",
6
6
  "packageManager": "bun@1.3.10",
@@ -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
- ) -> JsonObject | None:
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
- resolved = _resolve_ref(ref, root) if isinstance(ref, str) else member
1063
- if resolved.get("type") not in {None, "object"}:
1064
- return None
1065
- raw_properties = resolved.get("properties")
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 = resolved.get("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 resolved:
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
- merged: JsonObject = {
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
- merged["additionalProperties"] = additional_properties
1085
- return merged
1109
+ merged_object["additionalProperties"] = additional_properties
1110
+ return merged_object
1086
1111
 
1087
1112
 
1088
1113
  def _dedupe(blocks: Iterable[str]) -> list[str]: