webbee 0.2.1__tar.gz → 0.2.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.
- {webbee-0.2.1 → webbee-0.2.2}/CHANGELOG.md +8 -0
- {webbee-0.2.1 → webbee-0.2.2}/PKG-INFO +1 -1
- {webbee-0.2.1 → webbee-0.2.2}/pyproject.toml +1 -1
- webbee-0.2.2/src/webbee/__init__.py +1 -0
- {webbee-0.2.1 → webbee-0.2.2}/src/webbee/render.py +7 -0
- {webbee-0.2.1 → webbee-0.2.2}/src/webbee/session.py +3 -0
- {webbee-0.2.1 → webbee-0.2.2}/tests/test_marathon.py +11 -0
- webbee-0.2.1/src/webbee/__init__.py +0 -1
- {webbee-0.2.1 → webbee-0.2.2}/.github/workflows/publish.yml +0 -0
- {webbee-0.2.1 → webbee-0.2.2}/.gitignore +0 -0
- {webbee-0.2.1 → webbee-0.2.2}/LICENSE +0 -0
- {webbee-0.2.1 → webbee-0.2.2}/README.md +0 -0
- {webbee-0.2.1 → webbee-0.2.2}/install.sh +0 -0
- {webbee-0.2.1 → webbee-0.2.2}/src/webbee/account.py +0 -0
- {webbee-0.2.1 → webbee-0.2.2}/src/webbee/banner_art.py +0 -0
- {webbee-0.2.1 → webbee-0.2.2}/src/webbee/cli.py +0 -0
- {webbee-0.2.1 → webbee-0.2.2}/src/webbee/clipboard.py +0 -0
- {webbee-0.2.1 → webbee-0.2.2}/src/webbee/commands.py +0 -0
- {webbee-0.2.1 → webbee-0.2.2}/src/webbee/config.py +0 -0
- {webbee-0.2.1 → webbee-0.2.2}/src/webbee/details.py +0 -0
- {webbee-0.2.1 → webbee-0.2.2}/src/webbee/events.py +0 -0
- {webbee-0.2.1 → webbee-0.2.2}/src/webbee/frames.py +0 -0
- {webbee-0.2.1 → webbee-0.2.2}/src/webbee/intel/__init__.py +0 -0
- {webbee-0.2.1 → webbee-0.2.2}/src/webbee/intel/chunker.py +0 -0
- {webbee-0.2.1 → webbee-0.2.2}/src/webbee/intel/embed.py +0 -0
- {webbee-0.2.1 → webbee-0.2.2}/src/webbee/intel/graph.py +0 -0
- {webbee-0.2.1 → webbee-0.2.2}/src/webbee/intel/indexer.py +0 -0
- {webbee-0.2.1 → webbee-0.2.2}/src/webbee/intel/models.py +0 -0
- {webbee-0.2.1 → webbee-0.2.2}/src/webbee/intel/query.py +0 -0
- {webbee-0.2.1 → webbee-0.2.2}/src/webbee/intel/service.py +0 -0
- {webbee-0.2.1 → webbee-0.2.2}/src/webbee/intel/store.py +0 -0
- {webbee-0.2.1 → webbee-0.2.2}/src/webbee/intel/vectors.py +0 -0
- {webbee-0.2.1 → webbee-0.2.2}/src/webbee/intel/watch.py +0 -0
- {webbee-0.2.1 → webbee-0.2.2}/src/webbee/output_pane.py +0 -0
- {webbee-0.2.1 → webbee-0.2.2}/src/webbee/repl.py +0 -0
- {webbee-0.2.1 → webbee-0.2.2}/src/webbee/repo.py +0 -0
- {webbee-0.2.1 → webbee-0.2.2}/src/webbee/sessions.py +0 -0
- {webbee-0.2.1 → webbee-0.2.2}/src/webbee/stream.py +0 -0
- {webbee-0.2.1 → webbee-0.2.2}/src/webbee/tools.py +0 -0
- {webbee-0.2.1 → webbee-0.2.2}/src/webbee/tui.py +0 -0
- {webbee-0.2.1 → webbee-0.2.2}/src/webbee/update.py +0 -0
- {webbee-0.2.1 → webbee-0.2.2}/tests/__init__.py +0 -0
- {webbee-0.2.1 → webbee-0.2.2}/tests/test_account.py +0 -0
- {webbee-0.2.1 → webbee-0.2.2}/tests/test_cli.py +0 -0
- {webbee-0.2.1 → webbee-0.2.2}/tests/test_clipboard.py +0 -0
- {webbee-0.2.1 → webbee-0.2.2}/tests/test_commands.py +0 -0
- {webbee-0.2.1 → webbee-0.2.2}/tests/test_config.py +0 -0
- {webbee-0.2.1 → webbee-0.2.2}/tests/test_cpc_contract_stable.py +0 -0
- {webbee-0.2.1 → webbee-0.2.2}/tests/test_details.py +0 -0
- {webbee-0.2.1 → webbee-0.2.2}/tests/test_events.py +0 -0
- {webbee-0.2.1 → webbee-0.2.2}/tests/test_freeze_fix.py +0 -0
- {webbee-0.2.1 → webbee-0.2.2}/tests/test_intel_chunker.py +0 -0
- {webbee-0.2.1 → webbee-0.2.2}/tests/test_intel_embed.py +0 -0
- {webbee-0.2.1 → webbee-0.2.2}/tests/test_intel_graph.py +0 -0
- {webbee-0.2.1 → webbee-0.2.2}/tests/test_intel_indexer.py +0 -0
- {webbee-0.2.1 → webbee-0.2.2}/tests/test_intel_no_numpy.py +0 -0
- {webbee-0.2.1 → webbee-0.2.2}/tests/test_intel_query.py +0 -0
- {webbee-0.2.1 → webbee-0.2.2}/tests/test_intel_service.py +0 -0
- {webbee-0.2.1 → webbee-0.2.2}/tests/test_intel_store.py +0 -0
- {webbee-0.2.1 → webbee-0.2.2}/tests/test_intel_vectors.py +0 -0
- {webbee-0.2.1 → webbee-0.2.2}/tests/test_intel_watch.py +0 -0
- {webbee-0.2.1 → webbee-0.2.2}/tests/test_packaging.py +0 -0
- {webbee-0.2.1 → webbee-0.2.2}/tests/test_render.py +0 -0
- {webbee-0.2.1 → webbee-0.2.2}/tests/test_repl.py +0 -0
- {webbee-0.2.1 → webbee-0.2.2}/tests/test_repo.py +0 -0
- {webbee-0.2.1 → webbee-0.2.2}/tests/test_session.py +0 -0
- {webbee-0.2.1 → webbee-0.2.2}/tests/test_sessions.py +0 -0
- {webbee-0.2.1 → webbee-0.2.2}/tests/test_stream.py +0 -0
- {webbee-0.2.1 → webbee-0.2.2}/tests/test_tools.py +0 -0
- {webbee-0.2.1 → webbee-0.2.2}/tests/test_tui.py +0 -0
- {webbee-0.2.1 → webbee-0.2.2}/tests/test_tui_hardening.py +0 -0
- {webbee-0.2.1 → webbee-0.2.2}/tests/test_update.py +0 -0
- {webbee-0.2.1 → webbee-0.2.2}/tests/test_version.py +0 -0
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.2.2
|
|
4
|
+
|
|
5
|
+
- **See Webbee's reasoning as a distinct 💭 block.** Before each step, Webbee now
|
|
6
|
+
shows a genuine line of thinking — what it's weighing and why — rendered as its
|
|
7
|
+
own 💭 block, separate from status lines. Works on every model.
|
|
8
|
+
- **SSH steps are visible.** When Webbee runs a command on one of your connected
|
|
9
|
+
servers, the terminal now shows that step (command + result), like any other.
|
|
10
|
+
|
|
3
11
|
## 0.2.1
|
|
4
12
|
|
|
5
13
|
- **Fixes a marathon that could hang on "working" and quietly burn credits.** A
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "0.2.2"
|
|
@@ -325,6 +325,13 @@ class RichSink:
|
|
|
325
325
|
self.console.print(Text(" " + text, style="dim italic"))
|
|
326
326
|
self._nudge()
|
|
327
327
|
|
|
328
|
+
def thinking(self, text: str) -> None:
|
|
329
|
+
# System-driven reasoning as a distinct 💭 block — visually apart from the
|
|
330
|
+
# dim `progress` line (which stays reserved for status like low-balance).
|
|
331
|
+
if text:
|
|
332
|
+
self.console.print(Text(" 💭 " + text, style="italic medium_purple3"))
|
|
333
|
+
self._nudge()
|
|
334
|
+
|
|
328
335
|
def plan_blocked(self, tool: str) -> None:
|
|
329
336
|
"""Plan mode auto-declines writes/destructive. Tell the user WHY and how
|
|
330
337
|
to allow it (Shift+Tab). Autopilot and default never reach this."""
|
|
@@ -272,6 +272,9 @@ class AgentSession:
|
|
|
272
272
|
elif ftype == "step_finished": # v2 (Slice-5 T8 dual-emit)
|
|
273
273
|
handle_step_finished(frame, sink, finished, step_labels, self.steps, local_ids)
|
|
274
274
|
|
|
275
|
+
elif ftype == "thinking": # system-driven reasoning -> the 💭 block
|
|
276
|
+
(getattr(sink, "thinking", None) or sink.progress)(_progress_text(frame))
|
|
277
|
+
|
|
275
278
|
elif ftype == "progress": # P2 — dual-reads llm_text (v2) / text (legacy)
|
|
276
279
|
sink.progress(_progress_text(frame))
|
|
277
280
|
|
|
@@ -154,6 +154,7 @@ def _run_marathon_capture_post(monkeypatch, tmp_path, goal="build X", frames=Non
|
|
|
154
154
|
class NoteSink:
|
|
155
155
|
def __init__(self): self.notes = []
|
|
156
156
|
def note(self, msg): self.notes.append(msg)
|
|
157
|
+
def thinking(self, msg): self.thinks = getattr(self, "thinks", []) + [msg]
|
|
157
158
|
def tool_start(self, *a): ...
|
|
158
159
|
def tool_result(self, *a): ...
|
|
159
160
|
def ask_consent(self, *a): return "y"
|
|
@@ -202,6 +203,16 @@ def test_marathon_complete_is_terminal(monkeypatch, tmp_path):
|
|
|
202
203
|
assert result == "goal done"
|
|
203
204
|
|
|
204
205
|
|
|
206
|
+
def test_thinking_frame_renders_as_distinct_channel(monkeypatch, tmp_path):
|
|
207
|
+
# A `thinking` frame routes to the distinct 💭 reasoning channel
|
|
208
|
+
# (sink.thinking), NOT the plain progress/note lines.
|
|
209
|
+
_, _, sink = _run_marathon_capture_post(monkeypatch, tmp_path, frames=[
|
|
210
|
+
{"type": "thinking", "task_id": "OURS", "text": "assessing the repo before editing"},
|
|
211
|
+
{"type": "marathon_complete", "task_id": "OURS", "text": "done"},
|
|
212
|
+
])
|
|
213
|
+
assert getattr(sink, "thinks", []) == ["assessing the repo before editing"]
|
|
214
|
+
|
|
215
|
+
|
|
205
216
|
def test_marathon_paused_is_terminal_and_noted(monkeypatch, tmp_path):
|
|
206
217
|
_, result, sink = _run_marathon_capture_post(monkeypatch, tmp_path, frames=[
|
|
207
218
|
{"type": "marathon_paused", "task_id": "OURS", "reason": "out of credits"},
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
__version__ = "0.2.1"
|
|
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
|