power-loop 7.3.0__tar.gz → 7.3.1__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-7.3.0 → power_loop-7.3.1}/PKG-INFO +1 -1
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/__init__.py +3 -2
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/core/pass_turn.py +20 -1
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/core/pipeline.py +2 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop.egg-info/PKG-INFO +1 -1
- {power_loop-7.3.0 → power_loop-7.3.1}/LICENSE +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/README.md +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/_vendor/__init__.py +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/_vendor/llm_client/__init__.py +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/_vendor/llm_client/anthropic_factory.py +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/_vendor/llm_client/attempt_scope.py +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/_vendor/llm_client/capabilities.py +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/_vendor/llm_client/interface.py +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/_vendor/llm_client/llm_factory.py +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/_vendor/llm_client/llm_tooling.py +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/_vendor/llm_client/llm_utils.py +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/_vendor/llm_client/multimodal.py +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/_vendor/llm_client/proxy_fallback.py +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/agent/__init__.py +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/agent/follow_up.py +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/agent/sink.py +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/agent/stateful_loop.py +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/agent/system_prompt.py +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/agent/types.py +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/contracts/__init__.py +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/contracts/context_policy.py +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/contracts/errors.py +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/contracts/event_payloads.py +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/contracts/events.py +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/contracts/handlers.py +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/contracts/hook_contexts.py +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/contracts/hooks.py +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/contracts/messages.py +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/contracts/protocols.py +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/contracts/tools.py +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/contrib/__init__.py +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/contrib/_redact.py +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/contrib/jsonl_sink.py +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/contrib/logging_sink.py +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/contrib/mcp.py +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/contrib/metrics_sink.py +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/contrib/otel_sink.py +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/core/agent_context.py +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/core/events.py +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/core/hooks.py +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/core/phase.py +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/core/runner.py +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/core/state.py +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/py.typed +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/runtime/background.py +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/runtime/bash_capture.py +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/runtime/blackboard.py +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/runtime/budget.py +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/runtime/cancellation.py +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/runtime/capability_probe.py +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/runtime/compact.py +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/runtime/context_worker.py +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/runtime/env.py +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/runtime/exec_backend.py +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/runtime/fold.py +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/runtime/fold_adapter.py +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/runtime/history_projector.py +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/runtime/history_sanitize.py +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/runtime/human_input.py +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/runtime/image_recall.py +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/runtime/lineage.py +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/runtime/memory.py +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/runtime/notes.py +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/runtime/provider.py +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/runtime/representation.py +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/runtime/retry.py +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/runtime/runtime_state.py +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/runtime/session_store.py +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/runtime/skills.py +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/runtime/spec.py +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/runtime/steer.py +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/runtime/stop_policy.py +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/runtime/store/__init__.py +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/runtime/store/backends/__init__.py +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/runtime/store/backends/mysql.py +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/runtime/store/backends/postgres.py +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/runtime/store/backends/sqlite.py +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/runtime/store/capabilities.py +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/runtime/store/context_cache.py +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/runtime/store/db.py +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/runtime/store/dialect.py +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/runtime/store/factory.py +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/runtime/store/schema.py +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/runtime/store/store.py +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/runtime/store/types.py +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/runtime/structured.py +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/runtime/stub_provider.py +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/runtime/timers.py +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/runtime/todos.py +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/runtime/tool_archive.py +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/runtime/tool_context.py +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/runtime/tool_truncation.py +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/runtime/usage_estimate.py +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/tools/__init__.py +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/tools/blackboard.py +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/tools/command_policy.py +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/tools/command_rules.py +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/tools/default_manifest.py +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/tools/default_tools.py +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/tools/registry.py +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/tools/spawn_agent.py +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/workflow/__init__.py +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/workflow/admission.py +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/workflow/api.py +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/workflow/engine.py +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/workflow/introspect.py +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/workflow/journal.py +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/workflow/result.py +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/workflow/resume.py +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/workflow/runner.py +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/workflow/spec.py +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/workflow/subprocess_executor.py +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/workflow/tool.py +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/workflow/worker.py +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop.egg-info/SOURCES.txt +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop.egg-info/dependency_links.txt +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop.egg-info/requires.txt +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/power_loop.egg-info/top_level.txt +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/pyproject.toml +0 -0
- {power_loop-7.3.0 → power_loop-7.3.1}/setup.cfg +0 -0
|
@@ -15,7 +15,7 @@ Stability tiers
|
|
|
15
15
|
无版本承诺,可随时变更或删除。
|
|
16
16
|
"""
|
|
17
17
|
|
|
18
|
-
__version__ = "7.3.
|
|
18
|
+
__version__ = "7.3.1"
|
|
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).
|
|
@@ -140,7 +140,7 @@ from power_loop.contracts.tools import ToolDefinition, validate_tool_args
|
|
|
140
140
|
from power_loop.core.agent_context import get_effective_tools
|
|
141
141
|
from power_loop.core.events import AgentEventBus
|
|
142
142
|
from power_loop.core.hooks import AgentHooks
|
|
143
|
-
from power_loop.core.pass_turn import PASS_TURN_TOOL, request_pass
|
|
143
|
+
from power_loop.core.pass_turn import PASS_TURN_TOOL, pass_progress, request_pass
|
|
144
144
|
from power_loop.core.phase import PhaseContext, PhaseResult, phase
|
|
145
145
|
from power_loop.core.pipeline import AgentPipeline
|
|
146
146
|
from power_loop.core.runner import AgentRunner
|
|
@@ -306,6 +306,7 @@ STABLE_API = (
|
|
|
306
306
|
__all__ = [
|
|
307
307
|
"PASS_TURN_TOOL",
|
|
308
308
|
"request_pass",
|
|
309
|
+
"pass_progress",
|
|
309
310
|
"ToolContextPolicy",
|
|
310
311
|
"ToolContextConfig",
|
|
311
312
|
"__version__",
|
|
@@ -43,7 +43,7 @@ _state: ContextVar[dict[str, Any] | None] = ContextVar("power_loop_pass_turn", d
|
|
|
43
43
|
|
|
44
44
|
def begin() -> Token:
|
|
45
45
|
"""一个 send 开始:装一份新的状态。返回还原用的 token。"""
|
|
46
|
-
return _state.set({"passed": False, "reason": None, "new_input_after_pass": False})
|
|
46
|
+
return _state.set({"passed": False, "reason": None, "new_input_after_pass": False, "texts": 0, "work_tools": 0})
|
|
47
47
|
|
|
48
48
|
|
|
49
49
|
def end(token: Token) -> None:
|
|
@@ -64,6 +64,25 @@ def request_pass(reason: str = "") -> bool:
|
|
|
64
64
|
return True
|
|
65
65
|
|
|
66
66
|
|
|
67
|
+
def note_step(wrote_text: bool, tool_names: list[str]) -> None:
|
|
68
|
+
"""pipeline 每一轮调一次:记下这次 send 写过几段字、调过几次别的工具(pass_turn 不算)。"""
|
|
69
|
+
st = _state.get()
|
|
70
|
+
if st is None:
|
|
71
|
+
return
|
|
72
|
+
if wrote_text:
|
|
73
|
+
st["texts"] = st.get("texts", 0) + 1
|
|
74
|
+
st["work_tools"] = st.get("work_tools", 0) + sum(1 for n in tool_names if n != PASS_TURN_TOOL.name)
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
def pass_progress() -> dict[str, int] | None:
|
|
78
|
+
"""这次 send 到现在:写过几段字(texts)、调过几次别的工具(work_tools)。宿主覆盖 pass_turn 时用来判断
|
|
79
|
+
「还什么都没交就要结束」。不在 send 里返回 None。"""
|
|
80
|
+
st = _state.get()
|
|
81
|
+
if st is None:
|
|
82
|
+
return None
|
|
83
|
+
return {"texts": int(st.get("texts", 0)), "work_tools": int(st.get("work_tools", 0))}
|
|
84
|
+
|
|
85
|
+
|
|
67
86
|
def pass_requested() -> bool:
|
|
68
87
|
st = _state.get()
|
|
69
88
|
return bool(st and st.get("passed"))
|
|
@@ -1906,6 +1906,8 @@ class AgentPipeline:
|
|
|
1906
1906
|
if assistant_text:
|
|
1907
1907
|
self._step_texts.append({"step": round_idx + 1, "text": assistant_text,
|
|
1908
1908
|
"tools": [_tool_call_name(tc) for tc in (tool_calls or [])]})
|
|
1909
|
+
from power_loop.core import pass_turn as _pass_state
|
|
1910
|
+
_pass_state.note_step(bool(assistant_text), [_tool_call_name(tc) for tc in (tool_calls or [])])
|
|
1909
1911
|
|
|
1910
1912
|
# Any productive round (said something OR called a tool) clears the empty streak.
|
|
1911
1913
|
if assistant_text or tool_calls:
|
|
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
|
|
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
|