power-loop 6.46.1__tar.gz → 6.46.2__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. {power_loop-6.46.1 → power_loop-6.46.2}/PKG-INFO +1 -1
  2. {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/__init__.py +1 -1
  3. {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/workflow/engine.py +10 -2
  4. {power_loop-6.46.1 → power_loop-6.46.2}/power_loop.egg-info/PKG-INFO +1 -1
  5. {power_loop-6.46.1 → power_loop-6.46.2}/LICENSE +0 -0
  6. {power_loop-6.46.1 → power_loop-6.46.2}/README.md +0 -0
  7. {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/_vendor/__init__.py +0 -0
  8. {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/_vendor/llm_client/__init__.py +0 -0
  9. {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/_vendor/llm_client/anthropic_factory.py +0 -0
  10. {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/_vendor/llm_client/capabilities.py +0 -0
  11. {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/_vendor/llm_client/interface.py +0 -0
  12. {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/_vendor/llm_client/llm_factory.py +0 -0
  13. {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/_vendor/llm_client/llm_tooling.py +0 -0
  14. {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/_vendor/llm_client/llm_utils.py +0 -0
  15. {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/_vendor/llm_client/multimodal.py +0 -0
  16. {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/_vendor/llm_client/proxy_fallback.py +0 -0
  17. {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/agent/__init__.py +0 -0
  18. {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/agent/follow_up.py +0 -0
  19. {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/agent/sink.py +0 -0
  20. {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/agent/stateful_loop.py +0 -0
  21. {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/agent/system_prompt.py +0 -0
  22. {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/agent/types.py +0 -0
  23. {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/contracts/__init__.py +0 -0
  24. {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/contracts/errors.py +0 -0
  25. {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/contracts/event_payloads.py +0 -0
  26. {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/contracts/events.py +0 -0
  27. {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/contracts/handlers.py +0 -0
  28. {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/contracts/hook_contexts.py +0 -0
  29. {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/contracts/hooks.py +0 -0
  30. {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/contracts/messages.py +0 -0
  31. {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/contracts/protocols.py +0 -0
  32. {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/contracts/tools.py +0 -0
  33. {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/contrib/__init__.py +0 -0
  34. {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/contrib/_redact.py +0 -0
  35. {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/contrib/jsonl_sink.py +0 -0
  36. {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/contrib/logging_sink.py +0 -0
  37. {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/contrib/mcp.py +0 -0
  38. {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/contrib/metrics_sink.py +0 -0
  39. {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/contrib/otel_sink.py +0 -0
  40. {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/core/agent_context.py +0 -0
  41. {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/core/events.py +0 -0
  42. {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/core/hooks.py +0 -0
  43. {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/core/phase.py +0 -0
  44. {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/core/pipeline.py +0 -0
  45. {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/core/runner.py +0 -0
  46. {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/core/state.py +0 -0
  47. {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/py.typed +0 -0
  48. {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/runtime/blackboard.py +0 -0
  49. {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/runtime/budget.py +0 -0
  50. {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/runtime/cancellation.py +0 -0
  51. {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/runtime/capability_probe.py +0 -0
  52. {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/runtime/compact.py +0 -0
  53. {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/runtime/env.py +0 -0
  54. {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/runtime/exec_backend.py +0 -0
  55. {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/runtime/fold.py +0 -0
  56. {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/runtime/fold_adapter.py +0 -0
  57. {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/runtime/history_projector.py +0 -0
  58. {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/runtime/history_sanitize.py +0 -0
  59. {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/runtime/human_input.py +0 -0
  60. {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/runtime/image_recall.py +0 -0
  61. {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/runtime/memory.py +0 -0
  62. {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/runtime/notes.py +0 -0
  63. {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/runtime/provider.py +0 -0
  64. {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/runtime/representation.py +0 -0
  65. {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/runtime/retry.py +0 -0
  66. {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/runtime/runtime_state.py +0 -0
  67. {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/runtime/session_store.py +0 -0
  68. {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/runtime/skills.py +0 -0
  69. {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/runtime/spec.py +0 -0
  70. {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/runtime/steer.py +0 -0
  71. {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/runtime/stop_policy.py +0 -0
  72. {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/runtime/store/__init__.py +0 -0
  73. {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/runtime/store/backends/__init__.py +0 -0
  74. {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/runtime/store/backends/mysql.py +0 -0
  75. {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/runtime/store/backends/postgres.py +0 -0
  76. {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/runtime/store/backends/sqlite.py +0 -0
  77. {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/runtime/store/capabilities.py +0 -0
  78. {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/runtime/store/db.py +0 -0
  79. {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/runtime/store/dialect.py +0 -0
  80. {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/runtime/store/factory.py +0 -0
  81. {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/runtime/store/schema.py +0 -0
  82. {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/runtime/store/store.py +0 -0
  83. {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/runtime/store/types.py +0 -0
  84. {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/runtime/structured.py +0 -0
  85. {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/runtime/stub_provider.py +0 -0
  86. {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/runtime/timers.py +0 -0
  87. {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/runtime/todos.py +0 -0
  88. {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/runtime/usage_estimate.py +0 -0
  89. {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/tools/__init__.py +0 -0
  90. {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/tools/blackboard.py +0 -0
  91. {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/tools/command_policy.py +0 -0
  92. {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/tools/command_rules.py +0 -0
  93. {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/tools/default_manifest.py +0 -0
  94. {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/tools/default_tools.py +0 -0
  95. {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/tools/registry.py +0 -0
  96. {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/tools/spawn_agent.py +0 -0
  97. {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/workflow/__init__.py +0 -0
  98. {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/workflow/api.py +0 -0
  99. {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/workflow/introspect.py +0 -0
  100. {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/workflow/journal.py +0 -0
  101. {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/workflow/result.py +0 -0
  102. {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/workflow/resume.py +0 -0
  103. {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/workflow/runner.py +0 -0
  104. {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/workflow/spec.py +0 -0
  105. {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/workflow/subprocess_executor.py +0 -0
  106. {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/workflow/tool.py +0 -0
  107. {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/workflow/worker.py +0 -0
  108. {power_loop-6.46.1 → power_loop-6.46.2}/power_loop.egg-info/SOURCES.txt +0 -0
  109. {power_loop-6.46.1 → power_loop-6.46.2}/power_loop.egg-info/dependency_links.txt +0 -0
  110. {power_loop-6.46.1 → power_loop-6.46.2}/power_loop.egg-info/requires.txt +0 -0
  111. {power_loop-6.46.1 → power_loop-6.46.2}/power_loop.egg-info/top_level.txt +0 -0
  112. {power_loop-6.46.1 → power_loop-6.46.2}/pyproject.toml +0 -0
  113. {power_loop-6.46.1 → power_loop-6.46.2}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: power-loop
3
- Version: 6.46.1
3
+ Version: 6.46.2
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__ = "6.46.1"
18
+ __version__ = "6.46.2"
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).
@@ -362,6 +362,7 @@ class WorkflowEngine:
362
362
  # idempotency key so side-effecting tools can dedupe across a resume.
363
363
  self._run_id = run_id
364
364
  self._results: dict[str, AgentResult] = _ScopedResults()
365
+ self._iter_broken: list[str] = []
365
366
  self._errors: list[str] = []
366
367
  self._last: AgentResult | None = None
367
368
  self._budget_hit = False
@@ -435,10 +436,12 @@ class WorkflowEngine:
435
436
  nid for nid, r in self._results.items()
436
437
  if r.status not in ("completed", "skipped") and nid not in self._tolerated
437
438
  ]
439
+ # foreach 各路里没成功的(全局表里只留了最后写的那一路,见 _iter_broken)
440
+ broken += [b for b in self._iter_broken if b.rsplit(".", 1)[-1] not in self._tolerated]
438
441
  if broken:
439
442
  status = "failed"
440
443
  self._errors.append(
441
- "failed node(s): " + ", ".join(sorted(broken))
444
+ "failed node(s): " + ", ".join(sorted(set(broken)))
442
445
  + "(如果这些失败是可接受的,给对应节点加 continue_on_error: true)"
443
446
  )
444
447
  if self._leaf_cap_hit and status == "completed":
@@ -1032,7 +1035,8 @@ class WorkflowEngine:
1032
1035
  # 给每次迭代分不同的产出文件——不区分的话 N 个并发迭代会追加进同一个文件,互相搅乱。
1033
1036
  child_env = {**env, node.as_var: item, ITERATION_ENV_KEY: index}
1034
1037
  outer = _ITER_SCOPE.get()
1035
- tok = _ITER_SCOPE.set(ChainMap() if outer is None else outer.new_child())
1038
+ scope: ChainMap[str, AgentResult] = ChainMap() if outer is None else outer.new_child()
1039
+ tok = _ITER_SCOPE.set(scope)
1036
1040
  try:
1037
1041
  if node.parallel:
1038
1042
  async with sem:
@@ -1040,6 +1044,10 @@ class WorkflowEngine:
1040
1044
  return await self._exec(node.body, child_env, driver_sid)
1041
1045
  finally:
1042
1046
  _ITER_SCOPE.reset(tok)
1047
+ # 这一路里没成功的节点(6.46.1):全局结果表里体内 id 只留最后写的那一路,run 终态要看每一路
1048
+ for nid, r in scope.maps[0].items():
1049
+ if r.status not in ("completed", "skipped") and nid not in self._tolerated:
1050
+ self._iter_broken.append(f"{node.id or 'foreach'}[{index}].{nid}")
1043
1051
 
1044
1052
  # Per-iteration leaves are not journaled individually (see _emit_step);
1045
1053
  # the aggregate below is the resume unit. Reset even if a body raises.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: power-loop
3
- Version: 6.46.1
3
+ Version: 6.46.2
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