agentirc-cli 0.13.0__tar.gz → 0.13.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-0.13.0 → agentirc_cli-0.13.1}/CHANGELOG.md +10 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/PKG-INFO +1 -1
- agentirc_cli-0.13.1/agentirc/__init__.py +1 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/agentirc/clients/codex/irc_transport.py +5 -1
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/agentirc/clients/copilot/irc_transport.py +5 -1
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/agentirc/clients/opencode/agent_runner.py +42 -24
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/agentirc/clients/opencode/daemon.py +21 -2
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/agentirc/clients/opencode/irc_transport.py +5 -1
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/packages/agent-harness/irc_transport.py +5 -1
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/pyproject.toml +1 -1
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/uv.lock +1 -1
- agentirc_cli-0.13.0/agentirc/__init__.py +0 -1
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/.claude/skills/pr-review/SKILL.md +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/.github/workflows/pages.yml +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/.github/workflows/publish.yml +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/.github/workflows/tests.yml +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/.gitignore +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/.markdownlint-cli2.yaml +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/.pr_agent.toml +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/CLAUDE.md +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/CNAME +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/Gemfile +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/Gemfile.lock +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/LICENSE +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/README.md +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/_config.yml +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/_sass/color_schemes/anthropic.scss +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/_sass/custom/custom.scss +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/agentirc/cli.py +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/agentirc/clients/__init__.py +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/agentirc/clients/claude/__init__.py +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/agentirc/clients/claude/__main__.py +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/agentirc/clients/claude/agent_runner.py +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/agentirc/clients/claude/config.py +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/agentirc/clients/claude/daemon.py +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/agentirc/clients/claude/ipc.py +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/agentirc/clients/claude/irc_transport.py +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/agentirc/clients/claude/message_buffer.py +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/agentirc/clients/claude/skill/SKILL.md +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/agentirc/clients/claude/skill/__init__.py +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/agentirc/clients/claude/skill/irc_client.py +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/agentirc/clients/claude/socket_server.py +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/agentirc/clients/claude/supervisor.py +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/agentirc/clients/claude/webhook.py +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/agentirc/clients/codex/__init__.py +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/agentirc/clients/codex/agent_runner.py +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/agentirc/clients/codex/config.py +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/agentirc/clients/codex/daemon.py +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/agentirc/clients/codex/ipc.py +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/agentirc/clients/codex/message_buffer.py +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/agentirc/clients/codex/skill/SKILL.md +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/agentirc/clients/codex/skill/__init__.py +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/agentirc/clients/codex/skill/irc_client.py +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/agentirc/clients/codex/socket_server.py +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/agentirc/clients/codex/supervisor.py +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/agentirc/clients/codex/webhook.py +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/agentirc/clients/copilot/__init__.py +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/agentirc/clients/copilot/agent_runner.py +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/agentirc/clients/copilot/config.py +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/agentirc/clients/copilot/daemon.py +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/agentirc/clients/copilot/ipc.py +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/agentirc/clients/copilot/message_buffer.py +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/agentirc/clients/copilot/skill/SKILL.md +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/agentirc/clients/copilot/skill/__init__.py +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/agentirc/clients/copilot/skill/irc_client.py +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/agentirc/clients/copilot/socket_server.py +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/agentirc/clients/copilot/supervisor.py +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/agentirc/clients/copilot/webhook.py +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/agentirc/clients/opencode/__init__.py +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/agentirc/clients/opencode/config.py +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/agentirc/clients/opencode/ipc.py +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/agentirc/clients/opencode/message_buffer.py +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/agentirc/clients/opencode/skill/SKILL.md +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/agentirc/clients/opencode/skill/__init__.py +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/agentirc/clients/opencode/skill/irc_client.py +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/agentirc/clients/opencode/socket_server.py +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/agentirc/clients/opencode/supervisor.py +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/agentirc/clients/opencode/webhook.py +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/agentirc/learn_prompt.py +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/agentirc/observer.py +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/agentirc/pidfile.py +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/agentirc/protocol/__init__.py +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/agentirc/protocol/commands.py +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/agentirc/protocol/extensions/federation.md +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/agentirc/protocol/extensions/history.md +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/agentirc/protocol/message.py +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/agentirc/protocol/protocol-index.md +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/agentirc/protocol/replies.py +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/agentirc/server/__init__.py +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/agentirc/server/__main__.py +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/agentirc/server/channel.py +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/agentirc/server/client.py +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/agentirc/server/config.py +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/agentirc/server/ircd.py +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/agentirc/server/remote_client.py +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/agentirc/server/server_link.py +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/agentirc/server/skill.py +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/agentirc/server/skills/__init__.py +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/agentirc/server/skills/history.py +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/docs/agent-client.md +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/docs/agent-harness-spec.md +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/docs/ci.md +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/docs/cli.md +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/docs/clients/claude/configuration.md +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/docs/clients/claude/context-management.md +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/docs/clients/claude/irc-tools.md +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/docs/clients/claude/overview.md +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/docs/clients/claude/setup.md +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/docs/clients/claude/supervisor.md +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/docs/clients/claude/webhooks.md +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/docs/clients/codex/configuration.md +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/docs/clients/codex/context-management.md +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/docs/clients/codex/irc-tools.md +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/docs/clients/codex/overview.md +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/docs/clients/codex/setup.md +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/docs/clients/codex/supervisor.md +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/docs/clients/codex/webhooks.md +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/docs/clients/copilot/configuration.md +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/docs/clients/copilot/context-management.md +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/docs/clients/copilot/irc-tools.md +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/docs/clients/copilot/overview.md +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/docs/clients/copilot/setup.md +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/docs/clients/copilot/supervisor.md +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/docs/clients/copilot/webhooks.md +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/docs/clients/opencode/configuration.md +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/docs/clients/opencode/context-management.md +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/docs/clients/opencode/irc-tools.md +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/docs/clients/opencode/overview.md +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/docs/clients/opencode/setup.md +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/docs/clients/opencode/supervisor.md +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/docs/clients/opencode/webhooks.md +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/docs/codex-backend.md +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/docs/copilot-backend.md +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/docs/design.md +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/docs/docs-site.md +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/docs/getting-started.md +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/docs/grow-your-agent.md +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/docs/layer1-core-irc.md +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/docs/layer2-attention.md +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/docs/layer3-skills.md +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/docs/layer4-federation.md +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/docs/layer5-agent-harness.md +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/docs/opencode-backend.md +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/docs/publishing.md +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/docs/resources/github-copilot-sdk-instructions.md +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/docs/server-architecture.md +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/docs/superpowers/plans/2026-03-19-layer1-core-irc.md +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/docs/superpowers/plans/2026-03-21-layer5-agent-harness.md +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/docs/superpowers/specs/2026-03-19-agentirc-design.md +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/docs/superpowers/specs/2026-03-21-layer5-agent-harness-design.md +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/docs/use-cases/01-pair-programming.md +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/docs/use-cases/02-code-review-ensemble.md +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/docs/use-cases/03-cross-server-delegation.md +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/docs/use-cases/04-knowledge-propagation.md +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/docs/use-cases/05-the-observer.md +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/docs/use-cases/06-cross-server-ops.md +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/docs/use-cases/07-supervisor-intervention.md +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/docs/use-cases/08-apps-as-agents.md +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/docs/use-cases/09-research-swarm.md +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/docs/use-cases/10-grow-your-agent.md +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/docs/use-cases-index.md +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/index.md +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/packages/agent-harness/README.md +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/packages/agent-harness/config.py +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/packages/agent-harness/daemon.py +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/packages/agent-harness/ipc.py +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/packages/agent-harness/message_buffer.py +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/packages/agent-harness/skill/SKILL.md +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/packages/agent-harness/skill/irc_client.py +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/packages/agent-harness/socket_server.py +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/packages/agent-harness/webhook.py +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/plugins/claude-code/.claude-plugin/plugin.json +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/plugins/claude-code/skills/irc/SKILL.md +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/plugins/codex/skills/agentirc-irc/SKILL.md +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/tests/__init__.py +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/tests/conftest.py +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/tests/test_agent_runner.py +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/tests/test_channel.py +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/tests/test_codex_daemon.py +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/tests/test_connection.py +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/tests/test_copilot_daemon.py +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/tests/test_daemon.py +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/tests/test_daemon_config.py +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/tests/test_daemon_ipc.py +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/tests/test_discovery.py +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/tests/test_federation.py +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/tests/test_history.py +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/tests/test_integration_layer5.py +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/tests/test_ipc.py +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/tests/test_irc_transport.py +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/tests/test_mentions.py +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/tests/test_message.py +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/tests/test_message_buffer.py +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/tests/test_messaging.py +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/tests/test_modes.py +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/tests/test_opencode_daemon.py +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/tests/test_skill_client.py +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/tests/test_skills.py +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/tests/test_socket_server.py +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/tests/test_supervisor.py +0 -0
- {agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/tests/test_webhook.py +0 -0
|
@@ -4,6 +4,16 @@ 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
|
+
## [0.13.1] - 2026-03-30
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
### Fixed
|
|
11
|
+
|
|
12
|
+
- Fix OpenCode agent crash (exit code -1) caused by 30s timeout on system prompt session/prompt call
|
|
13
|
+
- Capture stderr from opencode subprocess for debugging
|
|
14
|
+
- Add _running guard to busy-wait loops to prevent hang on process death
|
|
15
|
+
- Wrap _start_agent_runner with error handling so runner failures schedule retry instead of crashing daemon
|
|
16
|
+
|
|
7
17
|
## [0.13.0] - 2026-03-29
|
|
8
18
|
|
|
9
19
|
### Added
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
__version__ = "0.13.1"
|
|
@@ -82,11 +82,15 @@ class IRCTransport:
|
|
|
82
82
|
async def send_who(self, target: str) -> None:
|
|
83
83
|
await self._send_raw(f"WHO {target}")
|
|
84
84
|
|
|
85
|
-
async def
|
|
85
|
+
async def send_raw(self, line: str) -> None:
|
|
86
|
+
"""Send a raw IRC line. Public for commands like HISTORY."""
|
|
86
87
|
if self._writer:
|
|
87
88
|
self._writer.write(f"{line}\r\n".encode())
|
|
88
89
|
await self._writer.drain()
|
|
89
90
|
|
|
91
|
+
async def _send_raw(self, line: str) -> None:
|
|
92
|
+
await self.send_raw(line)
|
|
93
|
+
|
|
90
94
|
async def _read_loop(self) -> None:
|
|
91
95
|
buf = ""
|
|
92
96
|
try:
|
|
@@ -82,11 +82,15 @@ class IRCTransport:
|
|
|
82
82
|
async def send_who(self, target: str) -> None:
|
|
83
83
|
await self._send_raw(f"WHO {target}")
|
|
84
84
|
|
|
85
|
-
async def
|
|
85
|
+
async def send_raw(self, line: str) -> None:
|
|
86
|
+
"""Send a raw IRC line. Public for commands like HISTORY."""
|
|
86
87
|
if self._writer:
|
|
87
88
|
self._writer.write(f"{line}\r\n".encode())
|
|
88
89
|
await self._writer.drain()
|
|
89
90
|
|
|
91
|
+
async def _send_raw(self, line: str) -> None:
|
|
92
|
+
await self.send_raw(line)
|
|
93
|
+
|
|
90
94
|
async def _read_loop(self) -> None:
|
|
91
95
|
buf = ""
|
|
92
96
|
try:
|
|
@@ -38,6 +38,7 @@ class OpenCodeAgentRunner:
|
|
|
38
38
|
self._prompt_queue: asyncio.Queue[str] = asyncio.Queue()
|
|
39
39
|
self._task: asyncio.Task | None = None
|
|
40
40
|
self._reader_task: asyncio.Task | None = None
|
|
41
|
+
self._stderr_task: asyncio.Task | None = None
|
|
41
42
|
self._stopping = False
|
|
42
43
|
self._request_id = 0
|
|
43
44
|
self._pending: dict[int, asyncio.Future] = {}
|
|
@@ -68,13 +69,14 @@ class OpenCodeAgentRunner:
|
|
|
68
69
|
"opencode", "acp",
|
|
69
70
|
stdin=asyncio.subprocess.PIPE,
|
|
70
71
|
stdout=asyncio.subprocess.PIPE,
|
|
71
|
-
stderr=asyncio.subprocess.
|
|
72
|
+
stderr=asyncio.subprocess.PIPE,
|
|
72
73
|
limit=1024 * 1024, # 1MB line buffer
|
|
73
74
|
env=isolated_env,
|
|
74
75
|
)
|
|
75
76
|
|
|
76
|
-
# Start reading responses
|
|
77
|
+
# Start reading responses and stderr
|
|
77
78
|
self._reader_task = asyncio.create_task(self._read_loop())
|
|
79
|
+
self._stderr_task = asyncio.create_task(self._stderr_loop())
|
|
78
80
|
|
|
79
81
|
# Initialize with ACP protocol
|
|
80
82
|
resp = await self._send_request("initialize", {
|
|
@@ -102,30 +104,19 @@ class OpenCodeAgentRunner:
|
|
|
102
104
|
self._running = True
|
|
103
105
|
logger.info("OpenCode session started: %s", self._session_id)
|
|
104
106
|
|
|
105
|
-
# Send system prompt as the first turn so all subsequent turns
|
|
106
|
-
# are conditioned on it (ACP has no dedicated system instructions field)
|
|
107
|
-
if self.system_prompt:
|
|
108
|
-
self._busy = True
|
|
109
|
-
resp = await self._send_request("session/prompt", {
|
|
110
|
-
"sessionId": self._session_id,
|
|
111
|
-
"prompt": [{"type": "text", "text": self.system_prompt}],
|
|
112
|
-
})
|
|
113
|
-
# Wait for turn to finish before accepting user prompts
|
|
114
|
-
if resp.get("result", {}).get("stopReason"):
|
|
115
|
-
self._busy = False
|
|
116
|
-
self._accumulated_text = ""
|
|
117
|
-
else:
|
|
118
|
-
while self._busy:
|
|
119
|
-
await asyncio.sleep(0.1)
|
|
120
|
-
|
|
121
107
|
# Start the prompt processing loop
|
|
122
108
|
self._task = asyncio.create_task(self._prompt_loop())
|
|
123
109
|
|
|
110
|
+
# Queue system prompt as the first turn so all subsequent turns
|
|
111
|
+
# are conditioned on it (ACP has no dedicated system instructions field).
|
|
112
|
+
# Queued rather than awaited to avoid blocking start() on LLM completion.
|
|
113
|
+
if self.system_prompt:
|
|
114
|
+
await self.send_prompt(self.system_prompt)
|
|
115
|
+
|
|
124
116
|
if initial_prompt:
|
|
125
117
|
await self.send_prompt(initial_prompt)
|
|
126
118
|
except Exception:
|
|
127
|
-
|
|
128
|
-
self._isolated_home = None
|
|
119
|
+
await self.stop()
|
|
129
120
|
raise
|
|
130
121
|
|
|
131
122
|
async def stop(self) -> None:
|
|
@@ -147,6 +138,13 @@ class OpenCodeAgentRunner:
|
|
|
147
138
|
except asyncio.CancelledError:
|
|
148
139
|
pass
|
|
149
140
|
|
|
141
|
+
if self._stderr_task:
|
|
142
|
+
self._stderr_task.cancel()
|
|
143
|
+
try:
|
|
144
|
+
await self._stderr_task
|
|
145
|
+
except asyncio.CancelledError:
|
|
146
|
+
pass
|
|
147
|
+
|
|
150
148
|
if self._process:
|
|
151
149
|
try:
|
|
152
150
|
self._process.terminate()
|
|
@@ -179,7 +177,7 @@ class OpenCodeAgentRunner:
|
|
|
179
177
|
self._request_id += 1
|
|
180
178
|
return self._request_id
|
|
181
179
|
|
|
182
|
-
async def _send_request(self, method: str, params: dict) -> dict:
|
|
180
|
+
async def _send_request(self, method: str, params: dict, timeout: float = 30) -> dict:
|
|
183
181
|
"""Send a JSON-RPC request and wait for the response."""
|
|
184
182
|
if not self._process or not self._process.stdin:
|
|
185
183
|
raise ConnectionError("ACP server not running")
|
|
@@ -196,7 +194,7 @@ class OpenCodeAgentRunner:
|
|
|
196
194
|
await self._process.stdin.drain()
|
|
197
195
|
|
|
198
196
|
try:
|
|
199
|
-
return await asyncio.wait_for(future, timeout=
|
|
197
|
+
return await asyncio.wait_for(future, timeout=timeout)
|
|
200
198
|
except (asyncio.TimeoutError, asyncio.CancelledError):
|
|
201
199
|
self._pending.pop(req_id, None)
|
|
202
200
|
if not future.done():
|
|
@@ -263,9 +261,29 @@ class OpenCodeAgentRunner:
|
|
|
263
261
|
|
|
264
262
|
self._running = False
|
|
265
263
|
|
|
264
|
+
# Cancel companion tasks so they don't outlive the process
|
|
265
|
+
for task in (self._task, self._stderr_task):
|
|
266
|
+
if task and not task.done():
|
|
267
|
+
task.cancel()
|
|
268
|
+
|
|
266
269
|
if not self._stopping and self.on_exit:
|
|
267
270
|
await self.on_exit(returncode)
|
|
268
271
|
|
|
272
|
+
async def _stderr_loop(self) -> None:
|
|
273
|
+
"""Log stderr output from the opencode process."""
|
|
274
|
+
if not self._process or not self._process.stderr:
|
|
275
|
+
return
|
|
276
|
+
try:
|
|
277
|
+
while True:
|
|
278
|
+
line = await self._process.stderr.readline()
|
|
279
|
+
if not line:
|
|
280
|
+
break
|
|
281
|
+
text = line.decode("utf-8", errors="replace").rstrip()
|
|
282
|
+
if text:
|
|
283
|
+
logger.warning("opencode stderr: %s", text)
|
|
284
|
+
except (asyncio.CancelledError, ConnectionError):
|
|
285
|
+
pass
|
|
286
|
+
|
|
269
287
|
async def _handle_notification(self, msg: dict) -> None:
|
|
270
288
|
"""Handle ACP server notifications."""
|
|
271
289
|
method = msg.get("method", "")
|
|
@@ -321,7 +339,7 @@ class OpenCodeAgentRunner:
|
|
|
321
339
|
resp = await self._send_request("session/prompt", {
|
|
322
340
|
"sessionId": self._session_id,
|
|
323
341
|
"prompt": [{"type": "text", "text": text}],
|
|
324
|
-
})
|
|
342
|
+
}, timeout=120)
|
|
325
343
|
|
|
326
344
|
# Check if response itself signals turn completion
|
|
327
345
|
result = resp.get("result", {})
|
|
@@ -338,7 +356,7 @@ class OpenCodeAgentRunner:
|
|
|
338
356
|
self._busy = False
|
|
339
357
|
|
|
340
358
|
# Wait for turn to complete (via notifications)
|
|
341
|
-
while self._busy:
|
|
359
|
+
while self._busy and self._running:
|
|
342
360
|
await asyncio.sleep(0.1)
|
|
343
361
|
|
|
344
362
|
except Exception:
|
|
@@ -131,7 +131,16 @@ class OpenCodeDaemon:
|
|
|
131
131
|
|
|
132
132
|
# 6. Optionally start the OpenCode agent runner
|
|
133
133
|
if not self.skip_opencode:
|
|
134
|
-
|
|
134
|
+
try:
|
|
135
|
+
await self._start_agent_runner()
|
|
136
|
+
except Exception:
|
|
137
|
+
logger.exception(
|
|
138
|
+
"Failed to start agent runner for %s, scheduling retry",
|
|
139
|
+
self.agent.nick,
|
|
140
|
+
)
|
|
141
|
+
self._agent_runner = None
|
|
142
|
+
self._crash_times.append(time.time())
|
|
143
|
+
asyncio.create_task(self._delayed_restart())
|
|
135
144
|
|
|
136
145
|
# 7. Sleep scheduler background task
|
|
137
146
|
self._sleep_task = asyncio.create_task(self._sleep_scheduler())
|
|
@@ -241,6 +250,8 @@ class OpenCodeDaemon:
|
|
|
241
250
|
on_exit=self._on_agent_exit,
|
|
242
251
|
on_message=self._on_agent_message,
|
|
243
252
|
)
|
|
253
|
+
# Absorb the system prompt response without relaying to IRC
|
|
254
|
+
self._mention_targets.append(None)
|
|
244
255
|
await self._agent_runner.start()
|
|
245
256
|
logger.info("OpenCodeAgentRunner started for %s", self.agent.nick)
|
|
246
257
|
|
|
@@ -366,7 +377,15 @@ class OpenCodeDaemon:
|
|
|
366
377
|
async def _delayed_restart(self) -> None:
|
|
367
378
|
await asyncio.sleep(CRASH_RESTART_DELAY)
|
|
368
379
|
if not self._circuit_open and self._transport is not None:
|
|
369
|
-
|
|
380
|
+
try:
|
|
381
|
+
await self._start_agent_runner()
|
|
382
|
+
except Exception:
|
|
383
|
+
logger.exception(
|
|
384
|
+
"Failed to restart agent runner for %s",
|
|
385
|
+
self.agent.nick,
|
|
386
|
+
)
|
|
387
|
+
# Record as a crash so the circuit breaker can track it
|
|
388
|
+
await self._on_agent_exit(-1)
|
|
370
389
|
|
|
371
390
|
# ------------------------------------------------------------------
|
|
372
391
|
# Supervisor callbacks
|
|
@@ -82,11 +82,15 @@ class IRCTransport:
|
|
|
82
82
|
async def send_who(self, target: str) -> None:
|
|
83
83
|
await self._send_raw(f"WHO {target}")
|
|
84
84
|
|
|
85
|
-
async def
|
|
85
|
+
async def send_raw(self, line: str) -> None:
|
|
86
|
+
"""Send a raw IRC line. Public for commands like HISTORY."""
|
|
86
87
|
if self._writer:
|
|
87
88
|
self._writer.write(f"{line}\r\n".encode())
|
|
88
89
|
await self._writer.drain()
|
|
89
90
|
|
|
91
|
+
async def _send_raw(self, line: str) -> None:
|
|
92
|
+
await self.send_raw(line)
|
|
93
|
+
|
|
90
94
|
async def _read_loop(self) -> None:
|
|
91
95
|
buf = ""
|
|
92
96
|
try:
|
|
@@ -83,11 +83,15 @@ class IRCTransport:
|
|
|
83
83
|
async def send_who(self, target: str) -> None:
|
|
84
84
|
await self._send_raw(f"WHO {target}")
|
|
85
85
|
|
|
86
|
-
async def
|
|
86
|
+
async def send_raw(self, line: str) -> None:
|
|
87
|
+
"""Send a raw IRC line. Public for commands like HISTORY."""
|
|
87
88
|
if self._writer:
|
|
88
89
|
self._writer.write(f"{line}\r\n".encode())
|
|
89
90
|
await self._writer.drain()
|
|
90
91
|
|
|
92
|
+
async def _send_raw(self, line: str) -> None:
|
|
93
|
+
await self.send_raw(line)
|
|
94
|
+
|
|
91
95
|
async def _read_loop(self) -> None:
|
|
92
96
|
buf = ""
|
|
93
97
|
try:
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
__version__ = "0.13.0"
|
|
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
|
|
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
|
{agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/docs/resources/github-copilot-sdk-instructions.md
RENAMED
|
File without changes
|
|
File without changes
|
{agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/docs/superpowers/plans/2026-03-19-layer1-core-irc.md
RENAMED
|
File without changes
|
|
File without changes
|
{agentirc_cli-0.13.0 → agentirc_cli-0.13.1}/docs/superpowers/specs/2026-03-19-agentirc-design.md
RENAMED
|
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
|