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.
Files changed (125) hide show
  1. {power_loop-7.3.0 → power_loop-7.3.1}/PKG-INFO +1 -1
  2. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/__init__.py +3 -2
  3. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/core/pass_turn.py +20 -1
  4. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/core/pipeline.py +2 -0
  5. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop.egg-info/PKG-INFO +1 -1
  6. {power_loop-7.3.0 → power_loop-7.3.1}/LICENSE +0 -0
  7. {power_loop-7.3.0 → power_loop-7.3.1}/README.md +0 -0
  8. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/_vendor/__init__.py +0 -0
  9. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/_vendor/llm_client/__init__.py +0 -0
  10. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/_vendor/llm_client/anthropic_factory.py +0 -0
  11. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/_vendor/llm_client/attempt_scope.py +0 -0
  12. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/_vendor/llm_client/capabilities.py +0 -0
  13. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/_vendor/llm_client/interface.py +0 -0
  14. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/_vendor/llm_client/llm_factory.py +0 -0
  15. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/_vendor/llm_client/llm_tooling.py +0 -0
  16. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/_vendor/llm_client/llm_utils.py +0 -0
  17. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/_vendor/llm_client/multimodal.py +0 -0
  18. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/_vendor/llm_client/proxy_fallback.py +0 -0
  19. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/agent/__init__.py +0 -0
  20. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/agent/follow_up.py +0 -0
  21. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/agent/sink.py +0 -0
  22. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/agent/stateful_loop.py +0 -0
  23. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/agent/system_prompt.py +0 -0
  24. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/agent/types.py +0 -0
  25. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/contracts/__init__.py +0 -0
  26. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/contracts/context_policy.py +0 -0
  27. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/contracts/errors.py +0 -0
  28. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/contracts/event_payloads.py +0 -0
  29. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/contracts/events.py +0 -0
  30. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/contracts/handlers.py +0 -0
  31. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/contracts/hook_contexts.py +0 -0
  32. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/contracts/hooks.py +0 -0
  33. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/contracts/messages.py +0 -0
  34. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/contracts/protocols.py +0 -0
  35. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/contracts/tools.py +0 -0
  36. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/contrib/__init__.py +0 -0
  37. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/contrib/_redact.py +0 -0
  38. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/contrib/jsonl_sink.py +0 -0
  39. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/contrib/logging_sink.py +0 -0
  40. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/contrib/mcp.py +0 -0
  41. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/contrib/metrics_sink.py +0 -0
  42. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/contrib/otel_sink.py +0 -0
  43. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/core/agent_context.py +0 -0
  44. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/core/events.py +0 -0
  45. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/core/hooks.py +0 -0
  46. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/core/phase.py +0 -0
  47. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/core/runner.py +0 -0
  48. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/core/state.py +0 -0
  49. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/py.typed +0 -0
  50. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/runtime/background.py +0 -0
  51. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/runtime/bash_capture.py +0 -0
  52. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/runtime/blackboard.py +0 -0
  53. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/runtime/budget.py +0 -0
  54. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/runtime/cancellation.py +0 -0
  55. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/runtime/capability_probe.py +0 -0
  56. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/runtime/compact.py +0 -0
  57. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/runtime/context_worker.py +0 -0
  58. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/runtime/env.py +0 -0
  59. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/runtime/exec_backend.py +0 -0
  60. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/runtime/fold.py +0 -0
  61. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/runtime/fold_adapter.py +0 -0
  62. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/runtime/history_projector.py +0 -0
  63. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/runtime/history_sanitize.py +0 -0
  64. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/runtime/human_input.py +0 -0
  65. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/runtime/image_recall.py +0 -0
  66. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/runtime/lineage.py +0 -0
  67. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/runtime/memory.py +0 -0
  68. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/runtime/notes.py +0 -0
  69. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/runtime/provider.py +0 -0
  70. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/runtime/representation.py +0 -0
  71. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/runtime/retry.py +0 -0
  72. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/runtime/runtime_state.py +0 -0
  73. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/runtime/session_store.py +0 -0
  74. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/runtime/skills.py +0 -0
  75. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/runtime/spec.py +0 -0
  76. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/runtime/steer.py +0 -0
  77. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/runtime/stop_policy.py +0 -0
  78. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/runtime/store/__init__.py +0 -0
  79. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/runtime/store/backends/__init__.py +0 -0
  80. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/runtime/store/backends/mysql.py +0 -0
  81. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/runtime/store/backends/postgres.py +0 -0
  82. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/runtime/store/backends/sqlite.py +0 -0
  83. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/runtime/store/capabilities.py +0 -0
  84. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/runtime/store/context_cache.py +0 -0
  85. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/runtime/store/db.py +0 -0
  86. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/runtime/store/dialect.py +0 -0
  87. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/runtime/store/factory.py +0 -0
  88. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/runtime/store/schema.py +0 -0
  89. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/runtime/store/store.py +0 -0
  90. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/runtime/store/types.py +0 -0
  91. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/runtime/structured.py +0 -0
  92. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/runtime/stub_provider.py +0 -0
  93. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/runtime/timers.py +0 -0
  94. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/runtime/todos.py +0 -0
  95. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/runtime/tool_archive.py +0 -0
  96. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/runtime/tool_context.py +0 -0
  97. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/runtime/tool_truncation.py +0 -0
  98. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/runtime/usage_estimate.py +0 -0
  99. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/tools/__init__.py +0 -0
  100. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/tools/blackboard.py +0 -0
  101. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/tools/command_policy.py +0 -0
  102. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/tools/command_rules.py +0 -0
  103. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/tools/default_manifest.py +0 -0
  104. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/tools/default_tools.py +0 -0
  105. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/tools/registry.py +0 -0
  106. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/tools/spawn_agent.py +0 -0
  107. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/workflow/__init__.py +0 -0
  108. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/workflow/admission.py +0 -0
  109. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/workflow/api.py +0 -0
  110. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/workflow/engine.py +0 -0
  111. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/workflow/introspect.py +0 -0
  112. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/workflow/journal.py +0 -0
  113. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/workflow/result.py +0 -0
  114. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/workflow/resume.py +0 -0
  115. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/workflow/runner.py +0 -0
  116. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/workflow/spec.py +0 -0
  117. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/workflow/subprocess_executor.py +0 -0
  118. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/workflow/tool.py +0 -0
  119. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop/workflow/worker.py +0 -0
  120. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop.egg-info/SOURCES.txt +0 -0
  121. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop.egg-info/dependency_links.txt +0 -0
  122. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop.egg-info/requires.txt +0 -0
  123. {power_loop-7.3.0 → power_loop-7.3.1}/power_loop.egg-info/top_level.txt +0 -0
  124. {power_loop-7.3.0 → power_loop-7.3.1}/pyproject.toml +0 -0
  125. {power_loop-7.3.0 → power_loop-7.3.1}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: power-loop
3
- Version: 7.3.0
3
+ Version: 7.3.1
4
4
  Summary: Embeddable agent execution kernel — LLM loop, hooks, events, tools, dynamic sub-agents.
5
5
  Author-email: zhangran <zhangran24@126.com>
6
6
  License: MIT
@@ -15,7 +15,7 @@ Stability tiers
15
15
  无版本承诺,可随时变更或删除。
16
16
  """
17
17
 
18
- __version__ = "7.3.0"
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:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: power-loop
3
- Version: 7.3.0
3
+ Version: 7.3.1
4
4
  Summary: Embeddable agent execution kernel — LLM loop, hooks, events, tools, dynamic sub-agents.
5
5
  Author-email: zhangran <zhangran24@126.com>
6
6
  License: MIT
File without changes
File without changes
File without changes
File without changes