Refine user profile access and chat sync

This commit is contained in:
Codex
2026-05-23 19:41:51 +08:00
committed by ekko
parent 3f6a25d8f1
commit 7b05731d44
17 changed files with 223 additions and 57 deletions
@@ -72,6 +72,17 @@ interface RoomAgent {
invited: number
}
interface RoomInfo {
id: string
name: string
inviteCode: string | null
triggerTokens: number
maxHistoryTokens: number
tailMessageCount: number
totalTokens: number
sessionSeed: string
}
interface Member {
id: string
userId: string
@@ -278,18 +289,31 @@ class ChatStorage {
// ─── Rooms ────────────────────────────────────────────────
getRoom(roomId: string): { id: string; name: string; inviteCode: string | null; triggerTokens: number; maxHistoryTokens: number; tailMessageCount: number; totalTokens: number; sessionSeed: string } | undefined {
getRoom(roomId: string): RoomInfo | undefined {
return this.db()?.prepare('SELECT id, name, inviteCode, triggerTokens, maxHistoryTokens, tailMessageCount, totalTokens, sessionSeed FROM gc_rooms WHERE id = ?').get(roomId) as any
}
getRoomByInviteCode(code: string): { id: string; name: string; inviteCode: string | null; triggerTokens: number; maxHistoryTokens: number; tailMessageCount: number; totalTokens: number; sessionSeed: string } | undefined {
getRoomByInviteCode(code: string): RoomInfo | undefined {
return this.db()?.prepare('SELECT id, name, inviteCode, triggerTokens, maxHistoryTokens, tailMessageCount, totalTokens, sessionSeed FROM gc_rooms WHERE inviteCode = ?').get(code) as any
}
getAllRooms(): { id: string; name: string; inviteCode: string | null; triggerTokens: number; maxHistoryTokens: number; tailMessageCount: number; totalTokens: number; sessionSeed: string }[] {
getAllRooms(): RoomInfo[] {
return (this.db()?.prepare('SELECT id, name, inviteCode, triggerTokens, maxHistoryTokens, tailMessageCount, totalTokens, sessionSeed FROM gc_rooms ORDER BY id').all() || []) as any[]
}
getRoomsForProfiles(profiles: string[]): RoomInfo[] {
const uniqueProfiles = [...new Set(profiles.map(profile => profile.trim()).filter(Boolean))]
if (!uniqueProfiles.length) return []
const placeholders = uniqueProfiles.map(() => '?').join(', ')
return (this.db()?.prepare(
`SELECT DISTINCT r.id, r.name, r.inviteCode, r.triggerTokens, r.maxHistoryTokens, r.tailMessageCount, r.totalTokens, r.sessionSeed
FROM gc_rooms r
INNER JOIN gc_room_agents a ON a.roomId = r.id
WHERE a.profile IN (${placeholders})
ORDER BY r.id`
).all(...uniqueProfiles) || []) as any[]
}
saveRoom(id: string, name: string, inviteCode?: string, config?: { triggerTokens?: number; maxHistoryTokens?: number; tailMessageCount?: number }): void {
this.db()?.prepare(
'INSERT OR IGNORE INTO gc_rooms (id, name, inviteCode, triggerTokens, maxHistoryTokens, tailMessageCount) VALUES (?, ?, ?, ?, ?, ?)'
@@ -109,6 +109,7 @@ export async function handleApiRun(
state.source = 'api_server'
state.activeRunMarker = runMarker
let peerUserMessage: { id?: number; role: 'user'; content: string; timestamp: number } | null = null
if (!skipUserMessage) {
const inputStr = contentBlocksToString(input)
state.messages.push({
@@ -126,12 +127,13 @@ export async function handleApiRun(
createSession({ id: session_id, profile, source: 'api_server', model, provider, title: preview })
}
addMessage({
const messageId = addMessage({
session_id,
role: 'user',
content: inputStr,
timestamp: now,
})
peerUserMessage = { id: messageId, role: 'user', content: inputStr, timestamp: now }
} else {
const inputStr = contentBlocksToString(input)
state.messages.push({
@@ -147,15 +149,23 @@ export async function handleApiRun(
const preview = previewText.replace(/[\r\n]/g, ' ').substring(0, 100)
createSession({ id: session_id, profile, source: 'api_server', model, provider, title: preview })
}
addMessage({
const messageId = addMessage({
session_id,
role: 'user',
content: inputStr,
timestamp: now,
})
peerUserMessage = { id: messageId, role: 'user', content: inputStr, timestamp: now }
}
socket.join(`session:${session_id}`)
if (peerUserMessage) {
socket.to(`session:${session_id}`).emit('run.peer_user_message', {
event: 'run.peer_user_message',
session_id,
message: peerUserMessage,
})
}
}
const emit = (event: string, payload: any) => {
@@ -173,7 +173,7 @@ export async function handleBridgeRun(
const preview = previewText.replace(/[\r\n]/g, ' ').substring(0, 100)
createSession({ id: session_id, profile, source: 'cli', model: resolvedModel, provider: resolvedProvider, title: preview })
}
addMessage({
const messageId = addMessage({
session_id,
role: 'user',
content: inputStr,
@@ -181,6 +181,16 @@ export async function handleBridgeRun(
})
socket.join(`session:${session_id}`)
socket.to(`session:${session_id}`).emit('run.peer_user_message', {
event: 'run.peer_user_message',
session_id,
message: {
id: messageId,
role: 'user',
content: inputStr,
timestamp: now,
},
})
const emit = (event: string, payload: any) => {
const tagged = { ...payload, session_id }
nsp.to(`session:${session_id}`).emit(event, tagged)