export const ASSISTANT_ROUTE_POLICY_RUNTIME_SCHEMA_VERSION = "assistant_route_policy_runtime_v1" as const; export interface RunAssistantRoutePolicyRuntimeInput { rawUserMessage: string; effectiveAddressUserMessage: string; followupContext: unknown; llmPreDecomposeMeta: Record; sessionItems?: unknown[]; sessionOrganizationScope?: unknown; useMock: boolean; resolveAssistantOrchestrationDecision: (input: { rawUserMessage: string; effectiveAddressUserMessage: string; followupContext: unknown; llmPreDecomposeMeta: Record; sessionItems?: unknown[]; sessionOrganizationScope?: unknown; useMock: boolean; }) => Record; } export interface AssistantRoutePolicyRuntimeContract { schema_version: typeof ASSISTANT_ROUTE_POLICY_RUNTIME_SCHEMA_VERSION; policy_owner: "assistantRoutePolicyRuntimeAdapter"; decision_source: "resolveAssistantOrchestrationDecision"; living_mode: unknown; living_reason: unknown; tool_gate_decision: unknown; tool_gate_reason: unknown; has_followup_context: boolean; has_orchestration_contract: boolean; } export interface RunAssistantRoutePolicyRuntimeOutput { orchestrationDecision: Record; livingModeDecision: { mode: unknown; reason: unknown; }; routePolicyContract: AssistantRoutePolicyRuntimeContract; } function hasObject(value: unknown): boolean { return Boolean(value && typeof value === "object"); } export function runAssistantRoutePolicyRuntime( input: RunAssistantRoutePolicyRuntimeInput ): RunAssistantRoutePolicyRuntimeOutput { const orchestrationDecision = input.resolveAssistantOrchestrationDecision({ rawUserMessage: input.rawUserMessage, effectiveAddressUserMessage: input.effectiveAddressUserMessage, followupContext: input.followupContext, llmPreDecomposeMeta: input.llmPreDecomposeMeta, sessionItems: input.sessionItems, sessionOrganizationScope: input.sessionOrganizationScope, useMock: input.useMock }); const livingModeDecision = { mode: orchestrationDecision.livingMode, reason: orchestrationDecision.livingReason }; return { orchestrationDecision, livingModeDecision, routePolicyContract: { schema_version: ASSISTANT_ROUTE_POLICY_RUNTIME_SCHEMA_VERSION, policy_owner: "assistantRoutePolicyRuntimeAdapter", decision_source: "resolveAssistantOrchestrationDecision", living_mode: livingModeDecision.mode, living_reason: livingModeDecision.reason, tool_gate_decision: orchestrationDecision.toolGateDecision ?? null, tool_gate_reason: orchestrationDecision.toolGateReason ?? null, has_followup_context: hasObject(input.followupContext), has_orchestration_contract: hasObject(orchestrationDecision.orchestrationContract) } }; }