diff --git a/db/migrations/0001_init.up.sql b/db/migrations/0001_init.up.sql index 0a316402..b0cc1fa9 100644 --- a/db/migrations/0001_init.up.sql +++ b/db/migrations/0001_init.up.sql @@ -329,6 +329,7 @@ CREATE TABLE IF NOT EXISTS snapshots ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), container_id TEXT NOT NULL REFERENCES containers(container_id) ON DELETE CASCADE, runtime_snapshot_name TEXT NOT NULL, + display_name TEXT, parent_runtime_snapshot_name TEXT, snapshotter TEXT NOT NULL, source TEXT NOT NULL, diff --git a/db/migrations/0026_snapshot_display_name.down.sql b/db/migrations/0026_snapshot_display_name.down.sql new file mode 100644 index 00000000..16484829 --- /dev/null +++ b/db/migrations/0026_snapshot_display_name.down.sql @@ -0,0 +1,5 @@ +-- 0026_snapshot_display_name (rollback) +-- Remove the user-facing display_name from snapshots. + +ALTER TABLE snapshots + DROP COLUMN IF EXISTS display_name; diff --git a/db/migrations/0026_snapshot_display_name.up.sql b/db/migrations/0026_snapshot_display_name.up.sql new file mode 100644 index 00000000..03088c4f --- /dev/null +++ b/db/migrations/0026_snapshot_display_name.up.sql @@ -0,0 +1,6 @@ +-- 0026_snapshot_display_name +-- Add user-facing display_name to snapshots while keeping runtime_snapshot_name +-- as the internal containerd identifier. + +ALTER TABLE snapshots + ADD COLUMN IF NOT EXISTS display_name TEXT; diff --git a/db/queries/snapshots.sql b/db/queries/snapshots.sql index cc9c333a..4bef3c0d 100644 --- a/db/queries/snapshots.sql +++ b/db/queries/snapshots.sql @@ -2,6 +2,7 @@ INSERT INTO snapshots ( container_id, runtime_snapshot_name, + display_name, parent_runtime_snapshot_name, snapshotter, source @@ -9,22 +10,25 @@ INSERT INTO snapshots ( VALUES ( sqlc.arg(container_id), sqlc.arg(runtime_snapshot_name), + sqlc.arg(display_name), sqlc.arg(parent_runtime_snapshot_name), sqlc.arg(snapshotter), sqlc.arg(source) ) ON CONFLICT (container_id, runtime_snapshot_name) DO UPDATE SET + display_name = EXCLUDED.display_name, parent_runtime_snapshot_name = EXCLUDED.parent_runtime_snapshot_name, snapshotter = EXCLUDED.snapshotter, source = EXCLUDED.source -RETURNING id, container_id, runtime_snapshot_name, parent_runtime_snapshot_name, snapshotter, source, created_at; +RETURNING id, container_id, runtime_snapshot_name, display_name, parent_runtime_snapshot_name, snapshotter, source, created_at; -- name: ListSnapshotsByContainerID :many SELECT id, container_id, runtime_snapshot_name, + display_name, parent_runtime_snapshot_name, snapshotter, source, @@ -38,6 +42,7 @@ SELECT s.id, s.container_id, s.runtime_snapshot_name, + s.display_name, s.parent_runtime_snapshot_name, s.snapshotter, s.source, @@ -53,6 +58,7 @@ SELECT id, container_id, runtime_snapshot_name, + display_name, parent_runtime_snapshot_name, snapshotter, source, diff --git a/db/queries/versions.sql b/db/queries/versions.sql index 89f2ced3..e9e7ffff 100644 --- a/db/queries/versions.sql +++ b/db/queries/versions.sql @@ -5,7 +5,8 @@ SELECT cv.snapshot_id, cv.version, cv.created_at, - s.runtime_snapshot_name + s.runtime_snapshot_name, + s.display_name FROM container_versions cv JOIN snapshots s ON s.id = cv.snapshot_id WHERE cv.container_id = sqlc.arg(container_id) diff --git a/internal/bots/service.go b/internal/bots/service.go index 1ae0b418..a9b462fa 100644 --- a/internal/bots/service.go +++ b/internal/bots/service.go @@ -425,7 +425,7 @@ func (s *Service) enqueueDeleteLifecycle(ctx context.Context, botID string) { defer cancel() if s.containerLifecycle != nil { - if err := s.containerLifecycle.CleanupBotContainer(lifecycleCtx, botID); err != nil { + if err := s.containerLifecycle.CleanupBotContainer(lifecycleCtx, botID, false); err != nil { s.logger.Error("bot container cleanup failed", slog.String("bot_id", botID), slog.Any("error", err), diff --git a/internal/bots/types.go b/internal/bots/types.go index 37af3f51..ef4b2a1e 100644 --- a/internal/bots/types.go +++ b/internal/bots/types.go @@ -88,7 +88,7 @@ type ListChecksResponse struct { // ContainerLifecycle handles container lifecycle events bound to bot operations. type ContainerLifecycle interface { SetupBotContainer(ctx context.Context, botID string) error - CleanupBotContainer(ctx context.Context, botID string) error + CleanupBotContainer(ctx context.Context, botID string, preserveData bool) error } // RuntimeChecker produces runtime check items for a bot. diff --git a/internal/containerd/service.go b/internal/containerd/service.go index 91113727..f4a929e0 100644 --- a/internal/containerd/service.go +++ b/internal/containerd/service.go @@ -14,6 +14,7 @@ import ( tasktypes "github.com/containerd/containerd/api/types/task" containerd "github.com/containerd/containerd/v2/client" "github.com/containerd/containerd/v2/core/images" + "github.com/containerd/containerd/v2/core/remotes/docker" "github.com/containerd/containerd/v2/core/snapshots" "github.com/containerd/containerd/v2/pkg/cio" "github.com/containerd/containerd/v2/pkg/namespaces" @@ -80,6 +81,10 @@ type Service interface { GetImage(ctx context.Context, ref string) (ImageInfo, error) ListImages(ctx context.Context) ([]ImageInfo, error) DeleteImage(ctx context.Context, ref string, opts *DeleteImageOptions) error + // ResolveRemoteDigest fetches only the manifest digest from the registry + // without downloading any layers. Returns ErrNotSupported on backends that + // have no concept of a remote registry (e.g. Apple Virtualization). + ResolveRemoteDigest(ctx context.Context, ref string) (string, error) CreateContainer(ctx context.Context, req CreateContainerRequest) (ContainerInfo, error) GetContainer(ctx context.Context, id string) (ContainerInfo, error) @@ -336,26 +341,12 @@ func (s *DefaultService) getImageWithFallback(ctx context.Context, ref string) ( if err == nil { return image, nil } + // Official Docker Hub images (e.g. "nginx:latest") may be stored under + // either "docker.io/library/nginx:latest" or the short form. Try both. if strings.HasPrefix(ref, "docker.io/library/") { - alt := strings.TrimPrefix(ref, "docker.io/library/") - image, altErr := s.client.GetImage(ctx, alt) - if altErr == nil { - return image, nil - } - } - imgs, listErr := s.client.ListImages(ctx) - if listErr == nil { - for _, img := range imgs { - name := img.Name() - if name == ref || strings.HasSuffix(ref, "/"+name) || strings.HasSuffix(name, "/"+ref) { - return img, nil - } - if strings.HasPrefix(ref, "docker.io/library/") { - alt := strings.TrimPrefix(ref, "docker.io/library/") - if name == alt || strings.HasSuffix(name, "/"+alt) { - return img, nil - } - } + short := strings.TrimPrefix(ref, "docker.io/library/") + if img, altErr := s.client.GetImage(ctx, short); altErr == nil { + return img, nil } } return nil, err @@ -744,6 +735,21 @@ func (s *DefaultService) withNamespace(ctx context.Context) context.Context { return namespaces.WithNamespace(ctx, s.namespace) } +func (*DefaultService) ResolveRemoteDigest(ctx context.Context, ref string) (string, error) { + if ref == "" { + return "", ErrInvalidArgument + } + ref = config.NormalizeImageRef(ref) + resolver := docker.NewResolver(docker.ResolverOptions{ + Hosts: docker.ConfigureDefaultRegistries(), + }) + _, desc, err := resolver.Resolve(ctx, ref) + if err != nil { + return "", err + } + return desc.Digest.String(), nil +} + func toImageInfo(img containerd.Image) ImageInfo { return ImageInfo{ Name: img.Name(), diff --git a/internal/containerd/service_apple.go b/internal/containerd/service_apple.go index 31e414c7..b3090666 100644 --- a/internal/containerd/service_apple.go +++ b/internal/containerd/service_apple.go @@ -139,6 +139,10 @@ func (s *AppleService) ListImages(ctx context.Context) ([]ImageInfo, error) { return out, nil } +func (*AppleService) ResolveRemoteDigest(_ context.Context, _ string) (string, error) { + return "", ErrNotSupported +} + func (s *AppleService) DeleteImage(ctx context.Context, ref string, _ *DeleteImageOptions) error { if ref == "" { return ErrInvalidArgument diff --git a/internal/db/sqlc/models.go b/internal/db/sqlc/models.go index 222611ee..59f7987c 100644 --- a/internal/db/sqlc/models.go +++ b/internal/db/sqlc/models.go @@ -362,6 +362,7 @@ type Snapshot struct { ID pgtype.UUID `json:"id"` ContainerID string `json:"container_id"` RuntimeSnapshotName string `json:"runtime_snapshot_name"` + DisplayName pgtype.Text `json:"display_name"` ParentRuntimeSnapshotName pgtype.Text `json:"parent_runtime_snapshot_name"` Snapshotter string `json:"snapshotter"` Source string `json:"source"` diff --git a/internal/db/sqlc/snapshots.sql.go b/internal/db/sqlc/snapshots.sql.go index 8773667e..bbe07e66 100644 --- a/internal/db/sqlc/snapshots.sql.go +++ b/internal/db/sqlc/snapshots.sql.go @@ -16,6 +16,7 @@ SELECT id, container_id, runtime_snapshot_name, + display_name, parent_runtime_snapshot_name, snapshotter, source, @@ -38,6 +39,7 @@ func (q *Queries) GetSnapshotByContainerAndRuntimeName(ctx context.Context, arg &i.ID, &i.ContainerID, &i.RuntimeSnapshotName, + &i.DisplayName, &i.ParentRuntimeSnapshotName, &i.Snapshotter, &i.Source, @@ -51,6 +53,7 @@ SELECT id, container_id, runtime_snapshot_name, + display_name, parent_runtime_snapshot_name, snapshotter, source, @@ -73,6 +76,7 @@ func (q *Queries) ListSnapshotsByContainerID(ctx context.Context, containerID st &i.ID, &i.ContainerID, &i.RuntimeSnapshotName, + &i.DisplayName, &i.ParentRuntimeSnapshotName, &i.Snapshotter, &i.Source, @@ -93,6 +97,7 @@ SELECT s.id, s.container_id, s.runtime_snapshot_name, + s.display_name, s.parent_runtime_snapshot_name, s.snapshotter, s.source, @@ -108,6 +113,7 @@ type ListSnapshotsWithVersionByContainerIDRow struct { ID pgtype.UUID `json:"id"` ContainerID string `json:"container_id"` RuntimeSnapshotName string `json:"runtime_snapshot_name"` + DisplayName pgtype.Text `json:"display_name"` ParentRuntimeSnapshotName pgtype.Text `json:"parent_runtime_snapshot_name"` Snapshotter string `json:"snapshotter"` Source string `json:"source"` @@ -128,6 +134,7 @@ func (q *Queries) ListSnapshotsWithVersionByContainerID(ctx context.Context, con &i.ID, &i.ContainerID, &i.RuntimeSnapshotName, + &i.DisplayName, &i.ParentRuntimeSnapshotName, &i.Snapshotter, &i.Source, @@ -148,6 +155,7 @@ const upsertSnapshot = `-- name: UpsertSnapshot :one INSERT INTO snapshots ( container_id, runtime_snapshot_name, + display_name, parent_runtime_snapshot_name, snapshotter, source @@ -157,19 +165,22 @@ VALUES ( $2, $3, $4, - $5 + $5, + $6 ) ON CONFLICT (container_id, runtime_snapshot_name) DO UPDATE SET + display_name = EXCLUDED.display_name, parent_runtime_snapshot_name = EXCLUDED.parent_runtime_snapshot_name, snapshotter = EXCLUDED.snapshotter, source = EXCLUDED.source -RETURNING id, container_id, runtime_snapshot_name, parent_runtime_snapshot_name, snapshotter, source, created_at +RETURNING id, container_id, runtime_snapshot_name, display_name, parent_runtime_snapshot_name, snapshotter, source, created_at ` type UpsertSnapshotParams struct { ContainerID string `json:"container_id"` RuntimeSnapshotName string `json:"runtime_snapshot_name"` + DisplayName pgtype.Text `json:"display_name"` ParentRuntimeSnapshotName pgtype.Text `json:"parent_runtime_snapshot_name"` Snapshotter string `json:"snapshotter"` Source string `json:"source"` @@ -179,6 +190,7 @@ func (q *Queries) UpsertSnapshot(ctx context.Context, arg UpsertSnapshotParams) row := q.db.QueryRow(ctx, upsertSnapshot, arg.ContainerID, arg.RuntimeSnapshotName, + arg.DisplayName, arg.ParentRuntimeSnapshotName, arg.Snapshotter, arg.Source, @@ -188,6 +200,7 @@ func (q *Queries) UpsertSnapshot(ctx context.Context, arg UpsertSnapshotParams) &i.ID, &i.ContainerID, &i.RuntimeSnapshotName, + &i.DisplayName, &i.ParentRuntimeSnapshotName, &i.Snapshotter, &i.Source, diff --git a/internal/db/sqlc/versions.sql.go b/internal/db/sqlc/versions.sql.go index 56618ef2..91d67a13 100644 --- a/internal/db/sqlc/versions.sql.go +++ b/internal/db/sqlc/versions.sql.go @@ -67,7 +67,8 @@ SELECT cv.snapshot_id, cv.version, cv.created_at, - s.runtime_snapshot_name + s.runtime_snapshot_name, + s.display_name FROM container_versions cv JOIN snapshots s ON s.id = cv.snapshot_id WHERE cv.container_id = $1 @@ -81,6 +82,7 @@ type ListVersionsByContainerIDRow struct { Version int32 `json:"version"` CreatedAt pgtype.Timestamptz `json:"created_at"` RuntimeSnapshotName string `json:"runtime_snapshot_name"` + DisplayName pgtype.Text `json:"display_name"` } func (q *Queries) ListVersionsByContainerID(ctx context.Context, containerID string) ([]ListVersionsByContainerIDRow, error) { @@ -99,6 +101,7 @@ func (q *Queries) ListVersionsByContainerID(ctx context.Context, containerID str &i.Version, &i.CreatedAt, &i.RuntimeSnapshotName, + &i.DisplayName, ); err != nil { return nil, err } diff --git a/internal/handlers/containerd.go b/internal/handlers/containerd.go index 3c580b56..188d60cc 100644 --- a/internal/handlers/containerd.go +++ b/internal/handlers/containerd.go @@ -3,6 +3,8 @@ package handlers import ( "context" "errors" + "fmt" + "io" "log/slog" "net/http" "sort" @@ -44,24 +46,32 @@ type ContainerdHandler struct { type CreateContainerRequest struct { Snapshotter string `json:"snapshotter,omitempty"` + RestoreData bool `json:"restore_data,omitempty"` } type CreateContainerResponse struct { - ContainerID string `json:"container_id"` - Image string `json:"image"` - Snapshotter string `json:"snapshotter"` - Started bool `json:"started"` + ContainerID string `json:"container_id"` + Image string `json:"image"` + Snapshotter string `json:"snapshotter"` + Started bool `json:"started"` + DataRestored bool `json:"data_restored"` + HasPreservedData bool `json:"has_preserved_data"` } type GetContainerResponse struct { - ContainerID string `json:"container_id"` - Image string `json:"image"` - Status string `json:"status"` - Namespace string `json:"namespace"` - ContainerPath string `json:"container_path"` - TaskRunning bool `json:"task_running"` - CreatedAt time.Time `json:"created_at"` - UpdatedAt time.Time `json:"updated_at"` + ContainerID string `json:"container_id"` + Image string `json:"image"` + Status string `json:"status"` + Namespace string `json:"namespace"` + ContainerPath string `json:"container_path"` + TaskRunning bool `json:"task_running"` + HasPreservedData bool `json:"has_preserved_data"` + CreatedAt time.Time `json:"created_at"` + UpdatedAt time.Time `json:"updated_at"` +} + +type RollbackRequest struct { + Version int `json:"version"` } type CreateSnapshotRequest struct { @@ -69,16 +79,20 @@ type CreateSnapshotRequest struct { } type CreateSnapshotResponse struct { - ContainerID string `json:"container_id"` - SnapshotName string `json:"snapshot_name"` - Snapshotter string `json:"snapshotter"` - Version int `json:"version"` - Source string `json:"source"` + ContainerID string `json:"container_id"` + SnapshotName string `json:"snapshot_name"` + RuntimeSnapshotName string `json:"runtime_snapshot_name"` + DisplayName string `json:"display_name"` + Snapshotter string `json:"snapshotter"` + Version int `json:"version"` + Source string `json:"source"` } type SnapshotInfo struct { Snapshotter string `json:"snapshotter"` Name string `json:"name"` + DisplayName string `json:"display_name,omitempty"` + RuntimeName string `json:"runtime_snapshot_name"` Parent string `json:"parent,omitempty"` Kind string `json:"kind"` CreatedAt time.Time `json:"created_at,omitempty"` @@ -121,6 +135,10 @@ func (h *ContainerdHandler) Register(e *echo.Echo) { group.POST("/stop", h.StopContainer) group.POST("/snapshots", h.CreateSnapshot) group.GET("/snapshots", h.ListSnapshots) + group.POST("/snapshots/rollback", h.RollbackSnapshot) + group.POST("/data/export", h.ExportContainerData) + group.POST("/data/import", h.ImportContainerData) + group.POST("/data/restore", h.RestorePreservedData) group.GET("/skills", h.ListSkills) group.POST("/skills", h.UpsertSkills) group.DELETE("/skills", h.DeleteSkills) @@ -183,13 +201,25 @@ func (h *ContainerdHandler) CreateContainer(c echo.Context) error { started = true } + dataRestored := false + if started && req.RestoreData && h.manager.HasPreservedData(botID) { + if err := h.manager.RestorePreservedData(ctx, botID); err != nil { + h.logger.Warn("restore preserved data on create failed", + slog.String("bot_id", botID), slog.Any("error", err)) + } else { + dataRestored = true + } + } + h.upsertContainerRecord(ctx, botID, containerID, map[bool]string{true: "running", false: "created"}[started]) return c.JSON(http.StatusOK, CreateContainerResponse{ - ContainerID: containerID, - Image: image, - Snapshotter: snapshotter, - Started: started, + ContainerID: containerID, + Image: image, + Snapshotter: snapshotter, + Started: started, + DataRestored: dataRestored, + HasPreservedData: h.manager.HasPreservedData(botID), }) } @@ -316,14 +346,15 @@ func (h *ContainerdHandler) GetContainer(c echo.Context) error { updatedAt = row.UpdatedAt.Time } return c.JSON(http.StatusOK, GetContainerResponse{ - ContainerID: row.ContainerID, - Image: row.Image, - Status: row.Status, - Namespace: row.Namespace, - ContainerPath: row.ContainerPath, - TaskRunning: taskRunning, - CreatedAt: createdAt, - UpdatedAt: updatedAt, + ContainerID: row.ContainerID, + Image: row.Image, + Status: row.Status, + Namespace: row.Namespace, + ContainerPath: row.ContainerPath, + TaskRunning: taskRunning, + HasPreservedData: h.manager.HasPreservedData(botID), + CreatedAt: createdAt, + UpdatedAt: updatedAt, }) } } @@ -341,13 +372,14 @@ func (h *ContainerdHandler) GetContainer(c echo.Context) error { return echo.NewHTTPError(http.StatusInternalServerError, err.Error()) } return c.JSON(http.StatusOK, GetContainerResponse{ - ContainerID: info.ID, - Image: info.Image, - Status: "unknown", - Namespace: h.namespace, - TaskRunning: h.isTaskRunning(ctx, containerID), - CreatedAt: info.CreatedAt, - UpdatedAt: info.UpdatedAt, + ContainerID: info.ID, + Image: info.Image, + Status: "unknown", + Namespace: h.namespace, + TaskRunning: h.isTaskRunning(ctx, containerID), + HasPreservedData: h.manager.HasPreservedData(botID), + CreatedAt: info.CreatedAt, + UpdatedAt: info.UpdatedAt, }) } @@ -355,6 +387,7 @@ func (h *ContainerdHandler) GetContainer(c echo.Context) error { // @Summary Delete MCP container for bot // @Tags containerd // @Param bot_id path string true "Bot ID" +// @Param preserve_data query bool false "Export /data before deletion" // @Success 204 // @Failure 404 {object} ErrorResponse // @Failure 500 {object} ErrorResponse @@ -364,7 +397,8 @@ func (h *ContainerdHandler) DeleteContainer(c echo.Context) error { if err != nil { return err } - if err := h.CleanupBotContainer(c.Request().Context(), botID); err != nil { + preserveData := c.QueryParam("preserve_data") == "true" + if err := h.CleanupBotContainer(c.Request().Context(), botID, preserveData); err != nil { return echo.NewHTTPError(http.StatusInternalServerError, err.Error()) } return c.NoContent(http.StatusNoContent) @@ -473,11 +507,13 @@ func (h *ContainerdHandler) CreateSnapshot(c echo.Context) error { return echo.NewHTTPError(http.StatusInternalServerError, err.Error()) } return c.JSON(http.StatusOK, CreateSnapshotResponse{ - ContainerID: created.ContainerID, - SnapshotName: created.SnapshotName, - Snapshotter: created.Snapshotter, - Version: created.Version, - Source: mcp.SnapshotSourceManual, + ContainerID: created.ContainerID, + SnapshotName: created.SnapshotName, + RuntimeSnapshotName: created.RuntimeSnapshotName, + DisplayName: created.DisplayName, + Snapshotter: created.Snapshotter, + Version: created.Version, + Source: mcp.SnapshotSourceManual, }) } @@ -542,16 +578,28 @@ func (h *ContainerdHandler) ListSnapshots(c echo.Context) error { source := fallbackSource managed := false var version *int + displayName := "" if meta != nil { if meta.Source != "" { source = meta.Source } managed = true version = meta.Version + displayName = strings.TrimSpace(meta.DisplayName) + } + name := displayName + if name == "" { + if version != nil { + name = fmt.Sprintf("Version %d", *version) + } else { + name = runtimeInfo.Name + } } items = append(items, SnapshotInfo{ Snapshotter: data.Snapshotter, - Name: runtimeInfo.Name, + Name: name, + DisplayName: displayName, + RuntimeName: runtimeInfo.Name, Parent: runtimeInfo.Parent, Kind: runtimeInfo.Kind, CreatedAt: runtimeInfo.Created, @@ -600,6 +648,130 @@ func (h *ContainerdHandler) ListSnapshots(c echo.Context) error { }) } +// RollbackSnapshot godoc +// @Summary Rollback container to a previous snapshot version +// @Tags containerd +// @Param bot_id path string true "Bot ID" +// @Param payload body RollbackRequest true "Rollback payload" +// @Success 200 {object} object +// @Failure 400 {object} ErrorResponse +// @Failure 500 {object} ErrorResponse +// @Router /bots/{bot_id}/container/snapshots/rollback [post]. +func (h *ContainerdHandler) RollbackSnapshot(c echo.Context) error { + botID, err := h.requireBotAccess(c) + if err != nil { + return err + } + if h.manager == nil { + return echo.NewHTTPError(http.StatusInternalServerError, "manager not configured") + } + + var req RollbackRequest + if err := c.Bind(&req); err != nil { + return echo.NewHTTPError(http.StatusBadRequest, "invalid request body") + } + if req.Version < 1 { + return echo.NewHTTPError(http.StatusBadRequest, "version must be >= 1") + } + + if err := h.manager.RollbackVersion(c.Request().Context(), botID, req.Version); err != nil { + return echo.NewHTTPError(http.StatusInternalServerError, err.Error()) + } + return c.JSON(http.StatusOK, map[string]any{"rolled_back_to": req.Version}) +} + +// ExportContainerData godoc +// @Summary Export container /data as a tar.gz archive +// @Tags containerd +// @Param bot_id path string true "Bot ID" +// @Produce application/gzip +// @Success 200 {file} file +// @Failure 500 {object} ErrorResponse +// @Router /bots/{bot_id}/container/data/export [post]. +func (h *ContainerdHandler) ExportContainerData(c echo.Context) error { + botID, err := h.requireBotAccess(c) + if err != nil { + return err + } + if h.manager == nil { + return echo.NewHTTPError(http.StatusInternalServerError, "manager not configured") + } + + reader, err := h.manager.ExportData(c.Request().Context(), botID) + if err != nil { + return echo.NewHTTPError(http.StatusInternalServerError, err.Error()) + } + defer func() { _ = reader.Close() }() + + c.Response().Header().Set("Content-Type", "application/gzip") + c.Response().Header().Set("Content-Disposition", `attachment; filename="`+botID+`-data.tar.gz"`) + c.Response().WriteHeader(http.StatusOK) + _, err = io.Copy(c.Response(), reader) + return err +} + +// ImportContainerData godoc +// @Summary Import a tar.gz archive into container /data +// @Tags containerd +// @Param bot_id path string true "Bot ID" +// @Accept multipart/form-data +// @Param file formData file true "tar.gz archive" +// @Success 200 {object} object +// @Failure 400 {object} ErrorResponse +// @Failure 500 {object} ErrorResponse +// @Router /bots/{bot_id}/container/data/import [post]. +func (h *ContainerdHandler) ImportContainerData(c echo.Context) error { + botID, err := h.requireBotAccess(c) + if err != nil { + return err + } + if h.manager == nil { + return echo.NewHTTPError(http.StatusInternalServerError, "manager not configured") + } + + file, err := c.FormFile("file") + if err != nil { + return echo.NewHTTPError(http.StatusBadRequest, "file is required") + } + src, err := file.Open() + if err != nil { + return echo.NewHTTPError(http.StatusBadRequest, "failed to open uploaded file") + } + defer func() { _ = src.Close() }() + + if err := h.manager.ImportData(c.Request().Context(), botID, src); err != nil { + return echo.NewHTTPError(http.StatusInternalServerError, err.Error()) + } + return c.JSON(http.StatusOK, map[string]bool{"imported": true}) +} + +// RestorePreservedData godoc +// @Summary Restore previously preserved data into container +// @Tags containerd +// @Param bot_id path string true "Bot ID" +// @Success 200 {object} object +// @Failure 404 {object} ErrorResponse +// @Failure 500 {object} ErrorResponse +// @Router /bots/{bot_id}/container/data/restore [post]. +func (h *ContainerdHandler) RestorePreservedData(c echo.Context) error { + botID, err := h.requireBotAccess(c) + if err != nil { + return err + } + if h.manager == nil { + return echo.NewHTTPError(http.StatusInternalServerError, "manager not configured") + } + + if !h.manager.HasPreservedData(botID) { + return echo.NewHTTPError(http.StatusNotFound, "no preserved data found") + } + + if err := h.manager.RestorePreservedData(c.Request().Context(), botID); err != nil { + return echo.NewHTTPError(http.StatusInternalServerError, err.Error()) + } + return c.JSON(http.StatusOK, map[string]bool{"restored": true}) +} + func snapshotLineage(root string, all []ctr.SnapshotInfo) ([]ctr.SnapshotInfo, bool) { root = strings.TrimSpace(root) if root == "" { @@ -704,63 +876,23 @@ func (h *ContainerdHandler) SetupBotContainer(ctx context.Context, botID string) } // CleanupBotContainer removes the containerd container and DB record for a bot. -func (h *ContainerdHandler) CleanupBotContainer(ctx context.Context, botID string) error { - h.logger.Info("CleanupBotContainer starting", slog.String("bot_id", botID)) - containerID, err := h.botContainerID(ctx, botID) - if err != nil { - h.logger.Warn("CleanupBotContainer: container not found for bot, cleaning up DB only", - slog.String("bot_id", botID), - slog.Any("error", err), - ) - if h.queries != nil { - if pgBotID, parseErr := db.ParseUUID(botID); parseErr == nil { - if dbErr := h.queries.DeleteContainerByBotID(ctx, pgBotID); dbErr != nil { - h.logger.Error("CleanupBotContainer: failed to delete DB record", - slog.String("bot_id", botID), slog.Any("error", dbErr)) - } +// When preserveData is true, /data is exported to a backup archive before +// deletion so it can be restored into a future container. +func (h *ContainerdHandler) CleanupBotContainer(ctx context.Context, botID string, preserveData bool) error { + h.logger.Info("CleanupBotContainer starting", + slog.String("bot_id", botID), slog.Bool("preserve_data", preserveData)) + + if h.manager != nil { + if err := h.manager.Delete(ctx, botID, preserveData); err != nil { + if !errdefs.IsNotFound(err) { + return err } + h.logger.Warn("CleanupBotContainer: container not found in containerd", + slog.String("bot_id", botID)) } - return nil - } - - h.logger.Info("CleanupBotContainer: found container", - slog.String("bot_id", botID), - slog.String("container_id", containerID), - ) - - h.logger.Info("CleanupBotContainer: removing network", slog.String("container_id", containerID)) - if err := h.service.RemoveNetwork(ctx, ctr.NetworkSetupRequest{ - ContainerID: containerID, - CNIBinDir: h.cfg.CNIBinaryDir, - CNIConfDir: h.cfg.CNIConfigDir, - }); err != nil { - h.logger.Warn("cleanup: remove network failed", slog.String("container_id", containerID), slog.Any("error", err)) - } - h.logger.Info("CleanupBotContainer: stopping task", slog.String("container_id", containerID)) - if err := h.service.StopContainer(ctx, containerID, &ctr.StopTaskOptions{ - Timeout: 5 * time.Second, - Force: true, - }); err != nil { - h.logger.Warn("cleanup: stop task failed", slog.String("container_id", containerID), slog.Any("error", err)) - } - h.logger.Info("CleanupBotContainer: deleting task", slog.String("container_id", containerID)) - if err := h.service.DeleteTask(ctx, containerID, &ctr.DeleteTaskOptions{Force: true}); err != nil { - h.logger.Warn("cleanup: delete task failed", slog.String("container_id", containerID), slog.Any("error", err)) - } - - h.logger.Info("CleanupBotContainer: deleting container", slog.String("container_id", containerID)) - if err := h.service.DeleteContainer(ctx, containerID, &ctr.DeleteContainerOptions{ - CleanupSnapshot: true, - }); err != nil && !errdefs.IsNotFound(err) { - h.logger.Error("CleanupBotContainer: failed to delete container", - slog.String("container_id", containerID), - slog.Any("error", err), - ) - return err } if h.queries != nil { - h.logger.Info("CleanupBotContainer: deleting container record from DB", slog.String("bot_id", botID)) if pgBotID, parseErr := db.ParseUUID(botID); parseErr == nil { if dbErr := h.queries.DeleteContainerByBotID(ctx, pgBotID); dbErr != nil { h.logger.Error("CleanupBotContainer: failed to delete DB record", diff --git a/internal/mcp/dataio.go b/internal/mcp/dataio.go new file mode 100644 index 00000000..9c2ecfbd --- /dev/null +++ b/internal/mcp/dataio.go @@ -0,0 +1,575 @@ +package mcp + +import ( + "archive/tar" + "compress/gzip" + "context" + "errors" + "fmt" + "io" + "io/fs" + "log/slog" + "os" + "path/filepath" + "strings" + + "github.com/containerd/containerd/v2/core/mount" + "github.com/containerd/errdefs" + + ctr "github.com/memohai/memoh/internal/containerd" +) + +const ( + containerDataDir = "/data" + backupsSubdir = "backups" + legacyBotsSubdir = "bots" + migratedSuffix = ".migrated" +) + +// ExportData streams a tar.gz archive of the container's /data directory. +// The container is stopped during export and restarted afterwards. +// Caller must consume the returned reader before the context is cancelled. +func (m *Manager) ExportData(ctx context.Context, botID string) (io.ReadCloser, error) { + containerID := m.containerID(botID) + unlock := m.lockContainer(containerID) + defer unlock() + + info, err := m.service.GetContainer(ctx, containerID) + if err != nil { + return nil, fmt.Errorf("get container: %w", err) + } + + mounts, err := m.snapshotMounts(ctx, info) + if errors.Is(err, errMountNotSupported) { + return m.exportDataViaGRPC(ctx, botID) + } + if err != nil { + return nil, err + } + + if err := m.safeStopTask(ctx, containerID); err != nil { + return nil, fmt.Errorf("stop container: %w", err) + } + + pr, pw := io.Pipe() + + go func() { + var exportErr error + defer func() { + _ = pw.CloseWithError(exportErr) + m.restartContainer(context.WithoutCancel(ctx), botID, containerID) + }() + + exportErr = mount.WithReadonlyTempMount(ctx, mounts, func(root string) error { + dataDir := mountedDataDir(root) + if _, err := os.Stat(dataDir); err != nil { + return nil // no /data, produce empty archive + } + return tarGzDir(pw, dataDir) + }) + }() + + return pr, nil +} + +// ImportData extracts a tar.gz archive into the container's /data directory. +// The container is stopped during import and restarted afterwards. +func (m *Manager) ImportData(ctx context.Context, botID string, r io.Reader) error { + containerID := m.containerID(botID) + unlock := m.lockContainer(containerID) + defer unlock() + + info, err := m.service.GetContainer(ctx, containerID) + if err != nil { + return fmt.Errorf("get container: %w", err) + } + + mounts, err := m.snapshotMounts(ctx, info) + if errors.Is(err, errMountNotSupported) { + return m.importDataViaGRPC(ctx, botID, r) + } + if err != nil { + return err + } + + if err := m.safeStopTask(ctx, containerID); err != nil { + return fmt.Errorf("stop container: %w", err) + } + defer m.restartContainer(context.WithoutCancel(ctx), botID, containerID) + + return mount.WithTempMount(ctx, mounts, func(root string) error { + dataDir := mountedDataDir(root) + if err := os.MkdirAll(dataDir, 0o750); err != nil { + return err + } + return untarGzDir(r, dataDir) + }) +} + +// PreserveData exports /data to a backup tar.gz on the host. Used before +// deleting a container when the user chooses to preserve data. +// For snapshot-mount backends the caller must stop the task first so the +// mounted snapshot is consistent; the Apple fallback uses gRPC and does not +// require a stop. +func (m *Manager) PreserveData(ctx context.Context, botID string) error { + containerID := m.containerID(botID) + + info, err := m.service.GetContainer(ctx, containerID) + if err != nil { + return fmt.Errorf("get container: %w", err) + } + + backupPath := m.backupPath(botID) + if err := os.MkdirAll(filepath.Dir(backupPath), 0o750); err != nil { + return fmt.Errorf("create backup dir: %w", err) + } + + mounts, mountErr := m.snapshotMounts(ctx, info) + if errors.Is(mountErr, errMountNotSupported) { + return m.preserveDataViaGRPC(ctx, botID, backupPath) + } + if mountErr != nil { + return mountErr + } + + f, err := os.Create(backupPath) //nolint:gosec // G304: operator-controlled path + if err != nil { + return fmt.Errorf("create backup file: %w", err) + } + + writeErr := mount.WithReadonlyTempMount(ctx, mounts, func(root string) error { + dataDir := mountedDataDir(root) + if _, statErr := os.Stat(dataDir); statErr != nil { + return nil // no /data to backup + } + return tarGzDir(f, dataDir) + }) + + closeErr := f.Close() + if writeErr != nil { + _ = os.Remove(backupPath) + return fmt.Errorf("export data: %w", writeErr) + } + return closeErr +} + +// RestorePreservedData imports preserved data (backup tar.gz or legacy +// bind-mount directory) into a running container's /data. +func (m *Manager) RestorePreservedData(ctx context.Context, botID string) error { + bp := m.backupPath(botID) + if _, err := os.Stat(bp); err == nil { + f, err := os.Open(bp) //nolint:gosec // G304: operator-controlled path + if err != nil { + return err + } + defer func() { _ = f.Close() }() + + if err := m.ImportData(ctx, botID, f); err != nil { + return err + } + return os.Remove(bp) + } + + // Legacy bind-mount directory + legacyDir := m.legacyDataDir(botID) + migratedDir := legacyDir + migratedSuffix + if _, err := os.Stat(migratedDir); err == nil { + return nil // already imported previously + } + info, err := os.Stat(legacyDir) + if err != nil || !info.IsDir() { + return errors.New("no preserved data found") + } + + return m.importLegacyDir(ctx, botID, legacyDir) +} + +// HasPreservedData checks whether backup data exists for a bot, either as +// a tar.gz backup or a legacy bind-mount directory. +func (m *Manager) HasPreservedData(botID string) bool { + if _, err := os.Stat(m.backupPath(botID)); err == nil { + return true + } + legacyDir := m.legacyDataDir(botID) + if _, err := os.Stat(legacyDir + migratedSuffix); err == nil { + return false // already imported + } + info, err := os.Stat(legacyDir) + return err == nil && info.IsDir() +} + +// importLegacyDir copies a legacy bind-mount directory into the container +// via snapshot mount, then renames the source to .migrated. +func (m *Manager) importLegacyDir(ctx context.Context, botID, srcDir string) error { + containerID := m.containerID(botID) + + info, err := m.service.GetContainer(ctx, containerID) + if err != nil { + return fmt.Errorf("get container: %w", err) + } + + mounts, err := m.snapshotMounts(ctx, info) + if errors.Is(err, errMountNotSupported) { + return m.importLegacyDirViaGRPC(ctx, botID, srcDir) + } + if err != nil { + return err + } + + if err := m.safeStopTask(ctx, containerID); err != nil { + return fmt.Errorf("stop container: %w", err) + } + defer m.restartContainer(context.WithoutCancel(ctx), botID, containerID) + + mountErr := mount.WithTempMount(ctx, mounts, func(root string) error { + dataDir := mountedDataDir(root) + if err := os.MkdirAll(dataDir, 0o750); err != nil { + return err + } + return copyDirContents(srcDir, dataDir) + }) + if mountErr != nil { + return mountErr + } + + if err := os.Rename(srcDir, srcDir+migratedSuffix); err != nil { + m.logger.Warn("legacy import: rename failed", + slog.String("src", srcDir), slog.Any("error", err)) + } + return nil +} + +// errMountNotSupported indicates the backend doesn't support snapshot mounts +// (e.g. Apple Virtualization). Callers fall back to gRPC-based data operations. +var errMountNotSupported = errors.New("snapshot mount not supported on this backend") + +func (m *Manager) snapshotMounts(ctx context.Context, info ctr.ContainerInfo) ([]mount.Mount, error) { + raw, err := m.service.SnapshotMounts(ctx, info.Snapshotter, info.SnapshotKey) + if err != nil { + if errors.Is(err, ctr.ErrNotSupported) { + return nil, errMountNotSupported + } + return nil, fmt.Errorf("get snapshot mounts: %w", err) + } + mounts := make([]mount.Mount, len(raw)) + for i, r := range raw { + mounts[i] = mount.Mount{ + Type: r.Type, + Source: r.Source, + Options: r.Options, + } + } + return mounts, nil +} + +func (m *Manager) restartContainer(ctx context.Context, botID, containerID string) { + m.grpcPool.Remove(botID) + if err := m.service.DeleteTask(ctx, containerID, &ctr.DeleteTaskOptions{Force: true}); err != nil && !errdefs.IsNotFound(err) { + m.logger.Warn("cleanup stale task after data operation failed", + slog.String("container_id", containerID), slog.Any("error", err)) + return + } + if err := m.service.StartContainer(ctx, containerID, nil); err != nil { + m.logger.Warn("restart after data operation failed", + slog.String("container_id", containerID), slog.Any("error", err)) + return + } + netResult, err := m.service.SetupNetwork(ctx, ctr.NetworkSetupRequest{ + ContainerID: containerID, + CNIBinDir: m.cfg.CNIBinaryDir, + CNIConfDir: m.cfg.CNIConfigDir, + }) + if err != nil { + m.logger.Warn("network setup after restart failed", + slog.String("container_id", containerID), slog.Any("error", err)) + return + } + m.SetContainerIP(botID, netResult.IP) +} + +func mountedDataDir(root string) string { + return filepath.Join(root, strings.TrimPrefix(containerDataDir, string(filepath.Separator))) +} + +func (m *Manager) backupPath(botID string) string { + return filepath.Join(m.dataRoot(), backupsSubdir, botID+".tar.gz") +} + +func (m *Manager) legacyDataDir(botID string) string { + return filepath.Join(m.dataRoot(), legacyBotsSubdir, botID) +} + +// --------------------------------------------------------------------------- +// gRPC fallback (Apple backend / no mount support) +// --------------------------------------------------------------------------- + +func (m *Manager) exportDataViaGRPC(ctx context.Context, botID string) (io.ReadCloser, error) { + client, err := m.grpcPool.Get(ctx, botID) + if err != nil { + return nil, fmt.Errorf("grpc connect: %w", err) + } + + entries, err := client.ListDir(ctx, containerDataDir, true) + if err != nil { + return nil, fmt.Errorf("list dir: %w", err) + } + + pr, pw := io.Pipe() + go func() { + gw := gzip.NewWriter(pw) + tw := tar.NewWriter(gw) + var writeErr error + defer func() { + _ = tw.Close() + _ = gw.Close() + _ = pw.CloseWithError(writeErr) + }() + + for _, entry := range entries { + if entry.GetIsDir() { + continue + } + relPath := entry.GetPath() + absPath := containerDataDir + "/" + strings.TrimPrefix(relPath, "/") + + r, readErr := client.ReadRaw(ctx, absPath) + if readErr != nil { + writeErr = fmt.Errorf("read %s: %w", absPath, readErr) + return + } + hdr := &tar.Header{ + Name: relPath, + Size: entry.GetSize(), + Mode: 0o644, + } + if writeErr = tw.WriteHeader(hdr); writeErr != nil { + _ = r.Close() + return + } + if _, writeErr = io.Copy(tw, r); writeErr != nil { + _ = r.Close() + return + } + _ = r.Close() + } + }() + + return pr, nil +} + +func (m *Manager) preserveDataViaGRPC(ctx context.Context, botID, backupPath string) error { + reader, err := m.exportDataViaGRPC(ctx, botID) + if err != nil { + return err + } + defer func() { _ = reader.Close() }() + + f, err := os.Create(backupPath) //nolint:gosec // G304: operator-controlled path + if err != nil { + return fmt.Errorf("create backup file: %w", err) + } + if _, err := io.Copy(f, reader); err != nil { + _ = f.Close() + _ = os.Remove(backupPath) + return err + } + return f.Close() +} + +func (m *Manager) importDataViaGRPC(ctx context.Context, botID string, r io.Reader) error { + client, err := m.grpcPool.Get(ctx, botID) + if err != nil { + return fmt.Errorf("grpc connect: %w", err) + } + + gr, err := gzip.NewReader(r) + if err != nil { + return fmt.Errorf("gzip reader: %w", err) + } + defer func() { _ = gr.Close() }() + + tr := tar.NewReader(gr) + for { + header, err := tr.Next() + if err == io.EOF { + return nil + } + if err != nil { + return fmt.Errorf("tar next: %w", err) + } + if header.Typeflag == tar.TypeDir { + continue + } + absPath := containerDataDir + "/" + strings.TrimPrefix(header.Name, "/") + if _, err := client.WriteRaw(ctx, absPath, io.LimitReader(tr, header.Size)); err != nil { + return fmt.Errorf("write %s: %w", absPath, err) + } + } +} + +func (m *Manager) importLegacyDirViaGRPC(ctx context.Context, botID, srcDir string) error { + client, err := m.grpcPool.Get(ctx, botID) + if err != nil { + return fmt.Errorf("grpc connect: %w", err) + } + + err = filepath.WalkDir(srcDir, func(path string, d fs.DirEntry, walkErr error) error { + if walkErr != nil { + return walkErr + } + rel, relErr := filepath.Rel(srcDir, path) + if relErr != nil || rel == "." || d.IsDir() { + return relErr + } + f, openErr := os.Open(path) //nolint:gosec // G304: operator-controlled legacy data path + if openErr != nil { + return openErr + } + defer func() { _ = f.Close() }() + + containerPath := containerDataDir + "/" + filepath.ToSlash(rel) + _, copyErr := client.WriteRaw(ctx, containerPath, f) + return copyErr + }) + if err != nil { + return err + } + + if err := os.Rename(srcDir, srcDir+migratedSuffix); err != nil { + m.logger.Warn("legacy import: rename failed", + slog.String("src", srcDir), slog.Any("error", err)) + } + return nil +} + +// --------------------------------------------------------------------------- +// tar.gz helpers +// --------------------------------------------------------------------------- + +// tarGzDir writes a gzip-compressed tar archive of all files under dir to w. +// Paths inside the archive are relative to dir. +func tarGzDir(w io.Writer, dir string) error { + gw := gzip.NewWriter(w) + defer func() { _ = gw.Close() }() + tw := tar.NewWriter(gw) + defer func() { _ = tw.Close() }() + + return filepath.WalkDir(dir, func(path string, d fs.DirEntry, err error) error { + if err != nil { + return err + } + rel, err := filepath.Rel(dir, path) + if err != nil || rel == "." { + return err + } + info, err := d.Info() + if err != nil { + return err + } + + header, err := tar.FileInfoHeader(info, "") + if err != nil { + return err + } + header.Name = filepath.ToSlash(rel) + + if err := tw.WriteHeader(header); err != nil { + return err + } + + if d.IsDir() { + return nil + } + + f, err := os.Open(path) //nolint:gosec // G304: iterating operator-controlled data directory + if err != nil { + return err + } + defer func() { _ = f.Close() }() + _, err = io.Copy(tw, f) + return err + }) +} + +// untarGzDir extracts a gzip-compressed tar archive into dst. +func untarGzDir(r io.Reader, dst string) error { + gr, err := gzip.NewReader(r) + if err != nil { + return fmt.Errorf("gzip reader: %w", err) + } + defer func() { _ = gr.Close() }() + tr := tar.NewReader(gr) + + for { + header, err := tr.Next() + if err == io.EOF { + return nil + } + if err != nil { + return fmt.Errorf("tar next: %w", err) + } + + target := filepath.Join(dst, filepath.FromSlash(header.Name)) //nolint:gosec // G305: paths are from operator-created backup archives + if !strings.HasPrefix(filepath.Clean(target), filepath.Clean(dst)+string(os.PathSeparator)) { + return fmt.Errorf("tar path traversal: %s", header.Name) + } + + switch header.Typeflag { + case tar.TypeDir: + mode := header.FileInfo().Mode().Perm() + if err := os.MkdirAll(target, mode); err != nil { + return err + } + case tar.TypeReg: + mode := header.FileInfo().Mode().Perm() + if err := os.MkdirAll(filepath.Dir(target), 0o750); err != nil { + return err + } + f, err := os.OpenFile(target, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, mode) //nolint:gosec // G304: extracted from operator-created archive + if err != nil { + return err + } + if _, err := io.Copy(f, tr); err != nil { //nolint:gosec // G110: decompression bomb not a concern for operator archives + _ = f.Close() + return err + } + _ = f.Close() + } + } +} + +// copyDirContents copies all files from src into dst (both must be directories). +func copyDirContents(src, dst string) error { + return filepath.WalkDir(src, func(path string, d fs.DirEntry, err error) error { + if err != nil { + return err + } + rel, err := filepath.Rel(src, path) + if err != nil || rel == "." { + return err + } + target := filepath.Join(dst, rel) + + if d.IsDir() { + return os.MkdirAll(target, 0o750) + } + + in, err := os.Open(path) //nolint:gosec // G304: copying operator-controlled migration data + if err != nil { + return err + } + defer func() { _ = in.Close() }() + + if err := os.MkdirAll(filepath.Dir(target), 0o750); err != nil { + return err + } + out, err := os.Create(target) //nolint:gosec // G304: target within mounted snapshot + if err != nil { + return err + } + defer func() { _ = out.Close() }() + + _, err = io.Copy(out, in) + return err + }) +} diff --git a/internal/mcp/manager.go b/internal/mcp/manager.go index c3a4f721..e6626635 100644 --- a/internal/mcp/manager.go +++ b/internal/mcp/manager.go @@ -2,6 +2,7 @@ package mcp import ( "context" + "errors" "fmt" "log/slog" "strings" @@ -154,15 +155,60 @@ func (m *Manager) MCPClient(ctx context.Context, botID string) (*mcpclient.Clien func (m *Manager) Init(ctx context.Context) error { image := m.imageRef() - if _, err := m.service.GetImage(ctx, image); err == nil { + needsPull, remoteErr := m.checkImageUpgrade(ctx, image) + if remoteErr != nil { + // Remote check failed (network unavailable, registry down, etc.). + // Fall back to local image if available; fail only when nothing is cached. + m.logger.Warn("image upgrade check failed, falling back to local", + slog.String("image", image), slog.Any("error", remoteErr)) + if _, err := m.service.GetImage(ctx, image); err != nil { + _, err = m.service.PullImage(ctx, image, &ctr.PullImageOptions{ + Unpack: true, + Snapshotter: m.cfg.Snapshotter, + }) + return err + } return nil } - _, err := m.service.PullImage(ctx, image, &ctr.PullImageOptions{ + if !needsPull { + return nil + } + + m.logger.Info("pulling updated MCP image", slog.String("image", image)) + if _, err := m.service.PullImage(ctx, image, &ctr.PullImageOptions{ Unpack: true, Snapshotter: m.cfg.Snapshotter, - }) - return err + }); err != nil { + m.logger.Warn("image pull failed, using existing version", slog.Any("error", err)) + if _, err2 := m.service.GetImage(ctx, image); err2 != nil { + return err + } + return nil + } + + // Existing bot containers keep running with their current image. + // New containers created after this point will use the updated image. + return nil +} + +// checkImageUpgrade compares the local image digest against the remote registry. +// Returns (true, nil) when a newer image is available or no local image exists. +// Returns (false, err) when the remote cannot be reached. +func (m *Manager) checkImageUpgrade(ctx context.Context, image string) (needsPull bool, _ error) { + checkCtx, cancel := context.WithTimeout(ctx, 15*time.Second) + defer cancel() + + remoteDigest, err := m.service.ResolveRemoteDigest(checkCtx, image) + if err != nil { + return false, err + } + + localImg, err := m.service.GetImage(ctx, image) + if err != nil { + return true, nil // no local image + } + return localImg.ID != remoteDigest, nil } // EnsureBot creates the MCP container for a bot if it does not exist. @@ -254,11 +300,6 @@ func (m *Manager) Start(ctx context.Context, botID string) error { m.containerIPs[botID] = netResult.IP m.mu.Unlock() m.logger.Info("container network ready", slog.String("bot_id", botID), slog.String("ip", netResult.IP)) - - // Run migration in the background so Start() returns immediately. - // Migration uses its own context so it isn't cancelled when the - // caller's HTTP request finishes. - go m.migrateBindMountData(context.WithoutCancel(ctx), botID) } return nil } @@ -273,22 +314,53 @@ func (m *Manager) Stop(ctx context.Context, botID string, timeout time.Duration) }) } -func (m *Manager) Delete(ctx context.Context, botID string) error { +func (m *Manager) Delete(ctx context.Context, botID string, preserveData bool) error { if err := validateBotID(botID); err != nil { return err } + containerID := m.containerID(botID) + stoppedForPreserve := false + + if preserveData { + info, err := m.service.GetContainer(ctx, containerID) + if err != nil { + return fmt.Errorf("get container for preserve: %w", err) + } + if _, err := m.snapshotMounts(ctx, info); errors.Is(err, errMountNotSupported) { + // Apple backend fallback uses gRPC against a running container. + } else if err != nil { + return err + } else { + if err := m.safeStopTask(ctx, containerID); err != nil { + return fmt.Errorf("stop for data preserve: %w", err) + } + stoppedForPreserve = true + } + + if err := m.PreserveData(ctx, botID); err != nil { + // Export failed — restart only if we stopped the task, and abort + // deletion to prevent data loss. + if stoppedForPreserve { + m.restartContainer(ctx, botID, containerID) + } + return fmt.Errorf("preserve data: %w", err) + } + } + + m.grpcPool.Remove(botID) + if err := m.service.RemoveNetwork(ctx, ctr.NetworkSetupRequest{ - ContainerID: m.containerID(botID), + ContainerID: containerID, CNIBinDir: m.cfg.CNIBinaryDir, CNIConfDir: m.cfg.CNIConfigDir, }); err != nil { - m.logger.Warn("cleanup: remove network failed", slog.String("container_id", m.containerID(botID)), slog.Any("error", err)) + m.logger.Warn("cleanup: remove network failed", slog.String("container_id", containerID), slog.Any("error", err)) } - if err := m.service.DeleteTask(ctx, m.containerID(botID), &ctr.DeleteTaskOptions{Force: true}); err != nil { - m.logger.Warn("cleanup: delete task failed", slog.String("container_id", m.containerID(botID)), slog.Any("error", err)) + if err := m.service.DeleteTask(ctx, containerID, &ctr.DeleteTaskOptions{Force: true}); err != nil { + m.logger.Warn("cleanup: delete task failed", slog.String("container_id", containerID), slog.Any("error", err)) } - return m.service.DeleteContainer(ctx, m.containerID(botID), &ctr.DeleteContainerOptions{ + return m.service.DeleteContainer(ctx, containerID, &ctr.DeleteContainerOptions{ CleanupSnapshot: true, }) } diff --git a/internal/mcp/migrate.go b/internal/mcp/migrate.go deleted file mode 100644 index a17e503d..00000000 --- a/internal/mcp/migrate.go +++ /dev/null @@ -1,103 +0,0 @@ -package mcp - -import ( - "context" - "io/fs" - "log/slog" - "os" - "path/filepath" - "strings" - - "github.com/memohai/memoh/internal/mcp/mcpclient" -) - -const migratedSuffix = ".migrated" - -// migrateBindMountData copies bot data from the old host bind-mount directory -// into the container via gRPC, then renames the source to prevent re-migration. -// This is a one-time operation for bots that were created before the switch -// from bind mounts to container-local storage. -func (m *Manager) migrateBindMountData(ctx context.Context, botID string) { - srcDir := filepath.Join(m.dataRoot(), "bots", botID) - migratedDir := srcDir + migratedSuffix - - if _, err := os.Stat(migratedDir); err == nil { - return // already migrated - } - info, err := os.Stat(srcDir) - if err != nil || !info.IsDir() { - return // no old data - } - - // Quick check: is the directory empty? - entries, err := os.ReadDir(srcDir) - if err != nil || len(entries) == 0 { - return - } - - client, err := m.grpcPool.Get(ctx, botID) - if err != nil { - m.logger.Warn("migrate: cannot connect to container", - slog.String("bot_id", botID), slog.Any("error", err)) - return - } - - m.logger.Info("migrating bind-mount data into container", - slog.String("bot_id", botID), slog.String("src", srcDir)) - - var migrated, failed int - err = filepath.WalkDir(srcDir, func(path string, d fs.DirEntry, walkErr error) error { - if walkErr != nil { - // A directory walk error means the entire subtree is skipped by - // WalkDir. Count it as a failure so the src dir is NOT renamed - // and migration is retried on next start. - m.logger.Warn("migrate: walk error", - slog.String("path", path), slog.Any("error", walkErr)) - failed++ - return nil - } - rel, relErr := filepath.Rel(srcDir, path) - if relErr != nil || rel == "." { - return nil - } - if d.IsDir() { - return nil // dirs are created implicitly by WriteFile - } - - if err := copyFileToContainer(ctx, client, path, rel); err != nil { - m.logger.Warn("migrate: copy failed", - slog.String("file", rel), slog.Any("error", err)) - failed++ - return nil - } - migrated++ - return nil - }) - if err != nil { - m.logger.Warn("migrate: walk failed", slog.String("bot_id", botID), slog.Any("error", err)) - } - - m.logger.Info("migration complete", - slog.String("bot_id", botID), - slog.Int("migrated", migrated), - slog.Int("failed", failed)) - - if failed == 0 { - if renameErr := os.Rename(srcDir, migratedDir); renameErr != nil { - m.logger.Warn("migrate: rename src dir failed", - slog.String("src", srcDir), slog.Any("error", renameErr)) - } - } -} - -func copyFileToContainer(ctx context.Context, client *mcpclient.Client, hostPath, containerRelPath string) error { - f, err := os.Open(hostPath) //nolint:gosec // G304: hostPath is an operator-configured migration asset path, not user input - if err != nil { - return err - } - defer func() { _ = f.Close() }() - - containerRelPath = strings.ReplaceAll(containerRelPath, string(filepath.Separator), "/") - _, err = client.WriteRaw(ctx, containerRelPath, f) - return err -} diff --git a/internal/mcp/versioning.go b/internal/mcp/versioning.go index a16a3ba8..8775aee7 100644 --- a/internal/mcp/versioning.go +++ b/internal/mcp/versioning.go @@ -27,23 +27,28 @@ const ( ) type VersionInfo struct { - ID string - Version int - SnapshotName string - CreatedAt time.Time + ID string + Version int + SnapshotName string + RuntimeSnapshotName string + DisplayName string + CreatedAt time.Time } type SnapshotCreateInfo struct { - ContainerID string - SnapshotName string - Snapshotter string - Version int - CreatedAt time.Time + ContainerID string + SnapshotName string + RuntimeSnapshotName string + DisplayName string + Snapshotter string + Version int + CreatedAt time.Time } type ManagedSnapshotMeta struct { - Source string - Version *int + Source string + Version *int + DisplayName string } type BotSnapshotData struct { @@ -74,10 +79,8 @@ func (m *Manager) CreateSnapshot(ctx context.Context, botID, snapshotName, sourc return nil, err } - normalizedSnapshotName := strings.TrimSpace(snapshotName) - if normalizedSnapshotName == "" { - normalizedSnapshotName = fmt.Sprintf("%s-%d", containerID, time.Now().UnixNano()) - } + displayName := strings.TrimSpace(snapshotName) + runtimeSnapshotName := fmt.Sprintf("%s-snapshot-%d", containerID, time.Now().UnixNano()) normalizedSource := normalizeSnapshotSource(source) // The sequence below (stop → commit → replace → start) is atomic from the @@ -89,19 +92,20 @@ func (m *Manager) CreateSnapshot(ctx context.Context, botID, snapshotName, sourc return nil, err } - if err := m.service.CommitSnapshot(dctx, info.Snapshotter, normalizedSnapshotName, info.SnapshotKey); err != nil { + if err := m.service.CommitSnapshot(dctx, info.Snapshotter, runtimeSnapshotName, info.SnapshotKey); err != nil { return nil, err } activeSnapshotName := fmt.Sprintf("%s-active-%d", containerID, time.Now().UnixNano()) - if err := m.replaceContainerSnapshot(dctx, botID, containerID, info, activeSnapshotName, normalizedSnapshotName); err != nil { + if err := m.replaceContainerSnapshot(dctx, botID, containerID, info, activeSnapshotName, runtimeSnapshotName); err != nil { return nil, err } _, versionNumber, createdAt, err := m.recordSnapshotVersion( dctx, containerID, - normalizedSnapshotName, + runtimeSnapshotName, + displayName, info.SnapshotKey, info.Snapshotter, normalizedSource, @@ -110,20 +114,24 @@ func (m *Manager) CreateSnapshot(ctx context.Context, botID, snapshotName, sourc return nil, err } if err := m.insertEvent(dctx, containerID, "snapshot_create", map[string]any{ - "snapshot_name": normalizedSnapshotName, - "snapshotter": info.Snapshotter, - "source": normalizedSource, - "version": versionNumber, + "snapshot_name": coalesceSnapshotName(displayName, versionNumber), + "display_name": displayName, + "runtime_snapshot_name": runtimeSnapshotName, + "snapshotter": info.Snapshotter, + "source": normalizedSource, + "version": versionNumber, }); err != nil { return nil, err } return &SnapshotCreateInfo{ - ContainerID: containerID, - SnapshotName: normalizedSnapshotName, - Snapshotter: info.Snapshotter, - Version: versionNumber, - CreatedAt: createdAt, + ContainerID: containerID, + SnapshotName: coalesceSnapshotName(displayName, versionNumber), + RuntimeSnapshotName: runtimeSnapshotName, + DisplayName: displayName, + Snapshotter: info.Snapshotter, + Version: versionNumber, + CreatedAt: createdAt, }, nil } @@ -168,6 +176,7 @@ func (m *Manager) CreateVersion(ctx context.Context, botID string) (*VersionInfo dctx, containerID, versionSnapshotName, + "", info.SnapshotKey, info.Snapshotter, SnapshotSourcePreExec, @@ -185,10 +194,12 @@ func (m *Manager) CreateVersion(ctx context.Context, botID string) (*VersionInfo } return &VersionInfo{ - ID: versionID, - Version: versionNumber, - SnapshotName: versionSnapshotName, - CreatedAt: createdAt, + ID: versionID, + Version: versionNumber, + SnapshotName: fmt.Sprintf("Version %d", versionNumber), + RuntimeSnapshotName: versionSnapshotName, + DisplayName: "", + CreatedAt: createdAt, }, nil } @@ -234,7 +245,8 @@ func (m *Manager) ListBotSnapshotData(ctx context.Context, botID string) (*BotSn continue } meta := ManagedSnapshotMeta{ - Source: strings.TrimSpace(row.Source), + Source: strings.TrimSpace(row.Source), + DisplayName: strings.TrimSpace(row.DisplayName.String), } if row.Version.Valid { v := int(row.Version.Int32) @@ -274,10 +286,12 @@ func (m *Manager) ListVersions(ctx context.Context, botID string) ([]VersionInfo createdAt = row.CreatedAt.Time } out = append(out, VersionInfo{ - ID: uuidString(row.ID), - Version: int(row.Version), - SnapshotName: row.RuntimeSnapshotName, - CreatedAt: createdAt, + ID: uuidString(row.ID), + Version: int(row.Version), + SnapshotName: coalesceSnapshotName(row.DisplayName.String, int(row.Version)), + RuntimeSnapshotName: row.RuntimeSnapshotName, + DisplayName: strings.TrimSpace(row.DisplayName.String), + CreatedAt: createdAt, }) } return out, nil @@ -454,7 +468,7 @@ func (m *Manager) ensureDBRecords(ctx context.Context, botID, containerID, _ str return botUUID, nil } -func (m *Manager) recordSnapshotVersion(ctx context.Context, containerID, runtimeSnapshotName, parentRuntimeSnapshotName, snapshotter, source string) (string, int, time.Time, error) { +func (m *Manager) recordSnapshotVersion(ctx context.Context, containerID, runtimeSnapshotName, displayName, parentRuntimeSnapshotName, snapshotter, source string) (string, int, time.Time, error) { containerID = strings.TrimSpace(containerID) runtimeSnapshotName = strings.TrimSpace(runtimeSnapshotName) snapshotter = strings.TrimSpace(snapshotter) @@ -478,6 +492,7 @@ func (m *Manager) recordSnapshotVersion(ctx context.Context, containerID, runtim snapshotRow, err := qtx.UpsertSnapshot(ctx, dbsqlc.UpsertSnapshotParams{ ContainerID: containerID, RuntimeSnapshotName: runtimeSnapshotName, + DisplayName: pgtype.Text{String: strings.TrimSpace(displayName), Valid: strings.TrimSpace(displayName) != ""}, ParentRuntimeSnapshotName: parent, Snapshotter: snapshotter, Source: normalizeSnapshotSource(source), @@ -533,6 +548,17 @@ func normalizeSnapshotSource(source string) string { return s } +func coalesceSnapshotName(displayName string, version int) string { + displayName = strings.TrimSpace(displayName) + if displayName != "" { + return displayName + } + if version > 0 { + return fmt.Sprintf("Version %d", version) + } + return "" +} + func uuidString(v pgtype.UUID) string { if !v.Valid { return "" diff --git a/packages/sdk/src/@pinia/colada.gen.ts b/packages/sdk/src/@pinia/colada.gen.ts index ad8bae0f..35fcd1de 100644 --- a/packages/sdk/src/@pinia/colada.gen.ts +++ b/packages/sdk/src/@pinia/colada.gen.ts @@ -4,8 +4,40 @@ import { type _JSONValue, defineQueryOptions, type UseMutationOptions } from '@p import { serializeQueryKeyValue } from '../client'; import { client } from '../client.gen'; -import { deleteBotsByBotIdContainer, deleteBotsByBotIdContainerSkills, deleteBotsByBotIdEmailBindingsById, deleteBotsByBotIdHeartbeatLogs, deleteBotsByBotIdInboxById, deleteBotsByBotIdMcpById, deleteBotsByBotIdMcpByIdOauthToken, deleteBotsByBotIdMemory, deleteBotsByBotIdMemoryById, deleteBotsByBotIdMessages, deleteBotsByBotIdScheduleById, deleteBotsByBotIdSettings, deleteBotsByBotIdSubagentsById, deleteBotsById, deleteBotsByIdChannelByPlatform, deleteBotsByIdMembersByUserId, deleteEmailProvidersById, deleteMemoryProvidersById, deleteModelsById, deleteModelsModelByModelId, deleteProvidersById, deleteSearchProvidersById, getApiOauthMcpCallback, getBots, getBotsByBotIdContainer, getBotsByBotIdContainerFs, getBotsByBotIdContainerFsDownload, getBotsByBotIdContainerFsList, getBotsByBotIdContainerFsRead, getBotsByBotIdContainerSkills, getBotsByBotIdContainerSnapshots, getBotsByBotIdEmailBindings, getBotsByBotIdEmailOutbox, getBotsByBotIdEmailOutboxById, getBotsByBotIdHeartbeatLogs, getBotsByBotIdInbox, getBotsByBotIdInboxById, getBotsByBotIdInboxCount, getBotsByBotIdMcp, getBotsByBotIdMcpById, getBotsByBotIdMcpByIdOauthStatus, getBotsByBotIdMcpExport, getBotsByBotIdMemory, getBotsByBotIdMemoryUsage, getBotsByBotIdMessages, getBotsByBotIdSchedule, getBotsByBotIdScheduleById, getBotsByBotIdSettings, getBotsByBotIdSubagents, getBotsByBotIdSubagentsById, getBotsByBotIdSubagentsByIdContext, getBotsByBotIdSubagentsByIdSkills, getBotsByBotIdTokenUsage, getBotsById, getBotsByIdChannelByPlatform, getBotsByIdChecks, getBotsByIdMembers, getChannels, getChannelsByPlatform, getEmailProviders, getEmailProvidersById, getEmailProvidersMeta, getMemoryProviders, getMemoryProvidersById, getMemoryProvidersMeta, getModels, getModelsById, getModelsCount, getModelsModelByModelId, getPing, getProviders, getProvidersById, getProvidersByIdModels, getProvidersCount, getProvidersNameByName, getSearchProviders, getSearchProvidersById, getSearchProvidersMeta, getUsers, getUsersById, getUsersMe, getUsersMeChannelsByPlatform, getUsersMeIdentities, type Options, patchBotsByIdChannelByPlatformStatus, postAuthLogin, postAuthRefresh, postBots, postBotsByBotIdCliMessages, postBotsByBotIdContainer, postBotsByBotIdContainerFsDelete, postBotsByBotIdContainerFsMkdir, postBotsByBotIdContainerFsRename, postBotsByBotIdContainerFsUpload, postBotsByBotIdContainerFsWrite, postBotsByBotIdContainerSkills, postBotsByBotIdContainerSnapshots, postBotsByBotIdContainerStart, postBotsByBotIdContainerStop, postBotsByBotIdEmailBindings, postBotsByBotIdInbox, postBotsByBotIdInboxMarkRead, postBotsByBotIdMcp, postBotsByBotIdMcpByIdOauthAuthorize, postBotsByBotIdMcpByIdOauthDiscover, postBotsByBotIdMcpByIdProbe, postBotsByBotIdMcpOpsBatchDelete, postBotsByBotIdMcpStdio, postBotsByBotIdMcpStdioByConnectionId, postBotsByBotIdMemory, postBotsByBotIdMemoryCompact, postBotsByBotIdMemoryRebuild, postBotsByBotIdMemorySearch, postBotsByBotIdSchedule, postBotsByBotIdSettings, postBotsByBotIdSubagents, postBotsByBotIdSubagentsByIdSkills, postBotsByBotIdTools, postBotsByBotIdWebMessages, postBotsByIdChannelByPlatformSend, postBotsByIdChannelByPlatformSendChat, postEmailMailgunWebhookByConfigId, postEmailProviders, postMemoryProviders, postModels, postModelsByIdTest, postProviders, postProvidersByIdImportModels, postProvidersByIdTest, postSearchProviders, postUsers, putBotsByBotIdEmailBindingsById, putBotsByBotIdMcpById, putBotsByBotIdMcpImport, putBotsByBotIdScheduleById, putBotsByBotIdSettings, putBotsByBotIdSubagentsById, putBotsByBotIdSubagentsByIdContext, putBotsByBotIdSubagentsByIdSkills, putBotsById, putBotsByIdChannelByPlatform, putBotsByIdMembers, putBotsByIdOwner, putEmailProvidersById, putMemoryProvidersById, putModelsById, putModelsModelByModelId, putProvidersById, putSearchProvidersById, putUsersById, putUsersByIdPassword, putUsersMe, putUsersMeChannelsByPlatform, putUsersMePassword } from '../sdk.gen'; -import type { DeleteBotsByBotIdContainerData, DeleteBotsByBotIdContainerError, DeleteBotsByBotIdContainerSkillsData, DeleteBotsByBotIdContainerSkillsError, DeleteBotsByBotIdContainerSkillsResponse, DeleteBotsByBotIdEmailBindingsByIdData, DeleteBotsByBotIdEmailBindingsByIdError, DeleteBotsByBotIdHeartbeatLogsData, DeleteBotsByBotIdHeartbeatLogsError, DeleteBotsByBotIdInboxByIdData, DeleteBotsByBotIdInboxByIdError, DeleteBotsByBotIdMcpByIdData, DeleteBotsByBotIdMcpByIdError, DeleteBotsByBotIdMcpByIdOauthTokenData, DeleteBotsByBotIdMcpByIdOauthTokenError, DeleteBotsByBotIdMemoryByIdData, DeleteBotsByBotIdMemoryByIdError, DeleteBotsByBotIdMemoryByIdResponse, DeleteBotsByBotIdMemoryData, DeleteBotsByBotIdMemoryError, DeleteBotsByBotIdMemoryResponse, DeleteBotsByBotIdMessagesData, DeleteBotsByBotIdMessagesError, DeleteBotsByBotIdScheduleByIdData, DeleteBotsByBotIdScheduleByIdError, DeleteBotsByBotIdSettingsData, DeleteBotsByBotIdSettingsError, DeleteBotsByBotIdSubagentsByIdData, DeleteBotsByBotIdSubagentsByIdError, DeleteBotsByIdChannelByPlatformData, DeleteBotsByIdChannelByPlatformError, DeleteBotsByIdData, DeleteBotsByIdError, DeleteBotsByIdMembersByUserIdData, DeleteBotsByIdMembersByUserIdError, DeleteBotsByIdResponse, DeleteEmailProvidersByIdData, DeleteEmailProvidersByIdError, DeleteMemoryProvidersByIdData, DeleteMemoryProvidersByIdError, DeleteModelsByIdData, DeleteModelsByIdError, DeleteModelsModelByModelIdData, DeleteModelsModelByModelIdError, DeleteProvidersByIdData, DeleteProvidersByIdError, DeleteSearchProvidersByIdData, DeleteSearchProvidersByIdError, GetApiOauthMcpCallbackData, GetBotsByBotIdContainerData, GetBotsByBotIdContainerFsData, GetBotsByBotIdContainerFsDownloadData, GetBotsByBotIdContainerFsListData, GetBotsByBotIdContainerFsReadData, GetBotsByBotIdContainerSkillsData, GetBotsByBotIdContainerSnapshotsData, GetBotsByBotIdEmailBindingsData, GetBotsByBotIdEmailOutboxByIdData, GetBotsByBotIdEmailOutboxData, GetBotsByBotIdHeartbeatLogsData, GetBotsByBotIdInboxByIdData, GetBotsByBotIdInboxCountData, GetBotsByBotIdInboxData, GetBotsByBotIdMcpByIdData, GetBotsByBotIdMcpByIdOauthStatusData, GetBotsByBotIdMcpData, GetBotsByBotIdMcpExportData, GetBotsByBotIdMemoryData, GetBotsByBotIdMemoryUsageData, GetBotsByBotIdMessagesData, GetBotsByBotIdScheduleByIdData, GetBotsByBotIdScheduleData, GetBotsByBotIdSettingsData, GetBotsByBotIdSubagentsByIdContextData, GetBotsByBotIdSubagentsByIdData, GetBotsByBotIdSubagentsByIdSkillsData, GetBotsByBotIdSubagentsData, GetBotsByBotIdTokenUsageData, GetBotsByIdChannelByPlatformData, GetBotsByIdChecksData, GetBotsByIdData, GetBotsByIdMembersData, GetBotsData, GetChannelsByPlatformData, GetChannelsData, GetEmailProvidersByIdData, GetEmailProvidersData, GetEmailProvidersMetaData, GetMemoryProvidersByIdData, GetMemoryProvidersData, GetMemoryProvidersMetaData, GetModelsByIdData, GetModelsCountData, GetModelsData, GetModelsModelByModelIdData, GetPingData, GetProvidersByIdData, GetProvidersByIdModelsData, GetProvidersCountData, GetProvidersData, GetProvidersNameByNameData, GetSearchProvidersByIdData, GetSearchProvidersData, GetSearchProvidersMetaData, GetUsersByIdData, GetUsersData, GetUsersMeChannelsByPlatformData, GetUsersMeData, GetUsersMeIdentitiesData, PatchBotsByIdChannelByPlatformStatusData, PatchBotsByIdChannelByPlatformStatusError, PatchBotsByIdChannelByPlatformStatusResponse, PostAuthLoginData, PostAuthLoginError, PostAuthLoginResponse, PostAuthRefreshData, PostAuthRefreshError, PostAuthRefreshResponse, 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, PostBotsByBotIdEmailBindingsData, PostBotsByBotIdEmailBindingsError, PostBotsByBotIdEmailBindingsResponse, PostBotsByBotIdInboxData, PostBotsByBotIdInboxError, PostBotsByBotIdInboxMarkReadData, PostBotsByBotIdInboxMarkReadError, PostBotsByBotIdInboxResponse, PostBotsByBotIdMcpByIdOauthAuthorizeData, PostBotsByBotIdMcpByIdOauthAuthorizeError, PostBotsByBotIdMcpByIdOauthAuthorizeResponse, PostBotsByBotIdMcpByIdOauthDiscoverData, PostBotsByBotIdMcpByIdOauthDiscoverError, PostBotsByBotIdMcpByIdOauthDiscoverResponse, PostBotsByBotIdMcpByIdProbeData, PostBotsByBotIdMcpByIdProbeError, PostBotsByBotIdMcpByIdProbeResponse, 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, PostEmailMailgunWebhookByConfigIdData, PostEmailMailgunWebhookByConfigIdError, PostEmailMailgunWebhookByConfigIdResponse, PostEmailProvidersData, PostEmailProvidersError, PostEmailProvidersResponse, PostMemoryProvidersData, PostMemoryProvidersError, PostMemoryProvidersResponse, PostModelsByIdTestData, PostModelsByIdTestError, PostModelsByIdTestResponse, PostModelsData, PostModelsError, PostModelsResponse, PostProvidersByIdImportModelsData, PostProvidersByIdImportModelsError, PostProvidersByIdImportModelsResponse, PostProvidersByIdTestData, PostProvidersByIdTestError, PostProvidersByIdTestResponse, PostProvidersData, PostProvidersError, PostProvidersResponse, PostSearchProvidersData, PostSearchProvidersError, PostSearchProvidersResponse, PostUsersData, PostUsersError, PostUsersResponse, PutBotsByBotIdEmailBindingsByIdData, PutBotsByBotIdEmailBindingsByIdError, PutBotsByBotIdEmailBindingsByIdResponse, 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, PutEmailProvidersByIdData, PutEmailProvidersByIdError, PutEmailProvidersByIdResponse, PutMemoryProvidersByIdData, PutMemoryProvidersByIdError, PutMemoryProvidersByIdResponse, 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, deleteBotsByBotIdEmailBindingsById, deleteBotsByBotIdHeartbeatLogs, deleteBotsByBotIdInboxById, deleteBotsByBotIdMcpById, deleteBotsByBotIdMcpByIdOauthToken, deleteBotsByBotIdMemory, deleteBotsByBotIdMemoryById, deleteBotsByBotIdMessages, deleteBotsByBotIdScheduleById, deleteBotsByBotIdSettings, deleteBotsByBotIdSubagentsById, deleteBotsById, deleteBotsByIdChannelByPlatform, deleteBotsByIdMembersByUserId, deleteEmailProvidersById, deleteMemoryProvidersById, deleteModelsById, deleteModelsModelByModelId, deleteProvidersById, deleteSearchProvidersById, getBots, getBotsByBotIdContainer, getBotsByBotIdContainerFs, getBotsByBotIdContainerFsDownload, getBotsByBotIdContainerFsList, getBotsByBotIdContainerFsRead, getBotsByBotIdContainerSkills, getBotsByBotIdContainerSnapshots, getBotsByBotIdEmailBindings, getBotsByBotIdEmailOutbox, getBotsByBotIdEmailOutboxById, getBotsByBotIdHeartbeatLogs, getBotsByBotIdInbox, getBotsByBotIdInboxById, getBotsByBotIdInboxCount, getBotsByBotIdMcp, getBotsByBotIdMcpById, getBotsByBotIdMcpByIdOauthStatus, getBotsByBotIdMcpExport, getBotsByBotIdMemory, getBotsByBotIdMemoryUsage, getBotsByBotIdMessages, getBotsByBotIdSchedule, getBotsByBotIdScheduleById, getBotsByBotIdSettings, getBotsByBotIdSubagents, getBotsByBotIdSubagentsById, getBotsByBotIdSubagentsByIdContext, getBotsByBotIdSubagentsByIdSkills, getBotsByBotIdTokenUsage, getBotsById, getBotsByIdChannelByPlatform, getBotsByIdChecks, getBotsByIdMembers, getChannels, getChannelsByPlatform, getEmailProviders, getEmailProvidersById, getEmailProvidersMeta, getMemoryProviders, getMemoryProvidersById, getMemoryProvidersMeta, getModels, getModelsById, getModelsCount, getModelsModelByModelId, getPing, getProviders, getProvidersById, getProvidersByIdModels, getProvidersCount, getProvidersNameByName, getSearchProviders, getSearchProvidersById, getSearchProvidersMeta, getUsers, getUsersById, getUsersMe, getUsersMeChannelsByPlatform, getUsersMeIdentities, type Options, patchBotsByIdChannelByPlatformStatus, postAuthLogin, postAuthRefresh, postBots, postBotsByBotIdCliMessages, postBotsByBotIdContainer, postBotsByBotIdContainerDataExport, postBotsByBotIdContainerDataImport, postBotsByBotIdContainerDataRestore, postBotsByBotIdContainerFsDelete, postBotsByBotIdContainerFsMkdir, postBotsByBotIdContainerFsRename, postBotsByBotIdContainerFsUpload, postBotsByBotIdContainerFsWrite, postBotsByBotIdContainerSkills, postBotsByBotIdContainerSnapshots, postBotsByBotIdContainerSnapshotsRollback, postBotsByBotIdContainerStart, postBotsByBotIdContainerStop, postBotsByBotIdEmailBindings, postBotsByBotIdInbox, postBotsByBotIdInboxMarkRead, postBotsByBotIdMcp, postBotsByBotIdMcpByIdOauthAuthorize, postBotsByBotIdMcpByIdOauthDiscover, postBotsByBotIdMcpByIdOauthExchange, postBotsByBotIdMcpByIdProbe, postBotsByBotIdMcpOpsBatchDelete, postBotsByBotIdMcpStdio, postBotsByBotIdMcpStdioByConnectionId, postBotsByBotIdMemory, postBotsByBotIdMemoryCompact, postBotsByBotIdMemoryRebuild, postBotsByBotIdMemorySearch, postBotsByBotIdSchedule, postBotsByBotIdSettings, postBotsByBotIdSubagents, postBotsByBotIdSubagentsByIdSkills, postBotsByBotIdTools, postBotsByBotIdWebMessages, postBotsByIdChannelByPlatformSend, postBotsByIdChannelByPlatformSendChat, postEmailMailgunWebhookByConfigId, postEmailProviders, postMemoryProviders, postModels, postModelsByIdTest, postProviders, postProvidersByIdImportModels, postProvidersByIdTest, postSearchProviders, postUsers, putBotsByBotIdEmailBindingsById, putBotsByBotIdMcpById, putBotsByBotIdMcpImport, putBotsByBotIdScheduleById, putBotsByBotIdSettings, putBotsByBotIdSubagentsById, putBotsByBotIdSubagentsByIdContext, putBotsByBotIdSubagentsByIdSkills, putBotsById, putBotsByIdChannelByPlatform, putBotsByIdMembers, putBotsByIdOwner, putEmailProvidersById, putMemoryProvidersById, putModelsById, putModelsModelByModelId, putProvidersById, putSearchProvidersById, putUsersById, putUsersByIdPassword, putUsersMe, putUsersMeChannelsByPlatform, putUsersMePassword } from '../sdk.gen'; +import type { DeleteBotsByBotIdContainerData, DeleteBotsByBotIdContainerError, DeleteBotsByBotIdContainerSkillsData, DeleteBotsByBotIdContainerSkillsError, DeleteBotsByBotIdContainerSkillsResponse, DeleteBotsByBotIdEmailBindingsByIdData, DeleteBotsByBotIdEmailBindingsByIdError, DeleteBotsByBotIdHeartbeatLogsData, DeleteBotsByBotIdHeartbeatLogsError, DeleteBotsByBotIdInboxByIdData, DeleteBotsByBotIdInboxByIdError, DeleteBotsByBotIdMcpByIdData, DeleteBotsByBotIdMcpByIdError, DeleteBotsByBotIdMcpByIdOauthTokenData, DeleteBotsByBotIdMcpByIdOauthTokenError, DeleteBotsByBotIdMemoryByIdData, DeleteBotsByBotIdMemoryByIdError, DeleteBotsByBotIdMemoryByIdResponse, DeleteBotsByBotIdMemoryData, DeleteBotsByBotIdMemoryError, DeleteBotsByBotIdMemoryResponse, DeleteBotsByBotIdMessagesData, DeleteBotsByBotIdMessagesError, DeleteBotsByBotIdScheduleByIdData, DeleteBotsByBotIdScheduleByIdError, DeleteBotsByBotIdSettingsData, DeleteBotsByBotIdSettingsError, DeleteBotsByBotIdSubagentsByIdData, DeleteBotsByBotIdSubagentsByIdError, DeleteBotsByIdChannelByPlatformData, DeleteBotsByIdChannelByPlatformError, DeleteBotsByIdData, DeleteBotsByIdError, DeleteBotsByIdMembersByUserIdData, DeleteBotsByIdMembersByUserIdError, DeleteBotsByIdResponse, DeleteEmailProvidersByIdData, DeleteEmailProvidersByIdError, DeleteMemoryProvidersByIdData, DeleteMemoryProvidersByIdError, DeleteModelsByIdData, DeleteModelsByIdError, DeleteModelsModelByModelIdData, DeleteModelsModelByModelIdError, DeleteProvidersByIdData, DeleteProvidersByIdError, DeleteSearchProvidersByIdData, DeleteSearchProvidersByIdError, GetBotsByBotIdContainerData, GetBotsByBotIdContainerFsData, GetBotsByBotIdContainerFsDownloadData, GetBotsByBotIdContainerFsListData, GetBotsByBotIdContainerFsReadData, GetBotsByBotIdContainerSkillsData, GetBotsByBotIdContainerSnapshotsData, GetBotsByBotIdEmailBindingsData, GetBotsByBotIdEmailOutboxByIdData, GetBotsByBotIdEmailOutboxData, GetBotsByBotIdHeartbeatLogsData, GetBotsByBotIdInboxByIdData, GetBotsByBotIdInboxCountData, GetBotsByBotIdInboxData, GetBotsByBotIdMcpByIdData, GetBotsByBotIdMcpByIdOauthStatusData, GetBotsByBotIdMcpData, GetBotsByBotIdMcpExportData, GetBotsByBotIdMemoryData, GetBotsByBotIdMemoryUsageData, GetBotsByBotIdMessagesData, GetBotsByBotIdScheduleByIdData, GetBotsByBotIdScheduleData, GetBotsByBotIdSettingsData, GetBotsByBotIdSubagentsByIdContextData, GetBotsByBotIdSubagentsByIdData, GetBotsByBotIdSubagentsByIdSkillsData, GetBotsByBotIdSubagentsData, GetBotsByBotIdTokenUsageData, GetBotsByIdChannelByPlatformData, GetBotsByIdChecksData, GetBotsByIdData, GetBotsByIdMembersData, GetBotsData, GetChannelsByPlatformData, GetChannelsData, GetEmailProvidersByIdData, GetEmailProvidersData, GetEmailProvidersMetaData, GetMemoryProvidersByIdData, GetMemoryProvidersData, GetMemoryProvidersMetaData, GetModelsByIdData, GetModelsCountData, GetModelsData, GetModelsModelByModelIdData, GetPingData, GetProvidersByIdData, GetProvidersByIdModelsData, GetProvidersCountData, GetProvidersData, GetProvidersNameByNameData, GetSearchProvidersByIdData, GetSearchProvidersData, GetSearchProvidersMetaData, GetUsersByIdData, GetUsersData, GetUsersMeChannelsByPlatformData, GetUsersMeData, GetUsersMeIdentitiesData, PatchBotsByIdChannelByPlatformStatusData, PatchBotsByIdChannelByPlatformStatusError, PatchBotsByIdChannelByPlatformStatusResponse, PostAuthLoginData, PostAuthLoginError, PostAuthLoginResponse, PostAuthRefreshData, PostAuthRefreshError, PostAuthRefreshResponse, PostBotsByBotIdCliMessagesData, PostBotsByBotIdCliMessagesError, PostBotsByBotIdCliMessagesResponse, PostBotsByBotIdContainerData, PostBotsByBotIdContainerDataExportData, PostBotsByBotIdContainerDataExportError, PostBotsByBotIdContainerDataImportData, PostBotsByBotIdContainerDataImportError, PostBotsByBotIdContainerDataImportResponse, PostBotsByBotIdContainerDataRestoreData, PostBotsByBotIdContainerDataRestoreError, PostBotsByBotIdContainerDataRestoreResponse, PostBotsByBotIdContainerError, PostBotsByBotIdContainerFsDeleteData, PostBotsByBotIdContainerFsDeleteError, PostBotsByBotIdContainerFsDeleteResponse, PostBotsByBotIdContainerFsMkdirData, PostBotsByBotIdContainerFsMkdirError, PostBotsByBotIdContainerFsMkdirResponse, PostBotsByBotIdContainerFsRenameData, PostBotsByBotIdContainerFsRenameError, PostBotsByBotIdContainerFsRenameResponse, PostBotsByBotIdContainerFsUploadData, PostBotsByBotIdContainerFsUploadError, PostBotsByBotIdContainerFsUploadResponse, PostBotsByBotIdContainerFsWriteData, PostBotsByBotIdContainerFsWriteError, PostBotsByBotIdContainerFsWriteResponse, PostBotsByBotIdContainerResponse, PostBotsByBotIdContainerSkillsData, PostBotsByBotIdContainerSkillsError, PostBotsByBotIdContainerSkillsResponse, PostBotsByBotIdContainerSnapshotsData, PostBotsByBotIdContainerSnapshotsError, PostBotsByBotIdContainerSnapshotsResponse, PostBotsByBotIdContainerSnapshotsRollbackData, PostBotsByBotIdContainerSnapshotsRollbackError, PostBotsByBotIdContainerSnapshotsRollbackResponse, PostBotsByBotIdContainerStartData, PostBotsByBotIdContainerStartError, PostBotsByBotIdContainerStartResponse, PostBotsByBotIdContainerStopData, PostBotsByBotIdContainerStopError, PostBotsByBotIdContainerStopResponse, PostBotsByBotIdEmailBindingsData, PostBotsByBotIdEmailBindingsError, PostBotsByBotIdEmailBindingsResponse, PostBotsByBotIdInboxData, PostBotsByBotIdInboxError, PostBotsByBotIdInboxMarkReadData, PostBotsByBotIdInboxMarkReadError, PostBotsByBotIdInboxResponse, PostBotsByBotIdMcpByIdOauthAuthorizeData, PostBotsByBotIdMcpByIdOauthAuthorizeError, PostBotsByBotIdMcpByIdOauthAuthorizeResponse, PostBotsByBotIdMcpByIdOauthDiscoverData, PostBotsByBotIdMcpByIdOauthDiscoverError, PostBotsByBotIdMcpByIdOauthDiscoverResponse, PostBotsByBotIdMcpByIdOauthExchangeData, PostBotsByBotIdMcpByIdOauthExchangeError, PostBotsByBotIdMcpByIdOauthExchangeResponse, PostBotsByBotIdMcpByIdProbeData, PostBotsByBotIdMcpByIdProbeError, PostBotsByBotIdMcpByIdProbeResponse, 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, PostEmailMailgunWebhookByConfigIdData, PostEmailMailgunWebhookByConfigIdError, PostEmailMailgunWebhookByConfigIdResponse, PostEmailProvidersData, PostEmailProvidersError, PostEmailProvidersResponse, PostMemoryProvidersData, PostMemoryProvidersError, PostMemoryProvidersResponse, PostModelsByIdTestData, PostModelsByIdTestError, PostModelsByIdTestResponse, PostModelsData, PostModelsError, PostModelsResponse, PostProvidersByIdImportModelsData, PostProvidersByIdImportModelsError, PostProvidersByIdImportModelsResponse, PostProvidersByIdTestData, PostProvidersByIdTestError, PostProvidersByIdTestResponse, PostProvidersData, PostProvidersError, PostProvidersResponse, PostSearchProvidersData, PostSearchProvidersError, PostSearchProvidersResponse, PostUsersData, PostUsersError, PostUsersResponse, PutBotsByBotIdEmailBindingsByIdData, PutBotsByBotIdEmailBindingsByIdError, PutBotsByBotIdEmailBindingsByIdResponse, 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, PutEmailProvidersByIdData, PutEmailProvidersByIdError, PutEmailProvidersByIdResponse, PutMemoryProvidersByIdData, PutMemoryProvidersByIdError, PutMemoryProvidersByIdResponse, 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 + * + * Validate user credentials and issue a JWT + */ +export const postAuthLoginMutation = (options?: Partial>): UseMutationOptions, PostAuthLoginError> => ({ + mutation: async (vars) => { + const { data } = await postAuthLogin({ + ...options, + ...vars, + throwOnError: true + }); + return data; + } +}); + +/** + * Refresh Token + * + * Issue a new JWT using the existing claims with updated expiration + */ +export const postAuthRefreshMutation = (options?: Partial>): UseMutationOptions, PostAuthRefreshError> => ({ + mutation: async (vars) => { + const { data } = await postAuthRefresh({ + ...options, + ...vars, + throwOnError: true + }); + return data; + } +}); export type QueryKey = [ Pick & { @@ -42,57 +74,6 @@ const createQueryKey = (id: string, options?: TOptions return [params]; }; -export const getApiOauthMcpCallbackQueryKey = (options: Options) => createQueryKey('getApiOauthMcpCallback', options); - -/** - * OAuth callback handler - * - * Handles the OAuth authorization callback, exchanges code for tokens - */ -export const getApiOauthMcpCallbackQuery = defineQueryOptions((options: Options) => ({ - key: getApiOauthMcpCallbackQueryKey(options), - query: async (context) => { - const { data } = await getApiOauthMcpCallback({ - ...options, - ...context, - throwOnError: true - }); - return data; - } -})); - -/** - * Login - * - * Validate user credentials and issue a JWT - */ -export const postAuthLoginMutation = (options?: Partial>): UseMutationOptions, PostAuthLoginError> => ({ - mutation: async (vars) => { - const { data } = await postAuthLogin({ - ...options, - ...vars, - throwOnError: true - }); - return data; - } -}); - -/** - * Refresh Token - * - * Issue a new JWT using the existing claims with updated expiration - */ -export const postAuthRefreshMutation = (options?: Partial>): UseMutationOptions, PostAuthRefreshError> => ({ - mutation: async (vars) => { - const { data } = await postAuthRefresh({ - ...options, - ...vars, - throwOnError: true - }); - return data; - } -}); - export const getBotsQueryKey = (options?: Options) => createQueryKey('getBots', options); /** @@ -189,6 +170,48 @@ export const postBotsByBotIdContainerMutation = (options?: Partial>): UseMutationOptions, PostBotsByBotIdContainerDataExportError> => ({ + mutation: async (vars) => { + const { data } = await postBotsByBotIdContainerDataExport({ + ...options, + ...vars, + throwOnError: true + }); + return data; + } +}); + +/** + * Import a tar.gz archive into container /data + */ +export const postBotsByBotIdContainerDataImportMutation = (options?: Partial>): UseMutationOptions, PostBotsByBotIdContainerDataImportError> => ({ + mutation: async (vars) => { + const { data } = await postBotsByBotIdContainerDataImport({ + ...options, + ...vars, + throwOnError: true + }); + return data; + } +}); + +/** + * Restore previously preserved data into container + */ +export const postBotsByBotIdContainerDataRestoreMutation = (options?: Partial>): UseMutationOptions, PostBotsByBotIdContainerDataRestoreError> => ({ + mutation: async (vars) => { + const { data } = await postBotsByBotIdContainerDataRestore({ + ...options, + ...vars, + throwOnError: true + }); + return data; + } +}); + export const getBotsByBotIdContainerFsQueryKey = (options: Options) => createQueryKey('getBotsByBotIdContainerFs', options); /** @@ -421,6 +444,20 @@ export const postBotsByBotIdContainerSnapshotsMutation = (options?: Partial>): UseMutationOptions, PostBotsByBotIdContainerSnapshotsRollbackError> => ({ + mutation: async (vars) => { + const { data } = await postBotsByBotIdContainerSnapshotsRollback({ + ...options, + ...vars, + throwOnError: true + }); + return data; + } +}); + /** * Start container task for bot */ @@ -883,6 +920,22 @@ export const postBotsByBotIdMcpByIdOauthDiscoverMutation = (options?: Partial>): UseMutationOptions, PostBotsByBotIdMcpByIdOauthExchangeError> => ({ + mutation: async (vars) => { + const { data } = await postBotsByBotIdMcpByIdOauthExchange({ + ...options, + ...vars, + throwOnError: true + }); + return data; + } +}); + export const getBotsByBotIdMcpByIdOauthStatusQueryKey = (options: Options) => createQueryKey('getBotsByBotIdMcpByIdOauthStatus', options); /** diff --git a/packages/sdk/src/index.ts b/packages/sdk/src/index.ts index b2448a4e..dbe22d58 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, deleteBotsByBotIdEmailBindingsById, deleteBotsByBotIdHeartbeatLogs, deleteBotsByBotIdInboxById, deleteBotsByBotIdMcpById, deleteBotsByBotIdMcpByIdOauthToken, deleteBotsByBotIdMemory, deleteBotsByBotIdMemoryById, deleteBotsByBotIdMessages, deleteBotsByBotIdScheduleById, deleteBotsByBotIdSettings, deleteBotsByBotIdSubagentsById, deleteBotsById, deleteBotsByIdChannelByPlatform, deleteBotsByIdMembersByUserId, deleteEmailProvidersById, deleteMemoryProvidersById, deleteModelsById, deleteModelsModelByModelId, deleteProvidersById, deleteSearchProvidersById, getApiOauthMcpCallback, getBots, getBotsByBotIdCliStream, getBotsByBotIdContainer, getBotsByBotIdContainerFs, getBotsByBotIdContainerFsDownload, getBotsByBotIdContainerFsList, getBotsByBotIdContainerFsRead, getBotsByBotIdContainerSkills, getBotsByBotIdContainerSnapshots, getBotsByBotIdEmailBindings, getBotsByBotIdEmailOutbox, getBotsByBotIdEmailOutboxById, getBotsByBotIdHeartbeatLogs, getBotsByBotIdInbox, getBotsByBotIdInboxById, getBotsByBotIdInboxCount, getBotsByBotIdMcp, getBotsByBotIdMcpById, getBotsByBotIdMcpByIdOauthStatus, getBotsByBotIdMcpExport, getBotsByBotIdMemory, getBotsByBotIdMemoryUsage, getBotsByBotIdMessages, getBotsByBotIdSchedule, getBotsByBotIdScheduleById, getBotsByBotIdSettings, getBotsByBotIdSubagents, getBotsByBotIdSubagentsById, getBotsByBotIdSubagentsByIdContext, getBotsByBotIdSubagentsByIdSkills, getBotsByBotIdTokenUsage, getBotsByBotIdWebStream, getBotsById, getBotsByIdChannelByPlatform, getBotsByIdChecks, getBotsByIdMembers, getChannels, getChannelsByPlatform, getEmailProviders, getEmailProvidersById, getEmailProvidersMeta, getMemoryProviders, getMemoryProvidersById, getMemoryProvidersMeta, getModels, getModelsById, getModelsCount, getModelsModelByModelId, getPing, getProviders, getProvidersById, getProvidersByIdModels, getProvidersCount, getProvidersNameByName, getSearchProviders, getSearchProvidersById, getSearchProvidersMeta, getUsers, getUsersById, getUsersMe, getUsersMeChannelsByPlatform, getUsersMeIdentities, type Options, patchBotsByIdChannelByPlatformStatus, postAuthLogin, postAuthRefresh, postBots, postBotsByBotIdCliMessages, postBotsByBotIdContainer, postBotsByBotIdContainerFsDelete, postBotsByBotIdContainerFsMkdir, postBotsByBotIdContainerFsRename, postBotsByBotIdContainerFsUpload, postBotsByBotIdContainerFsWrite, postBotsByBotIdContainerSkills, postBotsByBotIdContainerSnapshots, postBotsByBotIdContainerStart, postBotsByBotIdContainerStop, postBotsByBotIdEmailBindings, postBotsByBotIdInbox, postBotsByBotIdInboxMarkRead, postBotsByBotIdMcp, postBotsByBotIdMcpByIdOauthAuthorize, postBotsByBotIdMcpByIdOauthDiscover, postBotsByBotIdMcpByIdProbe, postBotsByBotIdMcpOpsBatchDelete, postBotsByBotIdMcpStdio, postBotsByBotIdMcpStdioByConnectionId, postBotsByBotIdMemory, postBotsByBotIdMemoryCompact, postBotsByBotIdMemoryRebuild, postBotsByBotIdMemorySearch, postBotsByBotIdSchedule, postBotsByBotIdSettings, postBotsByBotIdSubagents, postBotsByBotIdSubagentsByIdSkills, postBotsByBotIdTools, postBotsByBotIdWebMessages, postBotsByIdChannelByPlatformSend, postBotsByIdChannelByPlatformSendChat, postEmailMailgunWebhookByConfigId, postEmailProviders, postMemoryProviders, postModels, postModelsByIdTest, postProviders, postProvidersByIdImportModels, postProvidersByIdTest, postSearchProviders, postUsers, putBotsByBotIdEmailBindingsById, putBotsByBotIdMcpById, putBotsByBotIdMcpImport, putBotsByBotIdScheduleById, putBotsByBotIdSettings, putBotsByBotIdSubagentsById, putBotsByBotIdSubagentsByIdContext, putBotsByBotIdSubagentsByIdSkills, putBotsById, putBotsByIdChannelByPlatform, putBotsByIdMembers, putBotsByIdOwner, putEmailProvidersById, putMemoryProvidersById, 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, DeleteBotsByBotIdEmailBindingsByIdData, DeleteBotsByBotIdEmailBindingsByIdError, DeleteBotsByBotIdEmailBindingsByIdErrors, DeleteBotsByBotIdEmailBindingsByIdResponses, DeleteBotsByBotIdHeartbeatLogsData, DeleteBotsByBotIdHeartbeatLogsError, DeleteBotsByBotIdHeartbeatLogsErrors, DeleteBotsByBotIdHeartbeatLogsResponses, DeleteBotsByBotIdInboxByIdData, DeleteBotsByBotIdInboxByIdError, DeleteBotsByBotIdInboxByIdErrors, DeleteBotsByBotIdInboxByIdResponses, DeleteBotsByBotIdMcpByIdData, DeleteBotsByBotIdMcpByIdError, DeleteBotsByBotIdMcpByIdErrors, DeleteBotsByBotIdMcpByIdOauthTokenData, DeleteBotsByBotIdMcpByIdOauthTokenError, DeleteBotsByBotIdMcpByIdOauthTokenErrors, DeleteBotsByBotIdMcpByIdOauthTokenResponses, 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, DeleteEmailProvidersByIdData, DeleteEmailProvidersByIdError, DeleteEmailProvidersByIdErrors, DeleteEmailProvidersByIdResponses, DeleteMemoryProvidersByIdData, DeleteMemoryProvidersByIdError, DeleteMemoryProvidersByIdErrors, DeleteMemoryProvidersByIdResponses, DeleteModelsByIdData, DeleteModelsByIdError, DeleteModelsByIdErrors, DeleteModelsByIdResponses, DeleteModelsModelByModelIdData, DeleteModelsModelByModelIdError, DeleteModelsModelByModelIdErrors, DeleteModelsModelByModelIdResponses, DeleteProvidersByIdData, DeleteProvidersByIdError, DeleteProvidersByIdErrors, DeleteProvidersByIdResponses, DeleteSearchProvidersByIdData, DeleteSearchProvidersByIdError, DeleteSearchProvidersByIdErrors, DeleteSearchProvidersByIdResponses, EmailBindingResponse, EmailConfigSchema, EmailCreateBindingRequest, EmailCreateProviderRequest, EmailFieldSchema, EmailOutboxItemResponse, EmailProviderMeta, EmailProviderResponse, EmailUpdateBindingRequest, EmailUpdateProviderRequest, GetApiOauthMcpCallbackData, GetApiOauthMcpCallbackError, GetApiOauthMcpCallbackErrors, GetApiOauthMcpCallbackResponse, GetApiOauthMcpCallbackResponses, 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, GetBotsByBotIdEmailBindingsData, GetBotsByBotIdEmailBindingsError, GetBotsByBotIdEmailBindingsErrors, GetBotsByBotIdEmailBindingsResponse, GetBotsByBotIdEmailBindingsResponses, GetBotsByBotIdEmailOutboxByIdData, GetBotsByBotIdEmailOutboxByIdError, GetBotsByBotIdEmailOutboxByIdErrors, GetBotsByBotIdEmailOutboxByIdResponse, GetBotsByBotIdEmailOutboxByIdResponses, GetBotsByBotIdEmailOutboxData, GetBotsByBotIdEmailOutboxError, GetBotsByBotIdEmailOutboxErrors, GetBotsByBotIdEmailOutboxResponse, GetBotsByBotIdEmailOutboxResponses, GetBotsByBotIdHeartbeatLogsData, GetBotsByBotIdHeartbeatLogsError, GetBotsByBotIdHeartbeatLogsErrors, GetBotsByBotIdHeartbeatLogsResponse, GetBotsByBotIdHeartbeatLogsResponses, GetBotsByBotIdInboxByIdData, GetBotsByBotIdInboxByIdError, GetBotsByBotIdInboxByIdErrors, GetBotsByBotIdInboxByIdResponse, GetBotsByBotIdInboxByIdResponses, GetBotsByBotIdInboxCountData, GetBotsByBotIdInboxCountError, GetBotsByBotIdInboxCountErrors, GetBotsByBotIdInboxCountResponse, GetBotsByBotIdInboxCountResponses, GetBotsByBotIdInboxData, GetBotsByBotIdInboxError, GetBotsByBotIdInboxErrors, GetBotsByBotIdInboxResponse, GetBotsByBotIdInboxResponses, GetBotsByBotIdMcpByIdData, GetBotsByBotIdMcpByIdError, GetBotsByBotIdMcpByIdErrors, GetBotsByBotIdMcpByIdOauthStatusData, GetBotsByBotIdMcpByIdOauthStatusError, GetBotsByBotIdMcpByIdOauthStatusErrors, GetBotsByBotIdMcpByIdOauthStatusResponse, GetBotsByBotIdMcpByIdOauthStatusResponses, 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, GetBotsByBotIdTokenUsageData, GetBotsByBotIdTokenUsageError, GetBotsByBotIdTokenUsageErrors, GetBotsByBotIdTokenUsageResponse, GetBotsByBotIdTokenUsageResponses, 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, GetEmailProvidersByIdData, GetEmailProvidersByIdError, GetEmailProvidersByIdErrors, GetEmailProvidersByIdResponse, GetEmailProvidersByIdResponses, GetEmailProvidersData, GetEmailProvidersError, GetEmailProvidersErrors, GetEmailProvidersMetaData, GetEmailProvidersMetaResponse, GetEmailProvidersMetaResponses, GetEmailProvidersResponse, GetEmailProvidersResponses, GetMemoryProvidersByIdData, GetMemoryProvidersByIdError, GetMemoryProvidersByIdErrors, GetMemoryProvidersByIdResponse, GetMemoryProvidersByIdResponses, GetMemoryProvidersData, GetMemoryProvidersError, GetMemoryProvidersErrors, GetMemoryProvidersMetaData, GetMemoryProvidersMetaResponse, GetMemoryProvidersMetaResponses, GetMemoryProvidersResponse, GetMemoryProvidersResponses, 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, GithubComMemohaiMemohInternalFsFileInfo, GithubComMemohaiMemohInternalMcpConnection, HandlersBatchDeleteRequest, HandlersChannelMeta, HandlersCreateContainerRequest, HandlersCreateContainerResponse, HandlersCreateSnapshotRequest, HandlersCreateSnapshotResponse, HandlersDailyTokenUsage, HandlersErrorResponse, HandlersFsDeleteRequest, HandlersFsFileInfo, HandlersFsListResponse, HandlersFsMkdirRequest, HandlersFsOpResponse, HandlersFsReadResponse, HandlersFsRenameRequest, HandlersFsUploadResponse, HandlersFsWriteRequest, HandlersGetContainerResponse, HandlersListMyIdentitiesResponse, HandlersListSnapshotsResponse, HandlersLocalChannelMessageRequest, HandlersLoginRequest, HandlersLoginResponse, HandlersMarkReadRequest, HandlersMcpStdioRequest, HandlersMcpStdioResponse, HandlersMemoryAddPayload, HandlersMemoryCompactPayload, HandlersMemoryDeletePayload, HandlersMemorySearchPayload, HandlersModelTokenUsage, HandlersOauthAuthorizeRequest, HandlersOauthDiscoverRequest, HandlersPingResponse, HandlersProbeResponse, HandlersRefreshResponse, HandlersSkillItem, HandlersSkillsDeleteRequest, HandlersSkillsOpResponse, HandlersSkillsResponse, HandlersSkillsUpsertRequest, HandlersSnapshotInfo, HandlersTokenUsageResponse, HeartbeatListLogsResponse, HeartbeatLog, IdentitiesChannelIdentity, InboxCountResult, InboxCreateRequest, InboxItem, McpAuthorizeResult, McpDiscoveryResult, McpExportResponse, McpImportRequest, McpListResponse, McpMcpServerEntry, McpOAuthStatus, McpToolDescriptor, McpUpsertRequest, MessageMessage, MessageMessageAsset, ModelsAddRequest, ModelsAddResponse, ModelsClientType, ModelsCountResponse, ModelsGetResponse, ModelsModelType, ModelsTestResponse, ModelsTestStatus, ModelsUpdateRequest, PatchBotsByIdChannelByPlatformStatusData, PatchBotsByIdChannelByPlatformStatusError, PatchBotsByIdChannelByPlatformStatusErrors, PatchBotsByIdChannelByPlatformStatusResponse, PatchBotsByIdChannelByPlatformStatusResponses, PostAuthLoginData, PostAuthLoginError, PostAuthLoginErrors, PostAuthLoginResponse, PostAuthLoginResponses, PostAuthRefreshData, PostAuthRefreshError, PostAuthRefreshErrors, PostAuthRefreshResponse, PostAuthRefreshResponses, 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, PostBotsByBotIdEmailBindingsData, PostBotsByBotIdEmailBindingsError, PostBotsByBotIdEmailBindingsErrors, PostBotsByBotIdEmailBindingsResponse, PostBotsByBotIdEmailBindingsResponses, PostBotsByBotIdInboxData, PostBotsByBotIdInboxError, PostBotsByBotIdInboxErrors, PostBotsByBotIdInboxMarkReadData, PostBotsByBotIdInboxMarkReadError, PostBotsByBotIdInboxMarkReadErrors, PostBotsByBotIdInboxMarkReadResponses, PostBotsByBotIdInboxResponse, PostBotsByBotIdInboxResponses, PostBotsByBotIdMcpByIdOauthAuthorizeData, PostBotsByBotIdMcpByIdOauthAuthorizeError, PostBotsByBotIdMcpByIdOauthAuthorizeErrors, PostBotsByBotIdMcpByIdOauthAuthorizeResponse, PostBotsByBotIdMcpByIdOauthAuthorizeResponses, PostBotsByBotIdMcpByIdOauthDiscoverData, PostBotsByBotIdMcpByIdOauthDiscoverError, PostBotsByBotIdMcpByIdOauthDiscoverErrors, PostBotsByBotIdMcpByIdOauthDiscoverResponse, PostBotsByBotIdMcpByIdOauthDiscoverResponses, PostBotsByBotIdMcpByIdProbeData, PostBotsByBotIdMcpByIdProbeError, PostBotsByBotIdMcpByIdProbeErrors, PostBotsByBotIdMcpByIdProbeResponse, PostBotsByBotIdMcpByIdProbeResponses, 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, PostEmailMailgunWebhookByConfigIdData, PostEmailMailgunWebhookByConfigIdError, PostEmailMailgunWebhookByConfigIdErrors, PostEmailMailgunWebhookByConfigIdResponse, PostEmailMailgunWebhookByConfigIdResponses, PostEmailProvidersData, PostEmailProvidersError, PostEmailProvidersErrors, PostEmailProvidersResponse, PostEmailProvidersResponses, PostMemoryProvidersData, PostMemoryProvidersError, PostMemoryProvidersErrors, PostMemoryProvidersResponse, PostMemoryProvidersResponses, PostModelsByIdTestData, PostModelsByIdTestError, PostModelsByIdTestErrors, PostModelsByIdTestResponse, PostModelsByIdTestResponses, PostModelsData, PostModelsError, PostModelsErrors, PostModelsResponse, PostModelsResponses, PostProvidersByIdImportModelsData, PostProvidersByIdImportModelsError, PostProvidersByIdImportModelsErrors, PostProvidersByIdImportModelsResponse, PostProvidersByIdImportModelsResponses, PostProvidersByIdTestData, PostProvidersByIdTestError, PostProvidersByIdTestErrors, PostProvidersByIdTestResponse, PostProvidersByIdTestResponses, PostProvidersData, PostProvidersError, PostProvidersErrors, PostProvidersResponse, PostProvidersResponses, PostSearchProvidersData, PostSearchProvidersError, PostSearchProvidersErrors, PostSearchProvidersResponse, PostSearchProvidersResponses, PostUsersData, PostUsersError, PostUsersErrors, PostUsersResponse, PostUsersResponses, ProviderCdfPoint, ProviderCompactResult, ProviderDeleteResponse, ProviderMemoryItem, ProviderMessage, ProviderProviderConfigSchema, ProviderProviderCreateRequest, ProviderProviderFieldSchema, ProviderProviderGetResponse, ProviderProviderMeta, ProviderProviderType, ProviderProviderUpdateRequest, ProviderRebuildResult, ProvidersCountResponse, ProvidersCreateRequest, ProviderSearchResponse, ProvidersGetResponse, ProvidersImportModelsRequest, ProvidersImportModelsResponse, ProvidersTestResponse, ProvidersUpdateRequest, ProviderTopKBucket, ProviderUsageResponse, PutBotsByBotIdEmailBindingsByIdData, PutBotsByBotIdEmailBindingsByIdError, PutBotsByBotIdEmailBindingsByIdErrors, PutBotsByBotIdEmailBindingsByIdResponse, PutBotsByBotIdEmailBindingsByIdResponses, 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, PutEmailProvidersByIdData, PutEmailProvidersByIdError, PutEmailProvidersByIdErrors, PutEmailProvidersByIdResponse, PutEmailProvidersByIdResponses, PutMemoryProvidersByIdData, PutMemoryProvidersByIdError, PutMemoryProvidersByIdErrors, PutMemoryProvidersByIdResponse, PutMemoryProvidersByIdResponses, 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, deleteBotsByBotIdEmailBindingsById, deleteBotsByBotIdHeartbeatLogs, deleteBotsByBotIdInboxById, deleteBotsByBotIdMcpById, deleteBotsByBotIdMcpByIdOauthToken, deleteBotsByBotIdMemory, deleteBotsByBotIdMemoryById, deleteBotsByBotIdMessages, deleteBotsByBotIdScheduleById, deleteBotsByBotIdSettings, deleteBotsByBotIdSubagentsById, deleteBotsById, deleteBotsByIdChannelByPlatform, deleteBotsByIdMembersByUserId, deleteEmailProvidersById, deleteMemoryProvidersById, deleteModelsById, deleteModelsModelByModelId, deleteProvidersById, deleteSearchProvidersById, getBots, getBotsByBotIdCliStream, getBotsByBotIdContainer, getBotsByBotIdContainerFs, getBotsByBotIdContainerFsDownload, getBotsByBotIdContainerFsList, getBotsByBotIdContainerFsRead, getBotsByBotIdContainerSkills, getBotsByBotIdContainerSnapshots, getBotsByBotIdEmailBindings, getBotsByBotIdEmailOutbox, getBotsByBotIdEmailOutboxById, getBotsByBotIdHeartbeatLogs, getBotsByBotIdInbox, getBotsByBotIdInboxById, getBotsByBotIdInboxCount, getBotsByBotIdMcp, getBotsByBotIdMcpById, getBotsByBotIdMcpByIdOauthStatus, getBotsByBotIdMcpExport, getBotsByBotIdMemory, getBotsByBotIdMemoryUsage, getBotsByBotIdMessages, getBotsByBotIdSchedule, getBotsByBotIdScheduleById, getBotsByBotIdSettings, getBotsByBotIdSubagents, getBotsByBotIdSubagentsById, getBotsByBotIdSubagentsByIdContext, getBotsByBotIdSubagentsByIdSkills, getBotsByBotIdTokenUsage, getBotsByBotIdWebStream, getBotsById, getBotsByIdChannelByPlatform, getBotsByIdChecks, getBotsByIdMembers, getChannels, getChannelsByPlatform, getEmailProviders, getEmailProvidersById, getEmailProvidersMeta, getMemoryProviders, getMemoryProvidersById, getMemoryProvidersMeta, getModels, getModelsById, getModelsCount, getModelsModelByModelId, getPing, getProviders, getProvidersById, getProvidersByIdModels, getProvidersCount, getProvidersNameByName, getSearchProviders, getSearchProvidersById, getSearchProvidersMeta, getUsers, getUsersById, getUsersMe, getUsersMeChannelsByPlatform, getUsersMeIdentities, type Options, patchBotsByIdChannelByPlatformStatus, postAuthLogin, postAuthRefresh, postBots, postBotsByBotIdCliMessages, postBotsByBotIdContainer, postBotsByBotIdContainerDataExport, postBotsByBotIdContainerDataImport, postBotsByBotIdContainerDataRestore, postBotsByBotIdContainerFsDelete, postBotsByBotIdContainerFsMkdir, postBotsByBotIdContainerFsRename, postBotsByBotIdContainerFsUpload, postBotsByBotIdContainerFsWrite, postBotsByBotIdContainerSkills, postBotsByBotIdContainerSnapshots, postBotsByBotIdContainerSnapshotsRollback, postBotsByBotIdContainerStart, postBotsByBotIdContainerStop, postBotsByBotIdEmailBindings, postBotsByBotIdInbox, postBotsByBotIdInboxMarkRead, postBotsByBotIdMcp, postBotsByBotIdMcpByIdOauthAuthorize, postBotsByBotIdMcpByIdOauthDiscover, postBotsByBotIdMcpByIdOauthExchange, postBotsByBotIdMcpByIdProbe, postBotsByBotIdMcpOpsBatchDelete, postBotsByBotIdMcpStdio, postBotsByBotIdMcpStdioByConnectionId, postBotsByBotIdMemory, postBotsByBotIdMemoryCompact, postBotsByBotIdMemoryRebuild, postBotsByBotIdMemorySearch, postBotsByBotIdSchedule, postBotsByBotIdSettings, postBotsByBotIdSubagents, postBotsByBotIdSubagentsByIdSkills, postBotsByBotIdTools, postBotsByBotIdWebMessages, postBotsByIdChannelByPlatformSend, postBotsByIdChannelByPlatformSendChat, postEmailMailgunWebhookByConfigId, postEmailProviders, postMemoryProviders, postModels, postModelsByIdTest, postProviders, postProvidersByIdImportModels, postProvidersByIdTest, postSearchProviders, postUsers, putBotsByBotIdEmailBindingsById, putBotsByBotIdMcpById, putBotsByBotIdMcpImport, putBotsByBotIdScheduleById, putBotsByBotIdSettings, putBotsByBotIdSubagentsById, putBotsByBotIdSubagentsByIdContext, putBotsByBotIdSubagentsByIdSkills, putBotsById, putBotsByIdChannelByPlatform, putBotsByIdMembers, putBotsByIdOwner, putEmailProvidersById, putMemoryProvidersById, 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, DeleteBotsByBotIdEmailBindingsByIdData, DeleteBotsByBotIdEmailBindingsByIdError, DeleteBotsByBotIdEmailBindingsByIdErrors, DeleteBotsByBotIdEmailBindingsByIdResponses, DeleteBotsByBotIdHeartbeatLogsData, DeleteBotsByBotIdHeartbeatLogsError, DeleteBotsByBotIdHeartbeatLogsErrors, DeleteBotsByBotIdHeartbeatLogsResponses, DeleteBotsByBotIdInboxByIdData, DeleteBotsByBotIdInboxByIdError, DeleteBotsByBotIdInboxByIdErrors, DeleteBotsByBotIdInboxByIdResponses, DeleteBotsByBotIdMcpByIdData, DeleteBotsByBotIdMcpByIdError, DeleteBotsByBotIdMcpByIdErrors, DeleteBotsByBotIdMcpByIdOauthTokenData, DeleteBotsByBotIdMcpByIdOauthTokenError, DeleteBotsByBotIdMcpByIdOauthTokenErrors, DeleteBotsByBotIdMcpByIdOauthTokenResponses, 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, DeleteEmailProvidersByIdData, DeleteEmailProvidersByIdError, DeleteEmailProvidersByIdErrors, DeleteEmailProvidersByIdResponses, DeleteMemoryProvidersByIdData, DeleteMemoryProvidersByIdError, DeleteMemoryProvidersByIdErrors, DeleteMemoryProvidersByIdResponses, DeleteModelsByIdData, DeleteModelsByIdError, DeleteModelsByIdErrors, DeleteModelsByIdResponses, DeleteModelsModelByModelIdData, DeleteModelsModelByModelIdError, DeleteModelsModelByModelIdErrors, DeleteModelsModelByModelIdResponses, DeleteProvidersByIdData, DeleteProvidersByIdError, DeleteProvidersByIdErrors, DeleteProvidersByIdResponses, DeleteSearchProvidersByIdData, DeleteSearchProvidersByIdError, DeleteSearchProvidersByIdErrors, DeleteSearchProvidersByIdResponses, EmailBindingResponse, EmailConfigSchema, EmailCreateBindingRequest, EmailCreateProviderRequest, EmailFieldSchema, EmailOutboxItemResponse, EmailProviderMeta, EmailProviderResponse, EmailUpdateBindingRequest, EmailUpdateProviderRequest, 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, GetBotsByBotIdEmailBindingsData, GetBotsByBotIdEmailBindingsError, GetBotsByBotIdEmailBindingsErrors, GetBotsByBotIdEmailBindingsResponse, GetBotsByBotIdEmailBindingsResponses, GetBotsByBotIdEmailOutboxByIdData, GetBotsByBotIdEmailOutboxByIdError, GetBotsByBotIdEmailOutboxByIdErrors, GetBotsByBotIdEmailOutboxByIdResponse, GetBotsByBotIdEmailOutboxByIdResponses, GetBotsByBotIdEmailOutboxData, GetBotsByBotIdEmailOutboxError, GetBotsByBotIdEmailOutboxErrors, GetBotsByBotIdEmailOutboxResponse, GetBotsByBotIdEmailOutboxResponses, GetBotsByBotIdHeartbeatLogsData, GetBotsByBotIdHeartbeatLogsError, GetBotsByBotIdHeartbeatLogsErrors, GetBotsByBotIdHeartbeatLogsResponse, GetBotsByBotIdHeartbeatLogsResponses, GetBotsByBotIdInboxByIdData, GetBotsByBotIdInboxByIdError, GetBotsByBotIdInboxByIdErrors, GetBotsByBotIdInboxByIdResponse, GetBotsByBotIdInboxByIdResponses, GetBotsByBotIdInboxCountData, GetBotsByBotIdInboxCountError, GetBotsByBotIdInboxCountErrors, GetBotsByBotIdInboxCountResponse, GetBotsByBotIdInboxCountResponses, GetBotsByBotIdInboxData, GetBotsByBotIdInboxError, GetBotsByBotIdInboxErrors, GetBotsByBotIdInboxResponse, GetBotsByBotIdInboxResponses, GetBotsByBotIdMcpByIdData, GetBotsByBotIdMcpByIdError, GetBotsByBotIdMcpByIdErrors, GetBotsByBotIdMcpByIdOauthStatusData, GetBotsByBotIdMcpByIdOauthStatusError, GetBotsByBotIdMcpByIdOauthStatusErrors, GetBotsByBotIdMcpByIdOauthStatusResponse, GetBotsByBotIdMcpByIdOauthStatusResponses, 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, GetBotsByBotIdTokenUsageData, GetBotsByBotIdTokenUsageError, GetBotsByBotIdTokenUsageErrors, GetBotsByBotIdTokenUsageResponse, GetBotsByBotIdTokenUsageResponses, 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, GetEmailProvidersByIdData, GetEmailProvidersByIdError, GetEmailProvidersByIdErrors, GetEmailProvidersByIdResponse, GetEmailProvidersByIdResponses, GetEmailProvidersData, GetEmailProvidersError, GetEmailProvidersErrors, GetEmailProvidersMetaData, GetEmailProvidersMetaResponse, GetEmailProvidersMetaResponses, GetEmailProvidersResponse, GetEmailProvidersResponses, GetMemoryProvidersByIdData, GetMemoryProvidersByIdError, GetMemoryProvidersByIdErrors, GetMemoryProvidersByIdResponse, GetMemoryProvidersByIdResponses, GetMemoryProvidersData, GetMemoryProvidersError, GetMemoryProvidersErrors, GetMemoryProvidersMetaData, GetMemoryProvidersMetaResponse, GetMemoryProvidersMetaResponses, GetMemoryProvidersResponse, GetMemoryProvidersResponses, 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, HandlersDailyTokenUsage, HandlersErrorResponse, HandlersFsDeleteRequest, HandlersFsFileInfo, HandlersFsListResponse, HandlersFsMkdirRequest, HandlersFsOpResponse, HandlersFsReadResponse, HandlersFsRenameRequest, HandlersFsUploadResponse, HandlersFsWriteRequest, HandlersGetContainerResponse, HandlersListMyIdentitiesResponse, HandlersListSnapshotsResponse, HandlersLocalChannelMessageRequest, HandlersLoginRequest, HandlersLoginResponse, HandlersMarkReadRequest, HandlersMcpStdioRequest, HandlersMcpStdioResponse, HandlersMemoryAddPayload, HandlersMemoryCompactPayload, HandlersMemoryDeletePayload, HandlersMemorySearchPayload, HandlersModelTokenUsage, HandlersOauthAuthorizeRequest, HandlersOauthDiscoverRequest, HandlersOauthExchangeRequest, HandlersPingResponse, HandlersProbeResponse, HandlersRefreshResponse, HandlersRollbackRequest, HandlersSkillItem, HandlersSkillsDeleteRequest, HandlersSkillsOpResponse, HandlersSkillsResponse, HandlersSkillsUpsertRequest, HandlersSnapshotInfo, HandlersTokenUsageResponse, HeartbeatListLogsResponse, HeartbeatLog, IdentitiesChannelIdentity, InboxCountResult, InboxCreateRequest, InboxItem, McpAuthorizeResult, McpDiscoveryResult, McpExportResponse, McpImportRequest, McpListResponse, McpMcpServerEntry, McpOAuthStatus, McpToolDescriptor, McpUpsertRequest, MessageMessage, MessageMessageAsset, ModelsAddRequest, ModelsAddResponse, ModelsClientType, ModelsCountResponse, ModelsGetResponse, ModelsModelType, ModelsTestResponse, ModelsTestStatus, ModelsUpdateRequest, PatchBotsByIdChannelByPlatformStatusData, PatchBotsByIdChannelByPlatformStatusError, PatchBotsByIdChannelByPlatformStatusErrors, PatchBotsByIdChannelByPlatformStatusResponse, PatchBotsByIdChannelByPlatformStatusResponses, PostAuthLoginData, PostAuthLoginError, PostAuthLoginErrors, PostAuthLoginResponse, PostAuthLoginResponses, PostAuthRefreshData, PostAuthRefreshError, PostAuthRefreshErrors, PostAuthRefreshResponse, PostAuthRefreshResponses, PostBotsByBotIdCliMessagesData, PostBotsByBotIdCliMessagesError, PostBotsByBotIdCliMessagesErrors, PostBotsByBotIdCliMessagesResponse, PostBotsByBotIdCliMessagesResponses, PostBotsByBotIdContainerData, PostBotsByBotIdContainerDataExportData, PostBotsByBotIdContainerDataExportError, PostBotsByBotIdContainerDataExportErrors, PostBotsByBotIdContainerDataExportResponses, PostBotsByBotIdContainerDataImportData, PostBotsByBotIdContainerDataImportError, PostBotsByBotIdContainerDataImportErrors, PostBotsByBotIdContainerDataImportResponse, PostBotsByBotIdContainerDataImportResponses, PostBotsByBotIdContainerDataRestoreData, PostBotsByBotIdContainerDataRestoreError, PostBotsByBotIdContainerDataRestoreErrors, PostBotsByBotIdContainerDataRestoreResponse, PostBotsByBotIdContainerDataRestoreResponses, 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, PostBotsByBotIdContainerSnapshotsRollbackData, PostBotsByBotIdContainerSnapshotsRollbackError, PostBotsByBotIdContainerSnapshotsRollbackErrors, PostBotsByBotIdContainerSnapshotsRollbackResponse, PostBotsByBotIdContainerSnapshotsRollbackResponses, PostBotsByBotIdContainerStartData, PostBotsByBotIdContainerStartError, PostBotsByBotIdContainerStartErrors, PostBotsByBotIdContainerStartResponse, PostBotsByBotIdContainerStartResponses, PostBotsByBotIdContainerStopData, PostBotsByBotIdContainerStopError, PostBotsByBotIdContainerStopErrors, PostBotsByBotIdContainerStopResponse, PostBotsByBotIdContainerStopResponses, PostBotsByBotIdEmailBindingsData, PostBotsByBotIdEmailBindingsError, PostBotsByBotIdEmailBindingsErrors, PostBotsByBotIdEmailBindingsResponse, PostBotsByBotIdEmailBindingsResponses, PostBotsByBotIdInboxData, PostBotsByBotIdInboxError, PostBotsByBotIdInboxErrors, PostBotsByBotIdInboxMarkReadData, PostBotsByBotIdInboxMarkReadError, PostBotsByBotIdInboxMarkReadErrors, PostBotsByBotIdInboxMarkReadResponses, PostBotsByBotIdInboxResponse, PostBotsByBotIdInboxResponses, PostBotsByBotIdMcpByIdOauthAuthorizeData, PostBotsByBotIdMcpByIdOauthAuthorizeError, PostBotsByBotIdMcpByIdOauthAuthorizeErrors, PostBotsByBotIdMcpByIdOauthAuthorizeResponse, PostBotsByBotIdMcpByIdOauthAuthorizeResponses, PostBotsByBotIdMcpByIdOauthDiscoverData, PostBotsByBotIdMcpByIdOauthDiscoverError, PostBotsByBotIdMcpByIdOauthDiscoverErrors, PostBotsByBotIdMcpByIdOauthDiscoverResponse, PostBotsByBotIdMcpByIdOauthDiscoverResponses, PostBotsByBotIdMcpByIdOauthExchangeData, PostBotsByBotIdMcpByIdOauthExchangeError, PostBotsByBotIdMcpByIdOauthExchangeErrors, PostBotsByBotIdMcpByIdOauthExchangeResponse, PostBotsByBotIdMcpByIdOauthExchangeResponses, PostBotsByBotIdMcpByIdProbeData, PostBotsByBotIdMcpByIdProbeError, PostBotsByBotIdMcpByIdProbeErrors, PostBotsByBotIdMcpByIdProbeResponse, PostBotsByBotIdMcpByIdProbeResponses, 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, PostEmailMailgunWebhookByConfigIdData, PostEmailMailgunWebhookByConfigIdError, PostEmailMailgunWebhookByConfigIdErrors, PostEmailMailgunWebhookByConfigIdResponse, PostEmailMailgunWebhookByConfigIdResponses, PostEmailProvidersData, PostEmailProvidersError, PostEmailProvidersErrors, PostEmailProvidersResponse, PostEmailProvidersResponses, PostMemoryProvidersData, PostMemoryProvidersError, PostMemoryProvidersErrors, PostMemoryProvidersResponse, PostMemoryProvidersResponses, PostModelsByIdTestData, PostModelsByIdTestError, PostModelsByIdTestErrors, PostModelsByIdTestResponse, PostModelsByIdTestResponses, PostModelsData, PostModelsError, PostModelsErrors, PostModelsResponse, PostModelsResponses, PostProvidersByIdImportModelsData, PostProvidersByIdImportModelsError, PostProvidersByIdImportModelsErrors, PostProvidersByIdImportModelsResponse, PostProvidersByIdImportModelsResponses, PostProvidersByIdTestData, PostProvidersByIdTestError, PostProvidersByIdTestErrors, PostProvidersByIdTestResponse, PostProvidersByIdTestResponses, PostProvidersData, PostProvidersError, PostProvidersErrors, PostProvidersResponse, PostProvidersResponses, PostSearchProvidersData, PostSearchProvidersError, PostSearchProvidersErrors, PostSearchProvidersResponse, PostSearchProvidersResponses, PostUsersData, PostUsersError, PostUsersErrors, PostUsersResponse, PostUsersResponses, ProviderCdfPoint, ProviderCompactResult, ProviderDeleteResponse, ProviderMemoryItem, ProviderMessage, ProviderProviderConfigSchema, ProviderProviderCreateRequest, ProviderProviderFieldSchema, ProviderProviderGetResponse, ProviderProviderMeta, ProviderProviderType, ProviderProviderUpdateRequest, ProviderRebuildResult, ProvidersCountResponse, ProvidersCreateRequest, ProviderSearchResponse, ProvidersGetResponse, ProvidersImportModelsRequest, ProvidersImportModelsResponse, ProvidersTestResponse, ProvidersUpdateRequest, ProviderTopKBucket, ProviderUsageResponse, PutBotsByBotIdEmailBindingsByIdData, PutBotsByBotIdEmailBindingsByIdError, PutBotsByBotIdEmailBindingsByIdErrors, PutBotsByBotIdEmailBindingsByIdResponse, PutBotsByBotIdEmailBindingsByIdResponses, 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, PutEmailProvidersByIdData, PutEmailProvidersByIdError, PutEmailProvidersByIdErrors, PutEmailProvidersByIdResponse, PutEmailProvidersByIdResponses, PutMemoryProvidersByIdData, PutMemoryProvidersByIdError, PutMemoryProvidersByIdErrors, PutMemoryProvidersByIdResponse, PutMemoryProvidersByIdResponses, 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 1bfddc81..38bcf4c4 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, DeleteBotsByBotIdEmailBindingsByIdData, DeleteBotsByBotIdEmailBindingsByIdErrors, DeleteBotsByBotIdEmailBindingsByIdResponses, DeleteBotsByBotIdHeartbeatLogsData, DeleteBotsByBotIdHeartbeatLogsErrors, DeleteBotsByBotIdHeartbeatLogsResponses, DeleteBotsByBotIdInboxByIdData, DeleteBotsByBotIdInboxByIdErrors, DeleteBotsByBotIdInboxByIdResponses, DeleteBotsByBotIdMcpByIdData, DeleteBotsByBotIdMcpByIdErrors, DeleteBotsByBotIdMcpByIdOauthTokenData, DeleteBotsByBotIdMcpByIdOauthTokenErrors, DeleteBotsByBotIdMcpByIdOauthTokenResponses, 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, DeleteEmailProvidersByIdData, DeleteEmailProvidersByIdErrors, DeleteEmailProvidersByIdResponses, DeleteMemoryProvidersByIdData, DeleteMemoryProvidersByIdErrors, DeleteMemoryProvidersByIdResponses, DeleteModelsByIdData, DeleteModelsByIdErrors, DeleteModelsByIdResponses, DeleteModelsModelByModelIdData, DeleteModelsModelByModelIdErrors, DeleteModelsModelByModelIdResponses, DeleteProvidersByIdData, DeleteProvidersByIdErrors, DeleteProvidersByIdResponses, DeleteSearchProvidersByIdData, DeleteSearchProvidersByIdErrors, DeleteSearchProvidersByIdResponses, GetApiOauthMcpCallbackData, GetApiOauthMcpCallbackErrors, GetApiOauthMcpCallbackResponses, GetBotsByBotIdCliStreamData, GetBotsByBotIdCliStreamErrors, GetBotsByBotIdCliStreamResponses, GetBotsByBotIdContainerData, GetBotsByBotIdContainerErrors, GetBotsByBotIdContainerFsData, GetBotsByBotIdContainerFsDownloadData, GetBotsByBotIdContainerFsDownloadErrors, GetBotsByBotIdContainerFsDownloadResponses, GetBotsByBotIdContainerFsErrors, GetBotsByBotIdContainerFsListData, GetBotsByBotIdContainerFsListErrors, GetBotsByBotIdContainerFsListResponses, GetBotsByBotIdContainerFsReadData, GetBotsByBotIdContainerFsReadErrors, GetBotsByBotIdContainerFsReadResponses, GetBotsByBotIdContainerFsResponses, GetBotsByBotIdContainerResponses, GetBotsByBotIdContainerSkillsData, GetBotsByBotIdContainerSkillsErrors, GetBotsByBotIdContainerSkillsResponses, GetBotsByBotIdContainerSnapshotsData, GetBotsByBotIdContainerSnapshotsErrors, GetBotsByBotIdContainerSnapshotsResponses, GetBotsByBotIdEmailBindingsData, GetBotsByBotIdEmailBindingsErrors, GetBotsByBotIdEmailBindingsResponses, GetBotsByBotIdEmailOutboxByIdData, GetBotsByBotIdEmailOutboxByIdErrors, GetBotsByBotIdEmailOutboxByIdResponses, GetBotsByBotIdEmailOutboxData, GetBotsByBotIdEmailOutboxErrors, GetBotsByBotIdEmailOutboxResponses, GetBotsByBotIdHeartbeatLogsData, GetBotsByBotIdHeartbeatLogsErrors, GetBotsByBotIdHeartbeatLogsResponses, GetBotsByBotIdInboxByIdData, GetBotsByBotIdInboxByIdErrors, GetBotsByBotIdInboxByIdResponses, GetBotsByBotIdInboxCountData, GetBotsByBotIdInboxCountErrors, GetBotsByBotIdInboxCountResponses, GetBotsByBotIdInboxData, GetBotsByBotIdInboxErrors, GetBotsByBotIdInboxResponses, GetBotsByBotIdMcpByIdData, GetBotsByBotIdMcpByIdErrors, GetBotsByBotIdMcpByIdOauthStatusData, GetBotsByBotIdMcpByIdOauthStatusErrors, GetBotsByBotIdMcpByIdOauthStatusResponses, 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, GetBotsByBotIdTokenUsageData, GetBotsByBotIdTokenUsageErrors, GetBotsByBotIdTokenUsageResponses, GetBotsByBotIdWebStreamData, GetBotsByBotIdWebStreamErrors, GetBotsByBotIdWebStreamResponses, GetBotsByIdChannelByPlatformData, GetBotsByIdChannelByPlatformErrors, GetBotsByIdChannelByPlatformResponses, GetBotsByIdChecksData, GetBotsByIdChecksErrors, GetBotsByIdChecksResponses, GetBotsByIdData, GetBotsByIdErrors, GetBotsByIdMembersData, GetBotsByIdMembersErrors, GetBotsByIdMembersResponses, GetBotsByIdResponses, GetBotsData, GetBotsErrors, GetBotsResponses, GetChannelsByPlatformData, GetChannelsByPlatformErrors, GetChannelsByPlatformResponses, GetChannelsData, GetChannelsErrors, GetChannelsResponses, GetEmailProvidersByIdData, GetEmailProvidersByIdErrors, GetEmailProvidersByIdResponses, GetEmailProvidersData, GetEmailProvidersErrors, GetEmailProvidersMetaData, GetEmailProvidersMetaResponses, GetEmailProvidersResponses, GetMemoryProvidersByIdData, GetMemoryProvidersByIdErrors, GetMemoryProvidersByIdResponses, GetMemoryProvidersData, GetMemoryProvidersErrors, GetMemoryProvidersMetaData, GetMemoryProvidersMetaResponses, GetMemoryProvidersResponses, 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, PostAuthRefreshData, PostAuthRefreshErrors, PostAuthRefreshResponses, 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, PostBotsByBotIdEmailBindingsData, PostBotsByBotIdEmailBindingsErrors, PostBotsByBotIdEmailBindingsResponses, PostBotsByBotIdInboxData, PostBotsByBotIdInboxErrors, PostBotsByBotIdInboxMarkReadData, PostBotsByBotIdInboxMarkReadErrors, PostBotsByBotIdInboxMarkReadResponses, PostBotsByBotIdInboxResponses, PostBotsByBotIdMcpByIdOauthAuthorizeData, PostBotsByBotIdMcpByIdOauthAuthorizeErrors, PostBotsByBotIdMcpByIdOauthAuthorizeResponses, PostBotsByBotIdMcpByIdOauthDiscoverData, PostBotsByBotIdMcpByIdOauthDiscoverErrors, PostBotsByBotIdMcpByIdOauthDiscoverResponses, PostBotsByBotIdMcpByIdProbeData, PostBotsByBotIdMcpByIdProbeErrors, PostBotsByBotIdMcpByIdProbeResponses, 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, PostEmailMailgunWebhookByConfigIdData, PostEmailMailgunWebhookByConfigIdErrors, PostEmailMailgunWebhookByConfigIdResponses, PostEmailProvidersData, PostEmailProvidersErrors, PostEmailProvidersResponses, PostMemoryProvidersData, PostMemoryProvidersErrors, PostMemoryProvidersResponses, PostModelsByIdTestData, PostModelsByIdTestErrors, PostModelsByIdTestResponses, PostModelsData, PostModelsErrors, PostModelsResponses, PostProvidersByIdImportModelsData, PostProvidersByIdImportModelsErrors, PostProvidersByIdImportModelsResponses, PostProvidersByIdTestData, PostProvidersByIdTestErrors, PostProvidersByIdTestResponses, PostProvidersData, PostProvidersErrors, PostProvidersResponses, PostSearchProvidersData, PostSearchProvidersErrors, PostSearchProvidersResponses, PostUsersData, PostUsersErrors, PostUsersResponses, PutBotsByBotIdEmailBindingsByIdData, PutBotsByBotIdEmailBindingsByIdErrors, PutBotsByBotIdEmailBindingsByIdResponses, 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, PutEmailProvidersByIdData, PutEmailProvidersByIdErrors, PutEmailProvidersByIdResponses, PutMemoryProvidersByIdData, PutMemoryProvidersByIdErrors, PutMemoryProvidersByIdResponses, 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, DeleteBotsByBotIdEmailBindingsByIdData, DeleteBotsByBotIdEmailBindingsByIdErrors, DeleteBotsByBotIdEmailBindingsByIdResponses, DeleteBotsByBotIdHeartbeatLogsData, DeleteBotsByBotIdHeartbeatLogsErrors, DeleteBotsByBotIdHeartbeatLogsResponses, DeleteBotsByBotIdInboxByIdData, DeleteBotsByBotIdInboxByIdErrors, DeleteBotsByBotIdInboxByIdResponses, DeleteBotsByBotIdMcpByIdData, DeleteBotsByBotIdMcpByIdErrors, DeleteBotsByBotIdMcpByIdOauthTokenData, DeleteBotsByBotIdMcpByIdOauthTokenErrors, DeleteBotsByBotIdMcpByIdOauthTokenResponses, 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, DeleteEmailProvidersByIdData, DeleteEmailProvidersByIdErrors, DeleteEmailProvidersByIdResponses, DeleteMemoryProvidersByIdData, DeleteMemoryProvidersByIdErrors, DeleteMemoryProvidersByIdResponses, 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, GetBotsByBotIdEmailBindingsData, GetBotsByBotIdEmailBindingsErrors, GetBotsByBotIdEmailBindingsResponses, GetBotsByBotIdEmailOutboxByIdData, GetBotsByBotIdEmailOutboxByIdErrors, GetBotsByBotIdEmailOutboxByIdResponses, GetBotsByBotIdEmailOutboxData, GetBotsByBotIdEmailOutboxErrors, GetBotsByBotIdEmailOutboxResponses, GetBotsByBotIdHeartbeatLogsData, GetBotsByBotIdHeartbeatLogsErrors, GetBotsByBotIdHeartbeatLogsResponses, GetBotsByBotIdInboxByIdData, GetBotsByBotIdInboxByIdErrors, GetBotsByBotIdInboxByIdResponses, GetBotsByBotIdInboxCountData, GetBotsByBotIdInboxCountErrors, GetBotsByBotIdInboxCountResponses, GetBotsByBotIdInboxData, GetBotsByBotIdInboxErrors, GetBotsByBotIdInboxResponses, GetBotsByBotIdMcpByIdData, GetBotsByBotIdMcpByIdErrors, GetBotsByBotIdMcpByIdOauthStatusData, GetBotsByBotIdMcpByIdOauthStatusErrors, GetBotsByBotIdMcpByIdOauthStatusResponses, 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, GetBotsByBotIdTokenUsageData, GetBotsByBotIdTokenUsageErrors, GetBotsByBotIdTokenUsageResponses, GetBotsByBotIdWebStreamData, GetBotsByBotIdWebStreamErrors, GetBotsByBotIdWebStreamResponses, GetBotsByIdChannelByPlatformData, GetBotsByIdChannelByPlatformErrors, GetBotsByIdChannelByPlatformResponses, GetBotsByIdChecksData, GetBotsByIdChecksErrors, GetBotsByIdChecksResponses, GetBotsByIdData, GetBotsByIdErrors, GetBotsByIdMembersData, GetBotsByIdMembersErrors, GetBotsByIdMembersResponses, GetBotsByIdResponses, GetBotsData, GetBotsErrors, GetBotsResponses, GetChannelsByPlatformData, GetChannelsByPlatformErrors, GetChannelsByPlatformResponses, GetChannelsData, GetChannelsErrors, GetChannelsResponses, GetEmailProvidersByIdData, GetEmailProvidersByIdErrors, GetEmailProvidersByIdResponses, GetEmailProvidersData, GetEmailProvidersErrors, GetEmailProvidersMetaData, GetEmailProvidersMetaResponses, GetEmailProvidersResponses, GetMemoryProvidersByIdData, GetMemoryProvidersByIdErrors, GetMemoryProvidersByIdResponses, GetMemoryProvidersData, GetMemoryProvidersErrors, GetMemoryProvidersMetaData, GetMemoryProvidersMetaResponses, GetMemoryProvidersResponses, 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, PostAuthRefreshData, PostAuthRefreshErrors, PostAuthRefreshResponses, PostBotsByBotIdCliMessagesData, PostBotsByBotIdCliMessagesErrors, PostBotsByBotIdCliMessagesResponses, PostBotsByBotIdContainerData, PostBotsByBotIdContainerDataExportData, PostBotsByBotIdContainerDataExportErrors, PostBotsByBotIdContainerDataExportResponses, PostBotsByBotIdContainerDataImportData, PostBotsByBotIdContainerDataImportErrors, PostBotsByBotIdContainerDataImportResponses, PostBotsByBotIdContainerDataRestoreData, PostBotsByBotIdContainerDataRestoreErrors, PostBotsByBotIdContainerDataRestoreResponses, PostBotsByBotIdContainerErrors, PostBotsByBotIdContainerFsDeleteData, PostBotsByBotIdContainerFsDeleteErrors, PostBotsByBotIdContainerFsDeleteResponses, PostBotsByBotIdContainerFsMkdirData, PostBotsByBotIdContainerFsMkdirErrors, PostBotsByBotIdContainerFsMkdirResponses, PostBotsByBotIdContainerFsRenameData, PostBotsByBotIdContainerFsRenameErrors, PostBotsByBotIdContainerFsRenameResponses, PostBotsByBotIdContainerFsUploadData, PostBotsByBotIdContainerFsUploadErrors, PostBotsByBotIdContainerFsUploadResponses, PostBotsByBotIdContainerFsWriteData, PostBotsByBotIdContainerFsWriteErrors, PostBotsByBotIdContainerFsWriteResponses, PostBotsByBotIdContainerResponses, PostBotsByBotIdContainerSkillsData, PostBotsByBotIdContainerSkillsErrors, PostBotsByBotIdContainerSkillsResponses, PostBotsByBotIdContainerSnapshotsData, PostBotsByBotIdContainerSnapshotsErrors, PostBotsByBotIdContainerSnapshotsResponses, PostBotsByBotIdContainerSnapshotsRollbackData, PostBotsByBotIdContainerSnapshotsRollbackErrors, PostBotsByBotIdContainerSnapshotsRollbackResponses, PostBotsByBotIdContainerStartData, PostBotsByBotIdContainerStartErrors, PostBotsByBotIdContainerStartResponses, PostBotsByBotIdContainerStopData, PostBotsByBotIdContainerStopErrors, PostBotsByBotIdContainerStopResponses, PostBotsByBotIdEmailBindingsData, PostBotsByBotIdEmailBindingsErrors, PostBotsByBotIdEmailBindingsResponses, PostBotsByBotIdInboxData, PostBotsByBotIdInboxErrors, PostBotsByBotIdInboxMarkReadData, PostBotsByBotIdInboxMarkReadErrors, PostBotsByBotIdInboxMarkReadResponses, PostBotsByBotIdInboxResponses, PostBotsByBotIdMcpByIdOauthAuthorizeData, PostBotsByBotIdMcpByIdOauthAuthorizeErrors, PostBotsByBotIdMcpByIdOauthAuthorizeResponses, PostBotsByBotIdMcpByIdOauthDiscoverData, PostBotsByBotIdMcpByIdOauthDiscoverErrors, PostBotsByBotIdMcpByIdOauthDiscoverResponses, PostBotsByBotIdMcpByIdOauthExchangeData, PostBotsByBotIdMcpByIdOauthExchangeErrors, PostBotsByBotIdMcpByIdOauthExchangeResponses, PostBotsByBotIdMcpByIdProbeData, PostBotsByBotIdMcpByIdProbeErrors, PostBotsByBotIdMcpByIdProbeResponses, 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, PostEmailMailgunWebhookByConfigIdData, PostEmailMailgunWebhookByConfigIdErrors, PostEmailMailgunWebhookByConfigIdResponses, PostEmailProvidersData, PostEmailProvidersErrors, PostEmailProvidersResponses, PostMemoryProvidersData, PostMemoryProvidersErrors, PostMemoryProvidersResponses, PostModelsByIdTestData, PostModelsByIdTestErrors, PostModelsByIdTestResponses, PostModelsData, PostModelsErrors, PostModelsResponses, PostProvidersByIdImportModelsData, PostProvidersByIdImportModelsErrors, PostProvidersByIdImportModelsResponses, PostProvidersByIdTestData, PostProvidersByIdTestErrors, PostProvidersByIdTestResponses, PostProvidersData, PostProvidersErrors, PostProvidersResponses, PostSearchProvidersData, PostSearchProvidersErrors, PostSearchProvidersResponses, PostUsersData, PostUsersErrors, PostUsersResponses, PutBotsByBotIdEmailBindingsByIdData, PutBotsByBotIdEmailBindingsByIdErrors, PutBotsByBotIdEmailBindingsByIdResponses, 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, PutEmailProvidersByIdData, PutEmailProvidersByIdErrors, PutEmailProvidersByIdResponses, PutMemoryProvidersByIdData, PutMemoryProvidersByIdErrors, PutMemoryProvidersByIdResponses, 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 & { /** @@ -18,13 +18,6 @@ export type Options; }; -/** - * OAuth callback handler - * - * Handles the OAuth authorization callback, exchanges code for tokens - */ -export const getApiOauthMcpCallback = (options: Options) => (options.client ?? client).get({ url: '/api/oauth/mcp/callback', ...options }); - /** * Login * @@ -110,6 +103,29 @@ export const postBotsByBotIdContainer = (o } }); +/** + * Export container /data as a tar.gz archive + */ +export const postBotsByBotIdContainerDataExport = (options: Options) => (options.client ?? client).post({ url: '/bots/{bot_id}/container/data/export', ...options }); + +/** + * Import a tar.gz archive into container /data + */ +export const postBotsByBotIdContainerDataImport = (options: Options) => (options.client ?? client).post({ + ...formDataBodySerializer, + url: '/bots/{bot_id}/container/data/import', + ...options, + headers: { + 'Content-Type': null, + ...options.headers + } +}); + +/** + * Restore previously preserved data into container + */ +export const postBotsByBotIdContainerDataRestore = (options: Options) => (options.client ?? client).post({ url: '/bots/{bot_id}/container/data/restore', ...options }); + /** * Get file or directory info * @@ -255,6 +271,18 @@ export const postBotsByBotIdContainerSnapshots = (options: Options) => (options.client ?? client).post({ + url: '/bots/{bot_id}/container/snapshots/rollback', + ...options, + headers: { + 'Content-Type': 'application/json', + ...options.headers + } +}); + /** * Start container task for bot */ @@ -519,6 +547,20 @@ export const postBotsByBotIdMcpByIdOauthDiscover = (options: Options) => (options.client ?? client).post({ + url: '/bots/{bot_id}/mcp/{id}/oauth/exchange', + ...options, + headers: { + 'Content-Type': 'application/json', + ...options.headers + } +}); + /** * Get OAuth status for MCP connection * diff --git a/packages/sdk/src/types.gen.ts b/packages/sdk/src/types.gen.ts index 3e1247ff..14970aab 100644 --- a/packages/sdk/src/types.gen.ts +++ b/packages/sdk/src/types.gen.ts @@ -414,15 +414,6 @@ export type EmailUpdateProviderRequest = { provider?: string; }; -export type GithubComMemohaiMemohInternalFsFileInfo = { - isDir?: boolean; - modTime?: string; - mode?: string; - name?: string; - path?: string; - size?: number; -}; - export type GithubComMemohaiMemohInternalMcpConnection = { auth_type?: string; bot_id?: string; @@ -456,11 +447,14 @@ export type HandlersChannelMeta = { }; export type HandlersCreateContainerRequest = { + restore_data?: boolean; snapshotter?: string; }; export type HandlersCreateContainerResponse = { container_id?: string; + data_restored?: boolean; + has_preserved_data?: boolean; image?: string; snapshotter?: string; started?: boolean; @@ -472,6 +466,8 @@ export type HandlersCreateSnapshotRequest = { export type HandlersCreateSnapshotResponse = { container_id?: string; + display_name?: string; + runtime_snapshot_name?: string; snapshot_name?: string; snapshotter?: string; source?: string; @@ -506,7 +502,7 @@ export type HandlersFsFileInfo = { }; export type HandlersFsListResponse = { - entries?: Array; + entries?: Array; path?: string; }; @@ -539,7 +535,7 @@ export type HandlersGetContainerResponse = { container_id?: string; container_path?: string; created_at?: string; - host_path?: string; + has_preserved_data?: boolean; image?: string; namespace?: string; status?: string; @@ -615,6 +611,10 @@ export type HandlersRefreshResponse = { token_type?: string; }; +export type HandlersRollbackRequest = { + version?: number; +}; + export type HandlersSkillItem = { content?: string; description?: string; @@ -639,6 +639,7 @@ export type HandlersSkillsUpsertRequest = { export type HandlersSnapshotInfo = { created_at?: string; + display_name?: string; kind?: string; labels?: { [key: string]: string; @@ -646,6 +647,7 @@ export type HandlersSnapshotInfo = { managed?: boolean; name?: string; parent?: string; + runtime_snapshot_name?: string; snapshotter?: string; source?: string; updated_at?: string; @@ -708,13 +710,20 @@ export type HandlersMemorySearchPayload = { }; export type HandlersOauthAuthorizeRequest = { + callback_url?: string; client_id?: string; + client_secret?: string; }; export type HandlersOauthDiscoverRequest = { url?: string; }; +export type HandlersOauthExchangeRequest = { + code?: string; + state?: string; +}; + export type HandlersSkillsOpResponse = { ok?: boolean; }; @@ -823,6 +832,7 @@ export type McpMcpServerEntry = { export type McpOAuthStatus = { auth_server?: string; + callback_url?: string; configured?: boolean; expired?: boolean; expires_at?: string; @@ -1078,9 +1088,6 @@ export type ProvidersCreateRequest = { }; export type ProvidersGetResponse = { - /** - * masked in response - */ api_key?: string; base_url?: string; created_at?: string; @@ -1315,40 +1322,6 @@ export type SubagentUpdateSkillsRequest = { skills?: Array; }; -export type GetApiOauthMcpCallbackData = { - body?: never; - path?: never; - query: { - /** - * Authorization code - */ - code: string; - /** - * State parameter - */ - state: string; - }; - url: '/api/oauth/mcp/callback'; -}; - -export type GetApiOauthMcpCallbackErrors = { - /** - * Bad Request - */ - 400: HandlersErrorResponse; -}; - -export type GetApiOauthMcpCallbackError = GetApiOauthMcpCallbackErrors[keyof GetApiOauthMcpCallbackErrors]; - -export type GetApiOauthMcpCallbackResponses = { - /** - * HTML page that closes the popup - */ - 200: string; -}; - -export type GetApiOauthMcpCallbackResponse = GetApiOauthMcpCallbackResponses[keyof GetApiOauthMcpCallbackResponses]; - export type PostAuthLoginData = { /** * Login request @@ -1577,7 +1550,12 @@ export type DeleteBotsByBotIdContainerData = { */ bot_id: string; }; - query?: never; + query?: { + /** + * Export /data before deletion + */ + preserve_data?: boolean; + }; url: '/bots/{bot_id}/container'; }; @@ -1672,6 +1650,111 @@ export type PostBotsByBotIdContainerResponses = { export type PostBotsByBotIdContainerResponse = PostBotsByBotIdContainerResponses[keyof PostBotsByBotIdContainerResponses]; +export type PostBotsByBotIdContainerDataExportData = { + body?: never; + path: { + /** + * Bot ID + */ + bot_id: string; + }; + query?: never; + url: '/bots/{bot_id}/container/data/export'; +}; + +export type PostBotsByBotIdContainerDataExportErrors = { + /** + * Internal Server Error + */ + 500: HandlersErrorResponse; +}; + +export type PostBotsByBotIdContainerDataExportError = PostBotsByBotIdContainerDataExportErrors[keyof PostBotsByBotIdContainerDataExportErrors]; + +export type PostBotsByBotIdContainerDataExportResponses = { + /** + * OK + */ + 200: unknown; +}; + +export type PostBotsByBotIdContainerDataImportData = { + body: { + /** + * tar.gz archive + */ + file: Blob | File; + }; + path: { + /** + * Bot ID + */ + bot_id: string; + }; + query?: never; + url: '/bots/{bot_id}/container/data/import'; +}; + +export type PostBotsByBotIdContainerDataImportErrors = { + /** + * Bad Request + */ + 400: HandlersErrorResponse; + /** + * Internal Server Error + */ + 500: HandlersErrorResponse; +}; + +export type PostBotsByBotIdContainerDataImportError = PostBotsByBotIdContainerDataImportErrors[keyof PostBotsByBotIdContainerDataImportErrors]; + +export type PostBotsByBotIdContainerDataImportResponses = { + /** + * OK + */ + 200: { + [key: string]: unknown; + }; +}; + +export type PostBotsByBotIdContainerDataImportResponse = PostBotsByBotIdContainerDataImportResponses[keyof PostBotsByBotIdContainerDataImportResponses]; + +export type PostBotsByBotIdContainerDataRestoreData = { + body?: never; + path: { + /** + * Bot ID + */ + bot_id: string; + }; + query?: never; + url: '/bots/{bot_id}/container/data/restore'; +}; + +export type PostBotsByBotIdContainerDataRestoreErrors = { + /** + * Not Found + */ + 404: HandlersErrorResponse; + /** + * Internal Server Error + */ + 500: HandlersErrorResponse; +}; + +export type PostBotsByBotIdContainerDataRestoreError = PostBotsByBotIdContainerDataRestoreErrors[keyof PostBotsByBotIdContainerDataRestoreErrors]; + +export type PostBotsByBotIdContainerDataRestoreResponses = { + /** + * OK + */ + 200: { + [key: string]: unknown; + }; +}; + +export type PostBotsByBotIdContainerDataRestoreResponse = PostBotsByBotIdContainerDataRestoreResponses[keyof PostBotsByBotIdContainerDataRestoreResponses]; + export type GetBotsByBotIdContainerFsData = { body?: never; path: { @@ -2261,6 +2344,45 @@ export type PostBotsByBotIdContainerSnapshotsResponses = { export type PostBotsByBotIdContainerSnapshotsResponse = PostBotsByBotIdContainerSnapshotsResponses[keyof PostBotsByBotIdContainerSnapshotsResponses]; +export type PostBotsByBotIdContainerSnapshotsRollbackData = { + /** + * Rollback payload + */ + body: HandlersRollbackRequest; + path: { + /** + * Bot ID + */ + bot_id: string; + }; + query?: never; + url: '/bots/{bot_id}/container/snapshots/rollback'; +}; + +export type PostBotsByBotIdContainerSnapshotsRollbackErrors = { + /** + * Bad Request + */ + 400: HandlersErrorResponse; + /** + * Internal Server Error + */ + 500: HandlersErrorResponse; +}; + +export type PostBotsByBotIdContainerSnapshotsRollbackError = PostBotsByBotIdContainerSnapshotsRollbackErrors[keyof PostBotsByBotIdContainerSnapshotsRollbackErrors]; + +export type PostBotsByBotIdContainerSnapshotsRollbackResponses = { + /** + * OK + */ + 200: { + [key: string]: unknown; + }; +}; + +export type PostBotsByBotIdContainerSnapshotsRollbackResponse = PostBotsByBotIdContainerSnapshotsRollbackResponses[keyof PostBotsByBotIdContainerSnapshotsRollbackResponses]; + export type PostBotsByBotIdContainerStartData = { body?: never; path: { @@ -3329,6 +3451,36 @@ export type PostBotsByBotIdMcpByIdOauthDiscoverResponses = { export type PostBotsByBotIdMcpByIdOauthDiscoverResponse = PostBotsByBotIdMcpByIdOauthDiscoverResponses[keyof PostBotsByBotIdMcpByIdOauthDiscoverResponses]; +export type PostBotsByBotIdMcpByIdOauthExchangeData = { + /** + * Authorization code and state + */ + body: HandlersOauthExchangeRequest; + path?: never; + query?: never; + url: '/bots/{bot_id}/mcp/{id}/oauth/exchange'; +}; + +export type PostBotsByBotIdMcpByIdOauthExchangeErrors = { + /** + * Bad Request + */ + 400: HandlersErrorResponse; +}; + +export type PostBotsByBotIdMcpByIdOauthExchangeError = PostBotsByBotIdMcpByIdOauthExchangeErrors[keyof PostBotsByBotIdMcpByIdOauthExchangeErrors]; + +export type PostBotsByBotIdMcpByIdOauthExchangeResponses = { + /** + * OK + */ + 200: { + [key: string]: boolean; + }; +}; + +export type PostBotsByBotIdMcpByIdOauthExchangeResponse = PostBotsByBotIdMcpByIdOauthExchangeResponses[keyof PostBotsByBotIdMcpByIdOauthExchangeResponses]; + export type GetBotsByBotIdMcpByIdOauthStatusData = { body?: never; path: { diff --git a/packages/web/src/i18n/locales/en.json b/packages/web/src/i18n/locales/en.json index 30356077..484a6ef3 100644 --- a/packages/web/src/i18n/locales/en.json +++ b/packages/web/src/i18n/locales/en.json @@ -503,7 +503,13 @@ "subtitle": "Manage the runtime container attached to this bot.", "botNotReady": "This bot is in lifecycle transition. Container actions are temporarily disabled.", "empty": "No container found for this bot. Create one to enable runtime tooling.", - "deleteConfirm": "Are you sure you want to delete this container?", + "createHint": "The container is created from the current image. If you explicitly enable restore, preserved data will be restored after creation.", + "createRestoreDataLabel": "Restore preserved data after creation", + "createRestoreDataDescription": "If a previously exported backup or legacy bind-mounted data exists, it will be restored into `/data` after the container is created.", + "deleteConfirm": "Are you sure you want to permanently delete this container? Unpreserved data cannot be recovered.", + "deletePreserveConfirm": "Are you sure you want to export `/data` and then delete this container?", + "restoreConfirm": "Are you sure you want to restore preserved data into this container's `/data`?", + "rollbackConfirm": "Are you sure you want to roll back to this snapshot version?", "taskRunning": "Running", "taskStopped": "Stopped", "taskCompleted": "Completed", @@ -515,13 +521,30 @@ "loadFailed": "Failed to load container information", "actionFailed": "Container action failed", "createSuccess": "Container created", + "createRestoreSuccess": "Container created and data restored", "startSuccess": "Container started", "stopSuccess": "Container stopped", "deleteSuccess": "Container deleted", + "deletePreserveSuccess": "Container deleted and data preserved", "snapshotSuccess": "Snapshot created", + "exportSuccess": "Data exported", + "importSuccess": "Data imported", + "restoreSuccess": "Preserved data restored", + "rollbackSuccess": "Snapshot rolled back", "snapshotEmpty": "No snapshots found", "snapshotLoadFailed": "Failed to load snapshots", - "snapshotNamePlaceholder": "Snapshot name (optional)", + "snapshotNamePlaceholder": "Snapshot display name (optional)", + "snapshotNameHint": "This field is only for the user-visible display name. The internal snapshot name is generated automatically.", + "dataTitle": "Data Operations", + "dataSubtitle": "Independently manage import, export, and restore for the container `/data` directory.", + "deleteTitle": "Delete Container", + "deleteSubtitle": "Before deletion, explicitly choose whether `/data` should be preserved to avoid accidental data loss.", + "preservedDataAvailable": "Preserved data is available and can be restored into the current container.", + "preservedDataAvailableShort": "Available", + "preservedDataEmpty": "None", + "sourceManual": "Manual", + "sourcePreExec": "Auto before execution", + "sourceRollback": "Generated by rollback", "fields": { "id": "Container ID", "status": "Container Status", @@ -530,21 +553,29 @@ "image": "Image", "hostPath": "Host Path", "containerPath": "Container Path", + "preservedData": "Preserved Data", "createdAt": "Created At", "updatedAt": "Updated At" }, "snapshotColumns": { "name": "Name", - "kind": "Kind", + "version": "Version", + "source": "Source", "parent": "Parent", - "createdAt": "Created At" + "createdAt": "Created At", + "actions": "Actions" }, "actions": { "create": "Create Container", "start": "Start", "stop": "Stop", - "delete": "Delete", - "snapshot": "Create Snapshot" + "delete": "Delete Permanently", + "deletePreserve": "Delete and Preserve Data", + "snapshot": "Create Snapshot", + "exportData": "Export Data", + "importData": "Import Data", + "restoreData": "Restore Preserved Data", + "rollback": "Rollback" } }, "settings": { diff --git a/packages/web/src/i18n/locales/zh.json b/packages/web/src/i18n/locales/zh.json index 53f83a0d..80a8e034 100644 --- a/packages/web/src/i18n/locales/zh.json +++ b/packages/web/src/i18n/locales/zh.json @@ -499,7 +499,13 @@ "subtitle": "管理当前 Bot 对应的运行容器。", "botNotReady": "当前 Bot 正在生命周期变更中,暂时不可操作容器。", "empty": "当前 Bot 尚未创建容器,创建后可启用运行环境能力。", - "deleteConfirm": "确定要删除这个容器吗?", + "createHint": "容器会基于当前镜像创建;如你显式开启恢复,则会在创建后尝试恢复已保留的数据。", + "createRestoreDataLabel": "创建后恢复已保留数据", + "createRestoreDataDescription": "如果存在之前导出的备份或旧版 bind mount 数据,将在容器创建后恢复到 `/data`。", + "deleteConfirm": "确定要彻底删除这个容器吗?未保留的数据将无法恢复。", + "deletePreserveConfirm": "确定要先导出 `/data` 再删除这个容器吗?", + "restoreConfirm": "确定要将已保留的数据恢复到当前容器的 `/data` 吗?", + "rollbackConfirm": "确定要回滚到这个快照版本吗?", "taskRunning": "运行中", "taskStopped": "已停止", "taskCompleted": "已完成", @@ -511,13 +517,30 @@ "loadFailed": "加载容器信息失败", "actionFailed": "容器操作失败", "createSuccess": "容器创建成功", + "createRestoreSuccess": "容器创建成功,已恢复数据", "startSuccess": "容器启动成功", "stopSuccess": "容器停止成功", "deleteSuccess": "容器删除成功", + "deletePreserveSuccess": "容器已删除,数据已保留", "snapshotSuccess": "快照创建成功", + "exportSuccess": "数据导出成功", + "importSuccess": "数据导入成功", + "restoreSuccess": "已恢复保留数据", + "rollbackSuccess": "快照回滚成功", "snapshotEmpty": "暂无快照", "snapshotLoadFailed": "加载快照失败", - "snapshotNamePlaceholder": "快照名称(可选)", + "snapshotNamePlaceholder": "快照显示名称(可选)", + "snapshotNameHint": "这里只填写用户可见的显示名称,系统会自动生成内部快照名。", + "dataTitle": "数据操作", + "dataSubtitle": "独立管理容器 `/data` 目录的导入、导出与恢复。", + "deleteTitle": "删除容器", + "deleteSubtitle": "删除容器前请明确选择是否先保留 `/data`,避免误删用户数据。", + "preservedDataAvailable": "检测到可恢复的已保留数据,可直接恢复到当前容器。", + "preservedDataAvailableShort": "可恢复", + "preservedDataEmpty": "无", + "sourceManual": "手动创建", + "sourcePreExec": "执行前自动创建", + "sourceRollback": "回滚生成", "fields": { "id": "容器 ID", "status": "容器状态", @@ -526,21 +549,29 @@ "image": "镜像", "hostPath": "主机路径", "containerPath": "容器路径", + "preservedData": "保留数据", "createdAt": "创建时间", "updatedAt": "更新时间" }, "snapshotColumns": { "name": "名称", - "kind": "类型", + "version": "版本", + "source": "来源", "parent": "父级", - "createdAt": "创建时间" + "createdAt": "创建时间", + "actions": "操作" }, "actions": { "create": "创建容器", "start": "启动", "stop": "停止", - "delete": "删除", - "snapshot": "创建快照" + "delete": "彻底删除", + "deletePreserve": "保留数据后删除", + "snapshot": "创建快照", + "exportData": "导出数据", + "importData": "导入数据", + "restoreData": "恢复保留数据", + "rollback": "回滚" } }, "settings": { diff --git a/packages/web/src/pages/bots/components/bot-container.vue b/packages/web/src/pages/bots/components/bot-container.vue index ffb39961..1575ba94 100644 --- a/packages/web/src/pages/bots/components/bot-container.vue +++ b/packages/web/src/pages/bots/components/bot-container.vue @@ -1,71 +1,96 @@