agentwire-dev 1.47.0__tar.gz → 1.48.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.
- agentwire_dev-1.48.0/.claude/commands/handoff.md +142 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/.gitignore +3 -0
- agentwire_dev-1.48.0/AGENTS.md +5 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/CONTRIBUTING.md +4 -2
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/PKG-INFO +5 -6
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/README.md +4 -4
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/RELEASING.md +5 -2
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/__init__.py +1 -1
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/agents/base.py +0 -27
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/agents/tmux.py +0 -141
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/channels/email.py +1 -1
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/channels/quo.py +3 -3
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/channels_cli.py +1 -1
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/completion.py +4 -17
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/config.py +2 -3
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/council/cli.py +0 -54
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/doctor_cli.py +5 -7
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/hooks_cli.py +2 -2
- agentwire_dev-1.48.0/agentwire/mcp_channels.py +88 -0
- agentwire_dev-1.48.0/agentwire/mcp_core.py +288 -0
- agentwire_dev-1.48.0/agentwire/mcp_council.py +193 -0
- agentwire_dev-1.48.0/agentwire/mcp_desktop.py +296 -0
- agentwire_dev-1.48.0/agentwire/mcp_handoff.py +95 -0
- agentwire_dev-1.48.0/agentwire/mcp_history.py +94 -0
- agentwire_dev-1.48.0/agentwire/mcp_listen.py +51 -0
- agentwire_dev-1.48.0/agentwire/mcp_lock.py +64 -0
- agentwire_dev-1.48.0/agentwire/mcp_machine.py +62 -0
- agentwire_dev-1.48.0/agentwire/mcp_msg.py +219 -0
- agentwire_dev-1.48.0/agentwire/mcp_notify.py +98 -0
- agentwire_dev-1.48.0/agentwire/mcp_pane.py +232 -0
- agentwire_dev-1.48.0/agentwire/mcp_projects.py +69 -0
- agentwire_dev-1.48.0/agentwire/mcp_scheduler.py +281 -0
- agentwire_dev-1.48.0/agentwire/mcp_scratchpad.py +50 -0
- agentwire_dev-1.48.0/agentwire/mcp_server.py +51 -0
- agentwire_dev-1.48.0/agentwire/mcp_services.py +69 -0
- agentwire_dev-1.48.0/agentwire/mcp_session.py +342 -0
- agentwire_dev-1.48.0/agentwire/mcp_status.py +92 -0
- agentwire_dev-1.48.0/agentwire/mcp_task.py +163 -0
- agentwire_dev-1.48.0/agentwire/mcp_tunnels.py +48 -0
- agentwire_dev-1.48.0/agentwire/mcp_voice.py +197 -0
- agentwire_dev-1.48.0/agentwire/mcp_voiceclone.py +81 -0
- agentwire_dev-1.48.0/agentwire/mcp_wiki.py +85 -0
- agentwire_dev-1.48.0/agentwire/mcp_worktree.py +202 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/roles/init.md +1 -1
- agentwire_dev-1.48.0/agentwire/routes/__init__.py +22 -0
- agentwire_dev-1.48.0/agentwire/routes/artifacts.py +120 -0
- agentwire_dev-1.48.0/agentwire/routes/config.py +159 -0
- agentwire_dev-1.48.0/agentwire/routes/council.py +318 -0
- agentwire_dev-1.48.0/agentwire/routes/desktop.py +238 -0
- agentwire_dev-1.48.0/agentwire/routes/history.py +145 -0
- agentwire_dev-1.48.0/agentwire/routes/machines.py +330 -0
- agentwire_dev-1.48.0/agentwire/routes/notify.py +169 -0
- agentwire_dev-1.48.0/agentwire/routes/permission.py +379 -0
- agentwire_dev-1.48.0/agentwire/routes/projects.py +394 -0
- agentwire_dev-1.48.0/agentwire/routes/push.py +60 -0
- agentwire_dev-1.48.0/agentwire/routes/safety.py +117 -0
- agentwire_dev-1.48.0/agentwire/routes/scheduler.py +189 -0
- agentwire_dev-1.48.0/agentwire/routes/scratchpad.py +71 -0
- agentwire_dev-1.48.0/agentwire/routes/sessions.py +160 -0
- agentwire_dev-1.48.0/agentwire/routes/sessions_admin.py +609 -0
- agentwire_dev-1.48.0/agentwire/routes/voice.py +400 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/safety_cli.py +9 -9
- agentwire_dev-1.47.0/agentwire/cli_safety.py → agentwire_dev-1.48.0/agentwire/safety_commands.py +1 -5
- agentwire_dev-1.48.0/agentwire/server.py +2871 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/session_cli.py +5 -0
- agentwire_dev-1.48.0/agentwire/session_ready.py +312 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/static/css/desktop.css +0 -148
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/static/js/icon-manager.js +0 -2
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/tts/base.py +1 -1
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/tts/engines/__init__.py +1 -4
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/tts/registry.py +1 -1
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/tts_cli.py +5 -7
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/tts_server.py +3 -32
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/docs/decisions/obsidian-second-brain.md +2 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/docs/wiki/INDEX.md +4 -1
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/docs/wiki/briefing-mode.md +1 -1
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/docs/wiki/internals/portal.md +1 -1
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/docs/wiki/internals/troubleshooting.md +1 -1
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/docs/wiki/sessions/worktree-sessions.md +1 -1
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/docs/wiki/voice/shim-contract.md +3 -3
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/docs/wiki/voice/tts-self-hosted.md +3 -20
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/pyproject.toml +38 -19
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/tests/integration/test_worktree_cmd.py +27 -1
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/tests/unit/test_channels.py +0 -9
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/tests/unit/test_cli_commands.py +2 -2
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/tests/unit/test_config.py +0 -16
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/tests/unit/test_control_plane_protection.py +1 -1
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/tests/unit/test_council_cli.py +0 -19
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/tests/unit/test_damage_control_bypass.py +1 -1
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/tests/unit/test_mcp_server.py +44 -44
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/tests/unit/test_mcp_tools_args.py +74 -74
- agentwire_dev-1.48.0/tests/unit/test_routes_snapshot.py +205 -0
- agentwire_dev-1.47.0/tests/unit/test_cli_safety.py → agentwire_dev-1.48.0/tests/unit/test_safety_commands.py +22 -22
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/tests/unit/test_safety_disabled_rules.py +1 -1
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/tests/unit/test_safety_escape_hatch.py +1 -1
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/tests/unit/test_safety_heal.py +42 -42
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/tests/unit/test_safety_kill_switch.py +1 -1
- agentwire_dev-1.48.0/tests/unit/test_session_ready.py +305 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/tests/unit/test_skill_install.py +1 -1
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/tests/unit/test_tts_engine_resolution.py +3 -3
- agentwire_dev-1.47.0/.agents/skills/agentwire-cli/SKILL.md +0 -260
- agentwire_dev-1.47.0/.agents/skills/agentwire-config/SKILL.md +0 -236
- agentwire_dev-1.47.0/.agents/skills/agentwire-desktop-ui/SKILL.md +0 -76
- agentwire_dev-1.47.0/.agents/skills/agentwire-mcp-tools/SKILL.md +0 -176
- agentwire_dev-1.47.0/.agents/skills/agentwire-pi/SKILL.md +0 -205
- agentwire_dev-1.47.0/.agents/skills/agentwire-project-config/SKILL.md +0 -195
- agentwire_dev-1.47.0/.agents/skills/agentwire-scheduler/SKILL.md +0 -133
- agentwire_dev-1.47.0/.agents/skills/wiki/SKILL.md +0 -105
- agentwire_dev-1.47.0/AGENTS.md +0 -155
- agentwire_dev-1.47.0/Dockerfile.runpod +0 -60
- agentwire_dev-1.47.0/agentwire/mcp_server.py +0 -3454
- agentwire_dev-1.47.0/agentwire/prompts/__init__.py +0 -1
- agentwire_dev-1.47.0/agentwire/prompts/init.md +0 -155
- agentwire_dev-1.47.0/agentwire/server.py +0 -6312
- agentwire_dev-1.47.0/agentwire/session_ready.py +0 -226
- agentwire_dev-1.47.0/agentwire/static/agentwire-Echo--black.png +0 -0
- agentwire_dev-1.47.0/agentwire/static/agentwire-Echo--transparent.png +0 -0
- agentwire_dev-1.47.0/agentwire/static/agentwire-Echo.png +0 -0
- agentwire_dev-1.47.0/agentwire/static/agentwire-email-banner.png +0 -0
- agentwire_dev-1.47.0/agentwire/static/agentwire-splash-logo-layers--full--transparent-top.png +0 -0
- agentwire_dev-1.47.0/agentwire/static/agentwire-splash-logo-layers--full-black.png +0 -0
- agentwire_dev-1.47.0/agentwire/static/agentwire-splash-logo-layers--telephone-fg.png +0 -0
- agentwire_dev-1.47.0/agentwire/static/agentwire-splash-logo-layers--transparent-top.png +0 -0
- agentwire_dev-1.47.0/agentwire/static/agentwire-splash-logo-layers--transparent.png +0 -0
- agentwire_dev-1.47.0/agentwire/static/agentwire-splash-logo-layers.png +0 -0
- agentwire_dev-1.47.0/agentwire/static/icons/machines/android.jpeg +0 -0
- agentwire_dev-1.47.0/agentwire/static/icons/machines/android.webp +0 -0
- agentwire_dev-1.47.0/agentwire/static/icons/machines/automaton.jpeg +0 -0
- agentwire_dev-1.47.0/agentwire/static/icons/machines/automaton.webp +0 -0
- agentwire_dev-1.47.0/agentwire/static/icons/machines/bot.jpeg +0 -0
- agentwire_dev-1.47.0/agentwire/static/icons/machines/bot.webp +0 -0
- agentwire_dev-1.47.0/agentwire/static/icons/machines/cyborg.jpeg +0 -0
- agentwire_dev-1.47.0/agentwire/static/icons/machines/cyborg.webp +0 -0
- agentwire_dev-1.47.0/agentwire/static/icons/machines/droid.jpeg +0 -0
- agentwire_dev-1.47.0/agentwire/static/icons/machines/droid.webp +0 -0
- agentwire_dev-1.47.0/agentwire/static/icons/machines/drone.jpeg +0 -0
- agentwire_dev-1.47.0/agentwire/static/icons/machines/drone.webp +0 -0
- agentwire_dev-1.47.0/agentwire/static/icons/machines/guardian.jpeg +0 -0
- agentwire_dev-1.47.0/agentwire/static/icons/machines/guardian.webp +0 -0
- agentwire_dev-1.47.0/agentwire/static/icons/machines/mech.jpeg +0 -0
- agentwire_dev-1.47.0/agentwire/static/icons/machines/mech.webp +0 -0
- agentwire_dev-1.47.0/agentwire/static/icons/machines/probe.jpeg +0 -0
- agentwire_dev-1.47.0/agentwire/static/icons/machines/probe.webp +0 -0
- agentwire_dev-1.47.0/agentwire/static/icons/machines/robot.jpeg +0 -0
- agentwire_dev-1.47.0/agentwire/static/icons/machines/robot.webp +0 -0
- agentwire_dev-1.47.0/agentwire/static/icons/machines/sentinel.jpeg +0 -0
- agentwire_dev-1.47.0/agentwire/static/icons/machines/sentinel.webp +0 -0
- agentwire_dev-1.47.0/agentwire/static/icons/machines/unit.jpeg +0 -0
- agentwire_dev-1.47.0/agentwire/static/icons/machines/unit.webp +0 -0
- agentwire_dev-1.47.0/agentwire/static/icons/projects/blob.jpeg +0 -0
- agentwire_dev-1.47.0/agentwire/static/icons/projects/blob.webp +0 -0
- agentwire_dev-1.47.0/agentwire/static/icons/projects/cloud.jpeg +0 -0
- agentwire_dev-1.47.0/agentwire/static/icons/projects/cloud.webp +0 -0
- agentwire_dev-1.47.0/agentwire/static/icons/projects/crystal.jpeg +0 -0
- agentwire_dev-1.47.0/agentwire/static/icons/projects/crystal.webp +0 -0
- agentwire_dev-1.47.0/agentwire/static/icons/projects/cyclops.jpeg +0 -0
- agentwire_dev-1.47.0/agentwire/static/icons/projects/cyclops.webp +0 -0
- agentwire_dev-1.47.0/agentwire/static/icons/projects/flame.jpeg +0 -0
- agentwire_dev-1.47.0/agentwire/static/icons/projects/flame.webp +0 -0
- agentwire_dev-1.47.0/agentwire/static/icons/projects/fuzzy.jpeg +0 -0
- agentwire_dev-1.47.0/agentwire/static/icons/projects/fuzzy.webp +0 -0
- agentwire_dev-1.47.0/agentwire/static/icons/projects/horned.jpeg +0 -0
- agentwire_dev-1.47.0/agentwire/static/icons/projects/horned.webp +0 -0
- agentwire_dev-1.47.0/agentwire/static/icons/projects/moon.jpeg +0 -0
- agentwire_dev-1.47.0/agentwire/static/icons/projects/moon.webp +0 -0
- agentwire_dev-1.47.0/agentwire/static/icons/projects/slime.jpeg +0 -0
- agentwire_dev-1.47.0/agentwire/static/icons/projects/slime.webp +0 -0
- agentwire_dev-1.47.0/agentwire/static/icons/projects/star.jpeg +0 -0
- agentwire_dev-1.47.0/agentwire/static/icons/projects/star.webp +0 -0
- agentwire_dev-1.47.0/agentwire/static/icons/projects/tentacle.jpeg +0 -0
- agentwire_dev-1.47.0/agentwire/static/icons/projects/tentacle.webp +0 -0
- agentwire_dev-1.47.0/agentwire/static/icons/projects/winged.jpeg +0 -0
- agentwire_dev-1.47.0/agentwire/static/icons/projects/winged.webp +0 -0
- agentwire_dev-1.47.0/agentwire/static/icons/sessions/bear.jpeg +0 -0
- agentwire_dev-1.47.0/agentwire/static/icons/sessions/cat.jpeg +0 -0
- agentwire_dev-1.47.0/agentwire/static/icons/sessions/crown.jpeg +0 -0
- agentwire_dev-1.47.0/agentwire/static/icons/sessions/custom/agentwire-portal.png +0 -0
- agentwire_dev-1.47.0/agentwire/static/icons/sessions/custom/agentwire-tts.png +0 -0
- agentwire_dev-1.47.0/agentwire/static/icons/sessions/custom/agentwire.png +0 -0
- agentwire_dev-1.47.0/agentwire/static/icons/sessions/deer.jpeg +0 -0
- agentwire_dev-1.47.0/agentwire/static/icons/sessions/drone.jpeg +0 -0
- agentwire_dev-1.47.0/agentwire/static/icons/sessions/eagle.jpeg +0 -0
- agentwire_dev-1.47.0/agentwire/static/icons/sessions/fox.jpeg +0 -0
- agentwire_dev-1.47.0/agentwire/static/icons/sessions/hawk.jpeg +0 -0
- agentwire_dev-1.47.0/agentwire/static/icons/sessions/horse.jpeg +0 -0
- agentwire_dev-1.47.0/agentwire/static/icons/sessions/lion.jpeg +0 -0
- agentwire_dev-1.47.0/agentwire/static/icons/sessions/rabbit.jpeg +0 -0
- agentwire_dev-1.47.0/agentwire/static/icons/sessions/robot.jpeg +0 -0
- agentwire_dev-1.47.0/agentwire/static/icons/sessions/tiger.jpeg +0 -0
- agentwire_dev-1.47.0/agentwire/static/icons/sessions/wolf.jpeg +0 -0
- agentwire_dev-1.47.0/agentwire/static/js/components/icon-picker.js +0 -136
- agentwire_dev-1.47.0/agentwire/static/js/components/list-card.js +0 -156
- agentwire_dev-1.47.0/agentwire/static/js/components/type-tag.js +0 -45
- agentwire_dev-1.47.0/agentwire/static/js/utils/auto-refresh.js +0 -66
- agentwire_dev-1.47.0/agentwire/tts/engines/qwen_base.py +0 -192
- agentwire_dev-1.47.0/agentwire/tts/engines/qwen_custom.py +0 -189
- agentwire_dev-1.47.0/agentwire/tts/engines/qwen_design.py +0 -170
- agentwire_dev-1.47.0/requirements-tts.txt +0 -24
- agentwire_dev-1.47.0/tests/unit/test_session_ready.py +0 -244
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/.claude/skills/wiki/SKILL.md +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/.github/FUNDING.yml +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/.github/ISSUE_TEMPLATE/question.md +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/.github/workflows/pytest.yml +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/.github/workflows/ruff.yml +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/.github/workflows/security.yml +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/.github/workflows/tts-smoke.yml +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/CODE_OF_CONDUCT.md +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/Dockerfile.local +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/LICENSE +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/SECURITY.md +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/SPONSORS.md +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/__main__.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/agents/__init__.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/cached_status.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/channels/__init__.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/channels/base.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/channels/push.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/core.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/council/__init__.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/council/inbox.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/council/state.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/council/view.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/devices.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/diff_cli.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/doctor_voice.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/ensure_cli.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/fetch.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/handoff/__init__.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/handoff/git_state.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/handoff/instructions.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/handoff/parser.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/handoff/renderer.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/handoff/schema.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/handoff_cli.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/history.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/history_cli.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/hooks/__init__.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/hooks/agentwire-permission.sh +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/hooks/damage-control/__init__.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/hooks/damage-control/audit_logger.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/hooks/damage-control/bash-tool-damage-control.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/hooks/damage-control/edit-tool-damage-control.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/hooks/damage-control/mcp-tool-damage-control.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/hooks/damage-control/read-tool-damage-control.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/hooks/damage-control/rules/agentwire.yaml +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/hooks/damage-control/rules/aws.yaml +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/hooks/damage-control/rules/cloud-hosting.yaml +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/hooks/damage-control/rules/containers.yaml +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/hooks/damage-control/rules/control-plane.yaml +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/hooks/damage-control/rules/core.yaml +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/hooks/damage-control/rules/databases.yaml +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/hooks/damage-control/rules/firebase.yaml +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/hooks/damage-control/rules/gcp.yaml +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/hooks/damage-control/rules/git.yaml +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/hooks/damage-control/rules/gws.yaml +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/hooks/damage-control/rules/infrastructure.yaml +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/hooks/damage-control/rules/outbound.yaml +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/hooks/damage-control/rules/publish.yaml +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/hooks/damage-control/rules/remote.yaml +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/hooks/damage-control/write-tool-damage-control.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/hooks/idle-handler.sh +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/hooks/queue-processor.sh +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/inbox.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/limits_cli.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/listen.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/locking.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/machine_cli.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/mcp_cli.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/msg_cli.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/network.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/notify_cli.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/onboarding.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/pane_cli.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/pane_manager.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/portal_cli.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/project_config.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/projects.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/prompt_router.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/prompts_cli.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/push_cli.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/push_store.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/repo_cli.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/research.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/roles/__init__.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/roles/agentwire.md +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/roles/anchor.md +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/roles/chatbot.md +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/roles/correspondent.md +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/roles/council-brain.md +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/roles/council-conscience.md +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/roles/council-critic.md +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/roles/council-devils-advocate.md +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/roles/council-gut.md +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/roles/council-historian.md +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/roles/council-member.md +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/roles/council-orchestrator.md +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/roles/notifications.md +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/roles/orchestrator.md +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/roles/soul.md +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/roles/task-runner.md +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/roles/voice.md +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/roles/worker.md +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/roles/worktree-session.md +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/roles_cli.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/safety/__init__.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/safety/_core.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/scheduler.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/scheduler_cli.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/scratchpad.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/security.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/send_cli.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/services.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/session_context.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/ssh.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/static/agentwire-splash-logo-layers--agentwire-text.png +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/static/agentwire-splash-logo-layers--echo-claw-fg.png +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/static/agentwire-splash-logo-layers--echo.png +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/static/agentwire-splash-logo-layers--telephone.png +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/static/agentwire-splash-logo-layers--tree.png +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/static/announcements.json +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/static/css/mobile.css +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/static/favicon.png +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/static/icons/sessions/bear.webp +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/static/icons/sessions/cat.webp +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/static/icons/sessions/crown.webp +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/static/icons/sessions/custom/agentwire-portal.webp +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/static/icons/sessions/custom/agentwire-tts.webp +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/static/icons/sessions/custom/agentwire.webp +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/static/icons/sessions/deer.webp +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/static/icons/sessions/drone.webp +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/static/icons/sessions/eagle.webp +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/static/icons/sessions/fox.webp +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/static/icons/sessions/hawk.webp +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/static/icons/sessions/horse.webp +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/static/icons/sessions/lion.webp +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/static/icons/sessions/rabbit.webp +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/static/icons/sessions/robot.webp +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/static/icons/sessions/tiger.webp +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/static/icons/sessions/wolf.webp +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/static/img/icon-192.png +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/static/img/icon-512.png +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/static/js/.gitkeep +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/static/js/announcement-modal.js +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/static/js/api.js +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/static/js/artifact-window.js +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/static/js/collage.js +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/static/js/command-palette.js +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/static/js/council-window.js +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/static/js/dead-key-suppressor.js +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/static/js/desktop-manager.js +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/static/js/desktop.js +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/static/js/mobile.js +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/static/js/notification-prefs.js +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/static/js/notifications-panel.js +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/static/js/push-client.js +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/static/js/review-window.js +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/static/js/safety-shared.js +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/static/js/safety-window.js +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/static/js/scratchpad.js +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/static/js/service-classification.js +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/static/js/session-id.js +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/static/js/session-window.js +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/static/js/sidebar/artifacts-section.js +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/static/js/sidebar/config-section.js +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/static/js/sidebar/council-section.js +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/static/js/sidebar/machines-section.js +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/static/js/sidebar/projects-section.js +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/static/js/sidebar/safety-section.js +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/static/js/sidebar/scheduler-section.js +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/static/js/sidebar/services-section.js +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/static/js/sidebar/sessions-section.js +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/static/js/sidebar.js +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/static/js/terminal-font-prefs.js +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/static/js/tile-manager.js +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/static/js/toast.js +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/static/js/token-modal.js +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/static/js/utils/ansi.js +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/static/js/utils/swipe.js +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/static/js/voice/autosend-prefs.js +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/static/js/voice/browser-stt.js +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/static/js/voice/browser-tts.js +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/static/js/voice/jargon.js +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/static/js/voice/prompt.js +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/static/js/winbox.bundle.min.js +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/static/manifest.webmanifest +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/static/service-worker.js +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/stt/__init__.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/stt/base.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/stt/cloud.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/stt/engine.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/stt/local.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/stt/server_backend.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/stt/stt_server.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/system_cli.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/tasks.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/templates/__init__.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/templates/base.html +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/templates/desktop.html +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/templates/email_notification.html +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/templates/handoff/show-the-story.html.j2 +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/templates/handoff/theme.css.j2 +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/templates/mobile.html +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/templates/pair.html +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/templates/tmux.conf +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/templating.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/tooldefs/aws.yaml +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/tooldefs/docker.yaml +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/tooldefs/gcp.yaml +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/tooldefs/gh.yaml +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/tooldefs/git.yaml +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/tooldefs/gws.yaml +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/tooldefs/kubectl.yaml +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/tooldefs/npm.yaml +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/tooldefs/terraform.yaml +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/tooldefs/uv.yaml +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/tts/__init__.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/tts/audio.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/tts/engines/chatterbox.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/tts/engines/kokoro.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/tts/engines/zonos.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/tts/kokoro_server.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/tts/local.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/tunnels.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/tunnels_cli.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/usage_limit.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/utils/__init__.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/utils/chunker.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/utils/event_log.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/utils/file_io.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/utils/paths.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/utils/speech.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/utils/subprocess.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/validation.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/voice_status.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/voiceclone.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/voices/darren.wav +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/voices/default.wav +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/voices/jessica.wav +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/voices/lisa.wav +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/voices/may.wav +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/wiki.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/wiki_audit.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/wiki_cli.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/worktree.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/agentwire/worktree_registry.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/docs/logo.png +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/docs/wiki/architecture.md +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/docs/wiki/communication/channels.md +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/docs/wiki/communication/hammerspoon.md +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/docs/wiki/communication/handoff.md +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/docs/wiki/concepts.md +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/docs/wiki/council.md +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/docs/wiki/deployment/remote-access.md +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/docs/wiki/deployment/remote-machines.md +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/docs/wiki/glossary.md +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/docs/wiki/integrations/gws-google-workspace-cli.md +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/docs/wiki/internals/damage-control.md +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/docs/wiki/internals/parallel-refactor.md +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/docs/wiki/internals/shell-escaping.md +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/docs/wiki/internals/window-collage.md +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/docs/wiki/quickstart.md +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/docs/wiki/research/briefing-mode-feasibility.md +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/docs/wiki/research/orchestration-transport-alternatives.md +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/docs/wiki/scheduling/scheduled-workloads.md +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/docs/wiki/security/damage-control-hardening.md +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/docs/wiki/security/pip-audit.md +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/docs/wiki/security/remote-access-hardening.md +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/docs/wiki/security/secrets.md +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/docs/wiki/services.md +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/docs/wiki/sessions/claude-code-auto-mode.md +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/docs/wiki/sessions/messaging.md +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/docs/wiki/sessions/pi.md +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/docs/wiki/sessions/prompt-routing.md +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/docs/wiki/sessions/window-sizing.md +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/docs/wiki/usage-limit-recovery.md +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/docs/wiki/voice/stt-cloud.md +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/docs/wiki/voice/stt-self-hosted.md +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/tests/conftest.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/tests/e2e/test_portal_ui.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/tests/fixtures/sample_agentwire.yml +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/tests/fixtures/sample_config.yaml +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/tests/fixtures/sample_scheduler.yaml +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/tests/integration/test_council_portal.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/tests/integration/test_scheduler_board.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/tests/integration/test_server_websockets.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/tests/unit/test_announcements.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/tests/unit/test_build_agent_command.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/tests/unit/test_cli_output.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/tests/unit/test_cli_smoke.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/tests/unit/test_council_inbox.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/tests/unit/test_council_state.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/tests/unit/test_council_view.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/tests/unit/test_damage_control_hooks.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/tests/unit/test_damage_control_sync.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/tests/unit/test_devices.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/tests/unit/test_diff_cli.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/tests/unit/test_doctor_voice.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/tests/unit/test_event_log.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/tests/unit/test_file_io.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/tests/unit/test_handoff_git_state.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/tests/unit/test_handoff_instructions.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/tests/unit/test_handoff_parser.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/tests/unit/test_handoff_renderer.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/tests/unit/test_history.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/tests/unit/test_hooks_install.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/tests/unit/test_idle_handler.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/tests/unit/test_idle_nag.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/tests/unit/test_inbox.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/tests/unit/test_init_command.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/tests/unit/test_limits_tick_isolation.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/tests/unit/test_locking.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/tests/unit/test_msg_cli.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/tests/unit/test_portal_api.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/tests/unit/test_project_config.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/tests/unit/test_prompt_router.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/tests/unit/test_push.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/tests/unit/test_rebuild_guard.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/tests/unit/test_repo_cli.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/tests/unit/test_roles.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/tests/unit/test_scheduler.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/tests/unit/test_scheduler_parsing.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/tests/unit/test_scratchpad.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/tests/unit/test_security.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/tests/unit/test_server_async.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/tests/unit/test_server_pure.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/tests/unit/test_services.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/tests/unit/test_session_context.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/tests/unit/test_speech_tags.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/tests/unit/test_ssh.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/tests/unit/test_stt_backend.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/tests/unit/test_stt_cloud.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/tests/unit/test_stt_engine.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/tests/unit/test_task_cli.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/tests/unit/test_tasks.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/tests/unit/test_templating.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/tests/unit/test_terminal_resize.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/tests/unit/test_tmux_template.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/tests/unit/test_tts_local.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/tests/unit/test_tunnels_probe.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/tests/unit/test_usage_limit.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/tests/unit/test_validation.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/tests/unit/test_voice_status.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/tests/unit/test_wiki.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/tests/unit/test_wiki_audit.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/tests/unit/test_worktree.py +0 -0
- {agentwire_dev-1.47.0 → agentwire_dev-1.48.0}/tests/unit/test_worktree_registry.py +0 -0
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Distill this conversation into a shareable handoff bundle (ai-handoff.md + show-the-story.html)
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# /handoff
|
|
6
|
+
|
|
7
|
+
You are about to compile this conversation into a **shareable handoff bundle**. The output is two artifacts:
|
|
8
|
+
|
|
9
|
+
1. **`ai-handoff.md`** — XML-tagged markdown a teammate can paste into another LLM (Opus 4.7) to roughly continue the conversation.
|
|
10
|
+
2. **`show-the-story.html`** — single-file presentation a human can open in a browser.
|
|
11
|
+
|
|
12
|
+
You are uniquely positioned to do this well: you already have full conversation context. Don't ask the user clarifying questions unless something is genuinely ambiguous — distill what you know.
|
|
13
|
+
|
|
14
|
+
## Workflow
|
|
15
|
+
|
|
16
|
+
### 1. Initialize the bundle
|
|
17
|
+
|
|
18
|
+
Call the MCP tool to create the bundle dir and pre-fill the template with git state and the CLAUDE.md/rules/memory chain:
|
|
19
|
+
|
|
20
|
+
```
|
|
21
|
+
mcp__agentwire__handoff_init(title="<short slug>")
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
The tool returns a `bundle_dir` and an `ai_handoff_path`. The pre-filled template at `ai_handoff_path` already has:
|
|
25
|
+
- `<metadata>` populated with cwd, branch, commit, repo url
|
|
26
|
+
- `<instructions>` populated with the full CLAUDE.md chain (verbatim)
|
|
27
|
+
- `<project_state>` populated with `git status`, `git log`, and uncommitted diff
|
|
28
|
+
|
|
29
|
+
You **must not touch** the `<instructions>` section unless redacting something sensitive — it's what makes the bundle portable across machines.
|
|
30
|
+
|
|
31
|
+
### 2. Read the pre-filled template
|
|
32
|
+
|
|
33
|
+
Use Read on `ai_handoff_path` to see exactly what got pre-filled.
|
|
34
|
+
|
|
35
|
+
### 3. Fill in the rest
|
|
36
|
+
|
|
37
|
+
Use Write (or Edit) on `ai_handoff_path` to replace every `{{ ... }}` placeholder with real content. Specifically:
|
|
38
|
+
|
|
39
|
+
#### `<title>`
|
|
40
|
+
One short line summarizing the session — what it was about, not what was decided. Roughly 4-8 words.
|
|
41
|
+
|
|
42
|
+
#### `<metadata>` extras
|
|
43
|
+
Fill `started_at` / `ended_at` if you can estimate them, `user_identity` (if mentioned), and `mcp_servers` (the ones actually used in this conversation).
|
|
44
|
+
|
|
45
|
+
#### `<environment>`
|
|
46
|
+
What the receiver can't see from `cwd` alone. Active panes, channels (Slack/Discord/email), scheduler state if relevant. If nothing notable, write a one-line "no special environment" note.
|
|
47
|
+
|
|
48
|
+
#### `<conversation_summary>`
|
|
49
|
+
This is the most load-bearing section. Be dense and structured.
|
|
50
|
+
|
|
51
|
+
- `<goal>` — one sentence: what this session set out to do.
|
|
52
|
+
- `<tldr>` — one paragraph the receiver reads first. Convey decisions made, current state, and what's next.
|
|
53
|
+
- `<decisions>` — every meaningful decision. For each: `<title>` (short name), `<rationale>` (why), `<alternatives>` (what was considered and not picked). If a user message confirmed a choice, that's a decision.
|
|
54
|
+
- `<dead_ends>` — things tried and rejected. Critical: this saves the receiver from retracing your steps.
|
|
55
|
+
- `<open_threads>` — what's unresolved. Be specific. "tests/handoff/test_parser.py needs malformed-input cases" beats "tests pending".
|
|
56
|
+
- `<stats>` — turns, files_touched, tools_used, duration_minutes. Estimates are fine.
|
|
57
|
+
|
|
58
|
+
#### `<journey>`
|
|
59
|
+
3-7 narrative beats — the *story* of the session, not the transcript. For each beat:
|
|
60
|
+
- `<beat title="...">` — short headline.
|
|
61
|
+
- `<quote>...</quote>` — optional verbatim line from the conversation that captured the turn (user or assistant).
|
|
62
|
+
- `<what_happened>...</what_happened>` — what actually changed.
|
|
63
|
+
|
|
64
|
+
This drives the visual presentation in show-the-story.html. Aim for memorable beats: turning points, surprises, decisions, blockers.
|
|
65
|
+
|
|
66
|
+
#### `<recent_turns>`
|
|
67
|
+
The last ~10-20 turns, **filtered**:
|
|
68
|
+
- Drop tool noise (file reads, searches) unless the result drove a decision.
|
|
69
|
+
- Keep all user turns verbatim — they're the signal of intent.
|
|
70
|
+
- Keep assistant turns that made decisions, asked questions, or summarized.
|
|
71
|
+
- Use markdown: `**user:**` / `**assistant:**` labels, blockquotes for quoted content.
|
|
72
|
+
|
|
73
|
+
#### `<handoff>`
|
|
74
|
+
Direct instructions to the next agent.
|
|
75
|
+
- `<one_sentence>` — what they should do first.
|
|
76
|
+
- `<resume_at>` — concrete file path / TODO id / step number.
|
|
77
|
+
- `<caveats>` — permission boundaries ("don't push", "don't edit X without asking"), env-specific notes, anything the receiver could trip on.
|
|
78
|
+
|
|
79
|
+
#### `<theme>`
|
|
80
|
+
Pick a palette and vibe that matches the **emotional tone** of the session. A debugging crisis at 2am gets different colors than a clean greenfield design pass. Be honest in `mood`. The shape:
|
|
81
|
+
|
|
82
|
+
```json
|
|
83
|
+
{
|
|
84
|
+
"name": "short-slug",
|
|
85
|
+
"mood": "honest read of the session's emotional tone — 1 short sentence",
|
|
86
|
+
"palette": {
|
|
87
|
+
"bg": "#hex",
|
|
88
|
+
"surface": "#hex",
|
|
89
|
+
"fg": "#hex",
|
|
90
|
+
"muted": "#hex",
|
|
91
|
+
"accent": "#hex",
|
|
92
|
+
"accent_2": "#hex",
|
|
93
|
+
"border": "#hex"
|
|
94
|
+
},
|
|
95
|
+
"fonts": {
|
|
96
|
+
"heading": "css font-family stack",
|
|
97
|
+
"body": "css font-family stack"
|
|
98
|
+
},
|
|
99
|
+
"motion": "subtle"
|
|
100
|
+
}
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
Tips:
|
|
104
|
+
- Dark backgrounds work better in this template — `bg` should be deep.
|
|
105
|
+
- `accent` is the dominant interactive color (tabs, headlines, highlights). Pick something that signals the mood.
|
|
106
|
+
- `accent_2` is for warnings / dead-ends. Often a warm color.
|
|
107
|
+
- Keep `fonts.heading` monospace-leaning, `fonts.body` sans-serif. Override only if the mood justifies it.
|
|
108
|
+
- `motion`: `"subtle"` (default), `"playful"` (longer transitions), `"none"` (instant).
|
|
109
|
+
|
|
110
|
+
### 4. Render the HTML
|
|
111
|
+
|
|
112
|
+
After writing `ai-handoff.md`, render the HTML:
|
|
113
|
+
|
|
114
|
+
```
|
|
115
|
+
mcp__agentwire__handoff_render(bundle_dir="<from step 1>", story=true)
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
If render fails, the parser will tell you which tag is missing or malformed — fix and re-run.
|
|
119
|
+
|
|
120
|
+
### 5. Report
|
|
121
|
+
|
|
122
|
+
Give the user:
|
|
123
|
+
- The bundle dir path
|
|
124
|
+
- A one-sentence summary of what you produced
|
|
125
|
+
- An explicit pointer to open `show-the-story.html` in a browser
|
|
126
|
+
|
|
127
|
+
Don't paste the full ai-handoff.md back — it's long. Just confirm it's saved and mention the highlights you captured (number of decisions, dead ends, journey beats, theme name/mood).
|
|
128
|
+
|
|
129
|
+
## Quality bar
|
|
130
|
+
|
|
131
|
+
The receiver's first impression is everything. A great handoff:
|
|
132
|
+
- Reads cold — the receiver doesn't need to be in this folder.
|
|
133
|
+
- Is honest about dead ends. Hiding what didn't work wastes the receiver's tokens.
|
|
134
|
+
- Names specific files and line numbers, not vague pointers.
|
|
135
|
+
- Picks a theme that captures the session's actual feel. Don't pick "professional blue" for a chaotic debug session.
|
|
136
|
+
|
|
137
|
+
## Don't
|
|
138
|
+
|
|
139
|
+
- Don't ask the user "should I include X?" — make the call yourself.
|
|
140
|
+
- Don't paste the entire conversation as `<recent_turns>` — filter aggressively.
|
|
141
|
+
- Don't over-design the theme. The structure is fixed; you're picking colors and vibes, not a layout.
|
|
142
|
+
- Don't edit `<instructions>` (the CLAUDE.md chain) unless redacting secrets.
|
|
@@ -144,7 +144,7 @@ def validate_config(config: Config) -> tuple[list[ConfigError], list[ConfigWarni
|
|
|
144
144
|
|
|
145
145
|
## CLI First
|
|
146
146
|
|
|
147
|
-
All session/machine logic lives in CLI
|
|
147
|
+
All session/machine logic lives in the CLI. The command tree is split per-domain (#495): shared helpers (machine config, SSH, JSON output, session resolution, etc.) live in `core.py`; each command group lives in its own `agentwire/<domain>_cli.py` exposing a `register_<domain>_parser(subparsers)` registrar, and `build_parser()` imports them and runs the `_REGISTRARS` loop. `__main__.py` is just the entry point. Adding a command means writing a new `*_cli.py` + appending its registrar, not editing a god-file. The web portal is a thin wrapper that:
|
|
148
148
|
|
|
149
149
|
1. Calls CLI via `run_agentwire_cmd(["command", "args"])`
|
|
150
150
|
2. Parses JSON output (`--json` flag)
|
|
@@ -159,7 +159,9 @@ When adding new functionality:
|
|
|
159
159
|
|
|
160
160
|
```
|
|
161
161
|
agentwire/
|
|
162
|
-
├── __main__.py # CLI
|
|
162
|
+
├── __main__.py # CLI entry point (imports + runs the registrar loop)
|
|
163
|
+
├── core.py # Shared CLI helpers (machine config, SSH, JSON, session resolution)
|
|
164
|
+
├── *_cli.py # Per-domain command groups, each with a register_<domain>_parser()
|
|
163
165
|
├── server.py # WebSocket server
|
|
164
166
|
├── config.py # Configuration dataclasses
|
|
165
167
|
├── errors.py # Structured error classes
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: agentwire-dev
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.48.0
|
|
4
4
|
Summary: Multi-session voice web interface for AI coding agents
|
|
5
5
|
Project-URL: Homepage, https://agentwire.dev
|
|
6
6
|
Project-URL: Repository, https://github.com/dotdevdotdev/agentwire-dev
|
|
@@ -256,7 +256,6 @@ Requires-Dist: fastapi>=0.104.0; extra == 'tts'
|
|
|
256
256
|
Requires-Dist: faster-whisper>=1.0.0; extra == 'tts'
|
|
257
257
|
Requires-Dist: pydantic>=2.0.0; extra == 'tts'
|
|
258
258
|
Requires-Dist: python-multipart>=0.0.6; extra == 'tts'
|
|
259
|
-
Requires-Dist: runpod>=1.6.0; extra == 'tts'
|
|
260
259
|
Requires-Dist: torch>=2.0.0; extra == 'tts'
|
|
261
260
|
Requires-Dist: torchaudio>=2.0.0; extra == 'tts'
|
|
262
261
|
Requires-Dist: uvicorn>=0.24.0; extra == 'tts'
|
|
@@ -295,9 +294,9 @@ structurally can't match:
|
|
|
295
294
|
the machine.
|
|
296
295
|
- **Voice-native, not voice-bolted-on.** Push-to-talk in, **neural TTS out on plain
|
|
297
296
|
CPU** (Kokoro, no GPU). Want your agents to talk back in a **cloned voice**? Run a
|
|
298
|
-
self-hosted GPU shim (Chatterbox /
|
|
297
|
+
self-hosted GPU shim (Chatterbox / Zonos) — same machine, still your keys.
|
|
299
298
|
- **Built to orchestrate _many_ agents, not watch one.** Council (multi-soul
|
|
300
|
-
deliberation),
|
|
299
|
+
deliberation), a recurring scheduler, briefing mode, and worktree-parallel
|
|
301
300
|
workers — tmux- and Claude-Code-native from the ground up.
|
|
302
301
|
|
|
303
302
|
> **Use the official app to watch one session; use AgentWire to orchestrate many,
|
|
@@ -388,7 +387,7 @@ pip install agentwire-dev
|
|
|
388
387
|
| **Voice Control** | Push-to-talk from any device on your network |
|
|
389
388
|
| **Neural Voice + Cloning** | Kokoro neural TTS on CPU out of the box; voice cloning via a self-hosted GPU shim |
|
|
390
389
|
| **Council** | Fan a prompt to multiple "soul" sessions (brain, conscience, critic…), synthesize with attribution |
|
|
391
|
-
| **Scheduler** |
|
|
390
|
+
| **Scheduler** | Recurring autonomous tasks with gates, priorities, and usage-limit recovery |
|
|
392
391
|
| **Briefing Mode** | A terse human-facing anchor fans out verbose worktree correspondents, then briefs you on cue |
|
|
393
392
|
| **Multi-Session** | Run multiple agents on different projects simultaneously |
|
|
394
393
|
| **Git Worktrees** | Same project, multiple branches, parallel agents |
|
|
@@ -474,7 +473,7 @@ Two tiers, both sides:
|
|
|
474
473
|
# ~/.agentwire/config.yaml
|
|
475
474
|
tts:
|
|
476
475
|
backend: "custom"
|
|
477
|
-
url: "http://localhost:8100" # agentwire tts start (kokoro CPU / chatterbox GPU /
|
|
476
|
+
url: "http://localhost:8100" # agentwire tts start (kokoro CPU / chatterbox GPU / zonos)
|
|
478
477
|
options:
|
|
479
478
|
backend: kokoro
|
|
480
479
|
stt:
|
|
@@ -31,9 +31,9 @@ structurally can't match:
|
|
|
31
31
|
the machine.
|
|
32
32
|
- **Voice-native, not voice-bolted-on.** Push-to-talk in, **neural TTS out on plain
|
|
33
33
|
CPU** (Kokoro, no GPU). Want your agents to talk back in a **cloned voice**? Run a
|
|
34
|
-
self-hosted GPU shim (Chatterbox /
|
|
34
|
+
self-hosted GPU shim (Chatterbox / Zonos) — same machine, still your keys.
|
|
35
35
|
- **Built to orchestrate _many_ agents, not watch one.** Council (multi-soul
|
|
36
|
-
deliberation),
|
|
36
|
+
deliberation), a recurring scheduler, briefing mode, and worktree-parallel
|
|
37
37
|
workers — tmux- and Claude-Code-native from the ground up.
|
|
38
38
|
|
|
39
39
|
> **Use the official app to watch one session; use AgentWire to orchestrate many,
|
|
@@ -124,7 +124,7 @@ pip install agentwire-dev
|
|
|
124
124
|
| **Voice Control** | Push-to-talk from any device on your network |
|
|
125
125
|
| **Neural Voice + Cloning** | Kokoro neural TTS on CPU out of the box; voice cloning via a self-hosted GPU shim |
|
|
126
126
|
| **Council** | Fan a prompt to multiple "soul" sessions (brain, conscience, critic…), synthesize with attribution |
|
|
127
|
-
| **Scheduler** |
|
|
127
|
+
| **Scheduler** | Recurring autonomous tasks with gates, priorities, and usage-limit recovery |
|
|
128
128
|
| **Briefing Mode** | A terse human-facing anchor fans out verbose worktree correspondents, then briefs you on cue |
|
|
129
129
|
| **Multi-Session** | Run multiple agents on different projects simultaneously |
|
|
130
130
|
| **Git Worktrees** | Same project, multiple branches, parallel agents |
|
|
@@ -210,7 +210,7 @@ Two tiers, both sides:
|
|
|
210
210
|
# ~/.agentwire/config.yaml
|
|
211
211
|
tts:
|
|
212
212
|
backend: "custom"
|
|
213
|
-
url: "http://localhost:8100" # agentwire tts start (kokoro CPU / chatterbox GPU /
|
|
213
|
+
url: "http://localhost:8100" # agentwire tts start (kokoro CPU / chatterbox GPU / zonos)
|
|
214
214
|
options:
|
|
215
215
|
backend: kokoro
|
|
216
216
|
stt:
|
|
@@ -34,10 +34,13 @@ unzip -l dist/agentwire_dev-{VERSION}-py3-none-any.whl | grep -E "templates/|sta
|
|
|
34
34
|
|
|
35
35
|
### 4. Publish to PyPI
|
|
36
36
|
|
|
37
|
-
The `PYPI_TOKEN` lives in `~/.agentwire/.env`.
|
|
37
|
+
The `PYPI_TOKEN` lives in `~/.agentwire/.env`. Don't `source` the file — it can
|
|
38
|
+
contain unquoted `&` in other values (e.g. a URL with query params), which makes
|
|
39
|
+
the shell hit a parse error before `uv publish` ever runs. Grep the token out
|
|
40
|
+
directly:
|
|
38
41
|
|
|
39
42
|
```bash
|
|
40
|
-
|
|
43
|
+
uv publish --token "$(grep '^PYPI_TOKEN=' ~/.agentwire/.env | cut -d= -f2-)" dist/agentwire_dev-{VERSION}*
|
|
41
44
|
```
|
|
42
45
|
|
|
43
46
|
### 5. Create GitHub release
|
|
@@ -1,26 +1,11 @@
|
|
|
1
1
|
"""Abstract base class for agent backends."""
|
|
2
2
|
|
|
3
3
|
from abc import ABC, abstractmethod
|
|
4
|
-
from pathlib import Path
|
|
5
4
|
|
|
6
5
|
|
|
7
6
|
class AgentBackend(ABC):
|
|
8
7
|
"""Abstract base for managing AI coding agent sessions."""
|
|
9
8
|
|
|
10
|
-
@abstractmethod
|
|
11
|
-
def create_session(self, name: str, path: Path, options: dict | None = None) -> bool:
|
|
12
|
-
"""Create a new agent session.
|
|
13
|
-
|
|
14
|
-
Args:
|
|
15
|
-
name: Session name (e.g., "api", "auth")
|
|
16
|
-
path: Working directory for the session
|
|
17
|
-
options: Optional backend-specific options
|
|
18
|
-
|
|
19
|
-
Returns:
|
|
20
|
-
True if session was created successfully
|
|
21
|
-
"""
|
|
22
|
-
pass
|
|
23
|
-
|
|
24
9
|
@abstractmethod
|
|
25
10
|
def session_exists(self, name: str) -> bool:
|
|
26
11
|
"""Check if a session exists.
|
|
@@ -74,18 +59,6 @@ class AgentBackend(ABC):
|
|
|
74
59
|
"""
|
|
75
60
|
pass
|
|
76
61
|
|
|
77
|
-
@abstractmethod
|
|
78
|
-
def kill_session(self, name: str) -> bool:
|
|
79
|
-
"""Terminate a session.
|
|
80
|
-
|
|
81
|
-
Args:
|
|
82
|
-
name: Session name
|
|
83
|
-
|
|
84
|
-
Returns:
|
|
85
|
-
True if session was terminated successfully
|
|
86
|
-
"""
|
|
87
|
-
pass
|
|
88
|
-
|
|
89
62
|
@abstractmethod
|
|
90
63
|
def list_sessions(self) -> list[str]:
|
|
91
64
|
"""List all active sessions.
|
|
@@ -3,7 +3,6 @@
|
|
|
3
3
|
import json
|
|
4
4
|
import logging
|
|
5
5
|
import os
|
|
6
|
-
import re
|
|
7
6
|
import shlex
|
|
8
7
|
import subprocess
|
|
9
8
|
from pathlib import Path
|
|
@@ -13,30 +12,10 @@ from .base import AgentBackend
|
|
|
13
12
|
|
|
14
13
|
logger = logging.getLogger(__name__)
|
|
15
14
|
|
|
16
|
-
# Pattern to match env var prefix: VAR='value' or VAR="value" or VAR=value
|
|
17
|
-
ENV_VAR_PREFIX_PATTERN = re.compile(r'^([A-Z_][A-Z0-9_]*)=([\'"]?)(.+?)\2\s+(.+)$')
|
|
18
|
-
|
|
19
15
|
# Base command without permission flags - flags added based on bypass_permissions option
|
|
20
16
|
DEFAULT_AGENT_COMMAND = "claude"
|
|
21
17
|
|
|
22
18
|
|
|
23
|
-
def parse_env_var_prefix(command: str) -> tuple[str | None, str | None, str]:
|
|
24
|
-
"""Parse env var prefix from a command string.
|
|
25
|
-
|
|
26
|
-
Handles commands like: VAR='value' some_command --args
|
|
27
|
-
Returns: (var_name, var_value, remaining_command)
|
|
28
|
-
|
|
29
|
-
If no env var prefix, returns (None, None, original_command)
|
|
30
|
-
"""
|
|
31
|
-
match = ENV_VAR_PREFIX_PATTERN.match(command)
|
|
32
|
-
if match:
|
|
33
|
-
var_name = match.group(1)
|
|
34
|
-
var_value = match.group(3) # The value without quotes
|
|
35
|
-
remaining = match.group(4)
|
|
36
|
-
return var_name, var_value, remaining
|
|
37
|
-
return None, None, command
|
|
38
|
-
|
|
39
|
-
|
|
40
19
|
def _tmux_path() -> str:
|
|
41
20
|
"""Resolve tmux binary path, with fallback to common locations."""
|
|
42
21
|
import shutil
|
|
@@ -183,107 +162,6 @@ class TmuxAgent(AgentBackend):
|
|
|
183
162
|
return name, None
|
|
184
163
|
return name, None
|
|
185
164
|
|
|
186
|
-
def _format_agent_command(self, name: str, path: Path, options: dict | None = None) -> str:
|
|
187
|
-
"""Format the agent command with placeholders.
|
|
188
|
-
|
|
189
|
-
Args:
|
|
190
|
-
name: Session name
|
|
191
|
-
path: Working directory
|
|
192
|
-
options: Additional options including:
|
|
193
|
-
- model: Model to use
|
|
194
|
-
- session_id: Claude Code session UUID
|
|
195
|
-
- fork_from: Session ID to fork from (uses --resume --fork-session)
|
|
196
|
-
- bypass_permissions: If True, add --dangerously-skip-permissions flag
|
|
197
|
-
|
|
198
|
-
Returns:
|
|
199
|
-
Formatted command string
|
|
200
|
-
"""
|
|
201
|
-
options = options or {}
|
|
202
|
-
model = options.get("model", self.default_model)
|
|
203
|
-
session_id = options.get("session_id")
|
|
204
|
-
fork_from = options.get("fork_from")
|
|
205
|
-
bypass_permissions = options.get("bypass_permissions", True)
|
|
206
|
-
|
|
207
|
-
cmd = self.agent_command
|
|
208
|
-
cmd = cmd.replace("{name}", name)
|
|
209
|
-
cmd = cmd.replace("{path}", str(path))
|
|
210
|
-
cmd = cmd.replace("{model}", model)
|
|
211
|
-
|
|
212
|
-
# Add permission bypass flag if requested
|
|
213
|
-
if bypass_permissions:
|
|
214
|
-
cmd = f"{cmd} --dangerously-skip-permissions"
|
|
215
|
-
|
|
216
|
-
# Add session ID if provided (for new sessions)
|
|
217
|
-
if session_id and not fork_from:
|
|
218
|
-
cmd = f"{cmd} --session-id {session_id}"
|
|
219
|
-
|
|
220
|
-
# Fork from existing session
|
|
221
|
-
if fork_from:
|
|
222
|
-
cmd = f"{cmd} --resume {fork_from} --fork-session"
|
|
223
|
-
# Also set the new session ID if provided
|
|
224
|
-
if session_id:
|
|
225
|
-
cmd = f"{cmd} --session-id {session_id}"
|
|
226
|
-
|
|
227
|
-
return cmd
|
|
228
|
-
|
|
229
|
-
def create_session(self, name: str, path: Path, options: dict | None = None) -> bool:
|
|
230
|
-
"""Create a new tmux session and start the agent."""
|
|
231
|
-
options = options or {}
|
|
232
|
-
session_name, machine = self._parse_session_name(name)
|
|
233
|
-
agent_cmd = self._format_agent_command(session_name, path, options)
|
|
234
|
-
|
|
235
|
-
if machine:
|
|
236
|
-
projects_dir = machine.get("projects_dir", "~/projects")
|
|
237
|
-
remote_path = f"{projects_dir}/{path.name}" if not str(path).startswith("/") else str(path)
|
|
238
|
-
|
|
239
|
-
# Parse env var prefix (e.g., ANTHROPIC_AUTH_TOKEN='...' claude)
|
|
240
|
-
# Must use tmux set-environment for remote sessions since shlex.quote
|
|
241
|
-
# would break the env var assignment
|
|
242
|
-
env_var, env_val, actual_cmd = parse_env_var_prefix(agent_cmd)
|
|
243
|
-
|
|
244
|
-
cmd_parts = [
|
|
245
|
-
f"tmux new-session -d -s {shlex.quote(session_name)} -c {shlex.quote(remote_path)}"
|
|
246
|
-
]
|
|
247
|
-
|
|
248
|
-
if env_var:
|
|
249
|
-
# Set env var in tmux session environment
|
|
250
|
-
cmd_parts.append(
|
|
251
|
-
f"tmux set-environment -t {shlex.quote(session_name)} {env_var} {shlex.quote(env_val)}"
|
|
252
|
-
)
|
|
253
|
-
|
|
254
|
-
# Send the actual command (without env var prefix if it was extracted)
|
|
255
|
-
cmd_parts.append(
|
|
256
|
-
f"tmux send-keys -t {shlex.quote(session_name)} {shlex.quote(actual_cmd)} Enter"
|
|
257
|
-
)
|
|
258
|
-
|
|
259
|
-
cmd = " && ".join(cmd_parts)
|
|
260
|
-
result = self._run_remote(machine, cmd)
|
|
261
|
-
else:
|
|
262
|
-
# Create session
|
|
263
|
-
result = self._run_local([
|
|
264
|
-
"tmux", "new-session", "-d",
|
|
265
|
-
"-s", session_name,
|
|
266
|
-
"-c", str(path),
|
|
267
|
-
])
|
|
268
|
-
|
|
269
|
-
if result.returncode != 0:
|
|
270
|
-
logger.error(f"Failed to create session: {result.stderr}")
|
|
271
|
-
return False
|
|
272
|
-
|
|
273
|
-
# Start agent
|
|
274
|
-
result = self._run_local([
|
|
275
|
-
"tmux", "send-keys",
|
|
276
|
-
"-t", session_name,
|
|
277
|
-
agent_cmd, "Enter",
|
|
278
|
-
])
|
|
279
|
-
|
|
280
|
-
if result.returncode != 0:
|
|
281
|
-
logger.error(f"Failed to start agent: {result.stderr}")
|
|
282
|
-
return False
|
|
283
|
-
|
|
284
|
-
logger.info(f"Created session '{name}' at {path}")
|
|
285
|
-
return True
|
|
286
|
-
|
|
287
165
|
def session_exists(self, name: str) -> bool:
|
|
288
166
|
"""Check if a tmux session exists."""
|
|
289
167
|
session_name, machine = self._parse_session_name(name)
|
|
@@ -416,25 +294,6 @@ class TmuxAgent(AgentBackend):
|
|
|
416
294
|
|
|
417
295
|
return True
|
|
418
296
|
|
|
419
|
-
def kill_session(self, name: str) -> bool:
|
|
420
|
-
"""Terminate a tmux session."""
|
|
421
|
-
session_name, machine = self._parse_session_name(name)
|
|
422
|
-
|
|
423
|
-
if machine:
|
|
424
|
-
cmd = f"tmux kill-session -t {shlex.quote(session_name)}"
|
|
425
|
-
result = self._run_remote(machine, cmd)
|
|
426
|
-
else:
|
|
427
|
-
result = self._run_local([
|
|
428
|
-
"tmux", "kill-session", "-t", session_name,
|
|
429
|
-
])
|
|
430
|
-
|
|
431
|
-
if result.returncode != 0:
|
|
432
|
-
logger.error(f"Failed to kill session: {result.stderr}")
|
|
433
|
-
return False
|
|
434
|
-
|
|
435
|
-
logger.info(f"Killed session '{name}'")
|
|
436
|
-
return True
|
|
437
|
-
|
|
438
297
|
def list_sessions(self) -> list[str]:
|
|
439
298
|
"""List all tmux sessions (from configured machines via SSH)."""
|
|
440
299
|
sessions = []
|
|
@@ -160,7 +160,7 @@ def _render_email_template(
|
|
|
160
160
|
|
|
161
161
|
|
|
162
162
|
def _get_email_config() -> EmailConfig:
|
|
163
|
-
"""Get email config from channels registry
|
|
163
|
+
"""Get email config from channels registry."""
|
|
164
164
|
from agentwire.config import get_config
|
|
165
165
|
|
|
166
166
|
config = get_config()
|
|
@@ -30,8 +30,8 @@ class QuoConfigError(NotificationError):
|
|
|
30
30
|
class QuoConfig:
|
|
31
31
|
"""Quo (OpenPhone) SMS configuration.
|
|
32
32
|
|
|
33
|
-
The API key is env-only: QUO_API_KEY
|
|
34
|
-
|
|
33
|
+
The API key is env-only: QUO_API_KEY, normally a line in
|
|
34
|
+
~/.agentwire/.env (docs/wiki/security/secrets.md).
|
|
35
35
|
It is never read from config.yaml.
|
|
36
36
|
"""
|
|
37
37
|
|
|
@@ -40,7 +40,7 @@ class QuoConfig:
|
|
|
40
40
|
api_key: str = field(init=False, default="")
|
|
41
41
|
|
|
42
42
|
def __post_init__(self):
|
|
43
|
-
self.api_key = os.environ.get("QUO_API_KEY", "")
|
|
43
|
+
self.api_key = os.environ.get("QUO_API_KEY", "")
|
|
44
44
|
|
|
45
45
|
|
|
46
46
|
API_URL = "https://api.openphone.com/v1/messages"
|
|
@@ -534,7 +534,7 @@ def register_channels_parser(subparsers) -> None:
|
|
|
534
534
|
say_parser.add_argument("-s", "--session", type=str, help="Session name (auto-detected from .agentwire.yml or tmux)")
|
|
535
535
|
say_parser.add_argument("--exaggeration", type=float, help="Voice exaggeration (0-1, Chatterbox)")
|
|
536
536
|
say_parser.add_argument("--cfg", type=float, help="CFG weight (0-1, Chatterbox)")
|
|
537
|
-
say_parser.add_argument("--backend", type=str, help="TTS backend (chatterbox,
|
|
537
|
+
say_parser.add_argument("--backend", type=str, help="TTS backend (chatterbox, zonos-hybrid, zonos-transformer, kokoro)")
|
|
538
538
|
say_parser.add_argument("--instructions", type=str, help="Free-text style instructions passed to the TTS shim (e.g. 'speak warmly')")
|
|
539
539
|
say_parser.add_argument("--language", type=str, default="English", help="Language (default: English)")
|
|
540
540
|
say_parser.add_argument("--stream", action="store_true", help="Use streaming mode (if backend supports)")
|
|
@@ -220,13 +220,10 @@ def clear_task_context(session: str) -> None:
|
|
|
220
220
|
session: tmux session name
|
|
221
221
|
"""
|
|
222
222
|
context_file = TASKS_DIR / f"{session}.json"
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
f.unlink(missing_ok=True)
|
|
228
|
-
except OSError:
|
|
229
|
-
pass
|
|
223
|
+
try:
|
|
224
|
+
context_file.unlink(missing_ok=True)
|
|
225
|
+
except OSError:
|
|
226
|
+
pass
|
|
230
227
|
|
|
231
228
|
|
|
232
229
|
def wait_for_completion_signal(
|
|
@@ -253,8 +250,6 @@ def wait_for_completion_signal(
|
|
|
253
250
|
Raises:
|
|
254
251
|
CompletionTimeout: If session dies before task completed
|
|
255
252
|
"""
|
|
256
|
-
complete_file = TASKS_DIR / f"{session}.complete"
|
|
257
|
-
|
|
258
253
|
# Build glob pattern for fuzzy summary detection (agents sometimes
|
|
259
254
|
# invent their own timestamp instead of using the provided filename).
|
|
260
255
|
summary_glob = None
|
|
@@ -305,14 +300,6 @@ def wait_for_completion_signal(
|
|
|
305
300
|
except CompletionError:
|
|
306
301
|
pass # File may be partially written, retry
|
|
307
302
|
|
|
308
|
-
# Fallback: check for legacy .complete signal file
|
|
309
|
-
if complete_file.exists():
|
|
310
|
-
try:
|
|
311
|
-
signal = json.loads(complete_file.read_text())
|
|
312
|
-
return signal
|
|
313
|
-
except (json.JSONDecodeError, OSError):
|
|
314
|
-
pass # File may be partially written, retry
|
|
315
|
-
|
|
316
303
|
# Usage-limit dialog: park deterministically (zero-LLM) and report a
|
|
317
304
|
# distinct status — the watchdog resumes the session after reset.
|
|
318
305
|
# Also honors a park the watchdog performed first.
|
|
@@ -607,9 +607,8 @@ def _dict_to_config(data: dict) -> Config:
|
|
|
607
607
|
extra=projects_data.get("extra", []),
|
|
608
608
|
)
|
|
609
609
|
|
|
610
|
-
# Worktree-session orchestration (`worktree:` key).
|
|
611
|
-
|
|
612
|
-
worktree_data = data.get("worktree", data.get("quicktask", {})) or {}
|
|
610
|
+
# Worktree-session orchestration (`worktree:` key).
|
|
611
|
+
worktree_data = data.get("worktree", {}) or {}
|
|
613
612
|
worktree = WorktreeConfig(
|
|
614
613
|
default_base=worktree_data.get("default_base"),
|
|
615
614
|
default_project=worktree_data.get("default_project"),
|