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.
- {power_loop-6.46.1 → power_loop-6.46.2}/PKG-INFO +1 -1
- {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/__init__.py +1 -1
- {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/workflow/engine.py +10 -2
- {power_loop-6.46.1 → power_loop-6.46.2}/power_loop.egg-info/PKG-INFO +1 -1
- {power_loop-6.46.1 → power_loop-6.46.2}/LICENSE +0 -0
- {power_loop-6.46.1 → power_loop-6.46.2}/README.md +0 -0
- {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/_vendor/__init__.py +0 -0
- {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/_vendor/llm_client/__init__.py +0 -0
- {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/_vendor/llm_client/anthropic_factory.py +0 -0
- {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/_vendor/llm_client/capabilities.py +0 -0
- {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/_vendor/llm_client/interface.py +0 -0
- {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/_vendor/llm_client/llm_factory.py +0 -0
- {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/_vendor/llm_client/llm_tooling.py +0 -0
- {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/_vendor/llm_client/llm_utils.py +0 -0
- {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/_vendor/llm_client/multimodal.py +0 -0
- {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/_vendor/llm_client/proxy_fallback.py +0 -0
- {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/agent/__init__.py +0 -0
- {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/agent/follow_up.py +0 -0
- {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/agent/sink.py +0 -0
- {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/agent/stateful_loop.py +0 -0
- {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/agent/system_prompt.py +0 -0
- {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/agent/types.py +0 -0
- {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/contracts/__init__.py +0 -0
- {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/contracts/errors.py +0 -0
- {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/contracts/event_payloads.py +0 -0
- {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/contracts/events.py +0 -0
- {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/contracts/handlers.py +0 -0
- {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/contracts/hook_contexts.py +0 -0
- {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/contracts/hooks.py +0 -0
- {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/contracts/messages.py +0 -0
- {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/contracts/protocols.py +0 -0
- {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/contracts/tools.py +0 -0
- {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/contrib/__init__.py +0 -0
- {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/contrib/_redact.py +0 -0
- {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/contrib/jsonl_sink.py +0 -0
- {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/contrib/logging_sink.py +0 -0
- {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/contrib/mcp.py +0 -0
- {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/contrib/metrics_sink.py +0 -0
- {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/contrib/otel_sink.py +0 -0
- {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/core/agent_context.py +0 -0
- {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/core/events.py +0 -0
- {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/core/hooks.py +0 -0
- {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/core/phase.py +0 -0
- {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/core/pipeline.py +0 -0
- {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/core/runner.py +0 -0
- {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/core/state.py +0 -0
- {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/py.typed +0 -0
- {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/runtime/blackboard.py +0 -0
- {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/runtime/budget.py +0 -0
- {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/runtime/cancellation.py +0 -0
- {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/runtime/capability_probe.py +0 -0
- {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/runtime/compact.py +0 -0
- {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/runtime/env.py +0 -0
- {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/runtime/exec_backend.py +0 -0
- {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/runtime/fold.py +0 -0
- {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/runtime/fold_adapter.py +0 -0
- {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/runtime/history_projector.py +0 -0
- {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/runtime/history_sanitize.py +0 -0
- {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/runtime/human_input.py +0 -0
- {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/runtime/image_recall.py +0 -0
- {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/runtime/memory.py +0 -0
- {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/runtime/notes.py +0 -0
- {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/runtime/provider.py +0 -0
- {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/runtime/representation.py +0 -0
- {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/runtime/retry.py +0 -0
- {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/runtime/runtime_state.py +0 -0
- {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/runtime/session_store.py +0 -0
- {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/runtime/skills.py +0 -0
- {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/runtime/spec.py +0 -0
- {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/runtime/steer.py +0 -0
- {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/runtime/stop_policy.py +0 -0
- {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/runtime/store/__init__.py +0 -0
- {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/runtime/store/backends/__init__.py +0 -0
- {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/runtime/store/backends/mysql.py +0 -0
- {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/runtime/store/backends/postgres.py +0 -0
- {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/runtime/store/backends/sqlite.py +0 -0
- {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/runtime/store/capabilities.py +0 -0
- {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/runtime/store/db.py +0 -0
- {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/runtime/store/dialect.py +0 -0
- {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/runtime/store/factory.py +0 -0
- {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/runtime/store/schema.py +0 -0
- {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/runtime/store/store.py +0 -0
- {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/runtime/store/types.py +0 -0
- {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/runtime/structured.py +0 -0
- {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/runtime/stub_provider.py +0 -0
- {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/runtime/timers.py +0 -0
- {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/runtime/todos.py +0 -0
- {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/runtime/usage_estimate.py +0 -0
- {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/tools/__init__.py +0 -0
- {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/tools/blackboard.py +0 -0
- {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/tools/command_policy.py +0 -0
- {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/tools/command_rules.py +0 -0
- {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/tools/default_manifest.py +0 -0
- {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/tools/default_tools.py +0 -0
- {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/tools/registry.py +0 -0
- {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/tools/spawn_agent.py +0 -0
- {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/workflow/__init__.py +0 -0
- {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/workflow/api.py +0 -0
- {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/workflow/introspect.py +0 -0
- {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/workflow/journal.py +0 -0
- {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/workflow/result.py +0 -0
- {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/workflow/resume.py +0 -0
- {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/workflow/runner.py +0 -0
- {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/workflow/spec.py +0 -0
- {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/workflow/subprocess_executor.py +0 -0
- {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/workflow/tool.py +0 -0
- {power_loop-6.46.1 → power_loop-6.46.2}/power_loop/workflow/worker.py +0 -0
- {power_loop-6.46.1 → power_loop-6.46.2}/power_loop.egg-info/SOURCES.txt +0 -0
- {power_loop-6.46.1 → power_loop-6.46.2}/power_loop.egg-info/dependency_links.txt +0 -0
- {power_loop-6.46.1 → power_loop-6.46.2}/power_loop.egg-info/requires.txt +0 -0
- {power_loop-6.46.1 → power_loop-6.46.2}/power_loop.egg-info/top_level.txt +0 -0
- {power_loop-6.46.1 → power_loop-6.46.2}/pyproject.toml +0 -0
- {power_loop-6.46.1 → power_loop-6.46.2}/setup.cfg +0 -0
|
@@ -15,7 +15,7 @@ Stability tiers
|
|
|
15
15
|
无版本承诺,可随时变更或删除。
|
|
16
16
|
"""
|
|
17
17
|
|
|
18
|
-
__version__ = "6.46.
|
|
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
|
-
|
|
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.
|
|
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
|