empathy-framework 3.3.2__py3-none-any.whl → 3.4.0__py3-none-any.whl

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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: empathy-framework
3
- Version: 3.3.2
3
+ Version: 3.4.0
4
4
  Summary: AI collaboration framework with persistent memory, anticipatory intelligence, code inspection, and multi-agent orchestration
5
5
  Author-email: Patrick Roebuck <patrick.roebuck@smartAImemory.com>
6
6
  Maintainer-email: Smart-AI-Memory <patrick.roebuck@smartAImemory.com>
@@ -32,7 +32,7 @@ coach_wizards/refactoring_wizard.py,sha256=1AuRyX45KI63n_-fvvbRXamqvPbrB-O1B7TPP
32
32
  coach_wizards/scaling_wizard.py,sha256=yLULCkflLoBKS4hOSBPQuKKGBGHgKExnuEp5WLTIY-8,2596
33
33
  coach_wizards/security_wizard.py,sha256=tr1iq0egAMLCM-wOFhTDN5dHQRFuhSshXSkv17Jm7eM,2603
34
34
  coach_wizards/testing_wizard.py,sha256=M2RtaTa1WHsk42svJAEZpLySU3PXJJZn2jigouMJrG0,2561
35
- empathy_framework-3.3.2.dist-info/licenses/LICENSE,sha256=IJ9eeI5KSrD5P7alsn7sI_6_1bDihxBA5S4Sen4jf2k,4937
35
+ empathy_framework-3.4.0.dist-info/licenses/LICENSE,sha256=IJ9eeI5KSrD5P7alsn7sI_6_1bDihxBA5S4Sen4jf2k,4937
36
36
  empathy_healthcare_plugin/__init__.py,sha256=FvVcD7WQTlmCCLgSPfM-FPT2l-ma1oAACBZWhtYFAUA,296
37
37
  empathy_healthcare_plugin/protocols/cardiac.json,sha256=uShOvI2RQJYLZacLT2R_aHfsjvJdyCu_gYfpMfK3N74,2088
38
38
  empathy_healthcare_plugin/protocols/post_operative.json,sha256=nqh3ydPY8FNSLv-Q3QmH8Dsyc1c4LvQxUSP84B8W6xk,2021
@@ -52,12 +52,10 @@ empathy_llm_toolkit/pattern_summary.py,sha256=q3gPMZtk5TIG9hs61mEZzaBtpry0qVfbu2
52
52
  empathy_llm_toolkit/providers.py,sha256=M_DrZr7Yq5c2edEoUGH20LUI9nmi9KOkqDvTku2dhBw,13958
53
53
  empathy_llm_toolkit/session_status.py,sha256=pJwqHwbVwR2Q6coRkB_34CWRCMoF-r4-YBtQWEO1Mj8,25724
54
54
  empathy_llm_toolkit/state.py,sha256=oi8bPqUHkmfgkfT4_4eD1ndIGH_THyLQDYlIWZLUx5s,8051
55
- empathy_llm_toolkit/htmlcov/status.json,sha256=emOFm_dTJcNl_Bw_lh62qNbnU6yzhne8TWlQkrPVdrk,8544
56
- empathy_llm_toolkit/security/htmlcov/status.json,sha256=ELS9bn59azqfEyyokI-nV4gQLPQh4bVwHsmhVbdrKYI,4402
57
55
  empathy_os/__init__.py,sha256=pvaca4oCfdL4MG5WO-RKJeXBOk0oj02Mhh_E0h7zSyY,5896
58
56
  empathy_os/cli.py,sha256=k3r_0as7mtOPnLyp3cNKRQiLSKYJqFlmYuRuhdiRrwM,87001
59
57
  empathy_os/cli_unified.py,sha256=TvfsheONim8ETegZo3KJA2vBtFD0fn0rRikUz83w1Dg,14021
60
- empathy_os/config.py,sha256=4HbsxrXTgZrvuhwA5MojMQHhhVArCNBsOkFMf_ytDj0,12736
58
+ empathy_os/config.py,sha256=itgEYHR3QOxtjObHqnYGoQ48863Mf16UoGPyc_l8gNE,14803
61
59
  empathy_os/coordination.py,sha256=0jKt2DzzJmFjpXJs4pMXBcUktCFHsa9i3rkXzXxykGk,28656
62
60
  empathy_os/core.py,sha256=kL_37DajqIV1_b0ldee8rGG0xUTrSzAqYuQ4dowSxuw,53229
63
61
  empathy_os/cost_tracker.py,sha256=VwjkyKEm-gbmyO7wQ88t82RNZfc-LCp0vpK699Giqp0,12575
@@ -76,7 +74,7 @@ empathy_os/redis_config.py,sha256=L8KoHFwhl-_twSswMfELUgOmANOTPRB9Yj8VXuxfSb4,59
76
74
  empathy_os/redis_memory.py,sha256=lWS_F4FeDkmEI-jIgkPTzs3D8TTDB0627WsOxYMT-XM,23276
77
75
  empathy_os/templates.py,sha256=ap4u9i5O9KA83wWLfoUCS7phDHKb6wj8M1Zcm218lN0,17069
78
76
  empathy_os/trust_building.py,sha256=8ZvNwJmeDyKeUIkk_331M9jwKcqrsn6K43gnGtnIXbM,18790
79
- empathy_os/workflow_commands.py,sha256=PmU2fKW6__Wl0UVrqVW2Byb0yMFvUMIzEyYv8S48iZA,21904
77
+ empathy_os/workflow_commands.py,sha256=ZfACBQKjaAfEZER4yRRsFVw9IfGhhPVGwQyBjD1HUAk,21904
80
78
  empathy_software_plugin/SOFTWARE_PLUGIN_README.md,sha256=RXIOB9Mt-8JrfGAA3ZUuRPT34sThubrwUgg5iNcSKIc,22591
81
79
  empathy_software_plugin/__init__.py,sha256=Ylyj95pSsoN9Zasam96DH61uBHoMJh3kbhO7k_VaCWo,310
82
80
  empathy_software_plugin/cli.py,sha256=GrZWpnFJ9allM9sYrh8rSxSlVDU6RZVnEy4FYg-dSG8,22366
@@ -98,8 +96,8 @@ wizards/sbar_wizard.py,sha256=CJ63JAXwcfBf6C3aYyxY2LODbARP9GPl0ZGJWLbx88E,21790
98
96
  wizards/shift_handoff_wizard.py,sha256=SkoNB0nLQGg92yz4j1j3NBR2mGVe_rw1pTjOFDy-JH0,19092
99
97
  wizards/soap_note_wizard.py,sha256=DBzuuuOvIONhwdfn8jaE4PCuGeKsFwM65XTb6gKFIy4,23572
100
98
  wizards/treatment_plan.py,sha256=t2Qk5eCa1gobEUaBztnwem_p9OuJK5BKqJ-Po8vXuns,512
101
- empathy_framework-3.3.2.dist-info/METADATA,sha256=0759VJYAHhsg8gLS31LhFkG8TjzLTSXcVEOKAMX4Lqk,28781
102
- empathy_framework-3.3.2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
103
- empathy_framework-3.3.2.dist-info/entry_points.txt,sha256=zMu7sKCiLndbEEXjTecltS-1P_JZoEUKrifuRBBbroc,1268
104
- empathy_framework-3.3.2.dist-info/top_level.txt,sha256=8zHB-_f0MI2K55LIEjCeaFNcog3_KgLBa_dDfzE8ESI,110
105
- empathy_framework-3.3.2.dist-info/RECORD,,
99
+ empathy_framework-3.4.0.dist-info/METADATA,sha256=UBYvv7e3qquNYWfkVQdezKGO9E3FSnIW-Y7Qu8Cy-j4,28781
100
+ empathy_framework-3.4.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
101
+ empathy_framework-3.4.0.dist-info/entry_points.txt,sha256=zMu7sKCiLndbEEXjTecltS-1P_JZoEUKrifuRBBbroc,1268
102
+ empathy_framework-3.4.0.dist-info/top_level.txt,sha256=8zHB-_f0MI2K55LIEjCeaFNcog3_KgLBa_dDfzE8ESI,110
103
+ empathy_framework-3.4.0.dist-info/RECORD,,
empathy_os/config.py CHANGED
@@ -24,6 +24,8 @@ try:
24
24
  except ImportError:
25
25
  YAML_AVAILABLE = False
26
26
 
27
+ from empathy_os.workflows.config import ModelConfig
28
+
27
29
 
28
30
  @dataclass
29
31
  class EmpathyConfig:
@@ -77,6 +79,18 @@ class EmpathyConfig:
77
79
  # Custom metadata
78
80
  metadata: dict[str, Any] = field(default_factory=dict)
79
81
 
82
+ # Model settings
83
+ models: list[ModelConfig] = field(default_factory=list)
84
+ default_model: str | None = None
85
+ log_path: str | None = None
86
+ max_threads: int = 4
87
+ model_router: dict[str, Any] | None = None
88
+
89
+ def __post_init__(self):
90
+ """Post-initialization validation."""
91
+ if self.default_model and not any(m.name == self.default_model for m in self.models):
92
+ raise ValueError(f"Default model '{self.default_model}' not in models.")
93
+
80
94
  @classmethod
81
95
  def from_yaml(cls, filepath: str) -> "EmpathyConfig":
82
96
  """
@@ -95,6 +109,12 @@ class EmpathyConfig:
95
109
  Example:
96
110
  >>> config = EmpathyConfig.from_yaml("empathy.config.yml")
97
111
  >>> empathy = EmpathyOS(config=config)
112
+
113
+ Note:
114
+ Unknown fields in the YAML file are silently ignored.
115
+ This allows config files to contain settings for other
116
+ components (e.g., model_preferences, workflows) without
117
+ breaking EmpathyConfig loading.
98
118
  """
99
119
  if not YAML_AVAILABLE:
100
120
  raise ImportError(
@@ -104,7 +124,26 @@ class EmpathyConfig:
104
124
  with open(filepath) as f:
105
125
  data = yaml.safe_load(f)
106
126
 
107
- return cls(**data)
127
+ # Filter to only known fields (gracefully ignore unknown fields like
128
+ # 'provider', 'model_preferences', 'workflows', etc.)
129
+ from dataclasses import fields as dataclass_fields
130
+
131
+ valid_fields = {f.name for f in dataclass_fields(cls)}
132
+ filtered_data = {k: v for k, v in data.items() if k in valid_fields}
133
+
134
+ return cls.from_dict(filtered_data)
135
+
136
+ @classmethod
137
+ def from_dict(cls, data: dict[str, Any]) -> "EmpathyConfig":
138
+ """Create an EmpathyConfig from a dictionary, ignoring unknown fields."""
139
+ known_fields = {f.name for f in cls.__dataclass_fields__.values()}
140
+ filtered_data = {k: v for k, v in data.items() if k in known_fields}
141
+
142
+ # Handle nested ModelConfig objects
143
+ if "models" in filtered_data and filtered_data["models"]:
144
+ filtered_data["models"] = [ModelConfig(**m) for m in filtered_data["models"]]
145
+
146
+ return cls(**filtered_data)
108
147
 
109
148
  @classmethod
110
149
  def from_json(cls, filepath: str) -> "EmpathyConfig":
@@ -120,11 +159,20 @@ class EmpathyConfig:
120
159
  Example:
121
160
  >>> config = EmpathyConfig.from_json("empathy.config.json")
122
161
  >>> empathy = EmpathyOS(config=config)
162
+
163
+ Note:
164
+ Unknown fields in the JSON file are silently ignored.
123
165
  """
124
166
  with open(filepath) as f:
125
167
  data = json.load(f)
126
168
 
127
- return cls(**data)
169
+ # Filter to only known fields (gracefully ignore unknown fields)
170
+ from dataclasses import fields as dataclass_fields
171
+
172
+ valid_fields = {f.name for f in dataclass_fields(cls)}
173
+ filtered_data = {k: v for k, v in data.items() if k in valid_fields}
174
+
175
+ return cls(**filtered_data)
128
176
 
129
177
  @classmethod
130
178
  def from_env(cls, prefix: str = "EMPATHY_") -> "EmpathyConfig":
@@ -346,8 +346,8 @@ def ship_workflow(
346
346
  print("5. Syncing patterns to Claude Code...")
347
347
  # Import here to avoid circular imports
348
348
  try:
349
- from empathy_llm_toolkit.cli.sync_claude import ( # type: ignore[attr-defined]
350
- sync_patterns_to_claude,
349
+ from empathy_llm_toolkit.cli.sync_claude import (
350
+ sync_patterns_to_claude, # type: ignore[attr-defined]
351
351
  )
352
352
 
353
353
  result = sync_patterns_to_claude(
@@ -1 +0,0 @@
1
- {"note":"This file is an internal implementation detail to speed up HTML report generation. Its format can change at any time. You might be looking for the JSON report: https://coverage.rtfd.io/cmd.html#cmd-json","format":5,"version":"7.11.2","globals":"1647e1602d568c377a9cb0dc3296bc7b","files":{"__init___py":{"hash":"1e943cec927dee34f9523b2eb67d8922","index":{"url":"__init___py.html","file":"__init__.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":6,"n_excluded":0,"n_missing":0,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"claude_memory_py":{"hash":"25f8fe4e69f6b1e4091924c070803e8a","index":{"url":"claude_memory_py.html","file":"claude_memory.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":169,"n_excluded":0,"n_missing":169,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"code_health_py":{"hash":"a78753eaebd08c9c2cb5f1cd5a14f723","index":{"url":"code_health_py.html","file":"code_health.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":503,"n_excluded":0,"n_missing":503,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"contextual_patterns_py":{"hash":"12004dba086f2def1d9e65bbf68a88f8","index":{"url":"contextual_patterns_py.html","file":"contextual_patterns.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":171,"n_excluded":0,"n_missing":171,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"core_py":{"hash":"aa25b266741f161b0fa2500af1db03da","index":{"url":"core_py.html","file":"core.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":177,"n_excluded":0,"n_missing":151,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"git_pattern_extractor_py":{"hash":"88e57b53ff683a92613ae343a55ad1bb","index":{"url":"git_pattern_extractor_py.html","file":"git_pattern_extractor.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":164,"n_excluded":0,"n_missing":164,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"levels_py":{"hash":"ef211f0c742ccdab452cbe36ac205815","index":{"url":"levels_py.html","file":"levels.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":33,"n_excluded":0,"n_missing":12,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"pattern_confidence_py":{"hash":"1806d001ef22f2f9c4f5cc24faa5724d","index":{"url":"pattern_confidence_py.html","file":"pattern_confidence.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":196,"n_excluded":0,"n_missing":196,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"pattern_resolver_py":{"hash":"af2687d544197eb576abe872270157a5","index":{"url":"pattern_resolver_py.html","file":"pattern_resolver.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":121,"n_excluded":0,"n_missing":121,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"pattern_summary_py":{"hash":"51c42611c0d7a57f4e5c9f487f3b0882","index":{"url":"pattern_summary_py.html","file":"pattern_summary.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":178,"n_excluded":0,"n_missing":178,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"providers_py":{"hash":"8b779f9132bea067bec66007bd492b45","index":{"url":"providers_py.html","file":"providers.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":106,"n_excluded":0,"n_missing":76,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_10414145323772df___init___py":{"hash":"dec456df46eda04d5d3381b09af05c36","index":{"url":"z_10414145323772df___init___py.html","file":"security/__init__.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":3,"n_excluded":0,"n_missing":0,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_10414145323772df_audit_logger_py":{"hash":"9197b939a93f6b8dd8549ab6b73f0887","index":{"url":"z_10414145323772df_audit_logger_py.html","file":"security/audit_logger.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":247,"n_excluded":0,"n_missing":247,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_10414145323772df_audit_logger_example_py":{"hash":"ecc80543a0cac77b9b5a52d9d8451793","index":{"url":"z_10414145323772df_audit_logger_example_py.html","file":"security/audit_logger_example.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":59,"n_excluded":0,"n_missing":59,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_10414145323772df_pii_scrubber_py":{"hash":"0254532a873c529be428a4d88663e917","index":{"url":"z_10414145323772df_pii_scrubber_py.html","file":"security/pii_scrubber.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":140,"n_excluded":0,"n_missing":140,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_10414145323772df_secrets_detector_py":{"hash":"b160d5903a118f959559e32f7535d7e2","index":{"url":"z_10414145323772df_secrets_detector_py.html","file":"security/secrets_detector.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":199,"n_excluded":0,"n_missing":199,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_10414145323772df_secrets_detector_example_py":{"hash":"ba9b9af2e80e78ec21a15712e06dd279","index":{"url":"z_10414145323772df_secrets_detector_example_py.html","file":"security/secrets_detector_example.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":145,"n_excluded":0,"n_missing":145,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_10414145323772df_secure_memdocs_py":{"hash":"47c339d82b66068fb9a831fffb58bc8a","index":{"url":"z_10414145323772df_secure_memdocs_py.html","file":"security/secure_memdocs.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":350,"n_excluded":0,"n_missing":350,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_10414145323772df_secure_memdocs_example_py":{"hash":"3fd076ca92a0a84002c57d80cfed902f","index":{"url":"z_10414145323772df_secure_memdocs_example_py.html","file":"security/secure_memdocs_example.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":106,"n_excluded":0,"n_missing":106,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"session_status_py":{"hash":"4c8d6be4bbdac24bc27d0c27890532a6","index":{"url":"session_status_py.html","file":"session_status.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":312,"n_excluded":0,"n_missing":312,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"state_py":{"hash":"724ab29020a3a3870ac6b9c94c71127d","index":{"url":"state_py.html","file":"state.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":87,"n_excluded":0,"n_missing":40,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_984ef1e268fea449___init___py":{"hash":"10fa30f44c3688eb2de5302412aa33d6","index":{"url":"z_984ef1e268fea449___init___py.html","file":"wizards/__init__.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":5,"n_excluded":0,"n_missing":5,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_984ef1e268fea449_base_wizard_py":{"hash":"590f2d248a77ea3e621b9f3c4ded2397","index":{"url":"z_984ef1e268fea449_base_wizard_py.html","file":"wizards/base_wizard.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":56,"n_excluded":0,"n_missing":56,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_984ef1e268fea449_customer_support_wizard_py":{"hash":"f92a98bbbec12fad579ac19787971b08","index":{"url":"z_984ef1e268fea449_customer_support_wizard_py.html","file":"wizards/customer_support_wizard.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":17,"n_excluded":0,"n_missing":17,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_984ef1e268fea449_healthcare_wizard_py":{"hash":"96977dfa18d691fdd84424311686d23a","index":{"url":"z_984ef1e268fea449_healthcare_wizard_py.html","file":"wizards/healthcare_wizard.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":57,"n_excluded":0,"n_missing":57,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_984ef1e268fea449_technology_wizard_py":{"hash":"6998c841130aa6e0982dc586006a5640","index":{"url":"z_984ef1e268fea449_technology_wizard_py.html","file":"wizards/technology_wizard.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":19,"n_excluded":0,"n_missing":19,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}}}}
@@ -1 +0,0 @@
1
- {"note":"This file is an internal implementation detail to speed up HTML report generation. Its format can change at any time. You might be looking for the JSON report: https://coverage.rtfd.io/cmd.html#cmd-json","format":5,"version":"7.11.2","globals":"93e0a98f3da7f95e5ae873f233acfe8f","files":{"z_0da0bc3caf3df21d___init___py":{"hash":"678b97c61cc7e540c9ecbd0485aef62e","index":{"url":"z_0da0bc3caf3df21d___init___py.html","file":"/Users/patrickroebuck/empathy_11_6_2025/Empathy-framework/empathy_llm_toolkit/__init__.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":6,"n_excluded":0,"n_missing":0,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_0da0bc3caf3df21d_claude_memory_py":{"hash":"9e1a909857359093b60c8b3641b9686f","index":{"url":"z_0da0bc3caf3df21d_claude_memory_py.html","file":"/Users/patrickroebuck/empathy_11_6_2025/Empathy-framework/empathy_llm_toolkit/claude_memory.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":169,"n_excluded":0,"n_missing":132,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_0da0bc3caf3df21d_core_py":{"hash":"45f6bf0d1f0f9b193700d313f3999f0a","index":{"url":"z_0da0bc3caf3df21d_core_py.html","file":"/Users/patrickroebuck/empathy_11_6_2025/Empathy-framework/empathy_llm_toolkit/core.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":124,"n_excluded":0,"n_missing":100,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_0da0bc3caf3df21d_levels_py":{"hash":"029cd19bbfaefe72a2df6fb26fafbb07","index":{"url":"z_0da0bc3caf3df21d_levels_py.html","file":"/Users/patrickroebuck/empathy_11_6_2025/Empathy-framework/empathy_llm_toolkit/levels.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":33,"n_excluded":0,"n_missing":12,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_0da0bc3caf3df21d_providers_py":{"hash":"8a61e565ded340098a9717471cb139cc","index":{"url":"z_0da0bc3caf3df21d_providers_py.html","file":"/Users/patrickroebuck/empathy_11_6_2025/Empathy-framework/empathy_llm_toolkit/providers.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":104,"n_excluded":0,"n_missing":74,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"__init___py":{"hash":"bc61a9c102480a73e01fb8f507fe604c","index":{"url":"__init___py.html","file":"__init__.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":3,"n_excluded":0,"n_missing":0,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"audit_logger_py":{"hash":"288003e820abd1edb81b099a12e58af5","index":{"url":"audit_logger_py.html","file":"audit_logger.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":244,"n_excluded":0,"n_missing":72,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"audit_logger_example_py":{"hash":"8c491197716328c7faed6badacb3a68b","index":{"url":"audit_logger_example_py.html","file":"audit_logger_example.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":60,"n_excluded":0,"n_missing":60,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"pii_scrubber_py":{"hash":"9768c14c0e1e90619f7d80f059ca4395","index":{"url":"pii_scrubber_py.html","file":"pii_scrubber.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":140,"n_excluded":0,"n_missing":107,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"secrets_detector_py":{"hash":"36cd068d345d0328e6959132de4ade69","index":{"url":"secrets_detector_py.html","file":"secrets_detector.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":199,"n_excluded":0,"n_missing":199,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"test_audit_logger_py":{"hash":"a5a92daff7da2027470aca6a728adbb8","index":{"url":"test_audit_logger_py.html","file":"test_audit_logger.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":185,"n_excluded":0,"n_missing":1,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}},"z_0da0bc3caf3df21d_state_py":{"hash":"3ed61e7760d5e588d4d6743dffa9094f","index":{"url":"z_0da0bc3caf3df21d_state_py.html","file":"/Users/patrickroebuck/empathy_11_6_2025/Empathy-framework/empathy_llm_toolkit/state.py","description":"","nums":{"precision":0,"n_files":1,"n_statements":87,"n_excluded":0,"n_missing":40,"n_branches":0,"n_partial_branches":0,"n_missing_branches":0}}}}}