agent-session-bridge 0.2.2__tar.gz → 0.2.3__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 (83) hide show
  1. {agent_session_bridge-0.2.2/src/agent_session_bridge.egg-info → agent_session_bridge-0.2.3}/PKG-INFO +1 -1
  2. {agent_session_bridge-0.2.2 → agent_session_bridge-0.2.3}/pyproject.toml +1 -1
  3. {agent_session_bridge-0.2.2 → agent_session_bridge-0.2.3/src/agent_session_bridge.egg-info}/PKG-INFO +1 -1
  4. {agent_session_bridge-0.2.2 → agent_session_bridge-0.2.3}/src/session_bridge/writers/codex.py +28 -0
  5. {agent_session_bridge-0.2.2 → agent_session_bridge-0.2.3}/tests/test_codex_db.py +13 -0
  6. {agent_session_bridge-0.2.2 → agent_session_bridge-0.2.3}/LICENSE +0 -0
  7. {agent_session_bridge-0.2.2 → agent_session_bridge-0.2.3}/README.md +0 -0
  8. {agent_session_bridge-0.2.2 → agent_session_bridge-0.2.3}/setup.cfg +0 -0
  9. {agent_session_bridge-0.2.2 → agent_session_bridge-0.2.3}/src/agent_session_bridge.egg-info/SOURCES.txt +0 -0
  10. {agent_session_bridge-0.2.2 → agent_session_bridge-0.2.3}/src/agent_session_bridge.egg-info/dependency_links.txt +0 -0
  11. {agent_session_bridge-0.2.2 → agent_session_bridge-0.2.3}/src/agent_session_bridge.egg-info/entry_points.txt +0 -0
  12. {agent_session_bridge-0.2.2 → agent_session_bridge-0.2.3}/src/agent_session_bridge.egg-info/requires.txt +0 -0
  13. {agent_session_bridge-0.2.2 → agent_session_bridge-0.2.3}/src/agent_session_bridge.egg-info/top_level.txt +0 -0
  14. {agent_session_bridge-0.2.2 → agent_session_bridge-0.2.3}/src/session_bridge/__init__.py +0 -0
  15. {agent_session_bridge-0.2.2 → agent_session_bridge-0.2.3}/src/session_bridge/_ids.py +0 -0
  16. {agent_session_bridge-0.2.2 → agent_session_bridge-0.2.3}/src/session_bridge/cli.py +0 -0
  17. {agent_session_bridge-0.2.2 → agent_session_bridge-0.2.3}/src/session_bridge/convert.py +0 -0
  18. {agent_session_bridge-0.2.2 → agent_session_bridge-0.2.3}/src/session_bridge/handshake.py +0 -0
  19. {agent_session_bridge-0.2.2 → agent_session_bridge-0.2.3}/src/session_bridge/ir.py +0 -0
  20. {agent_session_bridge-0.2.2 → agent_session_bridge-0.2.3}/src/session_bridge/place.py +0 -0
  21. {agent_session_bridge-0.2.2 → agent_session_bridge-0.2.3}/src/session_bridge/readers/__init__.py +0 -0
  22. {agent_session_bridge-0.2.2 → agent_session_bridge-0.2.3}/src/session_bridge/readers/_content.py +0 -0
  23. {agent_session_bridge-0.2.2 → agent_session_bridge-0.2.3}/src/session_bridge/readers/_jsonl.py +0 -0
  24. {agent_session_bridge-0.2.2 → agent_session_bridge-0.2.3}/src/session_bridge/readers/_pending.py +0 -0
  25. {agent_session_bridge-0.2.2 → agent_session_bridge-0.2.3}/src/session_bridge/readers/claude_code.py +0 -0
  26. {agent_session_bridge-0.2.2 → agent_session_bridge-0.2.3}/src/session_bridge/readers/codex.py +0 -0
  27. {agent_session_bridge-0.2.2 → agent_session_bridge-0.2.3}/src/session_bridge/readers/hermes.py +0 -0
  28. {agent_session_bridge-0.2.2 → agent_session_bridge-0.2.3}/src/session_bridge/skill_install.py +0 -0
  29. {agent_session_bridge-0.2.2 → agent_session_bridge-0.2.3}/src/session_bridge/skills/session-handoff/SKILL.md +0 -0
  30. {agent_session_bridge-0.2.2 → agent_session_bridge-0.2.3}/src/session_bridge/tui/__init__.py +0 -0
  31. {agent_session_bridge-0.2.2 → agent_session_bridge-0.2.3}/src/session_bridge/tui/actions.py +0 -0
  32. {agent_session_bridge-0.2.2 → agent_session_bridge-0.2.3}/src/session_bridge/tui/app.py +0 -0
  33. {agent_session_bridge-0.2.2 → agent_session_bridge-0.2.3}/src/session_bridge/tui/discovery.py +0 -0
  34. {agent_session_bridge-0.2.2 → agent_session_bridge-0.2.3}/src/session_bridge/tui/options.py +0 -0
  35. {agent_session_bridge-0.2.2 → agent_session_bridge-0.2.3}/src/session_bridge/tui/register.py +0 -0
  36. {agent_session_bridge-0.2.2 → agent_session_bridge-0.2.3}/src/session_bridge/tui/screens.py +0 -0
  37. {agent_session_bridge-0.2.2 → agent_session_bridge-0.2.3}/src/session_bridge/tui/summary.py +0 -0
  38. {agent_session_bridge-0.2.2 → agent_session_bridge-0.2.3}/src/session_bridge/writers/__init__.py +0 -0
  39. {agent_session_bridge-0.2.2 → agent_session_bridge-0.2.3}/src/session_bridge/writers/_common.py +0 -0
  40. {agent_session_bridge-0.2.2 → agent_session_bridge-0.2.3}/src/session_bridge/writers/claude_code.py +0 -0
  41. {agent_session_bridge-0.2.2 → agent_session_bridge-0.2.3}/src/session_bridge/writers/codex_db.py +0 -0
  42. {agent_session_bridge-0.2.2 → agent_session_bridge-0.2.3}/src/session_bridge/writers/hermes.py +0 -0
  43. {agent_session_bridge-0.2.2 → agent_session_bridge-0.2.3}/src/session_bridge/writers/hermes_db.py +0 -0
  44. {agent_session_bridge-0.2.2 → agent_session_bridge-0.2.3}/tests/test_claude_reader.py +0 -0
  45. {agent_session_bridge-0.2.2 → agent_session_bridge-0.2.3}/tests/test_cli_tui.py +0 -0
  46. {agent_session_bridge-0.2.2 → agent_session_bridge-0.2.3}/tests/test_codex_reader.py +0 -0
  47. {agent_session_bridge-0.2.2 → agent_session_bridge-0.2.3}/tests/test_handshake_convert_cli.py +0 -0
  48. {agent_session_bridge-0.2.2 → agent_session_bridge-0.2.3}/tests/test_hermes_db.py +0 -0
  49. {agent_session_bridge-0.2.2 → agent_session_bridge-0.2.3}/tests/test_hermes_reader.py +0 -0
  50. {agent_session_bridge-0.2.2 → agent_session_bridge-0.2.3}/tests/test_ir.py +0 -0
  51. {agent_session_bridge-0.2.2 → agent_session_bridge-0.2.3}/tests/test_place.py +0 -0
  52. {agent_session_bridge-0.2.2 → agent_session_bridge-0.2.3}/tests/test_review_fixes.py +0 -0
  53. {agent_session_bridge-0.2.2 → agent_session_bridge-0.2.3}/tests/test_review_round11_fixes.py +0 -0
  54. {agent_session_bridge-0.2.2 → agent_session_bridge-0.2.3}/tests/test_review_round12_fixes.py +0 -0
  55. {agent_session_bridge-0.2.2 → agent_session_bridge-0.2.3}/tests/test_review_round13_fixes.py +0 -0
  56. {agent_session_bridge-0.2.2 → agent_session_bridge-0.2.3}/tests/test_review_round14_fixes.py +0 -0
  57. {agent_session_bridge-0.2.2 → agent_session_bridge-0.2.3}/tests/test_review_round16_fixes.py +0 -0
  58. {agent_session_bridge-0.2.2 → agent_session_bridge-0.2.3}/tests/test_review_round17_fixes.py +0 -0
  59. {agent_session_bridge-0.2.2 → agent_session_bridge-0.2.3}/tests/test_review_round18_fixes.py +0 -0
  60. {agent_session_bridge-0.2.2 → agent_session_bridge-0.2.3}/tests/test_review_round18b_fixes.py +0 -0
  61. {agent_session_bridge-0.2.2 → agent_session_bridge-0.2.3}/tests/test_review_round1_fixes.py +0 -0
  62. {agent_session_bridge-0.2.2 → agent_session_bridge-0.2.3}/tests/test_review_round21_fixes.py +0 -0
  63. {agent_session_bridge-0.2.2 → agent_session_bridge-0.2.3}/tests/test_review_round22_fixes.py +0 -0
  64. {agent_session_bridge-0.2.2 → agent_session_bridge-0.2.3}/tests/test_review_round25_fixes.py +0 -0
  65. {agent_session_bridge-0.2.2 → agent_session_bridge-0.2.3}/tests/test_review_round27_fixes.py +0 -0
  66. {agent_session_bridge-0.2.2 → agent_session_bridge-0.2.3}/tests/test_review_round28_fixes.py +0 -0
  67. {agent_session_bridge-0.2.2 → agent_session_bridge-0.2.3}/tests/test_review_round2_fixes.py +0 -0
  68. {agent_session_bridge-0.2.2 → agent_session_bridge-0.2.3}/tests/test_review_round3_fixes.py +0 -0
  69. {agent_session_bridge-0.2.2 → agent_session_bridge-0.2.3}/tests/test_review_round4_fixes.py +0 -0
  70. {agent_session_bridge-0.2.2 → agent_session_bridge-0.2.3}/tests/test_review_round5_fixes.py +0 -0
  71. {agent_session_bridge-0.2.2 → agent_session_bridge-0.2.3}/tests/test_review_round6_fixes.py +0 -0
  72. {agent_session_bridge-0.2.2 → agent_session_bridge-0.2.3}/tests/test_review_round7_fixes.py +0 -0
  73. {agent_session_bridge-0.2.2 → agent_session_bridge-0.2.3}/tests/test_review_round8_fixes.py +0 -0
  74. {agent_session_bridge-0.2.2 → agent_session_bridge-0.2.3}/tests/test_review_round9_fixes.py +0 -0
  75. {agent_session_bridge-0.2.2 → agent_session_bridge-0.2.3}/tests/test_skill_install.py +0 -0
  76. {agent_session_bridge-0.2.2 → agent_session_bridge-0.2.3}/tests/test_stub_open_calls.py +0 -0
  77. {agent_session_bridge-0.2.2 → agent_session_bridge-0.2.3}/tests/test_tui_actions.py +0 -0
  78. {agent_session_bridge-0.2.2 → agent_session_bridge-0.2.3}/tests/test_tui_discovery.py +0 -0
  79. {agent_session_bridge-0.2.2 → agent_session_bridge-0.2.3}/tests/test_tui_options.py +0 -0
  80. {agent_session_bridge-0.2.2 → agent_session_bridge-0.2.3}/tests/test_tui_pilot.py +0 -0
  81. {agent_session_bridge-0.2.2 → agent_session_bridge-0.2.3}/tests/test_tui_register.py +0 -0
  82. {agent_session_bridge-0.2.2 → agent_session_bridge-0.2.3}/tests/test_tui_summary.py +0 -0
  83. {agent_session_bridge-0.2.2 → agent_session_bridge-0.2.3}/tests/test_writers.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agent-session-bridge
3
- Version: 0.2.2
3
+ Version: 0.2.3
4
4
  Summary: Local-first cross-harness agent-session portability: export a live coding-agent session from one harness and resume it in another.
5
5
  Author: Prakash Chaudhary
6
6
  License: MIT
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "agent-session-bridge"
7
- version = "0.2.2"
7
+ version = "0.2.3"
8
8
  description = "Local-first cross-harness agent-session portability: export a live coding-agent session from one harness and resume it in another."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agent-session-bridge
3
- Version: 0.2.2
3
+ Version: 0.2.3
4
4
  Summary: Local-first cross-harness agent-session portability: export a live coding-agent session from one harness and resume it in another.
5
5
  Author: Prakash Chaudhary
6
6
  License: MIT
@@ -23,6 +23,16 @@ def _codex_role(role: Role) -> str:
23
23
 
24
24
 
25
25
  def _msg_payload(role: str, text: str) -> dict[str, Any]:
26
+ if role == "assistant":
27
+ # Codex's history reconstruction keeps assistant messages by channel
28
+ # phase; without this the resumed model sees only the user turns.
29
+ block_type = "output_text"
30
+ return {
31
+ "type": "message",
32
+ "role": role,
33
+ "content": [{"type": block_type, "text": text}],
34
+ "phase": "final_answer",
35
+ }
26
36
  # Assistant emits output_text; user/system emit input_text.
27
37
  block_type = "output_text" if role == "assistant" else "input_text"
28
38
  return {"type": "message", "role": role, "content": [{"type": block_type, "text": text}]}
@@ -173,5 +183,23 @@ def write_codex(
173
183
  },
174
184
  }
175
185
  )
186
+ elif msg.role is Role.ASSISTANT:
187
+ # Same twin discipline for assistant turns: the transcript view
188
+ # renders from event_msg records, so without agent_message events
189
+ # a resumed session displays as user-messages-only.
190
+ assistant_text = msg.text()
191
+ if assistant_text.strip():
192
+ records.append(
193
+ {
194
+ "timestamp": ts,
195
+ "type": "event_msg",
196
+ "payload": {
197
+ "type": "agent_message",
198
+ "message": assistant_text,
199
+ "phase": "final_answer",
200
+ "memory_citation": None,
201
+ },
202
+ }
203
+ )
176
204
 
177
205
  return records, report
@@ -343,6 +343,19 @@ def test_registration_matches_native_picker_requirements(tmp_path, monkeypatch):
343
343
  ]
344
344
  assert user_events, "picker requires an event_msg user_message in the rollout"
345
345
  assert user_events[0]["payload"]["message"].strip()
346
+ agent_events = [
347
+ r for r in records
348
+ if r.get("type") == "event_msg" and r["payload"].get("type") == "agent_message"
349
+ ]
350
+ assert agent_events, "transcript rendering requires agent_message events"
351
+ assistant_items = [
352
+ r for r in records
353
+ if r.get("type") == "response_item" and r["payload"].get("type") == "message"
354
+ and r["payload"].get("role") == "assistant"
355
+ ]
356
+ assert assistant_items and all(
357
+ i["payload"].get("phase") == "final_answer" for i in assistant_items
358
+ ), "history reconstruction drops assistant messages without a phase"
346
359
  conn = sqlite3.connect(home / "state_5.sqlite")
347
360
  row = dict(zip([c[0] for c in conn.execute("SELECT model, first_user_message, preview, cli_version FROM threads").description],
348
361
  conn.execute("SELECT model, first_user_message, preview, cli_version FROM threads").fetchone()))