mirror of
https://github.com/memohai/Memoh.git
synced 2026-04-25 07:00:48 +09:00
b3a39ad93d
* refactor: replace persistent subagents with ephemeral spawn tool (#subagent) - Drop subagents table, remove all persistent subagent infrastructure - Add 'subagent' session type with parent_session_id on bot_sessions - Rewrite subagent tool as single 'spawn' tool with parallel execution - Create system_subagent.md prompt, add _subagent.md include for chat - Limit subagent tools to file, exec, web_search, web_fetch only - Merge subagent token usage into parent chat session in reporting - Remove frontend subagent management page, update chat UI for spawn - Fix UTF-8 truncation in session title, fix query not passed to agent * refactor: remove history message page
355 lines
8.7 KiB
Go
355 lines
8.7 KiB
Go
// Code generated by sqlc. DO NOT EDIT.
|
|
// versions:
|
|
// sqlc v1.30.0
|
|
// source: sessions.sql
|
|
|
|
package sqlc
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/jackc/pgx/v5/pgtype"
|
|
)
|
|
|
|
const createSession = `-- name: CreateSession :one
|
|
INSERT INTO bot_sessions (
|
|
bot_id, route_id, channel_type, type, title, metadata, parent_session_id
|
|
)
|
|
VALUES (
|
|
$1,
|
|
$2::uuid,
|
|
$3::text,
|
|
$4,
|
|
$5,
|
|
$6,
|
|
$7::uuid
|
|
)
|
|
RETURNING id, bot_id, route_id, channel_type, type, title, metadata, parent_session_id, created_at, updated_at, deleted_at
|
|
`
|
|
|
|
type CreateSessionParams struct {
|
|
BotID pgtype.UUID `json:"bot_id"`
|
|
RouteID pgtype.UUID `json:"route_id"`
|
|
ChannelType pgtype.Text `json:"channel_type"`
|
|
Type string `json:"type"`
|
|
Title string `json:"title"`
|
|
Metadata []byte `json:"metadata"`
|
|
ParentSessionID pgtype.UUID `json:"parent_session_id"`
|
|
}
|
|
|
|
func (q *Queries) CreateSession(ctx context.Context, arg CreateSessionParams) (BotSession, error) {
|
|
row := q.db.QueryRow(ctx, createSession,
|
|
arg.BotID,
|
|
arg.RouteID,
|
|
arg.ChannelType,
|
|
arg.Type,
|
|
arg.Title,
|
|
arg.Metadata,
|
|
arg.ParentSessionID,
|
|
)
|
|
var i BotSession
|
|
err := row.Scan(
|
|
&i.ID,
|
|
&i.BotID,
|
|
&i.RouteID,
|
|
&i.ChannelType,
|
|
&i.Type,
|
|
&i.Title,
|
|
&i.Metadata,
|
|
&i.ParentSessionID,
|
|
&i.CreatedAt,
|
|
&i.UpdatedAt,
|
|
&i.DeletedAt,
|
|
)
|
|
return i, err
|
|
}
|
|
|
|
const getActiveSessionForRoute = `-- name: GetActiveSessionForRoute :one
|
|
SELECT s.id, s.bot_id, s.route_id, s.channel_type, s.type, s.title, s.metadata, s.parent_session_id, s.created_at, s.updated_at, s.deleted_at
|
|
FROM bot_sessions s
|
|
JOIN bot_channel_routes r ON r.active_session_id = s.id
|
|
WHERE r.id = $1
|
|
AND s.deleted_at IS NULL
|
|
`
|
|
|
|
func (q *Queries) GetActiveSessionForRoute(ctx context.Context, routeID pgtype.UUID) (BotSession, error) {
|
|
row := q.db.QueryRow(ctx, getActiveSessionForRoute, routeID)
|
|
var i BotSession
|
|
err := row.Scan(
|
|
&i.ID,
|
|
&i.BotID,
|
|
&i.RouteID,
|
|
&i.ChannelType,
|
|
&i.Type,
|
|
&i.Title,
|
|
&i.Metadata,
|
|
&i.ParentSessionID,
|
|
&i.CreatedAt,
|
|
&i.UpdatedAt,
|
|
&i.DeletedAt,
|
|
)
|
|
return i, err
|
|
}
|
|
|
|
const getSessionByID = `-- name: GetSessionByID :one
|
|
SELECT id, bot_id, route_id, channel_type, type, title, metadata, parent_session_id, created_at, updated_at, deleted_at
|
|
FROM bot_sessions
|
|
WHERE id = $1
|
|
AND deleted_at IS NULL
|
|
`
|
|
|
|
func (q *Queries) GetSessionByID(ctx context.Context, id pgtype.UUID) (BotSession, error) {
|
|
row := q.db.QueryRow(ctx, getSessionByID, id)
|
|
var i BotSession
|
|
err := row.Scan(
|
|
&i.ID,
|
|
&i.BotID,
|
|
&i.RouteID,
|
|
&i.ChannelType,
|
|
&i.Type,
|
|
&i.Title,
|
|
&i.Metadata,
|
|
&i.ParentSessionID,
|
|
&i.CreatedAt,
|
|
&i.UpdatedAt,
|
|
&i.DeletedAt,
|
|
)
|
|
return i, err
|
|
}
|
|
|
|
const listSessionsByBot = `-- name: ListSessionsByBot :many
|
|
SELECT
|
|
s.id, s.bot_id, s.route_id, s.channel_type, s.type, s.title, s.metadata,
|
|
s.created_at, s.updated_at, s.deleted_at,
|
|
r.metadata AS route_metadata,
|
|
r.conversation_type AS route_conversation_type
|
|
FROM bot_sessions s
|
|
LEFT JOIN bot_channel_routes r ON r.id = s.route_id
|
|
WHERE s.bot_id = $1
|
|
AND s.deleted_at IS NULL
|
|
ORDER BY s.updated_at DESC
|
|
`
|
|
|
|
type ListSessionsByBotRow struct {
|
|
ID pgtype.UUID `json:"id"`
|
|
BotID pgtype.UUID `json:"bot_id"`
|
|
RouteID pgtype.UUID `json:"route_id"`
|
|
ChannelType pgtype.Text `json:"channel_type"`
|
|
Type string `json:"type"`
|
|
Title string `json:"title"`
|
|
Metadata []byte `json:"metadata"`
|
|
CreatedAt pgtype.Timestamptz `json:"created_at"`
|
|
UpdatedAt pgtype.Timestamptz `json:"updated_at"`
|
|
DeletedAt pgtype.Timestamptz `json:"deleted_at"`
|
|
RouteMetadata []byte `json:"route_metadata"`
|
|
RouteConversationType pgtype.Text `json:"route_conversation_type"`
|
|
}
|
|
|
|
func (q *Queries) ListSessionsByBot(ctx context.Context, botID pgtype.UUID) ([]ListSessionsByBotRow, error) {
|
|
rows, err := q.db.Query(ctx, listSessionsByBot, botID)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer rows.Close()
|
|
var items []ListSessionsByBotRow
|
|
for rows.Next() {
|
|
var i ListSessionsByBotRow
|
|
if err := rows.Scan(
|
|
&i.ID,
|
|
&i.BotID,
|
|
&i.RouteID,
|
|
&i.ChannelType,
|
|
&i.Type,
|
|
&i.Title,
|
|
&i.Metadata,
|
|
&i.CreatedAt,
|
|
&i.UpdatedAt,
|
|
&i.DeletedAt,
|
|
&i.RouteMetadata,
|
|
&i.RouteConversationType,
|
|
); err != nil {
|
|
return nil, err
|
|
}
|
|
items = append(items, i)
|
|
}
|
|
if err := rows.Err(); err != nil {
|
|
return nil, err
|
|
}
|
|
return items, nil
|
|
}
|
|
|
|
const listSessionsByRoute = `-- name: ListSessionsByRoute :many
|
|
SELECT id, bot_id, route_id, channel_type, type, title, metadata, parent_session_id, created_at, updated_at, deleted_at
|
|
FROM bot_sessions
|
|
WHERE route_id = $1
|
|
AND deleted_at IS NULL
|
|
ORDER BY updated_at DESC
|
|
`
|
|
|
|
func (q *Queries) ListSessionsByRoute(ctx context.Context, routeID pgtype.UUID) ([]BotSession, error) {
|
|
rows, err := q.db.Query(ctx, listSessionsByRoute, routeID)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer rows.Close()
|
|
var items []BotSession
|
|
for rows.Next() {
|
|
var i BotSession
|
|
if err := rows.Scan(
|
|
&i.ID,
|
|
&i.BotID,
|
|
&i.RouteID,
|
|
&i.ChannelType,
|
|
&i.Type,
|
|
&i.Title,
|
|
&i.Metadata,
|
|
&i.ParentSessionID,
|
|
&i.CreatedAt,
|
|
&i.UpdatedAt,
|
|
&i.DeletedAt,
|
|
); err != nil {
|
|
return nil, err
|
|
}
|
|
items = append(items, i)
|
|
}
|
|
if err := rows.Err(); err != nil {
|
|
return nil, err
|
|
}
|
|
return items, nil
|
|
}
|
|
|
|
const listSubagentSessionsByParent = `-- name: ListSubagentSessionsByParent :many
|
|
SELECT id, bot_id, route_id, channel_type, type, title, metadata, parent_session_id, created_at, updated_at, deleted_at
|
|
FROM bot_sessions
|
|
WHERE parent_session_id = $1
|
|
AND deleted_at IS NULL
|
|
ORDER BY created_at DESC
|
|
`
|
|
|
|
func (q *Queries) ListSubagentSessionsByParent(ctx context.Context, parentSessionID pgtype.UUID) ([]BotSession, error) {
|
|
rows, err := q.db.Query(ctx, listSubagentSessionsByParent, parentSessionID)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer rows.Close()
|
|
var items []BotSession
|
|
for rows.Next() {
|
|
var i BotSession
|
|
if err := rows.Scan(
|
|
&i.ID,
|
|
&i.BotID,
|
|
&i.RouteID,
|
|
&i.ChannelType,
|
|
&i.Type,
|
|
&i.Title,
|
|
&i.Metadata,
|
|
&i.ParentSessionID,
|
|
&i.CreatedAt,
|
|
&i.UpdatedAt,
|
|
&i.DeletedAt,
|
|
); err != nil {
|
|
return nil, err
|
|
}
|
|
items = append(items, i)
|
|
}
|
|
if err := rows.Err(); err != nil {
|
|
return nil, err
|
|
}
|
|
return items, nil
|
|
}
|
|
|
|
const softDeleteSession = `-- name: SoftDeleteSession :exec
|
|
UPDATE bot_sessions
|
|
SET deleted_at = now(), updated_at = now()
|
|
WHERE id = $1 AND deleted_at IS NULL
|
|
`
|
|
|
|
func (q *Queries) SoftDeleteSession(ctx context.Context, id pgtype.UUID) error {
|
|
_, err := q.db.Exec(ctx, softDeleteSession, id)
|
|
return err
|
|
}
|
|
|
|
const softDeleteSessionsByBot = `-- name: SoftDeleteSessionsByBot :exec
|
|
UPDATE bot_sessions
|
|
SET deleted_at = now(), updated_at = now()
|
|
WHERE bot_id = $1 AND deleted_at IS NULL
|
|
`
|
|
|
|
func (q *Queries) SoftDeleteSessionsByBot(ctx context.Context, botID pgtype.UUID) error {
|
|
_, err := q.db.Exec(ctx, softDeleteSessionsByBot, botID)
|
|
return err
|
|
}
|
|
|
|
const touchSession = `-- name: TouchSession :exec
|
|
UPDATE bot_sessions
|
|
SET updated_at = now()
|
|
WHERE id = $1 AND deleted_at IS NULL
|
|
`
|
|
|
|
func (q *Queries) TouchSession(ctx context.Context, id pgtype.UUID) error {
|
|
_, err := q.db.Exec(ctx, touchSession, id)
|
|
return err
|
|
}
|
|
|
|
const updateSessionMetadata = `-- name: UpdateSessionMetadata :one
|
|
UPDATE bot_sessions
|
|
SET metadata = $1, updated_at = now()
|
|
WHERE id = $2 AND deleted_at IS NULL
|
|
RETURNING id, bot_id, route_id, channel_type, type, title, metadata, parent_session_id, created_at, updated_at, deleted_at
|
|
`
|
|
|
|
type UpdateSessionMetadataParams struct {
|
|
Metadata []byte `json:"metadata"`
|
|
ID pgtype.UUID `json:"id"`
|
|
}
|
|
|
|
func (q *Queries) UpdateSessionMetadata(ctx context.Context, arg UpdateSessionMetadataParams) (BotSession, error) {
|
|
row := q.db.QueryRow(ctx, updateSessionMetadata, arg.Metadata, arg.ID)
|
|
var i BotSession
|
|
err := row.Scan(
|
|
&i.ID,
|
|
&i.BotID,
|
|
&i.RouteID,
|
|
&i.ChannelType,
|
|
&i.Type,
|
|
&i.Title,
|
|
&i.Metadata,
|
|
&i.ParentSessionID,
|
|
&i.CreatedAt,
|
|
&i.UpdatedAt,
|
|
&i.DeletedAt,
|
|
)
|
|
return i, err
|
|
}
|
|
|
|
const updateSessionTitle = `-- name: UpdateSessionTitle :one
|
|
UPDATE bot_sessions
|
|
SET title = $1, updated_at = now()
|
|
WHERE id = $2 AND deleted_at IS NULL
|
|
RETURNING id, bot_id, route_id, channel_type, type, title, metadata, parent_session_id, created_at, updated_at, deleted_at
|
|
`
|
|
|
|
type UpdateSessionTitleParams struct {
|
|
Title string `json:"title"`
|
|
ID pgtype.UUID `json:"id"`
|
|
}
|
|
|
|
func (q *Queries) UpdateSessionTitle(ctx context.Context, arg UpdateSessionTitleParams) (BotSession, error) {
|
|
row := q.db.QueryRow(ctx, updateSessionTitle, arg.Title, arg.ID)
|
|
var i BotSession
|
|
err := row.Scan(
|
|
&i.ID,
|
|
&i.BotID,
|
|
&i.RouteID,
|
|
&i.ChannelType,
|
|
&i.Type,
|
|
&i.Title,
|
|
&i.Metadata,
|
|
&i.ParentSessionID,
|
|
&i.CreatedAt,
|
|
&i.UpdatedAt,
|
|
&i.DeletedAt,
|
|
)
|
|
return i, err
|
|
}
|