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