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.
Files changed (111) hide show
  1. {power_loop-6.40.0 → power_loop-6.41.0}/PKG-INFO +1 -1
  2. {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/__init__.py +1 -1
  3. {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/runtime/env.py +4 -0
  4. {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/tools/default_tools.py +6 -2
  5. {power_loop-6.40.0 → power_loop-6.41.0}/power_loop.egg-info/PKG-INFO +1 -1
  6. {power_loop-6.40.0 → power_loop-6.41.0}/LICENSE +0 -0
  7. {power_loop-6.40.0 → power_loop-6.41.0}/README.md +0 -0
  8. {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/_vendor/__init__.py +0 -0
  9. {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/_vendor/llm_client/__init__.py +0 -0
  10. {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/_vendor/llm_client/anthropic_factory.py +0 -0
  11. {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/_vendor/llm_client/capabilities.py +0 -0
  12. {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/_vendor/llm_client/interface.py +0 -0
  13. {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/_vendor/llm_client/llm_factory.py +0 -0
  14. {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/_vendor/llm_client/llm_tooling.py +0 -0
  15. {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/_vendor/llm_client/llm_utils.py +0 -0
  16. {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/_vendor/llm_client/multimodal.py +0 -0
  17. {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/agent/__init__.py +0 -0
  18. {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/agent/follow_up.py +0 -0
  19. {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/agent/sink.py +0 -0
  20. {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/agent/stateful_loop.py +0 -0
  21. {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/agent/system_prompt.py +0 -0
  22. {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/agent/types.py +0 -0
  23. {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/contracts/__init__.py +0 -0
  24. {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/contracts/errors.py +0 -0
  25. {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/contracts/event_payloads.py +0 -0
  26. {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/contracts/events.py +0 -0
  27. {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/contracts/handlers.py +0 -0
  28. {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/contracts/hook_contexts.py +0 -0
  29. {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/contracts/hooks.py +0 -0
  30. {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/contracts/messages.py +0 -0
  31. {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/contracts/protocols.py +0 -0
  32. {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/contracts/tools.py +0 -0
  33. {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/contrib/__init__.py +0 -0
  34. {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/contrib/_redact.py +0 -0
  35. {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/contrib/jsonl_sink.py +0 -0
  36. {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/contrib/logging_sink.py +0 -0
  37. {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/contrib/mcp.py +0 -0
  38. {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/contrib/metrics_sink.py +0 -0
  39. {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/contrib/otel_sink.py +0 -0
  40. {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/core/agent_context.py +0 -0
  41. {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/core/events.py +0 -0
  42. {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/core/hooks.py +0 -0
  43. {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/core/phase.py +0 -0
  44. {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/core/pipeline.py +0 -0
  45. {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/core/runner.py +0 -0
  46. {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/core/state.py +0 -0
  47. {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/py.typed +0 -0
  48. {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/runtime/blackboard.py +0 -0
  49. {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/runtime/budget.py +0 -0
  50. {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/runtime/cancellation.py +0 -0
  51. {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/runtime/capability_probe.py +0 -0
  52. {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/runtime/compact.py +0 -0
  53. {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/runtime/exec_backend.py +0 -0
  54. {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/runtime/fold.py +0 -0
  55. {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/runtime/fold_adapter.py +0 -0
  56. {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/runtime/history_projector.py +0 -0
  57. {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/runtime/history_sanitize.py +0 -0
  58. {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/runtime/human_input.py +0 -0
  59. {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/runtime/image_recall.py +0 -0
  60. {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/runtime/memory.py +0 -0
  61. {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/runtime/notes.py +0 -0
  62. {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/runtime/provider.py +0 -0
  63. {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/runtime/representation.py +0 -0
  64. {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/runtime/retry.py +0 -0
  65. {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/runtime/runtime_state.py +0 -0
  66. {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/runtime/session_store.py +0 -0
  67. {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/runtime/skills.py +0 -0
  68. {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/runtime/spec.py +0 -0
  69. {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/runtime/steer.py +0 -0
  70. {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/runtime/stop_policy.py +0 -0
  71. {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/runtime/store/__init__.py +0 -0
  72. {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/runtime/store/backends/__init__.py +0 -0
  73. {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/runtime/store/backends/mysql.py +0 -0
  74. {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/runtime/store/backends/postgres.py +0 -0
  75. {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/runtime/store/backends/sqlite.py +0 -0
  76. {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/runtime/store/capabilities.py +0 -0
  77. {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/runtime/store/db.py +0 -0
  78. {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/runtime/store/dialect.py +0 -0
  79. {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/runtime/store/factory.py +0 -0
  80. {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/runtime/store/schema.py +0 -0
  81. {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/runtime/store/store.py +0 -0
  82. {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/runtime/store/types.py +0 -0
  83. {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/runtime/structured.py +0 -0
  84. {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/runtime/stub_provider.py +0 -0
  85. {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/runtime/timers.py +0 -0
  86. {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/runtime/todos.py +0 -0
  87. {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/runtime/usage_estimate.py +0 -0
  88. {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/tools/__init__.py +0 -0
  89. {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/tools/blackboard.py +0 -0
  90. {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/tools/command_policy.py +0 -0
  91. {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/tools/default_manifest.py +0 -0
  92. {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/tools/registry.py +0 -0
  93. {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/tools/spawn_agent.py +0 -0
  94. {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/workflow/__init__.py +0 -0
  95. {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/workflow/api.py +0 -0
  96. {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/workflow/engine.py +0 -0
  97. {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/workflow/introspect.py +0 -0
  98. {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/workflow/journal.py +0 -0
  99. {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/workflow/result.py +0 -0
  100. {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/workflow/resume.py +0 -0
  101. {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/workflow/runner.py +0 -0
  102. {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/workflow/spec.py +0 -0
  103. {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/workflow/subprocess_executor.py +0 -0
  104. {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/workflow/tool.py +0 -0
  105. {power_loop-6.40.0 → power_loop-6.41.0}/power_loop/workflow/worker.py +0 -0
  106. {power_loop-6.40.0 → power_loop-6.41.0}/power_loop.egg-info/SOURCES.txt +0 -0
  107. {power_loop-6.40.0 → power_loop-6.41.0}/power_loop.egg-info/dependency_links.txt +0 -0
  108. {power_loop-6.40.0 → power_loop-6.41.0}/power_loop.egg-info/requires.txt +0 -0
  109. {power_loop-6.40.0 → power_loop-6.41.0}/power_loop.egg-info/top_level.txt +0 -0
  110. {power_loop-6.40.0 → power_loop-6.41.0}/pyproject.toml +0 -0
  111. {power_loop-6.40.0 → power_loop-6.41.0}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: power-loop
3
- Version: 6.40.0
3
+ Version: 6.41.0
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.40.0"
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=300)
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 (300s)"
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
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: power-loop
3
- Version: 6.40.0
3
+ Version: 6.41.0
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