diff --git a/apps/mesh/src/api/routes/decopilot/routes.ts b/apps/mesh/src/api/routes/decopilot/routes.ts index 96fd63f44d..97a154f2b2 100644 --- a/apps/mesh/src/api/routes/decopilot/routes.ts +++ b/apps/mesh/src/api/routes/decopilot/routes.ts @@ -320,6 +320,9 @@ app.post("/:org/decopilot/stream", async (c) => { }, created_at: new Date(), thread_id: mem.thread.id, + toolApprovalLevel, + temperature, + windowSize, }; } if (part.type === "reasoning-start") { diff --git a/apps/mesh/src/web/components/chat/context.tsx b/apps/mesh/src/web/components/chat/context.tsx index c88cee674a..4e455c477d 100644 --- a/apps/mesh/src/web/components/chat/context.tsx +++ b/apps/mesh/src/web/components/chat/context.tsx @@ -151,9 +151,8 @@ const createModelsTransport = ( const { system, tiptapDoc: _tiptapDoc, - toolApprovalLevel, ...metadata - } = requestMetadata as Metadata & { toolApprovalLevel?: string }; + } = requestMetadata as Metadata; const systemMessage: UIMessage | null = system ? { id: crypto.randomUUID(), @@ -166,7 +165,7 @@ const createModelsTransport = ( ? [systemMessage, ...userMessage] : userMessage; - // Fall back to last message metadata when requestMetadata is missing models/agent + // Fall back to last message metadata when requestMetadata is missing models/agent/toolApprovalLevel/temperature/windowSize const lastMsgMeta = (messages.at(-1)?.metadata ?? {}) as Metadata; const mergedMetadata = { ...metadata, @@ -179,7 +178,19 @@ const createModelsTransport = ( body: { messages: allMessages, ...mergedMetadata, - ...(toolApprovalLevel && { toolApprovalLevel }), + ...(lastMsgMeta.toolApprovalLevel && { + toolApprovalLevel: lastMsgMeta.toolApprovalLevel, + }), + ...(lastMsgMeta.temperature !== undefined && { + temperature: lastMsgMeta.temperature, + }), + ...(lastMsgMeta.windowSize !== undefined && + mergedMetadata.thread_id && { + memory: { + windowSize: lastMsgMeta.windowSize, + thread_id: mergedMetadata.thread_id, + }, + }), }, }; }, @@ -768,6 +779,7 @@ export function ChatProvider({ children }: PropsWithChildren) { avatar: user?.image ?? undefined, name: user?.name ?? "you", }, + toolApprovalLevel: preferences.toolApprovalLevel, }; const metadata: Metadata = { diff --git a/apps/mesh/src/web/components/chat/types.ts b/apps/mesh/src/web/components/chat/types.ts index 4902d37a4e..a22ed9abf0 100644 --- a/apps/mesh/src/web/components/chat/types.ts +++ b/apps/mesh/src/web/components/chat/types.ts @@ -67,6 +67,10 @@ export interface Metadata { tiptapDoc?: TiptapDoc; /** Tool approval level preference */ toolApprovalLevel?: "none" | "readonly" | "yolo"; + /** LLM sampling temperature (0–1). Persisted so auto-sends use the same value. */ + temperature?: number; + /** Conversation context window size (number of messages). Persisted so auto-sends use the same value. */ + windowSize?: number; usage?: { inputTokens?: number; outputTokens?: number;