agent-pbx 2.2.0__tar.gz → 2.3.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 (214) hide show
  1. {agent_pbx-2.2.0/src/agent_pbx.egg-info → agent_pbx-2.3.0}/PKG-INFO +378 -19
  2. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/README.md +377 -18
  3. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/pyproject.toml +4 -0
  4. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/src/agent_pbx/__init__.py +1 -1
  5. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/src/agent_pbx/agent.py +20 -1
  6. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/src/agent_pbx/api.py +2202 -25
  7. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/src/agent_pbx/cli.py +52 -1
  8. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/src/agent_pbx/codex/event_bridge.py +58 -21
  9. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/src/agent_pbx/codex/models.py +3 -0
  10. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/src/agent_pbx/codex/runtime.py +135 -21
  11. agent_pbx-2.3.0/src/agent_pbx/codex_launch.py +121 -0
  12. agent_pbx-2.3.0/src/agent_pbx/config.py +160 -0
  13. agent_pbx-2.3.0/src/agent_pbx/demo/capture.py +218 -0
  14. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/src/agent_pbx/demo/contract.py +3 -2
  15. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/src/agent_pbx/demo/fake_codex.py +6 -2
  16. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/src/agent_pbx/demo/fixtures.py +32 -3
  17. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/src/agent_pbx/demo/policy.py +10 -0
  18. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/src/agent_pbx/demo/session.py +347 -27
  19. agent_pbx-2.3.0/src/agent_pbx/demo/web.py +937 -0
  20. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/src/agent_pbx/doctor.py +458 -2
  21. agent_pbx-2.3.0/src/agent_pbx/git_broker.py +3405 -0
  22. agent_pbx-2.3.0/src/agent_pbx/git_worktree.py +806 -0
  23. agent_pbx-2.3.0/src/agent_pbx/host_process_evidence.py +251 -0
  24. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/src/agent_pbx/joplin.py +254 -4
  25. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/src/agent_pbx/lifecycle.py +217 -7
  26. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/src/agent_pbx/managed_runtime.py +144 -9
  27. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/src/agent_pbx/mcp_daemon.py +206 -0
  28. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/src/agent_pbx/mcp_tools.py +358 -27
  29. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/src/agent_pbx/migration.py +1 -0
  30. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/src/agent_pbx/operator.py +1245 -43
  31. agent_pbx-2.3.0/src/agent_pbx/operator_actions.py +182 -0
  32. agent_pbx-2.3.0/src/agent_pbx/operator_authority.py +1036 -0
  33. agent_pbx-2.3.0/src/agent_pbx/operator_broker.py +690 -0
  34. agent_pbx-2.3.0/src/agent_pbx/operator_delegation.py +447 -0
  35. agent_pbx-2.3.0/src/agent_pbx/project_spawn.py +189 -0
  36. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/src/agent_pbx/runtime_tmux.py +33 -0
  37. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/src/agent_pbx/schemas.py +416 -0
  38. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/src/agent_pbx/setup_assistant.py +8 -0
  39. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/src/agent_pbx/store.py +3844 -193
  40. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/src/agent_pbx/terminal/widget.py +18 -3
  41. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/src/agent_pbx/tmux.py +81 -1
  42. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/src/agent_pbx/tui.py +10193 -698
  43. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/src/agent_pbx/ui/runtime.py +47 -3
  44. agent_pbx-2.3.0/src/agent_pbx/workerbee_access.py +423 -0
  45. agent_pbx-2.3.0/src/agent_pbx/workerbee_controlled_run.py +772 -0
  46. agent_pbx-2.3.0/src/agent_pbx/workerbee_controlled_run_executor.py +485 -0
  47. agent_pbx-2.3.0/src/agent_pbx/workerbee_direct_bind.py +794 -0
  48. agent_pbx-2.3.0/src/agent_pbx/workerbee_gateway.py +1221 -0
  49. agent_pbx-2.3.0/src/agent_pbx/workerbee_materializer.py +413 -0
  50. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/src/agent_pbx/workerbee_mcp.py +26 -0
  51. agent_pbx-2.3.0/src/agent_pbx/workerbee_modes.py +474 -0
  52. agent_pbx-2.3.0/src/agent_pbx/workerbee_policy.py +834 -0
  53. agent_pbx-2.3.0/src/agent_pbx/workerbee_runtime.py +243 -0
  54. agent_pbx-2.3.0/src/agent_pbx/workerbee_snapshot_policy.py +904 -0
  55. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/src/agent_pbx/workerbee_switcher.py +331 -28
  56. agent_pbx-2.3.0/src/agent_pbx/workerbee_workspace.py +1101 -0
  57. {agent_pbx-2.2.0 → agent_pbx-2.3.0/src/agent_pbx.egg-info}/PKG-INFO +378 -19
  58. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/src/agent_pbx.egg-info/SOURCES.txt +37 -0
  59. agent_pbx-2.3.0/src/agent_pbx.egg-info/entry_points.txt +7 -0
  60. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/tests/test_agent_instructions.py +2 -0
  61. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/tests/test_codex_event_bridge.py +67 -1
  62. agent_pbx-2.3.0/tests/test_codex_launch.py +56 -0
  63. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/tests/test_codex_profiles.py +109 -0
  64. agent_pbx-2.3.0/tests/test_demo_capture.py +114 -0
  65. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/tests/test_docs.py +27 -0
  66. agent_pbx-2.3.0/tests/test_doctor.py +462 -0
  67. agent_pbx-2.3.0/tests/test_git_broker.py +2202 -0
  68. agent_pbx-2.3.0/tests/test_git_worktree.py +1097 -0
  69. agent_pbx-2.3.0/tests/test_host_process_evidence.py +297 -0
  70. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/tests/test_joplin.py +490 -1
  71. agent_pbx-2.3.0/tests/test_lifecycle.py +654 -0
  72. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/tests/test_managed_runtime.py +57 -2
  73. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/tests/test_mcp_daemon.py +129 -0
  74. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/tests/test_mcp_tools.py +328 -1
  75. agent_pbx-2.3.0/tests/test_migration.py +361 -0
  76. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/tests/test_operator.py +621 -1
  77. agent_pbx-2.3.0/tests/test_operator_authority.py +546 -0
  78. agent_pbx-2.3.0/tests/test_operator_broker.py +641 -0
  79. agent_pbx-2.3.0/tests/test_operator_delegation.py +640 -0
  80. agent_pbx-2.3.0/tests/test_project_spawn.py +115 -0
  81. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/tests/test_public_demo_fixtures.py +29 -0
  82. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/tests/test_public_demo_policy.py +50 -0
  83. agent_pbx-2.3.0/tests/test_public_demo_session.py +327 -0
  84. agent_pbx-2.3.0/tests/test_public_demo_web.py +350 -0
  85. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/tests/test_remote.py +2 -1
  86. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/tests/test_runtime_tmux.py +56 -0
  87. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/tests/test_runtime_ux.py +125 -1
  88. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/tests/test_setup_assistant.py +27 -0
  89. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/tests/test_store.py +170 -0
  90. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/tests/test_terminal.py +23 -2
  91. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/tests/test_tmux.py +87 -2
  92. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/tests/test_tui.py +7231 -750
  93. agent_pbx-2.3.0/tests/test_workerbee_access.py +150 -0
  94. agent_pbx-2.3.0/tests/test_workerbee_controlled_run.py +782 -0
  95. agent_pbx-2.3.0/tests/test_workerbee_gateway.py +1965 -0
  96. agent_pbx-2.3.0/tests/test_workerbee_materializer.py +172 -0
  97. agent_pbx-2.3.0/tests/test_workerbee_modes.py +254 -0
  98. agent_pbx-2.3.0/tests/test_workerbee_policy.py +243 -0
  99. agent_pbx-2.3.0/tests/test_workerbee_runtime.py +58 -0
  100. agent_pbx-2.3.0/tests/test_workerbee_snapshot_policy.py +215 -0
  101. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/tests/test_workerbee_switcher.py +224 -7
  102. agent_pbx-2.3.0/tests/test_workerbee_workspace.py +1134 -0
  103. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/tests/test_workflow.py +257 -0
  104. agent_pbx-2.2.0/src/agent_pbx/config.py +0 -58
  105. agent_pbx-2.2.0/src/agent_pbx/demo/web.py +0 -353
  106. agent_pbx-2.2.0/src/agent_pbx/project_spawn.py +0 -61
  107. agent_pbx-2.2.0/src/agent_pbx.egg-info/entry_points.txt +0 -3
  108. agent_pbx-2.2.0/tests/test_doctor.py +0 -198
  109. agent_pbx-2.2.0/tests/test_lifecycle.py +0 -247
  110. agent_pbx-2.2.0/tests/test_migration.py +0 -176
  111. agent_pbx-2.2.0/tests/test_project_spawn.py +0 -39
  112. agent_pbx-2.2.0/tests/test_public_demo_session.py +0 -94
  113. agent_pbx-2.2.0/tests/test_public_demo_web.py +0 -171
  114. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/LICENSE +0 -0
  115. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/setup.cfg +0 -0
  116. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/src/agent_pbx/__main__.py +0 -0
  117. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/src/agent_pbx/agent_adoption.py +0 -0
  118. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/src/agent_pbx/auth.py +0 -0
  119. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/src/agent_pbx/client.py +0 -0
  120. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/src/agent_pbx/codex/__init__.py +0 -0
  121. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/src/agent_pbx/codex/adapter.py +0 -0
  122. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/src/agent_pbx/codex/capabilities.py +0 -0
  123. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/src/agent_pbx/codex/profiles.py +0 -0
  124. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/src/agent_pbx/codex/protocol.py +0 -0
  125. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/src/agent_pbx/codex/sessions.py +0 -0
  126. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/src/agent_pbx/codex/skills.py +0 -0
  127. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/src/agent_pbx/codex/state.py +0 -0
  128. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/src/agent_pbx/codex_cli.py +0 -0
  129. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/src/agent_pbx/codex_config.py +0 -0
  130. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/src/agent_pbx/codex_sessions.py +0 -0
  131. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/src/agent_pbx/codex_theme.py +0 -0
  132. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/src/agent_pbx/compat.py +0 -0
  133. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/src/agent_pbx/contracts.py +0 -0
  134. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/src/agent_pbx/debug_smoke.py +0 -0
  135. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/src/agent_pbx/demo/__init__.py +0 -0
  136. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/src/agent_pbx/demo/fake_github.py +0 -0
  137. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/src/agent_pbx/demo/fake_joplin.py +0 -0
  138. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/src/agent_pbx/demo/fake_workerbee.py +0 -0
  139. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/src/agent_pbx/dev_harness.py +0 -0
  140. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/src/agent_pbx/envfile.py +0 -0
  141. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/src/agent_pbx/events.py +0 -0
  142. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/src/agent_pbx/files.py +0 -0
  143. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/src/agent_pbx/issues.py +0 -0
  144. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/src/agent_pbx/pairing.py +0 -0
  145. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/src/agent_pbx/paths.py +0 -0
  146. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/src/agent_pbx/polling.py +0 -0
  147. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/src/agent_pbx/pull_requests.py +0 -0
  148. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/src/agent_pbx/remote.py +0 -0
  149. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/src/agent_pbx/security.py +0 -0
  150. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/src/agent_pbx/sim_agent.py +0 -0
  151. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/src/agent_pbx/sim_client.py +0 -0
  152. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/src/agent_pbx/skill_packs/agent-pbx-base/SKILL.md +0 -0
  153. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/src/agent_pbx/skill_packs/agent-role/SKILL.md +0 -0
  154. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/src/agent_pbx/skill_packs/operator-role/SKILL.md +0 -0
  155. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/src/agent_pbx/skill_packs/review-role/SKILL.md +0 -0
  156. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/src/agent_pbx/skill_packs/roses-architect/SKILL.md +0 -0
  157. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/src/agent_pbx/terminal/__init__.py +0 -0
  158. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/src/agent_pbx/terminal/conformance.py +0 -0
  159. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/src/agent_pbx/terminal/keys.py +0 -0
  160. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/src/agent_pbx/terminal/pty.py +0 -0
  161. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/src/agent_pbx/terminal/screen.py +0 -0
  162. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/src/agent_pbx/terminal_editor.py +0 -0
  163. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/src/agent_pbx/tmux_binary.py +0 -0
  164. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/src/agent_pbx/transcript.py +0 -0
  165. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/src/agent_pbx/tui_cli.py +0 -0
  166. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/src/agent_pbx/uat.py +0 -0
  167. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/src/agent_pbx/ui/__init__.py +0 -0
  168. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/src/agent_pbx/ui/actions.py +0 -0
  169. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/src/agent_pbx/ui/async_jobs.py +0 -0
  170. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/src/agent_pbx/ui/focus.py +0 -0
  171. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/src/agent_pbx/ui/navigation.py +0 -0
  172. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/src/agent_pbx/ui/palette_history.py +0 -0
  173. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/src/agent_pbx/ui/panels/__init__.py +0 -0
  174. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/src/agent_pbx/ui/panels/editor.py +0 -0
  175. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/src/agent_pbx/ui/panels/joplin.py +0 -0
  176. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/src/agent_pbx/ui/panels/operators.py +0 -0
  177. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/src/agent_pbx/ui/theme.py +0 -0
  178. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/src/agent_pbx/wiki_publish.py +0 -0
  179. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/src/agent_pbx/workerbee.py +0 -0
  180. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/src/agent_pbx/workerbee_harness.py +0 -0
  181. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/src/agent_pbx.egg-info/dependency_links.txt +0 -0
  182. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/src/agent_pbx.egg-info/requires.txt +0 -0
  183. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/src/agent_pbx.egg-info/top_level.txt +0 -0
  184. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/tests/test_agent_adoption.py +0 -0
  185. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/tests/test_auth_pairing.py +0 -0
  186. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/tests/test_codex_adapter.py +0 -0
  187. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/tests/test_codex_cli.py +0 -0
  188. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/tests/test_codex_config.py +0 -0
  189. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/tests/test_codex_sessions.py +0 -0
  190. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/tests/test_codex_theme.py +0 -0
  191. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/tests/test_compat.py +0 -0
  192. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/tests/test_contracts.py +0 -0
  193. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/tests/test_debug_smoke.py +0 -0
  194. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/tests/test_demo_codex.py +0 -0
  195. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/tests/test_dev_harness.py +0 -0
  196. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/tests/test_events.py +0 -0
  197. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/tests/test_health.py +0 -0
  198. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/tests/test_issues.py +0 -0
  199. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/tests/test_navigation.py +0 -0
  200. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/tests/test_palette_history.py +0 -0
  201. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/tests/test_polling.py +0 -0
  202. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/tests/test_pull_requests.py +0 -0
  203. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/tests/test_readme.py +0 -0
  204. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/tests/test_release_packaging.py +0 -0
  205. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/tests/test_release_validation.py +0 -0
  206. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/tests/test_terminal_editor.py +0 -0
  207. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/tests/test_tmux_binary.py +0 -0
  208. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/tests/test_tui_cli.py +0 -0
  209. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/tests/test_uat.py +0 -0
  210. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/tests/test_ui_controllers.py +0 -0
  211. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/tests/test_wiki_publish.py +0 -0
  212. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/tests/test_workerbee.py +0 -0
  213. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/tests/test_workerbee_harness.py +0 -0
  214. {agent_pbx-2.2.0 → agent_pbx-2.3.0}/tests/test_workerbee_mcp.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: agent-pbx
3
- Version: 2.2.0
3
+ Version: 2.3.0
4
4
  Summary: Runtime-grounded control plane for durable Codex Agent and Operator sessions.
5
5
  Author: Agent PBX contributors
6
6
  License-Expression: Apache-2.0
@@ -109,7 +109,7 @@ origin policy, and versioned product-site contract.
109
109
 
110
110
  See [the architecture overview](https://github.com/m4xx3d0ut/agent-pbx/blob/dev/docs/architecture.md),
111
111
  [the project wiki](https://github.com/m4xx3d0ut/agent-pbx/wiki),
112
- [the v2.2 release notes](https://github.com/m4xx3d0ut/agent-pbx/blob/dev/docs/releases/v2.2.0.md), and
112
+ [the v2.3.0 release notes](https://github.com/m4xx3d0ut/agent-pbx/blob/dev/docs/releases/v2.3.0.md), and
113
113
  [the accepted architecture decisions](https://github.com/m4xx3d0ut/agent-pbx/blob/dev/docs/adr/README.md) for the complete
114
114
  control-plane and compatibility boundaries.
115
115
 
@@ -471,7 +471,9 @@ Campaign state is stored in dedicated SQLite tables for fast TUI/API queries:
471
471
  `operator_campaign_events`. Fork state and optional planning DAG links are
472
472
  stored in `operator_forks` and `operator_fork_edges`. Knowledge-link context is
473
473
  stored in `operator_knowledge_links` and `operator_knowledge_turns`; executable
474
- operator-to-operator handoffs are stored in `operator_handoffs`. Handoffs track
474
+ operator-to-operator handoffs are stored in `operator_handoffs`; durable
475
+ source-addressed terminal receipts are stored in
476
+ `operator_handoff_completion_deliveries`. Handoffs track
475
477
  approval, required target fork launch, delivery evidence, receiver
476
478
  acknowledgement, started/running state, TTL expiry, artifact summaries, and
477
479
  terminal status without creating fork edges or changing source-session
@@ -524,16 +526,67 @@ should provide needed domain context through the first prompt, KB context, or a
524
526
  knowledge handoff. Set `AGENT_PBX_TUI_REVIEW_FORK_LAUNCH_MODE=fresh_context`
525
527
  to skip transcript continuation for new review forks.
526
528
 
529
+ Linked Git worktrees receive one additional launch preflight for trusted
530
+ default/edit forks. Agent PBX validates the canonical checkout, `.git`
531
+ indirection and reverse backpointer, per-worktree admin directory, common object
532
+ database, attached local branch, ownership, symlink posture, and approved-root
533
+ boundary. A qualifying branch must use a dedicated namespace such as
534
+ `pbx-operator-N/<fork-id>` with no sibling refs in that namespace. For a simple
535
+ compatible base profile, the generated Codex permission profile adds write
536
+ access only to the active worktree admin directory, shared object database, and
537
+ that branch's dedicated ref/reflog directories. These are sandbox filesystem
538
+ grants, never Codex workspace roots or `--add-dir` inputs. The profile never
539
+ grants the common `.git` root, sibling worktree admin directories,
540
+ configuration, or hooks. Standalone repositories and non-Git projects retain
541
+ their existing behavior; review/read-only forks never receive this profile.
542
+
543
+ Codex 0.166 cannot safely compose those direct writes with a base profile that
544
+ contains split secret/read/deny filesystem rules. Agent PBX does not flatten or
545
+ weaken that policy. Instead, a stopped, inactive edit fork can use the local
546
+ TUI's root-confirmed `/operator git commit` action. The broker accepts an exact
547
+ enumerated leaf subset—never add-all—shows each leaf's state, mode, raw SHA-256,
548
+ raw Git blob OID, and prior index identity, then binds confirmation to the
549
+ transaction, branch, HEAD/tree/index, upstream, ref, and reflog receipt. It
550
+ commits the approved raw bytes without clean filters while leaving unapproved
551
+ dirty paths unenumerated and unopened. The fork remains stopped after commit.
552
+
553
+ The broker uses a private crash journal and object quarantine. Ref, index, and
554
+ reflog changes are compare-and-swap guarded and exactly completed or restored
555
+ when their recorded identities still match. A failed transaction can leave
556
+ only the journaled immutable Git objects derived from the approved blobs, tree,
557
+ and commit; they remain unreachable and are left for normal Git garbage
558
+ collection because deleting shared objects during rollback is unsafe. Use
559
+ `/operator git recover` after a TUI/process interruption. Ambiguous, detached,
560
+ bare, malformed, symlinked, unapproved, partial-clone/promisor, object-alternate,
561
+ external-config-include, staged, sparse/split-index, or unmerged topologies fail
562
+ before mutation. Broker execution is unavailable through HTTP, API, or MCP and
563
+ is never an alternate commit path for direct-compatible forks.
564
+
565
+ The broker validates Git indexes structurally rather than scanning arbitrary
566
+ index bytes for extension names. It parses supported `DIRC` v2-v4 entries using
567
+ the repository's SHA-1 or SHA-256 object-ID width, verifies pathname and padding
568
+ boundaries plus the trailing checksum, and then parses the actual extension
569
+ table. Ordinary path or object data containing `link` or `sdir` is safe; real
570
+ split/sparse extensions, unknown mandatory extensions, malformed layouts, and
571
+ ambiguous boundaries still fail closed.
572
+
527
573
  Review forks should treat the source checkout as read-only and write only under
528
574
  their configured `work_root`. If a finding requires edits in the source repo,
529
575
  route it with `pbx_operator_route_review_escalation` so the root operator or an
530
576
  idle default/edit fork can handle it. If review work needs a new sibling
531
577
  project, call `pbx_operator_request_project_spawn` with the project name,
532
578
  instructions, and `mode` of `empty` or `clone_source`. The TUI/root operator
533
- approves the oldest pending request with `Spawn P` or `/operator project spawn`;
534
- Agent PBX then creates the sibling project at the same parent depth as the
535
- source repo, starts a normal tmux caller Codex session there, and attaches it to
536
- the Agents pane when it registers.
579
+ inspects the oldest pending request with `/operator project spawn inspect`, can
580
+ cancel it without launching through `/operator project spawn cancel`, and
581
+ approves it with `Spawn P` or `/operator project spawn`. Agent PBX validates the
582
+ source and target before accepting the request and revalidates immediately
583
+ before approval. A non-empty target is never copied over or initialized; select
584
+ another empty sibling target or use the managed workspace launcher for an
585
+ existing canonical Git repository. `clone_source` requires the review source to
586
+ be the canonical Git root, and an explicit `metadata.repo_root` must match it.
587
+ After validation, Agent PBX creates the sibling project, starts a normal tmux
588
+ caller Codex session there, records its exact runtime mapping, and attaches it
589
+ to the Agents pane when it registers.
537
590
 
538
591
  If review work needs to transfer domain context to another operator, the review
539
592
  fork can call `pbx_operator_propose_knowledge_handoff` with the source review
@@ -549,7 +602,16 @@ The root operator/TUI uses
549
602
  `/operator handoffs` to inspect pending handoffs and
550
603
  `/operator handoff preflight` to dry-run pane readiness, queue/nohup routing,
551
604
  required target-fork state, and attached KB context without sending anything.
552
- Use `/operator handoff approve` to approve the oldest pending handoff. If the
605
+ Use `/operator handoff approve` to open the durable handoff approval center.
606
+ It lists pending requests by immutable handoff ID, preflights the selected IDs,
607
+ and requires an explicit confirmation before delivery. `Cancel selected`
608
+ withdraws source-owned `proposed`, `approved`, or `pending_launch` requests
609
+ without deleting their records. Cancellation requires a reason, records the
610
+ prior state and actor in handoff metadata and the event journal, and requires
611
+ replacement handoff IDs when the reason is `superseded`. It fails closed once
612
+ delivery, acknowledgement, or execution has started. The top banner reports
613
+ `APPROVALS N` until the underlying records leave a pending state; reading the
614
+ Operator's latest report does not clear this approval alert. If the
553
615
  target operator needs a caller fork that has not been launched, the handoff
554
616
  moves to `pending_launch`; use `/operator handoff launch` to launch the
555
617
  required fork and retry delivery. Agent PBX then sends a normal `send_input`
@@ -566,6 +628,76 @@ success by itself. Tmux evidence records the resolved pane, target command,
566
628
  paste/send-key steps, and whether the target looked Codex-like; `submitted` is
567
629
  only true for a Codex-like target.
568
630
 
631
+ A terminal handoff update creates one idempotent completion receipt for the
632
+ exact source root Operator or source fork. The Operators pane keeps semantic
633
+ `State` and `Flow` separate from tmux `Live`; pending results appear as
634
+ `⇠ REVIEW` with an `RCPT` marker. The top banner reports `RECEIPTS N`, and F8
635
+ opens the completion center after pending approvals and before guarded actions.
636
+ Reviewing and acknowledging a receipt stops retry/attention state without
637
+ changing the completed, failed, blocked, or canceled handoff. Nohup recipients
638
+ receive an exact queued command. Report-mode terminal injection requires an
639
+ exact managed runtime mapping or recorded pane; otherwise the durable receipt
640
+ remains pending rather than using global pane discovery.
641
+
642
+ New executable handoffs should also include a machine-readable
643
+ `execution_scope`. It records an `action_class`, `mutation_mode`, campaign and
644
+ workspace-set identity, allowed roots, exact paths, and explicit denied actions.
645
+ The `exact_git_commit_broker` class additionally requires the expected Git
646
+ parent and exact commit subject. An optional ordered `expected_git_parents`
647
+ list supports an exact merge commit; its first entry must equal the stopped
648
+ fork's HEAD, every entry must be a complete unique commit object ID, and the
649
+ broker verifies the order before and after writing the commit. Multi-parent
650
+ requests also require an `expected_git_tree`; the broker reconstructs that tree
651
+ from the approved raw-byte path set and refuses a mismatch before changing the
652
+ index or branch. Active merge, cherry-pick, revert, rebase, bisect, or sequencer
653
+ state is rejected. Requests that omit the list retain the original
654
+ single-parent behavior. Absolute or parent-traversing path entries are rejected.
655
+ The legacy free-form
656
+ `allowed_mutation_scope` remains readable but is never sufficient for delegated
657
+ approval.
658
+
659
+ The public/default broker flow remains guided: the TUI exposes one reviewed
660
+ stop, broker, resume, or validation step at a time. A dedicated single-user
661
+ host may enable root-supervised checkpoints. A root Operator can then create a
662
+ durable request for its own activated Trusted Workbench edit fork. The local
663
+ TUI revalidates the exact handoff and campaign, stops the managed fork, commits
664
+ only the pinned paths with the pinned parent and subject, resumes the same Codex
665
+ session, and returns an auditable receipt. Root validation remains a separate
666
+ step. Edit and review forks are not given the request tools, remote observers
667
+ cannot control it, and the executor endpoints accept only loopback clients.
668
+ The normal controller bearer remains an administrator credential and must not
669
+ be exposed to untrusted processes.
670
+
671
+ ```bash
672
+ export AGENT_PBX_OPERATOR_BROKER_MODE="guided" # guided|root_operator|disabled
673
+ export AGENT_PBX_OPERATOR_BROKER_CONTROL_MODE="editable" # editable|read_only|hidden
674
+ export AGENT_PBX_OPERATOR_BROKER_REQUEST_TTL_SECONDS="900"
675
+ export AGENT_PBX_OPERATOR_BROKER_MAX_IN_FLIGHT="1"
676
+ ```
677
+
678
+ `root_operator` is intentionally a local administrator choice; it is not the
679
+ committed default. Requests survive TUI replacement, use a bounded executor
680
+ lease, recover commit evidence from durable action receipts, and fail closed on
681
+ scope, workspace, session, pane, Git parent, or path drift.
682
+
683
+ The committed default remains manual approval. On a trusted local workstation,
684
+ the approval center's `Trust & approve` action can grant a one-hour,
685
+ use-limited campaign lease and approve the selected structured handoffs. Source
686
+ and target Operators must share the same activated `trusted-workbench`
687
+ workspace-set digest. The lease is pinned to the selected source-owned
688
+ campaigns, targets, action classes, roots, and exact paths. Matching future
689
+ handoffs may then pass preflight and deliver without another modal. Legacy or
690
+ unstructured handoffs are rejected before the lease confirmation and remain
691
+ eligible for one-time `Approve selected`; create a structured successor when
692
+ future automatic approval is required. Agent PBX preflights every selected
693
+ handoff before creating the lease and revokes or rejects an incomplete lease
694
+ when activation fails.
695
+ Credentials, provider/cloud operations, deployment, publication, push, tag,
696
+ release, repository/worktree/fork creation, workspace expansion, authority
697
+ elevation, destructive mutation, and unstructured legacy requests always stay
698
+ manual. Leases are audited, expire automatically, have a bounded use count,
699
+ and can be revoked through the controller API.
700
+
569
701
  When a knowledge link or handoff produces reusable operating guidance, review
570
702
  forks and operators can propose KB entries with `pbx_operator_kb_propose` or
571
703
  `pbx_operator_kb_propose_from_link`. Proposed entries stay scoped to the
@@ -646,6 +778,11 @@ not receive a review task during creation. When the review fork requests a
646
778
  sibling project, select the operator and use
647
779
  `Spawn P` or `/operator project spawn`; the spawned project should then appear
648
780
  as a normal caller in the Agents pane after its Codex session registers. When a
781
+ request is obsolete or points at pre-existing work, use
782
+ `/operator project spawn inspect` followed by
783
+ `/operator project spawn cancel`; cancellation is idempotent and does not touch
784
+ the target. Existing-workspace adoption remains the `F10` managed-launch path
785
+ rather than a project-spawn mode in this release candidate. When a
649
786
  review fork proposes a knowledge handoff, select the logical operator and run
650
787
  `/operator handoffs` to inspect workflow state, `/operator handoff preflight`
651
788
  to verify the target route, `/operator handoff approve` to approve delivery,
@@ -767,14 +904,182 @@ export AGENT_PBX_WORKERBEE_SWITCHER_STATUS_BIN="$HOME/.local/bin/wb-mcp-status"
767
904
  export AGENT_PBX_WORKERBEE_SWITCHER_BIN="$HOME/.local/bin/wb-mcp-switch"
768
905
  ```
769
906
 
907
+ Agent PBX treats backend selection, access policy, workspace placement, and
908
+ appliance snapshot content as separate controls. Exactly one backend is
909
+ selected at a time:
910
+
911
+ | Backend | Workspace domain | Current posture |
912
+ |---|---|---|
913
+ | `oss` | The exact host Git root | Supported |
914
+ | `platform_debug` | A content-addressed import under the debug appliance workspace | Supported |
915
+ | `user_appliance` | A separate managed appliance volume | Contract reserved; live image qualification deferred |
916
+
917
+ Every TUI-launched or resumed Agent, Operator, edit fork, and review fork gets a
918
+ private gateway lease bound to the selected backend fingerprint, generation,
919
+ project, and workspace receipt. A backend change invalidates the old lease;
920
+ restart or resume the affected Codex session through Agent PBX to materialize
921
+ and verify a fresh binding. The daemon does not merge host OSS status into an
922
+ appliance-backed session.
923
+
924
+ Platform-debug needs the repository-installed materializer plus the private
925
+ WorkerBee staging contract:
926
+
927
+ ```bash
928
+ export AGENT_PBX_WORKERBEE_WORKSPACE_HELPER_BIN="$(command -v agent-pbx-workerbee-workspace)"
929
+ export AGENT_PBX_WORKERBEE_DEBUG_STAGE_PYTHON="/path/to/k1s-workerbee-private/.venv/bin/python"
930
+ export AGENT_PBX_WORKERBEE_DEBUG_STAGE_SCRIPT="/path/to/k1s-workerbee-private/scripts/dev/stage_platform_debug_workspace.py"
931
+ export AGENT_PBX_WORKERBEE_DEBUG_CONTAINER="workerbee-mcp-debug"
932
+ export AGENT_PBX_WORKERBEE_DEBUG_IMPORT_ROOT="/workspace/imports"
933
+ ```
934
+
935
+ Tracked files, including initialized submodule trees, are staged automatically.
936
+ If a session deliberately needs dirty or untracked submodule content, approve
937
+ only the required paths in private host configuration. The policy is bound to
938
+ both Agent ID and exact source root and is never read from Agent-controlled
939
+ registration metadata:
940
+
941
+ ```bash
942
+ export AGENT_PBX_WORKERBEE_WORKSPACE_INCLUDES_JSON='{"agent-id":{"source_root":"/absolute/project","include_paths":["business-site/product-pages/agent-pbx","business-site/docs/agent-pbx-product-site.md"]}}'
943
+ ```
944
+
945
+ The snapshot rejects `.git`, secret-sensitive paths, escaping links, special
946
+ files, commit-mismatched or nested submodules, and paths outside that explicit
947
+ allowlist. Ordinary tracked repository content requires no include policy.
948
+
949
+ The three access profiles are `observe-local`, `review-readonly`, and
950
+ `local-deploy`. Deployment authority requires durable entity metadata that
951
+ explicitly sets `workerbee_mcp_profile=local-deploy`; a launch candidate cannot
952
+ self-select that profile. Review forks always receive the read-only profile.
953
+ Gateway bearer tokens are passed only in the child process environment and are
954
+ not stored in Agent or Operator metadata.
955
+
956
+ Use `Access` in the WorkerBee tab or `/workerbee access` to select inspect-only
957
+ or bounded local build/deploy authority for one Agent or Operator. The change
958
+ is durable but takes effect only after a safe Agent PBX restart/resume. This
959
+ keeps authority changes explicit and prevents a running process from broadening
960
+ its own lease.
961
+
962
+ Operator coordination role is separate from execution authority. The
963
+ `/operator authority` palette command manages four server-enforced profiles:
964
+
965
+ | Profile | Intended use |
966
+ |---|---|
967
+ | `scoped-edit` | Safe public default for one working checkout |
968
+ | `trusted-workbench` | Exact, versioned multi-project workspace set with LAN network access and bounded WorkerBee local deployment |
969
+ | `full-access` | Exceptional local-only profile, available only when the administrator ceiling permits it |
970
+ | `review-readonly` | Immutable profile for review forks |
971
+
972
+ Trusted Workbench sets contain canonical Git toplevels. A collection such as
973
+ `~/git/k1s-wt` may discover candidate repositories, including linked
974
+ worktrees, but the reviewed snapshot stores each selected checkout explicitly.
975
+ The collection itself never becomes a wildcard writable root. Agent PBX
976
+ qualifies linked-worktree Git metadata, rejects shared branch collisions,
977
+ deduplicates exact administration paths, and resumes the Codex thread before
978
+ recording the new profile as active. Edit forks inherit the root Operator's
979
+ profile; review forks never do.
980
+
981
+ The public default remains `scoped-edit`. Dedicated single-user workstations
982
+ can select `trusted-workbench` as their local default while retaining an
983
+ administrator root ceiling:
984
+
985
+ ```bash
986
+ export AGENT_PBX_OPERATOR_AUTHORITY_CONTROL_MODE="editable"
987
+ export AGENT_PBX_OPERATOR_AUTHORITY_PROFILE_CEILING="trusted-workbench"
988
+ export AGENT_PBX_OPERATOR_AUTHORITY_DEFAULT_PROFILE="trusted-workbench"
989
+ export AGENT_PBX_OPERATOR_AUTHORITY_ROOT_CEILING_JSON='["/home/user/git"]'
990
+ export AGENT_PBX_OPERATOR_AUTHORITY_WORKFLOW_LABEL="Trusted Workbench"
991
+ ```
992
+
993
+ The complete profile, workspace-set, inheritance, and rollback contract is in
994
+ the [Operator authority wiki guide](https://github.com/m4xx3d0ut/agent-pbx/wiki/Operator-Authority-and-Workspace-Sets).
995
+
996
+ Workspace mobility is a separate daemon policy. The committed default is
997
+ `pinned` with controller approval: an Agent may refresh the content of its
998
+ current checkout but cannot silently bind WorkerBee to another repository.
999
+ The WorkerBee tab's `Workspace` action and `/workerbee workspace` palette
1000
+ command show the effective policy, preview a canonical Git root and subpath,
1001
+ apply an approved binding, review pending requests, and revert the latest
1002
+ applicable transition.
1003
+
1004
+ | Policy | Allowed target |
1005
+ |---|---|
1006
+ | `pinned` | Current Git checkout only |
1007
+ | `same-repository` | Worktrees and subdirectories sharing the same Git common directory |
1008
+ | `scoped-workbench` | Git checkouts and subdirectories beneath controller-approved roots |
1009
+
1010
+ Request mode is independently `approval`, `automatic`, or `disabled`.
1011
+ Changing a workspace never changes the lease token, selected WorkerBee
1012
+ backend, generation, or tool profile. A `review-readonly` fork therefore
1013
+ remains read-only after a move, while `local-deploy` remains limited to its
1014
+ existing bounded tool allowlist. A supplied scenario label becomes a
1015
+ deterministic, namespaced WorkerBee project.
1016
+
1017
+ Administrators can constrain or remove this UI without trusting client-side
1018
+ settings:
1019
+
1020
+ ```bash
1021
+ export AGENT_PBX_WORKERBEE_WORKSPACE_CONTROL_MODE="read_only" # editable|read_only|hidden
1022
+ export AGENT_PBX_WORKERBEE_WORKSPACE_POLICY_CEILING="same-repository"
1023
+ export AGENT_PBX_WORKERBEE_WORKSPACE_ROOT_CEILING_JSON='["/srv/engineering"]'
1024
+ export AGENT_PBX_WORKERBEE_WORKSPACE_REQUEST_MODE="approval"
1025
+ ```
1026
+
1027
+ The environment values are hard ceilings. A TUI or Agent cannot expand them.
1028
+ Allowed roots and transition paths are stored by the daemon and are omitted
1029
+ from ordinary status events. `agent-pbx doctor` reports the effective policy
1030
+ without printing its host paths.
1031
+
1032
+ For appliance-backed sessions, `Content` or `/workerbee content` independently
1033
+ selects `tracked`, explicit `approved-paths`, or a bounded
1034
+ `safe-working-tree` snapshot. Safe working tree excludes common secret paths,
1035
+ keys, links, special files, virtual environments, dependency caches, and
1036
+ oversized content. It is intended for trusted single-user workstations;
1037
+ high-assurance environments should use tracked or explicitly approved paths.
1038
+ OSS direct-host sessions do not use appliance snapshot policy.
1039
+
1040
+ The setup assistant can install reviewed workflow defaults without selecting a
1041
+ backend or granting deployment tools:
1042
+
1043
+ ```bash
1044
+ agent-pbx setup plan \
1045
+ --project-root "$HOME/git" \
1046
+ --workerbee-preset trusted-platform-workbench
1047
+ ```
1048
+
1049
+ Committed new-user behavior remains observe-only, pinned plus approval, and
1050
+ tracked content. Administrators may independently constrain or hide Access,
1051
+ Workspace, and Content controls. The complete preset and environment reference
1052
+ is in the [WorkerBee wiki guide](https://github.com/m4xx3d0ut/agent-pbx/wiki/WorkerBee-Integration).
1053
+
770
1054
  `/workerbee switch oss` and `/workerbee switch debug` always begin with the
771
1055
  switcher's real non-mutating `--dry-run` result. Apply requires an unexpired
772
1056
  private transaction, unchanged backend evidence, exact typed confirmation, and
773
1057
  an additional privileged confirmation for platform-debug. Agent PBX verifies
774
1058
  both backend provenance and WorkerBee MCP capabilities after apply, attempts
775
1059
  automatic restoration on failure, and provides `/workerbee switch rollback`
776
- for the last verified transaction. The change applies only to future sessions;
777
- running Codex sessions remain pinned to their existing MCP binding.
1060
+ for the last verified transaction. Switching is blocked while a gateway
1061
+ mutation is active. Existing generation-bound sessions fail closed with a
1062
+ rebind diagnostic after a completed switch; Agent PBX never silently retargets
1063
+ a running session to the new backend.
1064
+
1065
+ Platform-debug posture is a separate, host-owned setting. The committed
1066
+ default remains loopback-only. A workstation whose qualified debug appliance
1067
+ owns local LAN DNS and HTTPS may opt in explicitly:
1068
+
1069
+ ```bash
1070
+ export AGENT_PBX_WORKERBEE_PLATFORM_DEBUG_POSTURE="native_lan"
1071
+ ```
1072
+
1073
+ The setting is included in preview and rollback evidence and must agree with
1074
+ the source-owned switcher's durable platform-debug profile. The normal
1075
+ `switch-debug` transaction consumes that profile, and the observed posture must
1076
+ match before Agent PBX marks the switch verified. Selecting the same backend no
1077
+ longer hides a loopback/native-LAN posture drift.
1078
+
1079
+ This is an Agent PBX host-control setting. It does not select a different
1080
+ WorkerBee appliance for clients, alter the OSS/PaaS protocol, or affect PaaS
1081
+ users that do not run Agent PBX. A user-appliance rollout remains a separate
1082
+ WorkerBee release decision.
778
1083
 
779
1084
  ## Pull Request Review
780
1085
 
@@ -866,8 +1171,10 @@ after writes, enable `AGENT_PBX_JOPLIN_SYNC_ON_WRITE=1` and provide a Joplin CLI
866
1171
  path/profile. After each create, edit, delete, COPY note, or LOG append, Agent
867
1172
  PBX records a durable SQLite sync job and a background worker runs
868
1173
  `joplin --profile <profile> sync`. Note writes return before WebDAV sync
869
- finishes. Leave this off if a separate Joplin client or background process
870
- already syncs the profile.
1174
+ finishes. In managed-profile mode the status surface reports the queued sync
1175
+ before the worker briefly stops the Data API, preserves the locally saved note
1176
+ in the Joplin tab, and restores the API after success or failure. Leave this off
1177
+ if a separate Joplin client or background process already syncs the profile.
871
1178
  If WebDAV sync uses E2EE, the dedicated profile must have its master key loaded;
872
1179
  otherwise Joplin may exit successfully while reporting `Master key is not
873
1180
  loaded`, and Agent PBX will surface that as a sync failure.
@@ -896,7 +1203,10 @@ validation, for example `Writes: ok | Profile: E2EE locked 17`. Press
896
1203
  `Validate` or use `/joplin validate profile` to run the strict whole-profile
897
1204
  check. `/joplin sync` remains a compatibility alias. Historical failures remain
898
1205
  in Agent PBX status/events for audit; they do not roll back a note write that
899
- completed successfully.
1206
+ completed successfully. After correcting a remote write failure, use
1207
+ `/joplin retry write` to requeue the selected Agent or Operator's latest failed
1208
+ targeted write without creating a duplicate note or invoking strict
1209
+ whole-profile E2EE validation.
900
1210
 
901
1211
  Encrypted items are shown as `🔒 decryption pending`, never as empty notes.
902
1212
  Agent PBX does not return encrypted payloads through its API and blocks edit,
@@ -990,6 +1300,15 @@ never stops an ambiguous or foreign process. Unrelated encrypted items remain
990
1300
  visible as a separate profile-health warning without failing a verified targeted
991
1301
  write.
992
1302
 
1303
+ At daemon startup, `managed_cli` also verifies the configured profile's Data API
1304
+ process and starts it when the recorded process is absent and the API is not
1305
+ reachable. This restores Joplin after a host restart without a competing service
1306
+ manager. An already-live server must pass the same PID, owner, executable,
1307
+ command, and profile checks; an unverified listener or process fails closed and
1308
+ does not block the rest of Agent PBX from starting. Do not run an independent
1309
+ restart loop against the same managed profile because it could relaunch the Data
1310
+ API server during Agent PBX's exclusive CLI sync window.
1311
+
993
1312
  The managed decrypt pass uses only Joplin's own cached master-key credential.
994
1313
  Agent PBX does not receive or persist the E2EE password. If the credential is
995
1314
  missing or Joplin's crypto worker fails, the validated API server is restored
@@ -1052,8 +1371,10 @@ an optimistic lock using the loaded file hash or mtime and reports a conflict if
1052
1371
  the file changed on disk. Returning from Neovim to a clean Textual buffer
1053
1372
  refetches the file, so native-editor writes do not leave a stale editable copy.
1054
1373
  A dirty Textual buffer must be saved or reverted before its project can open in
1055
- the native editor. `F9` or `Full F9` toggles an editor-fullscreen layout that
1056
- keeps the TUI title and footer visible.
1374
+ the native editor. `F9`, `Full F9`, or `/view fullscreen` toggles the complete
1375
+ active right-side workspace full width while keeping the TUI title and footer
1376
+ visible. The selected right tab and its terminal/editor state are preserved;
1377
+ the compatibility command `/editor fullscreen` invokes the same layout action.
1057
1378
 
1058
1379
  `Native` or `/editor terminal` starts or attaches a project-rooted managed
1059
1380
  editor without requiring a file to be staged in Textual. `/editor workspace`
@@ -1265,7 +1586,9 @@ commands such as `/detail`, `/ping`, `/esc`, `/ctrlc`, `/restart`, `/tmux`,
1265
1586
  `/operator kb`, `/operator kb detail`, `/operator kb proposed`,
1266
1587
  `/operator kb proposed detail`, `/operator kb seed`, `/operator kb compile`,
1267
1588
  `/operator kb reindex`, `/operator kb promote`, `/operator kb reject`,
1268
- `/operator kb retire`, `/operator project spawn`, `/codex update`, `/pr`, `/pr refresh`,
1589
+ `/operator kb retire`, `/operator project spawn`,
1590
+ `/operator project spawn inspect`, `/operator project spawn cancel`,
1591
+ `/codex update`, `/pr`, `/pr refresh`,
1269
1592
  `/pr review`, `/pr validate`, `/pr url`, `/pr merge`, `/issue`, `/issue refresh`, `/issue mitigate`,
1270
1593
  `/issue url`, `/issue clear`, configured `/joplin`, `/joplin new`,
1271
1594
  `/joplin rename`, `/joplin delete`, `/joplin copy`,
@@ -1291,7 +1614,22 @@ explicit restart creates a fresh pane on the configured managed tmux server,
1291
1614
  resumes the preserved Codex session, registers and verifies the new mapping,
1292
1615
  and leaves the stale or absent pane reference behind. Agent PBX refuses to
1293
1616
  create a pane when the daemon cannot verify mapping state, preventing an
1294
- unreachable runtime from being duplicated. Use `/codex update` to ask the Agent
1617
+ unreachable runtime from being duplicated. Existing-pane stop, purge, restart,
1618
+ and resume actions require an exact executable/socket/server/session/window/pane
1619
+ match and never fall back to the process-default tmux server; colliding pane IDs
1620
+ therefore fail safely. For a canceled, inactive edit fork, a durable mapping in
1621
+ `missing` state is treated as historical local evidence only after a fresh
1622
+ daemon probe agrees with the Agent's recorded server mode/ID, tmux session and
1623
+ pane, and Codex session; the writer lease is empty; and the recorded process is
1624
+ conclusively absent. A fresh local/outer tmux listing must also contain no pane
1625
+ owned by that Agent. A same-number pane on another tmux server does not revive
1626
+ that stale mapping. Unreadable process evidence, missing provenance, a live
1627
+ process with matching start identity, an active writer, embedded-terminal
1628
+ state, and every
1629
+ non-missing runtime state continue to block reconciliation. A readable PID with
1630
+ different start ticks proves that the registered process identity is gone;
1631
+ an existing but unreadable or malformed `/proc/<pid>` remains ambiguous. Use
1632
+ `/codex update` to ask the Agent
1295
1633
  PBX daemon to run the allowlisted npm update for
1296
1634
  `@openai/codex`, then use `/restart` or `/codex restart` to move long-lived
1297
1635
  caller, root-operator, and fork panes onto the updated executable. TUI-owned
@@ -1449,6 +1787,22 @@ default edit fork. `/agent launch` remains an alias for the same picker, while
1449
1787
  caller. Plain `F10` remains PBX-owned under embedded-terminal focus;
1450
1788
  `Shift+F10` sends F10 to Codex.
1451
1789
 
1790
+ Managed caller launch now includes a deterministic, audited registration
1791
+ bootstrap in the initial Codex command. It disables the startup update check so
1792
+ an upgrade interstitial cannot consume that prompt, exposes only the caller
1793
+ registration/report Agent PBX tools, auto-approves those explicitly enabled
1794
+ tools, and leaves unrelated approval escalation disallowed by the caller's
1795
+ normal launch policy. Retries with the same Agent, repository, profile, runtime
1796
+ mode, and source Codex session return the existing ready mapping rather than
1797
+ creating a second pane. The source session identifier and bootstrap digest are
1798
+ retained as launch provenance.
1799
+
1800
+ TUI-created root Operators, edit forks, and review forks launch on the selected
1801
+ runtime tmux server and immediately register the exact server socket, session,
1802
+ window, pane, process, Codex-session evidence, and outer-client provenance.
1803
+ This avoids a manual reconciliation window before handoff preflight can address
1804
+ the new pane.
1805
+
1452
1806
  Agent PBX v2 enables the native local tmux path by default when the TUI uses a
1453
1807
  loopback daemon and `tmux` is available. `Latest` embeds a PTY-backed normal
1454
1808
  tmux client attached to the selected PBX-managed runtime. Codex keeps its native
@@ -1483,9 +1837,14 @@ terminal access; the WSS client is the observer/control path.
1483
1837
 
1484
1838
  Plain configured function keys remain global PBX navigation even under terminal
1485
1839
  focus: `F1` Agents, `F2` Events, `F3` view, `F4` input, `F5` Operators,
1486
- `F6/F7` fork navigation, `F8` next alert, `F9` editor, `F10` workspace launch,
1840
+ `F6/F7` fork navigation, `F8` next alert, `F9` right-pane fullscreen, `F10` workspace launch,
1487
1841
  and `F11/F12` navigation back/forward. Repeated F8 presses
1488
- focus and acknowledge one displayed Agent/Operator alert at a time.
1842
+ focus and acknowledge one displayed Agent/Operator alert at a time. Approval
1843
+ centers are single-flight: F8 never stacks duplicate modals. Pressing F8 while
1844
+ the approval center is frontmost closes that reviewed center and advances to
1845
+ the next unreviewed approval or report alert. An unresolved approval remains
1846
+ durable and can be reopened after the alert cycle; a nested confirmation must
1847
+ be completed or dismissed before cycling.
1489
1848
  Shift+F1–F12 is translated to unmodified child F1–F12. Thus F2
1490
1849
  always focuses Events while Shift+F2 opens Codex warnings. The input layer also
1491
1850
  recognizes xterm F13–F24 aliases, and the key probe documents terminal-specific