plm-engine-core 1.0.2__tar.gz → 1.0.4__tar.gz

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.
Files changed (113) hide show
  1. {plm_engine_core-1.0.2 → plm_engine_core-1.0.4}/PKG-INFO +1 -1
  2. {plm_engine_core-1.0.2 → plm_engine_core-1.0.4}/plm_engine_core/core_host/main.py +42 -12
  3. plm_engine_core-1.0.4/plm_engine_core/llm_catalog/model_list.yaml +57 -0
  4. {plm_engine_core-1.0.2 → plm_engine_core-1.0.4}/plm_engine_core/runtime/llm_service.py +682 -682
  5. {plm_engine_core-1.0.2 → plm_engine_core-1.0.4}/plm_engine_core.egg-info/PKG-INFO +1 -1
  6. {plm_engine_core-1.0.2 → plm_engine_core-1.0.4}/plm_engine_core.egg-info/SOURCES.txt +1 -0
  7. {plm_engine_core-1.0.2 → plm_engine_core-1.0.4}/pyproject.toml +13 -1
  8. {plm_engine_core-1.0.2 → plm_engine_core-1.0.4}/tests/test_core_host_wave9_parity_smoke.py +260 -263
  9. {plm_engine_core-1.0.2 → plm_engine_core-1.0.4}/README.md +0 -0
  10. {plm_engine_core-1.0.2 → plm_engine_core-1.0.4}/plm_engine_core/__init__.py +0 -0
  11. {plm_engine_core-1.0.2 → plm_engine_core-1.0.4}/plm_engine_core/agent_runtime/__init__.py +0 -0
  12. {plm_engine_core-1.0.2 → plm_engine_core-1.0.4}/plm_engine_core/agent_runtime/dispatcher.py +0 -0
  13. {plm_engine_core-1.0.2 → plm_engine_core-1.0.4}/plm_engine_core/agent_runtime/selector.py +0 -0
  14. {plm_engine_core-1.0.2 → plm_engine_core-1.0.4}/plm_engine_core/cli/__init__.py +0 -0
  15. {plm_engine_core-1.0.2 → plm_engine_core-1.0.4}/plm_engine_core/cli/__main__.py +0 -0
  16. {plm_engine_core-1.0.2 → plm_engine_core-1.0.4}/plm_engine_core/cli/auth.py +0 -0
  17. {plm_engine_core-1.0.2 → plm_engine_core-1.0.4}/plm_engine_core/control_plane/__init__.py +0 -0
  18. {plm_engine_core-1.0.2 → plm_engine_core-1.0.4}/plm_engine_core/control_plane/_lint_fixtures/__init__.py +0 -0
  19. {plm_engine_core-1.0.2 → plm_engine_core-1.0.4}/plm_engine_core/control_plane/_lint_fixtures/violation_demo.py +0 -0
  20. {plm_engine_core-1.0.2 → plm_engine_core-1.0.4}/plm_engine_core/control_plane/capability_registry/__init__.py +0 -0
  21. {plm_engine_core-1.0.2 → plm_engine_core-1.0.4}/plm_engine_core/control_plane/capability_registry/errors.py +0 -0
  22. {plm_engine_core-1.0.2 → plm_engine_core-1.0.4}/plm_engine_core/control_plane/capability_registry/registry.py +0 -0
  23. {plm_engine_core-1.0.2 → plm_engine_core-1.0.4}/plm_engine_core/control_plane/connectors/__init__.py +0 -0
  24. {plm_engine_core-1.0.2 → plm_engine_core-1.0.4}/plm_engine_core/control_plane/connectors/dispatcher.py +0 -0
  25. {plm_engine_core-1.0.2 → plm_engine_core-1.0.4}/plm_engine_core/control_plane/connectors/runtime.py +0 -0
  26. {plm_engine_core-1.0.2 → plm_engine_core-1.0.4}/plm_engine_core/control_plane/dispatch.py +0 -0
  27. {plm_engine_core-1.0.2 → plm_engine_core-1.0.4}/plm_engine_core/control_plane/hitl/__init__.py +0 -0
  28. {plm_engine_core-1.0.2 → plm_engine_core-1.0.4}/plm_engine_core/control_plane/hitl/errors.py +0 -0
  29. {plm_engine_core-1.0.2 → plm_engine_core-1.0.4}/plm_engine_core/control_plane/hitl/gate.py +0 -0
  30. {plm_engine_core-1.0.2 → plm_engine_core-1.0.4}/plm_engine_core/control_plane/hitl/sql_store.py +0 -0
  31. {plm_engine_core-1.0.2 → plm_engine_core-1.0.4}/plm_engine_core/control_plane/identity/__init__.py +0 -0
  32. {plm_engine_core-1.0.2 → plm_engine_core-1.0.4}/plm_engine_core/control_plane/identity/middleware.py +0 -0
  33. {plm_engine_core-1.0.2 → plm_engine_core-1.0.4}/plm_engine_core/control_plane/identity/provider.py +0 -0
  34. {plm_engine_core-1.0.2 → plm_engine_core-1.0.4}/plm_engine_core/control_plane/identity/system_identity.py +0 -0
  35. {plm_engine_core-1.0.2 → plm_engine_core-1.0.4}/plm_engine_core/control_plane/identity/telemetry.py +0 -0
  36. {plm_engine_core-1.0.2 → plm_engine_core-1.0.4}/plm_engine_core/control_plane/knowledge/__init__.py +0 -0
  37. {plm_engine_core-1.0.2 → plm_engine_core-1.0.4}/plm_engine_core/control_plane/knowledge/curation_index.py +0 -0
  38. {plm_engine_core-1.0.2 → plm_engine_core-1.0.4}/plm_engine_core/control_plane/knowledge/envelope.py +0 -0
  39. {plm_engine_core-1.0.2 → plm_engine_core-1.0.4}/plm_engine_core/control_plane/knowledge/runtime.py +0 -0
  40. {plm_engine_core-1.0.2 → plm_engine_core-1.0.4}/plm_engine_core/control_plane/policies/__init__.py +0 -0
  41. {plm_engine_core-1.0.2 → plm_engine_core-1.0.4}/plm_engine_core/control_plane/policies/authorization.py +0 -0
  42. {plm_engine_core-1.0.2 → plm_engine_core-1.0.4}/plm_engine_core/control_plane/policies/autonomy_gating.py +0 -0
  43. {plm_engine_core-1.0.2 → plm_engine_core-1.0.4}/plm_engine_core/control_plane/policies/base.py +0 -0
  44. {plm_engine_core-1.0.2 → plm_engine_core-1.0.4}/plm_engine_core/control_plane/policies/cost_budget.py +0 -0
  45. {plm_engine_core-1.0.2 → plm_engine_core-1.0.4}/plm_engine_core/control_plane/policies/rate_limit.py +0 -0
  46. {plm_engine_core-1.0.2 → plm_engine_core-1.0.4}/plm_engine_core/control_plane/retry_policy.py +0 -0
  47. {plm_engine_core-1.0.2 → plm_engine_core-1.0.4}/plm_engine_core/control_plane/run_task_tracker.py +0 -0
  48. {plm_engine_core-1.0.2 → plm_engine_core-1.0.4}/plm_engine_core/core_host/__init__.py +0 -0
  49. {plm_engine_core-1.0.2 → plm_engine_core-1.0.4}/plm_engine_core/core_host/__main__.py +0 -0
  50. {plm_engine_core-1.0.2 → plm_engine_core-1.0.4}/plm_engine_core/core_host/routers/__init__.py +0 -0
  51. {plm_engine_core-1.0.2 → plm_engine_core-1.0.4}/plm_engine_core/core_host/routers/config.py +0 -0
  52. {plm_engine_core-1.0.2 → plm_engine_core-1.0.4}/plm_engine_core/core_host/routers/health.py +0 -0
  53. {plm_engine_core-1.0.2 → plm_engine_core-1.0.4}/plm_engine_core/core_host/settings.py +0 -0
  54. {plm_engine_core-1.0.2 → plm_engine_core-1.0.4}/plm_engine_core/llm_catalog/__init__.py +0 -0
  55. {plm_engine_core-1.0.2 → plm_engine_core-1.0.4}/plm_engine_core/llm_catalog/loader.py +0 -0
  56. {plm_engine_core-1.0.2 → plm_engine_core-1.0.4}/plm_engine_core/mcp/__init__.py +0 -0
  57. {plm_engine_core-1.0.2 → plm_engine_core-1.0.4}/plm_engine_core/mcp/asgi.py +0 -0
  58. {plm_engine_core-1.0.2 → plm_engine_core-1.0.4}/plm_engine_core/mcp/errors.py +0 -0
  59. {plm_engine_core-1.0.2 → plm_engine_core-1.0.4}/plm_engine_core/mcp/manifest.py +0 -0
  60. {plm_engine_core-1.0.2 → plm_engine_core-1.0.4}/plm_engine_core/mcp/openapi.py +0 -0
  61. {plm_engine_core-1.0.2 → plm_engine_core-1.0.4}/plm_engine_core/mcp/server.py +0 -0
  62. {plm_engine_core-1.0.2 → plm_engine_core-1.0.4}/plm_engine_core/mcp/tools.py +0 -0
  63. {plm_engine_core-1.0.2 → plm_engine_core-1.0.4}/plm_engine_core/runtime/__init__.py +0 -0
  64. {plm_engine_core-1.0.2 → plm_engine_core-1.0.4}/plm_engine_core/runtime/agent_telemetry_service.py +0 -0
  65. {plm_engine_core-1.0.2 → plm_engine_core-1.0.4}/plm_engine_core/runtime/database.py +0 -0
  66. {plm_engine_core-1.0.2 → plm_engine_core-1.0.4}/plm_engine_core/runtime/database_service.py +0 -0
  67. {plm_engine_core-1.0.2 → plm_engine_core-1.0.4}/plm_engine_core/runtime/default_bindings.py +0 -0
  68. {plm_engine_core-1.0.2 → plm_engine_core-1.0.4}/plm_engine_core/runtime/invocation_context.py +0 -0
  69. {plm_engine_core-1.0.2 → plm_engine_core-1.0.4}/plm_engine_core/runtime/invocation_lifecycle.py +0 -0
  70. {plm_engine_core-1.0.2 → plm_engine_core-1.0.4}/plm_engine_core/runtime/invocation_telemetry.py +0 -0
  71. {plm_engine_core-1.0.2 → plm_engine_core-1.0.4}/plm_engine_core/runtime/llm_env.py +0 -0
  72. {plm_engine_core-1.0.2 → plm_engine_core-1.0.4}/plm_engine_core/runtime/plan_analysis_service.py +0 -0
  73. {plm_engine_core-1.0.2 → plm_engine_core-1.0.4}/plm_engine_core/runtime/pricing_service.py +0 -0
  74. {plm_engine_core-1.0.2 → plm_engine_core-1.0.4}/plm_engine_core/runtime/retry_orchestrator.py +0 -0
  75. {plm_engine_core-1.0.2 → plm_engine_core-1.0.4}/plm_engine_core/runtime/retry_policy.py +0 -0
  76. {plm_engine_core-1.0.2 → plm_engine_core-1.0.4}/plm_engine_core/runtime/run_task_tracker.py +0 -0
  77. {plm_engine_core-1.0.2 → plm_engine_core-1.0.4}/plm_engine_core/runtime/scoped_state.py +0 -0
  78. {plm_engine_core-1.0.2 → plm_engine_core-1.0.4}/plm_engine_core/runtime/token_estimator.py +0 -0
  79. {plm_engine_core-1.0.2 → plm_engine_core-1.0.4}/plm_engine_core/runtime/workspace_port.py +0 -0
  80. {plm_engine_core-1.0.2 → plm_engine_core-1.0.4}/plm_engine_core/studio/__init__.py +0 -0
  81. {plm_engine_core-1.0.2 → plm_engine_core-1.0.4}/plm_engine_core/studio/readers/__init__.py +0 -0
  82. {plm_engine_core-1.0.2 → plm_engine_core-1.0.4}/plm_engine_core/studio/readers/mcrc_v1.py +0 -0
  83. {plm_engine_core-1.0.2 → plm_engine_core-1.0.4}/plm_engine_core.egg-info/dependency_links.txt +0 -0
  84. {plm_engine_core-1.0.2 → plm_engine_core-1.0.4}/plm_engine_core.egg-info/entry_points.txt +0 -0
  85. {plm_engine_core-1.0.2 → plm_engine_core-1.0.4}/plm_engine_core.egg-info/requires.txt +0 -0
  86. {plm_engine_core-1.0.2 → plm_engine_core-1.0.4}/plm_engine_core.egg-info/top_level.txt +0 -0
  87. {plm_engine_core-1.0.2 → plm_engine_core-1.0.4}/setup.cfg +0 -0
  88. {plm_engine_core-1.0.2 → plm_engine_core-1.0.4}/tests/test_authorization_policy.py +0 -0
  89. {plm_engine_core-1.0.2 → plm_engine_core-1.0.4}/tests/test_autonomy_gating_policy.py +0 -0
  90. {plm_engine_core-1.0.2 → plm_engine_core-1.0.4}/tests/test_capability_registry.py +0 -0
  91. {plm_engine_core-1.0.2 → plm_engine_core-1.0.4}/tests/test_cli_auth.py +0 -0
  92. {plm_engine_core-1.0.2 → plm_engine_core-1.0.4}/tests/test_connector_dispatcher.py +0 -0
  93. {plm_engine_core-1.0.2 → plm_engine_core-1.0.4}/tests/test_core_host_build_app.py +0 -0
  94. {plm_engine_core-1.0.2 → plm_engine_core-1.0.4}/tests/test_cost_budget_policy.py +0 -0
  95. {plm_engine_core-1.0.2 → plm_engine_core-1.0.4}/tests/test_error_code_mirror.py +0 -0
  96. {plm_engine_core-1.0.2 → plm_engine_core-1.0.4}/tests/test_hitl_gate.py +0 -0
  97. {plm_engine_core-1.0.2 → plm_engine_core-1.0.4}/tests/test_identity_middleware.py +0 -0
  98. {plm_engine_core-1.0.2 → plm_engine_core-1.0.4}/tests/test_identity_provider.py +0 -0
  99. {plm_engine_core-1.0.2 → plm_engine_core-1.0.4}/tests/test_import_linter.py +0 -0
  100. {plm_engine_core-1.0.2 → plm_engine_core-1.0.4}/tests/test_imports.py +0 -0
  101. {plm_engine_core-1.0.2 → plm_engine_core-1.0.4}/tests/test_knowledge_curation_index.py +0 -0
  102. {plm_engine_core-1.0.2 → plm_engine_core-1.0.4}/tests/test_knowledge_envelope.py +0 -0
  103. {plm_engine_core-1.0.2 → plm_engine_core-1.0.4}/tests/test_knowledge_runtime_adapter.py +0 -0
  104. {plm_engine_core-1.0.2 → plm_engine_core-1.0.4}/tests/test_mcp_asgi.py +0 -0
  105. {plm_engine_core-1.0.2 → plm_engine_core-1.0.4}/tests/test_mcp_server.py +0 -0
  106. {plm_engine_core-1.0.2 → plm_engine_core-1.0.4}/tests/test_mcrc_v1_reader.py +0 -0
  107. {plm_engine_core-1.0.2 → plm_engine_core-1.0.4}/tests/test_openapi.py +0 -0
  108. {plm_engine_core-1.0.2 → plm_engine_core-1.0.4}/tests/test_policy_pipeline_order.py +0 -0
  109. {plm_engine_core-1.0.2 → plm_engine_core-1.0.4}/tests/test_rate_limit_policy.py +0 -0
  110. {plm_engine_core-1.0.2 → plm_engine_core-1.0.4}/tests/test_retry_policy.py +0 -0
  111. {plm_engine_core-1.0.2 → plm_engine_core-1.0.4}/tests/test_run_task_tracker.py +0 -0
  112. {plm_engine_core-1.0.2 → plm_engine_core-1.0.4}/tests/test_skill_selector.py +0 -0
  113. {plm_engine_core-1.0.2 → plm_engine_core-1.0.4}/tests/test_system_identity.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: plm-engine-core
3
- Version: 1.0.2
3
+ Version: 1.0.4
4
4
  Summary: TracePulse PLM Engine Core — control_plane (governance, autonomy, HITL, run lifecycle, trace propagation) + agent_runtime (selector, dispatcher, retry, escalation). US-CR.1 scaffold; behaviour lands in US-CR.0+. Internal one-way import contract: control_plane MUST NOT import from agent_runtime (mechanical enforcement in US-CR.2).
5
5
  Author: TracePulse
6
6
  License: Proprietary
@@ -59,6 +59,7 @@ from __future__ import annotations
59
59
  import argparse
60
60
  import logging
61
61
  import os
62
+ from pathlib import Path
62
63
  from typing import List, Optional
63
64
 
64
65
  from fastapi import FastAPI
@@ -170,17 +171,6 @@ def _maybe_load_knowledge(host_settings: EngineHostSettings) -> None:
170
171
  # wire_default_bindings).
171
172
  from plm_shared.protocols.services.settings import settings
172
173
 
173
- corpus_path = (
174
- host_settings.engine_host_dictionnaries_path
175
- or getattr(settings, "dictionnaries_path", "")
176
- )
177
- if not corpus_path:
178
- raise RuntimeError(
179
- "engine_host_knowledge: settings.dictionnaries_path is empty; "
180
- "set ENGINE_HOST_DICTIONNARIES_PATH or configure dictionnaries_path "
181
- "on the registered Settings instance."
182
- )
183
-
184
174
  try:
185
175
  from plm_knowledge.knowledge_pack_loader import KnowledgePackLoader
186
176
  from plm_knowledge.knowledge_search_engine import (
@@ -192,7 +182,47 @@ def _maybe_load_knowledge(host_settings: EngineHostSettings) -> None:
192
182
  f"engine_host_knowledge: import failure — {exc!r}"
193
183
  ) from exc
194
184
 
195
- loader = KnowledgePackLoader(corpus_path)
185
+ # Wave 11+ — corpus resolution chain:
186
+ # 1. host_settings.engine_host_dictionnaries_path (env
187
+ # ENGINE_HOST_DICTIONNARIES_PATH) — explicit override
188
+ # 2. settings.dictionnaries_path from DI — usually populated
189
+ # via DICTIONNARIES_PATH env var; legacy default
190
+ # "../../01_Dictionnaries" is broken from any modern CWD and
191
+ # treated as "no preference" below
192
+ # 3. plm-knowledge v1.1.0+ bundled corpus (KnowledgePackLoader
193
+ # no-arg default resolves to <site-packages>/plm_knowledge/
194
+ # dictionnaries/) — the only path with a guarantee of
195
+ # existence on a fresh install
196
+ explicit_path = (
197
+ host_settings.engine_host_dictionnaries_path
198
+ or getattr(settings, "dictionnaries_path", "")
199
+ )
200
+ # The legacy ``../../01_Dictionnaries`` default carried by the
201
+ # pydantic-settings Settings class points at a monorepo layout
202
+ # that no longer exists; treat it as unset.
203
+ if explicit_path in ("", "../../01_Dictionnaries", "../01_Dictionnaries"):
204
+ explicit_path = ""
205
+ # Verify the resolved path exists; if not, fall through to bundled.
206
+ if explicit_path and not Path(explicit_path).exists():
207
+ logger.warning(
208
+ "engine_host_knowledge: configured path %s does not exist; "
209
+ "falling back to plm-knowledge bundled corpus",
210
+ explicit_path,
211
+ )
212
+ explicit_path = ""
213
+
214
+ if explicit_path:
215
+ loader = KnowledgePackLoader(explicit_path)
216
+ corpus_path = explicit_path
217
+ else:
218
+ # v1.1.0+ bundled corpus (no-arg default in KnowledgePackLoader)
219
+ loader = KnowledgePackLoader()
220
+ corpus_path = str(loader.root)
221
+ logger.info(
222
+ "engine_host_knowledge: using plm-knowledge bundled corpus at %s",
223
+ corpus_path,
224
+ )
225
+
196
226
  loader.load()
197
227
  engine = KnowledgeSearchEngine(loader)
198
228
  set_engine(engine)
@@ -0,0 +1,57 @@
1
+ # US-471.15: Single source of truth for the LLM model catalog.
2
+ #
3
+ # Adding, removing, or reconfiguring a model is a one-file pull request — no
4
+ # Python change required. The backend dispatcher, the model picker, and the
5
+ # pricing layer all read from here.
6
+ #
7
+ # Schema:
8
+ # id LiteLLM-prefixed identifier; supports `${ENV_VAR}` tokens.
9
+ # provider One of: azure-openai | gemini | openai
10
+ # api_key_env Documentation-only: which env var gates availability.
11
+ # display_label Human-readable label shown in the picker.
12
+ # description Optional caption shown beneath the label.
13
+ # aliases Optional alternate ids (used to resolve legacy values).
14
+ # is_default At most one per provider should be marked as default.
15
+ # notes Optional free text surfaced in admin tooling.
16
+ # cost_per_input_token / cost_per_output_token Optional overrides used by
17
+ # services/pricing_service.py when LiteLLM has no price; consumed by
18
+ # Slice S8 (US-471.8).
19
+
20
+ version: 1
21
+
22
+ models:
23
+ # ----- Azure OpenAI -----
24
+ - id: azure/${AZURE_OPENAI_DEPLOYMENT}
25
+ provider: azure-openai
26
+ api_key_env: AZURE_OPENAI_API_KEY
27
+ display_label: Azure OpenAI (default deployment)
28
+ description: Primary Azure OpenAI deployment driven by AZURE_OPENAI_DEPLOYMENT
29
+ is_default: true
30
+ aliases:
31
+ - gpt-4 # legacy Agent.model_id
32
+
33
+ - id: azure/gpt-4o-mini
34
+ provider: azure-openai
35
+ api_key_env: AZURE_OPENAI_API_KEY
36
+ display_label: GPT-4o Mini (Azure)
37
+ description: Fast and cost-effective
38
+
39
+ # ----- Gemini -----
40
+ - id: gemini/gemini-1.5-flash
41
+ provider: gemini
42
+ api_key_env: GEMINI_API_KEY
43
+ display_label: Gemini 1.5 Flash
44
+ description: Fast Gemini model
45
+
46
+ - id: gemini/gemini-1.5-pro
47
+ provider: gemini
48
+ api_key_env: GEMINI_API_KEY
49
+ display_label: Gemini 1.5 Pro
50
+ description: Most capable Gemini model
51
+
52
+ # ----- OpenAI -----
53
+ - id: openai/gpt-4o
54
+ provider: openai
55
+ api_key_env: OPENAI_API_KEY
56
+ display_label: GPT-4o (OpenAI)
57
+ description: Most capable OpenAI model