Files
Memoh/internal/db/sqlc/sessions.sql.go
T
Acbox Liu b3a39ad93d refactor: replace persistent subagents with ephemeral spawn tool (#280)
* 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
2026-03-22 19:03:28 +08:00

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
}