Files
Memoh/internal/db/sqlc/session_info.sql.go
T
Acbox 33b57ee345 feat: rename info to status, add /status slash command
Rename session info endpoint from /sessions/:id/info to /sessions/:id/status
and update frontend tab label accordingly. Add /status slash command that
displays current session metrics (message count, context usage, cache hit
rate, used skills) as formatted text in any channel.
2026-04-03 01:17:33 +08:00

123 lines
3.5 KiB
Go

// Code generated by sqlc. DO NOT EDIT.
// versions:
// sqlc v1.30.0
// source: session_info.sql
package sqlc
import (
"context"
"github.com/jackc/pgx/v5/pgtype"
)
const countMessagesBySession = `-- name: CountMessagesBySession :one
SELECT COUNT(*)::bigint AS message_count
FROM bot_history_messages
WHERE session_id = $1
`
func (q *Queries) CountMessagesBySession(ctx context.Context, sessionID pgtype.UUID) (int64, error) {
row := q.db.QueryRow(ctx, countMessagesBySession, sessionID)
var message_count int64
err := row.Scan(&message_count)
return message_count, err
}
const getLatestAssistantUsage = `-- name: GetLatestAssistantUsage :one
SELECT
COALESCE((m.usage->>'inputTokens')::bigint, 0)::bigint AS input_tokens
FROM bot_history_messages m
WHERE m.session_id = $1
AND m.role = 'assistant'
AND m.usage IS NOT NULL
ORDER BY m.created_at DESC
LIMIT 1
`
func (q *Queries) GetLatestAssistantUsage(ctx context.Context, sessionID pgtype.UUID) (int64, error) {
row := q.db.QueryRow(ctx, getLatestAssistantUsage, sessionID)
var input_tokens int64
err := row.Scan(&input_tokens)
return input_tokens, err
}
const getLatestSessionIDByBot = `-- name: GetLatestSessionIDByBot :one
SELECT s.id
FROM bot_sessions s
WHERE s.bot_id = $1
AND s.type = 'chat'
AND s.deleted_at IS NULL
ORDER BY s.updated_at DESC
LIMIT 1
`
func (q *Queries) GetLatestSessionIDByBot(ctx context.Context, botID pgtype.UUID) (pgtype.UUID, error) {
row := q.db.QueryRow(ctx, getLatestSessionIDByBot, botID)
var id pgtype.UUID
err := row.Scan(&id)
return id, err
}
const getSessionCacheStats = `-- name: GetSessionCacheStats :one
SELECT
COALESCE(SUM((m.usage->>'inputTokens')::bigint), 0)::bigint AS total_input_tokens,
COALESCE(SUM((m.usage->'inputTokenDetails'->>'cacheReadTokens')::bigint), 0)::bigint AS cache_read_tokens,
COALESCE(SUM((m.usage->'inputTokenDetails'->>'cacheWriteTokens')::bigint), 0)::bigint AS cache_write_tokens
FROM bot_history_messages m
WHERE m.session_id = $1
AND m.usage IS NOT NULL
`
type GetSessionCacheStatsRow struct {
TotalInputTokens int64 `json:"total_input_tokens"`
CacheReadTokens int64 `json:"cache_read_tokens"`
CacheWriteTokens int64 `json:"cache_write_tokens"`
}
func (q *Queries) GetSessionCacheStats(ctx context.Context, sessionID pgtype.UUID) (GetSessionCacheStatsRow, error) {
row := q.db.QueryRow(ctx, getSessionCacheStats, sessionID)
var i GetSessionCacheStatsRow
err := row.Scan(&i.TotalInputTokens, &i.CacheReadTokens, &i.CacheWriteTokens)
return i, err
}
const getSessionUsedSkills = `-- name: GetSessionUsedSkills :many
SELECT DISTINCT
(part->'input'->>'skillName')::text AS skill_name
FROM bot_history_messages m,
jsonb_array_elements(
CASE WHEN jsonb_typeof(m.content->'content') = 'array'
THEN m.content->'content'
ELSE '[]'::jsonb
END
) AS part
WHERE m.session_id = $1
AND m.role = 'assistant'
AND part->>'type' = 'tool-call'
AND part->>'toolName' = 'use_skill'
AND part->'input'->>'skillName' IS NOT NULL
AND part->'input'->>'skillName' != ''
ORDER BY skill_name
`
func (q *Queries) GetSessionUsedSkills(ctx context.Context, sessionID pgtype.UUID) ([]string, error) {
rows, err := q.db.Query(ctx, getSessionUsedSkills, sessionID)
if err != nil {
return nil, err
}
defer rows.Close()
var items []string
for rows.Next() {
var skill_name string
if err := rows.Scan(&skill_name); err != nil {
return nil, err
}
items = append(items, skill_name)
}
if err := rows.Err(); err != nil {
return nil, err
}
return items, nil
}