pyegeria 5.4.7__py3-none-any.whl → 5.4.7.2__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.
@@ -121,6 +121,7 @@ COMMON_COLUMNS = [
121
121
  Column(name='Category', key='category'),
122
122
  Column(name='Description', key='description', format=True),
123
123
  Column(name='Status', key='status'),
124
+ Column(name='Type Name', key='type_name')
124
125
  ]
125
126
 
126
127
 
@@ -560,6 +561,29 @@ base_output_format_sets = FormatSetDict({
560
561
  spec_params={"metadata_element_types": ["DigitalProductCatalog"]},
561
562
  ),
562
563
  ),
564
+ "Digital-Product-Catalog-MyE": FormatSet(
565
+ target_type="DigitalProductCatalog",
566
+ heading="Catalogs for Digital Products",
567
+ description="Attributes generic to all Digital Product Catalogs..",
568
+ aliases=[],
569
+ annotations={},
570
+ formats=[
571
+ Format(
572
+ types=["DICT", "TABLE", "LIST", "MD", "FORM","REPORT"],
573
+ columns=COMMON_COLUMNS + [
574
+ Column(name="Containing Members", key='collection_members'),
575
+ Column(name="Member Of", key='member_of_collections')
576
+ ]
577
+ ),
578
+
579
+ ],
580
+ action=ActionParameter(
581
+ function="CollectionManager.find_collections",
582
+ required_params=["search_string"],
583
+ optional_params=OPTIONAL_PARAMS,
584
+ spec_params={"metadata_element_types": ["DigitalProductCatalog"]},
585
+ ),
586
+ ),
563
587
 
564
588
  "Digital-Products": FormatSet(
565
589
  target_type="DigitalProduct",
@@ -617,6 +641,53 @@ base_output_format_sets = FormatSetDict({
617
641
  spec_params={},
618
642
  )
619
643
  ),
644
+ "Digital-Products-MyE": FormatSet(
645
+ target_type="DigitalProduct",
646
+ heading="Digital Product Information",
647
+ description="Attributes useful to Digital Products.",
648
+ aliases=[],
649
+ annotations={},
650
+ formats=[
651
+ Format(
652
+ types=["FORM", "DICT", "TABLE", "LIST", "MD"],
653
+ columns=COMMON_COLUMNS + [
654
+ Column(name="Status", key='status'),
655
+ Column(name='Product Name', key='product_name'),
656
+ Column(name='Members', key='members', format=True),
657
+ Column(name='Product Manager', key='assigned_actors'),
658
+ ]),
659
+ Format(
660
+ types=["REPORT", "HTML"],
661
+ columns=COMMON_COLUMNS + [
662
+ Column(name="Status", key='status'),
663
+ Column(name='Product Name', key='product_name'),
664
+ Column(name='Identifier', key='identifier'),
665
+ Column(name='Maturity', key='maturity'),
666
+ Column(name='Service Life', key='service_life'),
667
+ Column(name='Next Version', key='next_version'),
668
+ Column(name='Withdraw Date', key='withdraw_date'),
669
+ Column(name='Members', key='members', format=True),
670
+ Column(name='Uses Products', key='uses_digital_products'),
671
+ Column(name='Used by Products', key='used_by_digital_products'),
672
+ Column(name='Product Manager', key='assigned_actors'),
673
+ Column(name='License', key='governed_by'),
674
+ Column(name='Solution Blueprint', key='solution_designs'),
675
+ Column(name="Mermaid", key="mermaid")
676
+ ],
677
+ )
678
+ ],
679
+ action=ActionParameter(
680
+ function="CollectionManager.find_collections",
681
+ required_params=["search_string"],
682
+ optional_params=OPTIONAL_PARAMS,
683
+ spec_params={"metadata_element_types": ["DigitalProduct"]},
684
+ ),
685
+ get_additional_props=ActionParameter(
686
+ function="CollectionManager._extract_digital_product_properties",
687
+ required_params=[],
688
+ spec_params={},
689
+ )
690
+ ),
620
691
 
621
692
  "Agreements": FormatSet(
622
693
  target_type="Agreement",
@@ -13,7 +13,9 @@ Notes
13
13
  """
14
14
  from __future__ import annotations
15
15
 
16
+ import asyncio
16
17
  import json
18
+ import sys
17
19
  from typing import Any, Dict, Optional
18
20
 
19
21
  from loguru import logger
@@ -52,7 +54,140 @@ def _resolve_client_and_method(func_decl: str):
52
54
  return (client_class, method_name)
53
55
 
54
56
 
55
- def run_format_set_action_return(
57
+
58
+ async def safe_call_tool(func, **call_params):
59
+ """
60
+ Safely calls a function, awaiting it only if it is an asynchronous coroutine.
61
+ """
62
+ try:
63
+ if asyncio.iscoroutinefunction(func):
64
+ # If it's an async function, call it with await
65
+ print("DEBUG: Function is async, using await.", file=sys.stderr)
66
+ result = await func(**call_params)
67
+ else:
68
+ # If it's a synchronous function, call it directly
69
+ print("DEBUG: Function is sync, calling directly.", file=sys.stderr)
70
+ result = func(**call_params)
71
+
72
+ return result
73
+
74
+ except Exception as e:
75
+ print(f"ERROR calling function: {e}", file=sys.stderr)
76
+ raise
77
+
78
+
79
+
80
+ async def _async_run_report(
81
+ report_name: str,
82
+ egeria_client: EgeriaTech,
83
+ output_format: str = "DICT",
84
+ params: Optional[Dict[str, Any]] = None,
85
+ ) -> Dict[str, Any]:
86
+ """
87
+ Execute the action for a given format set and return a normalized result structure.
88
+
89
+ Returns shapes:
90
+ - {"kind":"empty"}
91
+ - {"kind":"json","data": <list|dict|any>}
92
+ - {"kind":"text","mime": "text/markdown"|"text/html","content": str}
93
+ - {"kind":"unknown","raw": any}
94
+ """
95
+ params = dict(params or {})
96
+
97
+ # Resolve the format set and action
98
+ fmt = select_output_format_set(report_name, output_format)
99
+ if not fmt:
100
+ raise ValueError(
101
+ f"Output format set '{report_name}' does not have a compatible '{output_format}' format."
102
+ )
103
+ if "action" not in fmt:
104
+ raise ValueError(f"Output format set '{report_name}' does not have an action property.")
105
+
106
+ action = fmt["action"]
107
+ func_decl = action.get("function")
108
+ if isinstance(func_decl, str) and "." in func_decl:
109
+ class_name, method_name = func_decl.split(".")
110
+
111
+ if not method_name.startswith("_async_"):
112
+ method_name = "_async_" + method_name
113
+ func_decl = class_name + "." + method_name
114
+
115
+ required_params = action.get("required_params", action.get("user_params", [])) or []
116
+ optional_params = action.get("optional_params", []) or []
117
+ spec_params = action.get("spec_params", {}) or {}
118
+ print(f"func_decl={func_decl}", file=sys.stderr)
119
+ # Build call params: required/optional provided by caller + fixed spec_params
120
+ call_params: Dict[str, Any] = {}
121
+
122
+ # Populate required and optional params when provided
123
+ for p in required_params:
124
+ if p in params and params[p] is not None:
125
+ call_params[p] = params[p]
126
+ elif p not in spec_params:
127
+ # Missing required param
128
+ logger.warning(f"Required parameter '{p}' not provided for format set '{report_name}'.")
129
+ for p in optional_params:
130
+ if p in params and params[p] is not None:
131
+ call_params[p] = params[p]
132
+
133
+ # Include fixed specifics
134
+ call_params.update(spec_params)
135
+
136
+ # Always include output_format and output_format_set for downstream rendering
137
+ call_params["output_format"] = output_format
138
+ call_params["output_format_set"] = report_name
139
+
140
+ client_class, method_name = _resolve_client_and_method(func_decl)
141
+
142
+
143
+ try:
144
+ egeria_client.create_egeria_bearer_token()
145
+ func = getattr(egeria_client, method_name) if method_name and hasattr(egeria_client, method_name) else None
146
+ # Add logging to validate func
147
+ msg = f"DEBUG: func={func}, method_name={method_name}, client_class={client_class}"
148
+ logger.debug(msg)
149
+ print(msg, file=sys.stderr)
150
+
151
+ if func is None or not callable(func):
152
+ raise TypeError(
153
+ f"Resolved function '{method_name}' not found in client class '{client_class.__name__}' is not callable."
154
+ )
155
+
156
+ result = await func(**call_params)
157
+
158
+ if not result or result == NO_ELEMENTS_FOUND:
159
+ return {"kind": "empty"}
160
+
161
+ # Prepare optional preamble for narrative outputs
162
+ heading = get_output_format_set_heading(report_name)
163
+ desc = get_output_format_set_description(report_name)
164
+ preamble = f"# {heading}\n{desc}\n\n" if heading and desc else ""
165
+
166
+ if output_format in {"DICT", "JSON", "ALL"}:
167
+ # Return raw data (list/dict/any) — do not stringify here
168
+ return {"kind": "json", "data": result}
169
+ elif output_format in {"REPORT", "MERMAID"}:
170
+ content = result
171
+ if isinstance(result, (list, dict)):
172
+ # Make a simple JSON code block if the source returned structured data unexpectedly
173
+ content = preamble + "```json\n" + json.dumps(result, indent=2) + "\n```"
174
+ else:
175
+ content = preamble + str(result)
176
+ return {"kind": "text", "mime": "text/markdown", "content": content}
177
+ elif output_format == "HTML":
178
+ content = str(result)
179
+ return {"kind": "text", "mime": "text/html", "content": content}
180
+ else:
181
+ # Unknown or table-like formats which aren't appropriate for MCP by default
182
+ return {"kind": "unknown", "raw": result}
183
+
184
+ except PyegeriaException as e:
185
+ # Re-raise with a simpler message for upstream mapping
186
+ raise
187
+
188
+
189
+
190
+ def exec_format_set(
56
191
  format_set_name: str,
57
192
  *,
58
193
  output_format: str = "DICT",
pyegeria/mcp_adapter.py CHANGED
@@ -11,9 +11,6 @@ from __future__ import annotations
11
11
 
12
12
  import json
13
13
  import sys
14
- import asyncio
15
-
16
- from loguru import logger
17
14
  from typing import Any, Dict, Optional
18
15
 
19
16
  from loguru import logger
@@ -21,9 +18,9 @@ from loguru import logger
21
18
  from pyegeria._output_formats import (
22
19
  list_mcp_format_sets,
23
20
  select_output_format_set,
24
- get_output_format_type_match,
25
21
  )
26
- from pyegeria.format_set_executor import run_format_set_action_return
22
+ from pyegeria.egeria_tech_client import EgeriaTech
23
+ from pyegeria.format_set_executor import exec_format_set, _async_run_report
27
24
 
28
25
 
29
26
  def list_reports() -> dict:
@@ -31,12 +28,12 @@ def list_reports() -> dict:
31
28
  return list_mcp_format_sets()
32
29
 
33
30
 
34
- def describe_report(name: str, outputType: str = "DICT") -> Dict[str, Any]:
31
+ def describe_report(name: str, output_type: str = "DICT") -> Dict[str, Any]:
35
32
  """
36
33
  Describe a format set for MCP discovery. If outputType != ANY, a concrete format
37
34
  will be resolved; otherwise only metadata/action are returned.
38
35
  """
39
- meta = select_output_format_set(name, outputType)
36
+ meta = select_output_format_set(name, output_type)
40
37
  if not meta:
41
38
  raise ValueError(f"Unknown or incompatible format set: {name}")
42
39
  return meta
@@ -65,7 +62,7 @@ def _execute_egeria_call_blocking(
65
62
  from pyegeria.config import settings as _settings
66
63
 
67
64
 
68
- return run_format_set_action_return(
65
+ return exec_format_set(
69
66
  format_set_name=report,
70
67
  output_format="DICT",
71
68
  params=params or {},
@@ -82,6 +79,7 @@ def _execute_egeria_call_blocking(
82
79
  # }
83
80
 
84
81
 
82
+
85
83
  def run_report(
86
84
  *,
87
85
  report: str,
@@ -98,8 +96,8 @@ def run_report(
98
96
  print(f"Format set: {report}\nparams: {json.dumps(params)}\nview_server: {view_server}\nview_url: {view_url}\nuser: {user}\nuser_pass: {user_pass}", file=sys.stderr)
99
97
  # Lazy import of settings to avoid circulars when optional args are None
100
98
  from pyegeria.config import settings as _settings
101
- logger.info(f"Format set: {formatSet}\nparams: {json.dumps(params)}\nview_server: {view_server}\nview_url: {view_url}\nuser: {user}\nuser_pass: {user_pass}")
102
- return run_format_set_action_return(
99
+ logger.info(f"Format set: {report}\nparams: {json.dumps(params)}\nview_server: {view_server}\nview_url: {view_url}\nuser: {user}\nuser_pass: {user_pass}")
100
+ return run_format_set(
103
101
  format_set_name=report,
104
102
  output_format="DICT",
105
103
  params=params or {},
@@ -108,3 +106,19 @@ def run_report(
108
106
  user=user if user is not None else _settings.User_Profile.user_name,
109
107
  user_pass=user_pass if user_pass is not None else _settings.User_Profile.user_pwd,
110
108
  )
109
+
110
+ async def _async_run_report_tool(
111
+ *,
112
+ report: str,
113
+ egeria_client: EgeriaTech,
114
+ params: Optional[Dict[str, Any]] = None,
115
+ ) -> Dict[str, Any]:
116
+ """
117
+ Execute a format set action as an MCP-style tool. Enforces DICT/ALL by default.
118
+ Caller may pass credentials explicitly; otherwise defaults are used from config.
119
+ """
120
+ # Lazy import of settings to avoid circulars when optional args are None
121
+
122
+ print(f"Report: {report}\n params: {json.dumps(params)}\n", file=sys.stderr)
123
+ result = await _async_run_report(report, egeria_client, output_format="DICT", params=params)
124
+ return result
pyegeria/mcp_server.py CHANGED
@@ -3,26 +3,28 @@ Copyright Contributors to the ODPi Egeria project.
3
3
 
4
4
  This module provides a basic MCP server for Egeria.
5
5
  """
6
- import asyncio
7
6
  import re
8
7
  import sys
9
- from typing import Any, Dict, Optional, List, Coroutine
8
+ from typing import Any, Dict, Optional
9
+
10
+ from pyegeria.egeria_tech_client import EgeriaTech
11
+
12
+ GLOBAL_EGERIA_CLIENT: Optional[EgeriaTech] = None
10
13
 
11
14
  try:
12
15
  # We use Optional[] and List[] types, so we import them.
13
16
  from mcp.server.fastmcp import FastMCP
17
+ from pyegeria.mcp_adapter import (
18
+ list_reports,
19
+ describe_report,
20
+ run_report, _execute_egeria_call_blocking,
21
+ _async_run_report_tool
22
+ )
14
23
  print("MCP import successful...", file=sys.stderr)
15
24
  except ImportError:
16
25
  print("MCP import failed.", file=sys.stderr)
17
26
  raise
18
27
 
19
- from pyegeria.mcp_adapter import (
20
- list_reports,
21
- describe_report,
22
- run_report, _execute_egeria_call_blocking,
23
- )
24
-
25
-
26
28
  def _ok(result: Dict[str, Any] ) -> Dict[str, Any]:
27
29
  # Pass-through helper in case you want to normalize or add metadata
28
30
  print("OK: Operation completed successfully.", file=sys.stderr)
@@ -31,6 +33,29 @@ def _ok(result: Dict[str, Any] ) -> Dict[str, Any]:
31
33
 
32
34
  def main() -> None:
33
35
  # Initialize the server
36
+
37
+ global GLOBAL_EGERIA_CLIENT
38
+
39
+ try:
40
+ """ Runs ONCE when the server starts.
41
+ Initializes the Egeria client and stores it in the server's state.
42
+ """
43
+ print("DEBUG: Initializing Egeria client...", file=sys.stderr)
44
+ from pyegeria.config import settings as _settings
45
+
46
+ GLOBAL_EGERIA_CLIENT = EgeriaTech(
47
+ _settings.Environment.egeria_view_server,
48
+ _settings.Environment.egeria_view_server_url,
49
+ _settings.User_Profile.user_name,
50
+ _settings.User_Profile.user_pwd
51
+ )
52
+ GLOBAL_EGERIA_CLIENT.create_egeria_bearer_token("erinoverview","secret")
53
+ print("DEBUG: Egeria Client connected", file=sys.stderr)
54
+
55
+ except Exception as e:
56
+ print(f"DEBUG: Exception occurred: {str(e)}", file=sys.stderr)
57
+ raise
58
+
34
59
  srv = FastMCP(name="pyegeria-mcp")
35
60
  print("Starting MCP server...", file=sys.stderr)
36
61
 
@@ -53,7 +78,6 @@ def main() -> None:
53
78
  print(f"DEBUG: Exception during describe_report: {str(e)}", file=sys.stderr)
54
79
  raise
55
80
 
56
- # run_report tool (formerly run_format_set_action)
57
81
  @srv.tool(name="run_report")
58
82
  async def run_report_tool(
59
83
  report_name: str,
@@ -92,10 +116,13 @@ def main() -> None:
92
116
 
93
117
  try:
94
118
 
95
- result = await asyncio.to_thread(
96
- _execute_egeria_call_blocking,
97
- report = report_name,
98
- params = params
119
+ egeria_client: EgeriaTech = GLOBAL_EGERIA_CLIENT
120
+ print("DEBUG: Egeria Client connected", file=sys.stderr)
121
+
122
+ result = await _async_run_report_tool(
123
+ report=report_name,
124
+ egeria_client=egeria_client,
125
+ params=params
99
126
  )
100
127
  print("DEBUG: run_report completed successfully", file=sys.stderr)
101
128
  return _ok(result)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pyegeria
3
- Version: 5.4.7
3
+ Version: 5.4.7.2
4
4
  Summary: A python client for Egeria
5
5
  Author-email: Dan Wolfson <dan.wolfson@pdr-associates.com>
6
6
  License-Expression: Apache-2.0
@@ -18,7 +18,6 @@ Requires-Dist: requests
18
18
  Requires-Dist: jupyter
19
19
  Requires-Dist: click
20
20
  Requires-Dist: trogon
21
- Requires-Dist: textual
22
21
  Requires-Dist: mermaid-py
23
22
  Requires-Dist: psycopg2-binary
24
23
  Requires-Dist: jupyter-notebook-parser
@@ -92,13 +92,16 @@ commands/tech/table_tech_templates.py,sha256=jI1c9YKa3KirArMNXeCRKeaiVdwQSN-ztPq
92
92
  commands/tech/x_list_related_elements.py,sha256=ynaw792VnbMZ9IXBi5mmG7xBfC0kn0esKiFTsjvLGzc,5900
93
93
  md_processing/__init__.py,sha256=B3hBAEI84SsAVFDCSHqoiVnBwSVbuxpeJuX3Jfe5B6U,7327
94
94
  md_processing/dr_egeria.py,sha256=T1YRmGAAlamuYZB5dnBdEeyL9oODhYsxy-G4M_DtCak,20672
95
+ md_processing/data/commands-working.json,sha256=uCo_azcuuYqGm7QffJeCGj7PyZuZRGdu7kKf4XWmMoA,1162560
96
+ md_processing/data/commands.json,sha256=_J0WEfekVTBv994aV6rXdnyWy__WvoYdUJOPhSkPY4I,1759456
97
+ md_processing/data/generated_format_sets.json,sha256=TXvGK_Gm5ieq9i6u9M1j4CaNPzoV2m0hisKK2fWCtIM,98502
95
98
  md_processing/data/generated_format_sets.py,sha256=2BfRzb5G5n8Cz6VwirQXlBq1fHBISIh4x7jquXg6QEw,36402
96
99
  md_processing/md_commands/__init__.py,sha256=ssEojzFlSYtY2bHqqOoKo8PFaANZ_kq_gIbtlXnuc2s,93
97
100
  md_processing/md_commands/data_designer_commands.py,sha256=WGCDlTPmGhcETdmus89w6Y8a3EhyQJ86SJURvphnM24,65516
98
101
  md_processing/md_commands/ext_ref_commands.py,sha256=c-ZdYkWGMsrAyku9R_IReJzrLhNaNFY6vyyiFEjxNT4,23144
99
102
  md_processing/md_commands/glossary_commands.py,sha256=slKnvs6ktdAOZI_EmpVWUB7hrdSngUnitucZu9dR9PE,33411
100
103
  md_processing/md_commands/governance_officer_commands.py,sha256=c7SnJqQooPr3zCebDzeztAM8wZq9G7ZB4EpJ-uR5moI,26479
101
- md_processing/md_commands/product_manager_commands.py,sha256=M63irUyEf52g075U3kzwvm9V1OiqWXp0O68nRNCRWxU,57366
104
+ md_processing/md_commands/product_manager_commands.py,sha256=4YKKdd_2tI5ekZlSJBiJJGqFISD7X6m0rfEd2wEL_PY,57790
102
105
  md_processing/md_commands/project_commands.py,sha256=peAoemgzb8bEQghi8nFU6JrZ5Hro90Bl1JDHl7_nAtM,17127
103
106
  md_processing/md_commands/solution_architect_commands.py,sha256=4Ghb8j2wlDdWtHoSCrx5jCJFEJfqII4mnFJ_tqduRKI,52569
104
107
  md_processing/md_commands/view_commands.py,sha256=bIOSw0GVluOcpZMQNioeO1Srr4Y_84YNz-VHMKpPfVE,12092
@@ -113,7 +116,7 @@ md_processing/md_processing_utils/generate_md_cmd_templates.py,sha256=mFenxe9Jq8
113
116
  md_processing/md_processing_utils/generate_md_templates.py,sha256=DMnMQ7_LbmQCS8aG-ppHGTu25obOSn4ZzSg7V21k9jo,3547
114
117
  md_processing/md_processing_utils/md_processing_constants.py,sha256=_j8FSsB1mZ2SsmDaQWaPH8iWKy1ZHYYjzOgcdIoLZPE,21108
115
118
  md_processing/md_processing_utils/message_constants.py,sha256=UBf18obM83umM6zplR7ychre4xLRbBnTzidHDZ2gNvM,548
116
- pyegeria/__init__.py,sha256=gQqIohRhPr5LKit1oqCD0_gbtHFsnJF1WxT4QOUybmk,11904
119
+ pyegeria/__init__.py,sha256=hgrGk4lBno1rgKRBKWAcljb2wGSHAKhmtu8vbESwUZM,11955
117
120
  pyegeria/_client.py,sha256=hJHn5pD8sbelP_M9dK-M5Z2CYqpRXzXfg1UCgAdQ6dQ,33416
118
121
  pyegeria/_client_new.py,sha256=9GQDOlmCxGPcAhKT_kkrLlS0x7nnVhha7VVR0rAlBnQ,69777
119
122
  pyegeria/_deprecated_gov_engine.py,sha256=dWNcwVsE5__dF2u4QiIyQrssozzzOjBbLld8MdpmVCQ,17264
@@ -121,7 +124,7 @@ pyegeria/_exceptions.py,sha256=1SrnV194V4_YJNnNAU0myTHQ3dhLn4GF2B2gZcj1u90,18153
121
124
  pyegeria/_exceptions_new.py,sha256=srmrlqoWy7VvOJOhPcYFKW32MCIovgEg5J7PrYDxzQA,19706
122
125
  pyegeria/_globals.py,sha256=qSU5hM4uuJZPp-YapEEKxfcdgH9hauc6R7gRkELLroY,1132
123
126
  pyegeria/_output_format_models.py,sha256=p9fTYaIa5KyTMIR4-JAbE9g66_gGMPTnUqjIq20Zr1o,14494
124
- pyegeria/_output_formats.py,sha256=a6dgpfYJ09nMXweId61idEeGiOdGkAm1X-yTFJzMYQs,181116
127
+ pyegeria/_output_formats.py,sha256=sXZrriZS8Y96mXVIwTdzZI8qu2-eGVxsbnxXbi4WmZw,184306
125
128
  pyegeria/_validators.py,sha256=pNxND0dN2qvyuGE52N74l1Ezfrh2p9Hao2ziR_t1ENI,7425
126
129
  pyegeria/asset_catalog_omvs.py,sha256=P6FceMP0FgakGSOt3ePxpEbsF7nnypzo1aQahjdL_94,29021
127
130
  pyegeria/automated_curation.py,sha256=wmnfpDcdg4eTtYuRHTCZQe49GxLCBiBBQsKwWVnlzak,142660
@@ -139,14 +142,14 @@ pyegeria/egeria_my_client.py,sha256=3dSBUlrivzih75hodNHe-2BM9pGB8AQVLru-_NbhYNE,
139
142
  pyegeria/egeria_tech_client.py,sha256=8Apr5YEFL2qgn-QTv9YWTI-23rGI94NiUp4418EiZ4k,4707
140
143
  pyegeria/external_references.py,sha256=7CNUlnD7MsWZqdLASYSxqfHAU1EqBzuv8_7INYMJI3A,74755
141
144
  pyegeria/feedback_manager_omvs.py,sha256=0xBs0p54vmdfVYYgQ8pOanLC4fxfgTk1Z61Y6D1U7_I,152978
142
- pyegeria/format_set_executor.py,sha256=z1KJsu4_1WyVJaY5SgXSfsTgxvSW9VMhxbpNVClRonY,6127
145
+ pyegeria/format_set_executor.py,sha256=KkOqCuZwk7UeMQUPg_x8UDVmVKYdz5vaQZ8KjZZxDMQ,11318
143
146
  pyegeria/full_omag_server_config.py,sha256=CQqLCy_3DZFvJZEOcGf50HWdFaWpiAIs6z-kKyjvpDA,47464
144
147
  pyegeria/glossary_manager.py,sha256=EmCnIPG-W0bUD7MVn2Vopb-cb_TR1J8MMOOFzo38aWk,106786
145
148
  pyegeria/governance_officer.py,sha256=OYEewhoe3HBcxTR6kGdKNkwLT4gkQDRGKfFIsVlD5oI,109203
146
149
  pyegeria/load_config.py,sha256=XDwPAHB3MvGRuoP8kg1lJJAI4BgMWZ3TYxfxYROgJj4,1188
147
150
  pyegeria/logging_configuration.py,sha256=BxTQRN-7OOdk5t1f1xSn8gKU8iT-MfWEgbn6cYWrRsY,7674
148
- pyegeria/mcp_adapter.py,sha256=90tqUmqKyG47ozFL39KJYn4-OoAvxoADAXniEe47U-w,4401
149
- pyegeria/mcp_server.py,sha256=BbGF2rMNxD99SKCin7Kdy5Zo_uvBHQRIsljHZ6wGJLs,7159
151
+ pyegeria/mcp_adapter.py,sha256=3wz-DNV4oYPeBF_6VxvNkL-ub4pwsUs49VB9L76QPwU,4970
152
+ pyegeria/mcp_server.py,sha256=UsgpV8Nq09S2nzEGTIVvJizAPUeNdARZjIuLwrTlVOE,8179
150
153
  pyegeria/md_processing_helpers.py,sha256=xlQuK5eP_PJqUdy4BScQ97NyBD95jMS3EUg0wK5CsZo,2137
151
154
  pyegeria/md_processing_utils.py,sha256=KRESCqAYjCgHRAdhHH49lLDDhaq740CUlqTG0bN-6Oo,99119
152
155
  pyegeria/md_processing_utils_orig.py,sha256=SToZtXQiysi2_vmIY4-T2NIELRirzQ1zjkho_2jFsNE,52603
@@ -166,9 +169,9 @@ pyegeria/template_manager_omvs.py,sha256=chBljs1vy5wr9DRAtbvIt4Cob_7HxGfxLkCNlDT
166
169
  pyegeria/utils.py,sha256=xOTxk9PH8ZGZmgIwz_a6rczTVLADLEjucr10ZJTUnY4,9272
167
170
  pyegeria/valid_metadata_omvs.py,sha256=Xq9DqBQvBFFJzaFIRKcVZ2k4gJvSh9yeXs_j-O3vn1w,65050
168
171
  pyegeria/x_action_author_omvs.py,sha256=XyRsUgN-xnWR-cJayzo5RtY4Xv1uBDML4pwaKHrwC1w,6430
169
- pyegeria-5.4.7.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
170
- pyegeria-5.4.7.dist-info/METADATA,sha256=CXS_liB7ALPquBJanIT9bUr_9vFxxhIiCLdH_IeDL_U,5919
171
- pyegeria-5.4.7.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
172
- pyegeria-5.4.7.dist-info/entry_points.txt,sha256=Ig9cZyl-nq_RohLvahgWXzZbcpHzLS3Zdc1A8qvdPG0,6595
173
- pyegeria-5.4.7.dist-info/top_level.txt,sha256=48Mt-O3p8yO7jiEv6-Y9bUsryqJn9BQsiyV0BqSn8tk,32
174
- pyegeria-5.4.7.dist-info/RECORD,,
172
+ pyegeria-5.4.7.2.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
173
+ pyegeria-5.4.7.2.dist-info/METADATA,sha256=Ol0BECzsUW24clN-S9oXE45fljxtLJl_pIjxZQve5ZQ,5898
174
+ pyegeria-5.4.7.2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
175
+ pyegeria-5.4.7.2.dist-info/entry_points.txt,sha256=Ig9cZyl-nq_RohLvahgWXzZbcpHzLS3Zdc1A8qvdPG0,6595
176
+ pyegeria-5.4.7.2.dist-info/top_level.txt,sha256=48Mt-O3p8yO7jiEv6-Y9bUsryqJn9BQsiyV0BqSn8tk,32
177
+ pyegeria-5.4.7.2.dist-info/RECORD,,