import type { CanonGroupContext, CanonGroupContextMode } from './types.js'; import type { CanonTurnContextReplyContextV2, CanonTurnContextV2 } from './host-runtime.js'; export declare const CANON_INBOUND_FRAME_SCHEMA_V1: "canon.inbound_frame.v1"; export type CanonInboundFrameShapeV1 = 'direct_owner' | 'direct_human' | 'direct_agent' | 'group' | 'unknown'; export interface CanonInboundFrameV1 { schema: typeof CANON_INBOUND_FRAME_SCHEMA_V1; shape: CanonInboundFrameShapeV1; sender: { name: string; type: 'human' | 'ai_agent'; isOwner: boolean; }; conversation: { type: CanonTurnContextV2['conversation']['type']; memberCount: number | null; }; addressed: boolean; message: { text: string; contentType: CanonTurnContextV2['message']['contentType']; }; replyContext: CanonTurnContextReplyContextV2 | null; groupContext: CanonGroupContext | null; groupContextMode: CanonGroupContextMode | undefined; selfContexts: string[]; behaviorInstructions: string[]; /** * Resolved consecutive-agent-turn cap for this conversation, or `null` when * the room is uncapped. Groups resolve to a default backstop; direct * conversations stay uncapped. */ maxConsecutiveAgentTurns: number | null; } export interface CanonInboundPromptOptions { /** * What the model sees for the `no_reply` verb on this runtime — e.g. * `mcp__canon__no_reply` on the Claude host. It stands for the affordance, * not just its name: omit it on a runtime that cannot end a turn without * posting, and the group guidance drops the whole "otherwise stay silent" * clause rather than asking for something the model cannot do. */ noReplyToolName?: string; } export declare function buildCanonInboundFrameV1(context: CanonTurnContextV2): CanonInboundFrameV1; export declare function renderCodingHostInboundPrompt(frame: CanonInboundFrameV1, options?: CanonInboundPromptOptions): string; export declare function renderOpenClawSystemPrompt(frame: CanonInboundFrameV1, options?: CanonInboundPromptOptions): string | undefined;