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.
- {agent_pbx-2.2.0/src/agent_pbx.egg-info → agent_pbx-2.4.0}/PKG-INFO +393 -19
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/README.md +392 -18
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/pyproject.toml +4 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/src/agent_pbx/__init__.py +1 -1
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/src/agent_pbx/agent.py +26 -1
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/src/agent_pbx/api.py +2752 -107
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/src/agent_pbx/cli.py +103 -1
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/src/agent_pbx/codex/event_bridge.py +58 -21
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/src/agent_pbx/codex/models.py +3 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/src/agent_pbx/codex/runtime.py +135 -21
- agent_pbx-2.4.0/src/agent_pbx/codex_launch.py +121 -0
- agent_pbx-2.4.0/src/agent_pbx/config.py +169 -0
- agent_pbx-2.4.0/src/agent_pbx/contracts.py +334 -0
- agent_pbx-2.4.0/src/agent_pbx/demo/capture.py +218 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/src/agent_pbx/demo/contract.py +3 -2
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/src/agent_pbx/demo/fake_codex.py +6 -2
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/src/agent_pbx/demo/fixtures.py +32 -3
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/src/agent_pbx/demo/policy.py +10 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/src/agent_pbx/demo/session.py +347 -27
- agent_pbx-2.4.0/src/agent_pbx/demo/web.py +937 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/src/agent_pbx/doctor.py +458 -2
- agent_pbx-2.4.0/src/agent_pbx/durable_helpers.py +941 -0
- agent_pbx-2.4.0/src/agent_pbx/dynamic_resources.py +913 -0
- agent_pbx-2.4.0/src/agent_pbx/evidence_export.py +909 -0
- agent_pbx-2.4.0/src/agent_pbx/git_broker.py +3612 -0
- agent_pbx-2.4.0/src/agent_pbx/git_review.py +540 -0
- agent_pbx-2.4.0/src/agent_pbx/git_worktree.py +806 -0
- agent_pbx-2.4.0/src/agent_pbx/host_process_evidence.py +251 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/src/agent_pbx/joplin.py +254 -4
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/src/agent_pbx/lifecycle.py +217 -7
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/src/agent_pbx/managed_runtime.py +144 -9
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/src/agent_pbx/mcp_daemon.py +333 -1
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/src/agent_pbx/mcp_tools.py +382 -27
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/src/agent_pbx/migration.py +1 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/src/agent_pbx/operator.py +1645 -46
- agent_pbx-2.4.0/src/agent_pbx/operator_actions.py +182 -0
- agent_pbx-2.4.0/src/agent_pbx/operator_authority.py +1119 -0
- agent_pbx-2.4.0/src/agent_pbx/operator_broker.py +1049 -0
- agent_pbx-2.4.0/src/agent_pbx/operator_delegation.py +640 -0
- agent_pbx-2.4.0/src/agent_pbx/operator_kb_sync.py +797 -0
- agent_pbx-2.4.0/src/agent_pbx/project_spawn.py +189 -0
- agent_pbx-2.4.0/src/agent_pbx/protected_provider.py +335 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/src/agent_pbx/runtime_tmux.py +33 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/src/agent_pbx/schemas.py +569 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/src/agent_pbx/setup_assistant.py +8 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/src/agent_pbx/store.py +5492 -543
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/src/agent_pbx/terminal/widget.py +18 -3
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/src/agent_pbx/tmux.py +81 -1
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/src/agent_pbx/tui.py +10872 -660
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/src/agent_pbx/ui/runtime.py +47 -3
- agent_pbx-2.4.0/src/agent_pbx/workerbee_access.py +423 -0
- agent_pbx-2.4.0/src/agent_pbx/workerbee_controlled_run.py +772 -0
- agent_pbx-2.4.0/src/agent_pbx/workerbee_controlled_run_executor.py +485 -0
- agent_pbx-2.4.0/src/agent_pbx/workerbee_development_resources.py +543 -0
- agent_pbx-2.4.0/src/agent_pbx/workerbee_direct_bind.py +794 -0
- agent_pbx-2.4.0/src/agent_pbx/workerbee_gateway.py +1221 -0
- agent_pbx-2.4.0/src/agent_pbx/workerbee_materializer.py +413 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/src/agent_pbx/workerbee_mcp.py +26 -0
- agent_pbx-2.4.0/src/agent_pbx/workerbee_modes.py +474 -0
- agent_pbx-2.4.0/src/agent_pbx/workerbee_policy.py +834 -0
- agent_pbx-2.4.0/src/agent_pbx/workerbee_runtime.py +243 -0
- agent_pbx-2.4.0/src/agent_pbx/workerbee_snapshot_policy.py +904 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/src/agent_pbx/workerbee_switcher.py +331 -28
- agent_pbx-2.4.0/src/agent_pbx/workerbee_workspace.py +1101 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0/src/agent_pbx.egg-info}/PKG-INFO +393 -19
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/src/agent_pbx.egg-info/SOURCES.txt +52 -0
- agent_pbx-2.4.0/src/agent_pbx.egg-info/entry_points.txt +7 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/tests/test_agent_instructions.py +4 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/tests/test_codex_event_bridge.py +67 -1
- agent_pbx-2.4.0/tests/test_codex_launch.py +56 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/tests/test_codex_profiles.py +109 -0
- agent_pbx-2.4.0/tests/test_contracts.py +140 -0
- agent_pbx-2.4.0/tests/test_demo_capture.py +114 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/tests/test_docs.py +27 -0
- agent_pbx-2.4.0/tests/test_doctor.py +462 -0
- agent_pbx-2.4.0/tests/test_durable_helpers.py +359 -0
- agent_pbx-2.4.0/tests/test_dynamic_resources.py +598 -0
- agent_pbx-2.4.0/tests/test_engineering_control_plane_integration.py +319 -0
- agent_pbx-2.4.0/tests/test_evidence_export.py +248 -0
- agent_pbx-2.4.0/tests/test_git_broker.py +2248 -0
- agent_pbx-2.4.0/tests/test_git_review.py +191 -0
- agent_pbx-2.4.0/tests/test_git_worktree.py +1097 -0
- agent_pbx-2.4.0/tests/test_host_process_evidence.py +297 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/tests/test_joplin.py +490 -1
- agent_pbx-2.4.0/tests/test_lifecycle.py +654 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/tests/test_managed_runtime.py +57 -2
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/tests/test_mcp_daemon.py +272 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/tests/test_mcp_tools.py +328 -1
- agent_pbx-2.4.0/tests/test_migration.py +390 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/tests/test_operator.py +685 -1
- agent_pbx-2.4.0/tests/test_operator_authority.py +703 -0
- agent_pbx-2.4.0/tests/test_operator_broker.py +1099 -0
- agent_pbx-2.4.0/tests/test_operator_delegation.py +640 -0
- agent_pbx-2.4.0/tests/test_operator_kb_sync.py +395 -0
- agent_pbx-2.4.0/tests/test_project_spawn.py +115 -0
- agent_pbx-2.4.0/tests/test_protected_provider.py +369 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/tests/test_public_demo_fixtures.py +29 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/tests/test_public_demo_policy.py +50 -0
- agent_pbx-2.4.0/tests/test_public_demo_session.py +327 -0
- agent_pbx-2.4.0/tests/test_public_demo_web.py +350 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/tests/test_remote.py +2 -1
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/tests/test_runtime_tmux.py +56 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/tests/test_runtime_ux.py +125 -1
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/tests/test_setup_assistant.py +27 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/tests/test_store.py +232 -2
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/tests/test_terminal.py +23 -2
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/tests/test_terminal_editor.py +6 -2
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/tests/test_tmux.py +87 -2
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/tests/test_tui.py +8121 -958
- agent_pbx-2.4.0/tests/test_workerbee_access.py +150 -0
- agent_pbx-2.4.0/tests/test_workerbee_controlled_run.py +831 -0
- agent_pbx-2.4.0/tests/test_workerbee_development_resources.py +445 -0
- agent_pbx-2.4.0/tests/test_workerbee_gateway.py +1965 -0
- agent_pbx-2.4.0/tests/test_workerbee_materializer.py +172 -0
- agent_pbx-2.4.0/tests/test_workerbee_modes.py +254 -0
- agent_pbx-2.4.0/tests/test_workerbee_policy.py +243 -0
- agent_pbx-2.4.0/tests/test_workerbee_runtime.py +58 -0
- agent_pbx-2.4.0/tests/test_workerbee_snapshot_policy.py +215 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/tests/test_workerbee_switcher.py +224 -7
- agent_pbx-2.4.0/tests/test_workerbee_workspace.py +1134 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/tests/test_workflow.py +257 -0
- agent_pbx-2.2.0/src/agent_pbx/config.py +0 -58
- agent_pbx-2.2.0/src/agent_pbx/contracts.py +0 -120
- agent_pbx-2.2.0/src/agent_pbx/demo/web.py +0 -353
- agent_pbx-2.2.0/src/agent_pbx/project_spawn.py +0 -61
- agent_pbx-2.2.0/src/agent_pbx.egg-info/entry_points.txt +0 -3
- agent_pbx-2.2.0/tests/test_contracts.py +0 -54
- agent_pbx-2.2.0/tests/test_doctor.py +0 -198
- agent_pbx-2.2.0/tests/test_lifecycle.py +0 -247
- agent_pbx-2.2.0/tests/test_migration.py +0 -176
- agent_pbx-2.2.0/tests/test_project_spawn.py +0 -39
- agent_pbx-2.2.0/tests/test_public_demo_session.py +0 -94
- agent_pbx-2.2.0/tests/test_public_demo_web.py +0 -171
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/LICENSE +0 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/setup.cfg +0 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/src/agent_pbx/__main__.py +0 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/src/agent_pbx/agent_adoption.py +0 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/src/agent_pbx/auth.py +0 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/src/agent_pbx/client.py +0 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/src/agent_pbx/codex/__init__.py +0 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/src/agent_pbx/codex/adapter.py +0 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/src/agent_pbx/codex/capabilities.py +0 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/src/agent_pbx/codex/profiles.py +0 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/src/agent_pbx/codex/protocol.py +0 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/src/agent_pbx/codex/sessions.py +0 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/src/agent_pbx/codex/skills.py +0 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/src/agent_pbx/codex/state.py +0 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/src/agent_pbx/codex_cli.py +0 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/src/agent_pbx/codex_config.py +0 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/src/agent_pbx/codex_sessions.py +0 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/src/agent_pbx/codex_theme.py +0 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/src/agent_pbx/compat.py +0 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/src/agent_pbx/debug_smoke.py +0 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/src/agent_pbx/demo/__init__.py +0 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/src/agent_pbx/demo/fake_github.py +0 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/src/agent_pbx/demo/fake_joplin.py +0 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/src/agent_pbx/demo/fake_workerbee.py +0 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/src/agent_pbx/dev_harness.py +0 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/src/agent_pbx/envfile.py +0 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/src/agent_pbx/events.py +0 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/src/agent_pbx/files.py +0 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/src/agent_pbx/issues.py +0 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/src/agent_pbx/pairing.py +0 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/src/agent_pbx/paths.py +0 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/src/agent_pbx/polling.py +0 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/src/agent_pbx/pull_requests.py +0 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/src/agent_pbx/remote.py +0 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/src/agent_pbx/security.py +0 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/src/agent_pbx/sim_agent.py +0 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/src/agent_pbx/sim_client.py +0 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/src/agent_pbx/skill_packs/agent-pbx-base/SKILL.md +0 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/src/agent_pbx/skill_packs/agent-role/SKILL.md +0 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/src/agent_pbx/skill_packs/operator-role/SKILL.md +0 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/src/agent_pbx/skill_packs/review-role/SKILL.md +0 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/src/agent_pbx/skill_packs/roses-architect/SKILL.md +0 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/src/agent_pbx/terminal/__init__.py +0 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/src/agent_pbx/terminal/conformance.py +0 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/src/agent_pbx/terminal/keys.py +0 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/src/agent_pbx/terminal/pty.py +0 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/src/agent_pbx/terminal/screen.py +0 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/src/agent_pbx/terminal_editor.py +0 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/src/agent_pbx/tmux_binary.py +0 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/src/agent_pbx/transcript.py +0 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/src/agent_pbx/tui_cli.py +0 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/src/agent_pbx/uat.py +0 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/src/agent_pbx/ui/__init__.py +0 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/src/agent_pbx/ui/actions.py +0 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/src/agent_pbx/ui/async_jobs.py +0 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/src/agent_pbx/ui/focus.py +0 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/src/agent_pbx/ui/navigation.py +0 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/src/agent_pbx/ui/palette_history.py +0 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/src/agent_pbx/ui/panels/__init__.py +0 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/src/agent_pbx/ui/panels/editor.py +0 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/src/agent_pbx/ui/panels/joplin.py +0 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/src/agent_pbx/ui/panels/operators.py +0 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/src/agent_pbx/ui/theme.py +0 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/src/agent_pbx/wiki_publish.py +0 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/src/agent_pbx/workerbee.py +0 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/src/agent_pbx/workerbee_harness.py +0 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/src/agent_pbx.egg-info/dependency_links.txt +0 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/src/agent_pbx.egg-info/requires.txt +0 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/src/agent_pbx.egg-info/top_level.txt +0 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/tests/test_agent_adoption.py +0 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/tests/test_auth_pairing.py +0 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/tests/test_codex_adapter.py +0 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/tests/test_codex_cli.py +0 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/tests/test_codex_config.py +0 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/tests/test_codex_sessions.py +0 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/tests/test_codex_theme.py +0 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/tests/test_compat.py +0 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/tests/test_debug_smoke.py +0 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/tests/test_demo_codex.py +0 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/tests/test_dev_harness.py +0 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/tests/test_events.py +0 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/tests/test_health.py +0 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/tests/test_issues.py +0 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/tests/test_navigation.py +0 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/tests/test_palette_history.py +0 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/tests/test_polling.py +0 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/tests/test_pull_requests.py +0 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/tests/test_readme.py +0 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/tests/test_release_packaging.py +0 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/tests/test_release_validation.py +0 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/tests/test_tmux_binary.py +0 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/tests/test_tui_cli.py +0 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/tests/test_uat.py +0 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/tests/test_ui_controllers.py +0 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/tests/test_wiki_publish.py +0 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/tests/test_workerbee.py +0 -0
- {agent_pbx-2.2.0 → agent_pbx-2.4.0}/tests/test_workerbee_harness.py +0 -0
- {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.
|
|
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.
|
|
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
|
|
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
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
the
|
|
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
|
|
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.
|
|
777
|
-
|
|
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.
|
|
870
|
-
|
|
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
|
|
1056
|
-
|
|
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`,
|
|
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.
|
|
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`
|
|
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
|