power-loop 6.40.0__tar.gz → 6.41.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-6.40.0 → power_loop-6.41.0}/PKG-INFO +1 -1
- {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/__init__.py +1 -1
- {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/runtime/env.py +4 -0
- {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/tools/default_tools.py +6 -2
- {power_loop-6.40.0 → power_loop-6.41.0}/power_loop.egg-info/PKG-INFO +1 -1
- {power_loop-6.40.0 → power_loop-6.41.0}/LICENSE +0 -0
- {power_loop-6.40.0 → power_loop-6.41.0}/README.md +0 -0
- {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/_vendor/__init__.py +0 -0
- {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/_vendor/llm_client/__init__.py +0 -0
- {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/_vendor/llm_client/anthropic_factory.py +0 -0
- {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/_vendor/llm_client/capabilities.py +0 -0
- {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/_vendor/llm_client/interface.py +0 -0
- {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/_vendor/llm_client/llm_factory.py +0 -0
- {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/_vendor/llm_client/llm_tooling.py +0 -0
- {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/_vendor/llm_client/llm_utils.py +0 -0
- {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/_vendor/llm_client/multimodal.py +0 -0
- {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/agent/__init__.py +0 -0
- {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/agent/follow_up.py +0 -0
- {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/agent/sink.py +0 -0
- {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/agent/stateful_loop.py +0 -0
- {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/agent/system_prompt.py +0 -0
- {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/agent/types.py +0 -0
- {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/contracts/__init__.py +0 -0
- {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/contracts/errors.py +0 -0
- {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/contracts/event_payloads.py +0 -0
- {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/contracts/events.py +0 -0
- {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/contracts/handlers.py +0 -0
- {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/contracts/hook_contexts.py +0 -0
- {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/contracts/hooks.py +0 -0
- {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/contracts/messages.py +0 -0
- {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/contracts/protocols.py +0 -0
- {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/contracts/tools.py +0 -0
- {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/contrib/__init__.py +0 -0
- {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/contrib/_redact.py +0 -0
- {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/contrib/jsonl_sink.py +0 -0
- {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/contrib/logging_sink.py +0 -0
- {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/contrib/mcp.py +0 -0
- {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/contrib/metrics_sink.py +0 -0
- {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/contrib/otel_sink.py +0 -0
- {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/core/agent_context.py +0 -0
- {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/core/events.py +0 -0
- {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/core/hooks.py +0 -0
- {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/core/phase.py +0 -0
- {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/core/pipeline.py +0 -0
- {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/core/runner.py +0 -0
- {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/core/state.py +0 -0
- {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/py.typed +0 -0
- {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/runtime/blackboard.py +0 -0
- {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/runtime/budget.py +0 -0
- {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/runtime/cancellation.py +0 -0
- {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/runtime/capability_probe.py +0 -0
- {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/runtime/compact.py +0 -0
- {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/runtime/exec_backend.py +0 -0
- {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/runtime/fold.py +0 -0
- {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/runtime/fold_adapter.py +0 -0
- {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/runtime/history_projector.py +0 -0
- {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/runtime/history_sanitize.py +0 -0
- {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/runtime/human_input.py +0 -0
- {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/runtime/image_recall.py +0 -0
- {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/runtime/memory.py +0 -0
- {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/runtime/notes.py +0 -0
- {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/runtime/provider.py +0 -0
- {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/runtime/representation.py +0 -0
- {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/runtime/retry.py +0 -0
- {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/runtime/runtime_state.py +0 -0
- {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/runtime/session_store.py +0 -0
- {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/runtime/skills.py +0 -0
- {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/runtime/spec.py +0 -0
- {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/runtime/steer.py +0 -0
- {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/runtime/stop_policy.py +0 -0
- {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/runtime/store/__init__.py +0 -0
- {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/runtime/store/backends/__init__.py +0 -0
- {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/runtime/store/backends/mysql.py +0 -0
- {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/runtime/store/backends/postgres.py +0 -0
- {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/runtime/store/backends/sqlite.py +0 -0
- {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/runtime/store/capabilities.py +0 -0
- {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/runtime/store/db.py +0 -0
- {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/runtime/store/dialect.py +0 -0
- {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/runtime/store/factory.py +0 -0
- {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/runtime/store/schema.py +0 -0
- {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/runtime/store/store.py +0 -0
- {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/runtime/store/types.py +0 -0
- {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/runtime/structured.py +0 -0
- {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/runtime/stub_provider.py +0 -0
- {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/runtime/timers.py +0 -0
- {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/runtime/todos.py +0 -0
- {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/runtime/usage_estimate.py +0 -0
- {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/tools/__init__.py +0 -0
- {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/tools/blackboard.py +0 -0
- {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/tools/command_policy.py +0 -0
- {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/tools/default_manifest.py +0 -0
- {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/tools/registry.py +0 -0
- {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/tools/spawn_agent.py +0 -0
- {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/workflow/__init__.py +0 -0
- {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/workflow/api.py +0 -0
- {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/workflow/engine.py +0 -0
- {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/workflow/introspect.py +0 -0
- {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/workflow/journal.py +0 -0
- {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/workflow/result.py +0 -0
- {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/workflow/resume.py +0 -0
- {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/workflow/runner.py +0 -0
- {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/workflow/spec.py +0 -0
- {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/workflow/subprocess_executor.py +0 -0
- {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/workflow/tool.py +0 -0
- {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/workflow/worker.py +0 -0
- {power_loop-6.40.0 → power_loop-6.41.0}/power_loop.egg-info/SOURCES.txt +0 -0
- {power_loop-6.40.0 → power_loop-6.41.0}/power_loop.egg-info/dependency_links.txt +0 -0
- {power_loop-6.40.0 → power_loop-6.41.0}/power_loop.egg-info/requires.txt +0 -0
- {power_loop-6.40.0 → power_loop-6.41.0}/power_loop.egg-info/top_level.txt +0 -0
- {power_loop-6.40.0 → power_loop-6.41.0}/pyproject.toml +0 -0
- {power_loop-6.40.0 → power_loop-6.41.0}/setup.cfg +0 -0
|
@@ -15,7 +15,7 @@ Stability tiers
|
|
|
15
15
|
无版本承诺,可随时变更或删除。
|
|
16
16
|
"""
|
|
17
17
|
|
|
18
|
-
__version__ = "6.
|
|
18
|
+
__version__ = "6.41.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).
|
|
@@ -44,6 +44,10 @@ class RuntimeEnv:
|
|
|
44
44
|
# resolves only for purpose "r"; any write-capable purpose is refused, even when the
|
|
45
45
|
# same path would also fall inside the workspace or the home allowlist.
|
|
46
46
|
read_only_roots: tuple[Path, ...] = ()
|
|
47
|
+
# Hard time limit for one `background_run(action="run")` command (seconds; 6.41.0). The command
|
|
48
|
+
# is killed when it runs longer and the task settles as "timeout". Was a fixed 300s — a host whose
|
|
49
|
+
# agents run genuinely long jobs in the background (builds, batch processing) raises it.
|
|
50
|
+
background_timeout_s: float = 300.0
|
|
47
51
|
|
|
48
52
|
@classmethod
|
|
49
53
|
def from_env(
|
|
@@ -1323,6 +1323,7 @@ class BackgroundManager:
|
|
|
1323
1323
|
# as `bash` — running on the host would bypass an installed sandbox and leak
|
|
1324
1324
|
# the host environment (C1).
|
|
1325
1325
|
shell_backend = env.shell_backend
|
|
1326
|
+
timeout_s = max(1.0, float(getattr(env, "background_timeout_s", 300.0) or 300.0))
|
|
1326
1327
|
store, sid = _current_store_and_session()
|
|
1327
1328
|
# Capture the running event loop so the daemon thread can drive the async
|
|
1328
1329
|
# store's writes back on it (the store's transaction/lock are loop-bound).
|
|
@@ -1348,6 +1349,7 @@ class BackgroundManager:
|
|
|
1348
1349
|
"event_loop": event_loop,
|
|
1349
1350
|
"workspace_dir": workspace_dir,
|
|
1350
1351
|
"shell_backend": shell_backend,
|
|
1352
|
+
"timeout_s": timeout_s,
|
|
1351
1353
|
}
|
|
1352
1354
|
self._prune_locked()
|
|
1353
1355
|
|
|
@@ -1366,6 +1368,7 @@ class BackgroundManager:
|
|
|
1366
1368
|
sid = None
|
|
1367
1369
|
event_loop = None
|
|
1368
1370
|
shell_backend: ShellBackend | None = None
|
|
1371
|
+
timeout_s = 300.0
|
|
1369
1372
|
with self._lock:
|
|
1370
1373
|
task = self.tasks.get(task_id)
|
|
1371
1374
|
if task is not None:
|
|
@@ -1374,6 +1377,7 @@ class BackgroundManager:
|
|
|
1374
1377
|
event_loop = task.get("event_loop")
|
|
1375
1378
|
workspace_dir = task.get("workspace_dir")
|
|
1376
1379
|
shell_backend = task.get("shell_backend")
|
|
1380
|
+
timeout_s = float(task.get("timeout_s") or 300.0)
|
|
1377
1381
|
else:
|
|
1378
1382
|
workspace_dir = None
|
|
1379
1383
|
try:
|
|
@@ -1404,7 +1408,7 @@ class BackgroundManager:
|
|
|
1404
1408
|
# them wherever they run — including inside a sandbox, where the local process is
|
|
1405
1409
|
# only the sandbox client and its death doesn't reach the command.
|
|
1406
1410
|
out, err = proc.communicate(
|
|
1407
|
-
input=f"export {_BG_TAG_VAR}={task_id}\n{command}", timeout=
|
|
1411
|
+
input=f"export {_BG_TAG_VAR}={task_id}\n{command}", timeout=timeout_s)
|
|
1408
1412
|
except subprocess.TimeoutExpired:
|
|
1409
1413
|
_signal_group(proc, signal.SIGKILL)
|
|
1410
1414
|
out, err = proc.communicate()
|
|
@@ -1419,7 +1423,7 @@ class BackgroundManager:
|
|
|
1419
1423
|
else:
|
|
1420
1424
|
status = "completed" if return_code == 0 else f"failed({return_code})"
|
|
1421
1425
|
except subprocess.TimeoutExpired:
|
|
1422
|
-
output = "Error: Timeout (
|
|
1426
|
+
output = f"Error: Timeout ({timeout_s:g}s)"
|
|
1423
1427
|
status = "timeout"
|
|
1424
1428
|
return_code = None
|
|
1425
1429
|
except Exception as e: # pragma: no cover
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|