power-loop 6.3.0__tar.gz → 6.4.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 (106) hide show
  1. {power_loop-6.3.0 → power_loop-6.4.0}/PKG-INFO +1 -1
  2. {power_loop-6.3.0 → power_loop-6.4.0}/power_loop/__init__.py +1 -1
  3. {power_loop-6.3.0 → power_loop-6.4.0}/power_loop/runtime/image_recall.py +38 -0
  4. {power_loop-6.3.0 → power_loop-6.4.0}/power_loop.egg-info/PKG-INFO +1 -1
  5. {power_loop-6.3.0 → power_loop-6.4.0}/LICENSE +0 -0
  6. {power_loop-6.3.0 → power_loop-6.4.0}/README.md +0 -0
  7. {power_loop-6.3.0 → power_loop-6.4.0}/power_loop/_vendor/__init__.py +0 -0
  8. {power_loop-6.3.0 → power_loop-6.4.0}/power_loop/_vendor/llm_client/__init__.py +0 -0
  9. {power_loop-6.3.0 → power_loop-6.4.0}/power_loop/_vendor/llm_client/anthropic_factory.py +0 -0
  10. {power_loop-6.3.0 → power_loop-6.4.0}/power_loop/_vendor/llm_client/capabilities.py +0 -0
  11. {power_loop-6.3.0 → power_loop-6.4.0}/power_loop/_vendor/llm_client/interface.py +0 -0
  12. {power_loop-6.3.0 → power_loop-6.4.0}/power_loop/_vendor/llm_client/llm_factory.py +0 -0
  13. {power_loop-6.3.0 → power_loop-6.4.0}/power_loop/_vendor/llm_client/llm_tooling.py +0 -0
  14. {power_loop-6.3.0 → power_loop-6.4.0}/power_loop/_vendor/llm_client/llm_utils.py +0 -0
  15. {power_loop-6.3.0 → power_loop-6.4.0}/power_loop/_vendor/llm_client/multimodal.py +0 -0
  16. {power_loop-6.3.0 → power_loop-6.4.0}/power_loop/agent/__init__.py +0 -0
  17. {power_loop-6.3.0 → power_loop-6.4.0}/power_loop/agent/follow_up.py +0 -0
  18. {power_loop-6.3.0 → power_loop-6.4.0}/power_loop/agent/sink.py +0 -0
  19. {power_loop-6.3.0 → power_loop-6.4.0}/power_loop/agent/stateful_loop.py +0 -0
  20. {power_loop-6.3.0 → power_loop-6.4.0}/power_loop/agent/system_prompt.py +0 -0
  21. {power_loop-6.3.0 → power_loop-6.4.0}/power_loop/agent/types.py +0 -0
  22. {power_loop-6.3.0 → power_loop-6.4.0}/power_loop/contracts/__init__.py +0 -0
  23. {power_loop-6.3.0 → power_loop-6.4.0}/power_loop/contracts/errors.py +0 -0
  24. {power_loop-6.3.0 → power_loop-6.4.0}/power_loop/contracts/event_payloads.py +0 -0
  25. {power_loop-6.3.0 → power_loop-6.4.0}/power_loop/contracts/events.py +0 -0
  26. {power_loop-6.3.0 → power_loop-6.4.0}/power_loop/contracts/handlers.py +0 -0
  27. {power_loop-6.3.0 → power_loop-6.4.0}/power_loop/contracts/hook_contexts.py +0 -0
  28. {power_loop-6.3.0 → power_loop-6.4.0}/power_loop/contracts/hooks.py +0 -0
  29. {power_loop-6.3.0 → power_loop-6.4.0}/power_loop/contracts/messages.py +0 -0
  30. {power_loop-6.3.0 → power_loop-6.4.0}/power_loop/contracts/protocols.py +0 -0
  31. {power_loop-6.3.0 → power_loop-6.4.0}/power_loop/contracts/tools.py +0 -0
  32. {power_loop-6.3.0 → power_loop-6.4.0}/power_loop/contrib/__init__.py +0 -0
  33. {power_loop-6.3.0 → power_loop-6.4.0}/power_loop/contrib/_redact.py +0 -0
  34. {power_loop-6.3.0 → power_loop-6.4.0}/power_loop/contrib/jsonl_sink.py +0 -0
  35. {power_loop-6.3.0 → power_loop-6.4.0}/power_loop/contrib/logging_sink.py +0 -0
  36. {power_loop-6.3.0 → power_loop-6.4.0}/power_loop/contrib/mcp.py +0 -0
  37. {power_loop-6.3.0 → power_loop-6.4.0}/power_loop/contrib/metrics_sink.py +0 -0
  38. {power_loop-6.3.0 → power_loop-6.4.0}/power_loop/contrib/otel_sink.py +0 -0
  39. {power_loop-6.3.0 → power_loop-6.4.0}/power_loop/core/agent_context.py +0 -0
  40. {power_loop-6.3.0 → power_loop-6.4.0}/power_loop/core/events.py +0 -0
  41. {power_loop-6.3.0 → power_loop-6.4.0}/power_loop/core/hooks.py +0 -0
  42. {power_loop-6.3.0 → power_loop-6.4.0}/power_loop/core/phase.py +0 -0
  43. {power_loop-6.3.0 → power_loop-6.4.0}/power_loop/core/pipeline.py +0 -0
  44. {power_loop-6.3.0 → power_loop-6.4.0}/power_loop/core/runner.py +0 -0
  45. {power_loop-6.3.0 → power_loop-6.4.0}/power_loop/core/state.py +0 -0
  46. {power_loop-6.3.0 → power_loop-6.4.0}/power_loop/py.typed +0 -0
  47. {power_loop-6.3.0 → power_loop-6.4.0}/power_loop/runtime/blackboard.py +0 -0
  48. {power_loop-6.3.0 → power_loop-6.4.0}/power_loop/runtime/budget.py +0 -0
  49. {power_loop-6.3.0 → power_loop-6.4.0}/power_loop/runtime/cancellation.py +0 -0
  50. {power_loop-6.3.0 → power_loop-6.4.0}/power_loop/runtime/compact.py +0 -0
  51. {power_loop-6.3.0 → power_loop-6.4.0}/power_loop/runtime/env.py +0 -0
  52. {power_loop-6.3.0 → power_loop-6.4.0}/power_loop/runtime/exec_backend.py +0 -0
  53. {power_loop-6.3.0 → power_loop-6.4.0}/power_loop/runtime/fold.py +0 -0
  54. {power_loop-6.3.0 → power_loop-6.4.0}/power_loop/runtime/fold_adapter.py +0 -0
  55. {power_loop-6.3.0 → power_loop-6.4.0}/power_loop/runtime/history_projector.py +0 -0
  56. {power_loop-6.3.0 → power_loop-6.4.0}/power_loop/runtime/history_sanitize.py +0 -0
  57. {power_loop-6.3.0 → power_loop-6.4.0}/power_loop/runtime/human_input.py +0 -0
  58. {power_loop-6.3.0 → power_loop-6.4.0}/power_loop/runtime/memory.py +0 -0
  59. {power_loop-6.3.0 → power_loop-6.4.0}/power_loop/runtime/notes.py +0 -0
  60. {power_loop-6.3.0 → power_loop-6.4.0}/power_loop/runtime/provider.py +0 -0
  61. {power_loop-6.3.0 → power_loop-6.4.0}/power_loop/runtime/representation.py +0 -0
  62. {power_loop-6.3.0 → power_loop-6.4.0}/power_loop/runtime/retry.py +0 -0
  63. {power_loop-6.3.0 → power_loop-6.4.0}/power_loop/runtime/runtime_state.py +0 -0
  64. {power_loop-6.3.0 → power_loop-6.4.0}/power_loop/runtime/session_store.py +0 -0
  65. {power_loop-6.3.0 → power_loop-6.4.0}/power_loop/runtime/skills.py +0 -0
  66. {power_loop-6.3.0 → power_loop-6.4.0}/power_loop/runtime/spec.py +0 -0
  67. {power_loop-6.3.0 → power_loop-6.4.0}/power_loop/runtime/store/__init__.py +0 -0
  68. {power_loop-6.3.0 → power_loop-6.4.0}/power_loop/runtime/store/backends/__init__.py +0 -0
  69. {power_loop-6.3.0 → power_loop-6.4.0}/power_loop/runtime/store/backends/mysql.py +0 -0
  70. {power_loop-6.3.0 → power_loop-6.4.0}/power_loop/runtime/store/backends/postgres.py +0 -0
  71. {power_loop-6.3.0 → power_loop-6.4.0}/power_loop/runtime/store/backends/sqlite.py +0 -0
  72. {power_loop-6.3.0 → power_loop-6.4.0}/power_loop/runtime/store/capabilities.py +0 -0
  73. {power_loop-6.3.0 → power_loop-6.4.0}/power_loop/runtime/store/db.py +0 -0
  74. {power_loop-6.3.0 → power_loop-6.4.0}/power_loop/runtime/store/dialect.py +0 -0
  75. {power_loop-6.3.0 → power_loop-6.4.0}/power_loop/runtime/store/factory.py +0 -0
  76. {power_loop-6.3.0 → power_loop-6.4.0}/power_loop/runtime/store/schema.py +0 -0
  77. {power_loop-6.3.0 → power_loop-6.4.0}/power_loop/runtime/store/store.py +0 -0
  78. {power_loop-6.3.0 → power_loop-6.4.0}/power_loop/runtime/store/types.py +0 -0
  79. {power_loop-6.3.0 → power_loop-6.4.0}/power_loop/runtime/structured.py +0 -0
  80. {power_loop-6.3.0 → power_loop-6.4.0}/power_loop/runtime/stub_provider.py +0 -0
  81. {power_loop-6.3.0 → power_loop-6.4.0}/power_loop/runtime/timers.py +0 -0
  82. {power_loop-6.3.0 → power_loop-6.4.0}/power_loop/tools/__init__.py +0 -0
  83. {power_loop-6.3.0 → power_loop-6.4.0}/power_loop/tools/blackboard.py +0 -0
  84. {power_loop-6.3.0 → power_loop-6.4.0}/power_loop/tools/command_policy.py +0 -0
  85. {power_loop-6.3.0 → power_loop-6.4.0}/power_loop/tools/default_manifest.py +0 -0
  86. {power_loop-6.3.0 → power_loop-6.4.0}/power_loop/tools/default_tools.py +0 -0
  87. {power_loop-6.3.0 → power_loop-6.4.0}/power_loop/tools/registry.py +0 -0
  88. {power_loop-6.3.0 → power_loop-6.4.0}/power_loop/tools/spawn_agent.py +0 -0
  89. {power_loop-6.3.0 → power_loop-6.4.0}/power_loop/workflow/__init__.py +0 -0
  90. {power_loop-6.3.0 → power_loop-6.4.0}/power_loop/workflow/api.py +0 -0
  91. {power_loop-6.3.0 → power_loop-6.4.0}/power_loop/workflow/engine.py +0 -0
  92. {power_loop-6.3.0 → power_loop-6.4.0}/power_loop/workflow/introspect.py +0 -0
  93. {power_loop-6.3.0 → power_loop-6.4.0}/power_loop/workflow/journal.py +0 -0
  94. {power_loop-6.3.0 → power_loop-6.4.0}/power_loop/workflow/result.py +0 -0
  95. {power_loop-6.3.0 → power_loop-6.4.0}/power_loop/workflow/resume.py +0 -0
  96. {power_loop-6.3.0 → power_loop-6.4.0}/power_loop/workflow/runner.py +0 -0
  97. {power_loop-6.3.0 → power_loop-6.4.0}/power_loop/workflow/spec.py +0 -0
  98. {power_loop-6.3.0 → power_loop-6.4.0}/power_loop/workflow/subprocess_executor.py +0 -0
  99. {power_loop-6.3.0 → power_loop-6.4.0}/power_loop/workflow/tool.py +0 -0
  100. {power_loop-6.3.0 → power_loop-6.4.0}/power_loop/workflow/worker.py +0 -0
  101. {power_loop-6.3.0 → power_loop-6.4.0}/power_loop.egg-info/SOURCES.txt +0 -0
  102. {power_loop-6.3.0 → power_loop-6.4.0}/power_loop.egg-info/dependency_links.txt +0 -0
  103. {power_loop-6.3.0 → power_loop-6.4.0}/power_loop.egg-info/requires.txt +0 -0
  104. {power_loop-6.3.0 → power_loop-6.4.0}/power_loop.egg-info/top_level.txt +0 -0
  105. {power_loop-6.3.0 → power_loop-6.4.0}/pyproject.toml +0 -0
  106. {power_loop-6.3.0 → power_loop-6.4.0}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: power-loop
3
- Version: 6.3.0
3
+ Version: 6.4.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.3.0"
18
+ __version__ = "6.4.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).
@@ -28,6 +28,7 @@ Pass ``durable=False`` for the look-once case (request-only, never stored).
28
28
  from __future__ import annotations
29
29
 
30
30
  import threading
31
+ from collections.abc import Sequence
31
32
  from typing import Any
32
33
 
33
34
  LoopMessage = dict[str, Any]
@@ -77,6 +78,43 @@ def queue_image_for_next_round(
77
78
  return True
78
79
 
79
80
 
81
+ def queue_images_for_next_round(
82
+ session_id: str | None,
83
+ images: Sequence[tuple[str, str]],
84
+ *,
85
+ note: str = "",
86
+ durable: bool = True,
87
+ ) -> int:
88
+ """Queue a BATCH as ONE user message: a single note + one attachment block per image.
89
+
90
+ Queuing them one by one produces N separate user turns, each repeating the note — three
91
+ screenshots asked about with one question became three copies of that question in the
92
+ transcript. A batch is one turn, which is also what the provider APIs expect.
93
+
94
+ ``images`` is ``[(path, ref)]``. Returns how many were accepted (0 = nothing queued, so the
95
+ caller must say so rather than claim the pictures were delivered).
96
+ """
97
+ if not session_id:
98
+ return 0
99
+ blocks: list[dict[str, Any]] = []
100
+ if note:
101
+ blocks.append({"type": "text", "text": note})
102
+ accepted = 0
103
+ for path, ref in images:
104
+ if not path:
105
+ continue
106
+ blocks.append({"type": "attachment", "attachment": _attachment_ref(path, ref=ref)})
107
+ accepted += 1
108
+ if not accepted:
109
+ return 0
110
+ with _lock:
111
+ queue = _pending.setdefault(session_id, [])
112
+ if len(queue) >= MAX_PENDING_PER_SESSION:
113
+ return 0
114
+ queue.append({"role": "user", "content": blocks, "__durable__": durable})
115
+ return accepted
116
+
117
+
80
118
  def drain_queued_images(session_id: str | None) -> tuple[list[LoopMessage], list[LoopMessage]]:
81
119
  """Take everything queued for this session (and clear it).
82
120
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: power-loop
3
- Version: 6.3.0
3
+ Version: 6.4.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