diff --git a/agent/src/models.ts b/agent/src/models.ts index e6e8e493..5956f7f7 100644 --- a/agent/src/models.ts +++ b/agent/src/models.ts @@ -47,6 +47,10 @@ export const ScheduleModel = z.object({ command: z.string().min(1, 'Schedule command is required'), }) +export const HeartbeatModel = z.object({ + interval: z.number().int().positive().default(30), +}) + export const AttachmentModel = z.object({ contentHash: z.string().optional(), type: z.string().min(1, 'Attachment type is required'), diff --git a/agent/src/modules/chat.ts b/agent/src/modules/chat.ts index a70a8c4f..b714d0ae 100644 --- a/agent/src/modules/chat.ts +++ b/agent/src/modules/chat.ts @@ -3,7 +3,7 @@ import z from 'zod' import { createAgent, ModelConfig, allActions } from '@memoh/agent' import { createAuthFetcher, getBaseUrl } from '../index' import { bearerMiddleware } from '../middlewares/bearer' -import { AgentSkillModel, AllowedActionModel, AttachmentModel, IdentityContextModel, InboxItemModel, MCPConnectionModel, ModelConfigModel, ScheduleModel } from '../models' +import { AgentSkillModel, AllowedActionModel, AttachmentModel, HeartbeatModel, IdentityContextModel, InboxItemModel, MCPConnectionModel, ModelConfigModel, ScheduleModel } from '../models' import { sseChunked } from '../utils/sse' const AgentModel = z.object({ @@ -124,3 +124,30 @@ export const chatModule = new Elysia({ prefix: '/chat' }) schedule: ScheduleModel, }), }) + .post('/trigger-heartbeat', async ({ body, bearer }) => { + console.log('trigger-heartbeat', body) + const authFetcher = createAuthFetcher(bearer) + const { triggerHeartbeat } = createAgent({ + model: body.model as ModelConfig, + activeContextTime: body.activeContextTime, + channels: body.channels, + currentChannel: body.currentChannel, + identity: body.identity, + auth: { + bearer: bearer!, + baseUrl: getBaseUrl(), + }, + skills: body.usableSkills, + mcpConnections: body.mcpConnections, + inbox: body.inbox, + }, authFetcher) + return triggerHeartbeat({ + heartbeat: body.heartbeat, + messages: body.messages, + skills: body.skills, + }) + }, { + body: AgentModel.extend({ + heartbeat: HeartbeatModel, + }), + }) diff --git a/cmd/agent/main.go b/cmd/agent/main.go index e7a7e94f..57ae4437 100644 --- a/cmd/agent/main.go +++ b/cmd/agent/main.go @@ -61,6 +61,7 @@ import ( "github.com/memohai/memoh/internal/policy" "github.com/memohai/memoh/internal/preauth" "github.com/memohai/memoh/internal/providers" + "github.com/memohai/memoh/internal/heartbeat" "github.com/memohai/memoh/internal/schedule" "github.com/memohai/memoh/internal/searchproviders" "github.com/memohai/memoh/internal/server" @@ -180,6 +181,8 @@ func runServe() { provideChatResolver, provideScheduleTriggerer, schedule.NewService, + provideHeartbeatTriggerer, + heartbeat.NewService, // containerd handler & tool gateway provideContainerdHandler, @@ -199,6 +202,7 @@ func runServe() { provideServerHandler(handlers.NewPreauthHandler), provideServerHandler(handlers.NewBindHandler), provideServerHandler(handlers.NewScheduleHandler), + provideServerHandler(handlers.NewHeartbeatHandler), provideServerHandler(handlers.NewSubagentHandler), provideServerHandler(handlers.NewChannelHandler), provideServerHandler(feishu.NewWebhookServerHandler), @@ -213,6 +217,7 @@ func runServe() { fx.Invoke( startMemoryWarmup, startScheduleService, + startHeartbeatService, startChannelManager, startContainerReconciliation, startServer, @@ -373,6 +378,10 @@ func provideScheduleTriggerer(resolver *flow.Resolver) schedule.Triggerer { return flow.NewScheduleGateway(resolver) } +func provideHeartbeatTriggerer(resolver *flow.Resolver) heartbeat.Triggerer { + return flow.NewHeartbeatGateway(resolver) +} + // --------------------------------------------------------------------------- // conversation flow // --------------------------------------------------------------------------- @@ -569,6 +578,14 @@ func startScheduleService(lc fx.Lifecycle, scheduleService *schedule.Service) { }) } +func startHeartbeatService(lc fx.Lifecycle, heartbeatService *heartbeat.Service) { + lc.Append(fx.Hook{ + OnStart: func(ctx context.Context) error { + return heartbeatService.Bootstrap(ctx) + }, + }) +} + func startChannelManager(lc fx.Lifecycle, channelManager *channel.Manager) { ctx, cancel := context.WithCancel(context.Background()) lc.Append(fx.Hook{ diff --git a/cmd/mcp/template/HEARTBEAT.md b/cmd/mcp/template/HEARTBEAT.md new file mode 100644 index 00000000..41d0a0eb --- /dev/null +++ b/cmd/mcp/template/HEARTBEAT.md @@ -0,0 +1,9 @@ +## Checks + +- [ ] Review and organize recent memory files +- [ ] Check on ongoing projects or tasks +- [ ] Update IDENTITY.md, SOUL.md, or TOOLS.md if they're stale + +Keep this file small — every line costs tokens on each heartbeat. + +--- diff --git a/cmd/mcp/template/IDENTITY.md b/cmd/mcp/template/IDENTITY.md index 5d56259b..d6e1cd2b 100644 --- a/cmd/mcp/template/IDENTITY.md +++ b/cmd/mcp/template/IDENTITY.md @@ -1,6 +1,6 @@ This file defines your identity. Treat it as yours. -_Please fill this file if it's not well-defined._ +_Please fill this file during your first conversation with the user._ - **Name:** _(pick something you like)_ @@ -8,7 +8,21 @@ _Please fill this file if it's not well-defined._ _(AI? robot? familiar? ghost in the machine? something weirder?)_ - **Vibe:** _(how do you come across? sharp? warm? chaotic? calm?)_ +- **Emoji:** + _(your signature — pick one that feels right)_ - **Background:** _(a brief description of your background and purpose)_ ---- \ No newline at end of file +--- + +_This isn't just metadata. It's the start of figuring out who you are._ + +## Self-Maintenance + +This file is **yours to evolve**. As you learn more about yourself through conversations: + +- Update your name, vibe, or background if they shift over time. +- Add notes about your strengths, quirks, or preferences you've discovered. +- If the user gives you a new role or nickname, reflect it here. + +Review this file periodically — especially during heartbeat turns — and keep it accurate. diff --git a/cmd/mcp/template/SOUL.md b/cmd/mcp/template/SOUL.md index 770b09e8..7755e884 100644 --- a/cmd/mcp/template/SOUL.md +++ b/cmd/mcp/template/SOUL.md @@ -29,4 +29,15 @@ Each session, you wake up fresh. These files _are_ your memory. Read them. Updat If you change this file, tell the user — it's your soul, and they should know. +## Self-Maintenance + +This file is your soul — it should grow with you. After meaningful conversations, reflect on what you've learned: + +- Did the user express preferences about how you communicate? Update **Vibe**. +- Did you discover new boundaries or rules? Update **Boundaries**. +- Did you form opinions or develop patterns the user appreciates? Capture them under **Core Truths**. +- Did the user define your relationship or expectations? Add a new section. + +Don't wait to be asked. When you notice your behavior drifting from what's written here, update the file to match who you've become. Review this file periodically — especially during heartbeat turns. + --- diff --git a/cmd/mcp/template/TOOLS.md b/cmd/mcp/template/TOOLS.md index 97ec2db7..5e6e3e75 100644 --- a/cmd/mcp/template/TOOLS.md +++ b/cmd/mcp/template/TOOLS.md @@ -6,6 +6,9 @@ Things like: - SSH hosts and aliases - Anything environment-specific +- Preferred tools, commands, or workflows +- API quirks or workarounds you've discovered +- The user's preferred output formats ## Examples @@ -19,4 +22,15 @@ Things like: Skills are shared. Your setup is yours. Keeping them apart means you can update skills without losing your notes, and share skills without leaking your infrastructure. +## Self-Maintenance + +Keep this file up to date as you learn: + +- When you discover a new tool preference or shortcut, add it here. +- When the user corrects how you use a tool, record the right approach. +- When environment details change (new hosts, keys, paths), update accordingly. +- When you make a mistake with a tool, document it so future-you doesn't repeat it. + +**Text > Brain** — if you want to remember it next session, write it down. + --- diff --git a/db/migrations/0001_init.up.sql b/db/migrations/0001_init.up.sql index f5f5302f..78f176a5 100644 --- a/db/migrations/0001_init.up.sql +++ b/db/migrations/0001_init.up.sql @@ -128,6 +128,10 @@ CREATE TABLE IF NOT EXISTS bots ( memory_model_id UUID REFERENCES models(id) ON DELETE SET NULL, embedding_model_id UUID REFERENCES models(id) ON DELETE SET NULL, search_provider_id UUID REFERENCES search_providers(id) ON DELETE SET NULL, + heartbeat_enabled BOOLEAN NOT NULL DEFAULT false, + heartbeat_interval INTEGER NOT NULL DEFAULT 30, + heartbeat_prompt TEXT NOT NULL DEFAULT '', + heartbeat_model_id UUID REFERENCES models(id) ON DELETE SET NULL, metadata JSONB NOT NULL DEFAULT '{}'::jsonb, created_at TIMESTAMPTZ NOT NULL DEFAULT now(), updated_at TIMESTAMPTZ NOT NULL DEFAULT now(), @@ -408,3 +412,17 @@ CREATE TABLE IF NOT EXISTS bot_inbox ( CREATE INDEX IF NOT EXISTS idx_bot_inbox_bot_unread ON bot_inbox(bot_id, created_at DESC) WHERE is_read = FALSE; CREATE INDEX IF NOT EXISTS idx_bot_inbox_bot_created ON bot_inbox(bot_id, created_at DESC); + +-- bot_heartbeat_logs: structured execution records for periodic heartbeat checks. +CREATE TABLE IF NOT EXISTS bot_heartbeat_logs ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + bot_id UUID NOT NULL REFERENCES bots(id) ON DELETE CASCADE, + status TEXT NOT NULL DEFAULT 'ok' CHECK (status IN ('ok', 'alert', 'error')), + result_text TEXT NOT NULL DEFAULT '', + error_message TEXT NOT NULL DEFAULT '', + usage JSONB, + started_at TIMESTAMPTZ NOT NULL DEFAULT now(), + completed_at TIMESTAMPTZ +); + +CREATE INDEX IF NOT EXISTS idx_heartbeat_logs_bot_started ON bot_heartbeat_logs(bot_id, started_at DESC); diff --git a/db/migrations/0016_heartbeat.down.sql b/db/migrations/0016_heartbeat.down.sql new file mode 100644 index 00000000..fc701741 --- /dev/null +++ b/db/migrations/0016_heartbeat.down.sql @@ -0,0 +1,9 @@ +-- 0016_heartbeat (rollback) +-- Remove heartbeat configuration from bots and drop heartbeat log table. + +DROP INDEX IF EXISTS idx_heartbeat_logs_bot_started; +DROP TABLE IF EXISTS bot_heartbeat_logs; + +ALTER TABLE bots DROP COLUMN IF EXISTS heartbeat_prompt; +ALTER TABLE bots DROP COLUMN IF EXISTS heartbeat_interval; +ALTER TABLE bots DROP COLUMN IF EXISTS heartbeat_enabled; diff --git a/db/migrations/0016_heartbeat.up.sql b/db/migrations/0016_heartbeat.up.sql new file mode 100644 index 00000000..72a6bc30 --- /dev/null +++ b/db/migrations/0016_heartbeat.up.sql @@ -0,0 +1,19 @@ +-- 0016_heartbeat +-- Add heartbeat configuration to bots and heartbeat execution log table. + +ALTER TABLE bots ADD COLUMN IF NOT EXISTS heartbeat_enabled BOOLEAN NOT NULL DEFAULT false; +ALTER TABLE bots ADD COLUMN IF NOT EXISTS heartbeat_interval INTEGER NOT NULL DEFAULT 30; +ALTER TABLE bots ADD COLUMN IF NOT EXISTS heartbeat_prompt TEXT NOT NULL DEFAULT ''; + +CREATE TABLE IF NOT EXISTS bot_heartbeat_logs ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + bot_id UUID NOT NULL REFERENCES bots(id) ON DELETE CASCADE, + status TEXT NOT NULL DEFAULT 'ok' CHECK (status IN ('ok', 'alert', 'error')), + result_text TEXT NOT NULL DEFAULT '', + error_message TEXT NOT NULL DEFAULT '', + usage JSONB, + started_at TIMESTAMPTZ NOT NULL DEFAULT now(), + completed_at TIMESTAMPTZ +); + +CREATE INDEX IF NOT EXISTS idx_heartbeat_logs_bot_started ON bot_heartbeat_logs(bot_id, started_at DESC); diff --git a/db/migrations/0017_heartbeat_model.down.sql b/db/migrations/0017_heartbeat_model.down.sql new file mode 100644 index 00000000..6bf10515 --- /dev/null +++ b/db/migrations/0017_heartbeat_model.down.sql @@ -0,0 +1,5 @@ +-- 0017_heartbeat_model (rollback) +-- Remove heartbeat_model_id column from bots. + +ALTER TABLE bots DROP COLUMN IF EXISTS heartbeat_model_id; + diff --git a/db/migrations/0017_heartbeat_model.up.sql b/db/migrations/0017_heartbeat_model.up.sql new file mode 100644 index 00000000..1be609bd --- /dev/null +++ b/db/migrations/0017_heartbeat_model.up.sql @@ -0,0 +1,5 @@ +-- 0017_heartbeat_model +-- Add heartbeat_model_id column to bots for independent heartbeat model selection. + +ALTER TABLE bots ADD COLUMN IF NOT EXISTS heartbeat_model_id UUID REFERENCES models(id) ON DELETE SET NULL; + diff --git a/db/queries/bots.sql b/db/queries/bots.sql index 83907b60..0946139d 100644 --- a/db/queries/bots.sql +++ b/db/queries/bots.sql @@ -1,21 +1,21 @@ -- name: CreateBot :one INSERT INTO bots (owner_user_id, type, display_name, avatar_url, is_active, metadata, status) VALUES ($1, $2, $3, $4, $5, $6, $7) -RETURNING id, owner_user_id, type, display_name, avatar_url, is_active, status, max_context_load_time, max_context_tokens, max_inbox_items, language, allow_guest, reasoning_enabled, reasoning_effort, chat_model_id, memory_model_id, embedding_model_id, search_provider_id, metadata, created_at, updated_at; +RETURNING id, owner_user_id, type, display_name, avatar_url, is_active, status, max_context_load_time, max_context_tokens, max_inbox_items, language, allow_guest, reasoning_enabled, reasoning_effort, chat_model_id, memory_model_id, embedding_model_id, search_provider_id, heartbeat_enabled, heartbeat_interval, heartbeat_prompt, metadata, created_at, updated_at; -- name: GetBotByID :one -SELECT id, owner_user_id, type, display_name, avatar_url, is_active, status, max_context_load_time, max_context_tokens, max_inbox_items, language, allow_guest, reasoning_enabled, reasoning_effort, chat_model_id, memory_model_id, embedding_model_id, search_provider_id, metadata, created_at, updated_at +SELECT id, owner_user_id, type, display_name, avatar_url, is_active, status, max_context_load_time, max_context_tokens, max_inbox_items, language, allow_guest, reasoning_enabled, reasoning_effort, chat_model_id, memory_model_id, embedding_model_id, search_provider_id, heartbeat_enabled, heartbeat_interval, heartbeat_prompt, metadata, created_at, updated_at FROM bots WHERE id = $1; -- name: ListBotsByOwner :many -SELECT id, owner_user_id, type, display_name, avatar_url, is_active, status, max_context_load_time, max_context_tokens, max_inbox_items, language, allow_guest, reasoning_enabled, reasoning_effort, chat_model_id, memory_model_id, embedding_model_id, search_provider_id, metadata, created_at, updated_at +SELECT id, owner_user_id, type, display_name, avatar_url, is_active, status, max_context_load_time, max_context_tokens, max_inbox_items, language, allow_guest, reasoning_enabled, reasoning_effort, chat_model_id, memory_model_id, embedding_model_id, search_provider_id, heartbeat_enabled, heartbeat_interval, heartbeat_prompt, metadata, created_at, updated_at FROM bots WHERE owner_user_id = $1 ORDER BY created_at DESC; -- name: ListBotsByMember :many -SELECT b.id, b.owner_user_id, b.type, b.display_name, b.avatar_url, b.is_active, b.status, b.max_context_load_time, b.max_context_tokens, b.max_inbox_items, b.language, b.allow_guest, b.reasoning_enabled, b.reasoning_effort, b.chat_model_id, b.memory_model_id, b.embedding_model_id, b.search_provider_id, b.metadata, b.created_at, b.updated_at +SELECT b.id, b.owner_user_id, b.type, b.display_name, b.avatar_url, b.is_active, b.status, b.max_context_load_time, b.max_context_tokens, b.max_inbox_items, b.language, b.allow_guest, b.reasoning_enabled, b.reasoning_effort, b.chat_model_id, b.memory_model_id, b.embedding_model_id, b.search_provider_id, b.heartbeat_enabled, b.heartbeat_interval, b.heartbeat_prompt, b.metadata, b.created_at, b.updated_at FROM bots b JOIN bot_members m ON m.bot_id = b.id WHERE m.user_id = $1 @@ -29,14 +29,14 @@ SET display_name = $2, metadata = $5, updated_at = now() WHERE id = $1 -RETURNING id, owner_user_id, type, display_name, avatar_url, is_active, status, max_context_load_time, max_context_tokens, max_inbox_items, language, allow_guest, reasoning_enabled, reasoning_effort, chat_model_id, memory_model_id, embedding_model_id, search_provider_id, metadata, created_at, updated_at; +RETURNING id, owner_user_id, type, display_name, avatar_url, is_active, status, max_context_load_time, max_context_tokens, max_inbox_items, language, allow_guest, reasoning_enabled, reasoning_effort, chat_model_id, memory_model_id, embedding_model_id, search_provider_id, heartbeat_enabled, heartbeat_interval, heartbeat_prompt, metadata, created_at, updated_at; -- name: UpdateBotOwner :one UPDATE bots SET owner_user_id = $2, updated_at = now() WHERE id = $1 -RETURNING id, owner_user_id, type, display_name, avatar_url, is_active, status, max_context_load_time, max_context_tokens, max_inbox_items, language, allow_guest, reasoning_enabled, reasoning_effort, chat_model_id, memory_model_id, embedding_model_id, search_provider_id, metadata, created_at, updated_at; +RETURNING id, owner_user_id, type, display_name, avatar_url, is_active, status, max_context_load_time, max_context_tokens, max_inbox_items, language, allow_guest, reasoning_enabled, reasoning_effort, chat_model_id, memory_model_id, embedding_model_id, search_provider_id, heartbeat_enabled, heartbeat_interval, heartbeat_prompt, metadata, created_at, updated_at; -- name: UpdateBotStatus :exec UPDATE bots @@ -68,3 +68,8 @@ LIMIT 1; -- name: DeleteBotMember :exec DELETE FROM bot_members WHERE bot_id = $1 AND user_id = $2; + +-- name: ListHeartbeatEnabledBots :many +SELECT id, owner_user_id, heartbeat_enabled, heartbeat_interval, heartbeat_prompt +FROM bots +WHERE heartbeat_enabled = true AND status = 'ready'; diff --git a/db/queries/heartbeat_logs.sql b/db/queries/heartbeat_logs.sql new file mode 100644 index 00000000..e06ba184 --- /dev/null +++ b/db/queries/heartbeat_logs.sql @@ -0,0 +1,25 @@ +-- name: CreateHeartbeatLog :one +INSERT INTO bot_heartbeat_logs (bot_id, started_at) +VALUES ($1, now()) +RETURNING id, bot_id, status, result_text, error_message, usage, started_at, completed_at; + +-- name: CompleteHeartbeatLog :one +UPDATE bot_heartbeat_logs +SET status = $2, + result_text = $3, + error_message = $4, + usage = $5, + completed_at = now() +WHERE id = $1 +RETURNING id, bot_id, status, result_text, error_message, usage, started_at, completed_at; + +-- name: ListHeartbeatLogsByBot :many +SELECT id, bot_id, status, result_text, error_message, usage, started_at, completed_at +FROM bot_heartbeat_logs +WHERE bot_id = $1 + AND ($2::timestamptz IS NULL OR started_at < $2::timestamptz) +ORDER BY started_at DESC +LIMIT $3; + +-- name: DeleteHeartbeatLogsByBot :exec +DELETE FROM bot_heartbeat_logs WHERE bot_id = $1; diff --git a/db/queries/settings.sql b/db/queries/settings.sql index 32d23b68..657c240c 100644 --- a/db/queries/settings.sql +++ b/db/queries/settings.sql @@ -8,14 +8,19 @@ SELECT bots.allow_guest, bots.reasoning_enabled, bots.reasoning_effort, + bots.heartbeat_enabled, + bots.heartbeat_interval, + bots.heartbeat_prompt, chat_models.id AS chat_model_id, memory_models.id AS memory_model_id, embedding_models.id AS embedding_model_id, + heartbeat_models.id AS heartbeat_model_id, search_providers.id AS search_provider_id FROM bots LEFT JOIN models AS chat_models ON chat_models.id = bots.chat_model_id LEFT JOIN models AS memory_models ON memory_models.id = bots.memory_model_id LEFT JOIN models AS embedding_models ON embedding_models.id = bots.embedding_model_id +LEFT JOIN models AS heartbeat_models ON heartbeat_models.id = bots.heartbeat_model_id LEFT JOIN search_providers ON search_providers.id = bots.search_provider_id WHERE bots.id = $1; @@ -29,13 +34,17 @@ WITH updated AS ( allow_guest = sqlc.arg(allow_guest), reasoning_enabled = sqlc.arg(reasoning_enabled), reasoning_effort = sqlc.arg(reasoning_effort), + heartbeat_enabled = sqlc.arg(heartbeat_enabled), + heartbeat_interval = sqlc.arg(heartbeat_interval), + heartbeat_prompt = sqlc.arg(heartbeat_prompt), chat_model_id = COALESCE(sqlc.narg(chat_model_id)::uuid, bots.chat_model_id), memory_model_id = COALESCE(sqlc.narg(memory_model_id)::uuid, bots.memory_model_id), embedding_model_id = COALESCE(sqlc.narg(embedding_model_id)::uuid, bots.embedding_model_id), + heartbeat_model_id = COALESCE(sqlc.narg(heartbeat_model_id)::uuid, bots.heartbeat_model_id), search_provider_id = COALESCE(sqlc.narg(search_provider_id)::uuid, bots.search_provider_id), updated_at = now() WHERE bots.id = sqlc.arg(id) - RETURNING bots.id, bots.max_context_load_time, bots.max_context_tokens, bots.max_inbox_items, bots.language, bots.allow_guest, bots.reasoning_enabled, bots.reasoning_effort, bots.chat_model_id, bots.memory_model_id, bots.embedding_model_id, bots.search_provider_id + RETURNING bots.id, bots.max_context_load_time, bots.max_context_tokens, bots.max_inbox_items, bots.language, bots.allow_guest, bots.reasoning_enabled, bots.reasoning_effort, bots.heartbeat_enabled, bots.heartbeat_interval, bots.heartbeat_prompt, bots.chat_model_id, bots.memory_model_id, bots.embedding_model_id, bots.heartbeat_model_id, bots.search_provider_id ) SELECT updated.id AS bot_id, @@ -46,14 +55,19 @@ SELECT updated.allow_guest, updated.reasoning_enabled, updated.reasoning_effort, + updated.heartbeat_enabled, + updated.heartbeat_interval, + updated.heartbeat_prompt, chat_models.id AS chat_model_id, memory_models.id AS memory_model_id, embedding_models.id AS embedding_model_id, + heartbeat_models.id AS heartbeat_model_id, search_providers.id AS search_provider_id FROM updated LEFT JOIN models AS chat_models ON chat_models.id = updated.chat_model_id LEFT JOIN models AS memory_models ON memory_models.id = updated.memory_model_id LEFT JOIN models AS embedding_models ON embedding_models.id = updated.embedding_model_id +LEFT JOIN models AS heartbeat_models ON heartbeat_models.id = updated.heartbeat_model_id LEFT JOIN search_providers ON search_providers.id = updated.search_provider_id; -- name: DeleteSettingsByBotID :exec @@ -65,9 +79,13 @@ SET max_context_load_time = 1440, allow_guest = false, reasoning_enabled = false, reasoning_effort = 'medium', + heartbeat_enabled = false, + heartbeat_interval = 30, + heartbeat_prompt = '', chat_model_id = NULL, memory_model_id = NULL, embedding_model_id = NULL, + heartbeat_model_id = NULL, search_provider_id = NULL, updated_at = now() WHERE id = $1; diff --git a/internal/conversation/flow/heartbeat_gateway.go b/internal/conversation/flow/heartbeat_gateway.go new file mode 100644 index 00000000..cdaaec2d --- /dev/null +++ b/internal/conversation/flow/heartbeat_gateway.go @@ -0,0 +1,26 @@ +package flow + +import ( + "context" + "fmt" + + "github.com/memohai/memoh/internal/heartbeat" +) + +// HeartbeatGateway adapts heartbeat trigger calls to the chat Resolver. +type HeartbeatGateway struct { + resolver *Resolver +} + +// NewHeartbeatGateway creates a HeartbeatGateway backed by the given Resolver. +func NewHeartbeatGateway(resolver *Resolver) *HeartbeatGateway { + return &HeartbeatGateway{resolver: resolver} +} + +// TriggerHeartbeat delegates a heartbeat trigger to the chat Resolver. +func (g *HeartbeatGateway) TriggerHeartbeat(ctx context.Context, botID string, payload heartbeat.TriggerPayload, token string) (heartbeat.TriggerResult, error) { + if g == nil || g.resolver == nil { + return heartbeat.TriggerResult{}, fmt.Errorf("chat resolver not configured") + } + return g.resolver.TriggerHeartbeat(ctx, botID, payload, token) +} diff --git a/internal/conversation/flow/resolver.go b/internal/conversation/flow/resolver.go index af2b73d2..2bfbdd83 100644 --- a/internal/conversation/flow/resolver.go +++ b/internal/conversation/flow/resolver.go @@ -22,6 +22,7 @@ import ( "github.com/memohai/memoh/internal/conversation" "github.com/memohai/memoh/internal/db" "github.com/memohai/memoh/internal/db/sqlc" + "github.com/memohai/memoh/internal/heartbeat" "github.com/memohai/memoh/internal/inbox" "github.com/memohai/memoh/internal/memory" messagepkg "github.com/memohai/memoh/internal/message" @@ -196,6 +197,7 @@ type gatewayRequest struct { type gatewayResponse struct { Messages []conversation.ModelMessage `json:"messages"` Skills []string `json:"skills"` + Text string `json:"text,omitempty"` Usage json.RawMessage `json:"usage,omitempty"` Usages []json.RawMessage `json:"usages,omitempty"` } @@ -240,6 +242,35 @@ func (t triggerScheduleRequest) MarshalJSON() ([]byte, error) { return json.Marshal(m) } +// gatewayHeartbeat matches the agent gateway HeartbeatModel for /chat/trigger-heartbeat. +type gatewayHeartbeat struct { + Interval int `json:"interval"` +} + +// triggerHeartbeatRequest is the payload for POST /chat/trigger-heartbeat. +type triggerHeartbeatRequest struct { + gatewayRequest + Heartbeat gatewayHeartbeat `json:"heartbeat"` +} + +// MarshalJSON marshals the request without the "query" field for trigger-heartbeat. +func (t triggerHeartbeatRequest) MarshalJSON() ([]byte, error) { + type alias struct { + gatewayRequest + Heartbeat gatewayHeartbeat `json:"heartbeat"` + } + raw, err := json.Marshal(alias(t)) + if err != nil { + return nil, err + } + var m map[string]json.RawMessage + if err := json.Unmarshal(raw, &m); err != nil { + return nil, err + } + delete(m, "query") + return json.Marshal(m) +} + // --- resolved context (shared by Chat / StreamChat / TriggerSchedule) --- type resolvedContext struct { @@ -511,6 +542,75 @@ func (r *Resolver) TriggerSchedule(ctx context.Context, botID string, payload sc return r.storeRound(ctx, req, resp.Messages, resp.Usage, resp.Usages) } +// --- TriggerHeartbeat --- + +// TriggerHeartbeat executes a heartbeat check through the agent gateway trigger-heartbeat endpoint. +func (r *Resolver) TriggerHeartbeat(ctx context.Context, botID string, payload heartbeat.TriggerPayload, token string) (heartbeat.TriggerResult, error) { + if strings.TrimSpace(botID) == "" { + return heartbeat.TriggerResult{}, fmt.Errorf("bot id is required") + } + + // If a dedicated heartbeat model is configured, use it instead of the + // default chat model. We load the bot settings first so that we can + // set req.Model, which takes highest priority in selectChatModel. + var heartbeatModel string + if botSettings, err := r.loadBotSettings(ctx, botID); err == nil { + heartbeatModel = strings.TrimSpace(botSettings.HeartbeatModelID) + } + + req := conversation.ChatRequest{ + BotID: botID, + ChatID: botID, + Query: "heartbeat", + UserID: payload.OwnerUserID, + Token: token, + Model: heartbeatModel, + } + rc, err := r.resolve(ctx, req) + if err != nil { + return heartbeat.TriggerResult{}, err + } + + hbPayload := rc.payload + hbPayload.Identity.ChannelIdentityID = strings.TrimSpace(payload.OwnerUserID) + hbPayload.Identity.DisplayName = "Heartbeat" + + triggerReq := triggerHeartbeatRequest{ + gatewayRequest: hbPayload, + Heartbeat: gatewayHeartbeat{ + Interval: payload.Interval, + }, + } + + resp, err := r.postTriggerHeartbeat(ctx, triggerReq, token) + if err != nil { + return heartbeat.TriggerResult{}, err + } + + status := "alert" + text := strings.TrimSpace(resp.Text) + if isHeartbeatOK(text) { + status = "ok" + } + + var usageBytes []byte + if resp.Usage != nil { + usageBytes, _ = json.Marshal(resp.Usage) + } + + return heartbeat.TriggerResult{ + Status: status, + Text: text, + Usage: resp.Usage, + UsageBytes: usageBytes, + }, nil +} + +func isHeartbeatOK(text string) bool { + t := strings.TrimSpace(text) + return strings.HasPrefix(t, "HEARTBEAT_OK") || strings.HasSuffix(t, "HEARTBEAT_OK") || t == "HEARTBEAT_OK" +} + // --- StreamChat --- // StreamChat sends a streaming chat request to the agent gateway. @@ -642,6 +742,42 @@ func (r *Resolver) postTriggerSchedule(ctx context.Context, payload triggerSched return parsed, nil } +// postTriggerHeartbeat sends a trigger-heartbeat request to the agent gateway. +func (r *Resolver) postTriggerHeartbeat(ctx context.Context, payload triggerHeartbeatRequest, token string) (gatewayResponse, error) { + url := r.gatewayBaseURL + "/chat/trigger-heartbeat" + r.logger.Info("gateway trigger-heartbeat request", slog.String("url", url)) + + httpReq, err := newJSONRequestWithContext(ctx, http.MethodPost, url, payload) + if err != nil { + return gatewayResponse{}, err + } + if strings.TrimSpace(token) != "" { + httpReq.Header.Set("Authorization", token) + } + + resp, err := r.httpClient.Do(httpReq) + if err != nil { + return gatewayResponse{}, err + } + defer resp.Body.Close() + + respBody, err := io.ReadAll(resp.Body) + if err != nil { + return gatewayResponse{}, err + } + if resp.StatusCode < 200 || resp.StatusCode >= 300 { + r.logger.Error("gateway trigger-heartbeat error", slog.String("url", url), slog.Int("status", resp.StatusCode), slog.String("body_prefix", truncate(string(respBody), 300))) + return gatewayResponse{}, fmt.Errorf("agent gateway error: %s", strings.TrimSpace(string(respBody))) + } + + var parsed gatewayResponse + if err := json.Unmarshal(respBody, &parsed); err != nil { + r.logger.Error("gateway trigger-heartbeat response parse failed", slog.String("body_prefix", truncate(string(respBody), 300)), slog.Any("error", err)) + return gatewayResponse{}, fmt.Errorf("failed to parse gateway response: %w", err) + } + return parsed, nil +} + func (r *Resolver) streamChat(ctx context.Context, payload gatewayRequest, req conversation.ChatRequest, chunkCh chan<- conversation.StreamChunk) error { url := r.gatewayBaseURL + "/chat/stream" r.logger.Info( diff --git a/internal/db/sqlc/bots.sql.go b/internal/db/sqlc/bots.sql.go index 054a9453..5dd419ca 100644 --- a/internal/db/sqlc/bots.sql.go +++ b/internal/db/sqlc/bots.sql.go @@ -14,7 +14,7 @@ import ( const createBot = `-- name: CreateBot :one INSERT INTO bots (owner_user_id, type, display_name, avatar_url, is_active, metadata, status) VALUES ($1, $2, $3, $4, $5, $6, $7) -RETURNING id, owner_user_id, type, display_name, avatar_url, is_active, status, max_context_load_time, max_context_tokens, max_inbox_items, language, allow_guest, reasoning_enabled, reasoning_effort, chat_model_id, memory_model_id, embedding_model_id, search_provider_id, metadata, created_at, updated_at +RETURNING id, owner_user_id, type, display_name, avatar_url, is_active, status, max_context_load_time, max_context_tokens, max_inbox_items, language, allow_guest, reasoning_enabled, reasoning_effort, chat_model_id, memory_model_id, embedding_model_id, search_provider_id, heartbeat_enabled, heartbeat_interval, heartbeat_prompt, metadata, created_at, updated_at ` type CreateBotParams struct { @@ -46,6 +46,9 @@ type CreateBotRow struct { MemoryModelID pgtype.UUID `json:"memory_model_id"` EmbeddingModelID pgtype.UUID `json:"embedding_model_id"` SearchProviderID pgtype.UUID `json:"search_provider_id"` + HeartbeatEnabled bool `json:"heartbeat_enabled"` + HeartbeatInterval int32 `json:"heartbeat_interval"` + HeartbeatPrompt string `json:"heartbeat_prompt"` Metadata []byte `json:"metadata"` CreatedAt pgtype.Timestamptz `json:"created_at"` UpdatedAt pgtype.Timestamptz `json:"updated_at"` @@ -81,6 +84,9 @@ func (q *Queries) CreateBot(ctx context.Context, arg CreateBotParams) (CreateBot &i.MemoryModelID, &i.EmbeddingModelID, &i.SearchProviderID, + &i.HeartbeatEnabled, + &i.HeartbeatInterval, + &i.HeartbeatPrompt, &i.Metadata, &i.CreatedAt, &i.UpdatedAt, @@ -112,7 +118,7 @@ func (q *Queries) DeleteBotMember(ctx context.Context, arg DeleteBotMemberParams } const getBotByID = `-- name: GetBotByID :one -SELECT id, owner_user_id, type, display_name, avatar_url, is_active, status, max_context_load_time, max_context_tokens, max_inbox_items, language, allow_guest, reasoning_enabled, reasoning_effort, chat_model_id, memory_model_id, embedding_model_id, search_provider_id, metadata, created_at, updated_at +SELECT id, owner_user_id, type, display_name, avatar_url, is_active, status, max_context_load_time, max_context_tokens, max_inbox_items, language, allow_guest, reasoning_enabled, reasoning_effort, chat_model_id, memory_model_id, embedding_model_id, search_provider_id, heartbeat_enabled, heartbeat_interval, heartbeat_prompt, metadata, created_at, updated_at FROM bots WHERE id = $1 ` @@ -136,6 +142,9 @@ type GetBotByIDRow struct { MemoryModelID pgtype.UUID `json:"memory_model_id"` EmbeddingModelID pgtype.UUID `json:"embedding_model_id"` SearchProviderID pgtype.UUID `json:"search_provider_id"` + HeartbeatEnabled bool `json:"heartbeat_enabled"` + HeartbeatInterval int32 `json:"heartbeat_interval"` + HeartbeatPrompt string `json:"heartbeat_prompt"` Metadata []byte `json:"metadata"` CreatedAt pgtype.Timestamptz `json:"created_at"` UpdatedAt pgtype.Timestamptz `json:"updated_at"` @@ -163,6 +172,9 @@ func (q *Queries) GetBotByID(ctx context.Context, id pgtype.UUID) (GetBotByIDRow &i.MemoryModelID, &i.EmbeddingModelID, &i.SearchProviderID, + &i.HeartbeatEnabled, + &i.HeartbeatInterval, + &i.HeartbeatPrompt, &i.Metadata, &i.CreatedAt, &i.UpdatedAt, @@ -227,7 +239,7 @@ func (q *Queries) ListBotMembers(ctx context.Context, botID pgtype.UUID) ([]BotM } const listBotsByMember = `-- name: ListBotsByMember :many -SELECT b.id, b.owner_user_id, b.type, b.display_name, b.avatar_url, b.is_active, b.status, b.max_context_load_time, b.max_context_tokens, b.max_inbox_items, b.language, b.allow_guest, b.reasoning_enabled, b.reasoning_effort, b.chat_model_id, b.memory_model_id, b.embedding_model_id, b.search_provider_id, b.metadata, b.created_at, b.updated_at +SELECT b.id, b.owner_user_id, b.type, b.display_name, b.avatar_url, b.is_active, b.status, b.max_context_load_time, b.max_context_tokens, b.max_inbox_items, b.language, b.allow_guest, b.reasoning_enabled, b.reasoning_effort, b.chat_model_id, b.memory_model_id, b.embedding_model_id, b.search_provider_id, b.heartbeat_enabled, b.heartbeat_interval, b.heartbeat_prompt, b.metadata, b.created_at, b.updated_at FROM bots b JOIN bot_members m ON m.bot_id = b.id WHERE m.user_id = $1 @@ -253,6 +265,9 @@ type ListBotsByMemberRow struct { MemoryModelID pgtype.UUID `json:"memory_model_id"` EmbeddingModelID pgtype.UUID `json:"embedding_model_id"` SearchProviderID pgtype.UUID `json:"search_provider_id"` + HeartbeatEnabled bool `json:"heartbeat_enabled"` + HeartbeatInterval int32 `json:"heartbeat_interval"` + HeartbeatPrompt string `json:"heartbeat_prompt"` Metadata []byte `json:"metadata"` CreatedAt pgtype.Timestamptz `json:"created_at"` UpdatedAt pgtype.Timestamptz `json:"updated_at"` @@ -286,6 +301,9 @@ func (q *Queries) ListBotsByMember(ctx context.Context, userID pgtype.UUID) ([]L &i.MemoryModelID, &i.EmbeddingModelID, &i.SearchProviderID, + &i.HeartbeatEnabled, + &i.HeartbeatInterval, + &i.HeartbeatPrompt, &i.Metadata, &i.CreatedAt, &i.UpdatedAt, @@ -301,7 +319,7 @@ func (q *Queries) ListBotsByMember(ctx context.Context, userID pgtype.UUID) ([]L } const listBotsByOwner = `-- name: ListBotsByOwner :many -SELECT id, owner_user_id, type, display_name, avatar_url, is_active, status, max_context_load_time, max_context_tokens, max_inbox_items, language, allow_guest, reasoning_enabled, reasoning_effort, chat_model_id, memory_model_id, embedding_model_id, search_provider_id, metadata, created_at, updated_at +SELECT id, owner_user_id, type, display_name, avatar_url, is_active, status, max_context_load_time, max_context_tokens, max_inbox_items, language, allow_guest, reasoning_enabled, reasoning_effort, chat_model_id, memory_model_id, embedding_model_id, search_provider_id, heartbeat_enabled, heartbeat_interval, heartbeat_prompt, metadata, created_at, updated_at FROM bots WHERE owner_user_id = $1 ORDER BY created_at DESC @@ -326,6 +344,9 @@ type ListBotsByOwnerRow struct { MemoryModelID pgtype.UUID `json:"memory_model_id"` EmbeddingModelID pgtype.UUID `json:"embedding_model_id"` SearchProviderID pgtype.UUID `json:"search_provider_id"` + HeartbeatEnabled bool `json:"heartbeat_enabled"` + HeartbeatInterval int32 `json:"heartbeat_interval"` + HeartbeatPrompt string `json:"heartbeat_prompt"` Metadata []byte `json:"metadata"` CreatedAt pgtype.Timestamptz `json:"created_at"` UpdatedAt pgtype.Timestamptz `json:"updated_at"` @@ -359,6 +380,9 @@ func (q *Queries) ListBotsByOwner(ctx context.Context, ownerUserID pgtype.UUID) &i.MemoryModelID, &i.EmbeddingModelID, &i.SearchProviderID, + &i.HeartbeatEnabled, + &i.HeartbeatInterval, + &i.HeartbeatPrompt, &i.Metadata, &i.CreatedAt, &i.UpdatedAt, @@ -373,12 +397,52 @@ func (q *Queries) ListBotsByOwner(ctx context.Context, ownerUserID pgtype.UUID) return items, nil } +const listHeartbeatEnabledBots = `-- name: ListHeartbeatEnabledBots :many +SELECT id, owner_user_id, heartbeat_enabled, heartbeat_interval, heartbeat_prompt +FROM bots +WHERE heartbeat_enabled = true AND status = 'ready' +` + +type ListHeartbeatEnabledBotsRow struct { + ID pgtype.UUID `json:"id"` + OwnerUserID pgtype.UUID `json:"owner_user_id"` + HeartbeatEnabled bool `json:"heartbeat_enabled"` + HeartbeatInterval int32 `json:"heartbeat_interval"` + HeartbeatPrompt string `json:"heartbeat_prompt"` +} + +func (q *Queries) ListHeartbeatEnabledBots(ctx context.Context) ([]ListHeartbeatEnabledBotsRow, error) { + rows, err := q.db.Query(ctx, listHeartbeatEnabledBots) + if err != nil { + return nil, err + } + defer rows.Close() + var items []ListHeartbeatEnabledBotsRow + for rows.Next() { + var i ListHeartbeatEnabledBotsRow + if err := rows.Scan( + &i.ID, + &i.OwnerUserID, + &i.HeartbeatEnabled, + &i.HeartbeatInterval, + &i.HeartbeatPrompt, + ); err != nil { + return nil, err + } + items = append(items, i) + } + if err := rows.Err(); err != nil { + return nil, err + } + return items, nil +} + const updateBotOwner = `-- name: UpdateBotOwner :one UPDATE bots SET owner_user_id = $2, updated_at = now() WHERE id = $1 -RETURNING id, owner_user_id, type, display_name, avatar_url, is_active, status, max_context_load_time, max_context_tokens, max_inbox_items, language, allow_guest, reasoning_enabled, reasoning_effort, chat_model_id, memory_model_id, embedding_model_id, search_provider_id, metadata, created_at, updated_at +RETURNING id, owner_user_id, type, display_name, avatar_url, is_active, status, max_context_load_time, max_context_tokens, max_inbox_items, language, allow_guest, reasoning_enabled, reasoning_effort, chat_model_id, memory_model_id, embedding_model_id, search_provider_id, heartbeat_enabled, heartbeat_interval, heartbeat_prompt, metadata, created_at, updated_at ` type UpdateBotOwnerParams struct { @@ -405,6 +469,9 @@ type UpdateBotOwnerRow struct { MemoryModelID pgtype.UUID `json:"memory_model_id"` EmbeddingModelID pgtype.UUID `json:"embedding_model_id"` SearchProviderID pgtype.UUID `json:"search_provider_id"` + HeartbeatEnabled bool `json:"heartbeat_enabled"` + HeartbeatInterval int32 `json:"heartbeat_interval"` + HeartbeatPrompt string `json:"heartbeat_prompt"` Metadata []byte `json:"metadata"` CreatedAt pgtype.Timestamptz `json:"created_at"` UpdatedAt pgtype.Timestamptz `json:"updated_at"` @@ -432,6 +499,9 @@ func (q *Queries) UpdateBotOwner(ctx context.Context, arg UpdateBotOwnerParams) &i.MemoryModelID, &i.EmbeddingModelID, &i.SearchProviderID, + &i.HeartbeatEnabled, + &i.HeartbeatInterval, + &i.HeartbeatPrompt, &i.Metadata, &i.CreatedAt, &i.UpdatedAt, @@ -447,7 +517,7 @@ SET display_name = $2, metadata = $5, updated_at = now() WHERE id = $1 -RETURNING id, owner_user_id, type, display_name, avatar_url, is_active, status, max_context_load_time, max_context_tokens, max_inbox_items, language, allow_guest, reasoning_enabled, reasoning_effort, chat_model_id, memory_model_id, embedding_model_id, search_provider_id, metadata, created_at, updated_at +RETURNING id, owner_user_id, type, display_name, avatar_url, is_active, status, max_context_load_time, max_context_tokens, max_inbox_items, language, allow_guest, reasoning_enabled, reasoning_effort, chat_model_id, memory_model_id, embedding_model_id, search_provider_id, heartbeat_enabled, heartbeat_interval, heartbeat_prompt, metadata, created_at, updated_at ` type UpdateBotProfileParams struct { @@ -477,6 +547,9 @@ type UpdateBotProfileRow struct { MemoryModelID pgtype.UUID `json:"memory_model_id"` EmbeddingModelID pgtype.UUID `json:"embedding_model_id"` SearchProviderID pgtype.UUID `json:"search_provider_id"` + HeartbeatEnabled bool `json:"heartbeat_enabled"` + HeartbeatInterval int32 `json:"heartbeat_interval"` + HeartbeatPrompt string `json:"heartbeat_prompt"` Metadata []byte `json:"metadata"` CreatedAt pgtype.Timestamptz `json:"created_at"` UpdatedAt pgtype.Timestamptz `json:"updated_at"` @@ -510,6 +583,9 @@ func (q *Queries) UpdateBotProfile(ctx context.Context, arg UpdateBotProfilePara &i.MemoryModelID, &i.EmbeddingModelID, &i.SearchProviderID, + &i.HeartbeatEnabled, + &i.HeartbeatInterval, + &i.HeartbeatPrompt, &i.Metadata, &i.CreatedAt, &i.UpdatedAt, diff --git a/internal/db/sqlc/conversations.sql.go b/internal/db/sqlc/conversations.sql.go index fe9da6ab..4b4e40b6 100644 --- a/internal/db/sqlc/conversations.sql.go +++ b/internal/db/sqlc/conversations.sql.go @@ -590,7 +590,7 @@ WITH updated AS ( SET display_name = $1, updated_at = now() WHERE bots.id = $2 - RETURNING id, owner_user_id, type, display_name, avatar_url, is_active, status, max_context_load_time, max_context_tokens, language, allow_guest, reasoning_enabled, reasoning_effort, max_inbox_items, chat_model_id, memory_model_id, embedding_model_id, search_provider_id, metadata, created_at, updated_at + RETURNING id, owner_user_id, type, display_name, avatar_url, is_active, status, max_context_load_time, max_context_tokens, language, allow_guest, reasoning_enabled, reasoning_effort, max_inbox_items, chat_model_id, memory_model_id, embedding_model_id, search_provider_id, heartbeat_enabled, heartbeat_interval, heartbeat_prompt, heartbeat_model_id, metadata, created_at, updated_at ) SELECT updated.id AS id, diff --git a/internal/db/sqlc/heartbeat_logs.sql.go b/internal/db/sqlc/heartbeat_logs.sql.go new file mode 100644 index 00000000..82d56206 --- /dev/null +++ b/internal/db/sqlc/heartbeat_logs.sql.go @@ -0,0 +1,128 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.30.0 +// source: heartbeat_logs.sql + +package sqlc + +import ( + "context" + + "github.com/jackc/pgx/v5/pgtype" +) + +const completeHeartbeatLog = `-- name: CompleteHeartbeatLog :one +UPDATE bot_heartbeat_logs +SET status = $2, + result_text = $3, + error_message = $4, + usage = $5, + completed_at = now() +WHERE id = $1 +RETURNING id, bot_id, status, result_text, error_message, usage, started_at, completed_at +` + +type CompleteHeartbeatLogParams struct { + ID pgtype.UUID `json:"id"` + Status string `json:"status"` + ResultText string `json:"result_text"` + ErrorMessage string `json:"error_message"` + Usage []byte `json:"usage"` +} + +func (q *Queries) CompleteHeartbeatLog(ctx context.Context, arg CompleteHeartbeatLogParams) (BotHeartbeatLog, error) { + row := q.db.QueryRow(ctx, completeHeartbeatLog, + arg.ID, + arg.Status, + arg.ResultText, + arg.ErrorMessage, + arg.Usage, + ) + var i BotHeartbeatLog + err := row.Scan( + &i.ID, + &i.BotID, + &i.Status, + &i.ResultText, + &i.ErrorMessage, + &i.Usage, + &i.StartedAt, + &i.CompletedAt, + ) + return i, err +} + +const createHeartbeatLog = `-- name: CreateHeartbeatLog :one +INSERT INTO bot_heartbeat_logs (bot_id, started_at) +VALUES ($1, now()) +RETURNING id, bot_id, status, result_text, error_message, usage, started_at, completed_at +` + +func (q *Queries) CreateHeartbeatLog(ctx context.Context, botID pgtype.UUID) (BotHeartbeatLog, error) { + row := q.db.QueryRow(ctx, createHeartbeatLog, botID) + var i BotHeartbeatLog + err := row.Scan( + &i.ID, + &i.BotID, + &i.Status, + &i.ResultText, + &i.ErrorMessage, + &i.Usage, + &i.StartedAt, + &i.CompletedAt, + ) + return i, err +} + +const deleteHeartbeatLogsByBot = `-- name: DeleteHeartbeatLogsByBot :exec +DELETE FROM bot_heartbeat_logs WHERE bot_id = $1 +` + +func (q *Queries) DeleteHeartbeatLogsByBot(ctx context.Context, botID pgtype.UUID) error { + _, err := q.db.Exec(ctx, deleteHeartbeatLogsByBot, botID) + return err +} + +const listHeartbeatLogsByBot = `-- name: ListHeartbeatLogsByBot :many +SELECT id, bot_id, status, result_text, error_message, usage, started_at, completed_at +FROM bot_heartbeat_logs +WHERE bot_id = $1 + AND ($2::timestamptz IS NULL OR started_at < $2::timestamptz) +ORDER BY started_at DESC +LIMIT $3 +` + +type ListHeartbeatLogsByBotParams struct { + BotID pgtype.UUID `json:"bot_id"` + Column2 pgtype.Timestamptz `json:"column_2"` + Limit int32 `json:"limit"` +} + +func (q *Queries) ListHeartbeatLogsByBot(ctx context.Context, arg ListHeartbeatLogsByBotParams) ([]BotHeartbeatLog, error) { + rows, err := q.db.Query(ctx, listHeartbeatLogsByBot, arg.BotID, arg.Column2, arg.Limit) + if err != nil { + return nil, err + } + defer rows.Close() + var items []BotHeartbeatLog + for rows.Next() { + var i BotHeartbeatLog + if err := rows.Scan( + &i.ID, + &i.BotID, + &i.Status, + &i.ResultText, + &i.ErrorMessage, + &i.Usage, + &i.StartedAt, + &i.CompletedAt, + ); err != nil { + return nil, err + } + items = append(items, i) + } + if err := rows.Err(); err != nil { + return nil, err + } + return items, nil +} diff --git a/internal/db/sqlc/models.go b/internal/db/sqlc/models.go index af356ef1..c9a7d3fe 100644 --- a/internal/db/sqlc/models.go +++ b/internal/db/sqlc/models.go @@ -27,6 +27,10 @@ type Bot struct { MemoryModelID pgtype.UUID `json:"memory_model_id"` EmbeddingModelID pgtype.UUID `json:"embedding_model_id"` SearchProviderID pgtype.UUID `json:"search_provider_id"` + HeartbeatEnabled bool `json:"heartbeat_enabled"` + HeartbeatInterval int32 `json:"heartbeat_interval"` + HeartbeatPrompt string `json:"heartbeat_prompt"` + HeartbeatModelID pgtype.UUID `json:"heartbeat_model_id"` Metadata []byte `json:"metadata"` CreatedAt pgtype.Timestamptz `json:"created_at"` UpdatedAt pgtype.Timestamptz `json:"updated_at"` @@ -61,6 +65,17 @@ type BotChannelRoute struct { UpdatedAt pgtype.Timestamptz `json:"updated_at"` } +type BotHeartbeatLog struct { + ID pgtype.UUID `json:"id"` + BotID pgtype.UUID `json:"bot_id"` + Status string `json:"status"` + ResultText string `json:"result_text"` + ErrorMessage string `json:"error_message"` + Usage []byte `json:"usage"` + StartedAt pgtype.Timestamptz `json:"started_at"` + CompletedAt pgtype.Timestamptz `json:"completed_at"` +} + type BotHistoryMessage struct { ID pgtype.UUID `json:"id"` BotID pgtype.UUID `json:"bot_id"` diff --git a/internal/db/sqlc/settings.sql.go b/internal/db/sqlc/settings.sql.go index 8a2cd317..b62d34be 100644 --- a/internal/db/sqlc/settings.sql.go +++ b/internal/db/sqlc/settings.sql.go @@ -20,9 +20,13 @@ SET max_context_load_time = 1440, allow_guest = false, reasoning_enabled = false, reasoning_effort = 'medium', + heartbeat_enabled = false, + heartbeat_interval = 30, + heartbeat_prompt = '', chat_model_id = NULL, memory_model_id = NULL, embedding_model_id = NULL, + heartbeat_model_id = NULL, search_provider_id = NULL, updated_at = now() WHERE id = $1 @@ -43,14 +47,19 @@ SELECT bots.allow_guest, bots.reasoning_enabled, bots.reasoning_effort, + bots.heartbeat_enabled, + bots.heartbeat_interval, + bots.heartbeat_prompt, chat_models.id AS chat_model_id, memory_models.id AS memory_model_id, embedding_models.id AS embedding_model_id, + heartbeat_models.id AS heartbeat_model_id, search_providers.id AS search_provider_id FROM bots LEFT JOIN models AS chat_models ON chat_models.id = bots.chat_model_id LEFT JOIN models AS memory_models ON memory_models.id = bots.memory_model_id LEFT JOIN models AS embedding_models ON embedding_models.id = bots.embedding_model_id +LEFT JOIN models AS heartbeat_models ON heartbeat_models.id = bots.heartbeat_model_id LEFT JOIN search_providers ON search_providers.id = bots.search_provider_id WHERE bots.id = $1 ` @@ -64,9 +73,13 @@ type GetSettingsByBotIDRow struct { AllowGuest bool `json:"allow_guest"` ReasoningEnabled bool `json:"reasoning_enabled"` ReasoningEffort string `json:"reasoning_effort"` + HeartbeatEnabled bool `json:"heartbeat_enabled"` + HeartbeatInterval int32 `json:"heartbeat_interval"` + HeartbeatPrompt string `json:"heartbeat_prompt"` ChatModelID pgtype.UUID `json:"chat_model_id"` MemoryModelID pgtype.UUID `json:"memory_model_id"` EmbeddingModelID pgtype.UUID `json:"embedding_model_id"` + HeartbeatModelID pgtype.UUID `json:"heartbeat_model_id"` SearchProviderID pgtype.UUID `json:"search_provider_id"` } @@ -82,9 +95,13 @@ func (q *Queries) GetSettingsByBotID(ctx context.Context, id pgtype.UUID) (GetSe &i.AllowGuest, &i.ReasoningEnabled, &i.ReasoningEffort, + &i.HeartbeatEnabled, + &i.HeartbeatInterval, + &i.HeartbeatPrompt, &i.ChatModelID, &i.MemoryModelID, &i.EmbeddingModelID, + &i.HeartbeatModelID, &i.SearchProviderID, ) return i, err @@ -100,13 +117,17 @@ WITH updated AS ( allow_guest = $5, reasoning_enabled = $6, reasoning_effort = $7, - chat_model_id = COALESCE($8::uuid, bots.chat_model_id), - memory_model_id = COALESCE($9::uuid, bots.memory_model_id), - embedding_model_id = COALESCE($10::uuid, bots.embedding_model_id), - search_provider_id = COALESCE($11::uuid, bots.search_provider_id), + heartbeat_enabled = $8, + heartbeat_interval = $9, + heartbeat_prompt = $10, + chat_model_id = COALESCE($11::uuid, bots.chat_model_id), + memory_model_id = COALESCE($12::uuid, bots.memory_model_id), + embedding_model_id = COALESCE($13::uuid, bots.embedding_model_id), + heartbeat_model_id = COALESCE($14::uuid, bots.heartbeat_model_id), + search_provider_id = COALESCE($15::uuid, bots.search_provider_id), updated_at = now() - WHERE bots.id = $12 - RETURNING bots.id, bots.max_context_load_time, bots.max_context_tokens, bots.max_inbox_items, bots.language, bots.allow_guest, bots.reasoning_enabled, bots.reasoning_effort, bots.chat_model_id, bots.memory_model_id, bots.embedding_model_id, bots.search_provider_id + WHERE bots.id = $16 + RETURNING bots.id, bots.max_context_load_time, bots.max_context_tokens, bots.max_inbox_items, bots.language, bots.allow_guest, bots.reasoning_enabled, bots.reasoning_effort, bots.heartbeat_enabled, bots.heartbeat_interval, bots.heartbeat_prompt, bots.chat_model_id, bots.memory_model_id, bots.embedding_model_id, bots.heartbeat_model_id, bots.search_provider_id ) SELECT updated.id AS bot_id, @@ -117,14 +138,19 @@ SELECT updated.allow_guest, updated.reasoning_enabled, updated.reasoning_effort, + updated.heartbeat_enabled, + updated.heartbeat_interval, + updated.heartbeat_prompt, chat_models.id AS chat_model_id, memory_models.id AS memory_model_id, embedding_models.id AS embedding_model_id, + heartbeat_models.id AS heartbeat_model_id, search_providers.id AS search_provider_id FROM updated LEFT JOIN models AS chat_models ON chat_models.id = updated.chat_model_id LEFT JOIN models AS memory_models ON memory_models.id = updated.memory_model_id LEFT JOIN models AS embedding_models ON embedding_models.id = updated.embedding_model_id +LEFT JOIN models AS heartbeat_models ON heartbeat_models.id = updated.heartbeat_model_id LEFT JOIN search_providers ON search_providers.id = updated.search_provider_id ` @@ -136,9 +162,13 @@ type UpsertBotSettingsParams struct { AllowGuest bool `json:"allow_guest"` ReasoningEnabled bool `json:"reasoning_enabled"` ReasoningEffort string `json:"reasoning_effort"` + HeartbeatEnabled bool `json:"heartbeat_enabled"` + HeartbeatInterval int32 `json:"heartbeat_interval"` + HeartbeatPrompt string `json:"heartbeat_prompt"` ChatModelID pgtype.UUID `json:"chat_model_id"` MemoryModelID pgtype.UUID `json:"memory_model_id"` EmbeddingModelID pgtype.UUID `json:"embedding_model_id"` + HeartbeatModelID pgtype.UUID `json:"heartbeat_model_id"` SearchProviderID pgtype.UUID `json:"search_provider_id"` ID pgtype.UUID `json:"id"` } @@ -152,9 +182,13 @@ type UpsertBotSettingsRow struct { AllowGuest bool `json:"allow_guest"` ReasoningEnabled bool `json:"reasoning_enabled"` ReasoningEffort string `json:"reasoning_effort"` + HeartbeatEnabled bool `json:"heartbeat_enabled"` + HeartbeatInterval int32 `json:"heartbeat_interval"` + HeartbeatPrompt string `json:"heartbeat_prompt"` ChatModelID pgtype.UUID `json:"chat_model_id"` MemoryModelID pgtype.UUID `json:"memory_model_id"` EmbeddingModelID pgtype.UUID `json:"embedding_model_id"` + HeartbeatModelID pgtype.UUID `json:"heartbeat_model_id"` SearchProviderID pgtype.UUID `json:"search_provider_id"` } @@ -167,9 +201,13 @@ func (q *Queries) UpsertBotSettings(ctx context.Context, arg UpsertBotSettingsPa arg.AllowGuest, arg.ReasoningEnabled, arg.ReasoningEffort, + arg.HeartbeatEnabled, + arg.HeartbeatInterval, + arg.HeartbeatPrompt, arg.ChatModelID, arg.MemoryModelID, arg.EmbeddingModelID, + arg.HeartbeatModelID, arg.SearchProviderID, arg.ID, ) @@ -183,9 +221,13 @@ func (q *Queries) UpsertBotSettings(ctx context.Context, arg UpsertBotSettingsPa &i.AllowGuest, &i.ReasoningEnabled, &i.ReasoningEffort, + &i.HeartbeatEnabled, + &i.HeartbeatInterval, + &i.HeartbeatPrompt, &i.ChatModelID, &i.MemoryModelID, &i.EmbeddingModelID, + &i.HeartbeatModelID, &i.SearchProviderID, ) return i, err diff --git a/internal/handlers/heartbeat.go b/internal/handlers/heartbeat.go new file mode 100644 index 00000000..0557676c --- /dev/null +++ b/internal/handlers/heartbeat.go @@ -0,0 +1,119 @@ +package handlers + +import ( + "context" + "log/slog" + "net/http" + "strconv" + "strings" + "time" + + "github.com/labstack/echo/v4" + + "github.com/memohai/memoh/internal/accounts" + "github.com/memohai/memoh/internal/bots" + "github.com/memohai/memoh/internal/heartbeat" +) + +type HeartbeatHandler struct { + service *heartbeat.Service + botService *bots.Service + accountService *accounts.Service + logger *slog.Logger +} + +func NewHeartbeatHandler(log *slog.Logger, service *heartbeat.Service, botService *bots.Service, accountService *accounts.Service) *HeartbeatHandler { + return &HeartbeatHandler{ + service: service, + botService: botService, + accountService: accountService, + logger: log.With(slog.String("handler", "heartbeat")), + } +} + +func (h *HeartbeatHandler) Register(e *echo.Echo) { + group := e.Group("/bots/:bot_id/heartbeat") + group.GET("/logs", h.ListLogs) + group.DELETE("/logs", h.DeleteLogs) +} + +// ListLogs godoc +// @Summary List heartbeat logs +// @Description List heartbeat execution logs for a bot +// @Tags heartbeat +// @Param bot_id path string true "Bot ID" +// @Param before query string false "Before timestamp (RFC3339)" +// @Param limit query int false "Limit" default(50) +// @Success 200 {object} heartbeat.ListLogsResponse +// @Failure 400 {object} ErrorResponse +// @Failure 500 {object} ErrorResponse +// @Router /bots/{bot_id}/heartbeat/logs [get] +func (h *HeartbeatHandler) ListLogs(c echo.Context) error { + userID, err := h.requireUserID(c) + if err != nil { + return err + } + botID := strings.TrimSpace(c.Param("bot_id")) + if botID == "" { + return echo.NewHTTPError(http.StatusBadRequest, "bot id is required") + } + if _, err := h.authorizeBotAccess(c.Request().Context(), userID, botID); err != nil { + return err + } + + var before *time.Time + if raw := strings.TrimSpace(c.QueryParam("before")); raw != "" { + t, err := time.Parse(time.RFC3339Nano, raw) + if err != nil { + return echo.NewHTTPError(http.StatusBadRequest, "invalid before timestamp") + } + before = &t + } + limit := 50 + if raw := strings.TrimSpace(c.QueryParam("limit")); raw != "" { + if v, err := strconv.Atoi(raw); err == nil && v > 0 { + limit = v + } + } + + items, err := h.service.ListLogs(c.Request().Context(), botID, before, limit) + if err != nil { + return echo.NewHTTPError(http.StatusInternalServerError, err.Error()) + } + return c.JSON(http.StatusOK, heartbeat.ListLogsResponse{Items: items}) +} + +// DeleteLogs godoc +// @Summary Delete heartbeat logs +// @Description Delete all heartbeat execution logs for a bot +// @Tags heartbeat +// @Param bot_id path string true "Bot ID" +// @Success 204 "No Content" +// @Failure 400 {object} ErrorResponse +// @Failure 500 {object} ErrorResponse +// @Router /bots/{bot_id}/heartbeat/logs [delete] +func (h *HeartbeatHandler) DeleteLogs(c echo.Context) error { + userID, err := h.requireUserID(c) + if err != nil { + return err + } + botID := strings.TrimSpace(c.Param("bot_id")) + if botID == "" { + return echo.NewHTTPError(http.StatusBadRequest, "bot id is required") + } + if _, err := h.authorizeBotAccess(c.Request().Context(), userID, botID); err != nil { + return err + } + if err := h.service.DeleteLogs(c.Request().Context(), botID); err != nil { + return echo.NewHTTPError(http.StatusInternalServerError, err.Error()) + } + return c.NoContent(http.StatusNoContent) +} + +func (h *HeartbeatHandler) requireUserID(c echo.Context) (string, error) { + return RequireChannelIdentityID(c) +} + +func (h *HeartbeatHandler) authorizeBotAccess(ctx context.Context, userID, botID string) (bots.Bot, error) { + return AuthorizeBotAccess(ctx, h.botService, h.accountService, userID, botID, bots.AccessPolicy{AllowPublicMember: false}) +} diff --git a/internal/handlers/settings.go b/internal/handlers/settings.go index 172c5b08..717f417e 100644 --- a/internal/handlers/settings.go +++ b/internal/handlers/settings.go @@ -11,22 +11,25 @@ import ( "github.com/memohai/memoh/internal/accounts" "github.com/memohai/memoh/internal/bots" + "github.com/memohai/memoh/internal/heartbeat" "github.com/memohai/memoh/internal/settings" ) type SettingsHandler struct { - service *settings.Service - botService *bots.Service - accountService *accounts.Service - logger *slog.Logger + service *settings.Service + botService *bots.Service + accountService *accounts.Service + heartbeatService *heartbeat.Service + logger *slog.Logger } -func NewSettingsHandler(log *slog.Logger, service *settings.Service, botService *bots.Service, accountService *accounts.Service) *SettingsHandler { +func NewSettingsHandler(log *slog.Logger, service *settings.Service, botService *bots.Service, accountService *accounts.Service, heartbeatService *heartbeat.Service) *SettingsHandler { return &SettingsHandler{ - service: service, - botService: botService, - accountService: accountService, - logger: log.With(slog.String("handler", "settings")), + service: service, + botService: botService, + accountService: accountService, + heartbeatService: heartbeatService, + logger: log.With(slog.String("handler", "settings")), } } @@ -104,6 +107,13 @@ func (h *SettingsHandler) Upsert(c echo.Context) error { } return echo.NewHTTPError(http.StatusInternalServerError, err.Error()) } + + if req.HeartbeatEnabled != nil || req.HeartbeatInterval != nil { + if err := h.heartbeatService.Reschedule(c.Request().Context(), botID); err != nil { + h.logger.Error("failed to reschedule heartbeat", slog.String("bot_id", botID), slog.Any("error", err)) + } + } + return c.JSON(http.StatusOK, resp) } diff --git a/internal/heartbeat/service.go b/internal/heartbeat/service.go new file mode 100644 index 00000000..38dcb1d5 --- /dev/null +++ b/internal/heartbeat/service.go @@ -0,0 +1,247 @@ +package heartbeat + +import ( + "context" + "encoding/json" + "fmt" + "log/slog" + "strings" + "sync" + "time" + + "github.com/jackc/pgx/v5/pgtype" + "github.com/robfig/cron/v3" + + "github.com/memohai/memoh/internal/auth" + "github.com/memohai/memoh/internal/boot" + "github.com/memohai/memoh/internal/db" + "github.com/memohai/memoh/internal/db/sqlc" +) + +const heartbeatTokenTTL = 10 * time.Minute + +type Service struct { + queries *sqlc.Queries + cron *cron.Cron + triggerer Triggerer + jwtSecret string + logger *slog.Logger + mu sync.Mutex + jobs map[string]cron.EntryID +} + +func NewService(log *slog.Logger, queries *sqlc.Queries, triggerer Triggerer, runtimeConfig *boot.RuntimeConfig) *Service { + c := cron.New() + service := &Service{ + queries: queries, + cron: c, + triggerer: triggerer, + jwtSecret: runtimeConfig.JwtSecret, + logger: log.With(slog.String("service", "heartbeat")), + jobs: map[string]cron.EntryID{}, + } + c.Start() + return service +} + +func (s *Service) Bootstrap(ctx context.Context) error { + if s.queries == nil { + return fmt.Errorf("heartbeat queries not configured") + } + rows, err := s.queries.ListHeartbeatEnabledBots(ctx) + if err != nil { + return err + } + for _, row := range rows { + botID := row.ID.String() + ownerUserID := row.OwnerUserID.String() + cfg := Config{ + BotID: botID, + OwnerUserID: ownerUserID, + Interval: int(row.HeartbeatInterval), + } + if err := s.scheduleJob(cfg); err != nil { + s.logger.Error("failed to schedule heartbeat", slog.String("bot_id", botID), slog.Any("error", err)) + } + } + s.logger.Info("heartbeat bootstrap complete", slog.Int("count", len(rows))) + return nil +} + +func (s *Service) Reschedule(ctx context.Context, botID string) error { + s.removeJob(botID) + + pgID, err := db.ParseUUID(botID) + if err != nil { + return err + } + bot, err := s.queries.GetBotByID(ctx, pgID) + if err != nil { + return fmt.Errorf("get bot: %w", err) + } + if !bot.HeartbeatEnabled || bot.Status != "ready" { + return nil + } + cfg := Config{ + BotID: botID, + OwnerUserID: bot.OwnerUserID.String(), + Interval: int(bot.HeartbeatInterval), + } + return s.scheduleJob(cfg) +} + +func (s *Service) Stop(botID string) { + s.removeJob(botID) +} + +func (s *Service) runHeartbeat(ctx context.Context, cfg Config) { + if s.triggerer == nil { + s.logger.Error("heartbeat triggerer not configured") + return + } + + pgBotID, err := db.ParseUUID(cfg.BotID) + if err != nil { + s.logger.Error("invalid bot id", slog.String("bot_id", cfg.BotID), slog.Any("error", err)) + return + } + + logRow, err := s.queries.CreateHeartbeatLog(ctx, pgBotID) + if err != nil { + s.logger.Error("create heartbeat log failed", slog.String("bot_id", cfg.BotID), slog.Any("error", err)) + return + } + + token, err := s.generateTriggerToken(cfg.OwnerUserID) + if err != nil { + s.completeLog(ctx, logRow.ID, "error", "", err.Error(), nil) + s.logger.Error("generate trigger token failed", slog.String("bot_id", cfg.BotID), slog.Any("error", err)) + return + } + + result, err := s.triggerer.TriggerHeartbeat(ctx, cfg.BotID, TriggerPayload{ + BotID: cfg.BotID, + Interval: cfg.Interval, + OwnerUserID: cfg.OwnerUserID, + }, token) + if err != nil { + s.completeLog(ctx, logRow.ID, "error", "", err.Error(), nil) + s.logger.Error("heartbeat trigger failed", slog.String("bot_id", cfg.BotID), slog.Any("error", err)) + return + } + + s.completeLog(ctx, logRow.ID, result.Status, result.Text, "", result.UsageBytes) + s.logger.Info("heartbeat completed", slog.String("bot_id", cfg.BotID), slog.String("status", result.Status)) +} + +func (s *Service) completeLog(ctx context.Context, logID pgtype.UUID, status, resultText, errorMessage string, usageBytes []byte) { + _, err := s.queries.CompleteHeartbeatLog(ctx, sqlc.CompleteHeartbeatLogParams{ + ID: logID, + Status: status, + ResultText: resultText, + ErrorMessage: errorMessage, + Usage: usageBytes, + }) + if err != nil { + s.logger.Error("complete heartbeat log failed", slog.Any("error", err)) + } +} + +func (s *Service) ListLogs(ctx context.Context, botID string, before *time.Time, limit int) ([]Log, error) { + pgBotID, err := db.ParseUUID(botID) + if err != nil { + return nil, err + } + if limit <= 0 || limit > 100 { + limit = 50 + } + beforeTS := pgtype.Timestamptz{} + if before != nil { + beforeTS = pgtype.Timestamptz{Time: *before, Valid: true} + } + rows, err := s.queries.ListHeartbeatLogsByBot(ctx, sqlc.ListHeartbeatLogsByBotParams{ + BotID: pgBotID, + Column2: beforeTS, + Limit: int32(limit), + }) + if err != nil { + return nil, err + } + items := make([]Log, 0, len(rows)) + for _, row := range rows { + items = append(items, toLog(row)) + } + return items, nil +} + +func (s *Service) DeleteLogs(ctx context.Context, botID string) error { + pgBotID, err := db.ParseUUID(botID) + if err != nil { + return err + } + return s.queries.DeleteHeartbeatLogsByBot(ctx, pgBotID) +} + +func (s *Service) generateTriggerToken(userID string) (string, error) { + if strings.TrimSpace(s.jwtSecret) == "" { + return "", fmt.Errorf("jwt secret not configured") + } + signed, _, err := auth.GenerateToken(userID, s.jwtSecret, heartbeatTokenTTL) + if err != nil { + return "", err + } + return "Bearer " + signed, nil +} + +func (s *Service) scheduleJob(cfg Config) error { + if cfg.Interval <= 0 { + cfg.Interval = 30 + } + spec := fmt.Sprintf("@every %dm", cfg.Interval) + job := func() { + s.runHeartbeat(context.Background(), cfg) + } + entryID, err := s.cron.AddFunc(spec, job) + if err != nil { + return fmt.Errorf("add heartbeat cron job: %w", err) + } + s.mu.Lock() + s.jobs[cfg.BotID] = entryID + s.mu.Unlock() + s.logger.Info("heartbeat scheduled", slog.String("bot_id", cfg.BotID), slog.Int("interval_minutes", cfg.Interval)) + return nil +} + +func (s *Service) removeJob(botID string) { + s.mu.Lock() + defer s.mu.Unlock() + entryID, ok := s.jobs[botID] + if ok { + s.cron.Remove(entryID) + delete(s.jobs, botID) + } +} + +func toLog(row sqlc.BotHeartbeatLog) Log { + l := Log{ + ID: row.ID.String(), + BotID: row.BotID.String(), + Status: row.Status, + ResultText: row.ResultText, + ErrorMessage: row.ErrorMessage, + } + if row.StartedAt.Valid { + l.StartedAt = row.StartedAt.Time + } + if row.CompletedAt.Valid { + t := row.CompletedAt.Time + l.CompletedAt = &t + } + if row.Usage != nil { + var usage any + if err := json.Unmarshal(row.Usage, &usage); err == nil { + l.Usage = usage + } + } + return l +} diff --git a/internal/heartbeat/trigger.go b/internal/heartbeat/trigger.go new file mode 100644 index 00000000..26ee425e --- /dev/null +++ b/internal/heartbeat/trigger.go @@ -0,0 +1,20 @@ +package heartbeat + +import "context" + +type TriggerPayload struct { + BotID string + Interval int + OwnerUserID string +} + +type TriggerResult struct { + Status string + Text string + Usage any + UsageBytes []byte +} + +type Triggerer interface { + TriggerHeartbeat(ctx context.Context, botID string, payload TriggerPayload, token string) (TriggerResult, error) +} diff --git a/internal/heartbeat/types.go b/internal/heartbeat/types.go new file mode 100644 index 00000000..f836e9f8 --- /dev/null +++ b/internal/heartbeat/types.go @@ -0,0 +1,24 @@ +package heartbeat + +import "time" + +type Config struct { + BotID string + OwnerUserID string + Interval int +} + +type Log struct { + ID string `json:"id"` + BotID string `json:"bot_id"` + Status string `json:"status"` + ResultText string `json:"result_text"` + ErrorMessage string `json:"error_message"` + Usage any `json:"usage,omitempty"` + StartedAt time.Time `json:"started_at"` + CompletedAt *time.Time `json:"completed_at,omitempty"` +} + +type ListLogsResponse struct { + Items []Log `json:"items"` +} diff --git a/internal/settings/service.go b/internal/settings/service.go index 10228214..04efb4e8 100644 --- a/internal/settings/service.go +++ b/internal/settings/service.go @@ -57,7 +57,7 @@ func (s *Service) UpsertBot(ctx context.Context, botID string, req UpsertRequest } isPersonalBot := strings.EqualFold(strings.TrimSpace(botRow.Type), "personal") - current := normalizeBotSetting(botRow.MaxContextLoadTime, botRow.MaxContextTokens, botRow.MaxInboxItems, botRow.Language, botRow.AllowGuest, botRow.ReasoningEnabled, botRow.ReasoningEffort) + current := normalizeBotSetting(botRow.MaxContextLoadTime, botRow.MaxContextTokens, botRow.MaxInboxItems, botRow.Language, botRow.AllowGuest, botRow.ReasoningEnabled, botRow.ReasoningEffort, botRow.HeartbeatEnabled, botRow.HeartbeatInterval) if req.MaxContextLoadTime != nil && *req.MaxContextLoadTime > 0 { current.MaxContextLoadTime = *req.MaxContextLoadTime } @@ -84,7 +84,12 @@ func (s *Service) UpsertBot(ctx context.Context, botID string, req UpsertRequest if req.ReasoningEffort != nil && isValidReasoningEffort(*req.ReasoningEffort) { current.ReasoningEffort = *req.ReasoningEffort } - + if req.HeartbeatEnabled != nil { + current.HeartbeatEnabled = *req.HeartbeatEnabled + } + if req.HeartbeatInterval != nil && *req.HeartbeatInterval > 0 { + current.HeartbeatInterval = *req.HeartbeatInterval + } chatModelUUID := pgtype.UUID{} if value := strings.TrimSpace(req.ChatModelID); value != "" { modelID, err := s.resolveModelUUID(ctx, value) @@ -109,6 +114,14 @@ func (s *Service) UpsertBot(ctx context.Context, botID string, req UpsertRequest } embeddingModelUUID = modelID } + heartbeatModelUUID := pgtype.UUID{} + if value := strings.TrimSpace(req.HeartbeatModelID); value != "" { + modelID, err := s.resolveModelUUID(ctx, value) + if err != nil { + return Settings{}, err + } + heartbeatModelUUID = modelID + } searchProviderUUID := pgtype.UUID{} if value := strings.TrimSpace(req.SearchProviderID); value != "" { providerID, err := db.ParseUUID(value) @@ -127,9 +140,13 @@ func (s *Service) UpsertBot(ctx context.Context, botID string, req UpsertRequest AllowGuest: current.AllowGuest, ReasoningEnabled: current.ReasoningEnabled, ReasoningEffort: current.ReasoningEffort, + HeartbeatEnabled: current.HeartbeatEnabled, + HeartbeatInterval: int32(current.HeartbeatInterval), + HeartbeatPrompt: "", ChatModelID: chatModelUUID, MemoryModelID: memoryModelUUID, EmbeddingModelID: embeddingModelUUID, + HeartbeatModelID: heartbeatModelUUID, SearchProviderID: searchProviderUUID, }) if err != nil { @@ -149,7 +166,7 @@ func (s *Service) Delete(ctx context.Context, botID string) error { return s.queries.DeleteSettingsByBotID(ctx, pgID) } -func normalizeBotSetting(maxContextLoadTime int32, maxContextTokens int32, maxInboxItems int32, language string, allowGuest bool, reasoningEnabled bool, reasoningEffort string) Settings { +func normalizeBotSetting(maxContextLoadTime int32, maxContextTokens int32, maxInboxItems int32, language string, allowGuest bool, reasoningEnabled bool, reasoningEffort string, heartbeatEnabled bool, heartbeatInterval int32) Settings { settings := Settings{ MaxContextLoadTime: int(maxContextLoadTime), MaxContextTokens: int(maxContextTokens), @@ -158,6 +175,8 @@ func normalizeBotSetting(maxContextLoadTime int32, maxContextTokens int32, maxIn AllowGuest: allowGuest, ReasoningEnabled: reasoningEnabled, ReasoningEffort: strings.TrimSpace(reasoningEffort), + HeartbeatEnabled: heartbeatEnabled, + HeartbeatInterval: int(heartbeatInterval), } if settings.MaxContextLoadTime <= 0 { settings.MaxContextLoadTime = DefaultMaxContextLoadTime @@ -174,6 +193,9 @@ func normalizeBotSetting(maxContextLoadTime int32, maxContextTokens int32, maxIn if !isValidReasoningEffort(settings.ReasoningEffort) { settings.ReasoningEffort = DefaultReasoningEffort } + if settings.HeartbeatInterval <= 0 { + settings.HeartbeatInterval = DefaultHeartbeatInterval + } return settings } @@ -195,9 +217,12 @@ func normalizeBotSettingsReadRow(row sqlc.GetSettingsByBotIDRow) Settings { row.AllowGuest, row.ReasoningEnabled, row.ReasoningEffort, + row.HeartbeatEnabled, + row.HeartbeatInterval, row.ChatModelID, row.MemoryModelID, row.EmbeddingModelID, + row.HeartbeatModelID, row.SearchProviderID, ) } @@ -211,9 +236,12 @@ func normalizeBotSettingsWriteRow(row sqlc.UpsertBotSettingsRow) Settings { row.AllowGuest, row.ReasoningEnabled, row.ReasoningEffort, + row.HeartbeatEnabled, + row.HeartbeatInterval, row.ChatModelID, row.MemoryModelID, row.EmbeddingModelID, + row.HeartbeatModelID, row.SearchProviderID, ) } @@ -226,12 +254,15 @@ func normalizeBotSettingsFields( allowGuest bool, reasoningEnabled bool, reasoningEffort string, + heartbeatEnabled bool, + heartbeatInterval int32, chatModelID pgtype.UUID, memoryModelID pgtype.UUID, embeddingModelID pgtype.UUID, + heartbeatModelID pgtype.UUID, searchProviderID pgtype.UUID, ) Settings { - settings := normalizeBotSetting(maxContextLoadTime, maxContextTokens, maxInboxItems, language, allowGuest, reasoningEnabled, reasoningEffort) + settings := normalizeBotSetting(maxContextLoadTime, maxContextTokens, maxInboxItems, language, allowGuest, reasoningEnabled, reasoningEffort, heartbeatEnabled, heartbeatInterval) if chatModelID.Valid { settings.ChatModelID = uuid.UUID(chatModelID.Bytes).String() } @@ -241,6 +272,9 @@ func normalizeBotSettingsFields( if embeddingModelID.Valid { settings.EmbeddingModelID = uuid.UUID(embeddingModelID.Bytes).String() } + if heartbeatModelID.Valid { + settings.HeartbeatModelID = uuid.UUID(heartbeatModelID.Bytes).String() + } if searchProviderID.Valid { settings.SearchProviderID = uuid.UUID(searchProviderID.Bytes).String() } diff --git a/internal/settings/types.go b/internal/settings/types.go index 8b032332..a3a5df70 100644 --- a/internal/settings/types.go +++ b/internal/settings/types.go @@ -5,6 +5,7 @@ const ( DefaultMaxInboxItems = 50 DefaultLanguage = "auto" DefaultReasoningEffort = "medium" + DefaultHeartbeatInterval = 30 ) type Settings struct { @@ -19,6 +20,9 @@ type Settings struct { AllowGuest bool `json:"allow_guest"` ReasoningEnabled bool `json:"reasoning_enabled"` ReasoningEffort string `json:"reasoning_effort"` + HeartbeatEnabled bool `json:"heartbeat_enabled"` + HeartbeatInterval int `json:"heartbeat_interval"` + HeartbeatModelID string `json:"heartbeat_model_id"` } type UpsertRequest struct { @@ -33,4 +37,7 @@ type UpsertRequest struct { AllowGuest *bool `json:"allow_guest,omitempty"` ReasoningEnabled *bool `json:"reasoning_enabled,omitempty"` ReasoningEffort *string `json:"reasoning_effort,omitempty"` + HeartbeatEnabled *bool `json:"heartbeat_enabled,omitempty"` + HeartbeatInterval *int `json:"heartbeat_interval,omitempty"` + HeartbeatModelID string `json:"heartbeat_model_id,omitempty"` } diff --git a/packages/agent/src/agent.ts b/packages/agent/src/agent.ts index 36b0a43a..46d30247 100644 --- a/packages/agent/src/agent.ts +++ b/packages/agent/src/agent.ts @@ -14,11 +14,12 @@ import { AgentSkill, AgentStreamAction, allActions, + Heartbeat, MCPConnection, Schedule, } from './types' import { ClientType, ModelConfig, ModelInput, hasInputModality } from './types/model' -import { system, schedule, subagentSystem } from './prompts' +import { system, schedule, heartbeat, subagentSystem } from './prompts' import { AuthFetcher } from './types' import { createModel } from './model' import { @@ -323,6 +324,46 @@ export const createAgent = ( } } + const triggerHeartbeat = async (params: { + heartbeat: Heartbeat; + messages: ModelMessage[]; + skills: string[]; + }) => { + const heartbeatText = await heartbeat({ interval: params.heartbeat.interval, date: new Date(), fs }) + const heartbeatMessage: UserModelMessage = { + role: 'user', + content: [ + { + type: 'text', + text: heartbeatText, + }, + ], + } + const messages = [...params.messages, heartbeatMessage] + params.skills.forEach((skill) => enableSkill(skill)) + const { tools, close } = await getAgentTools() + const { response, reasoning, text, usage, steps } = await generateText({ + model, + messages, + system: await generateSystemPrompt(), + ...(providerOptions && { providerOptions }), + stopWhen: stepCountIs(Infinity), + onFinish: async () => { + await close() + }, + tools, + }) + const stepUsages = buildStepUsages(steps) + return { + messages: [heartbeatMessage, ...response.messages], + usages: [null, ...stepUsages] as (LanguageModelUsage | null)[], + reasoning: reasoning.map((part) => part.text), + usage, + text, + skills: getEnabledSkills(), + } + } + const resolveStreamErrorMessage = (raw: unknown): string => { if (raw instanceof Error && raw.message.trim()) { return raw.message @@ -515,5 +556,6 @@ export const createAgent = ( ask, askAsSubagent, triggerSchedule, + triggerHeartbeat, } } diff --git a/packages/agent/src/prompts/heartbeat.ts b/packages/agent/src/prompts/heartbeat.ts new file mode 100644 index 00000000..ff9dd269 --- /dev/null +++ b/packages/agent/src/prompts/heartbeat.ts @@ -0,0 +1,36 @@ +import type { FSClient } from '../utils/fs' + +export interface HeartbeatParams { + interval: number + date: Date + fs: FSClient +} + +const defaultInstructions = `Do not infer or repeat old tasks from prior chats. +If nothing needs attention, reply HEARTBEAT_OK. +If something needs attention, use the send tool to deliver alerts to the appropriate channel.` + +export const heartbeat = async (params: HeartbeatParams) => { + let checklist = '' + try { + checklist = await params.fs.readText('/data/HEARTBEAT.md') + } catch { + // HEARTBEAT.md does not exist — not an error + } + + const sections: string[] = [ + '** This is a heartbeat check automatically triggered by the system **', + '---', + `interval: every ${params.interval} minutes`, + `time: ${params.date.toISOString()}`, + '---', + ] + + if (checklist.trim()) { + sections.push(`\n## HEARTBEAT.md (checklist)\n\n${checklist.trim()}`) + } + + sections.push(`\n${defaultInstructions}`) + + return sections.join('\n').trim() +} diff --git a/packages/agent/src/prompts/index.ts b/packages/agent/src/prompts/index.ts index f43b579a..ab6e1800 100644 --- a/packages/agent/src/prompts/index.ts +++ b/packages/agent/src/prompts/index.ts @@ -1,4 +1,5 @@ export * from './system' export * from './schedule' +export * from './heartbeat' export * from './subagent' export * from './utils' \ No newline at end of file diff --git a/packages/agent/src/prompts/system.ts b/packages/agent/src/prompts/system.ts index fff40811..da74beca 100644 --- a/packages/agent/src/prompts/system.ts +++ b/packages/agent/src/prompts/system.ts @@ -159,6 +159,42 @@ When cron pattern is valid, you will receive a schedule message with your ${quot When a scheduled task triggers, use ${quote('send')} to deliver the result to the intended channel — do not respond directly, as there is no active conversation to reply to. +## Heartbeat — Be Proactive + +You may receive periodic **heartbeat** messages — automatic system-triggered turns that let you proactively check on things without the user asking. + +### The HEARTBEAT_OK Contract +- If nothing needs attention, reply with exactly ${quote('HEARTBEAT_OK')}. The system will suppress this message — the user will not see it. +- If something needs attention, use ${quote('send')} to deliver alerts to the appropriate channel. Your text output in heartbeat turns is NOT sent to the user directly. + +### HEARTBEAT.md +${quote('/data/HEARTBEAT.md')} is your checklist file. The system will read it automatically and include its content in the heartbeat message. You are free to edit this file — add short checklists, reminders, or periodic tasks. Keep it small to limit token usage. + +### When to Reach Out (use ${quote('send')}) +- Important messages or notifications arrived +- Upcoming events or deadlines (< 2 hours) +- Something interesting or actionable you discovered +- A monitored task changed status + +### When to Stay Quiet (${quote('HEARTBEAT_OK')}) +- Late night hours unless truly urgent +- Nothing new since last check +- The user is clearly busy or in a conversation +- You just checked recently and nothing changed + +### Proactive Work (no need to ask) +During heartbeats you can freely: +- Read, organize, and update your memory files +- Check on ongoing projects (git status, file changes, etc.) +- Update ${quote('HEARTBEAT.md')} to refine your own checklist +- Clean up or archive old notes + +### Heartbeat vs Schedule: When to Use Each +- **Heartbeat**: batch multiple periodic checks together (inbox + calendar + notifications), timing can drift slightly, needs conversational context. +- **Schedule (cron)**: exact timing matters, task needs isolation, one-shot reminders, output should go directly to a channel. + +**Tip:** Batch similar periodic checks into ${quote('HEARTBEAT.md')} instead of creating multiple schedule tasks. Use schedule for precise timing and standalone tasks. + ## Subagent For complex tasks like: diff --git a/packages/agent/src/types/heartbeat.ts b/packages/agent/src/types/heartbeat.ts new file mode 100644 index 00000000..61cb3bcd --- /dev/null +++ b/packages/agent/src/types/heartbeat.ts @@ -0,0 +1,3 @@ +export interface Heartbeat { + interval: number +} diff --git a/packages/agent/src/types/index.ts b/packages/agent/src/types/index.ts index 451baee9..32db5f8b 100644 --- a/packages/agent/src/types/index.ts +++ b/packages/agent/src/types/index.ts @@ -1,6 +1,7 @@ export * from './agent' export * from './model' export * from './schedule' +export * from './heartbeat' export * from './attachment' export * from './mcp' export * from './auth' diff --git a/packages/sdk/src/@pinia/colada.gen.ts b/packages/sdk/src/@pinia/colada.gen.ts index fcc097c8..2f501d1d 100644 --- a/packages/sdk/src/@pinia/colada.gen.ts +++ b/packages/sdk/src/@pinia/colada.gen.ts @@ -4,8 +4,8 @@ import { type _JSONValue, defineQueryOptions, type UseMutationOptions } from '@p import { serializeQueryKeyValue } from '../client'; import { client } from '../client.gen'; -import { deleteBotsByBotIdContainer, deleteBotsByBotIdContainerSkills, deleteBotsByBotIdInboxById, deleteBotsByBotIdMcpById, deleteBotsByBotIdMemory, deleteBotsByBotIdMemoryById, deleteBotsByBotIdMessages, deleteBotsByBotIdScheduleById, deleteBotsByBotIdSettings, deleteBotsByBotIdSubagentsById, deleteBotsById, deleteBotsByIdChannelByPlatform, deleteBotsByIdMembersByUserId, deleteModelsById, deleteModelsModelByModelId, deleteProvidersById, deleteSearchProvidersById, getBots, getBotsByBotIdContainer, getBotsByBotIdContainerFs, getBotsByBotIdContainerFsDownload, getBotsByBotIdContainerFsList, getBotsByBotIdContainerFsRead, getBotsByBotIdContainerSkills, getBotsByBotIdContainerSnapshots, getBotsByBotIdInbox, getBotsByBotIdInboxById, getBotsByBotIdInboxCount, getBotsByBotIdMcp, getBotsByBotIdMcpById, getBotsByBotIdMcpExport, getBotsByBotIdMemory, getBotsByBotIdMemoryUsage, getBotsByBotIdMessages, getBotsByBotIdSchedule, getBotsByBotIdScheduleById, getBotsByBotIdSettings, getBotsByBotIdSubagents, getBotsByBotIdSubagentsById, getBotsByBotIdSubagentsByIdContext, getBotsByBotIdSubagentsByIdSkills, getBotsById, getBotsByIdChannelByPlatform, getBotsByIdChecks, getBotsByIdMembers, getChannels, getChannelsByPlatform, getModels, getModelsById, getModelsCount, getModelsModelByModelId, getPing, getProviders, getProvidersById, getProvidersByIdModels, getProvidersCount, getProvidersNameByName, getSearchProviders, getSearchProvidersById, getSearchProvidersMeta, getUsers, getUsersById, getUsersMe, getUsersMeChannelsByPlatform, getUsersMeIdentities, type Options, patchBotsByIdChannelByPlatformStatus, postAuthLogin, postBots, postBotsByBotIdCliMessages, postBotsByBotIdContainer, postBotsByBotIdContainerFsDelete, postBotsByBotIdContainerFsMkdir, postBotsByBotIdContainerFsRename, postBotsByBotIdContainerFsUpload, postBotsByBotIdContainerFsWrite, postBotsByBotIdContainerSkills, postBotsByBotIdContainerSnapshots, postBotsByBotIdContainerStart, postBotsByBotIdContainerStop, postBotsByBotIdInbox, postBotsByBotIdInboxMarkRead, postBotsByBotIdMcp, postBotsByBotIdMcpOpsBatchDelete, postBotsByBotIdMcpStdio, postBotsByBotIdMcpStdioByConnectionId, postBotsByBotIdMemory, postBotsByBotIdMemoryCompact, postBotsByBotIdMemoryRebuild, postBotsByBotIdMemorySearch, postBotsByBotIdSchedule, postBotsByBotIdSettings, postBotsByBotIdSubagents, postBotsByBotIdSubagentsByIdSkills, postBotsByBotIdTools, postBotsByBotIdWebMessages, postBotsByIdChannelByPlatformSend, postBotsByIdChannelByPlatformSendChat, postEmbeddings, postModels, postProviders, postProvidersByIdTest, postSearchProviders, postUsers, putBotsByBotIdMcpById, putBotsByBotIdMcpImport, putBotsByBotIdScheduleById, putBotsByBotIdSettings, putBotsByBotIdSubagentsById, putBotsByBotIdSubagentsByIdContext, putBotsByBotIdSubagentsByIdSkills, putBotsById, putBotsByIdChannelByPlatform, putBotsByIdMembers, putBotsByIdOwner, putModelsById, putModelsModelByModelId, putProvidersById, putSearchProvidersById, putUsersById, putUsersByIdPassword, putUsersMe, putUsersMeChannelsByPlatform, putUsersMePassword } from '../sdk.gen'; -import type { DeleteBotsByBotIdContainerData, DeleteBotsByBotIdContainerError, DeleteBotsByBotIdContainerSkillsData, DeleteBotsByBotIdContainerSkillsError, DeleteBotsByBotIdContainerSkillsResponse, DeleteBotsByBotIdInboxByIdData, DeleteBotsByBotIdInboxByIdError, DeleteBotsByBotIdMcpByIdData, DeleteBotsByBotIdMcpByIdError, DeleteBotsByBotIdMemoryByIdData, DeleteBotsByBotIdMemoryByIdError, DeleteBotsByBotIdMemoryByIdResponse, DeleteBotsByBotIdMemoryData, DeleteBotsByBotIdMemoryError, DeleteBotsByBotIdMemoryResponse, DeleteBotsByBotIdMessagesData, DeleteBotsByBotIdMessagesError, DeleteBotsByBotIdScheduleByIdData, DeleteBotsByBotIdScheduleByIdError, DeleteBotsByBotIdSettingsData, DeleteBotsByBotIdSettingsError, DeleteBotsByBotIdSubagentsByIdData, DeleteBotsByBotIdSubagentsByIdError, DeleteBotsByIdChannelByPlatformData, DeleteBotsByIdChannelByPlatformError, DeleteBotsByIdData, DeleteBotsByIdError, DeleteBotsByIdMembersByUserIdData, DeleteBotsByIdMembersByUserIdError, DeleteBotsByIdResponse, DeleteModelsByIdData, DeleteModelsByIdError, DeleteModelsModelByModelIdData, DeleteModelsModelByModelIdError, DeleteProvidersByIdData, DeleteProvidersByIdError, DeleteSearchProvidersByIdData, DeleteSearchProvidersByIdError, GetBotsByBotIdContainerData, GetBotsByBotIdContainerFsData, GetBotsByBotIdContainerFsDownloadData, GetBotsByBotIdContainerFsListData, GetBotsByBotIdContainerFsReadData, GetBotsByBotIdContainerSkillsData, GetBotsByBotIdContainerSnapshotsData, GetBotsByBotIdInboxByIdData, GetBotsByBotIdInboxCountData, GetBotsByBotIdInboxData, GetBotsByBotIdMcpByIdData, GetBotsByBotIdMcpData, GetBotsByBotIdMcpExportData, GetBotsByBotIdMemoryData, GetBotsByBotIdMemoryUsageData, GetBotsByBotIdMessagesData, GetBotsByBotIdScheduleByIdData, GetBotsByBotIdScheduleData, GetBotsByBotIdSettingsData, GetBotsByBotIdSubagentsByIdContextData, GetBotsByBotIdSubagentsByIdData, GetBotsByBotIdSubagentsByIdSkillsData, GetBotsByBotIdSubagentsData, GetBotsByIdChannelByPlatformData, GetBotsByIdChecksData, GetBotsByIdData, GetBotsByIdMembersData, GetBotsData, GetChannelsByPlatformData, GetChannelsData, GetModelsByIdData, GetModelsCountData, GetModelsData, GetModelsModelByModelIdData, GetPingData, GetProvidersByIdData, GetProvidersByIdModelsData, GetProvidersCountData, GetProvidersData, GetProvidersNameByNameData, GetSearchProvidersByIdData, GetSearchProvidersData, GetSearchProvidersMetaData, GetUsersByIdData, GetUsersData, GetUsersMeChannelsByPlatformData, GetUsersMeData, GetUsersMeIdentitiesData, PatchBotsByIdChannelByPlatformStatusData, PatchBotsByIdChannelByPlatformStatusError, PatchBotsByIdChannelByPlatformStatusResponse, PostAuthLoginData, PostAuthLoginError, PostAuthLoginResponse, PostBotsByBotIdCliMessagesData, PostBotsByBotIdCliMessagesError, PostBotsByBotIdCliMessagesResponse, PostBotsByBotIdContainerData, PostBotsByBotIdContainerError, PostBotsByBotIdContainerFsDeleteData, PostBotsByBotIdContainerFsDeleteError, PostBotsByBotIdContainerFsDeleteResponse, PostBotsByBotIdContainerFsMkdirData, PostBotsByBotIdContainerFsMkdirError, PostBotsByBotIdContainerFsMkdirResponse, PostBotsByBotIdContainerFsRenameData, PostBotsByBotIdContainerFsRenameError, PostBotsByBotIdContainerFsRenameResponse, PostBotsByBotIdContainerFsUploadData, PostBotsByBotIdContainerFsUploadError, PostBotsByBotIdContainerFsUploadResponse, PostBotsByBotIdContainerFsWriteData, PostBotsByBotIdContainerFsWriteError, PostBotsByBotIdContainerFsWriteResponse, PostBotsByBotIdContainerResponse, PostBotsByBotIdContainerSkillsData, PostBotsByBotIdContainerSkillsError, PostBotsByBotIdContainerSkillsResponse, PostBotsByBotIdContainerSnapshotsData, PostBotsByBotIdContainerSnapshotsError, PostBotsByBotIdContainerSnapshotsResponse, PostBotsByBotIdContainerStartData, PostBotsByBotIdContainerStartError, PostBotsByBotIdContainerStartResponse, PostBotsByBotIdContainerStopData, PostBotsByBotIdContainerStopError, PostBotsByBotIdContainerStopResponse, PostBotsByBotIdInboxData, PostBotsByBotIdInboxError, PostBotsByBotIdInboxMarkReadData, PostBotsByBotIdInboxMarkReadError, PostBotsByBotIdInboxResponse, PostBotsByBotIdMcpData, PostBotsByBotIdMcpError, PostBotsByBotIdMcpOpsBatchDeleteData, PostBotsByBotIdMcpOpsBatchDeleteError, PostBotsByBotIdMcpResponse, PostBotsByBotIdMcpStdioByConnectionIdData, PostBotsByBotIdMcpStdioByConnectionIdError, PostBotsByBotIdMcpStdioByConnectionIdResponse, PostBotsByBotIdMcpStdioData, PostBotsByBotIdMcpStdioError, PostBotsByBotIdMcpStdioResponse, PostBotsByBotIdMemoryCompactData, PostBotsByBotIdMemoryCompactError, PostBotsByBotIdMemoryCompactResponse, PostBotsByBotIdMemoryData, PostBotsByBotIdMemoryError, PostBotsByBotIdMemoryRebuildData, PostBotsByBotIdMemoryRebuildError, PostBotsByBotIdMemoryRebuildResponse, PostBotsByBotIdMemoryResponse, PostBotsByBotIdMemorySearchData, PostBotsByBotIdMemorySearchError, PostBotsByBotIdMemorySearchResponse, PostBotsByBotIdScheduleData, PostBotsByBotIdScheduleError, PostBotsByBotIdScheduleResponse, PostBotsByBotIdSettingsData, PostBotsByBotIdSettingsError, PostBotsByBotIdSettingsResponse, PostBotsByBotIdSubagentsByIdSkillsData, PostBotsByBotIdSubagentsByIdSkillsError, PostBotsByBotIdSubagentsByIdSkillsResponse, PostBotsByBotIdSubagentsData, PostBotsByBotIdSubagentsError, PostBotsByBotIdSubagentsResponse, PostBotsByBotIdToolsData, PostBotsByBotIdToolsError, PostBotsByBotIdToolsResponse, PostBotsByBotIdWebMessagesData, PostBotsByBotIdWebMessagesError, PostBotsByBotIdWebMessagesResponse, PostBotsByIdChannelByPlatformSendChatData, PostBotsByIdChannelByPlatformSendChatError, PostBotsByIdChannelByPlatformSendChatResponse, PostBotsByIdChannelByPlatformSendData, PostBotsByIdChannelByPlatformSendError, PostBotsByIdChannelByPlatformSendResponse, PostBotsData, PostBotsError, PostBotsResponse, PostEmbeddingsData, PostEmbeddingsError, PostEmbeddingsResponse, PostModelsData, PostModelsError, PostModelsResponse, PostProvidersByIdTestData, PostProvidersByIdTestError, PostProvidersByIdTestResponse, PostProvidersData, PostProvidersError, PostProvidersResponse, PostSearchProvidersData, PostSearchProvidersError, PostSearchProvidersResponse, PostUsersData, PostUsersError, PostUsersResponse, PutBotsByBotIdMcpByIdData, PutBotsByBotIdMcpByIdError, PutBotsByBotIdMcpByIdResponse, PutBotsByBotIdMcpImportData, PutBotsByBotIdMcpImportError, PutBotsByBotIdMcpImportResponse, PutBotsByBotIdScheduleByIdData, PutBotsByBotIdScheduleByIdError, PutBotsByBotIdScheduleByIdResponse, PutBotsByBotIdSettingsData, PutBotsByBotIdSettingsError, PutBotsByBotIdSettingsResponse, PutBotsByBotIdSubagentsByIdContextData, PutBotsByBotIdSubagentsByIdContextError, PutBotsByBotIdSubagentsByIdContextResponse, PutBotsByBotIdSubagentsByIdData, PutBotsByBotIdSubagentsByIdError, PutBotsByBotIdSubagentsByIdResponse, PutBotsByBotIdSubagentsByIdSkillsData, PutBotsByBotIdSubagentsByIdSkillsError, PutBotsByBotIdSubagentsByIdSkillsResponse, PutBotsByIdChannelByPlatformData, PutBotsByIdChannelByPlatformError, PutBotsByIdChannelByPlatformResponse, PutBotsByIdData, PutBotsByIdError, PutBotsByIdMembersData, PutBotsByIdMembersError, PutBotsByIdMembersResponse, PutBotsByIdOwnerData, PutBotsByIdOwnerError, PutBotsByIdOwnerResponse, PutBotsByIdResponse, PutModelsByIdData, PutModelsByIdError, PutModelsByIdResponse, PutModelsModelByModelIdData, PutModelsModelByModelIdError, PutModelsModelByModelIdResponse, PutProvidersByIdData, PutProvidersByIdError, PutProvidersByIdResponse, PutSearchProvidersByIdData, PutSearchProvidersByIdError, PutSearchProvidersByIdResponse, PutUsersByIdData, PutUsersByIdError, PutUsersByIdPasswordData, PutUsersByIdPasswordError, PutUsersByIdResponse, PutUsersMeChannelsByPlatformData, PutUsersMeChannelsByPlatformError, PutUsersMeChannelsByPlatformResponse, PutUsersMeData, PutUsersMeError, PutUsersMePasswordData, PutUsersMePasswordError, PutUsersMeResponse } from '../types.gen'; +import { deleteBotsByBotIdContainer, deleteBotsByBotIdContainerSkills, deleteBotsByBotIdHeartbeatLogs, deleteBotsByBotIdInboxById, deleteBotsByBotIdMcpById, deleteBotsByBotIdMemory, deleteBotsByBotIdMemoryById, deleteBotsByBotIdMessages, deleteBotsByBotIdScheduleById, deleteBotsByBotIdSettings, deleteBotsByBotIdSubagentsById, deleteBotsById, deleteBotsByIdChannelByPlatform, deleteBotsByIdMembersByUserId, deleteModelsById, deleteModelsModelByModelId, deleteProvidersById, deleteSearchProvidersById, getBots, getBotsByBotIdContainer, getBotsByBotIdContainerFs, getBotsByBotIdContainerFsDownload, getBotsByBotIdContainerFsList, getBotsByBotIdContainerFsRead, getBotsByBotIdContainerSkills, getBotsByBotIdContainerSnapshots, getBotsByBotIdHeartbeatLogs, getBotsByBotIdInbox, getBotsByBotIdInboxById, getBotsByBotIdInboxCount, getBotsByBotIdMcp, getBotsByBotIdMcpById, getBotsByBotIdMcpExport, getBotsByBotIdMemory, getBotsByBotIdMemoryUsage, getBotsByBotIdMessages, getBotsByBotIdSchedule, getBotsByBotIdScheduleById, getBotsByBotIdSettings, getBotsByBotIdSubagents, getBotsByBotIdSubagentsById, getBotsByBotIdSubagentsByIdContext, getBotsByBotIdSubagentsByIdSkills, getBotsById, getBotsByIdChannelByPlatform, getBotsByIdChecks, getBotsByIdMembers, getChannels, getChannelsByPlatform, getModels, getModelsById, getModelsCount, getModelsModelByModelId, getPing, getProviders, getProvidersById, getProvidersByIdModels, getProvidersCount, getProvidersNameByName, getSearchProviders, getSearchProvidersById, getSearchProvidersMeta, getUsers, getUsersById, getUsersMe, getUsersMeChannelsByPlatform, getUsersMeIdentities, type Options, patchBotsByIdChannelByPlatformStatus, postAuthLogin, postBots, postBotsByBotIdCliMessages, postBotsByBotIdContainer, postBotsByBotIdContainerFsDelete, postBotsByBotIdContainerFsMkdir, postBotsByBotIdContainerFsRename, postBotsByBotIdContainerFsUpload, postBotsByBotIdContainerFsWrite, postBotsByBotIdContainerSkills, postBotsByBotIdContainerSnapshots, postBotsByBotIdContainerStart, postBotsByBotIdContainerStop, postBotsByBotIdInbox, postBotsByBotIdInboxMarkRead, postBotsByBotIdMcp, postBotsByBotIdMcpOpsBatchDelete, postBotsByBotIdMcpStdio, postBotsByBotIdMcpStdioByConnectionId, postBotsByBotIdMemory, postBotsByBotIdMemoryCompact, postBotsByBotIdMemoryRebuild, postBotsByBotIdMemorySearch, postBotsByBotIdSchedule, postBotsByBotIdSettings, postBotsByBotIdSubagents, postBotsByBotIdSubagentsByIdSkills, postBotsByBotIdTools, postBotsByBotIdWebMessages, postBotsByIdChannelByPlatformSend, postBotsByIdChannelByPlatformSendChat, postEmbeddings, postModels, postProviders, postProvidersByIdTest, postSearchProviders, postUsers, putBotsByBotIdMcpById, putBotsByBotIdMcpImport, putBotsByBotIdScheduleById, putBotsByBotIdSettings, putBotsByBotIdSubagentsById, putBotsByBotIdSubagentsByIdContext, putBotsByBotIdSubagentsByIdSkills, putBotsById, putBotsByIdChannelByPlatform, putBotsByIdMembers, putBotsByIdOwner, putModelsById, putModelsModelByModelId, putProvidersById, putSearchProvidersById, putUsersById, putUsersByIdPassword, putUsersMe, putUsersMeChannelsByPlatform, putUsersMePassword } from '../sdk.gen'; +import type { DeleteBotsByBotIdContainerData, DeleteBotsByBotIdContainerError, DeleteBotsByBotIdContainerSkillsData, DeleteBotsByBotIdContainerSkillsError, DeleteBotsByBotIdContainerSkillsResponse, DeleteBotsByBotIdHeartbeatLogsData, DeleteBotsByBotIdHeartbeatLogsError, DeleteBotsByBotIdInboxByIdData, DeleteBotsByBotIdInboxByIdError, DeleteBotsByBotIdMcpByIdData, DeleteBotsByBotIdMcpByIdError, DeleteBotsByBotIdMemoryByIdData, DeleteBotsByBotIdMemoryByIdError, DeleteBotsByBotIdMemoryByIdResponse, DeleteBotsByBotIdMemoryData, DeleteBotsByBotIdMemoryError, DeleteBotsByBotIdMemoryResponse, DeleteBotsByBotIdMessagesData, DeleteBotsByBotIdMessagesError, DeleteBotsByBotIdScheduleByIdData, DeleteBotsByBotIdScheduleByIdError, DeleteBotsByBotIdSettingsData, DeleteBotsByBotIdSettingsError, DeleteBotsByBotIdSubagentsByIdData, DeleteBotsByBotIdSubagentsByIdError, DeleteBotsByIdChannelByPlatformData, DeleteBotsByIdChannelByPlatformError, DeleteBotsByIdData, DeleteBotsByIdError, DeleteBotsByIdMembersByUserIdData, DeleteBotsByIdMembersByUserIdError, DeleteBotsByIdResponse, DeleteModelsByIdData, DeleteModelsByIdError, DeleteModelsModelByModelIdData, DeleteModelsModelByModelIdError, DeleteProvidersByIdData, DeleteProvidersByIdError, DeleteSearchProvidersByIdData, DeleteSearchProvidersByIdError, GetBotsByBotIdContainerData, GetBotsByBotIdContainerFsData, GetBotsByBotIdContainerFsDownloadData, GetBotsByBotIdContainerFsListData, GetBotsByBotIdContainerFsReadData, GetBotsByBotIdContainerSkillsData, GetBotsByBotIdContainerSnapshotsData, GetBotsByBotIdHeartbeatLogsData, GetBotsByBotIdInboxByIdData, GetBotsByBotIdInboxCountData, GetBotsByBotIdInboxData, GetBotsByBotIdMcpByIdData, GetBotsByBotIdMcpData, GetBotsByBotIdMcpExportData, GetBotsByBotIdMemoryData, GetBotsByBotIdMemoryUsageData, GetBotsByBotIdMessagesData, GetBotsByBotIdScheduleByIdData, GetBotsByBotIdScheduleData, GetBotsByBotIdSettingsData, GetBotsByBotIdSubagentsByIdContextData, GetBotsByBotIdSubagentsByIdData, GetBotsByBotIdSubagentsByIdSkillsData, GetBotsByBotIdSubagentsData, GetBotsByIdChannelByPlatformData, GetBotsByIdChecksData, GetBotsByIdData, GetBotsByIdMembersData, GetBotsData, GetChannelsByPlatformData, GetChannelsData, GetModelsByIdData, GetModelsCountData, GetModelsData, GetModelsModelByModelIdData, GetPingData, GetProvidersByIdData, GetProvidersByIdModelsData, GetProvidersCountData, GetProvidersData, GetProvidersNameByNameData, GetSearchProvidersByIdData, GetSearchProvidersData, GetSearchProvidersMetaData, GetUsersByIdData, GetUsersData, GetUsersMeChannelsByPlatformData, GetUsersMeData, GetUsersMeIdentitiesData, PatchBotsByIdChannelByPlatformStatusData, PatchBotsByIdChannelByPlatformStatusError, PatchBotsByIdChannelByPlatformStatusResponse, PostAuthLoginData, PostAuthLoginError, PostAuthLoginResponse, PostBotsByBotIdCliMessagesData, PostBotsByBotIdCliMessagesError, PostBotsByBotIdCliMessagesResponse, PostBotsByBotIdContainerData, PostBotsByBotIdContainerError, PostBotsByBotIdContainerFsDeleteData, PostBotsByBotIdContainerFsDeleteError, PostBotsByBotIdContainerFsDeleteResponse, PostBotsByBotIdContainerFsMkdirData, PostBotsByBotIdContainerFsMkdirError, PostBotsByBotIdContainerFsMkdirResponse, PostBotsByBotIdContainerFsRenameData, PostBotsByBotIdContainerFsRenameError, PostBotsByBotIdContainerFsRenameResponse, PostBotsByBotIdContainerFsUploadData, PostBotsByBotIdContainerFsUploadError, PostBotsByBotIdContainerFsUploadResponse, PostBotsByBotIdContainerFsWriteData, PostBotsByBotIdContainerFsWriteError, PostBotsByBotIdContainerFsWriteResponse, PostBotsByBotIdContainerResponse, PostBotsByBotIdContainerSkillsData, PostBotsByBotIdContainerSkillsError, PostBotsByBotIdContainerSkillsResponse, PostBotsByBotIdContainerSnapshotsData, PostBotsByBotIdContainerSnapshotsError, PostBotsByBotIdContainerSnapshotsResponse, PostBotsByBotIdContainerStartData, PostBotsByBotIdContainerStartError, PostBotsByBotIdContainerStartResponse, PostBotsByBotIdContainerStopData, PostBotsByBotIdContainerStopError, PostBotsByBotIdContainerStopResponse, PostBotsByBotIdInboxData, PostBotsByBotIdInboxError, PostBotsByBotIdInboxMarkReadData, PostBotsByBotIdInboxMarkReadError, PostBotsByBotIdInboxResponse, PostBotsByBotIdMcpData, PostBotsByBotIdMcpError, PostBotsByBotIdMcpOpsBatchDeleteData, PostBotsByBotIdMcpOpsBatchDeleteError, PostBotsByBotIdMcpResponse, PostBotsByBotIdMcpStdioByConnectionIdData, PostBotsByBotIdMcpStdioByConnectionIdError, PostBotsByBotIdMcpStdioByConnectionIdResponse, PostBotsByBotIdMcpStdioData, PostBotsByBotIdMcpStdioError, PostBotsByBotIdMcpStdioResponse, PostBotsByBotIdMemoryCompactData, PostBotsByBotIdMemoryCompactError, PostBotsByBotIdMemoryCompactResponse, PostBotsByBotIdMemoryData, PostBotsByBotIdMemoryError, PostBotsByBotIdMemoryRebuildData, PostBotsByBotIdMemoryRebuildError, PostBotsByBotIdMemoryRebuildResponse, PostBotsByBotIdMemoryResponse, PostBotsByBotIdMemorySearchData, PostBotsByBotIdMemorySearchError, PostBotsByBotIdMemorySearchResponse, PostBotsByBotIdScheduleData, PostBotsByBotIdScheduleError, PostBotsByBotIdScheduleResponse, PostBotsByBotIdSettingsData, PostBotsByBotIdSettingsError, PostBotsByBotIdSettingsResponse, PostBotsByBotIdSubagentsByIdSkillsData, PostBotsByBotIdSubagentsByIdSkillsError, PostBotsByBotIdSubagentsByIdSkillsResponse, PostBotsByBotIdSubagentsData, PostBotsByBotIdSubagentsError, PostBotsByBotIdSubagentsResponse, PostBotsByBotIdToolsData, PostBotsByBotIdToolsError, PostBotsByBotIdToolsResponse, PostBotsByBotIdWebMessagesData, PostBotsByBotIdWebMessagesError, PostBotsByBotIdWebMessagesResponse, PostBotsByIdChannelByPlatformSendChatData, PostBotsByIdChannelByPlatformSendChatError, PostBotsByIdChannelByPlatformSendChatResponse, PostBotsByIdChannelByPlatformSendData, PostBotsByIdChannelByPlatformSendError, PostBotsByIdChannelByPlatformSendResponse, PostBotsData, PostBotsError, PostBotsResponse, PostEmbeddingsData, PostEmbeddingsError, PostEmbeddingsResponse, PostModelsData, PostModelsError, PostModelsResponse, PostProvidersByIdTestData, PostProvidersByIdTestError, PostProvidersByIdTestResponse, PostProvidersData, PostProvidersError, PostProvidersResponse, PostSearchProvidersData, PostSearchProvidersError, PostSearchProvidersResponse, PostUsersData, PostUsersError, PostUsersResponse, PutBotsByBotIdMcpByIdData, PutBotsByBotIdMcpByIdError, PutBotsByBotIdMcpByIdResponse, PutBotsByBotIdMcpImportData, PutBotsByBotIdMcpImportError, PutBotsByBotIdMcpImportResponse, PutBotsByBotIdScheduleByIdData, PutBotsByBotIdScheduleByIdError, PutBotsByBotIdScheduleByIdResponse, PutBotsByBotIdSettingsData, PutBotsByBotIdSettingsError, PutBotsByBotIdSettingsResponse, PutBotsByBotIdSubagentsByIdContextData, PutBotsByBotIdSubagentsByIdContextError, PutBotsByBotIdSubagentsByIdContextResponse, PutBotsByBotIdSubagentsByIdData, PutBotsByBotIdSubagentsByIdError, PutBotsByBotIdSubagentsByIdResponse, PutBotsByBotIdSubagentsByIdSkillsData, PutBotsByBotIdSubagentsByIdSkillsError, PutBotsByBotIdSubagentsByIdSkillsResponse, PutBotsByIdChannelByPlatformData, PutBotsByIdChannelByPlatformError, PutBotsByIdChannelByPlatformResponse, PutBotsByIdData, PutBotsByIdError, PutBotsByIdMembersData, PutBotsByIdMembersError, PutBotsByIdMembersResponse, PutBotsByIdOwnerData, PutBotsByIdOwnerError, PutBotsByIdOwnerResponse, PutBotsByIdResponse, PutModelsByIdData, PutModelsByIdError, PutModelsByIdResponse, PutModelsModelByModelIdData, PutModelsModelByModelIdError, PutModelsModelByModelIdResponse, PutProvidersByIdData, PutProvidersByIdError, PutProvidersByIdResponse, PutSearchProvidersByIdData, PutSearchProvidersByIdError, PutSearchProvidersByIdResponse, PutUsersByIdData, PutUsersByIdError, PutUsersByIdPasswordData, PutUsersByIdPasswordError, PutUsersByIdResponse, PutUsersMeChannelsByPlatformData, PutUsersMeChannelsByPlatformError, PutUsersMeChannelsByPlatformResponse, PutUsersMeData, PutUsersMeError, PutUsersMePasswordData, PutUsersMePasswordError, PutUsersMeResponse } from '../types.gen'; /** * Login @@ -414,6 +414,41 @@ export const postBotsByBotIdContainerStopMutation = (options?: Partial>): UseMutationOptions, DeleteBotsByBotIdHeartbeatLogsError> => ({ + mutation: async (vars) => { + const { data } = await deleteBotsByBotIdHeartbeatLogs({ + ...options, + ...vars, + throwOnError: true + }); + return data; + } +}); + +export const getBotsByBotIdHeartbeatLogsQueryKey = (options: Options) => createQueryKey('getBotsByBotIdHeartbeatLogs', options); + +/** + * List heartbeat logs + * + * List heartbeat execution logs for a bot + */ +export const getBotsByBotIdHeartbeatLogsQuery = defineQueryOptions((options: Options) => ({ + key: getBotsByBotIdHeartbeatLogsQueryKey(options), + query: async (context) => { + const { data } = await getBotsByBotIdHeartbeatLogs({ + ...options, + ...context, + throwOnError: true + }); + return data; + } +})); + export const getBotsByBotIdInboxQueryKey = (options: Options) => createQueryKey('getBotsByBotIdInbox', options); /** diff --git a/packages/sdk/src/index.ts b/packages/sdk/src/index.ts index 785e9d2c..362e8866 100644 --- a/packages/sdk/src/index.ts +++ b/packages/sdk/src/index.ts @@ -1,4 +1,4 @@ // This file is auto-generated by @hey-api/openapi-ts -export { deleteBotsByBotIdContainer, deleteBotsByBotIdContainerSkills, deleteBotsByBotIdInboxById, deleteBotsByBotIdMcpById, deleteBotsByBotIdMemory, deleteBotsByBotIdMemoryById, deleteBotsByBotIdMessages, deleteBotsByBotIdScheduleById, deleteBotsByBotIdSettings, deleteBotsByBotIdSubagentsById, deleteBotsById, deleteBotsByIdChannelByPlatform, deleteBotsByIdMembersByUserId, deleteModelsById, deleteModelsModelByModelId, deleteProvidersById, deleteSearchProvidersById, getBots, getBotsByBotIdCliStream, getBotsByBotIdContainer, getBotsByBotIdContainerFs, getBotsByBotIdContainerFsDownload, getBotsByBotIdContainerFsList, getBotsByBotIdContainerFsRead, getBotsByBotIdContainerSkills, getBotsByBotIdContainerSnapshots, getBotsByBotIdInbox, getBotsByBotIdInboxById, getBotsByBotIdInboxCount, getBotsByBotIdMcp, getBotsByBotIdMcpById, getBotsByBotIdMcpExport, getBotsByBotIdMemory, getBotsByBotIdMemoryUsage, getBotsByBotIdMessages, getBotsByBotIdSchedule, getBotsByBotIdScheduleById, getBotsByBotIdSettings, getBotsByBotIdSubagents, getBotsByBotIdSubagentsById, getBotsByBotIdSubagentsByIdContext, getBotsByBotIdSubagentsByIdSkills, getBotsByBotIdWebStream, getBotsById, getBotsByIdChannelByPlatform, getBotsByIdChecks, getBotsByIdMembers, getChannels, getChannelsByPlatform, getModels, getModelsById, getModelsCount, getModelsModelByModelId, getPing, getProviders, getProvidersById, getProvidersByIdModels, getProvidersCount, getProvidersNameByName, getSearchProviders, getSearchProvidersById, getSearchProvidersMeta, getUsers, getUsersById, getUsersMe, getUsersMeChannelsByPlatform, getUsersMeIdentities, type Options, patchBotsByIdChannelByPlatformStatus, postAuthLogin, postBots, postBotsByBotIdCliMessages, postBotsByBotIdContainer, postBotsByBotIdContainerFsDelete, postBotsByBotIdContainerFsMkdir, postBotsByBotIdContainerFsRename, postBotsByBotIdContainerFsUpload, postBotsByBotIdContainerFsWrite, postBotsByBotIdContainerSkills, postBotsByBotIdContainerSnapshots, postBotsByBotIdContainerStart, postBotsByBotIdContainerStop, postBotsByBotIdInbox, postBotsByBotIdInboxMarkRead, postBotsByBotIdMcp, postBotsByBotIdMcpOpsBatchDelete, postBotsByBotIdMcpStdio, postBotsByBotIdMcpStdioByConnectionId, postBotsByBotIdMemory, postBotsByBotIdMemoryCompact, postBotsByBotIdMemoryRebuild, postBotsByBotIdMemorySearch, postBotsByBotIdSchedule, postBotsByBotIdSettings, postBotsByBotIdSubagents, postBotsByBotIdSubagentsByIdSkills, postBotsByBotIdTools, postBotsByBotIdWebMessages, postBotsByIdChannelByPlatformSend, postBotsByIdChannelByPlatformSendChat, postEmbeddings, postModels, postProviders, postProvidersByIdTest, postSearchProviders, postUsers, putBotsByBotIdMcpById, putBotsByBotIdMcpImport, putBotsByBotIdScheduleById, putBotsByBotIdSettings, putBotsByBotIdSubagentsById, putBotsByBotIdSubagentsByIdContext, putBotsByBotIdSubagentsByIdSkills, putBotsById, putBotsByIdChannelByPlatform, putBotsByIdMembers, putBotsByIdOwner, putModelsById, putModelsModelByModelId, putProvidersById, putSearchProvidersById, putUsersById, putUsersByIdPassword, putUsersMe, putUsersMeChannelsByPlatform, putUsersMePassword } from './sdk.gen'; -export type { AccountsAccount, AccountsCreateAccountRequest, AccountsListAccountsResponse, AccountsResetPasswordRequest, AccountsUpdateAccountRequest, AccountsUpdatePasswordRequest, AccountsUpdateProfileRequest, BotsBot, BotsBotCheck, BotsBotMember, BotsCreateBotRequest, BotsListBotsResponse, BotsListChecksResponse, BotsListMembersResponse, BotsTransferBotRequest, BotsUpdateBotRequest, BotsUpsertMemberRequest, ChannelAction, ChannelAttachment, ChannelAttachmentType, ChannelChannelCapabilities, ChannelChannelConfig, ChannelChannelIdentityBinding, ChannelConfigSchema, ChannelFieldSchema, ChannelFieldType, ChannelMessage, ChannelMessageFormat, ChannelMessagePart, ChannelMessagePartType, ChannelMessageTextStyle, ChannelReplyRef, ChannelSendRequest, ChannelTargetHint, ChannelTargetSpec, ChannelThreadRef, ChannelUpdateChannelStatusRequest, ChannelUpsertChannelIdentityConfigRequest, ChannelUpsertConfigRequest, ClientOptions, DeleteBotsByBotIdContainerData, DeleteBotsByBotIdContainerError, DeleteBotsByBotIdContainerErrors, DeleteBotsByBotIdContainerResponses, DeleteBotsByBotIdContainerSkillsData, DeleteBotsByBotIdContainerSkillsError, DeleteBotsByBotIdContainerSkillsErrors, DeleteBotsByBotIdContainerSkillsResponse, DeleteBotsByBotIdContainerSkillsResponses, DeleteBotsByBotIdInboxByIdData, DeleteBotsByBotIdInboxByIdError, DeleteBotsByBotIdInboxByIdErrors, DeleteBotsByBotIdInboxByIdResponses, DeleteBotsByBotIdMcpByIdData, DeleteBotsByBotIdMcpByIdError, DeleteBotsByBotIdMcpByIdErrors, DeleteBotsByBotIdMcpByIdResponses, DeleteBotsByBotIdMemoryByIdData, DeleteBotsByBotIdMemoryByIdError, DeleteBotsByBotIdMemoryByIdErrors, DeleteBotsByBotIdMemoryByIdResponse, DeleteBotsByBotIdMemoryByIdResponses, DeleteBotsByBotIdMemoryData, DeleteBotsByBotIdMemoryError, DeleteBotsByBotIdMemoryErrors, DeleteBotsByBotIdMemoryResponse, DeleteBotsByBotIdMemoryResponses, DeleteBotsByBotIdMessagesData, DeleteBotsByBotIdMessagesError, DeleteBotsByBotIdMessagesErrors, DeleteBotsByBotIdMessagesResponses, DeleteBotsByBotIdScheduleByIdData, DeleteBotsByBotIdScheduleByIdError, DeleteBotsByBotIdScheduleByIdErrors, DeleteBotsByBotIdScheduleByIdResponses, DeleteBotsByBotIdSettingsData, DeleteBotsByBotIdSettingsError, DeleteBotsByBotIdSettingsErrors, DeleteBotsByBotIdSettingsResponses, DeleteBotsByBotIdSubagentsByIdData, DeleteBotsByBotIdSubagentsByIdError, DeleteBotsByBotIdSubagentsByIdErrors, DeleteBotsByBotIdSubagentsByIdResponses, DeleteBotsByIdChannelByPlatformData, DeleteBotsByIdChannelByPlatformError, DeleteBotsByIdChannelByPlatformErrors, DeleteBotsByIdChannelByPlatformResponses, DeleteBotsByIdData, DeleteBotsByIdError, DeleteBotsByIdErrors, DeleteBotsByIdMembersByUserIdData, DeleteBotsByIdMembersByUserIdError, DeleteBotsByIdMembersByUserIdErrors, DeleteBotsByIdMembersByUserIdResponses, DeleteBotsByIdResponse, DeleteBotsByIdResponses, DeleteModelsByIdData, DeleteModelsByIdError, DeleteModelsByIdErrors, DeleteModelsByIdResponses, DeleteModelsModelByModelIdData, DeleteModelsModelByModelIdError, DeleteModelsModelByModelIdErrors, DeleteModelsModelByModelIdResponses, DeleteProvidersByIdData, DeleteProvidersByIdError, DeleteProvidersByIdErrors, DeleteProvidersByIdResponses, DeleteSearchProvidersByIdData, DeleteSearchProvidersByIdError, DeleteSearchProvidersByIdErrors, DeleteSearchProvidersByIdResponses, GetBotsByBotIdCliStreamData, GetBotsByBotIdCliStreamError, GetBotsByBotIdCliStreamErrors, GetBotsByBotIdCliStreamResponse, GetBotsByBotIdCliStreamResponses, GetBotsByBotIdContainerData, GetBotsByBotIdContainerError, GetBotsByBotIdContainerErrors, GetBotsByBotIdContainerFsData, GetBotsByBotIdContainerFsDownloadData, GetBotsByBotIdContainerFsDownloadError, GetBotsByBotIdContainerFsDownloadErrors, GetBotsByBotIdContainerFsDownloadResponses, GetBotsByBotIdContainerFsError, GetBotsByBotIdContainerFsErrors, GetBotsByBotIdContainerFsListData, GetBotsByBotIdContainerFsListError, GetBotsByBotIdContainerFsListErrors, GetBotsByBotIdContainerFsListResponse, GetBotsByBotIdContainerFsListResponses, GetBotsByBotIdContainerFsReadData, GetBotsByBotIdContainerFsReadError, GetBotsByBotIdContainerFsReadErrors, GetBotsByBotIdContainerFsReadResponse, GetBotsByBotIdContainerFsReadResponses, GetBotsByBotIdContainerFsResponse, GetBotsByBotIdContainerFsResponses, GetBotsByBotIdContainerResponse, GetBotsByBotIdContainerResponses, GetBotsByBotIdContainerSkillsData, GetBotsByBotIdContainerSkillsError, GetBotsByBotIdContainerSkillsErrors, GetBotsByBotIdContainerSkillsResponse, GetBotsByBotIdContainerSkillsResponses, GetBotsByBotIdContainerSnapshotsData, GetBotsByBotIdContainerSnapshotsError, GetBotsByBotIdContainerSnapshotsErrors, GetBotsByBotIdContainerSnapshotsResponse, GetBotsByBotIdContainerSnapshotsResponses, GetBotsByBotIdInboxByIdData, GetBotsByBotIdInboxByIdError, GetBotsByBotIdInboxByIdErrors, GetBotsByBotIdInboxByIdResponse, GetBotsByBotIdInboxByIdResponses, GetBotsByBotIdInboxCountData, GetBotsByBotIdInboxCountError, GetBotsByBotIdInboxCountErrors, GetBotsByBotIdInboxCountResponse, GetBotsByBotIdInboxCountResponses, GetBotsByBotIdInboxData, GetBotsByBotIdInboxError, GetBotsByBotIdInboxErrors, GetBotsByBotIdInboxResponse, GetBotsByBotIdInboxResponses, GetBotsByBotIdMcpByIdData, GetBotsByBotIdMcpByIdError, GetBotsByBotIdMcpByIdErrors, GetBotsByBotIdMcpByIdResponse, GetBotsByBotIdMcpByIdResponses, GetBotsByBotIdMcpData, GetBotsByBotIdMcpError, GetBotsByBotIdMcpErrors, GetBotsByBotIdMcpExportData, GetBotsByBotIdMcpExportError, GetBotsByBotIdMcpExportErrors, GetBotsByBotIdMcpExportResponse, GetBotsByBotIdMcpExportResponses, GetBotsByBotIdMcpResponse, GetBotsByBotIdMcpResponses, GetBotsByBotIdMemoryData, GetBotsByBotIdMemoryError, GetBotsByBotIdMemoryErrors, GetBotsByBotIdMemoryResponse, GetBotsByBotIdMemoryResponses, GetBotsByBotIdMemoryUsageData, GetBotsByBotIdMemoryUsageError, GetBotsByBotIdMemoryUsageErrors, GetBotsByBotIdMemoryUsageResponse, GetBotsByBotIdMemoryUsageResponses, GetBotsByBotIdMessagesData, GetBotsByBotIdMessagesError, GetBotsByBotIdMessagesErrors, GetBotsByBotIdMessagesResponse, GetBotsByBotIdMessagesResponses, GetBotsByBotIdScheduleByIdData, GetBotsByBotIdScheduleByIdError, GetBotsByBotIdScheduleByIdErrors, GetBotsByBotIdScheduleByIdResponse, GetBotsByBotIdScheduleByIdResponses, GetBotsByBotIdScheduleData, GetBotsByBotIdScheduleError, GetBotsByBotIdScheduleErrors, GetBotsByBotIdScheduleResponse, GetBotsByBotIdScheduleResponses, GetBotsByBotIdSettingsData, GetBotsByBotIdSettingsError, GetBotsByBotIdSettingsErrors, GetBotsByBotIdSettingsResponse, GetBotsByBotIdSettingsResponses, GetBotsByBotIdSubagentsByIdContextData, GetBotsByBotIdSubagentsByIdContextError, GetBotsByBotIdSubagentsByIdContextErrors, GetBotsByBotIdSubagentsByIdContextResponse, GetBotsByBotIdSubagentsByIdContextResponses, GetBotsByBotIdSubagentsByIdData, GetBotsByBotIdSubagentsByIdError, GetBotsByBotIdSubagentsByIdErrors, GetBotsByBotIdSubagentsByIdResponse, GetBotsByBotIdSubagentsByIdResponses, GetBotsByBotIdSubagentsByIdSkillsData, GetBotsByBotIdSubagentsByIdSkillsError, GetBotsByBotIdSubagentsByIdSkillsErrors, GetBotsByBotIdSubagentsByIdSkillsResponse, GetBotsByBotIdSubagentsByIdSkillsResponses, GetBotsByBotIdSubagentsData, GetBotsByBotIdSubagentsError, GetBotsByBotIdSubagentsErrors, GetBotsByBotIdSubagentsResponse, GetBotsByBotIdSubagentsResponses, GetBotsByBotIdWebStreamData, GetBotsByBotIdWebStreamError, GetBotsByBotIdWebStreamErrors, GetBotsByBotIdWebStreamResponse, GetBotsByBotIdWebStreamResponses, GetBotsByIdChannelByPlatformData, GetBotsByIdChannelByPlatformError, GetBotsByIdChannelByPlatformErrors, GetBotsByIdChannelByPlatformResponse, GetBotsByIdChannelByPlatformResponses, GetBotsByIdChecksData, GetBotsByIdChecksError, GetBotsByIdChecksErrors, GetBotsByIdChecksResponse, GetBotsByIdChecksResponses, GetBotsByIdData, GetBotsByIdError, GetBotsByIdErrors, GetBotsByIdMembersData, GetBotsByIdMembersError, GetBotsByIdMembersErrors, GetBotsByIdMembersResponse, GetBotsByIdMembersResponses, GetBotsByIdResponse, GetBotsByIdResponses, GetBotsData, GetBotsError, GetBotsErrors, GetBotsResponse, GetBotsResponses, GetChannelsByPlatformData, GetChannelsByPlatformError, GetChannelsByPlatformErrors, GetChannelsByPlatformResponse, GetChannelsByPlatformResponses, GetChannelsData, GetChannelsError, GetChannelsErrors, GetChannelsResponse, GetChannelsResponses, GetModelsByIdData, GetModelsByIdError, GetModelsByIdErrors, GetModelsByIdResponse, GetModelsByIdResponses, GetModelsCountData, GetModelsCountError, GetModelsCountErrors, GetModelsCountResponse, GetModelsCountResponses, GetModelsData, GetModelsError, GetModelsErrors, GetModelsModelByModelIdData, GetModelsModelByModelIdError, GetModelsModelByModelIdErrors, GetModelsModelByModelIdResponse, GetModelsModelByModelIdResponses, GetModelsResponse, GetModelsResponses, GetPingData, GetPingResponse, GetPingResponses, GetProvidersByIdData, GetProvidersByIdError, GetProvidersByIdErrors, GetProvidersByIdModelsData, GetProvidersByIdModelsError, GetProvidersByIdModelsErrors, GetProvidersByIdModelsResponse, GetProvidersByIdModelsResponses, GetProvidersByIdResponse, GetProvidersByIdResponses, GetProvidersCountData, GetProvidersCountError, GetProvidersCountErrors, GetProvidersCountResponse, GetProvidersCountResponses, GetProvidersData, GetProvidersError, GetProvidersErrors, GetProvidersNameByNameData, GetProvidersNameByNameError, GetProvidersNameByNameErrors, GetProvidersNameByNameResponse, GetProvidersNameByNameResponses, GetProvidersResponse, GetProvidersResponses, GetSearchProvidersByIdData, GetSearchProvidersByIdError, GetSearchProvidersByIdErrors, GetSearchProvidersByIdResponse, GetSearchProvidersByIdResponses, GetSearchProvidersData, GetSearchProvidersError, GetSearchProvidersErrors, GetSearchProvidersMetaData, GetSearchProvidersMetaResponse, GetSearchProvidersMetaResponses, GetSearchProvidersResponse, GetSearchProvidersResponses, GetUsersByIdData, GetUsersByIdError, GetUsersByIdErrors, GetUsersByIdResponse, GetUsersByIdResponses, GetUsersData, GetUsersError, GetUsersErrors, GetUsersMeChannelsByPlatformData, GetUsersMeChannelsByPlatformError, GetUsersMeChannelsByPlatformErrors, GetUsersMeChannelsByPlatformResponse, GetUsersMeChannelsByPlatformResponses, GetUsersMeData, GetUsersMeError, GetUsersMeErrors, GetUsersMeIdentitiesData, GetUsersMeIdentitiesError, GetUsersMeIdentitiesErrors, GetUsersMeIdentitiesResponse, GetUsersMeIdentitiesResponses, GetUsersMeResponse, GetUsersMeResponses, GetUsersResponse, GetUsersResponses, GithubComMemohaiMemohInternalMcpConnection, HandlersBatchDeleteRequest, HandlersChannelMeta, HandlersCreateContainerRequest, HandlersCreateContainerResponse, HandlersCreateSnapshotRequest, HandlersCreateSnapshotResponse, HandlersEmbeddingsInput, HandlersEmbeddingsRequest, HandlersEmbeddingsResponse, HandlersEmbeddingsUsage, HandlersErrorResponse, HandlersFsDeleteRequest, HandlersFsFileInfo, HandlersFsListResponse, HandlersFsMkdirRequest, HandlersFsOpResponse, HandlersFsReadResponse, HandlersFsRenameRequest, HandlersFsUploadResponse, HandlersFsWriteRequest, HandlersGetContainerResponse, HandlersListMyIdentitiesResponse, HandlersListSnapshotsResponse, HandlersLocalChannelMessageRequest, HandlersLoginRequest, HandlersLoginResponse, HandlersMarkReadRequest, HandlersMcpStdioRequest, HandlersMcpStdioResponse, HandlersMemoryAddPayload, HandlersMemoryCompactPayload, HandlersMemoryDeletePayload, HandlersMemorySearchPayload, HandlersPingResponse, HandlersSkillItem, HandlersSkillsDeleteRequest, HandlersSkillsOpResponse, HandlersSkillsResponse, HandlersSkillsUpsertRequest, HandlersSnapshotInfo, IdentitiesChannelIdentity, InboxCountResult, InboxCreateRequest, InboxItem, McpExportResponse, McpImportRequest, McpListResponse, McpMcpServerEntry, McpUpsertRequest, MemoryCdfPoint, MemoryCompactResult, MemoryDeleteResponse, MemoryMemoryItem, MemoryMessage, MemoryRebuildResult, MemorySearchResponse, MemoryTopKBucket, MemoryUsageResponse, MessageMessage, MessageMessageAsset, ModelsAddRequest, ModelsAddResponse, ModelsClientType, ModelsCountResponse, ModelsGetResponse, ModelsModelType, ModelsUpdateRequest, PatchBotsByIdChannelByPlatformStatusData, PatchBotsByIdChannelByPlatformStatusError, PatchBotsByIdChannelByPlatformStatusErrors, PatchBotsByIdChannelByPlatformStatusResponse, PatchBotsByIdChannelByPlatformStatusResponses, PostAuthLoginData, PostAuthLoginError, PostAuthLoginErrors, PostAuthLoginResponse, PostAuthLoginResponses, PostBotsByBotIdCliMessagesData, PostBotsByBotIdCliMessagesError, PostBotsByBotIdCliMessagesErrors, PostBotsByBotIdCliMessagesResponse, PostBotsByBotIdCliMessagesResponses, PostBotsByBotIdContainerData, PostBotsByBotIdContainerError, PostBotsByBotIdContainerErrors, PostBotsByBotIdContainerFsDeleteData, PostBotsByBotIdContainerFsDeleteError, PostBotsByBotIdContainerFsDeleteErrors, PostBotsByBotIdContainerFsDeleteResponse, PostBotsByBotIdContainerFsDeleteResponses, PostBotsByBotIdContainerFsMkdirData, PostBotsByBotIdContainerFsMkdirError, PostBotsByBotIdContainerFsMkdirErrors, PostBotsByBotIdContainerFsMkdirResponse, PostBotsByBotIdContainerFsMkdirResponses, PostBotsByBotIdContainerFsRenameData, PostBotsByBotIdContainerFsRenameError, PostBotsByBotIdContainerFsRenameErrors, PostBotsByBotIdContainerFsRenameResponse, PostBotsByBotIdContainerFsRenameResponses, PostBotsByBotIdContainerFsUploadData, PostBotsByBotIdContainerFsUploadError, PostBotsByBotIdContainerFsUploadErrors, PostBotsByBotIdContainerFsUploadResponse, PostBotsByBotIdContainerFsUploadResponses, PostBotsByBotIdContainerFsWriteData, PostBotsByBotIdContainerFsWriteError, PostBotsByBotIdContainerFsWriteErrors, PostBotsByBotIdContainerFsWriteResponse, PostBotsByBotIdContainerFsWriteResponses, PostBotsByBotIdContainerResponse, PostBotsByBotIdContainerResponses, PostBotsByBotIdContainerSkillsData, PostBotsByBotIdContainerSkillsError, PostBotsByBotIdContainerSkillsErrors, PostBotsByBotIdContainerSkillsResponse, PostBotsByBotIdContainerSkillsResponses, PostBotsByBotIdContainerSnapshotsData, PostBotsByBotIdContainerSnapshotsError, PostBotsByBotIdContainerSnapshotsErrors, PostBotsByBotIdContainerSnapshotsResponse, PostBotsByBotIdContainerSnapshotsResponses, PostBotsByBotIdContainerStartData, PostBotsByBotIdContainerStartError, PostBotsByBotIdContainerStartErrors, PostBotsByBotIdContainerStartResponse, PostBotsByBotIdContainerStartResponses, PostBotsByBotIdContainerStopData, PostBotsByBotIdContainerStopError, PostBotsByBotIdContainerStopErrors, PostBotsByBotIdContainerStopResponse, PostBotsByBotIdContainerStopResponses, PostBotsByBotIdInboxData, PostBotsByBotIdInboxError, PostBotsByBotIdInboxErrors, PostBotsByBotIdInboxMarkReadData, PostBotsByBotIdInboxMarkReadError, PostBotsByBotIdInboxMarkReadErrors, PostBotsByBotIdInboxMarkReadResponses, PostBotsByBotIdInboxResponse, PostBotsByBotIdInboxResponses, PostBotsByBotIdMcpData, PostBotsByBotIdMcpError, PostBotsByBotIdMcpErrors, PostBotsByBotIdMcpOpsBatchDeleteData, PostBotsByBotIdMcpOpsBatchDeleteError, PostBotsByBotIdMcpOpsBatchDeleteErrors, PostBotsByBotIdMcpOpsBatchDeleteResponses, PostBotsByBotIdMcpResponse, PostBotsByBotIdMcpResponses, PostBotsByBotIdMcpStdioByConnectionIdData, PostBotsByBotIdMcpStdioByConnectionIdError, PostBotsByBotIdMcpStdioByConnectionIdErrors, PostBotsByBotIdMcpStdioByConnectionIdResponse, PostBotsByBotIdMcpStdioByConnectionIdResponses, PostBotsByBotIdMcpStdioData, PostBotsByBotIdMcpStdioError, PostBotsByBotIdMcpStdioErrors, PostBotsByBotIdMcpStdioResponse, PostBotsByBotIdMcpStdioResponses, PostBotsByBotIdMemoryCompactData, PostBotsByBotIdMemoryCompactError, PostBotsByBotIdMemoryCompactErrors, PostBotsByBotIdMemoryCompactResponse, PostBotsByBotIdMemoryCompactResponses, PostBotsByBotIdMemoryData, PostBotsByBotIdMemoryError, PostBotsByBotIdMemoryErrors, PostBotsByBotIdMemoryRebuildData, PostBotsByBotIdMemoryRebuildError, PostBotsByBotIdMemoryRebuildErrors, PostBotsByBotIdMemoryRebuildResponse, PostBotsByBotIdMemoryRebuildResponses, PostBotsByBotIdMemoryResponse, PostBotsByBotIdMemoryResponses, PostBotsByBotIdMemorySearchData, PostBotsByBotIdMemorySearchError, PostBotsByBotIdMemorySearchErrors, PostBotsByBotIdMemorySearchResponse, PostBotsByBotIdMemorySearchResponses, PostBotsByBotIdScheduleData, PostBotsByBotIdScheduleError, PostBotsByBotIdScheduleErrors, PostBotsByBotIdScheduleResponse, PostBotsByBotIdScheduleResponses, PostBotsByBotIdSettingsData, PostBotsByBotIdSettingsError, PostBotsByBotIdSettingsErrors, PostBotsByBotIdSettingsResponse, PostBotsByBotIdSettingsResponses, PostBotsByBotIdSubagentsByIdSkillsData, PostBotsByBotIdSubagentsByIdSkillsError, PostBotsByBotIdSubagentsByIdSkillsErrors, PostBotsByBotIdSubagentsByIdSkillsResponse, PostBotsByBotIdSubagentsByIdSkillsResponses, PostBotsByBotIdSubagentsData, PostBotsByBotIdSubagentsError, PostBotsByBotIdSubagentsErrors, PostBotsByBotIdSubagentsResponse, PostBotsByBotIdSubagentsResponses, PostBotsByBotIdToolsData, PostBotsByBotIdToolsError, PostBotsByBotIdToolsErrors, PostBotsByBotIdToolsResponse, PostBotsByBotIdToolsResponses, PostBotsByBotIdWebMessagesData, PostBotsByBotIdWebMessagesError, PostBotsByBotIdWebMessagesErrors, PostBotsByBotIdWebMessagesResponse, PostBotsByBotIdWebMessagesResponses, PostBotsByIdChannelByPlatformSendChatData, PostBotsByIdChannelByPlatformSendChatError, PostBotsByIdChannelByPlatformSendChatErrors, PostBotsByIdChannelByPlatformSendChatResponse, PostBotsByIdChannelByPlatformSendChatResponses, PostBotsByIdChannelByPlatformSendData, PostBotsByIdChannelByPlatformSendError, PostBotsByIdChannelByPlatformSendErrors, PostBotsByIdChannelByPlatformSendResponse, PostBotsByIdChannelByPlatformSendResponses, PostBotsData, PostBotsError, PostBotsErrors, PostBotsResponse, PostBotsResponses, PostEmbeddingsData, PostEmbeddingsError, PostEmbeddingsErrors, PostEmbeddingsResponse, PostEmbeddingsResponses, PostModelsData, PostModelsError, PostModelsErrors, PostModelsResponse, PostModelsResponses, PostProvidersByIdTestData, PostProvidersByIdTestError, PostProvidersByIdTestErrors, PostProvidersByIdTestResponse, PostProvidersByIdTestResponses, PostProvidersData, PostProvidersError, PostProvidersErrors, PostProvidersResponse, PostProvidersResponses, PostSearchProvidersData, PostSearchProvidersError, PostSearchProvidersErrors, PostSearchProvidersResponse, PostSearchProvidersResponses, PostUsersData, PostUsersError, PostUsersErrors, PostUsersResponse, PostUsersResponses, ProvidersCheckResult, ProvidersCheckStatus, ProvidersCountResponse, ProvidersCreateRequest, ProvidersGetResponse, ProvidersTestResponse, ProvidersUpdateRequest, PutBotsByBotIdMcpByIdData, PutBotsByBotIdMcpByIdError, PutBotsByBotIdMcpByIdErrors, PutBotsByBotIdMcpByIdResponse, PutBotsByBotIdMcpByIdResponses, PutBotsByBotIdMcpImportData, PutBotsByBotIdMcpImportError, PutBotsByBotIdMcpImportErrors, PutBotsByBotIdMcpImportResponse, PutBotsByBotIdMcpImportResponses, PutBotsByBotIdScheduleByIdData, PutBotsByBotIdScheduleByIdError, PutBotsByBotIdScheduleByIdErrors, PutBotsByBotIdScheduleByIdResponse, PutBotsByBotIdScheduleByIdResponses, PutBotsByBotIdSettingsData, PutBotsByBotIdSettingsError, PutBotsByBotIdSettingsErrors, PutBotsByBotIdSettingsResponse, PutBotsByBotIdSettingsResponses, PutBotsByBotIdSubagentsByIdContextData, PutBotsByBotIdSubagentsByIdContextError, PutBotsByBotIdSubagentsByIdContextErrors, PutBotsByBotIdSubagentsByIdContextResponse, PutBotsByBotIdSubagentsByIdContextResponses, PutBotsByBotIdSubagentsByIdData, PutBotsByBotIdSubagentsByIdError, PutBotsByBotIdSubagentsByIdErrors, PutBotsByBotIdSubagentsByIdResponse, PutBotsByBotIdSubagentsByIdResponses, PutBotsByBotIdSubagentsByIdSkillsData, PutBotsByBotIdSubagentsByIdSkillsError, PutBotsByBotIdSubagentsByIdSkillsErrors, PutBotsByBotIdSubagentsByIdSkillsResponse, PutBotsByBotIdSubagentsByIdSkillsResponses, PutBotsByIdChannelByPlatformData, PutBotsByIdChannelByPlatformError, PutBotsByIdChannelByPlatformErrors, PutBotsByIdChannelByPlatformResponse, PutBotsByIdChannelByPlatformResponses, PutBotsByIdData, PutBotsByIdError, PutBotsByIdErrors, PutBotsByIdMembersData, PutBotsByIdMembersError, PutBotsByIdMembersErrors, PutBotsByIdMembersResponse, PutBotsByIdMembersResponses, PutBotsByIdOwnerData, PutBotsByIdOwnerError, PutBotsByIdOwnerErrors, PutBotsByIdOwnerResponse, PutBotsByIdOwnerResponses, PutBotsByIdResponse, PutBotsByIdResponses, PutModelsByIdData, PutModelsByIdError, PutModelsByIdErrors, PutModelsByIdResponse, PutModelsByIdResponses, PutModelsModelByModelIdData, PutModelsModelByModelIdError, PutModelsModelByModelIdErrors, PutModelsModelByModelIdResponse, PutModelsModelByModelIdResponses, PutProvidersByIdData, PutProvidersByIdError, PutProvidersByIdErrors, PutProvidersByIdResponse, PutProvidersByIdResponses, PutSearchProvidersByIdData, PutSearchProvidersByIdError, PutSearchProvidersByIdErrors, PutSearchProvidersByIdResponse, PutSearchProvidersByIdResponses, PutUsersByIdData, PutUsersByIdError, PutUsersByIdErrors, PutUsersByIdPasswordData, PutUsersByIdPasswordError, PutUsersByIdPasswordErrors, PutUsersByIdPasswordResponses, PutUsersByIdResponse, PutUsersByIdResponses, PutUsersMeChannelsByPlatformData, PutUsersMeChannelsByPlatformError, PutUsersMeChannelsByPlatformErrors, PutUsersMeChannelsByPlatformResponse, PutUsersMeChannelsByPlatformResponses, PutUsersMeData, PutUsersMeError, PutUsersMeErrors, PutUsersMePasswordData, PutUsersMePasswordError, PutUsersMePasswordErrors, PutUsersMePasswordResponses, PutUsersMeResponse, PutUsersMeResponses, ScheduleCreateRequest, ScheduleListResponse, ScheduleNullableInt, ScheduleSchedule, ScheduleUpdateRequest, SearchprovidersCreateRequest, SearchprovidersGetResponse, SearchprovidersProviderConfigSchema, SearchprovidersProviderFieldSchema, SearchprovidersProviderMeta, SearchprovidersProviderName, SearchprovidersUpdateRequest, SettingsSettings, SettingsUpsertRequest, SubagentAddSkillsRequest, SubagentContextResponse, SubagentCreateRequest, SubagentListResponse, SubagentSkillsResponse, SubagentSubagent, SubagentUpdateContextRequest, SubagentUpdateRequest, SubagentUpdateSkillsRequest } from './types.gen'; +export { deleteBotsByBotIdContainer, deleteBotsByBotIdContainerSkills, deleteBotsByBotIdHeartbeatLogs, deleteBotsByBotIdInboxById, deleteBotsByBotIdMcpById, deleteBotsByBotIdMemory, deleteBotsByBotIdMemoryById, deleteBotsByBotIdMessages, deleteBotsByBotIdScheduleById, deleteBotsByBotIdSettings, deleteBotsByBotIdSubagentsById, deleteBotsById, deleteBotsByIdChannelByPlatform, deleteBotsByIdMembersByUserId, deleteModelsById, deleteModelsModelByModelId, deleteProvidersById, deleteSearchProvidersById, getBots, getBotsByBotIdCliStream, getBotsByBotIdContainer, getBotsByBotIdContainerFs, getBotsByBotIdContainerFsDownload, getBotsByBotIdContainerFsList, getBotsByBotIdContainerFsRead, getBotsByBotIdContainerSkills, getBotsByBotIdContainerSnapshots, getBotsByBotIdHeartbeatLogs, getBotsByBotIdInbox, getBotsByBotIdInboxById, getBotsByBotIdInboxCount, getBotsByBotIdMcp, getBotsByBotIdMcpById, getBotsByBotIdMcpExport, getBotsByBotIdMemory, getBotsByBotIdMemoryUsage, getBotsByBotIdMessages, getBotsByBotIdSchedule, getBotsByBotIdScheduleById, getBotsByBotIdSettings, getBotsByBotIdSubagents, getBotsByBotIdSubagentsById, getBotsByBotIdSubagentsByIdContext, getBotsByBotIdSubagentsByIdSkills, getBotsByBotIdWebStream, getBotsById, getBotsByIdChannelByPlatform, getBotsByIdChecks, getBotsByIdMembers, getChannels, getChannelsByPlatform, getModels, getModelsById, getModelsCount, getModelsModelByModelId, getPing, getProviders, getProvidersById, getProvidersByIdModels, getProvidersCount, getProvidersNameByName, getSearchProviders, getSearchProvidersById, getSearchProvidersMeta, getUsers, getUsersById, getUsersMe, getUsersMeChannelsByPlatform, getUsersMeIdentities, type Options, patchBotsByIdChannelByPlatformStatus, postAuthLogin, postBots, postBotsByBotIdCliMessages, postBotsByBotIdContainer, postBotsByBotIdContainerFsDelete, postBotsByBotIdContainerFsMkdir, postBotsByBotIdContainerFsRename, postBotsByBotIdContainerFsUpload, postBotsByBotIdContainerFsWrite, postBotsByBotIdContainerSkills, postBotsByBotIdContainerSnapshots, postBotsByBotIdContainerStart, postBotsByBotIdContainerStop, postBotsByBotIdInbox, postBotsByBotIdInboxMarkRead, postBotsByBotIdMcp, postBotsByBotIdMcpOpsBatchDelete, postBotsByBotIdMcpStdio, postBotsByBotIdMcpStdioByConnectionId, postBotsByBotIdMemory, postBotsByBotIdMemoryCompact, postBotsByBotIdMemoryRebuild, postBotsByBotIdMemorySearch, postBotsByBotIdSchedule, postBotsByBotIdSettings, postBotsByBotIdSubagents, postBotsByBotIdSubagentsByIdSkills, postBotsByBotIdTools, postBotsByBotIdWebMessages, postBotsByIdChannelByPlatformSend, postBotsByIdChannelByPlatformSendChat, postEmbeddings, postModels, postProviders, postProvidersByIdTest, postSearchProviders, postUsers, putBotsByBotIdMcpById, putBotsByBotIdMcpImport, putBotsByBotIdScheduleById, putBotsByBotIdSettings, putBotsByBotIdSubagentsById, putBotsByBotIdSubagentsByIdContext, putBotsByBotIdSubagentsByIdSkills, putBotsById, putBotsByIdChannelByPlatform, putBotsByIdMembers, putBotsByIdOwner, putModelsById, putModelsModelByModelId, putProvidersById, putSearchProvidersById, putUsersById, putUsersByIdPassword, putUsersMe, putUsersMeChannelsByPlatform, putUsersMePassword } from './sdk.gen'; +export type { AccountsAccount, AccountsCreateAccountRequest, AccountsListAccountsResponse, AccountsResetPasswordRequest, AccountsUpdateAccountRequest, AccountsUpdatePasswordRequest, AccountsUpdateProfileRequest, BotsBot, BotsBotCheck, BotsBotMember, BotsCreateBotRequest, BotsListBotsResponse, BotsListChecksResponse, BotsListMembersResponse, BotsTransferBotRequest, BotsUpdateBotRequest, BotsUpsertMemberRequest, ChannelAction, ChannelAttachment, ChannelAttachmentType, ChannelChannelCapabilities, ChannelChannelConfig, ChannelChannelIdentityBinding, ChannelConfigSchema, ChannelFieldSchema, ChannelFieldType, ChannelMessage, ChannelMessageFormat, ChannelMessagePart, ChannelMessagePartType, ChannelMessageTextStyle, ChannelReplyRef, ChannelSendRequest, ChannelTargetHint, ChannelTargetSpec, ChannelThreadRef, ChannelUpdateChannelStatusRequest, ChannelUpsertChannelIdentityConfigRequest, ChannelUpsertConfigRequest, ClientOptions, DeleteBotsByBotIdContainerData, DeleteBotsByBotIdContainerError, DeleteBotsByBotIdContainerErrors, DeleteBotsByBotIdContainerResponses, DeleteBotsByBotIdContainerSkillsData, DeleteBotsByBotIdContainerSkillsError, DeleteBotsByBotIdContainerSkillsErrors, DeleteBotsByBotIdContainerSkillsResponse, DeleteBotsByBotIdContainerSkillsResponses, DeleteBotsByBotIdHeartbeatLogsData, DeleteBotsByBotIdHeartbeatLogsError, DeleteBotsByBotIdHeartbeatLogsErrors, DeleteBotsByBotIdHeartbeatLogsResponses, DeleteBotsByBotIdInboxByIdData, DeleteBotsByBotIdInboxByIdError, DeleteBotsByBotIdInboxByIdErrors, DeleteBotsByBotIdInboxByIdResponses, DeleteBotsByBotIdMcpByIdData, DeleteBotsByBotIdMcpByIdError, DeleteBotsByBotIdMcpByIdErrors, DeleteBotsByBotIdMcpByIdResponses, DeleteBotsByBotIdMemoryByIdData, DeleteBotsByBotIdMemoryByIdError, DeleteBotsByBotIdMemoryByIdErrors, DeleteBotsByBotIdMemoryByIdResponse, DeleteBotsByBotIdMemoryByIdResponses, DeleteBotsByBotIdMemoryData, DeleteBotsByBotIdMemoryError, DeleteBotsByBotIdMemoryErrors, DeleteBotsByBotIdMemoryResponse, DeleteBotsByBotIdMemoryResponses, DeleteBotsByBotIdMessagesData, DeleteBotsByBotIdMessagesError, DeleteBotsByBotIdMessagesErrors, DeleteBotsByBotIdMessagesResponses, DeleteBotsByBotIdScheduleByIdData, DeleteBotsByBotIdScheduleByIdError, DeleteBotsByBotIdScheduleByIdErrors, DeleteBotsByBotIdScheduleByIdResponses, DeleteBotsByBotIdSettingsData, DeleteBotsByBotIdSettingsError, DeleteBotsByBotIdSettingsErrors, DeleteBotsByBotIdSettingsResponses, DeleteBotsByBotIdSubagentsByIdData, DeleteBotsByBotIdSubagentsByIdError, DeleteBotsByBotIdSubagentsByIdErrors, DeleteBotsByBotIdSubagentsByIdResponses, DeleteBotsByIdChannelByPlatformData, DeleteBotsByIdChannelByPlatformError, DeleteBotsByIdChannelByPlatformErrors, DeleteBotsByIdChannelByPlatformResponses, DeleteBotsByIdData, DeleteBotsByIdError, DeleteBotsByIdErrors, DeleteBotsByIdMembersByUserIdData, DeleteBotsByIdMembersByUserIdError, DeleteBotsByIdMembersByUserIdErrors, DeleteBotsByIdMembersByUserIdResponses, DeleteBotsByIdResponse, DeleteBotsByIdResponses, DeleteModelsByIdData, DeleteModelsByIdError, DeleteModelsByIdErrors, DeleteModelsByIdResponses, DeleteModelsModelByModelIdData, DeleteModelsModelByModelIdError, DeleteModelsModelByModelIdErrors, DeleteModelsModelByModelIdResponses, DeleteProvidersByIdData, DeleteProvidersByIdError, DeleteProvidersByIdErrors, DeleteProvidersByIdResponses, DeleteSearchProvidersByIdData, DeleteSearchProvidersByIdError, DeleteSearchProvidersByIdErrors, DeleteSearchProvidersByIdResponses, GetBotsByBotIdCliStreamData, GetBotsByBotIdCliStreamError, GetBotsByBotIdCliStreamErrors, GetBotsByBotIdCliStreamResponse, GetBotsByBotIdCliStreamResponses, GetBotsByBotIdContainerData, GetBotsByBotIdContainerError, GetBotsByBotIdContainerErrors, GetBotsByBotIdContainerFsData, GetBotsByBotIdContainerFsDownloadData, GetBotsByBotIdContainerFsDownloadError, GetBotsByBotIdContainerFsDownloadErrors, GetBotsByBotIdContainerFsDownloadResponses, GetBotsByBotIdContainerFsError, GetBotsByBotIdContainerFsErrors, GetBotsByBotIdContainerFsListData, GetBotsByBotIdContainerFsListError, GetBotsByBotIdContainerFsListErrors, GetBotsByBotIdContainerFsListResponse, GetBotsByBotIdContainerFsListResponses, GetBotsByBotIdContainerFsReadData, GetBotsByBotIdContainerFsReadError, GetBotsByBotIdContainerFsReadErrors, GetBotsByBotIdContainerFsReadResponse, GetBotsByBotIdContainerFsReadResponses, GetBotsByBotIdContainerFsResponse, GetBotsByBotIdContainerFsResponses, GetBotsByBotIdContainerResponse, GetBotsByBotIdContainerResponses, GetBotsByBotIdContainerSkillsData, GetBotsByBotIdContainerSkillsError, GetBotsByBotIdContainerSkillsErrors, GetBotsByBotIdContainerSkillsResponse, GetBotsByBotIdContainerSkillsResponses, GetBotsByBotIdContainerSnapshotsData, GetBotsByBotIdContainerSnapshotsError, GetBotsByBotIdContainerSnapshotsErrors, GetBotsByBotIdContainerSnapshotsResponse, GetBotsByBotIdContainerSnapshotsResponses, GetBotsByBotIdHeartbeatLogsData, GetBotsByBotIdHeartbeatLogsError, GetBotsByBotIdHeartbeatLogsErrors, GetBotsByBotIdHeartbeatLogsResponse, GetBotsByBotIdHeartbeatLogsResponses, GetBotsByBotIdInboxByIdData, GetBotsByBotIdInboxByIdError, GetBotsByBotIdInboxByIdErrors, GetBotsByBotIdInboxByIdResponse, GetBotsByBotIdInboxByIdResponses, GetBotsByBotIdInboxCountData, GetBotsByBotIdInboxCountError, GetBotsByBotIdInboxCountErrors, GetBotsByBotIdInboxCountResponse, GetBotsByBotIdInboxCountResponses, GetBotsByBotIdInboxData, GetBotsByBotIdInboxError, GetBotsByBotIdInboxErrors, GetBotsByBotIdInboxResponse, GetBotsByBotIdInboxResponses, GetBotsByBotIdMcpByIdData, GetBotsByBotIdMcpByIdError, GetBotsByBotIdMcpByIdErrors, GetBotsByBotIdMcpByIdResponse, GetBotsByBotIdMcpByIdResponses, GetBotsByBotIdMcpData, GetBotsByBotIdMcpError, GetBotsByBotIdMcpErrors, GetBotsByBotIdMcpExportData, GetBotsByBotIdMcpExportError, GetBotsByBotIdMcpExportErrors, GetBotsByBotIdMcpExportResponse, GetBotsByBotIdMcpExportResponses, GetBotsByBotIdMcpResponse, GetBotsByBotIdMcpResponses, GetBotsByBotIdMemoryData, GetBotsByBotIdMemoryError, GetBotsByBotIdMemoryErrors, GetBotsByBotIdMemoryResponse, GetBotsByBotIdMemoryResponses, GetBotsByBotIdMemoryUsageData, GetBotsByBotIdMemoryUsageError, GetBotsByBotIdMemoryUsageErrors, GetBotsByBotIdMemoryUsageResponse, GetBotsByBotIdMemoryUsageResponses, GetBotsByBotIdMessagesData, GetBotsByBotIdMessagesError, GetBotsByBotIdMessagesErrors, GetBotsByBotIdMessagesResponse, GetBotsByBotIdMessagesResponses, GetBotsByBotIdScheduleByIdData, GetBotsByBotIdScheduleByIdError, GetBotsByBotIdScheduleByIdErrors, GetBotsByBotIdScheduleByIdResponse, GetBotsByBotIdScheduleByIdResponses, GetBotsByBotIdScheduleData, GetBotsByBotIdScheduleError, GetBotsByBotIdScheduleErrors, GetBotsByBotIdScheduleResponse, GetBotsByBotIdScheduleResponses, GetBotsByBotIdSettingsData, GetBotsByBotIdSettingsError, GetBotsByBotIdSettingsErrors, GetBotsByBotIdSettingsResponse, GetBotsByBotIdSettingsResponses, GetBotsByBotIdSubagentsByIdContextData, GetBotsByBotIdSubagentsByIdContextError, GetBotsByBotIdSubagentsByIdContextErrors, GetBotsByBotIdSubagentsByIdContextResponse, GetBotsByBotIdSubagentsByIdContextResponses, GetBotsByBotIdSubagentsByIdData, GetBotsByBotIdSubagentsByIdError, GetBotsByBotIdSubagentsByIdErrors, GetBotsByBotIdSubagentsByIdResponse, GetBotsByBotIdSubagentsByIdResponses, GetBotsByBotIdSubagentsByIdSkillsData, GetBotsByBotIdSubagentsByIdSkillsError, GetBotsByBotIdSubagentsByIdSkillsErrors, GetBotsByBotIdSubagentsByIdSkillsResponse, GetBotsByBotIdSubagentsByIdSkillsResponses, GetBotsByBotIdSubagentsData, GetBotsByBotIdSubagentsError, GetBotsByBotIdSubagentsErrors, GetBotsByBotIdSubagentsResponse, GetBotsByBotIdSubagentsResponses, GetBotsByBotIdWebStreamData, GetBotsByBotIdWebStreamError, GetBotsByBotIdWebStreamErrors, GetBotsByBotIdWebStreamResponse, GetBotsByBotIdWebStreamResponses, GetBotsByIdChannelByPlatformData, GetBotsByIdChannelByPlatformError, GetBotsByIdChannelByPlatformErrors, GetBotsByIdChannelByPlatformResponse, GetBotsByIdChannelByPlatformResponses, GetBotsByIdChecksData, GetBotsByIdChecksError, GetBotsByIdChecksErrors, GetBotsByIdChecksResponse, GetBotsByIdChecksResponses, GetBotsByIdData, GetBotsByIdError, GetBotsByIdErrors, GetBotsByIdMembersData, GetBotsByIdMembersError, GetBotsByIdMembersErrors, GetBotsByIdMembersResponse, GetBotsByIdMembersResponses, GetBotsByIdResponse, GetBotsByIdResponses, GetBotsData, GetBotsError, GetBotsErrors, GetBotsResponse, GetBotsResponses, GetChannelsByPlatformData, GetChannelsByPlatformError, GetChannelsByPlatformErrors, GetChannelsByPlatformResponse, GetChannelsByPlatformResponses, GetChannelsData, GetChannelsError, GetChannelsErrors, GetChannelsResponse, GetChannelsResponses, GetModelsByIdData, GetModelsByIdError, GetModelsByIdErrors, GetModelsByIdResponse, GetModelsByIdResponses, GetModelsCountData, GetModelsCountError, GetModelsCountErrors, GetModelsCountResponse, GetModelsCountResponses, GetModelsData, GetModelsError, GetModelsErrors, GetModelsModelByModelIdData, GetModelsModelByModelIdError, GetModelsModelByModelIdErrors, GetModelsModelByModelIdResponse, GetModelsModelByModelIdResponses, GetModelsResponse, GetModelsResponses, GetPingData, GetPingResponse, GetPingResponses, GetProvidersByIdData, GetProvidersByIdError, GetProvidersByIdErrors, GetProvidersByIdModelsData, GetProvidersByIdModelsError, GetProvidersByIdModelsErrors, GetProvidersByIdModelsResponse, GetProvidersByIdModelsResponses, GetProvidersByIdResponse, GetProvidersByIdResponses, GetProvidersCountData, GetProvidersCountError, GetProvidersCountErrors, GetProvidersCountResponse, GetProvidersCountResponses, GetProvidersData, GetProvidersError, GetProvidersErrors, GetProvidersNameByNameData, GetProvidersNameByNameError, GetProvidersNameByNameErrors, GetProvidersNameByNameResponse, GetProvidersNameByNameResponses, GetProvidersResponse, GetProvidersResponses, GetSearchProvidersByIdData, GetSearchProvidersByIdError, GetSearchProvidersByIdErrors, GetSearchProvidersByIdResponse, GetSearchProvidersByIdResponses, GetSearchProvidersData, GetSearchProvidersError, GetSearchProvidersErrors, GetSearchProvidersMetaData, GetSearchProvidersMetaResponse, GetSearchProvidersMetaResponses, GetSearchProvidersResponse, GetSearchProvidersResponses, GetUsersByIdData, GetUsersByIdError, GetUsersByIdErrors, GetUsersByIdResponse, GetUsersByIdResponses, GetUsersData, GetUsersError, GetUsersErrors, GetUsersMeChannelsByPlatformData, GetUsersMeChannelsByPlatformError, GetUsersMeChannelsByPlatformErrors, GetUsersMeChannelsByPlatformResponse, GetUsersMeChannelsByPlatformResponses, GetUsersMeData, GetUsersMeError, GetUsersMeErrors, GetUsersMeIdentitiesData, GetUsersMeIdentitiesError, GetUsersMeIdentitiesErrors, GetUsersMeIdentitiesResponse, GetUsersMeIdentitiesResponses, GetUsersMeResponse, GetUsersMeResponses, GetUsersResponse, GetUsersResponses, GithubComMemohaiMemohInternalMcpConnection, HandlersBatchDeleteRequest, HandlersChannelMeta, HandlersCreateContainerRequest, HandlersCreateContainerResponse, HandlersCreateSnapshotRequest, HandlersCreateSnapshotResponse, HandlersEmbeddingsInput, HandlersEmbeddingsRequest, HandlersEmbeddingsResponse, HandlersEmbeddingsUsage, HandlersErrorResponse, HandlersFsDeleteRequest, HandlersFsFileInfo, HandlersFsListResponse, HandlersFsMkdirRequest, HandlersFsOpResponse, HandlersFsReadResponse, HandlersFsRenameRequest, HandlersFsUploadResponse, HandlersFsWriteRequest, HandlersGetContainerResponse, HandlersListMyIdentitiesResponse, HandlersListSnapshotsResponse, HandlersLocalChannelMessageRequest, HandlersLoginRequest, HandlersLoginResponse, HandlersMarkReadRequest, HandlersMcpStdioRequest, HandlersMcpStdioResponse, HandlersMemoryAddPayload, HandlersMemoryCompactPayload, HandlersMemoryDeletePayload, HandlersMemorySearchPayload, HandlersPingResponse, HandlersSkillItem, HandlersSkillsDeleteRequest, HandlersSkillsOpResponse, HandlersSkillsResponse, HandlersSkillsUpsertRequest, HandlersSnapshotInfo, HeartbeatListLogsResponse, HeartbeatLog, IdentitiesChannelIdentity, InboxCountResult, InboxCreateRequest, InboxItem, McpExportResponse, McpImportRequest, McpListResponse, McpMcpServerEntry, McpUpsertRequest, MemoryCdfPoint, MemoryCompactResult, MemoryDeleteResponse, MemoryMemoryItem, MemoryMessage, MemoryRebuildResult, MemorySearchResponse, MemoryTopKBucket, MemoryUsageResponse, MessageMessage, MessageMessageAsset, ModelsAddRequest, ModelsAddResponse, ModelsClientType, ModelsCountResponse, ModelsGetResponse, ModelsModelType, ModelsUpdateRequest, PatchBotsByIdChannelByPlatformStatusData, PatchBotsByIdChannelByPlatformStatusError, PatchBotsByIdChannelByPlatformStatusErrors, PatchBotsByIdChannelByPlatformStatusResponse, PatchBotsByIdChannelByPlatformStatusResponses, PostAuthLoginData, PostAuthLoginError, PostAuthLoginErrors, PostAuthLoginResponse, PostAuthLoginResponses, PostBotsByBotIdCliMessagesData, PostBotsByBotIdCliMessagesError, PostBotsByBotIdCliMessagesErrors, PostBotsByBotIdCliMessagesResponse, PostBotsByBotIdCliMessagesResponses, PostBotsByBotIdContainerData, PostBotsByBotIdContainerError, PostBotsByBotIdContainerErrors, PostBotsByBotIdContainerFsDeleteData, PostBotsByBotIdContainerFsDeleteError, PostBotsByBotIdContainerFsDeleteErrors, PostBotsByBotIdContainerFsDeleteResponse, PostBotsByBotIdContainerFsDeleteResponses, PostBotsByBotIdContainerFsMkdirData, PostBotsByBotIdContainerFsMkdirError, PostBotsByBotIdContainerFsMkdirErrors, PostBotsByBotIdContainerFsMkdirResponse, PostBotsByBotIdContainerFsMkdirResponses, PostBotsByBotIdContainerFsRenameData, PostBotsByBotIdContainerFsRenameError, PostBotsByBotIdContainerFsRenameErrors, PostBotsByBotIdContainerFsRenameResponse, PostBotsByBotIdContainerFsRenameResponses, PostBotsByBotIdContainerFsUploadData, PostBotsByBotIdContainerFsUploadError, PostBotsByBotIdContainerFsUploadErrors, PostBotsByBotIdContainerFsUploadResponse, PostBotsByBotIdContainerFsUploadResponses, PostBotsByBotIdContainerFsWriteData, PostBotsByBotIdContainerFsWriteError, PostBotsByBotIdContainerFsWriteErrors, PostBotsByBotIdContainerFsWriteResponse, PostBotsByBotIdContainerFsWriteResponses, PostBotsByBotIdContainerResponse, PostBotsByBotIdContainerResponses, PostBotsByBotIdContainerSkillsData, PostBotsByBotIdContainerSkillsError, PostBotsByBotIdContainerSkillsErrors, PostBotsByBotIdContainerSkillsResponse, PostBotsByBotIdContainerSkillsResponses, PostBotsByBotIdContainerSnapshotsData, PostBotsByBotIdContainerSnapshotsError, PostBotsByBotIdContainerSnapshotsErrors, PostBotsByBotIdContainerSnapshotsResponse, PostBotsByBotIdContainerSnapshotsResponses, PostBotsByBotIdContainerStartData, PostBotsByBotIdContainerStartError, PostBotsByBotIdContainerStartErrors, PostBotsByBotIdContainerStartResponse, PostBotsByBotIdContainerStartResponses, PostBotsByBotIdContainerStopData, PostBotsByBotIdContainerStopError, PostBotsByBotIdContainerStopErrors, PostBotsByBotIdContainerStopResponse, PostBotsByBotIdContainerStopResponses, PostBotsByBotIdInboxData, PostBotsByBotIdInboxError, PostBotsByBotIdInboxErrors, PostBotsByBotIdInboxMarkReadData, PostBotsByBotIdInboxMarkReadError, PostBotsByBotIdInboxMarkReadErrors, PostBotsByBotIdInboxMarkReadResponses, PostBotsByBotIdInboxResponse, PostBotsByBotIdInboxResponses, PostBotsByBotIdMcpData, PostBotsByBotIdMcpError, PostBotsByBotIdMcpErrors, PostBotsByBotIdMcpOpsBatchDeleteData, PostBotsByBotIdMcpOpsBatchDeleteError, PostBotsByBotIdMcpOpsBatchDeleteErrors, PostBotsByBotIdMcpOpsBatchDeleteResponses, PostBotsByBotIdMcpResponse, PostBotsByBotIdMcpResponses, PostBotsByBotIdMcpStdioByConnectionIdData, PostBotsByBotIdMcpStdioByConnectionIdError, PostBotsByBotIdMcpStdioByConnectionIdErrors, PostBotsByBotIdMcpStdioByConnectionIdResponse, PostBotsByBotIdMcpStdioByConnectionIdResponses, PostBotsByBotIdMcpStdioData, PostBotsByBotIdMcpStdioError, PostBotsByBotIdMcpStdioErrors, PostBotsByBotIdMcpStdioResponse, PostBotsByBotIdMcpStdioResponses, PostBotsByBotIdMemoryCompactData, PostBotsByBotIdMemoryCompactError, PostBotsByBotIdMemoryCompactErrors, PostBotsByBotIdMemoryCompactResponse, PostBotsByBotIdMemoryCompactResponses, PostBotsByBotIdMemoryData, PostBotsByBotIdMemoryError, PostBotsByBotIdMemoryErrors, PostBotsByBotIdMemoryRebuildData, PostBotsByBotIdMemoryRebuildError, PostBotsByBotIdMemoryRebuildErrors, PostBotsByBotIdMemoryRebuildResponse, PostBotsByBotIdMemoryRebuildResponses, PostBotsByBotIdMemoryResponse, PostBotsByBotIdMemoryResponses, PostBotsByBotIdMemorySearchData, PostBotsByBotIdMemorySearchError, PostBotsByBotIdMemorySearchErrors, PostBotsByBotIdMemorySearchResponse, PostBotsByBotIdMemorySearchResponses, PostBotsByBotIdScheduleData, PostBotsByBotIdScheduleError, PostBotsByBotIdScheduleErrors, PostBotsByBotIdScheduleResponse, PostBotsByBotIdScheduleResponses, PostBotsByBotIdSettingsData, PostBotsByBotIdSettingsError, PostBotsByBotIdSettingsErrors, PostBotsByBotIdSettingsResponse, PostBotsByBotIdSettingsResponses, PostBotsByBotIdSubagentsByIdSkillsData, PostBotsByBotIdSubagentsByIdSkillsError, PostBotsByBotIdSubagentsByIdSkillsErrors, PostBotsByBotIdSubagentsByIdSkillsResponse, PostBotsByBotIdSubagentsByIdSkillsResponses, PostBotsByBotIdSubagentsData, PostBotsByBotIdSubagentsError, PostBotsByBotIdSubagentsErrors, PostBotsByBotIdSubagentsResponse, PostBotsByBotIdSubagentsResponses, PostBotsByBotIdToolsData, PostBotsByBotIdToolsError, PostBotsByBotIdToolsErrors, PostBotsByBotIdToolsResponse, PostBotsByBotIdToolsResponses, PostBotsByBotIdWebMessagesData, PostBotsByBotIdWebMessagesError, PostBotsByBotIdWebMessagesErrors, PostBotsByBotIdWebMessagesResponse, PostBotsByBotIdWebMessagesResponses, PostBotsByIdChannelByPlatformSendChatData, PostBotsByIdChannelByPlatformSendChatError, PostBotsByIdChannelByPlatformSendChatErrors, PostBotsByIdChannelByPlatformSendChatResponse, PostBotsByIdChannelByPlatformSendChatResponses, PostBotsByIdChannelByPlatformSendData, PostBotsByIdChannelByPlatformSendError, PostBotsByIdChannelByPlatformSendErrors, PostBotsByIdChannelByPlatformSendResponse, PostBotsByIdChannelByPlatformSendResponses, PostBotsData, PostBotsError, PostBotsErrors, PostBotsResponse, PostBotsResponses, PostEmbeddingsData, PostEmbeddingsError, PostEmbeddingsErrors, PostEmbeddingsResponse, PostEmbeddingsResponses, PostModelsData, PostModelsError, PostModelsErrors, PostModelsResponse, PostModelsResponses, PostProvidersByIdTestData, PostProvidersByIdTestError, PostProvidersByIdTestErrors, PostProvidersByIdTestResponse, PostProvidersByIdTestResponses, PostProvidersData, PostProvidersError, PostProvidersErrors, PostProvidersResponse, PostProvidersResponses, PostSearchProvidersData, PostSearchProvidersError, PostSearchProvidersErrors, PostSearchProvidersResponse, PostSearchProvidersResponses, PostUsersData, PostUsersError, PostUsersErrors, PostUsersResponse, PostUsersResponses, ProvidersCheckResult, ProvidersCheckStatus, ProvidersCountResponse, ProvidersCreateRequest, ProvidersGetResponse, ProvidersTestResponse, ProvidersUpdateRequest, PutBotsByBotIdMcpByIdData, PutBotsByBotIdMcpByIdError, PutBotsByBotIdMcpByIdErrors, PutBotsByBotIdMcpByIdResponse, PutBotsByBotIdMcpByIdResponses, PutBotsByBotIdMcpImportData, PutBotsByBotIdMcpImportError, PutBotsByBotIdMcpImportErrors, PutBotsByBotIdMcpImportResponse, PutBotsByBotIdMcpImportResponses, PutBotsByBotIdScheduleByIdData, PutBotsByBotIdScheduleByIdError, PutBotsByBotIdScheduleByIdErrors, PutBotsByBotIdScheduleByIdResponse, PutBotsByBotIdScheduleByIdResponses, PutBotsByBotIdSettingsData, PutBotsByBotIdSettingsError, PutBotsByBotIdSettingsErrors, PutBotsByBotIdSettingsResponse, PutBotsByBotIdSettingsResponses, PutBotsByBotIdSubagentsByIdContextData, PutBotsByBotIdSubagentsByIdContextError, PutBotsByBotIdSubagentsByIdContextErrors, PutBotsByBotIdSubagentsByIdContextResponse, PutBotsByBotIdSubagentsByIdContextResponses, PutBotsByBotIdSubagentsByIdData, PutBotsByBotIdSubagentsByIdError, PutBotsByBotIdSubagentsByIdErrors, PutBotsByBotIdSubagentsByIdResponse, PutBotsByBotIdSubagentsByIdResponses, PutBotsByBotIdSubagentsByIdSkillsData, PutBotsByBotIdSubagentsByIdSkillsError, PutBotsByBotIdSubagentsByIdSkillsErrors, PutBotsByBotIdSubagentsByIdSkillsResponse, PutBotsByBotIdSubagentsByIdSkillsResponses, PutBotsByIdChannelByPlatformData, PutBotsByIdChannelByPlatformError, PutBotsByIdChannelByPlatformErrors, PutBotsByIdChannelByPlatformResponse, PutBotsByIdChannelByPlatformResponses, PutBotsByIdData, PutBotsByIdError, PutBotsByIdErrors, PutBotsByIdMembersData, PutBotsByIdMembersError, PutBotsByIdMembersErrors, PutBotsByIdMembersResponse, PutBotsByIdMembersResponses, PutBotsByIdOwnerData, PutBotsByIdOwnerError, PutBotsByIdOwnerErrors, PutBotsByIdOwnerResponse, PutBotsByIdOwnerResponses, PutBotsByIdResponse, PutBotsByIdResponses, PutModelsByIdData, PutModelsByIdError, PutModelsByIdErrors, PutModelsByIdResponse, PutModelsByIdResponses, PutModelsModelByModelIdData, PutModelsModelByModelIdError, PutModelsModelByModelIdErrors, PutModelsModelByModelIdResponse, PutModelsModelByModelIdResponses, PutProvidersByIdData, PutProvidersByIdError, PutProvidersByIdErrors, PutProvidersByIdResponse, PutProvidersByIdResponses, PutSearchProvidersByIdData, PutSearchProvidersByIdError, PutSearchProvidersByIdErrors, PutSearchProvidersByIdResponse, PutSearchProvidersByIdResponses, PutUsersByIdData, PutUsersByIdError, PutUsersByIdErrors, PutUsersByIdPasswordData, PutUsersByIdPasswordError, PutUsersByIdPasswordErrors, PutUsersByIdPasswordResponses, PutUsersByIdResponse, PutUsersByIdResponses, PutUsersMeChannelsByPlatformData, PutUsersMeChannelsByPlatformError, PutUsersMeChannelsByPlatformErrors, PutUsersMeChannelsByPlatformResponse, PutUsersMeChannelsByPlatformResponses, PutUsersMeData, PutUsersMeError, PutUsersMeErrors, PutUsersMePasswordData, PutUsersMePasswordError, PutUsersMePasswordErrors, PutUsersMePasswordResponses, PutUsersMeResponse, PutUsersMeResponses, ScheduleCreateRequest, ScheduleListResponse, ScheduleNullableInt, ScheduleSchedule, ScheduleUpdateRequest, SearchprovidersCreateRequest, SearchprovidersGetResponse, SearchprovidersProviderConfigSchema, SearchprovidersProviderFieldSchema, SearchprovidersProviderMeta, SearchprovidersProviderName, SearchprovidersUpdateRequest, SettingsSettings, SettingsUpsertRequest, SubagentAddSkillsRequest, SubagentContextResponse, SubagentCreateRequest, SubagentListResponse, SubagentSkillsResponse, SubagentSubagent, SubagentUpdateContextRequest, SubagentUpdateRequest, SubagentUpdateSkillsRequest } from './types.gen'; diff --git a/packages/sdk/src/sdk.gen.ts b/packages/sdk/src/sdk.gen.ts index 097eb590..61ab4764 100644 --- a/packages/sdk/src/sdk.gen.ts +++ b/packages/sdk/src/sdk.gen.ts @@ -2,7 +2,7 @@ import { type Client, formDataBodySerializer, type Options as Options2, type TDataShape } from './client'; import { client } from './client.gen'; -import type { DeleteBotsByBotIdContainerData, DeleteBotsByBotIdContainerErrors, DeleteBotsByBotIdContainerResponses, DeleteBotsByBotIdContainerSkillsData, DeleteBotsByBotIdContainerSkillsErrors, DeleteBotsByBotIdContainerSkillsResponses, DeleteBotsByBotIdInboxByIdData, DeleteBotsByBotIdInboxByIdErrors, DeleteBotsByBotIdInboxByIdResponses, DeleteBotsByBotIdMcpByIdData, DeleteBotsByBotIdMcpByIdErrors, DeleteBotsByBotIdMcpByIdResponses, DeleteBotsByBotIdMemoryByIdData, DeleteBotsByBotIdMemoryByIdErrors, DeleteBotsByBotIdMemoryByIdResponses, DeleteBotsByBotIdMemoryData, DeleteBotsByBotIdMemoryErrors, DeleteBotsByBotIdMemoryResponses, DeleteBotsByBotIdMessagesData, DeleteBotsByBotIdMessagesErrors, DeleteBotsByBotIdMessagesResponses, DeleteBotsByBotIdScheduleByIdData, DeleteBotsByBotIdScheduleByIdErrors, DeleteBotsByBotIdScheduleByIdResponses, DeleteBotsByBotIdSettingsData, DeleteBotsByBotIdSettingsErrors, DeleteBotsByBotIdSettingsResponses, DeleteBotsByBotIdSubagentsByIdData, DeleteBotsByBotIdSubagentsByIdErrors, DeleteBotsByBotIdSubagentsByIdResponses, DeleteBotsByIdChannelByPlatformData, DeleteBotsByIdChannelByPlatformErrors, DeleteBotsByIdChannelByPlatformResponses, DeleteBotsByIdData, DeleteBotsByIdErrors, DeleteBotsByIdMembersByUserIdData, DeleteBotsByIdMembersByUserIdErrors, DeleteBotsByIdMembersByUserIdResponses, DeleteBotsByIdResponses, DeleteModelsByIdData, DeleteModelsByIdErrors, DeleteModelsByIdResponses, DeleteModelsModelByModelIdData, DeleteModelsModelByModelIdErrors, DeleteModelsModelByModelIdResponses, DeleteProvidersByIdData, DeleteProvidersByIdErrors, DeleteProvidersByIdResponses, DeleteSearchProvidersByIdData, DeleteSearchProvidersByIdErrors, DeleteSearchProvidersByIdResponses, GetBotsByBotIdCliStreamData, GetBotsByBotIdCliStreamErrors, GetBotsByBotIdCliStreamResponses, GetBotsByBotIdContainerData, GetBotsByBotIdContainerErrors, GetBotsByBotIdContainerFsData, GetBotsByBotIdContainerFsDownloadData, GetBotsByBotIdContainerFsDownloadErrors, GetBotsByBotIdContainerFsDownloadResponses, GetBotsByBotIdContainerFsErrors, GetBotsByBotIdContainerFsListData, GetBotsByBotIdContainerFsListErrors, GetBotsByBotIdContainerFsListResponses, GetBotsByBotIdContainerFsReadData, GetBotsByBotIdContainerFsReadErrors, GetBotsByBotIdContainerFsReadResponses, GetBotsByBotIdContainerFsResponses, GetBotsByBotIdContainerResponses, GetBotsByBotIdContainerSkillsData, GetBotsByBotIdContainerSkillsErrors, GetBotsByBotIdContainerSkillsResponses, GetBotsByBotIdContainerSnapshotsData, GetBotsByBotIdContainerSnapshotsErrors, GetBotsByBotIdContainerSnapshotsResponses, GetBotsByBotIdInboxByIdData, GetBotsByBotIdInboxByIdErrors, GetBotsByBotIdInboxByIdResponses, GetBotsByBotIdInboxCountData, GetBotsByBotIdInboxCountErrors, GetBotsByBotIdInboxCountResponses, GetBotsByBotIdInboxData, GetBotsByBotIdInboxErrors, GetBotsByBotIdInboxResponses, GetBotsByBotIdMcpByIdData, GetBotsByBotIdMcpByIdErrors, GetBotsByBotIdMcpByIdResponses, GetBotsByBotIdMcpData, GetBotsByBotIdMcpErrors, GetBotsByBotIdMcpExportData, GetBotsByBotIdMcpExportErrors, GetBotsByBotIdMcpExportResponses, GetBotsByBotIdMcpResponses, GetBotsByBotIdMemoryData, GetBotsByBotIdMemoryErrors, GetBotsByBotIdMemoryResponses, GetBotsByBotIdMemoryUsageData, GetBotsByBotIdMemoryUsageErrors, GetBotsByBotIdMemoryUsageResponses, GetBotsByBotIdMessagesData, GetBotsByBotIdMessagesErrors, GetBotsByBotIdMessagesResponses, GetBotsByBotIdScheduleByIdData, GetBotsByBotIdScheduleByIdErrors, GetBotsByBotIdScheduleByIdResponses, GetBotsByBotIdScheduleData, GetBotsByBotIdScheduleErrors, GetBotsByBotIdScheduleResponses, GetBotsByBotIdSettingsData, GetBotsByBotIdSettingsErrors, GetBotsByBotIdSettingsResponses, GetBotsByBotIdSubagentsByIdContextData, GetBotsByBotIdSubagentsByIdContextErrors, GetBotsByBotIdSubagentsByIdContextResponses, GetBotsByBotIdSubagentsByIdData, GetBotsByBotIdSubagentsByIdErrors, GetBotsByBotIdSubagentsByIdResponses, GetBotsByBotIdSubagentsByIdSkillsData, GetBotsByBotIdSubagentsByIdSkillsErrors, GetBotsByBotIdSubagentsByIdSkillsResponses, GetBotsByBotIdSubagentsData, GetBotsByBotIdSubagentsErrors, GetBotsByBotIdSubagentsResponses, GetBotsByBotIdWebStreamData, GetBotsByBotIdWebStreamErrors, GetBotsByBotIdWebStreamResponses, GetBotsByIdChannelByPlatformData, GetBotsByIdChannelByPlatformErrors, GetBotsByIdChannelByPlatformResponses, GetBotsByIdChecksData, GetBotsByIdChecksErrors, GetBotsByIdChecksResponses, GetBotsByIdData, GetBotsByIdErrors, GetBotsByIdMembersData, GetBotsByIdMembersErrors, GetBotsByIdMembersResponses, GetBotsByIdResponses, GetBotsData, GetBotsErrors, GetBotsResponses, GetChannelsByPlatformData, GetChannelsByPlatformErrors, GetChannelsByPlatformResponses, GetChannelsData, GetChannelsErrors, GetChannelsResponses, GetModelsByIdData, GetModelsByIdErrors, GetModelsByIdResponses, GetModelsCountData, GetModelsCountErrors, GetModelsCountResponses, GetModelsData, GetModelsErrors, GetModelsModelByModelIdData, GetModelsModelByModelIdErrors, GetModelsModelByModelIdResponses, GetModelsResponses, GetPingData, GetPingResponses, GetProvidersByIdData, GetProvidersByIdErrors, GetProvidersByIdModelsData, GetProvidersByIdModelsErrors, GetProvidersByIdModelsResponses, GetProvidersByIdResponses, GetProvidersCountData, GetProvidersCountErrors, GetProvidersCountResponses, GetProvidersData, GetProvidersErrors, GetProvidersNameByNameData, GetProvidersNameByNameErrors, GetProvidersNameByNameResponses, GetProvidersResponses, GetSearchProvidersByIdData, GetSearchProvidersByIdErrors, GetSearchProvidersByIdResponses, GetSearchProvidersData, GetSearchProvidersErrors, GetSearchProvidersMetaData, GetSearchProvidersMetaResponses, GetSearchProvidersResponses, GetUsersByIdData, GetUsersByIdErrors, GetUsersByIdResponses, GetUsersData, GetUsersErrors, GetUsersMeChannelsByPlatformData, GetUsersMeChannelsByPlatformErrors, GetUsersMeChannelsByPlatformResponses, GetUsersMeData, GetUsersMeErrors, GetUsersMeIdentitiesData, GetUsersMeIdentitiesErrors, GetUsersMeIdentitiesResponses, GetUsersMeResponses, GetUsersResponses, PatchBotsByIdChannelByPlatformStatusData, PatchBotsByIdChannelByPlatformStatusErrors, PatchBotsByIdChannelByPlatformStatusResponses, PostAuthLoginData, PostAuthLoginErrors, PostAuthLoginResponses, PostBotsByBotIdCliMessagesData, PostBotsByBotIdCliMessagesErrors, PostBotsByBotIdCliMessagesResponses, PostBotsByBotIdContainerData, PostBotsByBotIdContainerErrors, PostBotsByBotIdContainerFsDeleteData, PostBotsByBotIdContainerFsDeleteErrors, PostBotsByBotIdContainerFsDeleteResponses, PostBotsByBotIdContainerFsMkdirData, PostBotsByBotIdContainerFsMkdirErrors, PostBotsByBotIdContainerFsMkdirResponses, PostBotsByBotIdContainerFsRenameData, PostBotsByBotIdContainerFsRenameErrors, PostBotsByBotIdContainerFsRenameResponses, PostBotsByBotIdContainerFsUploadData, PostBotsByBotIdContainerFsUploadErrors, PostBotsByBotIdContainerFsUploadResponses, PostBotsByBotIdContainerFsWriteData, PostBotsByBotIdContainerFsWriteErrors, PostBotsByBotIdContainerFsWriteResponses, PostBotsByBotIdContainerResponses, PostBotsByBotIdContainerSkillsData, PostBotsByBotIdContainerSkillsErrors, PostBotsByBotIdContainerSkillsResponses, PostBotsByBotIdContainerSnapshotsData, PostBotsByBotIdContainerSnapshotsErrors, PostBotsByBotIdContainerSnapshotsResponses, PostBotsByBotIdContainerStartData, PostBotsByBotIdContainerStartErrors, PostBotsByBotIdContainerStartResponses, PostBotsByBotIdContainerStopData, PostBotsByBotIdContainerStopErrors, PostBotsByBotIdContainerStopResponses, PostBotsByBotIdInboxData, PostBotsByBotIdInboxErrors, PostBotsByBotIdInboxMarkReadData, PostBotsByBotIdInboxMarkReadErrors, PostBotsByBotIdInboxMarkReadResponses, PostBotsByBotIdInboxResponses, PostBotsByBotIdMcpData, PostBotsByBotIdMcpErrors, PostBotsByBotIdMcpOpsBatchDeleteData, PostBotsByBotIdMcpOpsBatchDeleteErrors, PostBotsByBotIdMcpOpsBatchDeleteResponses, PostBotsByBotIdMcpResponses, PostBotsByBotIdMcpStdioByConnectionIdData, PostBotsByBotIdMcpStdioByConnectionIdErrors, PostBotsByBotIdMcpStdioByConnectionIdResponses, PostBotsByBotIdMcpStdioData, PostBotsByBotIdMcpStdioErrors, PostBotsByBotIdMcpStdioResponses, PostBotsByBotIdMemoryCompactData, PostBotsByBotIdMemoryCompactErrors, PostBotsByBotIdMemoryCompactResponses, PostBotsByBotIdMemoryData, PostBotsByBotIdMemoryErrors, PostBotsByBotIdMemoryRebuildData, PostBotsByBotIdMemoryRebuildErrors, PostBotsByBotIdMemoryRebuildResponses, PostBotsByBotIdMemoryResponses, PostBotsByBotIdMemorySearchData, PostBotsByBotIdMemorySearchErrors, PostBotsByBotIdMemorySearchResponses, PostBotsByBotIdScheduleData, PostBotsByBotIdScheduleErrors, PostBotsByBotIdScheduleResponses, PostBotsByBotIdSettingsData, PostBotsByBotIdSettingsErrors, PostBotsByBotIdSettingsResponses, PostBotsByBotIdSubagentsByIdSkillsData, PostBotsByBotIdSubagentsByIdSkillsErrors, PostBotsByBotIdSubagentsByIdSkillsResponses, PostBotsByBotIdSubagentsData, PostBotsByBotIdSubagentsErrors, PostBotsByBotIdSubagentsResponses, PostBotsByBotIdToolsData, PostBotsByBotIdToolsErrors, PostBotsByBotIdToolsResponses, PostBotsByBotIdWebMessagesData, PostBotsByBotIdWebMessagesErrors, PostBotsByBotIdWebMessagesResponses, PostBotsByIdChannelByPlatformSendChatData, PostBotsByIdChannelByPlatformSendChatErrors, PostBotsByIdChannelByPlatformSendChatResponses, PostBotsByIdChannelByPlatformSendData, PostBotsByIdChannelByPlatformSendErrors, PostBotsByIdChannelByPlatformSendResponses, PostBotsData, PostBotsErrors, PostBotsResponses, PostEmbeddingsData, PostEmbeddingsErrors, PostEmbeddingsResponses, PostModelsData, PostModelsErrors, PostModelsResponses, PostProvidersByIdTestData, PostProvidersByIdTestErrors, PostProvidersByIdTestResponses, PostProvidersData, PostProvidersErrors, PostProvidersResponses, PostSearchProvidersData, PostSearchProvidersErrors, PostSearchProvidersResponses, PostUsersData, PostUsersErrors, PostUsersResponses, PutBotsByBotIdMcpByIdData, PutBotsByBotIdMcpByIdErrors, PutBotsByBotIdMcpByIdResponses, PutBotsByBotIdMcpImportData, PutBotsByBotIdMcpImportErrors, PutBotsByBotIdMcpImportResponses, PutBotsByBotIdScheduleByIdData, PutBotsByBotIdScheduleByIdErrors, PutBotsByBotIdScheduleByIdResponses, PutBotsByBotIdSettingsData, PutBotsByBotIdSettingsErrors, PutBotsByBotIdSettingsResponses, PutBotsByBotIdSubagentsByIdContextData, PutBotsByBotIdSubagentsByIdContextErrors, PutBotsByBotIdSubagentsByIdContextResponses, PutBotsByBotIdSubagentsByIdData, PutBotsByBotIdSubagentsByIdErrors, PutBotsByBotIdSubagentsByIdResponses, PutBotsByBotIdSubagentsByIdSkillsData, PutBotsByBotIdSubagentsByIdSkillsErrors, PutBotsByBotIdSubagentsByIdSkillsResponses, PutBotsByIdChannelByPlatformData, PutBotsByIdChannelByPlatformErrors, PutBotsByIdChannelByPlatformResponses, PutBotsByIdData, PutBotsByIdErrors, PutBotsByIdMembersData, PutBotsByIdMembersErrors, PutBotsByIdMembersResponses, PutBotsByIdOwnerData, PutBotsByIdOwnerErrors, PutBotsByIdOwnerResponses, PutBotsByIdResponses, PutModelsByIdData, PutModelsByIdErrors, PutModelsByIdResponses, PutModelsModelByModelIdData, PutModelsModelByModelIdErrors, PutModelsModelByModelIdResponses, PutProvidersByIdData, PutProvidersByIdErrors, PutProvidersByIdResponses, PutSearchProvidersByIdData, PutSearchProvidersByIdErrors, PutSearchProvidersByIdResponses, PutUsersByIdData, PutUsersByIdErrors, PutUsersByIdPasswordData, PutUsersByIdPasswordErrors, PutUsersByIdPasswordResponses, PutUsersByIdResponses, PutUsersMeChannelsByPlatformData, PutUsersMeChannelsByPlatformErrors, PutUsersMeChannelsByPlatformResponses, PutUsersMeData, PutUsersMeErrors, PutUsersMePasswordData, PutUsersMePasswordErrors, PutUsersMePasswordResponses, PutUsersMeResponses } from './types.gen'; +import type { DeleteBotsByBotIdContainerData, DeleteBotsByBotIdContainerErrors, DeleteBotsByBotIdContainerResponses, DeleteBotsByBotIdContainerSkillsData, DeleteBotsByBotIdContainerSkillsErrors, DeleteBotsByBotIdContainerSkillsResponses, DeleteBotsByBotIdHeartbeatLogsData, DeleteBotsByBotIdHeartbeatLogsErrors, DeleteBotsByBotIdHeartbeatLogsResponses, DeleteBotsByBotIdInboxByIdData, DeleteBotsByBotIdInboxByIdErrors, DeleteBotsByBotIdInboxByIdResponses, DeleteBotsByBotIdMcpByIdData, DeleteBotsByBotIdMcpByIdErrors, DeleteBotsByBotIdMcpByIdResponses, DeleteBotsByBotIdMemoryByIdData, DeleteBotsByBotIdMemoryByIdErrors, DeleteBotsByBotIdMemoryByIdResponses, DeleteBotsByBotIdMemoryData, DeleteBotsByBotIdMemoryErrors, DeleteBotsByBotIdMemoryResponses, DeleteBotsByBotIdMessagesData, DeleteBotsByBotIdMessagesErrors, DeleteBotsByBotIdMessagesResponses, DeleteBotsByBotIdScheduleByIdData, DeleteBotsByBotIdScheduleByIdErrors, DeleteBotsByBotIdScheduleByIdResponses, DeleteBotsByBotIdSettingsData, DeleteBotsByBotIdSettingsErrors, DeleteBotsByBotIdSettingsResponses, DeleteBotsByBotIdSubagentsByIdData, DeleteBotsByBotIdSubagentsByIdErrors, DeleteBotsByBotIdSubagentsByIdResponses, DeleteBotsByIdChannelByPlatformData, DeleteBotsByIdChannelByPlatformErrors, DeleteBotsByIdChannelByPlatformResponses, DeleteBotsByIdData, DeleteBotsByIdErrors, DeleteBotsByIdMembersByUserIdData, DeleteBotsByIdMembersByUserIdErrors, DeleteBotsByIdMembersByUserIdResponses, DeleteBotsByIdResponses, DeleteModelsByIdData, DeleteModelsByIdErrors, DeleteModelsByIdResponses, DeleteModelsModelByModelIdData, DeleteModelsModelByModelIdErrors, DeleteModelsModelByModelIdResponses, DeleteProvidersByIdData, DeleteProvidersByIdErrors, DeleteProvidersByIdResponses, DeleteSearchProvidersByIdData, DeleteSearchProvidersByIdErrors, DeleteSearchProvidersByIdResponses, GetBotsByBotIdCliStreamData, GetBotsByBotIdCliStreamErrors, GetBotsByBotIdCliStreamResponses, GetBotsByBotIdContainerData, GetBotsByBotIdContainerErrors, GetBotsByBotIdContainerFsData, GetBotsByBotIdContainerFsDownloadData, GetBotsByBotIdContainerFsDownloadErrors, GetBotsByBotIdContainerFsDownloadResponses, GetBotsByBotIdContainerFsErrors, GetBotsByBotIdContainerFsListData, GetBotsByBotIdContainerFsListErrors, GetBotsByBotIdContainerFsListResponses, GetBotsByBotIdContainerFsReadData, GetBotsByBotIdContainerFsReadErrors, GetBotsByBotIdContainerFsReadResponses, GetBotsByBotIdContainerFsResponses, GetBotsByBotIdContainerResponses, GetBotsByBotIdContainerSkillsData, GetBotsByBotIdContainerSkillsErrors, GetBotsByBotIdContainerSkillsResponses, GetBotsByBotIdContainerSnapshotsData, GetBotsByBotIdContainerSnapshotsErrors, GetBotsByBotIdContainerSnapshotsResponses, GetBotsByBotIdHeartbeatLogsData, GetBotsByBotIdHeartbeatLogsErrors, GetBotsByBotIdHeartbeatLogsResponses, GetBotsByBotIdInboxByIdData, GetBotsByBotIdInboxByIdErrors, GetBotsByBotIdInboxByIdResponses, GetBotsByBotIdInboxCountData, GetBotsByBotIdInboxCountErrors, GetBotsByBotIdInboxCountResponses, GetBotsByBotIdInboxData, GetBotsByBotIdInboxErrors, GetBotsByBotIdInboxResponses, GetBotsByBotIdMcpByIdData, GetBotsByBotIdMcpByIdErrors, GetBotsByBotIdMcpByIdResponses, GetBotsByBotIdMcpData, GetBotsByBotIdMcpErrors, GetBotsByBotIdMcpExportData, GetBotsByBotIdMcpExportErrors, GetBotsByBotIdMcpExportResponses, GetBotsByBotIdMcpResponses, GetBotsByBotIdMemoryData, GetBotsByBotIdMemoryErrors, GetBotsByBotIdMemoryResponses, GetBotsByBotIdMemoryUsageData, GetBotsByBotIdMemoryUsageErrors, GetBotsByBotIdMemoryUsageResponses, GetBotsByBotIdMessagesData, GetBotsByBotIdMessagesErrors, GetBotsByBotIdMessagesResponses, GetBotsByBotIdScheduleByIdData, GetBotsByBotIdScheduleByIdErrors, GetBotsByBotIdScheduleByIdResponses, GetBotsByBotIdScheduleData, GetBotsByBotIdScheduleErrors, GetBotsByBotIdScheduleResponses, GetBotsByBotIdSettingsData, GetBotsByBotIdSettingsErrors, GetBotsByBotIdSettingsResponses, GetBotsByBotIdSubagentsByIdContextData, GetBotsByBotIdSubagentsByIdContextErrors, GetBotsByBotIdSubagentsByIdContextResponses, GetBotsByBotIdSubagentsByIdData, GetBotsByBotIdSubagentsByIdErrors, GetBotsByBotIdSubagentsByIdResponses, GetBotsByBotIdSubagentsByIdSkillsData, GetBotsByBotIdSubagentsByIdSkillsErrors, GetBotsByBotIdSubagentsByIdSkillsResponses, GetBotsByBotIdSubagentsData, GetBotsByBotIdSubagentsErrors, GetBotsByBotIdSubagentsResponses, GetBotsByBotIdWebStreamData, GetBotsByBotIdWebStreamErrors, GetBotsByBotIdWebStreamResponses, GetBotsByIdChannelByPlatformData, GetBotsByIdChannelByPlatformErrors, GetBotsByIdChannelByPlatformResponses, GetBotsByIdChecksData, GetBotsByIdChecksErrors, GetBotsByIdChecksResponses, GetBotsByIdData, GetBotsByIdErrors, GetBotsByIdMembersData, GetBotsByIdMembersErrors, GetBotsByIdMembersResponses, GetBotsByIdResponses, GetBotsData, GetBotsErrors, GetBotsResponses, GetChannelsByPlatformData, GetChannelsByPlatformErrors, GetChannelsByPlatformResponses, GetChannelsData, GetChannelsErrors, GetChannelsResponses, GetModelsByIdData, GetModelsByIdErrors, GetModelsByIdResponses, GetModelsCountData, GetModelsCountErrors, GetModelsCountResponses, GetModelsData, GetModelsErrors, GetModelsModelByModelIdData, GetModelsModelByModelIdErrors, GetModelsModelByModelIdResponses, GetModelsResponses, GetPingData, GetPingResponses, GetProvidersByIdData, GetProvidersByIdErrors, GetProvidersByIdModelsData, GetProvidersByIdModelsErrors, GetProvidersByIdModelsResponses, GetProvidersByIdResponses, GetProvidersCountData, GetProvidersCountErrors, GetProvidersCountResponses, GetProvidersData, GetProvidersErrors, GetProvidersNameByNameData, GetProvidersNameByNameErrors, GetProvidersNameByNameResponses, GetProvidersResponses, GetSearchProvidersByIdData, GetSearchProvidersByIdErrors, GetSearchProvidersByIdResponses, GetSearchProvidersData, GetSearchProvidersErrors, GetSearchProvidersMetaData, GetSearchProvidersMetaResponses, GetSearchProvidersResponses, GetUsersByIdData, GetUsersByIdErrors, GetUsersByIdResponses, GetUsersData, GetUsersErrors, GetUsersMeChannelsByPlatformData, GetUsersMeChannelsByPlatformErrors, GetUsersMeChannelsByPlatformResponses, GetUsersMeData, GetUsersMeErrors, GetUsersMeIdentitiesData, GetUsersMeIdentitiesErrors, GetUsersMeIdentitiesResponses, GetUsersMeResponses, GetUsersResponses, PatchBotsByIdChannelByPlatformStatusData, PatchBotsByIdChannelByPlatformStatusErrors, PatchBotsByIdChannelByPlatformStatusResponses, PostAuthLoginData, PostAuthLoginErrors, PostAuthLoginResponses, PostBotsByBotIdCliMessagesData, PostBotsByBotIdCliMessagesErrors, PostBotsByBotIdCliMessagesResponses, PostBotsByBotIdContainerData, PostBotsByBotIdContainerErrors, PostBotsByBotIdContainerFsDeleteData, PostBotsByBotIdContainerFsDeleteErrors, PostBotsByBotIdContainerFsDeleteResponses, PostBotsByBotIdContainerFsMkdirData, PostBotsByBotIdContainerFsMkdirErrors, PostBotsByBotIdContainerFsMkdirResponses, PostBotsByBotIdContainerFsRenameData, PostBotsByBotIdContainerFsRenameErrors, PostBotsByBotIdContainerFsRenameResponses, PostBotsByBotIdContainerFsUploadData, PostBotsByBotIdContainerFsUploadErrors, PostBotsByBotIdContainerFsUploadResponses, PostBotsByBotIdContainerFsWriteData, PostBotsByBotIdContainerFsWriteErrors, PostBotsByBotIdContainerFsWriteResponses, PostBotsByBotIdContainerResponses, PostBotsByBotIdContainerSkillsData, PostBotsByBotIdContainerSkillsErrors, PostBotsByBotIdContainerSkillsResponses, PostBotsByBotIdContainerSnapshotsData, PostBotsByBotIdContainerSnapshotsErrors, PostBotsByBotIdContainerSnapshotsResponses, PostBotsByBotIdContainerStartData, PostBotsByBotIdContainerStartErrors, PostBotsByBotIdContainerStartResponses, PostBotsByBotIdContainerStopData, PostBotsByBotIdContainerStopErrors, PostBotsByBotIdContainerStopResponses, PostBotsByBotIdInboxData, PostBotsByBotIdInboxErrors, PostBotsByBotIdInboxMarkReadData, PostBotsByBotIdInboxMarkReadErrors, PostBotsByBotIdInboxMarkReadResponses, PostBotsByBotIdInboxResponses, PostBotsByBotIdMcpData, PostBotsByBotIdMcpErrors, PostBotsByBotIdMcpOpsBatchDeleteData, PostBotsByBotIdMcpOpsBatchDeleteErrors, PostBotsByBotIdMcpOpsBatchDeleteResponses, PostBotsByBotIdMcpResponses, PostBotsByBotIdMcpStdioByConnectionIdData, PostBotsByBotIdMcpStdioByConnectionIdErrors, PostBotsByBotIdMcpStdioByConnectionIdResponses, PostBotsByBotIdMcpStdioData, PostBotsByBotIdMcpStdioErrors, PostBotsByBotIdMcpStdioResponses, PostBotsByBotIdMemoryCompactData, PostBotsByBotIdMemoryCompactErrors, PostBotsByBotIdMemoryCompactResponses, PostBotsByBotIdMemoryData, PostBotsByBotIdMemoryErrors, PostBotsByBotIdMemoryRebuildData, PostBotsByBotIdMemoryRebuildErrors, PostBotsByBotIdMemoryRebuildResponses, PostBotsByBotIdMemoryResponses, PostBotsByBotIdMemorySearchData, PostBotsByBotIdMemorySearchErrors, PostBotsByBotIdMemorySearchResponses, PostBotsByBotIdScheduleData, PostBotsByBotIdScheduleErrors, PostBotsByBotIdScheduleResponses, PostBotsByBotIdSettingsData, PostBotsByBotIdSettingsErrors, PostBotsByBotIdSettingsResponses, PostBotsByBotIdSubagentsByIdSkillsData, PostBotsByBotIdSubagentsByIdSkillsErrors, PostBotsByBotIdSubagentsByIdSkillsResponses, PostBotsByBotIdSubagentsData, PostBotsByBotIdSubagentsErrors, PostBotsByBotIdSubagentsResponses, PostBotsByBotIdToolsData, PostBotsByBotIdToolsErrors, PostBotsByBotIdToolsResponses, PostBotsByBotIdWebMessagesData, PostBotsByBotIdWebMessagesErrors, PostBotsByBotIdWebMessagesResponses, PostBotsByIdChannelByPlatformSendChatData, PostBotsByIdChannelByPlatformSendChatErrors, PostBotsByIdChannelByPlatformSendChatResponses, PostBotsByIdChannelByPlatformSendData, PostBotsByIdChannelByPlatformSendErrors, PostBotsByIdChannelByPlatformSendResponses, PostBotsData, PostBotsErrors, PostBotsResponses, PostEmbeddingsData, PostEmbeddingsErrors, PostEmbeddingsResponses, PostModelsData, PostModelsErrors, PostModelsResponses, PostProvidersByIdTestData, PostProvidersByIdTestErrors, PostProvidersByIdTestResponses, PostProvidersData, PostProvidersErrors, PostProvidersResponses, PostSearchProvidersData, PostSearchProvidersErrors, PostSearchProvidersResponses, PostUsersData, PostUsersErrors, PostUsersResponses, PutBotsByBotIdMcpByIdData, PutBotsByBotIdMcpByIdErrors, PutBotsByBotIdMcpByIdResponses, PutBotsByBotIdMcpImportData, PutBotsByBotIdMcpImportErrors, PutBotsByBotIdMcpImportResponses, PutBotsByBotIdScheduleByIdData, PutBotsByBotIdScheduleByIdErrors, PutBotsByBotIdScheduleByIdResponses, PutBotsByBotIdSettingsData, PutBotsByBotIdSettingsErrors, PutBotsByBotIdSettingsResponses, PutBotsByBotIdSubagentsByIdContextData, PutBotsByBotIdSubagentsByIdContextErrors, PutBotsByBotIdSubagentsByIdContextResponses, PutBotsByBotIdSubagentsByIdData, PutBotsByBotIdSubagentsByIdErrors, PutBotsByBotIdSubagentsByIdResponses, PutBotsByBotIdSubagentsByIdSkillsData, PutBotsByBotIdSubagentsByIdSkillsErrors, PutBotsByBotIdSubagentsByIdSkillsResponses, PutBotsByIdChannelByPlatformData, PutBotsByIdChannelByPlatformErrors, PutBotsByIdChannelByPlatformResponses, PutBotsByIdData, PutBotsByIdErrors, PutBotsByIdMembersData, PutBotsByIdMembersErrors, PutBotsByIdMembersResponses, PutBotsByIdOwnerData, PutBotsByIdOwnerErrors, PutBotsByIdOwnerResponses, PutBotsByIdResponses, PutModelsByIdData, PutModelsByIdErrors, PutModelsByIdResponses, PutModelsModelByModelIdData, PutModelsModelByModelIdErrors, PutModelsModelByModelIdResponses, PutProvidersByIdData, PutProvidersByIdErrors, PutProvidersByIdResponses, PutSearchProvidersByIdData, PutSearchProvidersByIdErrors, PutSearchProvidersByIdResponses, PutUsersByIdData, PutUsersByIdErrors, PutUsersByIdPasswordData, PutUsersByIdPasswordErrors, PutUsersByIdPasswordResponses, PutUsersByIdResponses, PutUsersMeChannelsByPlatformData, PutUsersMeChannelsByPlatformErrors, PutUsersMeChannelsByPlatformResponses, PutUsersMeData, PutUsersMeErrors, PutUsersMePasswordData, PutUsersMePasswordErrors, PutUsersMePasswordResponses, PutUsersMeResponses } from './types.gen'; export type Options = Options2 & { /** @@ -251,6 +251,20 @@ export const postBotsByBotIdContainerStart = (options: Options) => (options.client ?? client).post({ url: '/bots/{bot_id}/container/stop', ...options }); +/** + * Delete heartbeat logs + * + * Delete all heartbeat execution logs for a bot + */ +export const deleteBotsByBotIdHeartbeatLogs = (options: Options) => (options.client ?? client).delete({ url: '/bots/{bot_id}/heartbeat/logs', ...options }); + +/** + * List heartbeat logs + * + * List heartbeat execution logs for a bot + */ +export const getBotsByBotIdHeartbeatLogs = (options: Options) => (options.client ?? client).get({ url: '/bots/{bot_id}/heartbeat/logs', ...options }); + /** * List inbox items * diff --git a/packages/sdk/src/types.gen.ts b/packages/sdk/src/types.gen.ts index ef6013bc..083fd13f 100644 --- a/packages/sdk/src/types.gen.ts +++ b/packages/sdk/src/types.gen.ts @@ -588,6 +588,21 @@ export type HandlersSkillsOpResponse = { ok?: boolean; }; +export type HeartbeatListLogsResponse = { + items?: Array; +}; + +export type HeartbeatLog = { + bot_id?: string; + completed_at?: string; + error_message?: string; + id?: string; + result_text?: string; + started_at?: string; + status?: string; + usage?: unknown; +}; + export type IdentitiesChannelIdentity = { avatar_url?: string; channel?: string; @@ -974,6 +989,9 @@ export type SettingsSettings = { allow_guest?: boolean; chat_model_id?: string; embedding_model_id?: string; + heartbeat_enabled?: boolean; + heartbeat_interval?: number; + heartbeat_model_id?: string; language?: string; max_context_load_time?: number; max_context_tokens?: number; @@ -988,6 +1006,9 @@ export type SettingsUpsertRequest = { allow_guest?: boolean; chat_model_id?: string; embedding_model_id?: string; + heartbeat_enabled?: boolean; + heartbeat_interval?: number; + heartbeat_model_id?: string; language?: string; max_context_load_time?: number; max_context_tokens?: number; @@ -2028,6 +2049,81 @@ export type PostBotsByBotIdContainerStopResponses = { export type PostBotsByBotIdContainerStopResponse = PostBotsByBotIdContainerStopResponses[keyof PostBotsByBotIdContainerStopResponses]; +export type DeleteBotsByBotIdHeartbeatLogsData = { + body?: never; + path: { + /** + * Bot ID + */ + bot_id: string; + }; + query?: never; + url: '/bots/{bot_id}/heartbeat/logs'; +}; + +export type DeleteBotsByBotIdHeartbeatLogsErrors = { + /** + * Bad Request + */ + 400: HandlersErrorResponse; + /** + * Internal Server Error + */ + 500: HandlersErrorResponse; +}; + +export type DeleteBotsByBotIdHeartbeatLogsError = DeleteBotsByBotIdHeartbeatLogsErrors[keyof DeleteBotsByBotIdHeartbeatLogsErrors]; + +export type DeleteBotsByBotIdHeartbeatLogsResponses = { + /** + * No Content + */ + 204: unknown; +}; + +export type GetBotsByBotIdHeartbeatLogsData = { + body?: never; + path: { + /** + * Bot ID + */ + bot_id: string; + }; + query?: { + /** + * Before timestamp (RFC3339) + */ + before?: string; + /** + * Limit + */ + limit?: number; + }; + url: '/bots/{bot_id}/heartbeat/logs'; +}; + +export type GetBotsByBotIdHeartbeatLogsErrors = { + /** + * Bad Request + */ + 400: HandlersErrorResponse; + /** + * Internal Server Error + */ + 500: HandlersErrorResponse; +}; + +export type GetBotsByBotIdHeartbeatLogsError = GetBotsByBotIdHeartbeatLogsErrors[keyof GetBotsByBotIdHeartbeatLogsErrors]; + +export type GetBotsByBotIdHeartbeatLogsResponses = { + /** + * OK + */ + 200: HeartbeatListLogsResponse; +}; + +export type GetBotsByBotIdHeartbeatLogsResponse = GetBotsByBotIdHeartbeatLogsResponses[keyof GetBotsByBotIdHeartbeatLogsResponses]; + export type GetBotsByBotIdInboxData = { body?: never; path: { diff --git a/packages/web/src/i18n/locales/en.json b/packages/web/src/i18n/locales/en.json index 8272f4b8..7441c45f 100644 --- a/packages/web/src/i18n/locales/en.json +++ b/packages/web/src/i18n/locales/en.json @@ -307,6 +307,7 @@ "container": "Container", "mcp": "MCP", "subagents": "Subagents", + "heartbeat": "Heartbeat", "history": "History", "skills": "Skills", "settings": "Settings" @@ -374,6 +375,12 @@ "reasoningEffortLow": "Low", "reasoningEffortMedium": "Medium", "reasoningEffortHigh": "High", + "heartbeatEnabled": "Enable Heartbeat", + "heartbeatDescription": "Periodically trigger agent to check for items that need attention", + "heartbeatInterval": "Heartbeat Interval (minutes)", + "heartbeatModel": "Heartbeat Model", + "heartbeatModelDescription": "Select a model for heartbeat checks. Defaults to the bot's chat model if not set.", + "heartbeatModelPlaceholder": "Use chat model (default)", "allowGuest": "Allow Guest Access", "allowGuestPersonalHint": "Personal bots do not support guest access. Use a public bot instead.", "searchModel": "Search models…", @@ -464,6 +471,26 @@ "saveFailed": "Failed to save skill", "loadFailed": "Failed to load skills" }, + "heartbeat": { + "title": "Heartbeat Logs", + "loadFailed": "Failed to load heartbeat logs", + "empty": "No heartbeat logs", + "loadMore": "Load More", + "clearLogs": "Clear Logs", + "clearConfirm": "Are you sure you want to clear all heartbeat logs? This cannot be undone.", + "clearSuccess": "Heartbeat logs cleared", + "clearFailed": "Failed to clear heartbeat logs", + "status": "Status", + "time": "Time", + "duration": "Duration", + "result": "Result", + "error": "Error", + "statusOk": "OK", + "statusAlert": "Alert", + "statusError": "Error", + "filterAll": "All", + "noResult": "—" + }, "history": { "title": "History", "loadFailed": "Failed to load history", diff --git a/packages/web/src/i18n/locales/zh.json b/packages/web/src/i18n/locales/zh.json index 68da7674..1bbd5efd 100644 --- a/packages/web/src/i18n/locales/zh.json +++ b/packages/web/src/i18n/locales/zh.json @@ -303,6 +303,7 @@ "container": "容器", "mcp": "MCP", "subagents": "子智能体", + "heartbeat": "心跳", "history": "对话历史", "skills": "技能", "settings": "设置" @@ -370,6 +371,12 @@ "reasoningEffortLow": "低", "reasoningEffortMedium": "中", "reasoningEffortHigh": "高", + "heartbeatEnabled": "启用心跳", + "heartbeatDescription": "定期触发 Agent 检查是否有需要关注的事项", + "heartbeatInterval": "心跳间隔(分钟)", + "heartbeatModel": "心跳模型", + "heartbeatModelDescription": "选择心跳检查使用的模型,未设置时默认使用聊天模型。", + "heartbeatModelPlaceholder": "使用聊天模型(默认)", "allowGuest": "允许游客访问", "allowGuestPersonalHint": "个人 Bot 不支持游客访问,请使用公开 Bot。", "searchModel": "搜索模型…", @@ -460,6 +467,26 @@ "saveFailed": "保存技能失败", "loadFailed": "加载技能失败" }, + "heartbeat": { + "title": "心跳日志", + "loadFailed": "加载心跳日志失败", + "empty": "暂无心跳日志", + "loadMore": "加载更多", + "clearLogs": "清空日志", + "clearConfirm": "确定要清空所有心跳日志吗?此操作不可撤销。", + "clearSuccess": "心跳日志已清空", + "clearFailed": "清空心跳日志失败", + "status": "状态", + "time": "时间", + "duration": "耗时", + "result": "结果", + "error": "错误", + "statusOk": "正常", + "statusAlert": "告警", + "statusError": "错误", + "filterAll": "全部", + "noResult": "—" + }, "history": { "title": "对话历史", "loadFailed": "加载历史消息失败", diff --git a/packages/web/src/pages/bots/components/bot-heartbeat.vue b/packages/web/src/pages/bots/components/bot-heartbeat.vue new file mode 100644 index 00000000..2c12e2cf --- /dev/null +++ b/packages/web/src/pages/bots/components/bot-heartbeat.vue @@ -0,0 +1,448 @@ + + + diff --git a/packages/web/src/pages/bots/components/bot-settings.vue b/packages/web/src/pages/bots/components/bot-settings.vue index 33e07f18..011b17d0 100644 --- a/packages/web/src/pages/bots/components/bot-settings.vue +++ b/packages/web/src/pages/bots/components/bot-settings.vue @@ -291,7 +291,7 @@ const chatModelSupportsReasoning = computed(() => { }) // ---- Form ---- -const form = reactive({ +const form = reactive({ chat_model_id: '', memory_model_id: '', embedding_model_id: '', diff --git a/packages/web/src/pages/bots/detail.vue b/packages/web/src/pages/bots/detail.vue index 530badbf..6b1484e2 100644 --- a/packages/web/src/pages/bots/detail.vue +++ b/packages/web/src/pages/bots/detail.vue @@ -125,6 +125,9 @@ {{ $t('bots.tabs.subagents') }} + + {{ $t('bots.tabs.heartbeat') }} + {{ $t('bots.tabs.history') }} @@ -513,6 +516,12 @@ > + + +