feat(cli): add Codex-aware auto peer delivery

Default peer CLI and MCP messages to auto, steering eligible Codex turns and queueing otherwise. Preserve explicit delivery modes and uncertain-send safety, and clarify steer guidance for important time-sensitive findings.
This commit is contained in:
weishu
2026-10-29 22:02:43 +08:00
parent f48a6696cf
commit 9384ce031b
13 changed files with 270 additions and 84 deletions
+3 -2
View File
@@ -140,12 +140,13 @@ describe('runHappyMcpStdioBridge tool forwarding', () => {
])
})
it.each(['queue', 'steer'])('advertises and forwards ping_peer delivery mode %s', async (deliveryMode) => {
it.each(['auto', 'queue', 'steer'])('advertises and forwards ping_peer delivery mode %s', async (deliveryMode) => {
await runHappyMcpStdioBridge(['--url', 'http://127.0.0.1:43006', '--tools', 'ping_peer'])
const schema = harness.configs.get('ping_peer')?.inputSchema as {
parse(input: unknown): unknown
}
const args = { sessionIdPrefix: 'peer-id', message: 'hello', deliveryMode }
expect(harness.configs.get('ping_peer')?.description).toContain('auto (default)')
expect(schema.parse(args)).toEqual(args)
expect(() => schema.parse({ ...args, deliveryMode: 'interrupt' })).toThrow()
await harness.tools.get('ping_peer')?.(args)
@@ -238,4 +239,4 @@ describe('runHappyMcpStdioBridge tool forwarding', () => {
delete process.env.HAPI_DISABLE_PEER_TOOLS
}
})
})
})
+3 -4
View File
@@ -16,10 +16,11 @@ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'
import { Client } from '@modelcontextprotocol/sdk/client/index.js';
import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';
import { z } from 'zod';
import { MessageDeliveryModeSchema } from '@hapi/protocol';
import { PeerDeliveryModeSchema } from '@/modules/pingPeer/deliveryMode';
import { DISPLAY_IMAGE_PROMPT_CURSOR, DISPLAY_MEDIA_PROMPT_CURSOR, DISPLAY_VIDEO_PROMPT_CURSOR } from '@/modules/common/displayImagePrompt';
import {
INSPECT_PEER_TOOL_DESCRIPTION,
PEER_DELIVERY_MODE_DESCRIPTION,
PING_PEER_TOOL_DESCRIPTION,
SESSION_ID_PREFIX_PARAM_DESCRIPTION,
} from '@hapi/protocol/sessionCitation';
@@ -213,9 +214,7 @@ export async function runHappyMcpStdioBridge(argv: string[]): Promise<void> {
const pingPeerInputSchema: z.ZodTypeAny = z.object({
sessionIdPrefix: z.string().trim().min(1).describe(SESSION_ID_PREFIX_PARAM_DESCRIPTION),
message: z.string().min(1).describe('Message text to deliver to the target session'),
deliveryMode: MessageDeliveryModeSchema.optional().describe(
'queue (default): next turn, resuming if needed. steer: insert into an active Pi, Codex, or Cursor ACP turn; idle/inactive targets are rejected. If steer fails after send, inspect the target before retrying; do not resend automatically.'
),
deliveryMode: PeerDeliveryModeSchema.optional().describe(PEER_DELIVERY_MODE_DESCRIPTION),
});
if (toolNames.has('ping_peer')) {