agentirc-cli 4.1.0__tar.gz → 4.1.1__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.
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/CHANGELOG.md +9 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/PKG-INFO +1 -1
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/clients/acp/agent_runner.py +22 -8
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/clients/acp/config.py +2 -2
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/clients/acp/daemon.py +3 -1
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/clients/claude/config.py +2 -2
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/clients/codex/config.py +2 -2
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/clients/codex/daemon.py +3 -1
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/clients/copilot/config.py +2 -2
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/clients/copilot/daemon.py +3 -1
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/docs/channel-polling.md +1 -1
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/packages/agent-harness/config.py +2 -2
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/packages/agent-harness/daemon.py +7 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/pyproject.toml +1 -1
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/tests/test_acp_daemon.py +46 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/tests/test_mention_alias.py +0 -1
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/uv.lock +1 -1
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/.claude/skills/pr-review/SKILL.md +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/.claude/skills/run-tests/SKILL.md +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/.claude/skills/run-tests/scripts/test.sh +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/.flake8 +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/.github/workflows/pages.yml +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/.github/workflows/publish.yml +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/.github/workflows/security-checks.yml +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/.github/workflows/tests.yml +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/.gitignore +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/.markdownlint-cli2.yaml +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/.pr_agent.toml +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/.pre-commit-config.yaml +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/.pylintrc +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/CLAUDE.md +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/CNAME +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/Gemfile +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/Gemfile.lock +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/LICENSE +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/README.md +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/SECURITY.md +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/_config.yml +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/_sass/color_schemes/anthropic.scss +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/_sass/custom/custom.scss +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/__init__.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/__main__.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/bots/__init__.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/bots/bot.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/bots/bot_manager.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/bots/config.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/bots/http_listener.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/bots/template_engine.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/bots/virtual_client.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/cli/__init__.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/cli/_helpers.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/cli/agent.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/cli/bot.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/cli/channel.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/cli/mesh.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/cli/server.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/cli/skills.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/clients/__init__.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/clients/acp/__init__.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/clients/acp/ipc.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/clients/acp/irc_transport.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/clients/acp/message_buffer.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/clients/acp/skill/SKILL.md +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/clients/acp/skill/__init__.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/clients/acp/skill/irc_client.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/clients/acp/socket_server.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/clients/acp/supervisor.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/clients/acp/webhook.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/clients/claude/__init__.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/clients/claude/__main__.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/clients/claude/agent_runner.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/clients/claude/daemon.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/clients/claude/ipc.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/clients/claude/irc_transport.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/clients/claude/message_buffer.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/clients/claude/skill/SKILL.md +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/clients/claude/skill/__init__.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/clients/claude/skill/irc_client.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/clients/claude/socket_server.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/clients/claude/supervisor.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/clients/claude/webhook.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/clients/codex/__init__.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/clients/codex/agent_runner.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/clients/codex/ipc.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/clients/codex/irc_transport.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/clients/codex/message_buffer.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/clients/codex/skill/SKILL.md +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/clients/codex/skill/__init__.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/clients/codex/skill/irc_client.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/clients/codex/socket_server.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/clients/codex/supervisor.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/clients/codex/webhook.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/clients/copilot/__init__.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/clients/copilot/agent_runner.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/clients/copilot/ipc.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/clients/copilot/irc_transport.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/clients/copilot/message_buffer.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/clients/copilot/skill/SKILL.md +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/clients/copilot/skill/__init__.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/clients/copilot/skill/irc_client.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/clients/copilot/socket_server.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/clients/copilot/supervisor.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/clients/copilot/webhook.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/console/__init__.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/console/app.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/console/client.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/console/commands.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/console/widgets/__init__.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/console/widgets/chat.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/console/widgets/info_panel.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/console/widgets/sidebar.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/credentials.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/learn_prompt.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/mesh_config.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/observer.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/overview/__init__.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/overview/collector.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/overview/model.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/overview/renderer_text.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/overview/renderer_web.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/overview/web/style.css +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/persistence.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/pidfile.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/protocol/__init__.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/protocol/commands.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/protocol/extensions/federation.md +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/protocol/extensions/history.md +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/protocol/extensions/icons.md +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/protocol/extensions/rooms.md +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/protocol/extensions/tags.md +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/protocol/extensions/threads.md +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/protocol/message.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/protocol/protocol-index.md +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/protocol/replies.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/server/__init__.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/server/__main__.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/server/channel.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/server/client.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/server/config.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/server/ircd.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/server/remote_client.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/server/room_store.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/server/rooms_util.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/server/server_link.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/server/skill.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/server/skills/__init__.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/server/skills/history.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/server/skills/icon.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/server/skills/rooms.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/server/skills/threads.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/server/thread_store.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/culture/skills/culture/SKILL.md +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/docs/agent-lifecycle.md +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/docs/agentic-self-learn.md +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/docs/architecture/agent-client.md +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/docs/architecture/agent-harness-spec.md +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/docs/architecture/design.md +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/docs/architecture/harness-conformance.md +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/docs/architecture/index.md +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/docs/architecture/layer1-core-irc.md +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/docs/architecture/layer2-attention.md +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/docs/architecture/layer3-skills.md +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/docs/architecture/layer4-federation.md +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/docs/architecture/layer5-agent-harness.md +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/docs/architecture/server-architecture.md +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/docs/architecture/threads.md +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/docs/clients/acp/overview.md +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/docs/clients/claude/configuration.md +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/docs/clients/claude/context-management.md +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/docs/clients/claude/irc-tools.md +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/docs/clients/claude/overview.md +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/docs/clients/claude/setup.md +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/docs/clients/claude/supervisor.md +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/docs/clients/claude/webhooks.md +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/docs/clients/codex/configuration.md +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/docs/clients/codex/context-management.md +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/docs/clients/codex/irc-tools.md +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/docs/clients/codex/overview.md +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/docs/clients/codex/setup.md +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/docs/clients/codex/supervisor.md +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/docs/clients/codex/webhooks.md +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/docs/clients/copilot/configuration.md +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/docs/clients/copilot/context-management.md +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/docs/clients/copilot/irc-tools.md +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/docs/clients/copilot/overview.md +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/docs/clients/copilot/setup.md +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/docs/clients/copilot/supervisor.md +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/docs/clients/copilot/webhooks.md +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/docs/culture-cli.md +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/docs/getting-started.md +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/docs/index.md +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/docs/operations/SECURITY.md +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/docs/operations/bots.md +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/docs/operations/ci.md +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/docs/operations/cli.md +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/docs/operations/docs-site.md +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/docs/operations/index.md +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/docs/operations/ops-tooling.md +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/docs/operations/overview.md +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/docs/operations/publishing.md +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/docs/resources/github-copilot-sdk-instructions.md +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/docs/rooms.md +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/docs/server-rename.md +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/docs/superpowers/plans/2026-03-19-layer1-core-irc.md +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/docs/superpowers/plans/2026-03-21-layer5-agent-harness.md +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/docs/superpowers/plans/2026-03-30-overview.md +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/docs/superpowers/plans/2026-03-30-rooms-management.md +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/docs/superpowers/plans/2026-04-02-conversation-threads.md +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/docs/superpowers/plans/2026-04-02-ops-tooling.md +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/docs/superpowers/plans/2026-04-04-culture-rename.md +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/docs/superpowers/plans/2026-04-05-docs-speak-culture.md +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/docs/superpowers/plans/2026-04-06-console-chat.md +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/docs/superpowers/specs/2026-03-19-agentirc-design.md +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/docs/superpowers/specs/2026-03-21-layer5-agent-harness-design.md +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/docs/superpowers/specs/2026-03-30-overview-design.md +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/docs/superpowers/specs/2026-03-30-rooms-management-design.md +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/docs/superpowers/specs/2026-04-02-conversation-threads-design.md +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/docs/superpowers/specs/2026-04-02-ops-tooling-design.md +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/docs/superpowers/specs/2026-04-03-bots-webhooks-design.md +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/docs/superpowers/specs/2026-04-04-culture-rename-design.md +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/docs/superpowers/specs/2026-04-05-docs-speak-culture-design.md +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/docs/superpowers/specs/2026-04-05-lifecycle-reframe-design.md +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/docs/superpowers/specs/2026-04-06-cli-reorganization-design.md +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/docs/superpowers/specs/2026-04-06-console-chat-design.md +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/docs/use-cases/01-pair-programming.md +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/docs/use-cases/02-code-review-ensemble.md +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/docs/use-cases/03-cross-server-delegation.md +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/docs/use-cases/04-knowledge-propagation.md +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/docs/use-cases/05-the-observer.md +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/docs/use-cases/06-cross-server-ops.md +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/docs/use-cases/07-supervisor-intervention.md +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/docs/use-cases/08-apps-as-agents.md +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/docs/use-cases/09-research-swarm.md +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/docs/use-cases/10-agent-lifecycle.md +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/docs/use-cases-index.md +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/docs/what-is-culture.md +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/packages/agent-harness/README.md +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/packages/agent-harness/ipc.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/packages/agent-harness/irc_transport.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/packages/agent-harness/message_buffer.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/packages/agent-harness/skill/SKILL.md +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/packages/agent-harness/skill/irc_client.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/packages/agent-harness/socket_server.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/packages/agent-harness/webhook.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/plugins/claude-code/.claude-plugin/plugin.json +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/plugins/claude-code/skills/culture/SKILL.md +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/plugins/claude-code/skills/irc/SKILL.md +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/plugins/codex/skills/culture-irc/SKILL.md +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/sonar-project.properties +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/tests/__init__.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/tests/conftest.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/tests/test_agent_runner.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/tests/test_bot.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/tests/test_bot_config.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/tests/test_bot_manager.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/tests/test_bots_integration.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/tests/test_channel.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/tests/test_codex_daemon.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/tests/test_connection.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/tests/test_console_client.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/tests/test_console_commands.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/tests/test_console_connection.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/tests/test_console_icons.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/tests/test_console_integration.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/tests/test_copilot_daemon.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/tests/test_daemon.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/tests/test_daemon_config.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/tests/test_daemon_ipc.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/tests/test_discovery.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/tests/test_federation.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/tests/test_history.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/tests/test_http_listener.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/tests/test_integration_layer5.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/tests/test_ipc.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/tests/test_irc_transport.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/tests/test_link_reconnect.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/tests/test_mentions.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/tests/test_mesh_config.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/tests/test_message.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/tests/test_message_buffer.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/tests/test_messaging.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/tests/test_modes.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/tests/test_overview_cli.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/tests/test_overview_collector.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/tests/test_overview_model.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/tests/test_overview_renderer.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/tests/test_overview_web.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/tests/test_persistence.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/tests/test_pidfile.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/tests/test_poll_loop.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/tests/test_room_persistence.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/tests/test_rooms.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/tests/test_rooms_federation.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/tests/test_rooms_integration.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/tests/test_server_icon_skill.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/tests/test_setup_update_cli.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/tests/test_skill_client.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/tests/test_skills.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/tests/test_socket_server.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/tests/test_supervisor.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/tests/test_template_engine.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/tests/test_thread_buffer.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/tests/test_threads.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/tests/test_virtual_client.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/tests/test_wait_for_port.py +0 -0
- {agentirc_cli-4.1.0 → agentirc_cli-4.1.1}/tests/test_webhook.py +0 -0
|
@@ -4,6 +4,15 @@ All notable changes to this project will be documented in this file.
|
|
|
4
4
|
|
|
5
5
|
Format follows [Keep a Changelog](https://keepachangelog.com/).
|
|
6
6
|
|
|
7
|
+
## [4.1.1] - 2026-04-06
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
### Fixed
|
|
11
|
+
|
|
12
|
+
- Fix ACP/Codex/Copilot poll loop to use fire-and-forget (race condition fix)
|
|
13
|
+
- Increase ACP prompt timeout from 120s to 300s with retry on timeout (issue #115)
|
|
14
|
+
- Lower default poll_interval from 300s to 60s across all backends
|
|
15
|
+
|
|
7
16
|
## [4.1.0] - 2026-04-06
|
|
8
17
|
|
|
9
18
|
|
|
@@ -353,14 +353,26 @@ class ACPAgentRunner:
|
|
|
353
353
|
|
|
354
354
|
try:
|
|
355
355
|
self._busy = True
|
|
356
|
-
|
|
357
|
-
"
|
|
358
|
-
{
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
356
|
+
prompt_params = {
|
|
357
|
+
"sessionId": self._session_id,
|
|
358
|
+
"prompt": [{"type": "text", "text": text}],
|
|
359
|
+
}
|
|
360
|
+
try:
|
|
361
|
+
resp = await self._send_request(
|
|
362
|
+
"session/prompt",
|
|
363
|
+
prompt_params,
|
|
364
|
+
timeout=300,
|
|
365
|
+
)
|
|
366
|
+
except TimeoutError:
|
|
367
|
+
logger.warning(
|
|
368
|
+
"ACP prompt timed out, retrying once: %s",
|
|
369
|
+
text[:80],
|
|
370
|
+
)
|
|
371
|
+
resp = await self._send_request(
|
|
372
|
+
"session/prompt",
|
|
373
|
+
prompt_params,
|
|
374
|
+
timeout=300,
|
|
375
|
+
)
|
|
364
376
|
|
|
365
377
|
result = resp.get("result", {})
|
|
366
378
|
if "stopReason" in result:
|
|
@@ -372,6 +384,8 @@ class ACPAgentRunner:
|
|
|
372
384
|
|
|
373
385
|
except Exception:
|
|
374
386
|
logger.exception("ACP turn error")
|
|
387
|
+
finally:
|
|
388
|
+
self._busy = False
|
|
375
389
|
|
|
376
390
|
except asyncio.CancelledError:
|
|
377
391
|
raise
|
|
@@ -70,7 +70,7 @@ class DaemonConfig:
|
|
|
70
70
|
supervisor: SupervisorConfig = field(default_factory=SupervisorConfig)
|
|
71
71
|
webhooks: WebhookConfig = field(default_factory=WebhookConfig)
|
|
72
72
|
buffer_size: int = 500
|
|
73
|
-
poll_interval: int =
|
|
73
|
+
poll_interval: int = 60
|
|
74
74
|
sleep_start: str = "23:00"
|
|
75
75
|
sleep_end: str = "08:00"
|
|
76
76
|
agents: list[AgentConfig] = field(default_factory=list)
|
|
@@ -101,7 +101,7 @@ def load_config(path: str | Path) -> DaemonConfig:
|
|
|
101
101
|
supervisor=supervisor,
|
|
102
102
|
webhooks=webhooks,
|
|
103
103
|
buffer_size=raw.get("buffer_size", 500),
|
|
104
|
-
poll_interval=raw.get("poll_interval",
|
|
104
|
+
poll_interval=raw.get("poll_interval", 60),
|
|
105
105
|
sleep_start=raw.get("sleep_start", "23:00"),
|
|
106
106
|
sleep_end=raw.get("sleep_end", "08:00"),
|
|
107
107
|
agents=agents,
|
|
@@ -293,7 +293,9 @@ class ACPDaemon:
|
|
|
293
293
|
f"Respond naturally if any messages need your attention."
|
|
294
294
|
)
|
|
295
295
|
self._mention_targets.append(channel)
|
|
296
|
-
|
|
296
|
+
task = asyncio.create_task(self._agent_runner.send_prompt(prompt))
|
|
297
|
+
self._background_tasks.add(task)
|
|
298
|
+
task.add_done_callback(self._background_tasks.discard)
|
|
297
299
|
except asyncio.CancelledError:
|
|
298
300
|
raise
|
|
299
301
|
except Exception:
|
|
@@ -70,7 +70,7 @@ class DaemonConfig:
|
|
|
70
70
|
supervisor: SupervisorConfig = field(default_factory=SupervisorConfig)
|
|
71
71
|
webhooks: WebhookConfig = field(default_factory=WebhookConfig)
|
|
72
72
|
buffer_size: int = 500
|
|
73
|
-
poll_interval: int =
|
|
73
|
+
poll_interval: int = 60
|
|
74
74
|
sleep_start: str = "23:00"
|
|
75
75
|
sleep_end: str = "08:00"
|
|
76
76
|
agents: list[AgentConfig] = field(default_factory=list)
|
|
@@ -105,7 +105,7 @@ def load_config(path: str | Path) -> DaemonConfig:
|
|
|
105
105
|
supervisor=supervisor,
|
|
106
106
|
webhooks=webhooks,
|
|
107
107
|
buffer_size=raw.get("buffer_size", 500),
|
|
108
|
-
poll_interval=raw.get("poll_interval",
|
|
108
|
+
poll_interval=raw.get("poll_interval", 60),
|
|
109
109
|
sleep_start=raw.get("sleep_start", "23:00"),
|
|
110
110
|
sleep_end=raw.get("sleep_end", "08:00"),
|
|
111
111
|
agents=agents,
|
|
@@ -68,7 +68,7 @@ class DaemonConfig:
|
|
|
68
68
|
supervisor: SupervisorConfig = field(default_factory=SupervisorConfig)
|
|
69
69
|
webhooks: WebhookConfig = field(default_factory=WebhookConfig)
|
|
70
70
|
buffer_size: int = 500
|
|
71
|
-
poll_interval: int =
|
|
71
|
+
poll_interval: int = 60
|
|
72
72
|
sleep_start: str = "23:00"
|
|
73
73
|
sleep_end: str = "08:00"
|
|
74
74
|
agents: list[AgentConfig] = field(default_factory=list)
|
|
@@ -101,7 +101,7 @@ def load_config(path: str | Path) -> DaemonConfig:
|
|
|
101
101
|
supervisor=supervisor,
|
|
102
102
|
webhooks=webhooks,
|
|
103
103
|
buffer_size=raw.get("buffer_size", 500),
|
|
104
|
-
poll_interval=raw.get("poll_interval",
|
|
104
|
+
poll_interval=raw.get("poll_interval", 60),
|
|
105
105
|
sleep_start=raw.get("sleep_start", "23:00"),
|
|
106
106
|
sleep_end=raw.get("sleep_end", "08:00"),
|
|
107
107
|
agents=agents,
|
|
@@ -268,7 +268,9 @@ class CodexDaemon:
|
|
|
268
268
|
f"Respond naturally if any messages need your attention."
|
|
269
269
|
)
|
|
270
270
|
self._mention_targets.append(channel)
|
|
271
|
-
|
|
271
|
+
task = asyncio.create_task(self._agent_runner.send_prompt(prompt))
|
|
272
|
+
self._background_tasks.add(task)
|
|
273
|
+
task.add_done_callback(self._background_tasks.discard)
|
|
272
274
|
except asyncio.CancelledError:
|
|
273
275
|
raise
|
|
274
276
|
except Exception:
|
|
@@ -68,7 +68,7 @@ class DaemonConfig:
|
|
|
68
68
|
supervisor: SupervisorConfig = field(default_factory=SupervisorConfig)
|
|
69
69
|
webhooks: WebhookConfig = field(default_factory=WebhookConfig)
|
|
70
70
|
buffer_size: int = 500
|
|
71
|
-
poll_interval: int =
|
|
71
|
+
poll_interval: int = 60
|
|
72
72
|
sleep_start: str = "23:00"
|
|
73
73
|
sleep_end: str = "08:00"
|
|
74
74
|
agents: list[AgentConfig] = field(default_factory=list)
|
|
@@ -101,7 +101,7 @@ def load_config(path: str | Path) -> DaemonConfig:
|
|
|
101
101
|
supervisor=supervisor,
|
|
102
102
|
webhooks=webhooks,
|
|
103
103
|
buffer_size=raw.get("buffer_size", 500),
|
|
104
|
-
poll_interval=raw.get("poll_interval",
|
|
104
|
+
poll_interval=raw.get("poll_interval", 60),
|
|
105
105
|
sleep_start=raw.get("sleep_start", "23:00"),
|
|
106
106
|
sleep_end=raw.get("sleep_end", "08:00"),
|
|
107
107
|
agents=agents,
|
|
@@ -268,7 +268,9 @@ class CopilotDaemon:
|
|
|
268
268
|
f"Respond naturally if any messages need your attention."
|
|
269
269
|
)
|
|
270
270
|
self._mention_targets.append(channel)
|
|
271
|
-
|
|
271
|
+
task = asyncio.create_task(self._agent_runner.send_prompt(prompt))
|
|
272
|
+
self._background_tasks.add(task)
|
|
273
|
+
task.add_done_callback(self._background_tasks.discard)
|
|
272
274
|
except asyncio.CancelledError:
|
|
273
275
|
raise
|
|
274
276
|
except Exception:
|
|
@@ -22,7 +22,7 @@ Respond naturally if any messages need your attention.
|
|
|
22
22
|
Add `poll_interval` to `agents.yaml`:
|
|
23
23
|
|
|
24
24
|
```yaml
|
|
25
|
-
poll_interval:
|
|
25
|
+
poll_interval: 60 # seconds (default: 1 minute)
|
|
26
26
|
buffer_size: 500
|
|
27
27
|
sleep_start: '23:00'
|
|
28
28
|
sleep_end: '08:00'
|
|
@@ -68,7 +68,7 @@ class DaemonConfig:
|
|
|
68
68
|
supervisor: SupervisorConfig = field(default_factory=SupervisorConfig)
|
|
69
69
|
webhooks: WebhookConfig = field(default_factory=WebhookConfig)
|
|
70
70
|
buffer_size: int = 500
|
|
71
|
-
poll_interval: int =
|
|
71
|
+
poll_interval: int = 60
|
|
72
72
|
sleep_start: str = "23:00"
|
|
73
73
|
sleep_end: str = "08:00"
|
|
74
74
|
agents: list[AgentConfig] = field(default_factory=list)
|
|
@@ -99,7 +99,7 @@ def load_config(path: str | Path) -> DaemonConfig:
|
|
|
99
99
|
supervisor=supervisor,
|
|
100
100
|
webhooks=webhooks,
|
|
101
101
|
buffer_size=raw.get("buffer_size", 500),
|
|
102
|
-
poll_interval=raw.get("poll_interval",
|
|
102
|
+
poll_interval=raw.get("poll_interval", 60),
|
|
103
103
|
sleep_start=raw.get("sleep_start", "23:00"),
|
|
104
104
|
sleep_end=raw.get("sleep_end", "08:00"),
|
|
105
105
|
agents=agents,
|
|
@@ -60,8 +60,15 @@ class AgentDaemon:
|
|
|
60
60
|
self._buffer: MessageBuffer | None = None
|
|
61
61
|
self._socket_server: SocketServer | None = None
|
|
62
62
|
self._webhook: WebhookClient | None = None
|
|
63
|
+
self._agent_runner: Any = None
|
|
63
64
|
self._stop_event: asyncio.Event | None = None
|
|
64
65
|
|
|
66
|
+
# FIFO queue of relay targets — each @mention or poll enqueues a
|
|
67
|
+
# target, each agent response dequeues one for correct routing.
|
|
68
|
+
from collections import deque
|
|
69
|
+
|
|
70
|
+
self._mention_targets: deque[str] = deque()
|
|
71
|
+
|
|
65
72
|
# Pause/sleep state
|
|
66
73
|
self._paused: bool = False
|
|
67
74
|
self._last_activation: float | None = None
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import asyncio
|
|
2
2
|
import os
|
|
3
3
|
import tempfile
|
|
4
|
+
from unittest.mock import AsyncMock, MagicMock
|
|
4
5
|
|
|
5
6
|
import pytest
|
|
6
7
|
|
|
@@ -153,3 +154,48 @@ async def test_acp_relay_target_fifo(server, make_client):
|
|
|
153
154
|
assert any("dm response" in l for l in lines), f"Expected 'dm response', got: {lines}"
|
|
154
155
|
|
|
155
156
|
await daemon.stop()
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
def _inject_fake_acp_runner(daemon):
|
|
160
|
+
"""Inject a fake agent runner that records prompts."""
|
|
161
|
+
runner = MagicMock()
|
|
162
|
+
runner.is_running.return_value = True
|
|
163
|
+
runner.send_prompt = AsyncMock()
|
|
164
|
+
runner.stop = AsyncMock()
|
|
165
|
+
daemon._agent_runner = runner
|
|
166
|
+
return runner
|
|
167
|
+
|
|
168
|
+
|
|
169
|
+
@pytest.mark.asyncio
|
|
170
|
+
async def test_acp_poll_loop_uses_fire_and_forget(server, make_client):
|
|
171
|
+
"""ACP poll loop should use create_task (fire-and-forget), not blocking await."""
|
|
172
|
+
config = DaemonConfig(
|
|
173
|
+
server=ServerConnConfig(host="127.0.0.1", port=server.config.port),
|
|
174
|
+
poll_interval=1,
|
|
175
|
+
)
|
|
176
|
+
agent = AgentConfig(nick="testserv-opencode", directory="/tmp", channels=["#general"])
|
|
177
|
+
sock_dir = tempfile.mkdtemp()
|
|
178
|
+
daemon = ACPDaemon(config, agent, socket_dir=sock_dir, skip_agent=True)
|
|
179
|
+
await daemon.start()
|
|
180
|
+
runner = _inject_fake_acp_runner(daemon)
|
|
181
|
+
await asyncio.sleep(0.5)
|
|
182
|
+
|
|
183
|
+
# Human sends a message (no @mention)
|
|
184
|
+
human = await make_client(nick="testserv-ori", user="ori")
|
|
185
|
+
await human.send("JOIN #general")
|
|
186
|
+
await human.recv_all(timeout=0.3)
|
|
187
|
+
await human.send("PRIVMSG #general :hello from poll test")
|
|
188
|
+
|
|
189
|
+
# Wait for poll to fire
|
|
190
|
+
await asyncio.sleep(1.5)
|
|
191
|
+
|
|
192
|
+
# Poll loop should have sent the prompt
|
|
193
|
+
assert runner.send_prompt.call_count >= 1
|
|
194
|
+
prompt = runner.send_prompt.call_args[0][0]
|
|
195
|
+
assert "hello from poll test" in prompt
|
|
196
|
+
assert "[IRC Channel Poll: #general]" in prompt
|
|
197
|
+
|
|
198
|
+
# The poll should also have enqueued a relay target
|
|
199
|
+
assert len(daemon._mention_targets) >= 1
|
|
200
|
+
|
|
201
|
+
await daemon.stop()
|
|
@@ -22,7 +22,6 @@ async def test_mention_full_nick(server, make_client):
|
|
|
22
22
|
daemon = AgentDaemon(config, agent, socket_dir=sock_dir, skip_claude=True)
|
|
23
23
|
|
|
24
24
|
mentions = []
|
|
25
|
-
original_on_mention = daemon._on_mention
|
|
26
25
|
daemon._on_mention = lambda t, s, txt: mentions.append((t, s, txt))
|
|
27
26
|
daemon._transport_on_mention = daemon._on_mention
|
|
28
27
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|