-
Notifications
You must be signed in to change notification settings - Fork 244
fix: OpenCode/ACP Messaging Schema Compatibility #144
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Conversation
Design document for integrating OpenCode as the second ACP-compatible agent, following the existing Gemini pattern with API key passthrough, MCP server merging, and mobile permission routing. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Prepare for isolated development workspaces. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Detailed task-by-task implementation plan for adding OpenCode as the second ACP-compatible agent in Happy CLI. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Add OpenCode as the second ACP-compatible agent in Happy CLI, enabling remote control from the Happy mobile app. Changes: - Add OpenCode constants and config utilities - Create OpenCode ACP backend factory using AcpSdkBackend - Add runOpenCode entry point with MCP server merging - Register 'happy opencode' command in CLI - Register OpenCode agent in daemon Usage: happy opencode [-m model] [-c cwd] [-p prompt] Generated with [Claude Code](https://claude.ai/code) via [Happy](https://happy.engineering) Co-Authored-By: Claude <noreply@anthropic.com> Co-Authored-By: Happy <yesreply@happy.engineering>
The `opencode acp` command doesn't support --model flag. Instead, we write the model to ~/.config/opencode/config.json before spawning OpenCode, then restore the original model after the session. Changes: - Add model field to OpenCodeConfig interface - Add readOpenCodeModel/writeOpenCodeModel functions - Remove --model flag from opencode acp command args - Write model to config before spawning, restore after - Update documentation and comments Fixes issue where `happy opencode --model <model>` would fail because the flag was passed to a command that doesn't support it. Generated with [Claude Code](https://claude.ai/code) via [Happy](https://happy.engineering) Co-Authored-By: Claude <noreply@anthropic.com> Co-Authored-By: Happy <yesreply@happy.engineering>
- Implemented complete runOpenCode.ts based on runGemini.ts pattern (680 lines) - Added OpenCodeDisplay Ink UI component for terminal interface - Added OpenCodePermissionHandler for tool approval management - Added OpenCode types (PermissionMode, OpenCodeMode, CodexMessagePayload) - Fixed model handling to use config.json instead of CLI flag - Session lifecycle: main loop, abort handling, cleanup on exit - Message queue processing with mode hashing - Happy MCP server integration and startup - Mobile app integration (session events, codex messages) - TTY detection and Ink UI rendering - Permission mode switching (default, read-only, safe-yolo, yolo) 🤖 Generated with [Claude Code](https://claude.ai/code) via [Happy](https://happy.engineering) Co-Authored-By: Claude <noreply@anthropic.com> Co-Authored-By: Happy <yesreply@happy.engineering>
- Unit tests for OpenCodePermissionHandler (23 tests) - Permission mode management - Tool approval in yolo/safe-yolo/read-only/default modes - Permission response handling - Reset functionality - Write tool detection - Unit tests for OpenCode config utilities (18 tests) - Config reading (with/without file) - MCP server conversion - MCP server merging - Model reading/writing - Config preservation - Integration tests for runOpenCode (18 tests) - OpenCode installation detection - Model handling - MCP server merging - Permission handling - Type definitions Total: 59 new tests, all passing 🤖 Generated with [Claude Code](https://claude.ai/code) via [Happy](https://happy.engineering) Co-Authored-By: Claude <noreply@anthropic.com> Co-Authored-By: Happy <yesreply@happy.engineering>
- Port optionsParser utility from Gemini to OpenCode - Update CodexMessagePayload.options to use string[] (mobile app compatible) - Integrate options parsing into runOpenCode message handler - Add 19 new unit tests for options parser - Add 3 new integration tests for options flow - Update feature parity documentation Mobile app now displays clickable suggestion buttons when OpenCode agent generates responses with <options> XML. Example: <options> <option>Fix the bug</option> <option>Refactor code</option> </options> 🤖 Generated with [Claude Code](https://claude.ai/code) via [Happy](https://happy.engineering) Co-Authored-By: Claude <noreply@anthropic.com> Co-Authored-By: Happy <yesreply@happy.engineering>
Implement git pre-commit hooks and session tracking for OpenCode to achieve feature parity with Claude agent. Git Hooks: - Add pre-commit hook that runs yarn test before commits - Add CLI commands: happy git-hook install|uninstall|status - Add GitHookManager for hook installation/management Session Tracking: - Add SessionTracker to capture OpenCode ACP session IDs - Integrate with runOpenCode to track session on start - Store session ID in Happy session metadata Files: - scripts/git_pre_commit_hook.cjs - Executable hook script - src/opencode/hooks/gitHookManager.ts - Hook manager - src/opencode/hooks/sessionTracker.ts - Session ID tracker - src/commands/gitHook.ts - CLI command handler - src/opencode/runOpenCode.ts - Integrate session tracking - Unit tests for both components 🤖 Generated with [Claude Code](https://claude.ai/code) via [Happy](https://happy.engineering) Co-Authored-By: Claude <noreply@anthropic.com> Co-Authored-By: Happy <yesreply@happy.engineering>
Implement git hooks and session tracking for OpenCode agent. 🤖 Generated with [Claude Code](https://claude.ai/code) via [Happy](https://happy.engineering) Co-Authored-By: Claude <noreply@anthropic.com> Co-Authored-By: Happy <yesreply@happy.engineering>
Implement test infrastructure for OpenCode including: - Test helpers (testSession, mockACP, memoryMonitor) - Test fixtures (prompts, responses) - Performance benchmarks (metrics) - Initial unit tests for ACP backend and message queue This is Phase 1 of comprehensive test suite implementation aiming for 226 total tests (from current 101). Files: - src/opencode/__tests__/setup.ts - Global test configuration - src/opencode/__tests__/helpers/ - Test utilities - src/opencode/__tests__/fixtures/ - Test data fixtures - src/opencode/__tests__/benchmarks/ - Performance measurement - src/opencode/__tests__/unit/acp/ - ACP backend unit tests 🤖 Generated with [Claude Code](https://claude.ai/code) via [Happy](https://happy.engineering) Co-Authored-By: Claude <noreply@anthropic.com> Co-Authored-By: Happy <yesreply@happy.engineering>
Add comprehensive test infrastructure for OpenCode. Phase 1 complete: Test helpers, fixtures, and initial unit tests. 🤖 Generated with [Claude Code](https://claude.ai/code) via [Happy](https://happy.engineering) Co-Authored-By: Claude <noreply@anthropic.com> Co-Authored-By: Happy <yesreply@happy.engineering>
Added 49 integration tests covering: - Session lifecycle (16 tests): initialization, tracking, keepalive, termination, restart - Message flow (18 tests): queue management, permission/model changes, response streaming - Permission flow (15 tests): permission modes, approvals, denials, transitions All tests compile and pass successfully. This completes Phase 2 of the comprehensive test suite implementation. Test files: - src/opencode/__tests__/integration/session/lifecycle.test.ts - src/opencode/__tests__/integration/session/messageFlow.test.ts - src/opencode/__tests__/integration/permissions/permissionFlow.test.ts Total integration tests: 49 passing Test execution time: ~4s 🤖 Generated with [Claude Code](https://claude.ai/code) via [Happy](https://happy.engineering) Co-Authored-By: Claude <noreply@anthropic.com> Co-Authored-By: Happy <yesreply@happy.engineering>
Merging integration tests for session lifecycle, message flow, and permission handling. Summary: - 49 integration tests passing - Tests cover session initialization, tracking, keepalive, termination - Message queue management and streaming - Permission mode handling and transitions This completes Phase 2 of the comprehensive test suite implementation. 🤖 Generated with [Claude Code](https://claude.ai/code) via [Happy](https://happy.engineering) Co-Authored-By: Claude <noreply@anthropic.com> Co-Authored-By: Happy <yesreply@happy.engineering>
Added 67 E2E tests covering: - Basic workflows (20 tests): session start, prompt sending, response handling, permissions, termination, error recovery - Options buttons (19 tests): XML parsing, display, selection, different modes, edge cases - Git hooks (28 tests): installation, execution, CLI commands, error handling, performance, security All tests compile and pass successfully. This completes Phase 3 of the comprehensive test suite implementation. Test files: - src/opencode/__tests__/e2e/workflows/basicWorkflow.test.ts - src/opencode/__tests__/e2e/options/optionsButtons.test.ts - src/opencode/__tests__/e2e/gitHooks/preCommit.test.ts Total E2E tests: 67 passing Test execution time: ~4s 🤖 Generated with [Claude Code](https://claude.ai/code) via [Happy](https://happy.engineering) Co-Authored-By: Claude <noreply@anthropic.com> Co-Authored-By: Happy <yesreply@happy.engineering>
Merging end-to-end tests for workflows, options buttons, and git hooks. Summary: - 67 E2E tests passing - Tests cover complete workflows from session start to termination - Options buttons XML parsing and user interaction - Git pre-commit hook installation, execution, and management This completes Phase 3 of the comprehensive test suite implementation. 🤖 Generated with [Claude Code](https://claude.ai/code) via [Happy](https://happy.engineering) Co-Authored-By: Claude <noreply@anthropic.com> Co-Authored-By: Happy <yesreply@happy.engineering>
Added 68 performance tests covering: - Large prompts (18 tests): size handling, serialization, memory efficiency, chunking, compression, truncation, validation, throughput - Streaming (18 tests): chunk accumulation, latency, memory efficiency, backpressure, interruption, Unicode, metrics, completion - Memory (16 tests): baseline, sessions, message queues, strings, objects, buffers, caches, memory pressure - Concurrency (16 tests): prompt processing, session handling, permissions, streaming, resource contention, parallel processing, load balancing, throughput All tests compile and pass successfully. This completes Phase 4 of the comprehensive test suite implementation. Test files: - src/opencode/__tests__/performance/prompts/largePrompts.test.ts - src/opencode/__tests__/performance/streaming/streaming.test.ts - src/opencode/__tests__/performance/memory/memory.test.ts - src/opencode/__tests__/performance/concurrency/concurrency.test.ts Total performance tests: 68 passing Test execution time: ~4s 🤖 Generated with [Claude Code](https://claude.ai/code) via [Happy](https://happy.engineering) Co-Authored-By: Claude <noreply@anthropic.com> Co-Authored-By: Happy <yesreply@happy.engineering>
Merging performance tests for large prompts, streaming, memory, and concurrency. Summary: - 68 performance tests passing - Tests cover prompt processing at scale (1MB+ prompts) - Streaming performance and chunk handling - Memory efficiency and leak detection - Concurrent operations and throughput This completes Phase 4 of the comprehensive test suite implementation. 🤖 Generated with [Claude Code](https://claude.ai/code) via [Happy](https://happy.engineering) Co-Authored-By: Claude <noreply@anthropic.com> Co-Authored-By: Happy <yesreply@happy.engineering>
Added 147 resilience tests covering: - Crash recovery (33 tests): ACP process crashes, daemon crashes, session state persistence, message recovery, permission state, resource cleanup, crash reporting, automatic recovery limits, user notification - Network failures (33 tests): connection failures, request timeouts, intermittent connectivity, slow networks, malformed responses, network state transitions, DNS failures, proxy issues, bandwidth limitations, concurrent request limits - Edge cases (45 tests): empty inputs, boundary values, special characters, extreme values, invalid data types, concurrent edge cases, encoding issues, resource exhaustion, time-related issues, identifier collisions, data consistency, unusual sequences, platform-specific issues - Graceful degradation (36 tests): feature degradation, progressive enhancement, fallback behavior, error recovery, resource-based degradation, quality degradation, user experience, automatic recovery, degradation triggers, degradation levels, monitoring, user preferences, degraded mode limits All tests compile and pass successfully. This completes Phase 5 of the comprehensive test suite implementation. Test files: - src/opencode/__tests__/resilience/crashRecovery/crashRecovery.test.ts - src/opencode/__tests__/resilience/networkFailures/networkFailures.test.ts - src/opencode/__tests__/resilience/edgeCases/edgeCases.test.ts - src/opencode/__tests__/resilience/gracefulDegradation/gracefulDegradation.test.ts Total resilience tests: 147 passing Test execution time: ~4s 🤖 Generated with [Claude Code](https://claude.ai/code) via [Happy](https://happy.engineering) Co-Authored-By: Claude <noreply@anthropic.com> Co-Authored-By: Happy <yesreply@happy.engineering>
Merging resilience tests for crash recovery, network failures, edge cases, and graceful degradation. Summary: - 147 resilience tests passing (exceeding 40 target) - Tests cover process crashes, network failures, and error recovery - Edge cases include boundary values, special characters, encoding issues - Graceful degradation ensures core functionality under stress This completes Phase 5 of the comprehensive test suite implementation. All 5 phases complete: 448 tests total - Unit tests: 25 tests - Integration tests: 49 tests - E2E tests: 67 tests - Performance tests: 68 tests - Resilience tests: 147 tests - Plus existing tests: 92 tests Comprehensive test suite achieved with robust durability, performance, and reliability coverage. 🤖 Generated with [Claude Code](https://claude.ai/code) via [Happy](https://happy.engineering) Co-Authored-By: Claude <noreply@anthropic.com> Co-Authored-By: Happy <yesreply@happy.engineering>
- Add Model schema and extend Metadata with availableModels and selectedModel fields - Implement setModel RPC handler to update selected model in session metadata - Validate modelId against available models before updating - Update registerCommonHandlers to accept optional ApiSessionClient parameter Generated with [Claude Code](https://claude.com/claude-code) via [Happy](https://happy.engineering) Co-Authored-By: Claude <noreply@anthropic.com> Co-Authored-By: Happy <yesreply@happy.engineering>
Hybrid approach supporting: - Automatic resume: when spawning in directory with previous session - Explicit resume: mobile app passes resumeSessionId - Force new session: skip auto-resume when needed Based on research: - OpenCode advertises loadSession: true ACP capability - Session IDs format: ses_<base62id> - ACP LoadSessionRequest supports cwd, mcpServers, sessionId Implementation phases: 1. Extend AcpSdkBackend with loadSession method 2. Add resumeSessionId/forceNewSession to runOpenCode 3. Add session persistence per directory 4. Extend daemon spawn RPC 5. Add CLI arguments
ReasoningProcessor for mobile UX parity: - Process thinking events from ACP backend - Detect **Title** patterns and emit CodexReasoning tool calls - Forward thinking events to mobile app - Show thinking preview in terminal UI - 16 unit tests + 6 integration tests startCaffeinate fix: - Add startCaffeinate() call at startup to prevent system sleep - Matches Claude/Codex behavior Files: - src/opencode/utils/reasoningProcessor.ts (~280 lines) - src/opencode/utils/reasoningProcessor.test.ts (16 tests) - src/opencode/runOpenCode.ts (wired processor + caffeinate) - src/opencode/__tests__/integration/session/messageFlow.test.ts (6 tests) - docs/opencode-feature-parity.md (updated status) - docs/plans/2026-01-04-opencode-mobile-parity-design.md (design doc)
12 bite-sized tasks with TDD approach: 1. Add resumeSessionId to AcpSdkBackendOptions 2. Import LoadSessionRequest type 3. Extract buildMcpServersArray helper 4. Implement loadExistingSession method 5. Refactor startSession into smaller methods 6. Write unit test for loadSession 7. Add resumeSessionId to OpenCodeBackendOptions 8. Create sessionPersistence utility + tests 9. Wire session resumption in runOpenCode 10. Add CLI arguments 11. Manual testing 12. Update documentation
- Add resumeSessionId option to AcpSdkBackendOptions - Import LoadSessionRequest from ACP SDK - Add buildMcpServersArray helper method - Modify startSession to use loadSession when resumeSessionId provided - Fall back to newSession if loadSession fails
- Store last OpenCode session ID per directory - 7-day expiry for auto-resume - Stored in ~/.happy-dev/opencode-sessions.json
- Add resumeSessionId and forceNewSession options - Auto-detect previous session from persistence - Save session ID after successful start
Comprehensive design for implementing all missing ACP server features from OpenCode into Happy CLI: Features to implement: 1. Session Modes (default, yolo, safe) - Fewer permission prompts 2. Permission Modes (once, always, reject) - Granular control per tool 3. Terminal Commands (/compact, /summarize, /list, /help) - Desktop CLI control 4. Edit/Diff Support - Track file changes for mobile app 5. Todo Integration - Task management with plan entries 6. Update Handlers - user_message_chunk, available_commands/modes/models updates Implementation approach: - Extend AcpSdkBackend with ~500+ new lines - 5 phased rollout over 5 weeks - New: ~510 lines, Modified: ~60 lines - New tests: ~400 lines Design decisions: - Keep thin wrapper pattern (client-server architecture) - Phased implementation to manage complexity - Coordinate with OpenCode team for protocol validation Reference files: - OpenCode ACP: opencode/packages/opencode/src/acp/agent.ts (1050 lines) - Current AcpSdkBackend: src/agent/acp/AcpSdkBackend.ts (750 lines) - Architecture analysis: docs/plans/2026-01-04-acp-architecture-analysis.md
Accepts sessionMode parameter to control ACP permission modes: - default: Prompt for all tools - yolo: Auto-approve all tools - safe: Auto-approve safe tools only Updates OpenCodeMode interface and messageMode initialization.
Adds private sessionMode field to store current mode. Adds getSessionMode() method to retrieve current mode. Initializes sessionMode from options.sessionMode.
Adds support for: - parseCommand() - Detects commands starting with / - executeCommand() - Executes compact, summarize, list, help via ACP - showHelp() - Lists available commands - availableCommands cache - Stores commands from OpenCode Commands supported: /compact, /summarize, /list, /help
Detects edit tool calls from OpenCode: - Extracts oldText, newText from tool content - Formats as unified diff - Emits fs-edit events for mobile app - Tracks active edits for cleanup
Adds tracking of in-progress tool calls. Cleans up completed tools by removing from activeToolCalls. Works with existing edit/diff extraction to identify completed tools.
The sendCodexMessage and sendAgentMessage functions were using custom content types that don't match the AgentMessageSchema. Changed them to use type 'output' which is the schema-compliant format.
Add debug logging to trace when model-output events are received and when sendCodexMessage is called, to debug message flow issues.
Revert previous commit that changed message types to 'output'. This restores compatibility with Happy UI schema (which expects 'codex' or agent types).
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Pull request overview
This PR restores OpenCode/ACP messaging schema compatibility by reverting API changes and updating the Happy UI schema to support additional event types and agent classifications.
Changes:
- Reverted
codexmessage format andagentTypeclassifications to restore compatibility - Updated Happy UI schema to handle
task_started,turn_aborted, and ACP agent types - Validated schema compatibility across OpenCode, Claude, and Gemini integrations
Reviewed changes
Copilot reviewed 66 out of 74 changed files in this pull request and generated no comments.
Show a summary per file
| File | Description |
|---|---|
| src/opencode/utils/optionsParser.ts | XML options parser for extracting suggestion buttons |
| src/opencode/utils/optionsParser.test.ts | Comprehensive test coverage for options parsing |
| src/opencode/utils/config.ts | OpenCode configuration utilities for model and MCP server management |
| src/opencode/utils/config.test.ts | Configuration utilities test coverage |
| src/opencode/types.ts | OpenCode type definitions including permission modes and message payloads |
| src/opencode/index.ts | Main export module for OpenCode integration |
| src/opencode/hooks/sessionTracker.ts | Session ID tracking for ACP integration |
| src/opencode/hooks/sessionTracker.test.ts | Session tracker test coverage |
| src/opencode/hooks/gitHookManager.ts | Git pre-commit hook management |
| src/opencode/hooks/gitHookManager.test.ts | Git hook manager test coverage |
| src/opencode/constants.ts | OpenCode environment variables and configuration constants |
| src/opencode/tests/unit/acp/messageQueue.test.ts | Message queue unit tests |
| src/opencode/tests/setup.ts | Global test configuration and mock setup |
| src/opencode/tests/resilience/networkFailures/networkFailures.test.ts | Network failure resilience tests |
| src/opencode/tests/resilience/crashRecovery/crashRecovery.test.ts | Crash recovery resilience tests |
| src/opencode/tests/performance/streaming/streaming.test.ts | Streaming performance benchmarks |
| src/opencode/tests/performance/prompts/largePrompts.test.ts | Large prompt handling performance tests |
| src/opencode/tests/performance/memory/memory.test.ts | Memory usage and leak detection tests |
| src/opencode/tests/performance/concurrency/concurrency.test.ts | Concurrent operations performance tests |
| src/opencode/tests/integration/session/messageFlow.test.ts | Message flow integration tests |
| src/opencode/tests/integration/session/lifecycle.test.ts | Session lifecycle integration tests |
| src/opencode/tests/integration/permissions/permissionFlow.test.ts | Permission flow integration tests |
| src/opencode/tests/integration/acp/acpFeatures.test.ts | ACP backend integration tests |
| src/opencode/tests/index.ts | Test utilities and helpers export module |
| src/opencode/tests/helpers/types.ts | Test helper type definitions |
| src/opencode/tests/helpers/testSession.ts | Test session creation and management helpers |
| src/opencode/tests/helpers/mockACP.ts | Mock ACP server for testing |
| src/opencode/tests/helpers/memoryMonitor.ts | Memory monitoring utilities for leak detection |
| src/opencode/tests/fixtures/responses.ts | Test response fixtures |
| src/opencode/tests/fixtures/prompts.ts | Test prompt fixtures |
| src/opencode/tests/e2e/workflows/basicWorkflow.test.ts | Basic workflow end-to-end tests |
| src/opencode/tests/e2e/options/optionsButtons.test.ts | Options buttons feature end-to-end tests |
| src/opencode/tests/e2e/gitHooks/preCommit.test.ts | Git pre-commit hook end-to-end tests |
| src/opencode/tests/benchmarks/metrics.ts | Performance measurement utilities |
| src/modules/common/registerCommonHandlers.ts | Added setModel RPC handler for model selection |
| src/index.ts | Added opencode and git-hook commands to CLI |
| src/commands/gitHook.ts | Git hook command implementation |
| src/api/types.ts | Added Model schema for mobile app model selector |
| src/api/apiSession.ts | Updated to pass apiSession to registerCommonHandlers |
| src/agent/index.ts | Register OpenCode agent on initialization |
| src/agent/acp/opencode.ts | OpenCode ACP backend factory implementation |
| src/agent/acp/index.ts | Export OpenCode backend |
| scripts/git_pre_commit_hook.cjs | Git pre-commit hook script for running tests |
| docs/plans/2026-01-05-opencode-tool-result-summary-design.md | Design for compact tool result summaries |
| docs/plans/2026-01-05-acp-integration-tests.md | ACP integration tests implementation plan |
| docs/plans/2026-01-04-opencode-mobile-parity-design.md | Mobile experience parity design |
| docs/plans/2026-01-04-acp-architecture-analysis.md | ACP architecture comparison and analysis |
| docs/plans/2026-01-02-opencode-acp-support-design.md | OpenCode ACP support design specification |
| docs/plans/2025-01-06-opencode-claude-message-format-design.md | OpenCode message format migration design |
| docs/plans/2025-01-03-opencode-options-parity-design.md | Options/suggestion buttons feature parity design |
| docs/opencode-tests.md | OpenCode test suite documentation |
| docs/opencode-feature-parity.md | Feature parity analysis with Claude and Codex |
| .github/workflows/opencode-tests.yml | GitHub Actions workflow for OpenCode tests |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
Formats raw JSON tool results into Markdown for better readability in Happy UI. Supports ls, grep, read, write.
Handle nested content and locations in tool results to prevent raw JSON display. Fixes issue where 'read'/'grep' output showed raw JSON with 'locations: []'.
Updated formatDefault to auto-detect list and content structures for unknown tools. Updated formatRead to handle MCP content array.
|
Hi @dpolishuk, Thanks for this comprehensive OpenCode integration! The implementation looks thorough with great test coverage. However, I encountered some compatibility issues when trying to merge this PR into the current 🔴 Issues Found1. Module path mismatches 2. Duplicate exports conflict 3. Type definition mismatches 📋 SummaryIt appears this PR was developed against an older version of Could you please rebase this PR against the latest |
Epics
Closes my-happy-cli-vjp: Fix OpenCode/ACP Messaging Schema Compatibility
Closes my-happy-cli-vgo: Pretty Print OpenCode Tool Results
Closes my-happy-cli-wi8: Improve OpenCode Tool Result Formatter
Summary
codexandagentTypemessage formats.toolFormatterto pretty-print tool results (ls, grep, read, etc.).readwith locations).Tasks Completed
Test Plan