power-loop 3.6.0__tar.gz → 3.7.0__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.
- {power_loop-3.6.0 → power_loop-3.7.0}/PKG-INFO +1 -1
- {power_loop-3.6.0 → power_loop-3.7.0}/power_loop/__init__.py +1 -1
- {power_loop-3.6.0 → power_loop-3.7.0}/power_loop/runtime/history_projector.py +5 -4
- {power_loop-3.6.0 → power_loop-3.7.0}/power_loop/runtime/representation.py +6 -4
- {power_loop-3.6.0 → power_loop-3.7.0}/power_loop.egg-info/PKG-INFO +1 -1
- {power_loop-3.6.0 → power_loop-3.7.0}/LICENSE +0 -0
- {power_loop-3.6.0 → power_loop-3.7.0}/README.md +0 -0
- {power_loop-3.6.0 → power_loop-3.7.0}/power_loop/_vendor/__init__.py +0 -0
- {power_loop-3.6.0 → power_loop-3.7.0}/power_loop/_vendor/llm_client/__init__.py +0 -0
- {power_loop-3.6.0 → power_loop-3.7.0}/power_loop/_vendor/llm_client/anthropic_factory.py +0 -0
- {power_loop-3.6.0 → power_loop-3.7.0}/power_loop/_vendor/llm_client/capabilities.py +0 -0
- {power_loop-3.6.0 → power_loop-3.7.0}/power_loop/_vendor/llm_client/interface.py +0 -0
- {power_loop-3.6.0 → power_loop-3.7.0}/power_loop/_vendor/llm_client/llm_factory.py +0 -0
- {power_loop-3.6.0 → power_loop-3.7.0}/power_loop/_vendor/llm_client/llm_tooling.py +0 -0
- {power_loop-3.6.0 → power_loop-3.7.0}/power_loop/_vendor/llm_client/llm_utils.py +0 -0
- {power_loop-3.6.0 → power_loop-3.7.0}/power_loop/_vendor/llm_client/multimodal.py +0 -0
- {power_loop-3.6.0 → power_loop-3.7.0}/power_loop/agent/__init__.py +0 -0
- {power_loop-3.6.0 → power_loop-3.7.0}/power_loop/agent/follow_up.py +0 -0
- {power_loop-3.6.0 → power_loop-3.7.0}/power_loop/agent/sink.py +0 -0
- {power_loop-3.6.0 → power_loop-3.7.0}/power_loop/agent/stateful_loop.py +0 -0
- {power_loop-3.6.0 → power_loop-3.7.0}/power_loop/agent/system_prompt.py +0 -0
- {power_loop-3.6.0 → power_loop-3.7.0}/power_loop/agent/types.py +0 -0
- {power_loop-3.6.0 → power_loop-3.7.0}/power_loop/contracts/__init__.py +0 -0
- {power_loop-3.6.0 → power_loop-3.7.0}/power_loop/contracts/errors.py +0 -0
- {power_loop-3.6.0 → power_loop-3.7.0}/power_loop/contracts/event_payloads.py +0 -0
- {power_loop-3.6.0 → power_loop-3.7.0}/power_loop/contracts/events.py +0 -0
- {power_loop-3.6.0 → power_loop-3.7.0}/power_loop/contracts/handlers.py +0 -0
- {power_loop-3.6.0 → power_loop-3.7.0}/power_loop/contracts/hook_contexts.py +0 -0
- {power_loop-3.6.0 → power_loop-3.7.0}/power_loop/contracts/hooks.py +0 -0
- {power_loop-3.6.0 → power_loop-3.7.0}/power_loop/contracts/messages.py +0 -0
- {power_loop-3.6.0 → power_loop-3.7.0}/power_loop/contracts/protocols.py +0 -0
- {power_loop-3.6.0 → power_loop-3.7.0}/power_loop/contracts/tools.py +0 -0
- {power_loop-3.6.0 → power_loop-3.7.0}/power_loop/contrib/__init__.py +0 -0
- {power_loop-3.6.0 → power_loop-3.7.0}/power_loop/contrib/_redact.py +0 -0
- {power_loop-3.6.0 → power_loop-3.7.0}/power_loop/contrib/jsonl_sink.py +0 -0
- {power_loop-3.6.0 → power_loop-3.7.0}/power_loop/contrib/logging_sink.py +0 -0
- {power_loop-3.6.0 → power_loop-3.7.0}/power_loop/contrib/mcp.py +0 -0
- {power_loop-3.6.0 → power_loop-3.7.0}/power_loop/contrib/metrics_sink.py +0 -0
- {power_loop-3.6.0 → power_loop-3.7.0}/power_loop/contrib/otel_sink.py +0 -0
- {power_loop-3.6.0 → power_loop-3.7.0}/power_loop/core/agent_context.py +0 -0
- {power_loop-3.6.0 → power_loop-3.7.0}/power_loop/core/events.py +0 -0
- {power_loop-3.6.0 → power_loop-3.7.0}/power_loop/core/hooks.py +0 -0
- {power_loop-3.6.0 → power_loop-3.7.0}/power_loop/core/phase.py +0 -0
- {power_loop-3.6.0 → power_loop-3.7.0}/power_loop/core/pipeline.py +0 -0
- {power_loop-3.6.0 → power_loop-3.7.0}/power_loop/core/runner.py +0 -0
- {power_loop-3.6.0 → power_loop-3.7.0}/power_loop/core/state.py +0 -0
- {power_loop-3.6.0 → power_loop-3.7.0}/power_loop/py.typed +0 -0
- {power_loop-3.6.0 → power_loop-3.7.0}/power_loop/runtime/blackboard.py +0 -0
- {power_loop-3.6.0 → power_loop-3.7.0}/power_loop/runtime/budget.py +0 -0
- {power_loop-3.6.0 → power_loop-3.7.0}/power_loop/runtime/cancellation.py +0 -0
- {power_loop-3.6.0 → power_loop-3.7.0}/power_loop/runtime/compact.py +0 -0
- {power_loop-3.6.0 → power_loop-3.7.0}/power_loop/runtime/env.py +0 -0
- {power_loop-3.6.0 → power_loop-3.7.0}/power_loop/runtime/exec_backend.py +0 -0
- {power_loop-3.6.0 → power_loop-3.7.0}/power_loop/runtime/fold.py +0 -0
- {power_loop-3.6.0 → power_loop-3.7.0}/power_loop/runtime/fold_adapter.py +0 -0
- {power_loop-3.6.0 → power_loop-3.7.0}/power_loop/runtime/history_sanitize.py +0 -0
- {power_loop-3.6.0 → power_loop-3.7.0}/power_loop/runtime/human_input.py +0 -0
- {power_loop-3.6.0 → power_loop-3.7.0}/power_loop/runtime/memory.py +0 -0
- {power_loop-3.6.0 → power_loop-3.7.0}/power_loop/runtime/notes.py +0 -0
- {power_loop-3.6.0 → power_loop-3.7.0}/power_loop/runtime/provider.py +0 -0
- {power_loop-3.6.0 → power_loop-3.7.0}/power_loop/runtime/retry.py +0 -0
- {power_loop-3.6.0 → power_loop-3.7.0}/power_loop/runtime/runtime_state.py +0 -0
- {power_loop-3.6.0 → power_loop-3.7.0}/power_loop/runtime/session_store.py +0 -0
- {power_loop-3.6.0 → power_loop-3.7.0}/power_loop/runtime/skills.py +0 -0
- {power_loop-3.6.0 → power_loop-3.7.0}/power_loop/runtime/spec.py +0 -0
- {power_loop-3.6.0 → power_loop-3.7.0}/power_loop/runtime/store/__init__.py +0 -0
- {power_loop-3.6.0 → power_loop-3.7.0}/power_loop/runtime/store/backends/__init__.py +0 -0
- {power_loop-3.6.0 → power_loop-3.7.0}/power_loop/runtime/store/backends/mysql.py +0 -0
- {power_loop-3.6.0 → power_loop-3.7.0}/power_loop/runtime/store/backends/postgres.py +0 -0
- {power_loop-3.6.0 → power_loop-3.7.0}/power_loop/runtime/store/backends/sqlite.py +0 -0
- {power_loop-3.6.0 → power_loop-3.7.0}/power_loop/runtime/store/capabilities.py +0 -0
- {power_loop-3.6.0 → power_loop-3.7.0}/power_loop/runtime/store/db.py +0 -0
- {power_loop-3.6.0 → power_loop-3.7.0}/power_loop/runtime/store/dialect.py +0 -0
- {power_loop-3.6.0 → power_loop-3.7.0}/power_loop/runtime/store/factory.py +0 -0
- {power_loop-3.6.0 → power_loop-3.7.0}/power_loop/runtime/store/schema.py +0 -0
- {power_loop-3.6.0 → power_loop-3.7.0}/power_loop/runtime/store/store.py +0 -0
- {power_loop-3.6.0 → power_loop-3.7.0}/power_loop/runtime/store/types.py +0 -0
- {power_loop-3.6.0 → power_loop-3.7.0}/power_loop/runtime/structured.py +0 -0
- {power_loop-3.6.0 → power_loop-3.7.0}/power_loop/runtime/stub_provider.py +0 -0
- {power_loop-3.6.0 → power_loop-3.7.0}/power_loop/runtime/timers.py +0 -0
- {power_loop-3.6.0 → power_loop-3.7.0}/power_loop/tools/__init__.py +0 -0
- {power_loop-3.6.0 → power_loop-3.7.0}/power_loop/tools/blackboard.py +0 -0
- {power_loop-3.6.0 → power_loop-3.7.0}/power_loop/tools/default_manifest.py +0 -0
- {power_loop-3.6.0 → power_loop-3.7.0}/power_loop/tools/default_tools.py +0 -0
- {power_loop-3.6.0 → power_loop-3.7.0}/power_loop/tools/registry.py +0 -0
- {power_loop-3.6.0 → power_loop-3.7.0}/power_loop/tools/spawn_agent.py +0 -0
- {power_loop-3.6.0 → power_loop-3.7.0}/power_loop/workflow/__init__.py +0 -0
- {power_loop-3.6.0 → power_loop-3.7.0}/power_loop/workflow/api.py +0 -0
- {power_loop-3.6.0 → power_loop-3.7.0}/power_loop/workflow/engine.py +0 -0
- {power_loop-3.6.0 → power_loop-3.7.0}/power_loop/workflow/introspect.py +0 -0
- {power_loop-3.6.0 → power_loop-3.7.0}/power_loop/workflow/journal.py +0 -0
- {power_loop-3.6.0 → power_loop-3.7.0}/power_loop/workflow/result.py +0 -0
- {power_loop-3.6.0 → power_loop-3.7.0}/power_loop/workflow/resume.py +0 -0
- {power_loop-3.6.0 → power_loop-3.7.0}/power_loop/workflow/runner.py +0 -0
- {power_loop-3.6.0 → power_loop-3.7.0}/power_loop/workflow/spec.py +0 -0
- {power_loop-3.6.0 → power_loop-3.7.0}/power_loop/workflow/subprocess_executor.py +0 -0
- {power_loop-3.6.0 → power_loop-3.7.0}/power_loop/workflow/tool.py +0 -0
- {power_loop-3.6.0 → power_loop-3.7.0}/power_loop/workflow/worker.py +0 -0
- {power_loop-3.6.0 → power_loop-3.7.0}/power_loop.egg-info/SOURCES.txt +0 -0
- {power_loop-3.6.0 → power_loop-3.7.0}/power_loop.egg-info/dependency_links.txt +0 -0
- {power_loop-3.6.0 → power_loop-3.7.0}/power_loop.egg-info/requires.txt +0 -0
- {power_loop-3.6.0 → power_loop-3.7.0}/power_loop.egg-info/top_level.txt +0 -0
- {power_loop-3.6.0 → power_loop-3.7.0}/pyproject.toml +0 -0
- {power_loop-3.6.0 → power_loop-3.7.0}/setup.cfg +0 -0
|
@@ -15,7 +15,7 @@ Stability tiers
|
|
|
15
15
|
无版本承诺,可随时变更或删除。
|
|
16
16
|
"""
|
|
17
17
|
|
|
18
|
-
__version__ = "3.
|
|
18
|
+
__version__ = "3.7.0"
|
|
19
19
|
|
|
20
20
|
# Public LLM contract (SDK-free) re-exported so callers (e.g. writing llm.* hooks or
|
|
21
21
|
# a custom LLMService) don't reach into the internal vendored transport package (H3.4).
|
|
@@ -117,7 +117,9 @@ class HistoryProjector(Protocol):
|
|
|
117
117
|
|
|
118
118
|
def _truncate(s: Any, max_chars: int) -> str:
|
|
119
119
|
t = "" if s is None else str(s)
|
|
120
|
-
|
|
120
|
+
if max_chars <= 0 or len(t) <= max_chars: # max_chars <= 0 → no truncation (unlimited)
|
|
121
|
+
return t
|
|
122
|
+
return t[:max_chars] + "…"
|
|
121
123
|
|
|
122
124
|
|
|
123
125
|
def _parse_args(raw: Any) -> Any:
|
|
@@ -225,7 +227,7 @@ class DefaultDeterministicProjector:
|
|
|
225
227
|
terse plain text with NO tool-protocol structure."""
|
|
226
228
|
|
|
227
229
|
version: int = 1
|
|
228
|
-
max_chars: int = 300 # per-field truncation budget
|
|
230
|
+
max_chars: int = 300 # per-field truncation budget; <= 0 = no truncation (unlimited)
|
|
229
231
|
keep_last_sends: int = 4 # most-recent sends ALWAYS kept individually (never folded)
|
|
230
232
|
#: Fold older sends into a compact row once the rendered projected prefix reaches
|
|
231
233
|
#: ``loop max_tokens × trigger_ratio`` (mirrors DefaultCompactor's policy) — token-driven,
|
|
@@ -244,8 +246,7 @@ class DefaultDeterministicProjector:
|
|
|
244
246
|
keep_last_sends=self.keep_last_sends,
|
|
245
247
|
trigger_ratio=self.trigger_ratio,
|
|
246
248
|
)
|
|
247
|
-
|
|
248
|
-
raise ValueError(f"max_chars must be > 0; got {self.max_chars!r}")
|
|
249
|
+
# max_chars <= 0 → no truncation (unlimited); any int is accepted.
|
|
249
250
|
if self.max_compact_chars < 0:
|
|
250
251
|
raise ValueError(
|
|
251
252
|
f"max_compact_chars must be >= 0 (0 = unbounded); got {self.max_compact_chars!r}"
|
|
@@ -93,7 +93,9 @@ class Representation(Protocol):
|
|
|
93
93
|
|
|
94
94
|
def _truncate(s: Any, max_chars: int) -> str:
|
|
95
95
|
t = "" if s is None else str(s)
|
|
96
|
-
|
|
96
|
+
if max_chars <= 0 or len(t) <= max_chars: # max_chars <= 0 → no truncation (unlimited)
|
|
97
|
+
return t
|
|
98
|
+
return t[:max_chars] + "…"
|
|
97
99
|
|
|
98
100
|
|
|
99
101
|
def _parse_args(raw: Any) -> Any:
|
|
@@ -143,8 +145,8 @@ def _validate_representation_params(*, version: int, max_chars: int | None = Non
|
|
|
143
145
|
raise ValueError(
|
|
144
146
|
f"representation version must be >= 1 (the compatibility key); got {version!r}"
|
|
145
147
|
)
|
|
146
|
-
|
|
147
|
-
|
|
148
|
+
# max_chars <= 0 is now VALID and means "no truncation" (unlimited) — let a host disable the
|
|
149
|
+
# library's per-field cap and do its own limiting. Any int is accepted.
|
|
148
150
|
|
|
149
151
|
|
|
150
152
|
def _render_compact_row(row: ProjectMessageRow) -> LoopMessage:
|
|
@@ -249,7 +251,7 @@ class ProjectedRepresentation:
|
|
|
249
251
|
|
|
250
252
|
kind: str = "projection"
|
|
251
253
|
version: int = 1
|
|
252
|
-
max_chars: int = 300 # per-field truncation budget
|
|
254
|
+
max_chars: int = 300 # per-field truncation budget; <= 0 = no truncation (unlimited)
|
|
253
255
|
#: Format knobs for render() — see :class:`ProjectionRenderConfig`. A plain dict is coerced (so a
|
|
254
256
|
#: host can pass JSON config straight through). Subclasses can ALSO override the render_* methods.
|
|
255
257
|
render_config: ProjectionRenderConfig = field(default_factory=ProjectionRenderConfig)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|