diff --git a/apps/api/cmd/clickclack/channels_delete_test.go b/apps/api/cmd/clickclack/channels_delete_test.go new file mode 100644 index 000000000..b5b36724d --- /dev/null +++ b/apps/api/cmd/clickclack/channels_delete_test.go @@ -0,0 +1,116 @@ +package main + +import ( + "encoding/json" + "net/http" + "net/http/httptest" + "os" + "path/filepath" + "strings" + "testing" + + "github.com/openclaw/clickclack/apps/api/internal/store" +) + +type channelDeletionServer struct { + *httptest.Server + blocker string + deletes []string +} + +func newChannelDeletionServer(t *testing.T) *channelDeletionServer { + t.Helper() + fake := &channelDeletionServer{} + fake.Server = httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "application/json") + switch { + case r.URL.Path == "/api/workspaces": + _ = json.NewEncoder(w).Encode(map[string]any{"workspaces": []store.Workspace{{ID: "wsp_1", Slug: "one", Name: "One"}}}) + case r.URL.Path == "/api/workspaces/wsp_1/channels": + _ = json.NewEncoder(w).Encode(map[string]any{"channels": []store.Channel{ + {ID: "chn_1", WorkspaceID: "wsp_1", Name: "general"}, + {ID: "chn_2", WorkspaceID: "wsp_1", Name: "doomed"}, + }}) + case r.Method == http.MethodGet && r.URL.Path == "/api/channels/chn_2/deletion-preview": + _ = json.NewEncoder(w).Encode(store.ChannelDeletionPreview{ + Channel: store.Channel{ID: "chn_2", Name: "doomed"}, + Counts: store.ChannelDeletionCounts{Messages: 12, ThreadReplies: 3, Files: 2}, + Blocker: fake.blocker, + }) + case r.Method == http.MethodDelete && r.URL.Path == "/api/channels/chn_2": + fake.deletes = append(fake.deletes, r.URL.Path) + w.WriteHeader(http.StatusNoContent) + default: + http.NotFound(w, r) + } + })) + t.Cleanup(fake.Close) + return fake +} + +func TestChannelsDeleteRequiresExplicitConfirmation(t *testing.T) { + server := newChannelDeletionServer(t) + c := apiClient{opts: clientOptions{Server: server.URL, UserID: "usr_1", Workspace: "wsp_1"}, http: server.Client()} + + if err := c.channels([]string{"delete"}); err == nil || !strings.Contains(err.Error(), "--channel CHANNEL --yes") { + t.Fatalf("expected an explicit channel requirement, got %v", err) + } + if err := c.channels([]string{"delete", "--channel", "doomed"}); err == nil || !strings.Contains(err.Error(), "#doomed: 12 messages, 3 thread replies, 2 files without --yes") { + t.Fatalf("expected a confirmation requirement, got %v", err) + } + server.blocker = store.ChannelDeletionBlockedLastChannel + if err := c.channels([]string{"delete", "--channel", "doomed", "--yes"}); err == nil || !strings.Contains(err.Error(), "(last_channel)") { + t.Fatalf("expected the blocker to stop deletion, got %v", err) + } + if len(server.deletes) != 0 { + t.Fatalf("unconfirmed or blocked commands sent deletes: %v", server.deletes) + } + server.blocker = "" + output := captureStdout(t, func() error { + return c.channels([]string{"delete", "--channel", "doomed", "--yes"}) + }) + if len(server.deletes) != 1 || output != "deleted #doomed: 12 messages, 3 thread replies, 2 files\n" { + t.Fatalf("deletes=%v output=%q", server.deletes, output) + } +} + +func TestChannelsDeleteIgnoresDefaultChannels(t *testing.T) { + server := newChannelDeletionServer(t) + configHome := t.TempDir() + t.Setenv("XDG_CONFIG_HOME", configHome) + t.Setenv("CLICKCLACK_SERVER", server.URL) + t.Setenv("CLICKCLACK_USER_ID", "usr_1") + t.Setenv("CLICKCLACK_WORKSPACE", "wsp_1") + + t.Setenv("CLICKCLACK_CHANNEL", "doomed") + if err := client([]string{"channels", "delete", "--yes"}); err == nil || !strings.Contains(err.Error(), "--channel CHANNEL --yes") { + t.Fatalf("CLICKCLACK_CHANNEL chose the channel to delete: %v", err) + } + t.Setenv("CLICKCLACK_CHANNEL", "") + config, err := json.Marshal(clientConfig{Server: server.URL, Workspace: "wsp_1", Channel: "doomed"}) + if err != nil { + t.Fatal(err) + } + if err := os.MkdirAll(filepath.Join(configHome, "clickclack"), 0o700); err != nil { + t.Fatal(err) + } + if err := os.WriteFile(filepath.Join(configHome, "clickclack", "config.json"), config, 0o600); err != nil { + t.Fatal(err) + } + if err := client([]string{"channels", "delete", "--yes"}); err == nil || !strings.Contains(err.Error(), "--channel CHANNEL --yes") { + t.Fatalf("the saved default channel chose the channel to delete: %v", err) + } + if len(server.deletes) != 0 { + t.Fatalf("a default channel was deleted: %v", server.deletes) + } + + for _, args := range [][]string{ + {"--channel", "doomed", "channels", "delete", "--yes"}, + {"channels", "delete", "--channel", "doomed", "--yes"}, + } { + captureStdout(t, func() error { return client(args) }) + } + if len(server.deletes) != 2 { + t.Fatalf("named channels were not deleted: %v", server.deletes) + } +} diff --git a/apps/api/cmd/clickclack/client.go b/apps/api/cmd/clickclack/client.go index 4bd2dc80e..f7c6a4ac4 100644 --- a/apps/api/cmd/clickclack/client.go +++ b/apps/api/cmd/clickclack/client.go @@ -28,6 +28,9 @@ type clientOptions struct { Plain bool `json:"-"` NoInput bool `json:"-"` Verbose bool `json:"-"` + // ChannelFromFlag is set when the command line named the channel rather + // than CLICKCLACK_CHANNEL or the saved config. + ChannelFromFlag bool `json:"-"` } type clientConfig struct { @@ -58,6 +61,7 @@ func client(args []string) error { if err := flags.Parse(args); err != nil { return err } + opts.ChannelFromFlag = flagWasSet(flags, "channel") rest := flags.Args() if len(rest) == 0 { return errors.New("client command is required") @@ -157,6 +161,14 @@ func addClientFlags(flags *flag.FlagSet, opts *clientOptions) { flags.BoolVar(&opts.Verbose, "verbose", opts.Verbose, "print diagnostics to stderr") } +func flagWasSet(flags *flag.FlagSet, name string) bool { + set := false + flags.Visit(func(f *flag.Flag) { + set = set || f.Name == name + }) + return set +} + func (c apiClient) withOptions(opts clientOptions, useStoredToken bool) apiClient { if useStoredToken { applyStoredDefaults(&opts, c.defaults) diff --git a/apps/api/cmd/clickclack/client_commands.go b/apps/api/cmd/clickclack/client_commands.go index 8f2033b55..14706f987 100644 --- a/apps/api/cmd/clickclack/client_commands.go +++ b/apps/api/cmd/clickclack/client_commands.go @@ -128,8 +128,11 @@ func (c apiClient) workspaces(args []string) error { } func (c apiClient) channels(args []string) error { + if len(args) > 0 && args[0] == "delete" { + return c.channelsDelete(args[1:]) + } if len(args) == 0 || args[0] != "list" { - return errors.New("usage: clickclack channels list [--workspace WORKSPACE]") + return errors.New("usage: clickclack channels list [--workspace WORKSPACE] | channels delete --channel CHANNEL --yes") } opts := c.opts flags := flag.NewFlagSet("channels list", flag.ExitOnError) @@ -155,6 +158,43 @@ func (c apiClient) channels(args []string) error { return nil } +// channelsDelete requires --yes and a channel named on the command line because +// the deletion cannot be undone. CLICKCLACK_CHANNEL and the saved default +// channel never choose what gets deleted. +func (c apiClient) channelsDelete(args []string) error { + opts := c.opts + flags := flag.NewFlagSet("channels delete", flag.ExitOnError) + addClientFlags(flags, &opts) + confirmed := flags.Bool("yes", false, "confirm permanent deletion") + if err := flags.Parse(args); err != nil { + return err + } + named := opts.ChannelFromFlag || flagWasSet(flags, "channel") + if !named || strings.TrimSpace(opts.Channel) == "" { + return errors.New("usage: clickclack channels delete --channel CHANNEL --yes") + } + c = c.withOptions(opts, true) + _, channel, err := c.resolveChannel() + if err != nil { + return err + } + var preview store.ChannelDeletionPreview + if err := c.get("/api/channels/"+url.PathEscape(channel.ID)+"/deletion-preview", &preview); err != nil { + return err + } + summary := fmt.Sprintf("#%s: %d messages, %d thread replies, %d files", channel.Name, preview.Counts.Messages, preview.Counts.ThreadReplies, preview.Counts.Files) + if preview.Blocker != "" { + return fmt.Errorf("cannot delete %s (%s)", summary, preview.Blocker) + } + if !*confirmed { + return fmt.Errorf("refusing to permanently delete %s without --yes", summary) + } + if err := c.doJSON(context.Background(), http.MethodDelete, "/api/channels/"+url.PathEscape(channel.ID), nil, nil); err != nil { + return err + } + return c.write(map[string]any{"deleted_channel": channel, "counts": preview.Counts}, channel.ID, "deleted "+summary+"\n") +} + func (c apiClient) messages(args []string) error { if len(args) == 0 { return errors.New("usage: clickclack messages ") diff --git a/apps/api/internal/httpapi/channel_deletion_test.go b/apps/api/internal/httpapi/channel_deletion_test.go new file mode 100644 index 000000000..678f68e47 --- /dev/null +++ b/apps/api/internal/httpapi/channel_deletion_test.go @@ -0,0 +1,184 @@ +package httpapi + +import ( + "context" + "net/http" + "net/http/httptest" + "net/url" + "os" + "path/filepath" + "strings" + "testing" + + "github.com/coder/websocket" + "github.com/openclaw/clickclack/apps/api/internal/realtime" + "github.com/openclaw/clickclack/apps/api/internal/store" + sqlitestore "github.com/openclaw/clickclack/apps/api/internal/store/sqlite" +) + +func TestChannelDeletionHTTP(t *testing.T) { + t.Parallel() + ctx := context.Background() + dataDir := t.TempDir() + st, err := sqlitestore.Open("sqlite://" + filepath.Join(dataDir, "clickclack.db")) + if err != nil { + t.Fatal(err) + } + t.Cleanup(func() { _ = st.Close() }) + if err := st.Migrate(ctx); err != nil { + t.Fatal(err) + } + owner, err := st.EnsureBootstrap(ctx, "Owner", "channel-http-owner@example.com") + if err != nil { + t.Fatal(err) + } + workspaces, err := st.ListWorkspaces(ctx, owner.ID) + if err != nil { + t.Fatal(err) + } + workspace := workspaces[0] + member, err := st.CreateUser(ctx, store.CreateUserInput{DisplayName: "Member", Email: "channel-http-member@example.com"}) + if err != nil { + t.Fatal(err) + } + if err := st.AddWorkspaceMember(ctx, workspace.ID, member.ID, store.WorkspaceRoleMember); err != nil { + t.Fatal(err) + } + _, botToken, err := st.CreateBot(ctx, store.CreateBotInput{ + WorkspaceID: workspace.ID, + DisplayName: "Channel Admin Bot", + Scopes: []string{"bot:admin"}, + CreatedBy: owner.ID, + }) + if err != nil { + t.Fatal(err) + } + server := httptest.NewServer(New(st, realtime.NewHub(), Options{UploadDir: filepath.Join(dataDir, "uploads")}).Handler()) + t.Cleanup(server.Close) + + doomed := postJSONAsUser[struct { + Channel store.Channel `json:"channel"` + }](t, owner.ID, server.URL+"/api/workspaces/"+workspace.ID+"/channels", map[string]string{"name": "doomed"}).Channel + upload := uploadFileAsUserWithContentType(t, owner.ID, server.URL+"/api/uploads", workspace.ID, "notes.txt", "text/plain", "doomed notes") + created := postJSONAsUser[struct { + Message store.Message `json:"message"` + Event store.Event `json:"event"` + }](t, owner.ID, server.URL+"/api/channels/"+doomed.ID+"/messages", map[string]string{"body": "doomed", "upload_id": upload.ID}) + storedUpload, err := st.GetUpload(ctx, upload.ID, owner.ID) + if err != nil { + t.Fatal(err) + } + if _, err := os.Stat(storedUpload.StoragePath); err != nil { + t.Fatalf("expected the upload object before deletion: %v", err) + } + + previewURL := server.URL + "/api/channels/" + doomed.ID + "/deletion-preview" + deleteURL := server.URL + "/api/channels/" + doomed.ID + preview := getJSONAsUser[store.ChannelDeletionPreview](t, owner.ID, previewURL) + if preview.Channel.ID != doomed.ID || preview.Counts.Messages != 1 || preview.Counts.Files != 1 || preview.Counts.FileBytes != int64(len("doomed notes")) || preview.Blocker != "" { + t.Fatalf("unexpected preview: %#v", preview) + } + expectStatusAsUser(t, member.ID, http.MethodGet, previewURL, nil, http.StatusForbidden) + expectStatusAsUser(t, member.ID, http.MethodDelete, deleteURL, nil, http.StatusForbidden) + expectStatusWithBearer(t, botToken.Token, http.MethodGet, previewURL, nil, http.StatusForbidden) + expectStatusWithBearer(t, botToken.Token, http.MethodDelete, deleteURL, nil, http.StatusForbidden) + expectStatusAsUser(t, owner.ID, http.MethodDelete, server.URL+"/api/channels/chn_missing", nil, http.StatusNotFound) + + moderator, err := st.CreateUser(ctx, store.CreateUserInput{DisplayName: "Moderator", Email: "channel-http-moderator@example.com"}) + if err != nil { + t.Fatal(err) + } + if err := st.AddWorkspaceMember(ctx, workspace.ID, moderator.ID, store.WorkspaceRoleModerator); err != nil { + t.Fatal(err) + } + assertRejectedEffects := func(actorUserID string) { + t.Helper() + before, err := st.LatestEventCursor(ctx, workspace.ID, member.ID) + if err != nil { + t.Fatal(err) + } + expectStatusAsUser(t, actorUserID, http.MethodDelete, deleteURL, nil, http.StatusForbidden) + if _, err := st.GetChannel(ctx, doomed.ID, member.ID); err != nil { + t.Fatalf("rejected deletion removed the channel: %v", err) + } + if message, err := st.GetMessage(ctx, created.Message.ID, member.ID); err != nil || message.Body != "doomed" { + t.Fatalf("rejected deletion changed the message: %#v, %v", message, err) + } + if _, err := st.GetUpload(ctx, upload.ID, member.ID); err != nil { + t.Fatalf("rejected deletion removed the upload row: %v", err) + } + if contents, err := os.ReadFile(storedUpload.StoragePath); err != nil || string(contents) != "doomed notes" { + t.Fatalf("rejected deletion removed the file object: %v", err) + } + if cleanups, err := st.ListPendingUploadCleanups(ctx, 100); err != nil || len(cleanups) != 0 { + t.Fatalf("rejected deletion enqueued cleanup: %#v, %v", cleanups, err) + } + if events, err := st.ListEventsAfter(ctx, workspace.ID, member.ID, before, 100); err != nil || len(events) != 0 { + t.Fatalf("rejected deletion appended events: %#v, %v", events, err) + } + } + assertRejectedEffects(moderator.ID) + if _, _, err := st.TransferWorkspaceOwnership(ctx, store.TransferWorkspaceOwnershipInput{ + WorkspaceID: workspace.ID, ActorUserID: owner.ID, NewOwnerUserID: member.ID, + }); err != nil { + t.Fatal(err) + } + assertRejectedEffects(owner.ID) + + wsURL := strings.Replace(server.URL, "http://", "ws://", 1) + "/api/realtime/ws?workspace_id=" + url.QueryEscape(workspace.ID) + memberConn, _, err := websocket.Dial(ctx, wsURL, &websocket.DialOptions{ + HTTPHeader: http.Header{"X-ClickClack-User": []string{member.ID}}, + }) + if err != nil { + t.Fatal(err) + } + t.Cleanup(func() { _ = memberConn.Close(websocket.StatusNormalClosure, "done") }) + + expectStatusAsUser(t, member.ID, http.MethodDelete, deleteURL, nil, http.StatusNoContent) + live := readEventType(t, memberConn, "channel.deleted") + payload, ok := live.Payload.(map[string]any) + if live.ChannelID != "" || !ok || payload["channel_id"] != doomed.ID || payload["deleted_by"] != member.ID { + t.Fatalf("unexpected live deletion event: %#v", live) + } + // A client that reconnects from one of the channel's events keeps its place + // and replays forward to the deletion instead of being forced to resync. + resumed, _, err := websocket.Dial(ctx, wsURL+"&after_cursor="+url.QueryEscape(created.Event.Cursor), &websocket.DialOptions{ + HTTPHeader: http.Header{"X-ClickClack-User": []string{member.ID}}, + }) + if err != nil { + t.Fatal(err) + } + t.Cleanup(func() { _ = resumed.Close(websocket.StatusNormalClosure, "done") }) + if replayed := readEventType(t, resumed, "channel.deleted"); replayed.ID != live.ID { + t.Fatalf("resumed socket replayed %#v, want %#v", replayed, live) + } + if _, err := os.Stat(storedUpload.StoragePath); !os.IsNotExist(err) { + t.Fatalf("expected the upload object to be removed, got %v", err) + } + expectStatusAsUser(t, owner.ID, http.MethodGet, previewURL, nil, http.StatusNotFound) + expectStatusAsUser(t, owner.ID, http.MethodDelete, deleteURL, nil, http.StatusNotFound) + auditLog := getJSONAsUser[struct { + AuditLogEntries []store.AuditLogEntry `json:"audit_log_entries"` + }](t, member.ID, server.URL+"/api/workspaces/"+workspace.ID+"/audit-log") + foundAudit := false + for _, entry := range auditLog.AuditLogEntries { + if entry.Action == "channel.deleted" && entry.TargetID == doomed.ID && entry.Metadata["name"] == "doomed" { + foundAudit = true + } + } + if !foundAudit { + t.Fatalf("expected a channel.deleted audit entry, got %#v", auditLog.AuditLogEntries) + } + + solo := postJSONAsUser[struct { + Workspace store.Workspace `json:"workspace"` + }](t, owner.ID, server.URL+"/api/workspaces", map[string]string{"name": "Solo"}).Workspace + only := postJSONAsUser[struct { + Channel store.Channel `json:"channel"` + }](t, owner.ID, server.URL+"/api/workspaces/"+solo.ID+"/channels", map[string]string{"name": "only"}).Channel + lastPreview := getJSONAsUser[store.ChannelDeletionPreview](t, owner.ID, server.URL+"/api/channels/"+only.ID+"/deletion-preview") + if lastPreview.Blocker != store.ChannelDeletionBlockedLastChannel { + t.Fatalf("expected last-channel blocker, got %#v", lastPreview) + } + expectStatusAsUser(t, owner.ID, http.MethodDelete, server.URL+"/api/channels/"+only.ID, nil, http.StatusConflict) +} diff --git a/apps/api/internal/httpapi/channels.go b/apps/api/internal/httpapi/channels.go index 46b2ef634..17b17d1db 100644 --- a/apps/api/internal/httpapi/channels.go +++ b/apps/api/internal/httpapi/channels.go @@ -1,6 +1,9 @@ package httpapi import ( + "database/sql" + "errors" + "log" "net/http" "github.com/go-chi/chi/v5" @@ -115,3 +118,69 @@ func (s *Server) createTopic(w http.ResponseWriter, r *http.Request) { topic, err := s.store.CreateTopic(r.Context(), store.CreateTopicInput{WorkspaceID: workspaceID, ChannelID: body.ChannelID, Name: body.Name, CreatedBy: act.user.ID}) writeResultStatus(w, http.StatusCreated, map[string]any{"topic": topic}, err) } + +func (s *Server) channelDeletionPreview(w http.ResponseWriter, r *http.Request) { + act, ok := s.channelDeletionActor(w, r) + if !ok { + return + } + preview, err := s.store.PreviewChannelDeletion(r.Context(), chi.URLParam(r, "channel_id"), act.user.ID) + if err != nil { + writeChannelDeletionError(w, err) + return + } + writeJSON(w, http.StatusOK, preview) +} + +func (s *Server) deleteChannel(w http.ResponseWriter, r *http.Request) { + act, ok := s.channelDeletionActor(w, r) + if !ok { + return + } + deletion, err := s.store.DeleteChannel(r.Context(), chi.URLParam(r, "channel_id"), act.user.ID) + if err != nil { + writeChannelDeletionError(w, err) + return + } + s.publishEvent(r.Context(), deletion.Event) + s.recordAudit(r.Context(), deletion.Channel.WorkspaceID, act.user.ID, "channel.deleted", "channel", deletion.Channel.ID, map[string]any{ + "name": deletion.Channel.Name, + "messages": deletion.Counts.Messages, + "thread_replies": deletion.Counts.ThreadReplies, + "files": deletion.Counts.Files, + }) + if err := s.cleanupUploadObjects(r.Context(), deletion.Cleanups); err != nil { + log.Printf("channel %s deleted with pending upload cleanup retry: %v", deletion.Channel.ID, err) + } + w.WriteHeader(http.StatusNoContent) +} + +// channelDeletionActor admits human sessions only; owner authorization happens +// in the store transaction. +func (s *Server) channelDeletionActor(w http.ResponseWriter, r *http.Request) (actor, bool) { + act, err := s.currentActor(r) + if err != nil { + writeError(w, http.StatusUnauthorized, err) + return actor{}, false + } + if act.botTokenID != "" { + writeError(w, http.StatusForbidden, errors.New("bot tokens cannot delete channels")) + return actor{}, false + } + if err := act.requireScope("channels:write"); err != nil { + writeError(w, http.StatusForbidden, err) + return actor{}, false + } + return act, true +} + +func writeChannelDeletionError(w http.ResponseWriter, err error) { + switch { + case errors.Is(err, sql.ErrNoRows): + writeError(w, http.StatusNotFound, errors.New("channel not found")) + case errors.Is(err, store.ErrLastChannel), errors.Is(err, store.ErrProvisionedChannel): + writeError(w, http.StatusConflict, err) + default: + writeStoreError(w, err) + } +} diff --git a/apps/api/internal/httpapi/server.go b/apps/api/internal/httpapi/server.go index ace8e7dbd..ff08b6c13 100644 --- a/apps/api/internal/httpapi/server.go +++ b/apps/api/internal/httpapi/server.go @@ -243,6 +243,8 @@ func (s *Server) Handler() http.Handler { r.Post("/workspaces/{workspace_id}/connected-accounts", s.createConnectedAccount) r.Post("/connected-accounts/{account_id}/revoke", s.revokeConnectedAccount) r.Patch("/channels/{channel_id}", s.updateChannel) + r.Delete("/channels/{channel_id}", s.deleteChannel) + r.Get("/channels/{channel_id}/deletion-preview", s.channelDeletionPreview) r.Get("/channels/{channel_id}/messages", s.listMessages) r.Post("/channels/{channel_id}/messages", s.createMessage) r.Get("/channels/{channel_id}/notification-settings", s.getChannelNotificationSettings) diff --git a/apps/api/internal/store/channel_deletion.go b/apps/api/internal/store/channel_deletion.go new file mode 100644 index 000000000..ef201fc8c --- /dev/null +++ b/apps/api/internal/store/channel_deletion.go @@ -0,0 +1,64 @@ +package store + +import "errors" + +// ErrLastChannel is returned when deleting the only channel left in a workspace. +var ErrLastChannel = errors.New("a workspace must keep at least one channel") + +// ErrProvisionedChannel is returned when deleting a channel the server recreates. +var ErrProvisionedChannel = errors.New("guest workspace channels are recreated on sign-in and cannot be deleted") + +const ( + ChannelDeletionBlockedLastChannel = "last_channel" + ChannelDeletionBlockedProvisionedChannel = "provisioned_channel" +) + +// ChannelDeletionCounts describes the visible content a channel deletion removes. +// Files are the uploads attached only to this channel. +type ChannelDeletionCounts struct { + Messages int64 `json:"messages"` + ThreadReplies int64 `json:"thread_replies"` + Pins int64 `json:"pins"` + Topics int64 `json:"topics"` + Files int64 `json:"files"` + FileBytes int64 `json:"file_bytes"` +} + +type ChannelDeletionPreview struct { + Channel Channel `json:"channel"` + Counts ChannelDeletionCounts `json:"counts"` + // Blocker names the rule that prevents deletion, when one applies. + Blocker string `json:"blocker,omitempty"` +} + +// ChannelDeletion is the committed result of deleting a channel. +type ChannelDeletion struct { + Channel Channel + Counts ChannelDeletionCounts + Event Event + Cleanups []PendingUploadCleanup +} + +// ChannelDeletionBlocker returns the rule that prevents deleting a channel, or nil. +func ChannelDeletionBlocker(workspaceSlug, channelName string, workspaceChannels int64) error { + // The Guests workspace recreates both channels on the next guest sign-in. + if workspaceSlug == "guests" && (channelName == GuestChannelName || channelName == "general") { + return ErrProvisionedChannel + } + if workspaceChannels <= 1 { + return ErrLastChannel + } + return nil +} + +// ChannelDeletionBlockerCode maps a blocker error to its API code. +func ChannelDeletionBlockerCode(err error) string { + switch { + case errors.Is(err, ErrLastChannel): + return ChannelDeletionBlockedLastChannel + case errors.Is(err, ErrProvisionedChannel): + return ChannelDeletionBlockedProvisionedChannel + default: + return "" + } +} diff --git a/apps/api/internal/store/channeldeletiontest/deletion.go b/apps/api/internal/store/channeldeletiontest/deletion.go new file mode 100644 index 000000000..e64704392 --- /dev/null +++ b/apps/api/internal/store/channeldeletiontest/deletion.go @@ -0,0 +1,340 @@ +// Package channeldeletiontest checks channel deletion against each SQL backend. +package channeldeletiontest + +import ( + "context" + "database/sql" + "errors" + "testing" + + "github.com/openclaw/clickclack/apps/api/internal/store" + "github.com/openclaw/clickclack/apps/api/internal/store/storetest" +) + +// Hooks give the shared checks access to backend-specific SQL. +type Hooks struct { + // OwnedRows counts rows that must disappear with the channel, keyed by a + // readable label such as "reactions" or "search rows". + OwnedRows func(t *testing.T, channelID string, messageIDs []string) map[string]int64 +} + +type fixture struct { + owner store.User + member store.User + workspace store.Workspace + doomed store.Channel + kept store.Channel + root store.Message + reply store.Message + keptRoot store.Message + exclusive store.Upload + shared store.Upload + icon store.Upload + directRoot store.Message + rootEvent store.Event +} + +func DeleteChannelRemovesOwnedContent(t *testing.T, st store.Store, hooks Hooks) { + t.Helper() + ctx := context.Background() + f := newFixture(t, st) + + preview, err := st.PreviewChannelDeletion(ctx, f.doomed.ID, f.owner.ID) + if err != nil { + t.Fatal(err) + } + wantCounts := store.ChannelDeletionCounts{Messages: 1, ThreadReplies: 1, Pins: 1, Topics: 1, Files: 1, FileBytes: f.exclusive.ByteSize} + if preview.Channel.ID != f.doomed.ID || preview.Counts != wantCounts || preview.Blocker != "" { + t.Fatalf("preview = %#v, want counts %#v", preview, wantCounts) + } + before, err := st.LatestEventCursor(ctx, f.workspace.ID, f.owner.ID) + if err != nil { + t.Fatal(err) + } + + deletion, err := st.DeleteChannel(ctx, f.doomed.ID, f.owner.ID) + if err != nil { + t.Fatal(err) + } + if deletion.Channel.ID != f.doomed.ID || deletion.Counts != wantCounts { + t.Fatalf("deletion = %#v", deletion) + } + payload, _ := deletion.Event.Payload.(map[string]string) + if deletion.Event.Type != "channel.deleted" || deletion.Event.ChannelID != "" || payload["channel_id"] != f.doomed.ID || payload["deleted_by"] != f.owner.ID || deletion.Event.Cursor <= before { + t.Fatalf("deletion event = %#v, previous cursor %q", deletion.Event, before) + } + if len(deletion.Cleanups) != 1 || deletion.Cleanups[0].StoragePath != f.exclusive.StoragePath { + t.Fatalf("cleanups = %#v, want only %q", deletion.Cleanups, f.exclusive.StoragePath) + } + + if _, err := st.GetChannel(ctx, f.doomed.ID, f.owner.ID); !errors.Is(err, sql.ErrNoRows) { + t.Fatalf("deleted channel lookup error = %v", err) + } + for _, id := range []string{f.root.ID, f.reply.ID} { + if _, err := st.GetMessage(ctx, id, f.owner.ID); err == nil { + t.Fatalf("message %s survived channel deletion", id) + } + } + if _, err := st.GetUpload(ctx, f.exclusive.ID, f.owner.ID); err == nil { + t.Fatal("upload used only by the deleted channel survived") + } + if _, err := st.GetUpload(ctx, f.shared.ID, f.owner.ID); err != nil { + t.Fatalf("upload still attached in another channel was removed: %v", err) + } + if workspace, err := st.GetWorkspace(ctx, f.workspace.ID, f.owner.ID); err != nil || workspace.IconURL != "/api/uploads/"+f.icon.ID { + t.Fatalf("workspace icon changed: %#v, %v", workspace, err) + } + if _, err := st.GetUpload(ctx, f.icon.ID, f.owner.ID); err != nil { + t.Fatalf("workspace icon upload was removed: %v", err) + } + for _, id := range []string{f.keptRoot.ID, f.directRoot.ID} { + if _, err := st.GetMessage(ctx, id, f.owner.ID); err != nil { + t.Fatalf("message %s outside the channel was removed: %v", id, err) + } + } + topics, err := st.ListTopics(ctx, f.workspace.ID, f.owner.ID) + if err != nil { + t.Fatal(err) + } + for _, topic := range topics { + if topic.ChannelID == f.doomed.ID { + t.Fatalf("channel topic survived: %#v", topic) + } + } + search, err := st.SearchMessagePage(ctx, store.SearchPageRequest{WorkspaceID: f.workspace.ID, UserID: f.owner.ID, Query: "zebracrossing", Limit: 20}) + if err != nil { + t.Fatal(err) + } + for _, hit := range search.Results { + if hit.ChannelID == f.doomed.ID { + t.Fatalf("search still returns deleted channel content: %#v", hit) + } + } + // A client whose cursor points at one of the channel's events must still + // replay forward to the deletion instead of losing its place. + if exists, err := st.EventCursorExists(ctx, f.workspace.ID, f.member.ID, f.rootEvent.Cursor); err != nil || !exists { + t.Fatalf("cursor of a deleted channel's event exists = %t, %v", exists, err) + } + replay, err := st.ListEventsAfter(ctx, f.workspace.ID, f.member.ID, f.rootEvent.Cursor, 1000) + if err != nil { + t.Fatal(err) + } + if len(replay) == 0 || replay[len(replay)-1].ID != deletion.Event.ID { + t.Fatalf("replay from a deleted channel's event did not reach the deletion: %#v", replay) + } + for label, count := range hooks.OwnedRows(t, f.doomed.ID, []string{f.root.ID, f.reply.ID}) { + if count != 0 { + t.Fatalf("%s left behind: %d", label, count) + } + } +} + +func DeleteChannelEnforcesGuardRails(t *testing.T, st store.Store) { + t.Helper() + ctx := context.Background() + f := newFixture(t, st) + + if _, err := st.PreviewChannelDeletion(ctx, f.doomed.ID, f.member.ID); !errors.Is(err, store.ErrWorkspaceOwnerRequired) { + t.Fatalf("member preview error = %v", err) + } + if _, err := st.DeleteChannel(ctx, f.doomed.ID, f.member.ID); !errors.Is(err, store.ErrWorkspaceOwnerRequired) { + t.Fatalf("member delete error = %v", err) + } + if _, err := st.DeleteChannel(ctx, "chn_missing", f.owner.ID); !errors.Is(err, sql.ErrNoRows) { + t.Fatalf("missing channel delete error = %v", err) + } + + solo, err := st.CreateWorkspace(ctx, store.CreateWorkspaceInput{Name: "Solo room"}, f.owner.ID) + if err != nil { + t.Fatal(err) + } + only, _, err := st.CreateChannel(ctx, store.CreateChannelInput{WorkspaceID: solo.ID, UserID: f.owner.ID, Name: "only"}) + if err != nil { + t.Fatal(err) + } + if preview, err := st.PreviewChannelDeletion(ctx, only.ID, f.owner.ID); err != nil || preview.Blocker != store.ChannelDeletionBlockedLastChannel { + t.Fatalf("last channel preview = %#v, %v", preview, err) + } + if _, err := st.DeleteChannel(ctx, only.ID, f.owner.ID); !errors.Is(err, store.ErrLastChannel) { + t.Fatalf("last channel delete error = %v", err) + } + + guest, err := st.CreateUser(ctx, store.CreateUserInput{DisplayName: "Guest", Email: "channel-delete-guest@example.com"}) + if err != nil { + t.Fatal(err) + } + guests, err := st.EnsureDefaultGuestWorkspaceMember(ctx, guest.ID, store.WorkspaceRoleGuest) + if err != nil { + t.Fatal(err) + } + if err := st.AddWorkspaceMember(ctx, guests.ID, f.owner.ID, store.WorkspaceRoleOwner); err != nil { + t.Fatal(err) + } + if _, _, err := st.CreateChannel(ctx, store.CreateChannelInput{WorkspaceID: guests.ID, UserID: f.owner.ID, Name: "lounge"}); err != nil { + t.Fatal(err) + } + guestChannels, err := st.ListChannels(ctx, guests.ID, f.owner.ID) + if err != nil { + t.Fatal(err) + } + for _, channel := range guestChannels { + _, err := st.DeleteChannel(ctx, channel.ID, f.owner.ID) + switch channel.Name { + case store.GuestChannelName, "general": + if !errors.Is(err, store.ErrProvisionedChannel) { + t.Fatalf("provisioned #%s delete error = %v", channel.Name, err) + } + default: + if err != nil { + t.Fatalf("ordinary guest workspace channel #%s delete error = %v", channel.Name, err) + } + } + } + + archived := true + if _, _, err := st.UpdateChannel(ctx, store.UpdateChannelInput{ChannelID: f.kept.ID, UserID: f.owner.ID, Archived: &archived}); err != nil { + t.Fatal(err) + } + if _, err := st.DeleteChannel(ctx, f.kept.ID, f.owner.ID); err != nil { + t.Fatalf("archived channel delete error = %v", err) + } +} + +func DeleteChannelRejectsLostAuthority(t *testing.T, st store.Store) { + t.Helper() + ctx := context.Background() + f := newFixture(t, st) + moderator, err := st.CreateUser(ctx, store.CreateUserInput{DisplayName: "Moderator", Email: "channel-delete-moderator@example.com"}) + if err != nil { + t.Fatal(err) + } + if err := st.AddWorkspaceMember(ctx, f.workspace.ID, moderator.ID, store.WorkspaceRoleModerator); err != nil { + t.Fatal(err) + } + assertDenied := func(actorUserID string) { + t.Helper() + before, err := st.LatestEventCursor(ctx, f.workspace.ID, f.member.ID) + if err != nil { + t.Fatal(err) + } + if _, err := st.DeleteChannel(ctx, f.doomed.ID, actorUserID); !errors.Is(err, store.ErrWorkspaceOwnerRequired) { + t.Fatalf("unauthorized deletion error = %v", err) + } + if _, err := st.GetChannel(ctx, f.doomed.ID, f.member.ID); err != nil { + t.Fatalf("unauthorized deletion removed channel: %v", err) + } + if _, err := st.GetMessage(ctx, f.root.ID, f.member.ID); err != nil { + t.Fatalf("unauthorized deletion removed message: %v", err) + } + if _, err := st.GetUpload(ctx, f.exclusive.ID, f.member.ID); err != nil { + t.Fatalf("unauthorized deletion removed exclusive upload: %v", err) + } + if cleanups, err := st.ListPendingUploadCleanups(ctx, 100); err != nil || len(cleanups) != 0 { + t.Fatalf("unauthorized deletion enqueued cleanup: %#v, %v", cleanups, err) + } + if events, err := st.ListEventsAfter(ctx, f.workspace.ID, f.member.ID, before, 100); err != nil || len(events) != 0 { + t.Fatalf("unauthorized deletion appended events: %#v, %v", events, err) + } + } + assertDenied(moderator.ID) + if _, _, err := st.TransferWorkspaceOwnership(ctx, store.TransferWorkspaceOwnershipInput{ + WorkspaceID: f.workspace.ID, ActorUserID: f.owner.ID, NewOwnerUserID: f.member.ID, + }); err != nil { + t.Fatal(err) + } + assertDenied(f.owner.ID) + if _, err := st.DeleteChannel(ctx, f.doomed.ID, f.member.ID); err != nil { + t.Fatalf("current owner could not delete channel: %v", err) + } +} + +func newFixture(t *testing.T, st store.Store) fixture { + t.Helper() + ctx := context.Background() + var f fixture + var err error + if f.owner, err = st.EnsureBootstrap(ctx, "Owner", "channel-delete-owner@example.com"); err != nil { + t.Fatal(err) + } + workspaces, err := st.ListWorkspaces(ctx, f.owner.ID) + if err != nil || len(workspaces) != 1 { + t.Fatalf("bootstrap workspaces = %#v, %v", workspaces, err) + } + f.workspace = workspaces[0] + if f.member, err = st.CreateUser(ctx, store.CreateUserInput{DisplayName: "Member", Email: "channel-delete-member@example.com"}); err != nil { + t.Fatal(err) + } + if err := st.AddWorkspaceMember(ctx, f.workspace.ID, f.member.ID, store.WorkspaceRoleMember); err != nil { + t.Fatal(err) + } + if f.doomed, _, err = st.CreateChannel(ctx, store.CreateChannelInput{WorkspaceID: f.workspace.ID, UserID: f.owner.ID, Name: "doomed"}); err != nil { + t.Fatal(err) + } + if f.kept, _, err = st.CreateChannel(ctx, store.CreateChannelInput{WorkspaceID: f.workspace.ID, UserID: f.owner.ID, Name: "kept"}); err != nil { + t.Fatal(err) + } + topic, err := st.CreateTopic(ctx, store.CreateTopicInput{WorkspaceID: f.workspace.ID, ChannelID: f.doomed.ID, Name: "launch", CreatedBy: f.owner.ID}) + if err != nil { + t.Fatal(err) + } + if f.root, f.rootEvent, err = st.CreateMessage(ctx, store.CreateMessageInput{ChannelID: f.doomed.ID, AuthorID: f.owner.ID, Body: "zebracrossing root", TopicID: topic.ID}); err != nil { + t.Fatal(err) + } + if f.reply, _, _, err = st.CreateThreadReply(ctx, store.CreateThreadReplyInput{RootMessageID: f.root.ID, AuthorID: f.member.ID, Body: "zebracrossing reply"}); err != nil { + t.Fatal(err) + } + if _, err := st.AddReaction(ctx, store.CreateReactionInput{MessageID: f.root.ID, UserID: f.member.ID, Emoji: "👍"}); err != nil { + t.Fatal(err) + } + if _, _, err := st.PinMessage(ctx, f.doomed.ID, f.root.ID, f.owner.ID); err != nil { + t.Fatal(err) + } + if _, _, err := st.MarkChannelRead(ctx, f.doomed.ID, f.member.ID, *f.root.ChannelSeq); err != nil { + t.Fatal(err) + } + if err := st.UpsertChannelNotificationSettings(ctx, store.ChannelNotificationInput{ChannelID: f.doomed.ID, UserID: f.member.ID, Preference: store.ChannelNotifyMuted}); err != nil { + t.Fatal(err) + } + f.exclusive = createUpload(t, st, f, "only.txt", "text/plain", 11) + f.shared = createUpload(t, st, f, "shared.txt", "text/plain", 13) + f.icon = createUpload(t, st, f, "icon.png", "image/png", 17) + for _, upload := range []store.Upload{f.exclusive, f.shared, f.icon} { + if _, err := st.AttachUpload(ctx, store.AttachUploadInput{MessageID: f.root.ID, UploadID: upload.ID, UserID: f.owner.ID}); err != nil { + t.Fatal(err) + } + } + if f.keptRoot, _, err = st.CreateMessage(ctx, store.CreateMessageInput{ChannelID: f.kept.ID, AuthorID: f.owner.ID, Body: "kept zebracrossing"}); err != nil { + t.Fatal(err) + } + if _, err := st.AttachUpload(ctx, store.AttachUploadInput{MessageID: f.keptRoot.ID, UploadID: f.shared.ID, UserID: f.owner.ID}); err != nil { + t.Fatal(err) + } + iconURL := "/api/uploads/" + f.icon.ID + if _, _, err := st.UpdateWorkspace(ctx, store.UpdateWorkspaceInput{WorkspaceID: f.workspace.ID, ActorUserID: f.owner.ID, IconURL: &iconURL}); err != nil { + t.Fatal(err) + } + conversation, err := st.CreateDirectConversation(ctx, store.CreateDirectConversationInput{WorkspaceID: f.workspace.ID, UserID: f.owner.ID, MemberIDs: []string{f.member.ID}}) + if err != nil { + t.Fatal(err) + } + if f.directRoot, _, err = st.CreateDirectMessage(ctx, store.CreateDirectMessageInput{ConversationID: conversation.ID, AuthorID: f.owner.ID, Body: "direct zebracrossing"}); err != nil { + t.Fatal(err) + } + return f +} + +func createUpload(t *testing.T, st store.Store, f fixture, filename, contentType string, size int64) store.Upload { + t.Helper() + upload, err := storetest.CreateUpload(context.Background(), st, store.CreateUploadInput{ + WorkspaceID: f.workspace.ID, + OwnerID: f.owner.ID, + Filename: filename, + ContentType: contentType, + ByteSize: size, + StoragePath: "channel-delete/" + filename, + }) + if err != nil { + t.Fatal(err) + } + return upload +} diff --git a/apps/api/internal/store/events.go b/apps/api/internal/store/events.go index 4cc338356..1248fddf5 100644 --- a/apps/api/internal/store/events.go +++ b/apps/api/internal/store/events.go @@ -6,6 +6,7 @@ import "slices" // eligible for outgoing event subscriptions. var DurableEventTypes = []string{ "channel.created", + "channel.deleted", "channel.read", "channel.updated", "dm.read", diff --git a/apps/api/internal/store/postgres/channel_deletion.go b/apps/api/internal/store/postgres/channel_deletion.go new file mode 100644 index 000000000..bd095efc9 --- /dev/null +++ b/apps/api/internal/store/postgres/channel_deletion.go @@ -0,0 +1,207 @@ +package postgres + +import ( + "context" + "database/sql" + + "github.com/openclaw/clickclack/apps/api/internal/store" + "github.com/openclaw/clickclack/apps/api/internal/store/postgres/storedb" +) + +type channelDeletionPlan struct { + channel store.Channel + counts store.ChannelDeletionCounts + uploads []storedb.ListChannelExclusiveUploadsRow + blocker error +} + +func (s *Store) PreviewChannelDeletion(ctx context.Context, channelID, actorUserID string) (store.ChannelDeletionPreview, error) { + // Not read-only: the owner check takes a key-share lock on the membership row. + tx, err := s.db.BeginTx(ctx, &sql.TxOptions{Isolation: sql.LevelRepeatableRead}) + if err != nil { + return store.ChannelDeletionPreview{}, err + } + defer tx.Rollback() + plan, err := loadChannelDeletionPlanTx(ctx, tx, channelID, actorUserID) + if err != nil { + return store.ChannelDeletionPreview{}, err + } + return store.ChannelDeletionPreview{ + Channel: plan.channel, + Counts: plan.counts, + Blocker: store.ChannelDeletionBlockerCode(plan.blocker), + }, nil +} + +func (s *Store) DeleteChannel(ctx context.Context, channelID, actorUserID string) (store.ChannelDeletion, error) { + tx, err := s.db.BeginTx(ctx, nil) + if err != nil { + return store.ChannelDeletion{}, err + } + defer tx.Rollback() + qtx := s.q.WithTx(tx) + workspaceID, err := qtx.GetChannelWorkspace(ctx, channelID) + if err != nil { + return store.ChannelDeletion{}, err + } + // Workspace first, as DeleteWorkspace and UpdateWorkspace do. Competing + // channel deletions then cannot both pass the last-channel check, and the + // icon cannot move onto an upload this deletion removes. NO KEY UPDATE + // leaves event appends and child inserts, which take KEY SHARE, unblocked. + if _, err := qtx.LockWorkspaceForChannelDeletion(ctx, workspaceID); err != nil { + return store.ChannelDeletion{}, err + } + // Take the root-message sequence lock before the row lock, in the same order + // as CreateMessage, so a concurrent send finishes first or fails its foreign + // key check after this deletion commits. + if err := lockMessageSequenceTx(ctx, tx, "channel", channelID); err != nil { + return store.ChannelDeletion{}, err + } + if _, err := qtx.LockChannelForDeletion(ctx, channelID); err != nil { + return store.ChannelDeletion{}, err + } + plan, err := loadChannelDeletionPlanTx(ctx, tx, channelID, actorUserID) + if err != nil { + return store.ChannelDeletion{}, err + } + if err := requireNoModerationBlockTx(ctx, tx, plan.channel.WorkspaceID, actorUserID); err != nil { + return store.ChannelDeletion{}, err + } + if plan.blocker != nil { + return store.ChannelDeletion{}, plan.blocker + } + if err := lockExclusiveUploadsTx(ctx, tx, &plan); err != nil { + return store.ChannelDeletion{}, err + } + cleanups := make([]store.PendingUploadCleanup, 0, len(plan.uploads)) + cleanupTime := now() + for _, upload := range plan.uploads { + if upload.StoragePath != "" { + cleanup, err := qtx.InsertPendingUploadCleanup(ctx, storedb.InsertPendingUploadCleanupParams{ + ID: newID("ucl"), + WorkspaceID: plan.channel.WorkspaceID, + StoragePath: upload.StoragePath, + CreatedAt: cleanupTime, + UpdatedAt: cleanupTime, + }) + if err != nil { + return store.ChannelDeletion{}, err + } + cleanups = append(cleanups, pendingUploadCleanupFromRow(cleanup)) + } + if err := qtx.DeleteUpload(ctx, upload.ID); err != nil { + return store.ChannelDeletion{}, err + } + } + // Messages, replies, reactions, pins, attachments, channel topics, read + // pointers, and notification settings cascade from the channel row. + affected, err := qtx.DeleteChannel(ctx, plan.channel.ID) + if err != nil { + return store.ChannelDeletion{}, err + } + if affected == 0 { + return store.ChannelDeletion{}, sql.ErrNoRows + } + // Durable events keep only identifiers and stay in the log so every client + // cursor remains valid. Live delivery already skips events whose channel is + // gone, so the deletion itself is workspace-scoped. + event, err := insertEvent(ctx, tx, plan.channel.WorkspaceID, "", "channel.deleted", nil, map[string]string{ + "channel_id": plan.channel.ID, + "deleted_by": actorUserID, + }) + if err != nil { + return store.ChannelDeletion{}, err + } + if err := tx.Commit(); err != nil { + return store.ChannelDeletion{}, err + } + return store.ChannelDeletion{Channel: plan.channel, Counts: plan.counts, Event: event, Cleanups: cleanups}, nil +} + +// lockExclusiveUploadsTx locks the planned uploads and keeps only those still +// used by this channel alone. An attachment elsewhere that committed before the +// lock is visible to the second read; one that has not committed waits for this +// deletion and then fails its foreign key check. +func lockExclusiveUploadsTx(ctx context.Context, tx *sql.Tx, plan *channelDeletionPlan) error { + if len(plan.uploads) == 0 { + return nil + } + qtx := storedb.New(tx) + ids := make([]string, 0, len(plan.uploads)) + for _, upload := range plan.uploads { + ids = append(ids, upload.ID) + } + if _, err := qtx.LockUploadsForDeletion(ctx, ids); err != nil { + return err + } + uploads, err := qtx.ListChannelExclusiveUploads(ctx, storedb.ListChannelExclusiveUploadsParams{ + WorkspaceID: plan.channel.WorkspaceID, + ChannelID: sqlText(plan.channel.ID), + }) + if err != nil { + return err + } + locked := make(map[string]bool, len(ids)) + for _, id := range ids { + locked[id] = true + } + plan.uploads = plan.uploads[:0] + plan.counts.Files = 0 + plan.counts.FileBytes = 0 + for _, upload := range uploads { + if !locked[upload.ID] { + continue + } + plan.uploads = append(plan.uploads, upload) + plan.counts.Files++ + plan.counts.FileBytes += upload.ByteSize + } + return nil +} + +func loadChannelDeletionPlanTx(ctx context.Context, tx *sql.Tx, channelID, actorUserID string) (channelDeletionPlan, error) { + qtx := storedb.New(tx) + row, err := qtx.GetChannel(ctx, channelID) + if err != nil { + return channelDeletionPlan{}, err + } + channel := storeChannelFromGetChannel(row) + if err := requireWorkspaceOwnerTx(ctx, tx, channel.WorkspaceID, actorUserID); err != nil { + return channelDeletionPlan{}, err + } + channelCount, err := qtx.CountWorkspaceChannels(ctx, channel.WorkspaceID) + if err != nil { + return channelDeletionPlan{}, err + } + workspaceSlug, err := qtx.GetWorkspaceSlug(ctx, channel.WorkspaceID) + if err != nil { + return channelDeletionPlan{}, err + } + content, err := qtx.CountChannelDeletionContent(ctx, sqlText(channel.ID)) + if err != nil { + return channelDeletionPlan{}, err + } + uploads, err := qtx.ListChannelExclusiveUploads(ctx, storedb.ListChannelExclusiveUploadsParams{ + WorkspaceID: channel.WorkspaceID, + ChannelID: sqlText(channel.ID), + }) + if err != nil { + return channelDeletionPlan{}, err + } + counts := store.ChannelDeletionCounts{ + Messages: content.Messages, + ThreadReplies: content.ThreadReplies, + Pins: content.Pins, + Topics: content.Topics, + Files: int64(len(uploads)), + } + for _, upload := range uploads { + counts.FileBytes += upload.ByteSize + } + return channelDeletionPlan{ + channel: channel, + counts: counts, + uploads: uploads, + blocker: store.ChannelDeletionBlocker(workspaceSlug, channel.Name, channelCount), + }, nil +} diff --git a/apps/api/internal/store/postgres/channel_deletion_test.go b/apps/api/internal/store/postgres/channel_deletion_test.go new file mode 100644 index 000000000..aa43bd47d --- /dev/null +++ b/apps/api/internal/store/postgres/channel_deletion_test.go @@ -0,0 +1,274 @@ +package postgres + +import ( + "context" + "database/sql" + "errors" + "fmt" + "strings" + "testing" + "time" + + "github.com/openclaw/clickclack/apps/api/internal/store" + "github.com/openclaw/clickclack/apps/api/internal/store/channeldeletiontest" + "github.com/openclaw/clickclack/apps/api/internal/store/storetest" +) + +func TestDeleteChannelRemovesOwnedContent(t *testing.T) { + st := newMigratedPostgresChannelDeletionStore(t) + channeldeletiontest.DeleteChannelRemovesOwnedContent(t, st, postgresChannelDeletionHooks(st)) +} + +func TestDeleteChannelEnforcesGuardRails(t *testing.T) { + channeldeletiontest.DeleteChannelEnforcesGuardRails(t, newMigratedPostgresChannelDeletionStore(t)) +} + +func TestDeleteChannelRejectsLostAuthority(t *testing.T) { + channeldeletiontest.DeleteChannelRejectsLostAuthority(t, newMigratedPostgresChannelDeletionStore(t)) +} + +func newMigratedPostgresChannelDeletionStore(t *testing.T) *Store { + t.Helper() + st := newIsolatedPostgresTestStore(t) + if err := st.Migrate(context.Background()); err != nil { + t.Fatal(err) + } + return st +} + +func postgresChannelDeletionHooks(st *Store) channeldeletiontest.Hooks { + return channeldeletiontest.Hooks{ + OwnedRows: func(t *testing.T, channelID string, messageIDs []string) map[string]int64 { + t.Helper() + placeholders := make([]string, 0, len(messageIDs)) + ids := make([]any, 0, len(messageIDs)) + for index, id := range messageIDs { + placeholders = append(placeholders, fmt.Sprintf("$%d", index+1)) + ids = append(ids, id) + } + in := strings.Join(placeholders, ",") + counts := map[string]int64{} + for label, query := range map[string]string{ + "messages": `SELECT COUNT(*) FROM messages WHERE id IN (` + in + `)`, + "reactions": `SELECT COUNT(*) FROM reactions WHERE message_id IN (` + in + `)`, + "attachments": `SELECT COUNT(*) FROM message_attachments WHERE message_id IN (` + in + `)`, + "thread state": `SELECT COUNT(*) FROM thread_state WHERE root_message_id IN (` + in + `)`, + "pins": `SELECT COUNT(*) FROM pinned_messages WHERE message_id IN (` + in + `)`, + "channel rows": `SELECT COUNT(*) FROM channels WHERE id = $1`, + "channel topics": `SELECT COUNT(*) FROM topics WHERE channel_id = $1`, + "read pointers": `SELECT COUNT(*) FROM channel_reads WHERE channel_id = $1`, + "notification settings": `SELECT COUNT(*) FROM channel_notification_settings WHERE channel_id = $1`, + } { + args := ids + if !strings.Contains(query, "IN (") { + args = []any{channelID} + } + var count int64 + if err := st.db.QueryRowContext(context.Background(), query, args...).Scan(&count); err != nil { + t.Fatalf("%s: %v", label, err) + } + counts[label] = count + } + return counts + }, + } +} + +func TestCascadeChildKeyIndexesExist(t *testing.T) { + st := newMigratedPostgresChannelDeletionStore(t) + for _, index := range []string{"idx_messages_parent_message", "idx_messages_quoted_message"} { + var exists bool + if err := st.db.QueryRowContext(context.Background(), `SELECT to_regclass($1) IS NOT NULL`, index).Scan(&exists); err != nil { + t.Fatal(err) + } + if !exists { + t.Fatalf("missing cascade index %s", index) + } + } +} + +// Two deletions of a workspace's last two channels must not both pass the +// last-channel check. The held workspace lock lines both requests up at their +// first shared lock, then lets them race. +func TestDeleteChannelSerializesLastChannelDecisions(t *testing.T) { + ctx := context.Background() + st := newMigratedPostgresChannelDeletionStore(t) + owner, err := st.EnsureBootstrap(ctx, "Owner", "channel-race-owner@example.com") + if err != nil { + t.Fatal(err) + } + workspace, err := st.CreateWorkspace(ctx, store.CreateWorkspaceInput{Name: "Race", Slug: "channel-race"}, owner.ID) + if err != nil { + t.Fatal(err) + } + var channelIDs []string + for _, name := range []string{"alpha", "beta"} { + channel, _, err := st.CreateChannel(ctx, store.CreateChannelInput{WorkspaceID: workspace.ID, UserID: owner.ID, Name: name}) + if err != nil { + t.Fatal(err) + } + channelIDs = append(channelIDs, channel.ID) + } + + holder := beginLockHolder(t, st, `SELECT id FROM workspaces WHERE id = $1 FOR UPDATE`, workspace.ID) + results := make(chan error, len(channelIDs)) + for _, channelID := range channelIDs { + go func() { + _, err := st.DeleteChannel(ctx, channelID, owner.ID) + results <- err + }() + } + waitForWaitingBackends(t, st, len(channelIDs)) + if err := holder.Commit(); err != nil { + t.Fatal(err) + } + + var deleted, blocked int + for range channelIDs { + switch err := <-results; { + case err == nil: + deleted++ + case errors.Is(err, store.ErrLastChannel): + blocked++ + default: + t.Fatalf("unexpected deletion error: %v", err) + } + } + remaining, err := st.ListChannels(ctx, workspace.ID, owner.ID) + if err != nil { + t.Fatal(err) + } + if deleted != 1 || blocked != 1 || len(remaining) != 1 { + t.Fatalf("deleted=%d blocked=%d remaining=%d, want one deletion, one last-channel refusal, one channel", deleted, blocked, len(remaining)) + } +} + +// An upload attached elsewhere while a deletion is in progress must survive, or +// the attachment must fail; it must never succeed and then lose its file. +func TestDeleteChannelKeepsUploadsAttachedDuringDeletion(t *testing.T) { + ctx := context.Background() + st := newMigratedPostgresChannelDeletionStore(t) + owner, err := st.EnsureBootstrap(ctx, "Owner", "upload-race-owner@example.com") + if err != nil { + t.Fatal(err) + } + workspace, err := st.CreateWorkspace(ctx, store.CreateWorkspaceInput{Name: "Upload race", Slug: "upload-race"}, owner.ID) + if err != nil { + t.Fatal(err) + } + doomed, _, err := st.CreateChannel(ctx, store.CreateChannelInput{WorkspaceID: workspace.ID, UserID: owner.ID, Name: "doomed"}) + if err != nil { + t.Fatal(err) + } + kept, _, err := st.CreateChannel(ctx, store.CreateChannelInput{WorkspaceID: workspace.ID, UserID: owner.ID, Name: "kept"}) + if err != nil { + t.Fatal(err) + } + doomedMessage, _, err := st.CreateMessage(ctx, store.CreateMessageInput{ChannelID: doomed.ID, AuthorID: owner.ID, Body: "only here for now"}) + if err != nil { + t.Fatal(err) + } + keptMessage, _, err := st.CreateMessage(ctx, store.CreateMessageInput{ChannelID: kept.ID, AuthorID: owner.ID, Body: "attach it here too"}) + if err != nil { + t.Fatal(err) + } + upload, err := storetest.CreateUpload(ctx, st, store.CreateUploadInput{ + WorkspaceID: workspace.ID, + OwnerID: owner.ID, + Filename: "shared-later.txt", + ContentType: "text/plain", + ByteSize: 7, + StoragePath: "upload-race/shared-later.txt", + }) + if err != nil { + t.Fatal(err) + } + if _, err := st.AttachUpload(ctx, store.AttachUploadInput{MessageID: doomedMessage.ID, UploadID: upload.ID, UserID: owner.ID}); err != nil { + t.Fatal(err) + } + + // Pause the deletion after it chose the upload and before it removes it. + holder := beginLockHolder(t, st, `LOCK TABLE pending_upload_cleanups IN SHARE MODE`) + deletion := make(chan error, 1) + go func() { + _, err := st.DeleteChannel(ctx, doomed.ID, owner.ID) + deletion <- err + }() + waitForWaitingBackends(t, st, 1) + attach := make(chan error, 1) + go func() { + _, err := st.AttachUpload(ctx, store.AttachUploadInput{MessageID: keptMessage.ID, UploadID: upload.ID, UserID: owner.ID}) + attach <- err + }() + // The attachment either commits now or waits behind the deletion's upload lock. + var attachErr error + attachDone := false + deadline := time.Now().Add(10 * time.Second) + for !attachDone && waitingBackends(t, st) < 2 { + select { + case attachErr = <-attach: + attachDone = true + case <-time.After(20 * time.Millisecond): + if time.Now().After(deadline) { + t.Fatal("attachment neither finished nor waited") + } + } + } + if err := holder.Commit(); err != nil { + t.Fatal(err) + } + if err := <-deletion; err != nil { + t.Fatalf("deletion error: %v", err) + } + if !attachDone { + attachErr = <-attach + } + + var attachments int + if err := st.db.QueryRowContext(ctx, `SELECT COUNT(*) FROM message_attachments WHERE message_id = $1 AND upload_id = $2`, keptMessage.ID, upload.ID).Scan(&attachments); err != nil { + t.Fatal(err) + } + _, uploadErr := st.GetUpload(ctx, upload.ID, owner.ID) + if attachErr == nil && (attachments != 1 || uploadErr != nil) { + t.Fatalf("attachment succeeded but kept %d rows and upload lookup error %v", attachments, uploadErr) + } + if attachErr != nil && uploadErr == nil { + t.Fatalf("attachment failed (%v) but the exclusive upload was not removed", attachErr) + } +} + +func beginLockHolder(t *testing.T, st *Store, query string, args ...any) *sql.Tx { + t.Helper() + ctx := context.Background() + tx, err := st.db.BeginTx(ctx, nil) + if err != nil { + t.Fatal(err) + } + t.Cleanup(func() { _ = tx.Rollback() }) + if _, err := tx.ExecContext(ctx, query, args...); err != nil { + t.Fatal(err) + } + return tx +} + +// waitForWaitingBackends waits until this test's connections have want lock +// waits, whichever lock holder they queue behind. +func waitForWaitingBackends(t *testing.T, st *Store, want int) { + t.Helper() + deadline := time.Now().Add(10 * time.Second) + for waiting := waitingBackends(t, st); waiting < want; waiting = waitingBackends(t, st) { + if time.Now().After(deadline) { + t.Fatalf("%d backends waiting on locks, want %d", waiting, want) + } + time.Sleep(10 * time.Millisecond) + } +} + +func waitingBackends(t *testing.T, st *Store) int { + t.Helper() + var waiting int + if err := st.db.QueryRowContext(context.Background(), `SELECT COUNT(*) FROM pg_stat_activity WHERE cardinality(pg_blocking_pids(pid)) > 0 AND application_name = current_setting('application_name')`).Scan(&waiting); err != nil { + t.Fatal(err) + } + return waiting +} diff --git a/apps/api/internal/store/postgres/migrations/0036_message_child_key_indexes.sql b/apps/api/internal/store/postgres/migrations/0036_message_child_key_indexes.sql new file mode 100644 index 000000000..fd27f6bd7 --- /dev/null +++ b/apps/api/internal/store/postgres/migrations/0036_message_child_key_indexes.sql @@ -0,0 +1,10 @@ +-- Deleting a channel or workspace cascades through messages. For every deleted +-- message, PostgreSQL looks up the replies and quotes that reference it; +-- without an index on each child key, every lookup scans the messages table. +CREATE INDEX IF NOT EXISTS idx_messages_parent_message + ON messages(parent_message_id) + WHERE parent_message_id IS NOT NULL; + +CREATE INDEX IF NOT EXISTS idx_messages_quoted_message + ON messages(quoted_message_id) + WHERE quoted_message_id IS NOT NULL; diff --git a/apps/api/internal/store/postgres/sqlc/queries.sql b/apps/api/internal/store/postgres/sqlc/queries.sql index ee1a39eaf..5715262ab 100644 --- a/apps/api/internal/store/postgres/sqlc/queries.sql +++ b/apps/api/internal/store/postgres/sqlc/queries.sql @@ -575,6 +575,96 @@ WHERE id = sqlc.arg(id); DELETE FROM workspaces WHERE id = sqlc.arg(id); +-- name: LockWorkspaceForChannelDeletion :one +SELECT id +FROM workspaces +WHERE id = sqlc.arg(id) +FOR NO KEY UPDATE; + +-- name: LockChannelForDeletion :one +SELECT id +FROM channels +WHERE id = sqlc.arg(id) +FOR UPDATE; + +-- name: LockUploadsForDeletion :many +SELECT id +FROM uploads +WHERE id = ANY(sqlc.arg(ids)::text[]) +ORDER BY id +FOR UPDATE; + +-- name: CountWorkspaceChannels :one +SELECT COUNT(*) +FROM channels +WHERE workspace_id = sqlc.arg(workspace_id); + +-- name: GetWorkspaceSlug :one +SELECT slug +FROM workspaces +WHERE id = sqlc.arg(id); + +-- name: CountChannelDeletionContent :one +SELECT + ( + SELECT COUNT(*) + FROM messages root_message + WHERE root_message.channel_id = sqlc.arg(channel_id) + AND root_message.parent_message_id IS NULL + AND root_message.kind = 'message' + AND root_message.deleted_at IS NULL + ) AS messages, + ( + SELECT COUNT(*) + FROM messages reply + WHERE reply.channel_id = sqlc.arg(channel_id) + AND reply.parent_message_id IS NOT NULL + AND reply.deleted_at IS NULL + ) AS thread_replies, + ( + SELECT COUNT(*) + FROM pinned_messages pin + WHERE pin.channel_id = sqlc.arg(channel_id) + ) AS pins, + ( + SELECT COUNT(*) + FROM topics topic + WHERE topic.channel_id = sqlc.arg(channel_id) + ) AS topics; + +-- name: ListChannelExclusiveUploads :many +SELECT u.id, u.storage_path, u.byte_size +FROM uploads u +WHERE u.workspace_id = sqlc.arg(workspace_id) + AND u.id IN ( + SELECT channel_attachment.upload_id + FROM message_attachments channel_attachment + JOIN messages channel_message ON channel_message.id = channel_attachment.message_id + WHERE channel_message.channel_id = sqlc.arg(channel_id) + ) + AND NOT EXISTS ( + SELECT 1 + FROM message_attachments other_attachment + JOIN messages other_message ON other_message.id = other_attachment.message_id + WHERE other_attachment.upload_id = u.id + AND (other_message.channel_id IS NULL OR other_message.channel_id <> sqlc.arg(channel_id)) + ) + AND NOT EXISTS ( + SELECT 1 + FROM workspaces icon_workspace + WHERE icon_workspace.id = u.workspace_id + AND icon_workspace.icon_url = '/api/uploads/' || u.id + ) +ORDER BY u.id; + +-- name: DeleteUpload :exec +DELETE FROM uploads +WHERE id = sqlc.arg(id); + +-- name: DeleteChannel :execrows +DELETE FROM channels +WHERE id = sqlc.arg(id); + -- name: InsertDefaultChannel :exec INSERT INTO channels (id, route_id, workspace_id, name, kind, created_at) VALUES (sqlc.arg(id), sqlc.arg(route_id), sqlc.arg(workspace_id), 'general', 'public', sqlc.arg(created_at)); diff --git a/apps/api/internal/store/postgres/sqlc/schema.sql b/apps/api/internal/store/postgres/sqlc/schema.sql index 1578a65a3..c99dffc27 100644 --- a/apps/api/internal/store/postgres/sqlc/schema.sql +++ b/apps/api/internal/store/postgres/sqlc/schema.sql @@ -153,6 +153,10 @@ CREATE TABLE messages ( CREATE INDEX idx_messages_channel_seq ON messages(channel_id, channel_seq); CREATE INDEX idx_messages_thread_seq ON messages(thread_root_id, thread_seq); +CREATE INDEX idx_messages_parent_message ON messages(parent_message_id) + WHERE parent_message_id IS NOT NULL; +CREATE INDEX idx_messages_quoted_message ON messages(quoted_message_id) + WHERE quoted_message_id IS NOT NULL; CREATE INDEX idx_messages_topic ON messages(topic_id, channel_seq); CREATE INDEX idx_messages_channel_root_page ON messages(channel_id, parent_message_id, channel_seq) WHERE channel_id IS NOT NULL AND parent_message_id IS NULL; diff --git a/apps/api/internal/store/postgres/storedb/queries.sql.go b/apps/api/internal/store/postgres/storedb/queries.sql.go index e4aa8b153..03d8fcbcb 100644 --- a/apps/api/internal/store/postgres/storedb/queries.sql.go +++ b/apps/api/internal/store/postgres/storedb/queries.sql.go @@ -177,6 +177,54 @@ func (q *Queries) ClearMemberTimeout(ctx context.Context, arg ClearMemberTimeout return err } +const countChannelDeletionContent = `-- name: CountChannelDeletionContent :one +SELECT + ( + SELECT COUNT(*) + FROM messages root_message + WHERE root_message.channel_id = $1 + AND root_message.parent_message_id IS NULL + AND root_message.kind = 'message' + AND root_message.deleted_at IS NULL + ) AS messages, + ( + SELECT COUNT(*) + FROM messages reply + WHERE reply.channel_id = $1 + AND reply.parent_message_id IS NOT NULL + AND reply.deleted_at IS NULL + ) AS thread_replies, + ( + SELECT COUNT(*) + FROM pinned_messages pin + WHERE pin.channel_id = $1 + ) AS pins, + ( + SELECT COUNT(*) + FROM topics topic + WHERE topic.channel_id = $1 + ) AS topics +` + +type CountChannelDeletionContentRow struct { + Messages int64 `json:"messages"` + ThreadReplies int64 `json:"thread_replies"` + Pins int64 `json:"pins"` + Topics int64 `json:"topics"` +} + +func (q *Queries) CountChannelDeletionContent(ctx context.Context, channelID sql.NullString) (CountChannelDeletionContentRow, error) { + row := q.db.QueryRowContext(ctx, countChannelDeletionContent, channelID) + var i CountChannelDeletionContentRow + err := row.Scan( + &i.Messages, + &i.ThreadReplies, + &i.Pins, + &i.Topics, + ) + return i, err +} + const countDesktopOAuthGrants = `-- name: CountDesktopOAuthGrants :one SELECT COUNT(*) FROM desktop_oauth_grants @@ -306,6 +354,19 @@ func (q *Queries) CountRecentGuestWritesByAuthor(ctx context.Context, arg CountR return count, err } +const countWorkspaceChannels = `-- name: CountWorkspaceChannels :one +SELECT COUNT(*) +FROM channels +WHERE workspace_id = $1 +` + +func (q *Queries) CountWorkspaceChannels(ctx context.Context, workspaceID string) (int64, error) { + row := q.db.QueryRowContext(ctx, countWorkspaceChannels, workspaceID) + var count int64 + err := row.Scan(&count) + return count, err +} + const countWorkspaceMemberRoles = `-- name: CountWorkspaceMemberRoles :one SELECT COUNT(*) AS total_count, @@ -486,6 +547,19 @@ func (q *Queries) DeleteBotSetupCodesForWorkspaceBot(ctx context.Context, arg De return result.RowsAffected() } +const deleteChannel = `-- name: DeleteChannel :execrows +DELETE FROM channels +WHERE id = $1 +` + +func (q *Queries) DeleteChannel(ctx context.Context, id string) (int64, error) { + result, err := q.db.ExecContext(ctx, deleteChannel, id) + if err != nil { + return 0, err + } + return result.RowsAffected() +} + const deleteDesktopOAuthGrant = `-- name: DeleteDesktopOAuthGrant :execrows DELETE FROM desktop_oauth_grants WHERE id = $1 AND grant_hash = $2 @@ -639,6 +713,16 @@ func (q *Queries) DeleteUnclaimedBotSetupCodesForTokenName(ctx context.Context, return result.RowsAffected() } +const deleteUpload = `-- name: DeleteUpload :exec +DELETE FROM uploads +WHERE id = $1 +` + +func (q *Queries) DeleteUpload(ctx context.Context, id string) error { + _, err := q.db.ExecContext(ctx, deleteUpload, id) + return err +} + const deleteUploadQuotaReservation = `-- name: DeleteUploadQuotaReservation :execrows DELETE FROM upload_quota_reservations WHERE id = $1 AND owner_id = $2 @@ -2214,6 +2298,19 @@ func (q *Queries) GetWorkspaceForSetupClaim(ctx context.Context, workspaceID str return i, err } +const getWorkspaceSlug = `-- name: GetWorkspaceSlug :one +SELECT slug +FROM workspaces +WHERE id = $1 +` + +func (q *Queries) GetWorkspaceSlug(ctx context.Context, id string) (string, error) { + row := q.db.QueryRowContext(ctx, getWorkspaceSlug, id) + var slug string + err := row.Scan(&slug) + return slug, err +} + const hideDirectConversation = `-- name: HideDirectConversation :exec INSERT INTO direct_conversation_hidden (conversation_id, user_id, hidden_at) VALUES ($1, $2, $3) @@ -3482,6 +3579,66 @@ func (q *Queries) ListBotsOwnedBy(ctx context.Context, ownerUserID sql.NullStrin return items, nil } +const listChannelExclusiveUploads = `-- name: ListChannelExclusiveUploads :many +SELECT u.id, u.storage_path, u.byte_size +FROM uploads u +WHERE u.workspace_id = $1 + AND u.id IN ( + SELECT channel_attachment.upload_id + FROM message_attachments channel_attachment + JOIN messages channel_message ON channel_message.id = channel_attachment.message_id + WHERE channel_message.channel_id = $2 + ) + AND NOT EXISTS ( + SELECT 1 + FROM message_attachments other_attachment + JOIN messages other_message ON other_message.id = other_attachment.message_id + WHERE other_attachment.upload_id = u.id + AND (other_message.channel_id IS NULL OR other_message.channel_id <> $2) + ) + AND NOT EXISTS ( + SELECT 1 + FROM workspaces icon_workspace + WHERE icon_workspace.id = u.workspace_id + AND icon_workspace.icon_url = '/api/uploads/' || u.id + ) +ORDER BY u.id +` + +type ListChannelExclusiveUploadsParams struct { + WorkspaceID string `json:"workspace_id"` + ChannelID sql.NullString `json:"channel_id"` +} + +type ListChannelExclusiveUploadsRow struct { + ID string `json:"id"` + StoragePath string `json:"storage_path"` + ByteSize int64 `json:"byte_size"` +} + +func (q *Queries) ListChannelExclusiveUploads(ctx context.Context, arg ListChannelExclusiveUploadsParams) ([]ListChannelExclusiveUploadsRow, error) { + rows, err := q.db.QueryContext(ctx, listChannelExclusiveUploads, arg.WorkspaceID, arg.ChannelID) + if err != nil { + return nil, err + } + defer rows.Close() + var items []ListChannelExclusiveUploadsRow + for rows.Next() { + var i ListChannelExclusiveUploadsRow + if err := rows.Scan(&i.ID, &i.StoragePath, &i.ByteSize); err != nil { + return nil, err + } + items = append(items, i) + } + if err := rows.Close(); err != nil { + return nil, err + } + if err := rows.Err(); err != nil { + return nil, err + } + return items, nil +} + const listChannels = `-- name: ListChannels :many SELECT c.id, COALESCE(c.route_id, '') AS route_id, c.workspace_id, c.name, c.display_title, c.kind, c.created_at, c.archived_at, c.external_managed, c.external_ref, c.external_url, c.sidebar_section, @@ -5450,6 +5607,20 @@ func (q *Queries) LockBotWorkspaceMembership(ctx context.Context, arg LockBotWor return user_id, err } +const lockChannelForDeletion = `-- name: LockChannelForDeletion :one +SELECT id +FROM channels +WHERE id = $1 +FOR UPDATE +` + +func (q *Queries) LockChannelForDeletion(ctx context.Context, id string) (string, error) { + row := q.db.QueryRowContext(ctx, lockChannelForDeletion, id) + var id_2 string + err := row.Scan(&id_2) + return id_2, err +} + const lockChannelForUpdate = `-- name: LockChannelForUpdate :one SELECT id FROM channels WHERE id = $1 FOR UPDATE ` @@ -5522,6 +5693,37 @@ func (q *Queries) LockMessageForReaction(ctx context.Context, messageID string) return id, err } +const lockUploadsForDeletion = `-- name: LockUploadsForDeletion :many +SELECT id +FROM uploads +WHERE id = ANY($1::text[]) +ORDER BY id +FOR UPDATE +` + +func (q *Queries) LockUploadsForDeletion(ctx context.Context, ids []string) ([]string, error) { + rows, err := q.db.QueryContext(ctx, lockUploadsForDeletion, pq.Array(ids)) + if err != nil { + return nil, err + } + defer rows.Close() + var items []string + for rows.Next() { + var id string + if err := rows.Scan(&id); err != nil { + return nil, err + } + items = append(items, id) + } + if err := rows.Close(); err != nil { + return nil, err + } + if err := rows.Err(); err != nil { + return nil, err + } + return items, nil +} + const lockUserPushSubscriptions = `-- name: LockUserPushSubscriptions :one SELECT id FROM users WHERE id = $1 FOR NO KEY UPDATE ` @@ -5542,6 +5744,20 @@ func (q *Queries) LockWorkspaceEventLog(ctx context.Context, workspaceID string) return err } +const lockWorkspaceForChannelDeletion = `-- name: LockWorkspaceForChannelDeletion :one +SELECT id +FROM workspaces +WHERE id = $1 +FOR NO KEY UPDATE +` + +func (q *Queries) LockWorkspaceForChannelDeletion(ctx context.Context, id string) (string, error) { + row := q.db.QueryRowContext(ctx, lockWorkspaceForChannelDeletion, id) + var id_2 string + err := row.Scan(&id_2) + return id_2, err +} + const lockWorkspaceForUpdate = `-- name: LockWorkspaceForUpdate :exec SELECT id FROM workspaces WHERE id = $1 FOR UPDATE ` diff --git a/apps/api/internal/store/sqlite/channel_deletion.go b/apps/api/internal/store/sqlite/channel_deletion.go new file mode 100644 index 000000000..6654d61ec --- /dev/null +++ b/apps/api/internal/store/sqlite/channel_deletion.go @@ -0,0 +1,142 @@ +package sqlite + +import ( + "context" + "database/sql" + + "github.com/openclaw/clickclack/apps/api/internal/store" + "github.com/openclaw/clickclack/apps/api/internal/store/sqlite/storedb" +) + +type channelDeletionPlan struct { + channel store.Channel + counts store.ChannelDeletionCounts + uploads []storedb.ListChannelExclusiveUploadsRow + blocker error +} + +func (s *Store) PreviewChannelDeletion(ctx context.Context, channelID, actorUserID string) (store.ChannelDeletionPreview, error) { + tx, err := s.db.BeginTx(ctx, &sql.TxOptions{ReadOnly: true}) + if err != nil { + return store.ChannelDeletionPreview{}, err + } + defer tx.Rollback() + plan, err := loadChannelDeletionPlanTx(ctx, tx, channelID, actorUserID) + if err != nil { + return store.ChannelDeletionPreview{}, err + } + return store.ChannelDeletionPreview{ + Channel: plan.channel, + Counts: plan.counts, + Blocker: store.ChannelDeletionBlockerCode(plan.blocker), + }, nil +} + +func (s *Store) DeleteChannel(ctx context.Context, channelID, actorUserID string) (store.ChannelDeletion, error) { + tx, err := s.db.BeginTx(ctx, nil) + if err != nil { + return store.ChannelDeletion{}, err + } + defer tx.Rollback() + plan, err := loadChannelDeletionPlanTx(ctx, tx, channelID, actorUserID) + if err != nil { + return store.ChannelDeletion{}, err + } + if err := requireNoModerationBlockTx(ctx, tx, plan.channel.WorkspaceID, actorUserID); err != nil { + return store.ChannelDeletion{}, err + } + if plan.blocker != nil { + return store.ChannelDeletion{}, plan.blocker + } + qtx := storedb.New(tx) + cleanups := make([]store.PendingUploadCleanup, 0, len(plan.uploads)) + cleanupTime := now() + for _, upload := range plan.uploads { + if upload.StoragePath != "" { + cleanup, err := qtx.InsertPendingUploadCleanup(ctx, storedb.InsertPendingUploadCleanupParams{ + ID: newID("ucl"), + WorkspaceID: plan.channel.WorkspaceID, + StoragePath: upload.StoragePath, + CreatedAt: cleanupTime, + UpdatedAt: cleanupTime, + }) + if err != nil { + return store.ChannelDeletion{}, err + } + cleanups = append(cleanups, pendingUploadCleanupFromRow(cleanup)) + } + if err := qtx.DeleteUpload(ctx, upload.ID); err != nil { + return store.ChannelDeletion{}, err + } + } + // Messages, replies, reactions, pins, attachments, channel topics, read + // pointers, and notification settings cascade from the channel row. + affected, err := qtx.DeleteChannel(ctx, plan.channel.ID) + if err != nil { + return store.ChannelDeletion{}, err + } + if affected == 0 { + return store.ChannelDeletion{}, sql.ErrNoRows + } + // Durable events keep only identifiers and stay in the log so every client + // cursor remains valid. Live delivery already skips events whose channel is + // gone, so the deletion itself is workspace-scoped. + event, err := insertEvent(ctx, tx, plan.channel.WorkspaceID, "", "channel.deleted", nil, map[string]string{ + "channel_id": plan.channel.ID, + "deleted_by": actorUserID, + }) + if err != nil { + return store.ChannelDeletion{}, err + } + if err := tx.Commit(); err != nil { + return store.ChannelDeletion{}, err + } + return store.ChannelDeletion{Channel: plan.channel, Counts: plan.counts, Event: event, Cleanups: cleanups}, nil +} + +func loadChannelDeletionPlanTx(ctx context.Context, tx *sql.Tx, channelID, actorUserID string) (channelDeletionPlan, error) { + qtx := storedb.New(tx) + row, err := qtx.GetChannel(ctx, channelID) + if err != nil { + return channelDeletionPlan{}, err + } + channel := storeChannelFromGetChannel(row) + if err := requireWorkspaceOwnerTx(ctx, tx, channel.WorkspaceID, actorUserID); err != nil { + return channelDeletionPlan{}, err + } + channelCount, err := qtx.CountWorkspaceChannels(ctx, channel.WorkspaceID) + if err != nil { + return channelDeletionPlan{}, err + } + workspaceSlug, err := qtx.GetWorkspaceSlug(ctx, channel.WorkspaceID) + if err != nil { + return channelDeletionPlan{}, err + } + content, err := qtx.CountChannelDeletionContent(ctx, sqlText(channel.ID)) + if err != nil { + return channelDeletionPlan{}, err + } + uploads, err := qtx.ListChannelExclusiveUploads(ctx, storedb.ListChannelExclusiveUploadsParams{ + WorkspaceID: channel.WorkspaceID, + ChannelID: sqlText(channel.ID), + }) + if err != nil { + return channelDeletionPlan{}, err + } + counts := store.ChannelDeletionCounts{ + Messages: content.Messages, + ThreadReplies: content.ThreadReplies, + Pins: content.Pins, + Topics: content.Topics, + Files: int64(len(uploads)), + } + for _, upload := range uploads { + counts.FileBytes += upload.ByteSize + } + return channelDeletionPlan{ + channel: channel, + counts: counts, + uploads: uploads, + blocker: store.ChannelDeletionBlocker(workspaceSlug, channel.Name, channelCount), + }, nil +} diff --git a/apps/api/internal/store/sqlite/channel_deletion_test.go b/apps/api/internal/store/sqlite/channel_deletion_test.go new file mode 100644 index 000000000..a5c356c9d --- /dev/null +++ b/apps/api/internal/store/sqlite/channel_deletion_test.go @@ -0,0 +1,93 @@ +package sqlite + +import ( + "context" + "strings" + "testing" + + "github.com/openclaw/clickclack/apps/api/internal/store/channeldeletiontest" +) + +func TestDeleteChannelRemovesOwnedContent(t *testing.T) { + t.Parallel() + st := newTestStore(t) + channeldeletiontest.DeleteChannelRemovesOwnedContent(t, st, sqliteChannelDeletionHooks(st)) +} + +func TestDeleteChannelEnforcesGuardRails(t *testing.T) { + t.Parallel() + channeldeletiontest.DeleteChannelEnforcesGuardRails(t, newTestStore(t)) +} + +func TestDeleteChannelRejectsLostAuthority(t *testing.T) { + t.Parallel() + channeldeletiontest.DeleteChannelRejectsLostAuthority(t, newTestStore(t)) +} + +func sqliteChannelDeletionHooks(st *Store) channeldeletiontest.Hooks { + return channeldeletiontest.Hooks{ + OwnedRows: func(t *testing.T, channelID string, messageIDs []string) map[string]int64 { + t.Helper() + placeholders := strings.TrimSuffix(strings.Repeat("?,", len(messageIDs)), ",") + ids := make([]any, 0, len(messageIDs)) + for _, id := range messageIDs { + ids = append(ids, id) + } + counts := map[string]int64{} + for label, query := range map[string]string{ + "messages": `SELECT COUNT(*) FROM messages WHERE id IN (` + placeholders + `)`, + "search rows": `SELECT COUNT(*) FROM messages_fts WHERE message_id IN (` + placeholders + `)`, + "search row map": `SELECT COUNT(*) FROM message_search_rows WHERE message_id IN (` + placeholders + `)`, + "reactions": `SELECT COUNT(*) FROM reactions WHERE message_id IN (` + placeholders + `)`, + "attachments": `SELECT COUNT(*) FROM message_attachments WHERE message_id IN (` + placeholders + `)`, + "thread state": `SELECT COUNT(*) FROM thread_state WHERE root_message_id IN (` + placeholders + `)`, + "pins": `SELECT COUNT(*) FROM pinned_messages WHERE message_id IN (` + placeholders + `)`, + "channel rows": `SELECT COUNT(*) FROM channels WHERE id = ?`, + "channel topics": `SELECT COUNT(*) FROM topics WHERE channel_id = ?`, + "read pointers": `SELECT COUNT(*) FROM channel_reads WHERE channel_id = ?`, + "notification settings": `SELECT COUNT(*) FROM channel_notification_settings WHERE channel_id = ?`, + } { + args := ids + if !strings.Contains(query, "IN (") { + args = []any{channelID} + } + var count int64 + if err := st.db.QueryRowContext(context.Background(), query, args...).Scan(&count); err != nil { + t.Fatalf("%s: %v", label, err) + } + counts[label] = count + } + return counts + }, + } +} + +func TestCascadeChildKeysUseIndexes(t *testing.T) { + t.Parallel() + st := newTestStore(t) + // Each deleted parent row looks up its children by these keys. + for query, index := range map[string]string{ + `SELECT 1 FROM messages WHERE parent_message_id = ?`: "idx_messages_parent_message", + `SELECT 1 FROM messages WHERE quoted_message_id = ?`: "idx_messages_quoted_message", + } { + rows, err := st.db.QueryContext(context.Background(), `EXPLAIN QUERY PLAN `+query, "child_key") + if err != nil { + t.Fatal(err) + } + var plan []string + for rows.Next() { + var id, parent, unused int + var detail string + if err := rows.Scan(&id, &parent, &unused, &detail); err != nil { + t.Fatal(err) + } + plan = append(plan, detail) + } + if err := rows.Close(); err != nil { + t.Fatal(err) + } + if !strings.Contains(strings.Join(plan, "\n"), index) { + t.Fatalf("%s does not use %s: %v", query, index, plan) + } + } +} diff --git a/apps/api/internal/store/sqlite/message_search_rows_test.go b/apps/api/internal/store/sqlite/message_search_rows_test.go new file mode 100644 index 000000000..13f90e39e --- /dev/null +++ b/apps/api/internal/store/sqlite/message_search_rows_test.go @@ -0,0 +1,93 @@ +package sqlite + +import ( + "context" + "path/filepath" + "testing" + + "github.com/openclaw/clickclack/apps/api/internal/store" +) + +// Search rows must be found through message_search_rows: matching the +// unindexed messages_fts.message_id scans the whole index for every deleted +// message, which made deleting a large channel take minutes. +func TestSearchTriggersFindRowsThroughTheRecordedRowid(t *testing.T) { + ctx := context.Background() + st, err := Open("sqlite://" + filepath.Join(t.TempDir(), "search-rows.db")) + if err != nil { + t.Fatal(err) + } + t.Cleanup(func() { _ = st.Close() }) + applySQLiteMigrationsBefore(t, ctx, st, "0044_message_search_rows.sql") + + owner, err := st.EnsureBootstrap(ctx, "Search Rows Owner", "search-rows@example.com") + if err != nil { + t.Fatal(err) + } + workspaces, err := st.ListWorkspaces(ctx, owner.ID) + if err != nil { + t.Fatal(err) + } + workspace := workspaces[0] + channels, err := st.ListChannels(ctx, workspace.ID, owner.ID) + if err != nil { + t.Fatal(err) + } + existing, _, err := st.CreateMessage(ctx, store.CreateMessageInput{ChannelID: channels[0].ID, AuthorID: owner.ID, Body: "rowneedle written before the upgrade"}) + if err != nil { + t.Fatal(err) + } + if err := st.Migrate(ctx); err != nil { + t.Fatal(err) + } + doomed, _, err := st.CreateChannel(ctx, store.CreateChannelInput{WorkspaceID: workspace.ID, UserID: owner.ID, Name: "search-rows-doomed"}) + if err != nil { + t.Fatal(err) + } + removed, _, err := st.CreateMessage(ctx, store.CreateMessageInput{ChannelID: doomed.ID, AuthorID: owner.ID, Body: "rowneedle written after the upgrade"}) + if err != nil { + t.Fatal(err) + } + + // Detach both search rows from their message IDs. Only a rowid lookup can + // still find them when the messages change. + for _, id := range []string{existing.ID, removed.ID} { + result, err := st.db.ExecContext(ctx, ` + UPDATE messages_fts + SET message_id = 'detached' + WHERE rowid = (SELECT search_rowid FROM message_search_rows WHERE message_id = ?)`, id) + if err != nil { + t.Fatal(err) + } + if affected, _ := result.RowsAffected(); affected != 1 { + t.Fatalf("message %s has no recorded search row", id) + } + } + if _, _, err := st.UpdateMessage(ctx, store.UpdateMessageInput{MessageID: existing.ID, UserID: owner.ID, Body: "rowneedle edited"}); err != nil { + t.Fatal(err) + } + if _, err := st.DeleteChannel(ctx, doomed.ID, owner.ID); err != nil { + t.Fatal(err) + } + + var detached, searchRows, recordedRows int + if err := st.db.QueryRowContext(ctx, `SELECT COUNT(*) FROM messages_fts WHERE message_id = 'detached'`).Scan(&detached); err != nil { + t.Fatal(err) + } + if err := st.db.QueryRowContext(ctx, `SELECT COUNT(*) FROM messages_fts`).Scan(&searchRows); err != nil { + t.Fatal(err) + } + if err := st.db.QueryRowContext(ctx, `SELECT COUNT(*) FROM message_search_rows r JOIN messages_fts f ON f.rowid = r.search_rowid AND f.message_id = r.message_id`).Scan(&recordedRows); err != nil { + t.Fatal(err) + } + if detached != 0 || searchRows != recordedRows { + t.Fatalf("detached rows = %d, search rows = %d, recorded rows = %d", detached, searchRows, recordedRows) + } + page, err := st.SearchMessagePage(ctx, store.SearchPageRequest{WorkspaceID: workspace.ID, UserID: owner.ID, Query: "rowneedle"}) + if err != nil { + t.Fatal(err) + } + if len(page.Results) != 1 || page.Results[0].ID != existing.ID || page.Results[0].EditedAt == nil { + t.Fatalf("search after edit and channel deletion = %#v", page.Results) + } +} diff --git a/apps/api/internal/store/sqlite/migrations/0043_message_child_key_indexes.sql b/apps/api/internal/store/sqlite/migrations/0043_message_child_key_indexes.sql new file mode 100644 index 000000000..3354d2cd8 --- /dev/null +++ b/apps/api/internal/store/sqlite/migrations/0043_message_child_key_indexes.sql @@ -0,0 +1,10 @@ +-- Deleting a channel or workspace cascades through messages. For every deleted +-- message, SQLite looks up the replies and quotes that reference it; without +-- an index on each child key, every lookup scans the whole messages table. +CREATE INDEX IF NOT EXISTS idx_messages_parent_message + ON messages(parent_message_id) + WHERE parent_message_id IS NOT NULL; + +CREATE INDEX IF NOT EXISTS idx_messages_quoted_message + ON messages(quoted_message_id) + WHERE quoted_message_id IS NOT NULL; diff --git a/apps/api/internal/store/sqlite/migrations/0044_message_search_rows.sql b/apps/api/internal/store/sqlite/migrations/0044_message_search_rows.sql new file mode 100644 index 000000000..241020c34 --- /dev/null +++ b/apps/api/internal/store/sqlite/migrations/0044_message_search_rows.sql @@ -0,0 +1,42 @@ +-- The search triggers used to remove a message's row by message_id, which is +-- an unindexed FTS5 column, so each deleted message scanned the whole search +-- index. Deleting a channel or workspace with many messages took minutes. +-- Record each message's search rowid so the triggers update it by rowid. +CREATE TABLE message_search_rows ( + message_id TEXT PRIMARY KEY, + search_rowid INTEGER NOT NULL +); + +INSERT OR IGNORE INTO message_search_rows (message_id, search_rowid) +SELECT message_id, rowid +FROM messages_fts; + +DROP TRIGGER messages_fts_ai; +DROP TRIGGER messages_fts_ad; +DROP TRIGGER messages_fts_au; + +CREATE TRIGGER messages_fts_ai AFTER INSERT ON messages +WHEN new.kind = 'message' BEGIN + INSERT INTO messages_fts(message_id, workspace_id, body) + VALUES (new.id, new.workspace_id, new.body); + INSERT INTO message_search_rows(message_id, search_rowid) + VALUES (new.id, last_insert_rowid()); +END; + +CREATE TRIGGER messages_fts_ad AFTER DELETE ON messages BEGIN + DELETE FROM messages_fts + WHERE rowid = (SELECT search_rowid FROM message_search_rows WHERE message_id = old.id); + DELETE FROM message_search_rows WHERE message_id = old.id; +END; + +CREATE TRIGGER messages_fts_au AFTER UPDATE OF body, kind ON messages BEGIN + DELETE FROM messages_fts + WHERE rowid = (SELECT search_rowid FROM message_search_rows WHERE message_id = old.id); + DELETE FROM message_search_rows WHERE message_id = old.id; + INSERT INTO messages_fts(message_id, workspace_id, body) + SELECT new.id, new.workspace_id, new.body + WHERE new.kind = 'message'; + INSERT INTO message_search_rows(message_id, search_rowid) + SELECT new.id, last_insert_rowid() + WHERE new.kind = 'message'; +END; diff --git a/apps/api/internal/store/sqlite/sqlc/queries.sql b/apps/api/internal/store/sqlite/sqlc/queries.sql index be3ef1529..7208e265e 100644 --- a/apps/api/internal/store/sqlite/sqlc/queries.sql +++ b/apps/api/internal/store/sqlite/sqlc/queries.sql @@ -555,6 +555,77 @@ WHERE id = sqlc.arg(id); DELETE FROM workspaces WHERE id = sqlc.arg(id); +-- name: CountWorkspaceChannels :one +SELECT COUNT(*) +FROM channels +WHERE workspace_id = sqlc.arg(workspace_id); + +-- name: GetWorkspaceSlug :one +SELECT slug +FROM workspaces +WHERE id = sqlc.arg(id); + +-- name: CountChannelDeletionContent :one +SELECT + ( + SELECT COUNT(*) + FROM messages root_message + WHERE root_message.channel_id = sqlc.arg(channel_id) + AND root_message.parent_message_id IS NULL + AND root_message.kind = 'message' + AND root_message.deleted_at IS NULL + ) AS messages, + ( + SELECT COUNT(*) + FROM messages reply + WHERE reply.channel_id = sqlc.arg(channel_id) + AND reply.parent_message_id IS NOT NULL + AND reply.deleted_at IS NULL + ) AS thread_replies, + ( + SELECT COUNT(*) + FROM pinned_messages pin + WHERE pin.channel_id = sqlc.arg(channel_id) + ) AS pins, + ( + SELECT COUNT(*) + FROM topics topic + WHERE topic.channel_id = sqlc.arg(channel_id) + ) AS topics; + +-- name: ListChannelExclusiveUploads :many +SELECT u.id, u.storage_path, u.byte_size +FROM uploads u +WHERE u.workspace_id = sqlc.arg(workspace_id) + AND u.id IN ( + SELECT channel_attachment.upload_id + FROM message_attachments channel_attachment + JOIN messages channel_message ON channel_message.id = channel_attachment.message_id + WHERE channel_message.channel_id = sqlc.arg(channel_id) + ) + AND NOT EXISTS ( + SELECT 1 + FROM message_attachments other_attachment + JOIN messages other_message ON other_message.id = other_attachment.message_id + WHERE other_attachment.upload_id = u.id + AND (other_message.channel_id IS NULL OR other_message.channel_id <> sqlc.arg(channel_id)) + ) + AND NOT EXISTS ( + SELECT 1 + FROM workspaces icon_workspace + WHERE icon_workspace.id = u.workspace_id + AND icon_workspace.icon_url = '/api/uploads/' || u.id + ) +ORDER BY u.id; + +-- name: DeleteUpload :exec +DELETE FROM uploads +WHERE id = sqlc.arg(id); + +-- name: DeleteChannel :execrows +DELETE FROM channels +WHERE id = sqlc.arg(id); + -- name: InsertDefaultChannel :exec INSERT INTO channels (id, route_id, workspace_id, name, kind, created_at) VALUES (sqlc.arg(id), sqlc.arg(route_id), sqlc.arg(workspace_id), 'general', 'public', sqlc.arg(created_at)); diff --git a/apps/api/internal/store/sqlite/sqlc/schema.sql b/apps/api/internal/store/sqlite/sqlc/schema.sql index 7d80e3e51..83c1a0e97 100644 --- a/apps/api/internal/store/sqlite/sqlc/schema.sql +++ b/apps/api/internal/store/sqlite/sqlc/schema.sql @@ -153,6 +153,10 @@ CREATE TABLE messages ( CREATE INDEX idx_messages_channel_seq ON messages(channel_id, channel_seq); CREATE INDEX idx_messages_thread_seq ON messages(thread_root_id, thread_seq); +CREATE INDEX idx_messages_parent_message ON messages(parent_message_id) + WHERE parent_message_id IS NOT NULL; +CREATE INDEX idx_messages_quoted_message ON messages(quoted_message_id) + WHERE quoted_message_id IS NOT NULL; CREATE INDEX idx_messages_topic ON messages(topic_id, channel_seq); CREATE INDEX idx_messages_channel_root_page ON messages(channel_id, parent_message_id, channel_seq) WHERE channel_id IS NOT NULL AND parent_message_id IS NULL; diff --git a/apps/api/internal/store/sqlite/storedb/queries.sql.go b/apps/api/internal/store/sqlite/storedb/queries.sql.go index d49909cee..392382dbe 100644 --- a/apps/api/internal/store/sqlite/storedb/queries.sql.go +++ b/apps/api/internal/store/sqlite/storedb/queries.sql.go @@ -173,6 +173,54 @@ func (q *Queries) ClearMemberTimeout(ctx context.Context, arg ClearMemberTimeout return err } +const countChannelDeletionContent = `-- name: CountChannelDeletionContent :one +SELECT + ( + SELECT COUNT(*) + FROM messages root_message + WHERE root_message.channel_id = ?1 + AND root_message.parent_message_id IS NULL + AND root_message.kind = 'message' + AND root_message.deleted_at IS NULL + ) AS messages, + ( + SELECT COUNT(*) + FROM messages reply + WHERE reply.channel_id = ?1 + AND reply.parent_message_id IS NOT NULL + AND reply.deleted_at IS NULL + ) AS thread_replies, + ( + SELECT COUNT(*) + FROM pinned_messages pin + WHERE pin.channel_id = ?1 + ) AS pins, + ( + SELECT COUNT(*) + FROM topics topic + WHERE topic.channel_id = ?1 + ) AS topics +` + +type CountChannelDeletionContentRow struct { + Messages int64 `json:"messages"` + ThreadReplies int64 `json:"thread_replies"` + Pins int64 `json:"pins"` + Topics int64 `json:"topics"` +} + +func (q *Queries) CountChannelDeletionContent(ctx context.Context, channelID sql.NullString) (CountChannelDeletionContentRow, error) { + row := q.db.QueryRowContext(ctx, countChannelDeletionContent, channelID) + var i CountChannelDeletionContentRow + err := row.Scan( + &i.Messages, + &i.ThreadReplies, + &i.Pins, + &i.Topics, + ) + return i, err +} + const countDesktopOAuthGrants = `-- name: CountDesktopOAuthGrants :one SELECT COUNT(*) FROM desktop_oauth_grants @@ -302,6 +350,19 @@ func (q *Queries) CountRecentGuestWritesByAuthor(ctx context.Context, arg CountR return count, err } +const countWorkspaceChannels = `-- name: CountWorkspaceChannels :one +SELECT COUNT(*) +FROM channels +WHERE workspace_id = ?1 +` + +func (q *Queries) CountWorkspaceChannels(ctx context.Context, workspaceID string) (int64, error) { + row := q.db.QueryRowContext(ctx, countWorkspaceChannels, workspaceID) + var count int64 + err := row.Scan(&count) + return count, err +} + const countWorkspaceMemberRoles = `-- name: CountWorkspaceMemberRoles :one SELECT COUNT(*) AS total_count, @@ -482,6 +543,19 @@ func (q *Queries) DeleteBotSetupCodesForWorkspaceBot(ctx context.Context, arg De return result.RowsAffected() } +const deleteChannel = `-- name: DeleteChannel :execrows +DELETE FROM channels +WHERE id = ?1 +` + +func (q *Queries) DeleteChannel(ctx context.Context, id string) (int64, error) { + result, err := q.db.ExecContext(ctx, deleteChannel, id) + if err != nil { + return 0, err + } + return result.RowsAffected() +} + const deleteDesktopOAuthGrant = `-- name: DeleteDesktopOAuthGrant :execrows DELETE FROM desktop_oauth_grants WHERE id = ?1 AND grant_hash = ?2 @@ -635,6 +709,16 @@ func (q *Queries) DeleteUnclaimedBotSetupCodesForTokenName(ctx context.Context, return result.RowsAffected() } +const deleteUpload = `-- name: DeleteUpload :exec +DELETE FROM uploads +WHERE id = ?1 +` + +func (q *Queries) DeleteUpload(ctx context.Context, id string) error { + _, err := q.db.ExecContext(ctx, deleteUpload, id) + return err +} + const deleteUploadQuotaReservation = `-- name: DeleteUploadQuotaReservation :execrows DELETE FROM upload_quota_reservations WHERE id = ?1 AND owner_id = ?2 @@ -2202,6 +2286,19 @@ func (q *Queries) GetWorkspaceForSetupClaim(ctx context.Context, workspaceID str return i, err } +const getWorkspaceSlug = `-- name: GetWorkspaceSlug :one +SELECT slug +FROM workspaces +WHERE id = ?1 +` + +func (q *Queries) GetWorkspaceSlug(ctx context.Context, id string) (string, error) { + row := q.db.QueryRowContext(ctx, getWorkspaceSlug, id) + var slug string + err := row.Scan(&slug) + return slug, err +} + const hideDirectConversation = `-- name: HideDirectConversation :exec INSERT INTO direct_conversation_hidden (conversation_id, user_id, hidden_at) VALUES (?1, ?2, ?3) @@ -3466,6 +3563,66 @@ func (q *Queries) ListBotsOwnedBy(ctx context.Context, ownerUserID sql.NullStrin return items, nil } +const listChannelExclusiveUploads = `-- name: ListChannelExclusiveUploads :many +SELECT u.id, u.storage_path, u.byte_size +FROM uploads u +WHERE u.workspace_id = ?1 + AND u.id IN ( + SELECT channel_attachment.upload_id + FROM message_attachments channel_attachment + JOIN messages channel_message ON channel_message.id = channel_attachment.message_id + WHERE channel_message.channel_id = ?2 + ) + AND NOT EXISTS ( + SELECT 1 + FROM message_attachments other_attachment + JOIN messages other_message ON other_message.id = other_attachment.message_id + WHERE other_attachment.upload_id = u.id + AND (other_message.channel_id IS NULL OR other_message.channel_id <> ?2) + ) + AND NOT EXISTS ( + SELECT 1 + FROM workspaces icon_workspace + WHERE icon_workspace.id = u.workspace_id + AND icon_workspace.icon_url = '/api/uploads/' || u.id + ) +ORDER BY u.id +` + +type ListChannelExclusiveUploadsParams struct { + WorkspaceID string `json:"workspace_id"` + ChannelID sql.NullString `json:"channel_id"` +} + +type ListChannelExclusiveUploadsRow struct { + ID string `json:"id"` + StoragePath string `json:"storage_path"` + ByteSize int64 `json:"byte_size"` +} + +func (q *Queries) ListChannelExclusiveUploads(ctx context.Context, arg ListChannelExclusiveUploadsParams) ([]ListChannelExclusiveUploadsRow, error) { + rows, err := q.db.QueryContext(ctx, listChannelExclusiveUploads, arg.WorkspaceID, arg.ChannelID) + if err != nil { + return nil, err + } + defer rows.Close() + var items []ListChannelExclusiveUploadsRow + for rows.Next() { + var i ListChannelExclusiveUploadsRow + if err := rows.Scan(&i.ID, &i.StoragePath, &i.ByteSize); err != nil { + return nil, err + } + items = append(items, i) + } + if err := rows.Close(); err != nil { + return nil, err + } + if err := rows.Err(); err != nil { + return nil, err + } + return items, nil +} + const listChannels = `-- name: ListChannels :many SELECT c.id, COALESCE(c.route_id, '') AS route_id, c.workspace_id, c.name, c.display_title, c.kind, c.created_at, c.archived_at, c.external_managed, c.external_ref, c.external_url, c.sidebar_section, diff --git a/apps/api/internal/store/types.go b/apps/api/internal/store/types.go index 802653772..797cdd4ee 100644 --- a/apps/api/internal/store/types.go +++ b/apps/api/internal/store/types.go @@ -1331,6 +1331,8 @@ type Store interface { GetChannel(ctx context.Context, channelID, userID string) (Channel, error) CreateChannel(ctx context.Context, input CreateChannelInput) (Channel, Event, error) UpdateChannel(ctx context.Context, input UpdateChannelInput) (Channel, Event, error) + PreviewChannelDeletion(ctx context.Context, channelID, actorUserID string) (ChannelDeletionPreview, error) + DeleteChannel(ctx context.Context, channelID, actorUserID string) (ChannelDeletion, error) ListTopics(ctx context.Context, workspaceID, requesterID string) ([]Topic, error) CreateTopic(ctx context.Context, input CreateTopicInput) (Topic, error) ListMessages(ctx context.Context, channelID, userID string, page MessagePageRequest) (MessagePage, error) diff --git a/apps/api/internal/webassets/dist/200.html b/apps/api/internal/webassets/dist/200.html index 8c698c40c..9d39dbf68 100644 --- a/apps/api/internal/webassets/dist/200.html +++ b/apps/api/internal/webassets/dist/200.html @@ -110,16 +110,16 @@ - + - + - +
@@ -133,7 +133,7 @@ Promise.all([ import("/_app/immutable/entry/start.CJgF5gsQ.js"), - import("/_app/immutable/entry/app.B8HOrAvW.js") + import("/_app/immutable/entry/app.mmJ26YUq.js") ]).then(([kit, app]) => { kit.start(app, element); }); diff --git a/apps/api/internal/webassets/dist/_app/immutable/assets/0.BbpWhj-s.css b/apps/api/internal/webassets/dist/_app/immutable/assets/0.C7lK6Biz.css similarity index 68% rename from apps/api/internal/webassets/dist/_app/immutable/assets/0.BbpWhj-s.css rename to apps/api/internal/webassets/dist/_app/immutable/assets/0.C7lK6Biz.css index a251df3f9..36a43e145 100644 --- a/apps/api/internal/webassets/dist/_app/immutable/assets/0.BbpWhj-s.css +++ b/apps/api/internal/webassets/dist/_app/immutable/assets/0.C7lK6Biz.css @@ -1 +1 @@ -@font-face{font-family:Geist Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(./geist-cyrillic-ext-wght-normal.DjL33-gN.woff2)format("woff2-variations");unicode-range:U+460-52F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Geist Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(./geist-cyrillic-wght-normal.BEAKL7Jp.woff2)format("woff2-variations");unicode-range:U+301,U+400-45F,U+490-491,U+4B0-4B1,U+2116}@font-face{font-family:Geist Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(./geist-vietnamese-wght-normal.6IgcOCM7.woff2)format("woff2-variations");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+300-301,U+303-304,U+308-309,U+323,U+329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Geist Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(./geist-latin-ext-wght-normal.DC-KSUi6.woff2)format("woff2-variations");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Geist Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(./geist-latin-wght-normal.BgDaEnEv.woff2)format("woff2-variations");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Geist Mono Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(./geist-mono-cyrillic-ext-wght-normal.X_5orZeX.woff2)format("woff2-variations");unicode-range:U+460-52F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Geist Mono Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(./geist-mono-cyrillic-wght-normal.DiZS0aHC.woff2)format("woff2-variations");unicode-range:U+301,U+400-45F,U+490-491,U+4B0-4B1,U+2116}@font-face{font-family:Geist Mono Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(./geist-mono-symbols2-wght-normal.CO5SzqOn.woff2)format("woff2-variations");unicode-range:U+2000-2001,U+2004-2008,U+200A,U+23B8-23BD,U+2500-259F}@font-face{font-family:Geist Mono Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(./geist-mono-vietnamese-wght-normal.DadHysG0.woff2)format("woff2-variations");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+300-301,U+303-304,U+308-309,U+323,U+329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Geist Mono Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(./geist-mono-latin-ext-wght-normal.Bwz-egvJ.woff2)format("woff2-variations");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Geist Mono Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(./geist-mono-latin-wght-normal.XN7g48iV.woff2)format("woff2-variations");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Bricolage Grotesque Variable;font-style:normal;font-display:swap;font-weight:200 800;src:url(./bricolage-grotesque-vietnamese-wght-normal.BUzh504Q.woff2)format("woff2-variations");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+300-301,U+303-304,U+308-309,U+323,U+329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Bricolage Grotesque Variable;font-style:normal;font-display:swap;font-weight:200 800;src:url(./bricolage-grotesque-latin-ext-wght-normal.CcLUaPy7.woff2)format("woff2-variations");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Bricolage Grotesque Variable;font-style:normal;font-display:swap;font-weight:200 800;src:url(./bricolage-grotesque-latin-wght-normal.DLoelf7F.woff2)format("woff2-variations");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}:root{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light dark;font-feature-settings:"ss01", "cv11";--font-display:"Bricolage Grotesque Variable", "Geist Variable", ui-sans-serif, system-ui, sans-serif;--font-mono:"Geist Mono Variable", ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;--rail:var(--lightningcss-light,#e2e5ea)var(--lightningcss-dark,#0b0e14);--bg:var(--lightningcss-light,#edeff2)var(--lightningcss-dark,#0e1219);--panel:var(--lightningcss-light,#f8f9fb)var(--lightningcss-dark,#141926);--panel-2:var(--lightningcss-light,#e8ebef)var(--lightningcss-dark,#1b2232);--panel-3:var(--lightningcss-light,#dde1e7)var(--lightningcss-dark,#232c3f);--surface:var(--panel-2);--hover:var(--lightningcss-light,#10151d0d)var(--lightningcss-dark,#d6e4ff0b);--hover-strong:var(--lightningcss-light,#10151d14)var(--lightningcss-dark,#d6e4ff14);--line:var(--lightningcss-light,#10151d1a)var(--lightningcss-dark,#bed2ff17);--line-strong:var(--lightningcss-light,#10151d2b)var(--lightningcss-dark,#bed2ff29);--text:var(--lightningcss-light,#232a35)var(--lightningcss-dark,#dbe2ec);--text-strong:var(--lightningcss-light,#10151d)var(--lightningcss-dark,#f4f7fb);--muted:var(--lightningcss-light,#5d6878)var(--lightningcss-dark,#8a95a8);--muted-2:var(--lightningcss-light,#8b94a3)var(--lightningcss-dark,#5c6577);--accent:var(--lightningcss-light,#0080c4)var(--lightningcss-dark,#41c6ff);--accent-hover:var(--lightningcss-light,#006aa6)var(--lightningcss-dark,#6ad3ff);--accent-contrast:var(--lightningcss-light,#fff)var(--lightningcss-dark,#061420);--accent-2:var(--lightningcss-light,#f56a1d)var(--lightningcss-dark,#ff9550);--accent-soft:var(--lightningcss-light,#0080c421)var(--lightningcss-dark,#41c6ff26);--brand-a:var(--lightningcss-light,#0072b0)var(--lightningcss-dark,#41c6ff);--brand-b:var(--lightningcss-light,#2653e8)var(--lightningcss-dark,#6d8bff);--brand-contrast:var(--lightningcss-light,#fff)var(--lightningcss-dark,#061420);--activity-accent:var(--lightningcss-light,#c07e0a)var(--lightningcss-dark,#e8b23e);--activity-accent-soft:var(--lightningcss-light,#c07e0a17)var(--lightningcss-dark,#e8b23e1a);--delivery-accent:var(--lightningcss-light,#5558d9)var(--lightningcss-dark,#8b8df2);--delivery-accent-soft:var(--lightningcss-light,#5558d90f)var(--lightningcss-dark,#8b8df214);--tool-call-bg:var(--lightningcss-light,#5558d917)var(--lightningcss-dark,#8b8df21f);--tool-call-bg-hover:var(--lightningcss-light,#5558d924)var(--lightningcss-dark,#8b8df22e);--accent-glow:0 0 0 1px color-mix(in srgb, var(--accent) 32%, transparent), 0 8px 30px -12px color-mix(in srgb, var(--accent) 48%, transparent);--success:var(--lightningcss-light,#14876a)var(--lightningcss-dark,#30c48d);--warn:#e8a33e;--danger:var(--lightningcss-light,#d13438)var(--lightningcss-dark,#ff6d68);--scrollbar:var(--lightningcss-light,#10151d2e)var(--lightningcss-dark,#bed2ff1f);--scrollbar-hover:var(--lightningcss-light,#10151d4d)var(--lightningcss-dark,#bed2ff38);--shadow:0 24px 60px -22px var(--lightningcss-light,#10151d4d)var(--lightningcss-dark,#02050ab3);--tooltip-bg:var(--lightningcss-light,#10151d)var(--lightningcss-dark,#2b3448);--tooltip-fg:var(--lightningcss-light,#f0f4fa)var(--lightningcss-dark,#f4f7fb);--key-edge:0 1px 0 var(--line-strong), 0 2px 0 var(--lightningcss-light,#10151d1a)var(--lightningcss-dark,#00000073);--key-edge-pressed:0 1px 0 var(--line-strong);--radius-sm:4px;--radius:6px;--radius-lg:10px;--radius-xl:14px;--safe-area-top:env(safe-area-inset-top,0px);--safe-area-right:env(safe-area-inset-right,0px);--safe-area-bottom:env(safe-area-inset-bottom,0px);--safe-area-left:env(safe-area-inset-left,0px);background:var(--bg);color:var(--text);font-family:Geist Variable,Inter,SF Pro Text,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif}@media (prefers-color-scheme:dark){:root{--lightningcss-light: ;--lightningcss-dark:initial}}:root[data-color-mode=light]{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light}:root[data-color-mode=dark]{--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark}[data-board=ember]{--rail:var(--lightningcss-light,#e9e1d7)var(--lightningcss-dark,#16110d);--bg:var(--lightningcss-light,#f7f3ed)var(--lightningcss-dark,#1a1511);--panel:var(--lightningcss-light,#fffaf2)var(--lightningcss-dark,#211a15);--panel-2:var(--lightningcss-light,#efe7dc)var(--lightningcss-dark,#29211a);--panel-3:var(--lightningcss-light,#e4dbcf)var(--lightningcss-dark,#322820);--hover:var(--lightningcss-light,#1020270d)var(--lightningcss-dark,#fff4eb0b);--hover-strong:var(--lightningcss-light,#10202714)var(--lightningcss-dark,#fff4eb14);--line:var(--lightningcss-light,#1020271a)var(--lightningcss-dark,#ffece014);--line-strong:var(--lightningcss-light,#10202729)var(--lightningcss-dark,#ffece024);--text:var(--lightningcss-light,#22201d)var(--lightningcss-dark,#ece4da);--text-strong:var(--lightningcss-light,#11100e)var(--lightningcss-dark,#fbf6f0);--muted:var(--lightningcss-light,#6f675f)var(--lightningcss-dark,#a4917f);--muted-2:var(--lightningcss-light,#958b80)var(--lightningcss-dark,#6f6152);--accent:var(--lightningcss-light,#c94a32)var(--lightningcss-dark,#f0714c);--accent-hover:var(--lightningcss-light,#b13c26)var(--lightningcss-dark,#ff8560);--accent-contrast:var(--lightningcss-light,#fff)var(--lightningcss-dark,#241009);--accent-2:var(--lightningcss-light,#006d77)var(--lightningcss-dark,#45b8ac);--accent-soft:var(--lightningcss-light,#c94a3224)var(--lightningcss-dark,#f0714c2b);--brand-a:var(--lightningcss-light,#c64b32)var(--lightningcss-dark,#f0714c);--brand-b:var(--lightningcss-light,#c8425a)var(--lightningcss-dark,#d84a63);--brand-contrast:var(--lightningcss-light,#fff)var(--lightningcss-dark,#11100e);--scrollbar:var(--lightningcss-light,#1020272e)var(--lightningcss-dark,#ffece01a);--scrollbar-hover:var(--lightningcss-light,#1020274d)var(--lightningcss-dark,#ffece033);--shadow:0 24px 60px -22px var(--lightningcss-light,#10202752)var(--lightningcss-dark,#080402a6)}[data-board=moss]{--rail:var(--lightningcss-light,#dfe5e0)var(--lightningcss-dark,#0a100d);--bg:var(--lightningcss-light,#ecf0ed)var(--lightningcss-dark,#0e1512);--panel:var(--lightningcss-light,#f7f9f7)var(--lightningcss-dark,#131b16);--panel-2:var(--lightningcss-light,#e6ebe7)var(--lightningcss-dark,#1a241d);--panel-3:var(--lightningcss-light,#dbe2dc)var(--lightningcss-dark,#223026);--hover:var(--lightningcss-light,#0f17120d)var(--lightningcss-dark,#d6ffe40b);--hover-strong:var(--lightningcss-light,#0f171214)var(--lightningcss-dark,#d6ffe414);--line:var(--lightningcss-light,#0f17121a)var(--lightningcss-dark,#c8ffdc17);--line-strong:var(--lightningcss-light,#0f17122b)var(--lightningcss-dark,#c8ffdc29);--text:var(--lightningcss-light,#212b24)var(--lightningcss-dark,#dbe7de);--text-strong:var(--lightningcss-light,#0f1712)var(--lightningcss-dark,#f3faf4);--muted:var(--lightningcss-light,#5c6b60)var(--lightningcss-dark,#8fa295);--muted-2:var(--lightningcss-light,#8a9a8e)var(--lightningcss-dark,#5d6e62);--accent:var(--lightningcss-light,#177a50)var(--lightningcss-dark,#3ddc97);--accent-hover:var(--lightningcss-light,#0f6a44)var(--lightningcss-dark,#63e6ab);--accent-contrast:var(--lightningcss-light,#fff)var(--lightningcss-dark,#05140c);--accent-2:var(--lightningcss-light,#d97f26)var(--lightningcss-dark,#ffab5e);--accent-soft:var(--lightningcss-light,#177a5021)var(--lightningcss-dark,#3ddc9726);--brand-a:var(--lightningcss-light,#177a50)var(--lightningcss-dark,#3ddc97);--brand-b:var(--lightningcss-light,#0e7490)var(--lightningcss-dark,#2bb3a3);--brand-contrast:var(--lightningcss-light,#fff)var(--lightningcss-dark,#05140c);--scrollbar:var(--lightningcss-light,#0f17122e)var(--lightningcss-dark,#c8ffdc1f);--scrollbar-hover:var(--lightningcss-light,#0f17124d)var(--lightningcss-dark,#c8ffdc38)}[data-board=iris]{--rail:var(--lightningcss-light,#e2e2ea)var(--lightningcss-dark,#0d0c15);--bg:var(--lightningcss-light,#eeeef4)var(--lightningcss-dark,#12111c);--panel:var(--lightningcss-light,#f8f8fb)var(--lightningcss-dark,#181726);--panel-2:var(--lightningcss-light,#e9e9f0)var(--lightningcss-dark,#201e33);--panel-3:var(--lightningcss-light,#dedee8)var(--lightningcss-dark,#2a2742);--hover:var(--lightningcss-light,#1213270d)var(--lightningcss-dark,#e0dcff0b);--hover-strong:var(--lightningcss-light,#12132714)var(--lightningcss-dark,#e0dcff14);--line:var(--lightningcss-light,#1213271a)var(--lightningcss-dark,#d2cdff17);--line-strong:var(--lightningcss-light,#1213272b)var(--lightningcss-dark,#d2cdff29);--text:var(--lightningcss-light,#26283a)var(--lightningcss-dark,#e0dff0);--text-strong:var(--lightningcss-light,#121327)var(--lightningcss-dark,#f6f5fd);--muted:var(--lightningcss-light,#61637a)var(--lightningcss-dark,#918fa9);--muted-2:var(--lightningcss-light,#9092a8)var(--lightningcss-dark,#605e78);--accent:var(--lightningcss-light,#7048d9)var(--lightningcss-dark,#a78bfa);--accent-hover:var(--lightningcss-light,#5f39c2)var(--lightningcss-dark,#bda4ff);--accent-contrast:var(--lightningcss-light,#fff)var(--lightningcss-dark,#150f26);--accent-2:var(--lightningcss-light,#d94f8a)var(--lightningcss-dark,#ff8bb3);--accent-soft:var(--lightningcss-light,#7048d921)var(--lightningcss-dark,#a78bfa29);--brand-a:var(--lightningcss-light,#7048d9)var(--lightningcss-dark,#a78bfa);--brand-b:var(--lightningcss-light,#2653e8)var(--lightningcss-dark,#6d8bff);--brand-contrast:var(--lightningcss-light,#fff)var(--lightningcss-dark,#150f26);--scrollbar:var(--lightningcss-light,#1213272e)var(--lightningcss-dark,#d2cdff1f);--scrollbar-hover:var(--lightningcss-light,#1213274d)var(--lightningcss-dark,#d2cdff38)}[data-board=signal]{--rail:var(--lightningcss-light,#e2e5ea)var(--lightningcss-dark,#0b0e14);--bg:var(--lightningcss-light,#edeff2)var(--lightningcss-dark,#0e1219);--panel:var(--lightningcss-light,#f8f9fb)var(--lightningcss-dark,#141926);--panel-2:var(--lightningcss-light,#e8ebef)var(--lightningcss-dark,#1b2232);--panel-3:var(--lightningcss-light,#dde1e7)var(--lightningcss-dark,#232c3f);--hover:var(--lightningcss-light,#10151d0d)var(--lightningcss-dark,#d6e4ff0b);--hover-strong:var(--lightningcss-light,#10151d14)var(--lightningcss-dark,#d6e4ff14);--line:var(--lightningcss-light,#10151d1a)var(--lightningcss-dark,#bed2ff17);--line-strong:var(--lightningcss-light,#10151d2b)var(--lightningcss-dark,#bed2ff29);--text:var(--lightningcss-light,#232a35)var(--lightningcss-dark,#dbe2ec);--text-strong:var(--lightningcss-light,#10151d)var(--lightningcss-dark,#f4f7fb);--muted:var(--lightningcss-light,#5d6878)var(--lightningcss-dark,#8a95a8);--muted-2:var(--lightningcss-light,#8b94a3)var(--lightningcss-dark,#5c6577);--accent:var(--lightningcss-light,#0080c4)var(--lightningcss-dark,#41c6ff);--accent-hover:var(--lightningcss-light,#006aa6)var(--lightningcss-dark,#6ad3ff);--accent-contrast:var(--lightningcss-light,#fff)var(--lightningcss-dark,#061420);--accent-2:var(--lightningcss-light,#f56a1d)var(--lightningcss-dark,#ff9550);--accent-soft:var(--lightningcss-light,#0080c421)var(--lightningcss-dark,#41c6ff26);--brand-a:var(--lightningcss-light,#0072b0)var(--lightningcss-dark,#41c6ff);--brand-b:var(--lightningcss-light,#2653e8)var(--lightningcss-dark,#6d8bff);--brand-contrast:var(--lightningcss-light,#fff)var(--lightningcss-dark,#061420)}*{box-sizing:border-box}html,body{height:100%;margin:0;padding:0}body{background:radial-gradient(1000px 600px at 0% 0%, color-mix(in srgb, var(--accent) 6%, transparent), transparent 60%), radial-gradient(900px 700px at 100% 100%, color-mix(in srgb, var(--delivery-accent) 5%, transparent), transparent 60%), var(--bg);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}button,input,textarea{font:inherit;color:inherit}code,pre,kbd,samp{font-variant-ligatures:none}button{cursor:pointer}input,textarea{background:0 0;border:0;outline:0}::-webkit-scrollbar{width:10px;height:10px}::-webkit-scrollbar-thumb{background:var(--scrollbar);background-clip:content-box;border:2px solid #0000;border-radius:999px}::-webkit-scrollbar-thumb:hover{background:var(--scrollbar-hover);background-clip:content-box}.auth-shell{min-height:100dvh;padding:calc(32px + var(--safe-area-top)) calc(32px + var(--safe-area-right)) calc(32px + var(--safe-area-bottom)) calc(32px + var(--safe-area-left));background:radial-gradient(color-mix(in srgb, var(--text) 6%, transparent) 1px, transparent 1.5px) 0 0 / 18px 18px, radial-gradient(700px 500px at 30% 20%, color-mix(in srgb, var(--brand-a) 14%, transparent), transparent 60%), radial-gradient(700px 500px at 80% 90%, color-mix(in srgb, var(--brand-b) 10%, transparent), transparent 60%), var(--bg);place-items:center;display:grid}.auth-panel{border:1px solid var(--line-strong);border-radius:var(--radius-xl);background:linear-gradient(180deg, #ffffff0a, #fff0) var(--panel);width:min(100%,440px);box-shadow:var(--key-edge), var(--shadow);gap:22px;padding:36px;display:grid}.auth-brand{align-items:center;gap:12px;display:flex}.auth-brand .mark{box-shadow:inset 0 0 0 1px #bed2ff21, var(--key-edge), 0 10px 24px -8px color-mix(in srgb, var(--brand-b) 65%, transparent)}.auth-brand .brand-text strong{color:var(--text-strong);letter-spacing:-.01em;display:block}.auth-brand .brand-text span{color:var(--muted);font-size:12px;display:block}.auth-copy{gap:8px;margin-top:8px;display:grid}.auth-copy h1{letter-spacing:-.02em;color:var(--text-strong);font-size:28px;font-family:var(--font-display);margin:0;font-weight:700}.auth-copy p{color:var(--muted);margin:0;line-height:1.5}.github-login{color:#fff;background:#0d1117;border:1px solid #2b2f36;border-radius:12px;justify-content:center;align-items:center;gap:10px;min-height:46px;font-weight:600;text-decoration:none;transition:transform 80ms,background .12s,border-color .12s;display:inline-flex}.github-login:hover{background:#161b22;border-color:#3f4750;transform:translateY(-1px)}.openclaw-login{min-height:46px;color:var(--text-strong);border:1px solid var(--muted-2);background:0 0;border-radius:12px;justify-content:center;align-items:center;gap:10px;font-weight:600;text-decoration:none;transition:transform 80ms,background .12s,border-color .12s;display:inline-flex}.openclaw-login:hover{background:color-mix(in srgb, var(--text-strong) 6%, transparent);border-color:var(--muted);transform:translateY(-1px)}.auth-form{gap:14px;display:grid}.auth-submit{border:1px solid color-mix(in srgb, var(--accent) 70%, var(--text-strong));background:var(--accent);min-height:46px;color:var(--accent-contrast);cursor:pointer;border-radius:12px;font-weight:700;transition:transform 80ms,background .12s}.auth-submit:hover:not(:disabled){background:var(--accent-hover);transform:translateY(-1px)}.auth-submit:disabled{cursor:default;opacity:.58;transform:none}.auth-submit-quiet{border-color:var(--line-strong);background:var(--panel-2);min-height:38px;color:var(--text)}.auth-submit-quiet:hover:not(:disabled){background:var(--hover)}.auth-divider{color:var(--muted-2);align-items:center;gap:12px;margin:0;font-size:12px;display:flex}.auth-divider:before,.auth-divider:after{content:"";background:var(--line);flex:1;height:1px}.auth-error{border:1px solid color-mix(in srgb, var(--danger) 45%, var(--line));border-radius:var(--radius-sm);background:color-mix(in srgb, var(--danger) 10%, transparent);color:var(--text);margin:0;padding:10px 12px;font-size:13px}.auth-magic summary{cursor:pointer;color:var(--muted);font-size:12px}.auth-magic[open] summary{margin-bottom:12px}.auth-foot{color:var(--muted-2);text-align:center;margin:0;font-size:12px}.shell{grid-template-rows:minmax(0,1fr);grid-template-columns:72px 260px minmax(0,1fr) 0;height:100dvh;min-height:100dvh;transition:grid-template-columns .22s cubic-bezier(.2,.8,.2,1);display:grid;overflow:clip}.shell.thread-open,.shell.search-open{grid-template-columns:72px 260px minmax(0,1fr) minmax(340px,28vw)}.shell.artifact-open{grid-template-columns:72px 260px minmax(0,1fr) minmax(460px,42vw)}.shell.sidebar-collapsed{grid-template-columns:72px 0 minmax(0,1fr) 0}.shell.sidebar-collapsed.thread-open,.shell.sidebar-collapsed.search-open{grid-template-columns:72px 0 minmax(0,1fr) minmax(340px,28vw)}.shell.sidebar-collapsed.artifact-open{grid-template-columns:72px 0 minmax(0,1fr) minmax(460px,42vw)}.shell>.thread,.shell>.search-results,.shell>.artifact-viewer{grid-area:1/4}.shell.desktop-shell{background:radial-gradient(color-mix(in srgb, var(--text) 7%, transparent) 1px, transparent 1.5px) 0 0 / 14px 14px, var(--rail);grid-template-rows:52px minmax(0,1fr)}.desktop-shell>.guild-rail,.desktop-shell>.sidebar{background:0 0;border-right:0}.desktop-shell>.sidebar{grid-template-rows:minmax(0,1fr) auto}@media (width<=820px){.desktop-shell>.guild-rail{background:radial-gradient(color-mix(in srgb, var(--text) 7%, transparent) 1px, transparent 1.5px) 0 0 / 14px 14px, var(--rail);border-right:1px solid var(--line)}.desktop-shell>.sidebar{background:var(--panel);border-right:1px solid var(--line)}}.desktop-shell>.timeline{border-top:1px solid var(--line);border-left:1px solid var(--line);border-top-left-radius:12px}.desktop-shell:not(.thread-open):not(.search-open):not(.artifact-open)>.timeline{border-top-right-radius:12px}.desktop-shell>.thread,.desktop-shell>.search-results,.desktop-shell>.artifact-viewer{border-top:1px solid var(--line);border-top-right-radius:12px}.desktop-shell>.desktop-titlebar{grid-area:1/1/auto/-1}.desktop-shell>.guild-rail,.desktop-shell>.sidebar,.desktop-shell>.timeline,.desktop-shell>.thread,.desktop-shell>.search-results,.desktop-shell>.artifact-viewer{grid-row:2}.desktop-shell .mobile-nav-toggle{display:none}.desktop-auth-titlebar{z-index:10;-webkit-app-region:drag;height:52px;position:fixed;inset:0 0 auto}.desktop-titlebar{z-index:8;-webkit-app-region:drag;-webkit-user-select:none;user-select:none;background:0 0;align-items:center;min-width:0;height:52px;padding:0;display:flex;position:relative}.desktop-titlebar-safe-area{-webkit-app-region:drag;align-items:center;width:100%;min-width:0;height:100%;padding:0 14px;display:flex;position:relative}.desktop-titlebar[data-platform=darwin] .desktop-titlebar-safe-area{padding-left:78px}.desktop-titlebar[data-platform=win32] .desktop-titlebar-safe-area,.desktop-titlebar[data-platform=linux] .desktop-titlebar-safe-area{left:env(titlebar-area-x,0px);width:env(titlebar-area-width,calc(100% - 148px));position:absolute}.desktop-titlebar-leading{-webkit-app-region:no-drag;align-items:center;gap:9px;min-width:0;max-width:max(150px,50% - 300px);display:flex;overflow:hidden}.desktop-titlebar button,.desktop-external-link{color:var(--muted);background:0 0;border:1px solid #0000;place-items:center;display:grid}.desktop-titlebar button:hover,.desktop-external-link:hover{border-color:var(--line);background:var(--hover-strong);color:var(--text-strong)}.desktop-external-link{border-radius:var(--radius-sm);width:28px;height:28px;color:var(--muted);flex:0 0 28px;place-items:center;text-decoration:none;display:grid}.desktop-titlebar-leading>.desktop-sidebar-toggle{border-radius:8px;width:30px;height:30px}.desktop-titlebar-workspace{min-width:36px;max-width:190px;color:var(--text-strong);font-family:var(--font-display);letter-spacing:-.01em;text-overflow:ellipsis;white-space:nowrap;border-radius:8px;flex:0 auto;padding:5px 9px;font-size:13px;font-weight:650;overflow:hidden}.desktop-titlebar-channel{min-width:30px;max-width:230px;color:var(--text-strong);font-family:var(--font-display);letter-spacing:-.01em;text-overflow:ellipsis;white-space:nowrap;flex:0 auto;margin:0;font-size:13px;font-weight:650;overflow:hidden}.desktop-titlebar-channel.with-glyph:first-letter{color:var(--accent);margin-right:1px}.desktop-titlebar-divider{flex:none}.desktop-titlebar-status{color:var(--muted);white-space:nowrap;flex:none;align-items:center;gap:6px;margin-left:auto;font-size:11px;display:inline-flex}.desktop-titlebar-status:before{content:"";background:var(--muted-2);border-radius:50%;width:7px;height:7px;animation:1.6s ease-in-out infinite presence-pulse}.desktop-titlebar-actions{-webkit-app-region:no-drag;flex:none;align-items:center;margin-left:auto;display:flex}.desktop-titlebar-actions button{border-radius:8px;width:30px;height:30px}.desktop-titlebar-actions button:disabled{cursor:wait;opacity:.55}.desktop-titlebar-actions button.active{background:var(--accent-soft);color:var(--accent)}.desktop-titlebar-actions+.desktop-titlebar-status{margin-left:8px}@media (prefers-reduced-motion:reduce){.desktop-titlebar-status:before{animation:none}}.desktop-titlebar-search.search{border-color:var(--line-strong);background:color-mix(in srgb, var(--panel-2) 84%, transparent);-webkit-app-region:no-drag;width:clamp(220px,100vw - 700px,520px);height:32px;position:absolute;left:50%;transform:translate(-50%);box-shadow:inset 0 1px #ffffff09}.desktop-titlebar-search.search:focus-within{border-color:color-mix(in srgb, var(--accent) 66%, var(--line));background:var(--panel-2);box-shadow:0 0 0 3px color-mix(in srgb, var(--accent) 13%, transparent)}.timeline{background:var(--bg);isolation:isolate;flex-direction:column;min-width:0;display:flex;overflow:hidden}.timeline>*{flex-shrink:0;min-width:0}.timeline>.messages{flex:1 1 0;min-height:0}.topbar{border-bottom:1px solid var(--line);background:linear-gradient(180deg, #ffffff05, transparent), var(--bg);align-items:center;gap:14px;min-height:60px;padding:12px 20px;display:flex}.topbar-title{flex:1;align-items:center;gap:10px;min-width:0;display:flex}.topbar-title h1{letter-spacing:-.01em;color:var(--text-strong);font-size:16px;font-weight:650;font-family:var(--font-display);white-space:nowrap;text-overflow:ellipsis;margin:0;overflow:hidden}.topbar-title h1.with-glyph:first-letter{color:var(--accent);margin-right:1px}.topbar-divider{background:var(--line-strong);width:1px;height:18px;margin:0 6px}.topbar-meta{color:var(--muted);white-space:nowrap;text-overflow:ellipsis;margin:0;font-size:12px;overflow:hidden}.search{border-radius:var(--radius);background:var(--panel);border:1px solid var(--line);width:min(280px,30vw);height:34px;color:var(--muted);align-items:center;gap:8px;padding:0 10px;transition:border-color .12s,background .12s;display:flex}.search:focus-within{border-color:var(--accent);background:var(--panel-2);color:var(--text)}.search input{min-width:0;height:100%;color:var(--text);flex:1}.search input::placeholder{color:var(--muted)}.search-clear{background:var(--panel-3);width:18px;height:18px;color:var(--muted);border:0;border-radius:50%;place-items:center;font-size:14px;line-height:1;display:grid}.search-clear:hover{background:var(--accent);color:var(--accent-contrast)}.search-submit{background:var(--accent-soft);height:22px;color:var(--accent);font-family:var(--font-mono);letter-spacing:.06em;text-transform:uppercase;border:0;border-radius:5px;padding:0 8px;font-size:10px;font-weight:600}.search-submit:hover{background:var(--accent);color:var(--accent-contrast)}.topbar-actions{align-items:center;gap:6px;display:inline-flex}.topbar-actions button,.topbar-actions a{border:1px solid var(--line-strong);border-radius:var(--radius);background:var(--panel);width:32px;height:32px;color:var(--muted);box-shadow:var(--key-edge);place-items:center;text-decoration:none;transition:background .12s,color .12s,border-color .12s,box-shadow .12s,transform 80ms;display:grid}.topbar-actions button:hover,.topbar-actions a:hover,.topbar-actions button.active{background:var(--accent-soft);border-color:color-mix(in srgb, var(--accent) 55%, var(--line-strong));color:var(--accent)}.topbar-actions button:active,.topbar-actions a:active{box-shadow:var(--key-edge-pressed);transform:translateY(1px)}.notif-toggle{width:28px;height:28px;color:var(--muted);cursor:pointer;background:0 0;border:0;border-radius:6px;justify-content:center;align-items:center;margin-left:4px;display:inline-flex}.notif-toggle:hover{background:var(--accent-soft);color:var(--accent)}@keyframes pulse{0%,to{opacity:1}50%{opacity:.5}}.search-results{border-left:1px solid var(--line);background:var(--panel);opacity:1;grid-template-rows:auto auto minmax(0,1fr);min-width:0;transition:opacity .18s,transform .22s cubic-bezier(.2,.8,.2,1);display:grid;overflow:hidden;transform:translate(0)}.search-results.covered{opacity:0;pointer-events:none}.search-results-head{border-bottom:1px solid var(--line);background:linear-gradient(180deg, #ffffff05, transparent), var(--panel);justify-content:space-between;align-items:center;min-height:60px;padding:10px 16px;display:flex}.search-results-head>div{min-width:0}.search-results-head p{color:var(--muted);font-family:var(--font-mono);letter-spacing:0;text-transform:uppercase;margin:0 0 2px;font-size:10px;font-weight:600}.search-results-head strong{color:var(--text-strong);text-overflow:ellipsis;white-space:nowrap;font-size:14px;display:block;overflow:hidden}.search-results-head button{background:var(--panel-2);width:30px;height:30px;color:var(--muted);border:0;border-radius:50%;flex:none;place-items:center;font-size:19px;line-height:1;display:grid}.search-results-head button:hover{background:var(--hover);color:var(--text)}.search-results-summary{color:var(--muted);padding:12px 16px 8px;font-size:12px;font-weight:600}.search-results-scroll{min-height:0;padding:0 8px 16px;overflow-y:auto}.search-result-list{margin:0;padding:0;list-style:none}.search-result{color:var(--text);border-radius:var(--radius);text-align:left;background:0 0;border:0;align-items:flex-start;gap:10px;width:100%;padding:10px 8px;display:flex}.search-result:hover{background:var(--hover)}.search-result.is-active{background:color-mix(in srgb, var(--accent) 10%, transparent)}.search-result:focus-visible,.search-results-head button:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}.search-result .dm-avatar{width:30px;height:30px;font-size:13px}.search-result-body{flex-direction:column;flex:1;gap:2px;min-width:0;display:flex}.search-result-meta{align-items:baseline;gap:8px;min-width:0;display:flex}.search-result-meta strong{color:var(--text-strong);text-overflow:ellipsis;white-space:nowrap;font-size:13px;overflow:hidden}.search-result-handle{color:var(--muted);text-overflow:ellipsis;white-space:nowrap;font-size:11px;overflow:hidden}.search-result-meta time{color:var(--muted);flex:none;margin-left:auto;font-size:11px}.search-result-snippet{color:var(--muted);-webkit-line-clamp:3;-webkit-box-orient:vertical;line-height:1.45;display:-webkit-box;overflow:hidden}.search-result-snippet mark{background:color-mix(in srgb, var(--accent) 22%, transparent);color:var(--text-strong);border-radius:2px;font-weight:650}.search-result-context{min-width:0;color:var(--muted-2);align-items:center;gap:10px;margin-top:1px;font-size:11px;display:flex}.search-result-context:empty{display:none}.search-result-where{text-overflow:ellipsis;white-space:nowrap;font-weight:600;overflow:hidden}.search-result-thread{color:var(--accent);flex:none;align-items:center;gap:4px;font-weight:600;display:inline-flex}.search-load-more{border:1px solid var(--line-strong);border-radius:var(--radius);background:var(--panel-2);width:calc(100% - 16px);color:var(--text);margin:8px auto 0;padding:8px 12px;font-size:12px;font-weight:600;display:block}.search-load-more:hover:not(:disabled){background:var(--hover)}.search-load-more:disabled{color:var(--muted)}.search-load-more:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}.search-end{color:var(--muted-2);text-align:center;padding:14px 8px 4px;font-size:11px}.search-foot-error{border:1px solid color-mix(in srgb, var(--danger) 40%, transparent);border-radius:var(--radius);background:color-mix(in srgb, var(--danger) 8%, transparent);color:var(--text);justify-content:space-between;align-items:center;gap:10px;margin:8px 8px 0;padding:8px 12px;font-size:12px;display:flex}.search-foot-error p{min-width:0;margin:0}.search-foot-error button{border:1px solid var(--line-strong);border-radius:var(--radius);background:var(--panel-2);color:var(--text);flex:none;padding:4px 10px;font-size:12px;font-weight:600}.search-foot-error button:hover{background:var(--hover)}.search-state{color:var(--muted);text-align:center;justify-items:center;padding:56px 24px;display:grid}.search-state-icon{border:1px solid var(--line-strong);background:var(--panel-2);width:44px;height:44px;color:var(--muted-2);border-radius:50%;place-items:center;margin-bottom:14px;font-size:23px;display:grid}.search-state strong{color:var(--text-strong);font-size:14px}.search-state p{margin:5px 0 0;font-size:12px}.search-state-loading{grid-template-columns:repeat(3,7px);justify-content:center;gap:6px}.search-state-loading span{background:var(--accent);border-radius:50%;width:7px;height:7px;animation:1.2s ease-in-out infinite pulse}.search-state-loading span:nth-child(2){animation-delay:.12s}.search-state-loading span:nth-child(3){animation-delay:.24s}.guild-rail{background:radial-gradient(color-mix(in srgb, var(--text) 7%, transparent) 1px, transparent 1.5px) 0 0 / 14px 14px, var(--rail);border-right:1px solid var(--line);flex-direction:column;align-items:center;gap:8px;padding:14px 0;display:flex;position:relative}.guild-rail .guild{background:var(--panel);width:48px;height:48px;color:var(--text);border:1px solid var(--line-strong);letter-spacing:-.02em;box-shadow:var(--key-edge);border-radius:12px;place-items:center;font-size:14px;font-weight:700;text-decoration:none;transition:border-color .12s,background .12s,transform .12s,box-shadow .12s;display:grid;position:relative}.guild-rail .guild:hover{border-color:color-mix(in srgb, var(--accent) 55%, var(--line-strong));color:var(--accent);box-shadow:var(--key-edge), 0 6px 16px -8px color-mix(in srgb, var(--accent) 45%, transparent);transform:translateY(-1px)}.guild-rail .guild:active{box-shadow:var(--key-edge-pressed);transform:translateY(1px)}.guild-rail .guild.home{background:linear-gradient(135deg, var(--brand-a), var(--brand-b));border-color:color-mix(in srgb, var(--brand-b) 55%, var(--line-strong));color:var(--brand-contrast);font-weight:800;font-family:var(--font-display)}.guild-rail .guild.home:hover{color:var(--brand-contrast);transform:translateY(-1px)}.guild-rail .guild.home>span{text-overflow:ellipsis;white-space:nowrap;max-width:100%;padding:0 4px;overflow:hidden}.guild-rail .guild.home.home--mark{border-color:color-mix(in srgb, #41c6ff 35%, var(--line-strong));background:#141926;padding:0}.guild-rail .guild.home.home--mark .keystroke-mark{border-radius:inherit;width:100%;height:100%}.guild-rail .guild.home:active{box-shadow:var(--key-edge-pressed);transform:translateY(1px)}.guild-rail .guild__image{border-radius:inherit;object-fit:cover;width:100%;height:100%;display:block}.guild-rail .guild.add{color:var(--success);border:1px dashed color-mix(in srgb, var(--success) 45%, transparent);background:0 0}.guild-rail .guild.add:hover{background:color-mix(in srgb, var(--success) 14%, transparent);color:var(--success);border-style:solid;border-color:var(--success)}.guild-divider{background:var(--line-strong);width:36px;height:1px;margin:4px 0}.guild-list{flex-direction:column;flex:auto;align-items:center;gap:8px;min-height:0;display:flex;overflow-y:auto}.guild-wrap{position:relative}.guild-wrap:before{content:"";background:var(--accent);opacity:0;border-radius:0 4px 4px 0;width:4px;height:28px;transition:opacity .14s,transform .14s;position:absolute;top:50%;left:-14px;transform:translateY(-50%)scaleY(.2)}.guild-wrap:hover:before{opacity:.6;transform:translateY(-50%)scaleY(.5)}.guild-wrap.active:before{opacity:1;transform:translateY(-50%)scaleY(1)}.guild-wrap.active .guild{background:var(--accent);border-color:color-mix(in srgb, var(--accent) 70%, var(--text-strong));color:var(--accent-contrast)}.guild-create{background:var(--panel);border:1px solid var(--line-strong);border-radius:var(--radius);box-shadow:var(--shadow);z-index:20;margin-left:8px;padding:8px;position:absolute;top:14px;left:100%}.guild-create .profile-status{max-width:200px}.guild-create input{border-radius:var(--radius-sm);background:var(--panel-2);width:200px;height:32px;color:var(--text);padding:0 10px}.sidebar{background:var(--panel);border-right:1px solid var(--line);grid-template-rows:auto minmax(0,1fr) auto;grid-template-columns:minmax(0,1fr);min-width:0;transition:opacity .16s,transform .22s cubic-bezier(.2,.8,.2,1);display:grid;overflow:hidden}.sidebar-collapsed .sidebar{opacity:0;pointer-events:none;transform:translate(-14px)}.workspace-header{border-bottom:1px solid var(--line);justify-content:space-between;align-items:center;gap:6px;min-height:60px;padding:14px 16px;display:flex}.workspace-header-icon{object-fit:cover;background:var(--panel-2);border-radius:8px;flex:none;width:28px;height:28px}.workspace-header-actions{flex-shrink:0;align-items:center;gap:4px;display:flex}.workspace-menu{min-width:0;color:inherit;text-align:left;cursor:pointer;background:0 0;border:0;border-radius:8px;flex:1;align-items:center;gap:10px;margin-left:-8px;padding:5px 8px;transition:background .12s;display:flex}.workspace-menu:hover{background:var(--panel-2)}.workspace-menu-caret{color:var(--muted);flex:none;transition:color .12s}.workspace-menu:hover .workspace-menu-caret{color:var(--text-strong)}.sidebar-collapse{background:var(--panel-2);width:30px;height:30px;color:var(--muted);border:0;border-radius:8px;place-items:center;transition:color .12s,background .12s,transform .12s;display:grid}.sidebar-collapse:hover{background:var(--panel-3);color:var(--text-strong);transform:translate(-1px)}.workspace-name{flex-direction:column;gap:2px;min-width:0;display:flex}.workspace-name strong{min-width:0;color:var(--text-strong);letter-spacing:-.01em;font-size:15px;font-family:var(--font-display);align-items:center;gap:5px;font-weight:650;display:flex}.workspace-name-label{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.workspace-name .presence{color:var(--muted);align-items:center;gap:6px;font-size:11px;display:inline-flex}.workspace-name .presence:before{content:"";background:var(--muted-2);border-radius:50%;width:7px;height:7px;animation:1.6s ease-in-out infinite presence-pulse}@keyframes presence-pulse{0%,to{opacity:.4}50%{opacity:1}}@media (prefers-reduced-motion:reduce){.workspace-name .presence:before{animation:none}}.sidebar-scroll{padding:12px 8px 16px;overflow-y:auto}.nav-section+.nav-section{margin-top:12px}.section-title{border-radius:var(--radius-sm);background:0 0;border:0;align-items:center;gap:4px;width:100%;padding:2px 4px;display:flex}.nav-section.collapsed+.nav-section{margin-top:4px}.section-toggle{border-radius:var(--radius-sm);min-width:0;min-height:28px;color:var(--muted);text-transform:uppercase;font-family:var(--font-mono);letter-spacing:.09em;text-align:left;background:0 0;border:0;flex:1;align-items:center;gap:6px;padding:4px;font-size:10px;font-weight:600;display:flex}.section-toggle:hover{color:var(--text);background:var(--hover)}.section-toggle:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}.section-toggle .caret{opacity:.7;font-size:10px;transition:transform .14s}.section-toggle[aria-expanded=false] .caret{transform:rotate(-90deg)}.section-toggle .label{text-align:left;flex:1}.section-title .add-button{background:var(--hover-strong);width:18px;height:18px;color:var(--text);border:0;border-radius:4px;flex:none;place-items:center;padding:0;font-size:14px;font-weight:700;line-height:1;display:grid}.section-title .add-button:focus-visible{outline:2px solid var(--accent);outline-offset:1px}.section-title:hover .add-button{background:var(--accent);color:var(--accent-contrast)}.nav-list{flex-direction:column;gap:1px;margin-top:4px;display:flex}.nav-list[hidden]{display:none}.channel-subgroup{gap:1px;margin-top:6px;display:grid}.channel-subgroup-toggle{border-radius:var(--radius-sm);width:100%;min-height:26px;color:var(--muted);font-family:var(--font-mono);letter-spacing:.06em;text-align:left;text-transform:uppercase;background:0 0;border:0;align-items:center;gap:6px;padding:4px 9px 4px 28px;font-size:10px;font-weight:600;display:flex}.channel-subgroup-toggle:hover,.channel-subgroup-toggle:focus-visible{background:var(--hover);color:var(--text);outline:none}.channel-subgroup-toggle .caret{opacity:.7;font-size:10px;transition:transform .14s}.channel-subgroup-toggle[aria-expanded=false] .caret{transform:rotate(-90deg)}.channel-subgroup-count{color:var(--muted-2);font-variant-numeric:tabular-nums;margin-left:auto}.channel-subgroup-list{gap:1px;display:grid}.channel-subgroup-list[hidden]{display:none}.archived-channel-group{border-top:1px solid color-mix(in srgb, var(--line) 70%, transparent);margin-top:10px;padding-top:6px}@media (prefers-reduced-motion:reduce){.section-toggle .caret{transition:none}}.sr-only{clip:rect(0, 0, 0, 0);white-space:nowrap;border:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.channel-row{border-radius:var(--radius-sm);align-items:center;display:flex;position:relative}.channel-row .nav-item{flex:1;min-width:0}.channel-row.subdued .nav-item:not(.active){color:var(--muted-2)}.managed-channel-marker{color:var(--muted-2);flex:none;place-items:center;display:inline-grid}.nav-item.active .managed-channel-marker,.nav-item:hover .managed-channel-marker{color:var(--accent)}.channel-row.reorderable .nav-item{padding-left:2px}.channel-drag-handle{border-radius:var(--radius-sm);color:var(--muted-2);cursor:grab;opacity:0;background:0 0;border:0;flex:0 0 24px;align-self:stretch;place-items:center;display:grid}.channel-row:hover .channel-drag-handle,.channel-drag-handle:focus-visible{opacity:1}.channel-drag-handle:hover{color:var(--text);background:var(--hover)}.channel-drag-handle:active{cursor:grabbing}.channel-drag-handle:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}.channel-drag-handle svg{fill:currentColor}.channel-move-menu{z-index:4;border:1px solid var(--line-strong);border-radius:var(--radius-sm);background:var(--panel);min-width:112px;box-shadow:var(--shadow);padding:4px;display:grid;position:absolute;top:calc(100% + 2px);left:0}.channel-move-menu button{color:var(--text);text-align:left;background:0 0;border:0;border-radius:4px;padding:6px 8px}.channel-move-menu button:hover:not(:disabled),.channel-move-menu button:focus-visible{background:var(--hover-strong);outline:none}.channel-move-menu button:disabled{color:var(--muted-2);cursor:default}.channel-row.dragging{opacity:.45}.channel-row.drop-before:before,.channel-row.drop-after:after{content:"";z-index:1;background:var(--accent);pointer-events:none;border-radius:1px;height:2px;position:absolute;left:4px;right:4px}.channel-row.drop-before:before{top:-1px}.channel-row.drop-after:after{bottom:-1px}@media (hover:none){.channel-drag-handle{opacity:1}}@media (prefers-reduced-motion:reduce){.channel-subgroup-toggle .caret{transition:none}}.nav-item{border-radius:var(--radius-sm);width:100%;color:var(--muted);text-align:left;background:0 0;border:0;align-items:center;gap:8px;min-height:30px;padding:6px 10px;text-decoration:none;transition:background .1s,color .1s;display:flex}.nav-item:hover{background:var(--hover);color:var(--text)}.nav-item:focus{outline:none}.nav-item:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}.nav-item.active{background:var(--accent-soft);color:var(--text-strong);box-shadow:inset 0 0 0 1px color-mix(in srgb, var(--accent) 35%, transparent)}.nav-item.has-unread{color:var(--text-strong);font-weight:600}.nav-item.has-unread .hash{color:var(--text-strong)}.unread-badge{background:var(--accent);min-width:18px;height:18px;color:var(--accent-contrast,white);text-align:center;letter-spacing:.01em;border-radius:9px;flex-shrink:0;padding:0 6px;font-size:11px;font-weight:700;line-height:18px}.nav-item .hash{color:var(--muted);text-align:center;width:14px;font-weight:600}.nav-item.active .hash{color:var(--accent)}.nav-label{white-space:nowrap;text-overflow:ellipsis;flex:1;font-size:14px;overflow:hidden}.dm-row{grid-template-columns:minmax(0,1fr) 24px;align-items:center;gap:2px;display:grid;position:relative}.dm-row .nav-item{min-width:0}.dm-actions-trigger{border-radius:var(--radius-sm);width:22px;height:22px;color:var(--muted-2);opacity:0;background:0 0;border:0;place-items:center;font-size:18px;font-weight:700;line-height:1;display:grid}.dm-row:hover .dm-actions-trigger,.dm-row:focus-within .dm-actions-trigger,.dm-row.active .dm-actions-trigger{opacity:1}.dm-actions-trigger:hover,.dm-actions-trigger:focus-visible,.dm-actions-trigger[aria-expanded=true]{background:var(--hover);color:var(--text);outline:none}.dm-actions-menu{z-index:30;border:1px solid var(--line-strong);border-radius:var(--radius-sm);background:var(--panel-2);min-width:164px;box-shadow:var(--shadow);padding:4px;position:absolute;top:28px;right:0}.dm-actions-item{width:100%;min-height:30px;color:var(--text);text-align:left;background:0 0;border:0;border-radius:6px;padding:0 10px;font-size:13px}.dm-actions-item:hover,.dm-actions-item:focus-visible{background:var(--hover);color:var(--text-strong);outline:none}.dm-undo{border:1px solid var(--line);border-radius:var(--radius-sm);background:var(--panel-2);color:var(--muted);align-items:center;gap:8px;margin:6px 8px 2px;padding:6px 8px;font-size:12px;display:flex}.dm-undo span{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}.dm-undo button{background:var(--hover);color:var(--text);border:0;border-radius:6px;padding:4px 8px;font-size:12px;font-weight:700}.dm-undo button:hover,.dm-undo button:focus-visible{background:var(--accent);color:var(--accent-contrast);outline:none}.nav-empty{color:var(--muted-2);margin:4px 8px;font-size:12px}.dm-avatar{color:#fff;background:linear-gradient(135deg, hsl(var(--hue,220deg) 70% 55%), hsl(calc(var(--hue,220deg) + 40deg) 70% 45%));border-radius:50%;flex-shrink:0;place-items:center;width:22px;height:22px;font-size:11px;font-weight:700;display:grid;overflow:hidden}.dm-avatar img,.avatar img{object-fit:cover;width:100%;height:100%;display:block}.presence-dot{background:var(--muted-2);border-radius:50%;flex-shrink:0;width:8px;height:8px}.presence-dot.active{background:var(--success);box-shadow:0 0 0 2px var(--panel)}.inline-create{grid-template-columns:minmax(0,1fr) auto;gap:6px;margin:6px 4px 2px;display:grid}.inline-create input{border-radius:var(--radius-sm);background:var(--panel-2);width:100%;min-width:0;height:30px;color:var(--text);border:1px solid var(--line);padding:0 10px}.inline-create input:focus{border-color:var(--accent);background:var(--panel-3)}.inline-create button.ghost,button.ghost{border-radius:var(--radius-sm);background:var(--panel-3);width:30px;height:30px;color:var(--muted);border:0;place-items:center;padding:0;font-size:14px;font-weight:600;display:grid}.inline-create button.ghost:hover{background:var(--accent);color:var(--accent-contrast)}.user-card{background:var(--panel-2);border-top:1px solid var(--line);width:100%;color:inherit;text-align:left;cursor:pointer;border-bottom:0;border-left:0;border-right:0;align-items:center;gap:10px;padding:10px 12px;transition:background .12s;display:flex}.user-card:hover{background:var(--panel-3)}.user-card .dm-avatar{width:28px;height:28px;font-size:12px}.user-card .user-meta{flex:1;min-width:0}.user-card .user-meta strong{color:var(--text-strong);white-space:nowrap;text-overflow:ellipsis;font-size:13px;display:block;overflow:hidden}.user-card .user-meta span{color:var(--muted);white-space:nowrap;text-overflow:ellipsis;font-size:11px;display:block;overflow:hidden}@media (width<=820px){.workspace-header{min-height:calc(60px + var(--safe-area-top));padding-top:calc(14px + var(--safe-area-top));padding-right:calc(16px + var(--safe-area-right))}.sidebar-scroll{padding-bottom:calc(16px + var(--safe-area-bottom))}.user-card{padding-bottom:calc(10px + var(--safe-area-bottom))}}.messages{flex-direction:column;display:flex;position:relative}.messages-scroll{overflow-anchor:none;opacity:1;isolation:isolate;flex-direction:column;flex:1;min-height:0;padding:0 4px;transition:opacity .14s ease-out;display:flex;overflow-y:auto}.messages-scroll:focus{outline:none}.messages.is-revealing .messages-scroll{opacity:0;pointer-events:none;transition:opacity}.messages-spacer{flex-grow:1}.history-loader{pointer-events:none;gap:14px;margin:4px 0 6px;padding:6px 18px;animation:.22s ease-out both history-loader-fade;display:grid}.history-loader--newer{margin-top:6px;margin-bottom:4px}@keyframes history-loader-fade{0%{opacity:0}to{opacity:1}}.history-loader__row{grid-template-columns:56px minmax(0,1fr);min-height:44px;display:grid}.history-loader__avatar,.history-loader__meta,.history-loader__line,.history-loader__block{background:linear-gradient(90deg, color-mix(in srgb, var(--muted-2) 16%, transparent), color-mix(in srgb, var(--muted-2) 36%, transparent), color-mix(in srgb, var(--muted-2) 16%, transparent));animation:1.4s ease-in-out infinite history-loading;animation-delay:calc(var(--history-row,0) * 80ms);background-size:220% 100%;display:block}.history-loader__avatar{border-radius:10px;width:38px;height:38px}.history-loader__body{align-content:start;gap:8px;min-width:0;padding-top:4px;display:grid}.history-loader__meta{border-radius:999px;width:min(180px,38%);height:11px}.history-loader__line{border-radius:999px;height:10px}.history-loader__line--wide{width:min(540px,72%)}.history-loader__line--mid{width:min(360px,48%)}@keyframes history-loading{0%{background-position:120% 0}to{background-position:-120% 0}}@media (prefers-reduced-motion:reduce){.history-loader{animation:none}.history-loader__avatar,.history-loader__meta,.history-loader__line,.history-loader__block{background:color-mix(in srgb, var(--muted-2) 22%, transparent);animation:none}}.unread-bar{z-index:5;background:color-mix(in srgb, var(--panel) 82%, transparent);-webkit-backdrop-filter:blur(14px)saturate(140%);border:1px solid color-mix(in srgb, var(--accent) 38%, transparent);max-width:calc(100% - 32px);height:30px;color:var(--text);letter-spacing:.005em;box-shadow:inset 0 1px 0 #ffffff14, 0 10px 24px -14px #0000008c, 0 0 0 4px color-mix(in srgb, var(--accent) 10%, transparent);opacity:1;border-radius:999px;align-items:center;gap:6px;padding:0 5px 0 14px;font-size:12px;font-weight:600;transition:opacity .16s ease-out,transform .18s cubic-bezier(.2,.8,.2,1);display:inline-flex;position:absolute;top:10px;left:50%;transform:translate(-50%)}.unread-bar.is-clearing{opacity:0;pointer-events:none;transform:translate(-50%,-6px)}.unread-bar__jump,.unread-bar__mark{color:inherit;font:inherit;cursor:pointer;background:0 0;border:0;align-items:center;gap:8px;transition:background-color .12s ease-out,color .12s ease-out;display:inline-flex}.unread-bar__jump{text-align:left;min-width:0;color:color-mix(in srgb, var(--accent) 92%, var(--text));flex:0 auto;padding:0 6px 0 0}.unread-bar__jump:before{content:"";background:var(--accent);width:7px;height:7px;box-shadow:0 0 0 0 color-mix(in srgb, var(--accent) 55%, transparent);border-radius:50%;flex-shrink:0;animation:1.8s ease-out 3 unread-bar-pulse}@keyframes unread-bar-pulse{0%{box-shadow:0 0 0 0 color-mix(in srgb, var(--accent) 55%, transparent)}70%{box-shadow:0 0 0 7px color-mix(in srgb, var(--accent) 0%, transparent)}to{box-shadow:0 0 0 0 color-mix(in srgb, var(--accent) 0%, transparent)}}@media (prefers-reduced-motion:reduce){.unread-bar__jump:before{animation:none}}.unread-bar__mark{background:color-mix(in srgb, var(--accent) 14%, transparent);height:22px;color:color-mix(in srgb, var(--accent) 90%, var(--text));letter-spacing:.01em;border-radius:999px;flex-shrink:0;padding:0 10px;font-size:11px;font-weight:600}.unread-bar__jump:hover{color:var(--accent)}.unread-bar__mark:hover{background:color-mix(in srgb, var(--accent) 24%, transparent);color:var(--accent)}.unread-bar__jump:focus-visible,.unread-bar__mark:focus-visible{outline:2px solid color-mix(in srgb, var(--accent) 70%, transparent);outline-offset:2px;border-radius:999px}.unread-bar__label{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.typing-indicator{height:0;color:var(--text-muted);opacity:0;pointer-events:none;align-items:center;gap:8px;margin-top:0;padding:0 22px;font-size:12px;transition:height .12s ease-out,margin-top .12s ease-out,opacity .12s ease-out,transform .16s cubic-bezier(.2,.8,.2,1);display:flex;overflow:hidden;transform:translateY(2px)}.typing-indicator.visible{opacity:1;height:20px;margin-top:-4px;transform:translateY(0)}.composer-dock{padding-top:20px;position:relative}.topic-filter{border-bottom:1px solid var(--line);background:color-mix(in srgb, var(--accent) 8%, var(--panel));color:var(--muted);justify-content:space-between;align-items:center;gap:12px;padding:8px 18px;font-size:13px;display:flex}.topic-filter strong{color:var(--text)}.topic-filter button,.message-topic{color:var(--accent);font:inherit;cursor:pointer;background:0 0;border:0}.topic-filter button:hover,.message-topic:hover{text-decoration:underline}.message-topic{background:color-mix(in srgb, var(--accent) 12%, transparent);border-radius:999px;margin:0 0 4px;padding:2px 7px;font-size:11px;font-weight:700;display:inline-flex}.topic-picker{border:1px solid var(--line);background:var(--panel);color:var(--muted);border-bottom:0;border-radius:10px 10px 0 0;align-items:center;gap:8px;margin:0 14px -1px;padding:7px 10px;font-size:12px;display:flex}.topic-picker select{min-width:0;max-width:min(280px,65vw);color:var(--text);font:inherit;background:0 0;border:0}.composer-dock .typing-indicator,.composer-dock .agent-responding{opacity:0;pointer-events:none;align-items:center;height:20px;margin:0;padding:0 22px;transition:opacity .12s ease-out;display:flex;position:absolute;top:0;left:0;right:0;overflow:hidden;transform:none}.composer-dock .typing-indicator.visible,.composer-dock .agent-responding.visible{opacity:1;height:20px;margin:0;transform:none}.composer-dock .typing-indicator__label{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.composer-dock:has(>.agent-responding)>.typing-indicator:not(.agent-responding){justify-content:flex-end;left:50%}.composer-dock:has(>.typing-indicator.visible:not(.agent-responding))>.agent-responding{right:50%}.typing-indicator__dots{align-items:center;gap:3px;display:inline-flex}.typing-indicator__dots i{opacity:.55;background:currentColor;border-radius:50%;width:4px;height:4px;animation:1.1s ease-in-out infinite typing-dot}.typing-indicator:not(.visible) .typing-indicator__dots i{animation:none}.typing-indicator__dots i:nth-child(2){animation-delay:.15s}.typing-indicator__dots i:nth-child(3){animation-delay:.3s}@keyframes typing-dot{0%,60%,to{opacity:.35;transform:translateY(0)}30%{opacity:1;transform:translateY(-3px)}}.message-row.is-pending{opacity:.55}.message-row.is-pending .message-content,.message-row.is-pending .markdown{pointer-events:none}.message-row.is-failed{opacity:1}.message-row.is-deleted{color:var(--muted)}.message-failed{background:color-mix(in srgb, var(--danger,#d04848) 14%, transparent);color:var(--danger,#d04848);border-radius:999px;align-items:center;gap:10px;margin-top:6px;padding:4px 10px;font-size:12px;display:inline-flex}.message-failed__label{font-weight:500}.message-failed__action{color:inherit;font:inherit;cursor:pointer;background:0 0;border:1px solid;border-radius:999px;padding:2px 8px;line-height:1}.message-failed__action:hover{background:color-mix(in srgb, currentColor 12%, transparent)}.message-failed__action--ghost{border-color:color-mix(in srgb, currentColor 50%, transparent)}@media (prefers-reduced-motion:reduce){.typing-indicator{transition:opacity 80ms ease-out;transform:none}.typing-indicator.visible{transform:none}.typing-indicator__dots i{opacity:.7;animation:none}}.empty{text-align:center;align-content:center;place-items:center;gap:10px;min-height:50vh;padding:48px 24px;display:grid}.empty-icon{background:linear-gradient(135deg, var(--brand-a), var(--brand-b));border:1px solid color-mix(in srgb, var(--brand-b) 55%, var(--line-strong));width:64px;height:64px;color:var(--brand-contrast);box-shadow:var(--key-edge), 0 18px 40px -16px color-mix(in srgb, var(--brand-b) 60%, transparent);border-radius:16px;place-items:center;font-size:26px;font-weight:800;display:grid}.empty strong{color:var(--text-strong);letter-spacing:-.01em;font-size:19px;font-family:var(--font-display);overflow-wrap:anywhere;font-weight:700}.empty span{color:var(--muted);max-width:380px;line-height:1.5}.day-divider{pointer-events:none;align-items:center;gap:12px;margin:18px 18px 8px;display:flex}.day-divider:before,.day-divider:after{content:"";background:var(--line);flex:1;height:1px}.day-divider span{background:var(--bg);border:1px solid var(--line);font-family:var(--font-mono);color:var(--muted);text-transform:uppercase;letter-spacing:.07em;border-radius:999px;padding:4px 12px;font-size:10px;font-weight:600}.new-messages-divider{pointer-events:none;opacity:1;align-items:center;gap:0;margin:4px 0 2px;padding:0 18px;transition:opacity .16s ease-out,transform .18s cubic-bezier(.2,.8,.2,1);display:flex;position:relative;transform:translateY(0)}.new-messages-divider.is-clearing{opacity:0;transform:translateY(-4px)}.new-messages-divider:before{content:"";background:var(--danger,#ed4245);opacity:.9;flex:1;height:1px}.new-messages-divider span{background:var(--danger,#ed4245);color:#fff;letter-spacing:.04em;text-transform:uppercase;border-radius:3px;align-items:center;height:14px;margin-left:8px;padding:0 5px;font-size:9px;font-weight:700;display:inline-flex}.message-group{grid-template-columns:56px minmax(0,1fr);padding:8px 18px;display:grid;position:relative}.avatar{color:#fff;background:linear-gradient(135deg, hsl(var(--hue,220deg) 70% 55%), hsl(calc(var(--hue,220deg) + 40deg) 70% 45%));border-radius:10px;place-items:center;width:38px;height:38px;margin-top:2px;font-size:14px;font-weight:700;display:grid;overflow:hidden;box-shadow:0 6px 20px -10px #0009}.avatar-button{z-index:2;cursor:pointer;border:0;padding:0;transition:transform .1s,box-shadow .12s,filter .12s;position:relative}.avatar-button:hover{filter:brightness(1.05);transform:translateY(-1px);box-shadow:0 10px 24px -12px #000c}.avatar.small{border-radius:10px;width:30px;height:30px;font-size:12px}.avatar.large{border-radius:16px;width:56px;height:56px;margin:0;font-size:18px}.group-body{min-width:0}.group-body>header{align-items:baseline;gap:8px;margin-bottom:2px;display:flex}.message-group .group-body>header{margin:0 -18px 0 -56px;padding:0 18px 2px 56px}.group-body>header strong{color:var(--text-strong);letter-spacing:-.005em;font-size:14.5px;font-weight:700}.author-name{color:var(--text-strong);letter-spacing:0;background:0 0;border:0;border-radius:4px;padding:0;font-size:14.5px;font-weight:700}.author-name:hover{color:var(--accent);text-underline-offset:2px;text-decoration:underline}.author-name--static:hover{color:var(--text-strong);text-decoration:none}.group-body>header time{color:var(--muted);font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-size:10.5px}.group-body>header span{color:var(--muted);font-size:12px}.bot-chip{border:1px solid color-mix(in srgb, var(--accent) 45%, transparent);height:18px;color:var(--accent);font-family:var(--font-mono);text-transform:uppercase;letter-spacing:.05em;border-radius:4px;align-items:center;padding:0 6px;font-size:9.5px;font-weight:700;line-height:1;display:inline-flex}.bot-chip--deleted{border-color:var(--line-strong);color:var(--muted)}.message-row{border-radius:0;margin-left:-56px;margin-right:-18px;padding:1px 18px 1px 56px;transition:background 80ms;position:relative}.message-row:not(:first-child){margin-top:1px}.message-row:hover,.message-group .group-body>header:hover,.message-group .group-body>header:hover+.message-row{background:var(--hover)}.message-group .group-body>header:has(+.message-row:hover){background:var(--hover)}.message-group .group-body>header:hover+.message-row .message-actions{opacity:1;pointer-events:auto}.message-row.selected{background:var(--accent-soft)}.message-row.can-open-thread{cursor:pointer}.row-stamp{font-family:var(--font-mono);color:var(--muted-2);opacity:0;font-variant-numeric:tabular-nums;font-size:9.5px;position:absolute;top:4px;left:8px}.message-row.is-preamble{background:0 0;margin-bottom:6px;padding-top:4px;padding-bottom:4px}.message-row.is-preamble:not(.before-final-message) .message-content{border:1px solid color-mix(in srgb, var(--activity-accent) 20%, transparent);border-radius:var(--radius-lg);background:var(--activity-accent-soft);box-shadow:0 2px 0 color-mix(in srgb, var(--activity-accent) 14%, transparent);padding:10px 14px}.message-row.is-preamble-collapsed .message-content{padding-top:6px;padding-bottom:6px}.message-row.is-preamble.before-final-message{background:0 0;margin-bottom:0;padding-top:2px;padding-bottom:0}.message-row.after-preamble{margin-top:0;padding-top:0;padding-bottom:2px}.message-row.is-preamble.before-final-message:before{display:none}.message-row.is-preamble.before-final-message .message-content{border:1px solid color-mix(in srgb, var(--activity-accent) 20%, transparent);background:var(--activity-accent-soft);border-top-left-radius:var(--radius-lg);border-top-right-radius:var(--radius-lg);border-bottom:0;padding:10px 14px}.message-row.after-preamble .message-content{border:1px solid color-mix(in srgb, var(--delivery-accent) 20%, transparent);border-bottom-left-radius:var(--radius-lg);border-bottom-right-radius:var(--radius-lg);background:var(--delivery-accent-soft);box-shadow:0 2px 0 color-mix(in srgb, var(--delivery-accent) 14%, transparent);border-top:0;padding:10px 14px}.message-row.is-preamble.before-final-message.is-preamble-collapsed .message-content{background:color-mix(in srgb, var(--activity-accent) 10%, var(--panel));border-bottom:1px solid color-mix(in srgb, var(--activity-accent) 30%, transparent);padding-top:7px;padding-bottom:7px}:root[data-user-align=right] .message-group.is-self,:root[data-other-align=right] .message-group:not(.is-self){grid-template-columns:minmax(0,1fr) 56px}:root[data-user-align=right] .message-group.is-self>.avatar,:root[data-other-align=right] .message-group:not(.is-self)>.avatar{grid-area:1/2;justify-self:end}:root[data-user-align=right] .message-group.is-self>.group-body,:root[data-other-align=right] .message-group:not(.is-self)>.group-body{grid-area:1/1;min-width:0}:root[data-user-align=right] .message-group.is-self .group-body>header,:root[data-other-align=right] .message-group:not(.is-self) .group-body>header{justify-content:flex-end;margin:0 -56px 0 -18px;padding:0 56px 2px 18px}:root[data-user-align=right] .message-group.is-self .message-row,:root[data-other-align=right] .message-group:not(.is-self) .message-row{margin-left:-18px;margin-right:-56px;padding-left:18px;padding-right:56px}:root[data-user-align=right] .message-group.is-self .message-content,:root[data-other-align=right] .message-group:not(.is-self) .message-content{text-align:right;margin-left:auto}:root[data-user-align=right] .message-group.is-self .markdown,:root[data-other-align=right] .message-group:not(.is-self) .markdown{text-align:right}:root:not([data-message-layout=outlined])[data-user-align=right] .message-group.is-self .markdown ul,:root:not([data-message-layout=outlined])[data-user-align=right] .message-group.is-self .markdown ol,:root:not([data-message-layout=outlined])[data-other-align=right] .message-group:not(.is-self) .markdown ul,:root:not([data-message-layout=outlined])[data-other-align=right] .message-group:not(.is-self) .markdown ol{padding-left:0;padding-right:0;list-style-position:inside}:root:not([data-message-layout=outlined])[data-user-align=right] .message-group.is-self .markdown li>ul,:root:not([data-message-layout=outlined])[data-user-align=right] .message-group.is-self .markdown li>ol,:root:not([data-message-layout=outlined])[data-other-align=right] .message-group:not(.is-self) .markdown li>ul,:root:not([data-message-layout=outlined])[data-other-align=right] .message-group:not(.is-self) .markdown li>ol{padding-left:0;padding-right:22px}:root:not([data-message-layout=outlined])[data-user-align=right] .message-group.is-self .markdown li>p:first-child,:root:not([data-message-layout=outlined])[data-other-align=right] .message-group:not(.is-self) .markdown li>p:first-child{display:inline}:root:not([data-message-layout=outlined])[data-user-align=right] .message-group.is-self .markdown blockquote,:root:not([data-message-layout=outlined])[data-other-align=right] .message-group:not(.is-self) .markdown blockquote{border-left:0;border-right:3px solid var(--accent);padding-left:0;padding-right:12px}:root[data-user-align=right] .message-group.is-self .attachment-grid,:root[data-other-align=right] .message-group:not(.is-self) .attachment-grid{margin-left:auto}.preamble-contract{gap:7px;min-width:0;display:grid}.preamble-toggle{width:100%;min-height:20px;color:var(--activity-accent);font:inherit;text-align:left;cursor:pointer;background:0 0;border:0;grid-template-columns:auto auto auto minmax(0,1fr);align-items:center;gap:7px;padding:0;display:grid}.preamble-chevron{color:var(--activity-accent);font-size:10px;transition:transform .12s}.preamble-chevron.open{transform:rotate(90deg)}.preamble-state,.preamble-action{line-height:1}.preamble-state{border:1px solid color-mix(in srgb, var(--activity-accent) 30%, transparent);height:17px;color:var(--activity-accent);text-transform:uppercase;letter-spacing:.03em;border-radius:999px;align-items:center;padding:0 7px;font-size:9.5px;font-weight:750;display:inline-flex}.preamble-state.is-live{border-color:color-mix(in srgb, var(--activity-accent) 55%, transparent);animation:1.6s ease-in-out infinite preamble-live-pulse}@keyframes preamble-live-pulse{0%,to{opacity:1}50%{opacity:.45}}@media (prefers-reduced-motion:reduce){.preamble-state.is-live{animation:none}}.preamble-action{min-width:0;color:var(--muted);text-overflow:ellipsis;white-space:nowrap;font-size:11px;font-weight:600;overflow:hidden}.preamble-body{color:var(--muted);overflow-wrap:anywhere;word-break:break-word;min-width:0}.preamble-flow{gap:7px;min-width:0;padding-left:17px;display:grid}.preamble-tool{--tool-accent:var(--activity-accent);background:var(--tool-call-bg);border-radius:7px;min-width:0;overflow:hidden}.preamble-tool-summary{width:100%;min-width:0;font:inherit;text-align:left;cursor:pointer;background:0 0;border:0;align-items:baseline;gap:7px;padding:4px 9px;line-height:1.5;display:flex}.preamble-tool-summary:hover{background:var(--tool-call-bg-hover)}.preamble-tool-full{color:var(--muted);overflow-wrap:anywhere;word-break:break-word;gap:5px;min-width:0;padding:2px 10px 8px 27px;font-size:12px;display:grid}.preamble-tool-full-head{font-family:var(--font-mono);color:color-mix(in srgb, var(--tool-accent) 45%, var(--muted));font-size:11px;font-weight:600}.preamble-tool-full-body{min-width:0}.preamble-tool-full pre{white-space:pre-wrap;overflow-wrap:anywhere}.tool-line-chevron{color:var(--muted-2);flex-shrink:0;font-size:9px;transition:transform .12s}.tool-line-chevron.open{transform:rotate(90deg)}.tool-line-glyph{filter:saturate(.85);flex-shrink:0;font-size:11px}.tool-line-action{color:color-mix(in srgb, var(--tool-accent) 38%, var(--text));flex-shrink:0;font-size:11.5px;font-weight:600}.tool-line-name{text-overflow:ellipsis;white-space:nowrap;max-width:40%;color:color-mix(in srgb, var(--tool-accent) 55%, var(--muted));font-size:11px;font-weight:500;font-family:var(--font-mono);flex-shrink:0;overflow:hidden}.tool-line-detail{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--muted);font-size:11px;font-weight:400;font-family:var(--font-mono);opacity:.85;flex:auto;overflow:hidden}.message-row:hover .row-stamp{opacity:1}.message-content{min-width:0;display:flow-root}.thread-hint{min-height:22px;color:var(--muted-2);cursor:pointer;background:0 0;border:1px solid #0000;border-radius:8px;align-items:center;gap:6px;margin-top:4px;padding:3px 8px;font-size:12px;font-weight:700;line-height:1;display:inline-flex}.thread-hint:not(.has-replies):not(.is-open){display:none}.thread-hint svg{flex:none}.thread-hint time{color:var(--muted);font-variant-numeric:tabular-nums;font-size:10.5px;font-weight:500}.thread-hint.has-replies,.thread-hint.is-open{color:var(--accent)}.thread-hint.is-open{border-color:color-mix(in srgb, var(--accent) 40%, transparent);background:color-mix(in srgb, var(--accent-soft) 70%, transparent)}.thread-hint:hover{border-color:var(--line-strong);background:var(--panel)}.thread-hint:disabled{cursor:default;opacity:.45}.message-actions{opacity:0;pointer-events:none;background:var(--panel);border:1px solid var(--line-strong);box-shadow:var(--shadow);border-radius:8px;align-items:flex-start;gap:4px;padding:2px;transition:opacity .1s;display:flex;position:absolute;top:-24px;right:8px}.message-row:hover .message-actions,.message-row.selected .message-actions,.message-row.menu-open .message-actions{opacity:1;pointer-events:auto}.message-row:has(:focus-visible) .message-actions{opacity:1;pointer-events:auto}.message-row.actions-flip .message-actions{top:auto;bottom:-24px}.message-row.menu-open{z-index:6}.message-row:hover,.message-row.selected{z-index:5}.message-row:has(:focus-visible){z-index:5}.messages:has(.message-row.menu-open) .message-row:hover:not(.menu-open) .message-actions{opacity:0;pointer-events:none}.messages:has(.message-row.menu-open) .message-group .group-body>header:hover+.message-row:not(.menu-open) .message-actions{opacity:0;pointer-events:none}@media (hover:none),(pointer:coarse){:root:not([data-pointer-mode=mouse]) .message-row{-webkit-touch-callout:none}:root:not([data-pointer-mode=mouse]) .message-actions{width:1px;height:1px;box-shadow:none;opacity:1;pointer-events:auto;background:0 0;border:0;padding:0;top:1px;bottom:auto;overflow:visible;transform:none}:root:not([data-pointer-mode=mouse]) .message-actions>:not(.message-more){display:none}:root:not([data-pointer-mode=mouse]) .message-row.actions-flip .message-actions{top:1px;bottom:auto}:root:not([data-pointer-mode=mouse]) .message-actions .message-more{position:static}:root:not([data-pointer-mode=mouse]) .message-actions .message-actions-trigger{clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}:root:not([data-pointer-mode=mouse]) .message-actions .message-actions-trigger:focus-visible{clip:auto;clip-path:none;border:1px solid var(--line-strong);background:var(--panel);width:36px;height:36px;box-shadow:var(--shadow);margin:0;top:0;right:0;overflow:visible}:root:not([data-pointer-mode=mouse]) .message-row:has(.message-actions-trigger:focus-visible) .message-content{padding-right:44px}}.message-actions button{width:28px;height:28px;color:var(--muted);background:0 0;border:0;border-radius:6px;place-items:center;display:grid}.message-actions button:hover{background:var(--hover-strong);color:var(--text-strong)}.message-actions button:disabled{opacity:.45}.message-copy-status{background:var(--accent-soft);height:24px;color:var(--accent);white-space:nowrap;border-radius:5px;align-self:center;align-items:center;padding:0 6px;font-size:11px;font-weight:700;display:inline-flex}.message-copy-status.is-error{background:color-mix(in srgb, var(--danger) 10%, transparent);color:var(--danger)}.message-sheet-scrim{z-index:60;background:#05080f66;flex-direction:column;justify-content:flex-end;display:flex;position:fixed;inset:0}.message-sheet-backdrop{background:0 0;border:0;padding:0;position:absolute;inset:0}.message-sheet-scrim,.message-sheet-scrim *{-webkit-user-select:none;user-select:none;-webkit-touch-callout:none}.message-action-sheet{z-index:1;background:var(--panel);border:1px solid var(--line);max-height:calc(100dvh - 16px - env(safe-area-inset-top,0px));padding:8px 12px calc(10px + env(safe-area-inset-bottom,0px));overscroll-behavior:contain;border-bottom:0;border-radius:16px 16px 0 0;animation:.16s ease-out sheet-rise;position:relative;overflow-y:auto}@keyframes sheet-rise{0%{opacity:0;transform:translateY(24px)}to{opacity:1;transform:translateY(0)}}@media (prefers-reduced-motion:reduce){.message-action-sheet{animation:none}}.message-action-sheet .sheet-grabber{background:var(--line-strong);border-radius:999px;width:36px;height:4px;margin:0 auto 8px}.message-action-sheet .sheet-emoji-row{border-bottom:1px solid var(--line);justify-content:space-around;gap:4px;padding-bottom:8px;display:flex}.message-action-sheet .sheet-emoji-row button{background:0 0;border:0;border-radius:10px;place-items:center;width:44px;height:44px;font-size:22px;line-height:1;display:grid}.message-action-sheet .sheet-emoji-row button:active{background:var(--hover-strong)}.message-action-sheet .sheet-actions{flex-direction:column;padding-top:4px;display:flex}.message-action-sheet .sheet-actions button{width:100%;color:var(--text-strong);text-align:left;background:0 0;border:0;border-radius:8px;align-items:center;gap:12px;padding:12px 8px;font-size:15px;display:flex}.message-action-sheet .sheet-actions button:active{background:var(--hover-strong)}.message-action-sheet .sheet-actions button:disabled{opacity:.45}.message-action-sheet .sheet-actions svg{color:var(--muted);flex:none}.message-action-sheet .sheet-danger,.message-action-sheet .sheet-danger svg{color:var(--danger)}.message-action-sheet .sheet-copy-status{background:var(--accent-soft);height:22px;color:var(--accent);white-space:nowrap;border-radius:5px;align-items:center;margin-left:auto;padding:0 6px;font-size:11px;font-weight:700;display:inline-flex}.message-action-sheet .sheet-copy-status.is-error{background:color-mix(in srgb, var(--danger) 10%, transparent);color:var(--danger)}.message-action-sheet .sheet-action-error{color:var(--danger);margin:-4px 12px 4px;font-size:12px;line-height:1.35}.message-actions .message-action-react{font-size:15px;line-height:1}.message-actions .action-sep{background:var(--line);flex:none;align-self:center;width:1px;height:18px;margin:0 3px}.message-actions .picker-wrapper,.message-actions .message-more{position:relative}.message-menu{z-index:30;background:var(--panel);border:1px solid var(--line-strong);min-width:190px;box-shadow:var(--shadow);border-radius:10px;padding:5px;font-size:13px;position:absolute;top:calc(100% + 4px);right:0}.message-menu.above{top:auto;bottom:calc(100% + 4px)}.message-menu button{width:100%;height:auto;color:var(--text);font:inherit;text-align:left;cursor:pointer;background:0 0;border:0;border-radius:7px;align-items:center;gap:9px;padding:7px 10px;font-size:13px;display:flex}.message-menu button:hover{background:var(--hover-strong);color:var(--text-strong)}.message-menu button svg{color:var(--muted);flex:none}.message-menu .menu-sep{border-top:1px solid var(--line);margin:5px 4px}.message-menu .menu-danger,.message-menu .menu-danger svg{color:var(--danger)}.message-menu .menu-danger:hover{background:color-mix(in srgb, var(--danger) 10%, transparent);color:var(--danger)}.message-edit{gap:7px;width:min(100%,760px);padding:5px 0 3px;display:grid}.message-edit__textarea{border:1px solid var(--line-strong);background:color-mix(in srgb, var(--panel) 94%, var(--text) 6%);width:100%;min-height:72px;max-height:240px;color:var(--text);font:inherit;resize:vertical;box-sizing:border-box;box-shadow:inset 0 1px 1px color-mix(in srgb, var(--text) 5%, transparent);border-radius:7px;padding:9px 11px;font-size:14.5px;line-height:1.5;transition:border-color .12s,box-shadow .12s,background .12s}.message-edit__textarea:hover:not(:disabled){border-color:color-mix(in srgb, var(--line-strong) 62%, var(--text) 38%)}.message-edit__textarea:focus{border-color:var(--accent);background:var(--panel);box-shadow:inset 0 1px 1px color-mix(in srgb, var(--text) 4%, transparent), 0 0 0 3px color-mix(in srgb, var(--accent) 18%, transparent);outline:none}.message-edit__textarea:disabled{cursor:progress;opacity:.78}.message-edit__footer{flex-wrap:wrap;align-items:center;gap:6px;min-height:30px;display:flex}.message-edit__footer .message-edit__save{background:var(--accent);min-width:68px;min-height:30px;color:var(--accent-contrast);cursor:pointer;border:0;border-radius:6px;justify-content:center;align-items:center;gap:4px;padding:5px 12px;font-size:13px;font-weight:500;display:inline-flex}.message-edit__footer .message-edit__save:hover{filter:brightness(1.1)}.message-edit__footer .message-edit__save:focus-visible,.message-edit__footer .message-edit__cancel:focus-visible{outline:2px solid var(--accent);outline-offset:2px}.message-edit__footer .message-edit__save:disabled{opacity:.5;cursor:progress}.message-edit__footer .message-edit__cancel{min-height:30px;color:var(--muted);cursor:pointer;background:0 0;border:1px solid #0000;border-radius:6px;justify-content:center;align-items:center;padding:5px 10px;font-size:13px;display:inline-flex}.message-edit__footer .message-edit__cancel:hover{border-color:var(--line);background:var(--hover-strong);color:var(--text-strong)}.message-edit__error{border-left:2px solid var(--danger);background:color-mix(in srgb, var(--danger) 8%, transparent);width:fit-content;max-width:100%;color:var(--danger);border-radius:3px;margin:0;padding:5px 8px;font-size:12.5px;line-height:1.35}.message-edit__indicator{color:var(--muted);align-items:center;gap:3px;margin-left:8px;font-size:11px;display:inline-flex}.message-row.editing .message-actions{display:none}@media (width<=520px){.message-edit__footer .message-edit__save,.message-edit__footer .message-edit__cancel{flex:1 1 0}}.message-deleted{min-height:22px;color:var(--muted);align-items:center;font-size:13px;font-style:italic;display:inline-flex}.markdown{color:var(--text);overflow-wrap:anywhere;word-break:break-word;font-size:14.5px;line-height:1.5}.markdown>:first-child{margin-top:0}.markdown>:last-child{margin-bottom:0}.markdown p{margin:0}.markdown p+p,.markdown ul,.markdown ol,.markdown blockquote,.markdown pre{margin-top:6px}.markdown a{color:var(--accent);text-decoration:none}.markdown a:hover{text-decoration:underline}.message-mention{border:1px solid color-mix(in srgb, currentColor 18%, transparent);background:color-mix(in srgb, currentColor 8%, transparent);color:inherit;border-radius:4px;margin:0 1px;padding:0 3px;font-weight:600}.message-mention.is-current-user{border-color:color-mix(in srgb, var(--accent) 42%, transparent);background:color-mix(in srgb, var(--accent) 20%, transparent);color:var(--accent);font-weight:700}.markdown code{background:var(--panel-2);border:1px solid var(--line);border-radius:4px;padding:1px 5px;font-family:Geist Mono Variable,JetBrains Mono,ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:.9em}.markdown pre{background:var(--panel-2);border:1px solid var(--line);border-radius:var(--radius);padding:12px 14px;overflow-x:auto}.markdown pre code{background:0 0;border:0;padding:0}.markdown blockquote{border-left:3px solid var(--accent);color:var(--muted);margin:0;padding:4px 0 4px 12px}.markdown ul,.markdown ol{padding-left:22px}.markdown img{border-radius:var(--radius);border:1px solid var(--line);object-fit:contain;background:var(--panel);cursor:zoom-in;max-width:100%;max-height:360px;margin-top:6px}.markdown-table-scroll{-webkit-overflow-scrolling:touch;overscroll-behavior-inline:contain;max-width:100%;margin-top:6px;overflow-x:auto}.markdown-table-scroll[data-overflowing]:focus-visible{outline:2px solid var(--accent);outline-offset:2px}.markdown-table-scroll:first-child{margin-top:0}.markdown-table-scroll>table{border-collapse:collapse;border-spacing:0;width:max-content;min-width:100%;font-size:.9em}.markdown thead{background:var(--muted-2)}.markdown th,.markdown td{vertical-align:top;border:1px solid var(--line);padding:8px 12px}.markdown thead th{color:var(--text-strong);font-weight:700}.markdown tbody tr:nth-child(2n){background:color-mix(in srgb, var(--muted-2) 18%, transparent)}.markdown tbody tr:hover{background:color-mix(in srgb, var(--muted-2) 26%, transparent)}.gif-player{vertical-align:top;max-width:100%;display:inline-block;position:relative}.gif-player img{display:block}.gif-badge,.gif-replay{z-index:1;color:#fff;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);border:0;position:absolute}.gif-badge{letter-spacing:.04em;pointer-events:none;background:#0000008a;border-radius:999px;padding:4px 7px;font-size:10px;font-weight:800;bottom:9px;left:9px}.gif-replay{opacity:0;pointer-events:none;background:#0a0c12b8;border-radius:999px;place-items:center;width:30px;height:30px;font-size:16px;line-height:1;transition:opacity .13s,transform .13s,background .12s;display:grid;bottom:9px;right:9px;transform:scale(.88)}.gif-replay:hover{background:var(--accent)}.gif-player.paused .gif-replay{opacity:1;pointer-events:auto;transform:scale(1)}.gif-player.playing .gif-badge{animation:.9s ease-in-out infinite gif-breathe}@keyframes gif-breathe{0%,to{opacity:.85}50%{opacity:.45}}.attachment-grid{grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:8px;max-width:560px;margin-top:8px;display:grid}.attachment-grid.compact{grid-template-columns:minmax(0,1fr);max-width:420px}.media-tile{border:1px solid var(--line);border-radius:var(--radius-lg);isolation:isolate;text-align:left;width:100%;color:inherit;cursor:pointer;background:#0a0c12;margin:0;padding:0;text-decoration:none;transition:border-color .14s,transform .14s,box-shadow .14s;display:block;position:relative;overflow:hidden}.media-tile:hover{border-color:var(--line-strong);box-shadow:0 18px 40px -28px #000000e6}.media-tile:focus-visible{border-color:var(--line-strong);box-shadow:0 0 0 2px color-mix(in srgb, var(--accent) 35%, transparent);outline:none}.media-tile--image{cursor:zoom-in}.media-tile__open{width:100%;color:inherit;cursor:zoom-in;background:0 0;border:0;margin:0;padding:0;display:block}.media-tile__open:focus{outline:0}.media-tile__open:focus-visible+.media-tile__caption .media-tile__name{text-underline-offset:3px;text-decoration:underline;text-decoration-thickness:1px}.media-tile--video{cursor:default}.media-tile img,.media-tile video{object-fit:contain;background:#05070d;width:100%;max-height:360px;display:block}.media-tile--image img{max-height:320px}.media-tile__caption{z-index:3;opacity:0;pointer-events:none;background:linear-gradient(#0000 0%,#00000080 60%,#000000c7 100%);align-items:center;gap:8px;padding:22px 10px 8px;transition:opacity .14s;display:flex;position:absolute;inset:auto 0 0}.media-tile__caption>*{pointer-events:auto}.media-tile:hover .media-tile__caption,.media-tile:focus-within .media-tile__caption{opacity:1}.media-tile--video.is-started .media-tile__caption{display:none}.media-tile__name{color:#fff;white-space:nowrap;text-overflow:ellipsis;text-shadow:0 1px 2px #0009;flex:1;min-width:0;font-size:12px;font-weight:500;overflow:hidden}.media-tile__chip{z-index:4;color:#fff;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);background:#00000080;border:1px solid #ffffff2e;border-radius:8px;flex:none;place-items:center;width:28px;height:28px;text-decoration:none;transition:background .12s,border-color .12s,transform .12s;display:inline-grid;position:relative}.media-tile__chip:hover{background:#000000b3;border-color:#ffffff52;transform:translateY(-1px)}.media-tile__play{cursor:pointer;z-index:1;background:0 0;border:0;place-items:center;width:100%;height:auto;margin:0;padding:0;display:grid;position:absolute;inset:0 0 48px}.media-tile__play:before{content:"";opacity:.7;pointer-events:none;background:radial-gradient(#0000002e 0%,#0000000d 45%,#0000 70%);transition:opacity .16s;position:absolute;inset:0}.media-tile__play:hover:before{opacity:.9}.media-tile__play-icon{color:#fff;-webkit-backdrop-filter:blur(10px);background:#0000008c;border-radius:999px;place-items:center;width:46px;height:46px;padding-left:3px;transition:transform .2s cubic-bezier(.2,.8,.2,1),background .18s,box-shadow .2s;display:grid;position:relative;box-shadow:0 6px 20px -8px #0000008c}.media-tile__play-icon svg{filter:drop-shadow(0 1px 2px #0006)}.media-tile__play:hover .media-tile__play-icon{background:#000000b3;transform:scale(1.06);box-shadow:0 10px 28px -10px #000000a6}.media-tile__play:active .media-tile__play-icon{transition-duration:80ms;transform:scale(.97)}.media-tile__play:focus-visible{outline:none}.media-tile__play:focus-visible .media-tile__play-icon{box-shadow:0 0 0 2px #fff9,0 10px 28px -10px #000000a6}.media-tile__duration{z-index:2;color:#fff;font-variant-numeric:tabular-nums;letter-spacing:.02em;pointer-events:none;background:#000000b8;border-radius:4px;padding:2px 6px;font-size:11px;font-weight:600;position:absolute;bottom:8px;left:8px}.file-attachment{border:1px solid var(--line);border-radius:var(--radius);background:var(--panel);align-items:center;gap:10px;max-width:360px;padding:10px;display:flex}.file-attachment:hover{border-color:var(--line-strong);background:var(--panel-2)}.file-icon{background:var(--accent-soft);width:34px;height:34px;color:var(--accent);border-radius:8px;place-items:center;font-weight:800;display:grid}.file-attachment strong,.file-attachment small{display:block}.file-attachment strong{color:var(--text-strong);font-size:13px}.file-attachment small{color:var(--muted);font-size:11px}.audio-attachment,.document-attachment{border:1px solid var(--line);border-radius:var(--radius);background:var(--panel);width:min(100%,420px);overflow:hidden}.audio-attachment{gap:10px;padding:10px;display:grid}.audio-attachment__meta{align-items:center;gap:10px;min-width:0;display:flex}.audio-attachment audio{width:100%;height:36px}.document-attachment{grid-template-columns:64px minmax(0,1fr) auto;align-items:center;gap:12px;padding:10px;display:grid}.document-attachment__thumbnail{border:1px solid var(--line);background:linear-gradient(135deg, transparent 0 76%, var(--panel-3) 76% 100%), linear-gradient(180deg, #fff 0%, #f0f2f7 100%);width:64px;height:82px;color:var(--accent);letter-spacing:0;cursor:pointer;border-radius:6px;place-items:center;font-size:13px;font-weight:800;text-decoration:none;display:inline-grid;position:relative;overflow:hidden;box-shadow:0 8px 18px -16px #0009}.document-attachment__thumbnail:before,.document-attachment__thumbnail:after{content:"";background:color-mix(in srgb, var(--muted) 36%, transparent);border-radius:999px;height:2px;position:absolute;left:14px;right:14px}.document-attachment__thumbnail:before{top:48px}.document-attachment__thumbnail:after{top:56px}.document-attachment__meta{gap:5px;min-width:0;display:grid}.document-attachment__title{width:100%;min-width:0;color:var(--text-strong);white-space:nowrap;text-overflow:ellipsis;text-align:left;cursor:pointer;background:0 0;border:0;padding:0;font-size:13px;font-weight:700;text-decoration:none;overflow:hidden}.document-attachment__title:hover{text-underline-offset:3px;text-decoration:underline}.document-attachment__meta small{color:var(--muted);white-space:nowrap;font-size:11px}.document-attachment__download{width:30px;height:30px;color:var(--muted);border-radius:8px;place-items:center;text-decoration:none;transition:background .12s,color .12s;display:inline-grid}.document-attachment__download:hover{background:var(--panel-2);color:var(--text-strong)}@media (width<=520px){.message-group{grid-template-columns:44px minmax(0,1fr);padding:7px 12px}:root[data-user-align=right] .message-group.is-self,:root[data-other-align=right] .message-group:not(.is-self){grid-template-columns:minmax(0,1fr) 44px}.message-row{margin-left:-44px;margin-right:-12px;padding-left:44px;padding-right:12px}:root[data-user-align=right] .message-group.is-self .message-row,:root[data-other-align=right] .message-group:not(.is-self) .message-row{margin-left:-12px;margin-right:-44px;padding-left:12px;padding-right:44px}.message-group .group-body>header{margin-left:-44px;margin-right:-12px;padding-left:44px;padding-right:12px}:root[data-user-align=right] .message-group.is-self .group-body>header,:root[data-other-align=right] .message-group:not(.is-self) .group-body>header{margin-left:-12px;margin-right:-44px;padding-left:12px;padding-right:44px}.row-stamp{display:none}.attachment-grid,.attachment-grid.compact{grid-template-columns:minmax(0,1fr);max-width:100%}}:root[data-message-layout=outlined] .message-group .group-body{width:100%}:root[data-message-layout=outlined] .message-group .message-row{margin-left:0;margin-right:0;padding:0}:root[data-message-layout=outlined] .message-group .group-body>header{margin-left:0;margin-right:0;padding-left:0;padding-right:0}:root[data-message-layout=outlined][data-user-align=right] .message-group.is-self .message-content,:root[data-message-layout=outlined][data-other-align=right] .message-group:not(.is-self) .message-content,:root[data-message-layout=outlined][data-user-align=right] .message-group.is-self .markdown,:root[data-message-layout=outlined][data-other-align=right] .message-group:not(.is-self) .markdown{text-align:start}:root[data-message-layout=outlined][data-user-align=right] .message-group.is-self .thread-hint,:root[data-message-layout=outlined][data-other-align=right] .message-group:not(.is-self) .thread-hint{width:fit-content;margin-left:auto;display:flex}:root[data-message-layout=outlined] .message-group .row-stamp{left:-48px}:root[data-message-layout=outlined][data-user-align=right] .message-group.is-self .row-stamp,:root[data-message-layout=outlined][data-other-align=right] .message-group:not(.is-self) .row-stamp{left:auto;right:-48px}:root[data-message-layout=outlined] .message-group .message-row:not(:first-child){margin-top:4px}:root[data-message-layout=outlined] .message-group .message-content{border-radius:var(--radius-lg);width:fit-content;max-width:min(96%,1100px);margin-top:2px;padding:10px 14px;position:relative}:root[data-message-layout=outlined] .message-group .message-row:not(.is-preamble):not(.after-preamble) .message-content{border:1px solid var(--line-strong)}:root[data-message-layout=outlined] .message-group.is-agent .message-content{width:96%;max-width:1100px}:root[data-message-layout=outlined] .message-group .message-row.before-final-message+.message-row.after-preamble{margin-top:-1px}:root[data-message-layout=outlined] .message-group.is-agent .message-row.before-final-message .message-content{border-bottom-right-radius:0;border-bottom-left-radius:0}:root[data-message-layout=outlined] .message-group.is-agent .message-row.after-preamble .message-content{border-top-left-radius:0;border-top-right-radius:0}:root[data-density=compact] .message-group{grid-template-columns:42px minmax(0,1fr);padding:2px 18px}:root[data-density=compact][data-user-align=right] .message-group.is-self,:root[data-density=compact][data-other-align=right] .message-group:not(.is-self){grid-template-columns:minmax(0,1fr) 42px}:root[data-density=compact] .message-group>.avatar{border-radius:7px;width:26px;height:26px;font-size:11px}:root[data-density=compact] .group-body>header{gap:6px;margin-bottom:0}:root[data-density=compact] .message-group .group-body>header{margin-left:-42px;padding-left:42px}:root[data-density=compact][data-user-align=right] .message-group.is-self .group-body>header,:root[data-density=compact][data-other-align=right] .message-group:not(.is-self) .group-body>header{margin-left:-18px;margin-right:-42px;padding-left:18px;padding-right:42px}:root[data-density=compact] .group-body>header strong,:root[data-density=compact] .author-name{font-size:13px}:root[data-density=compact] .group-body>header time{font-size:10px}:root[data-density=compact] .message-row{margin-left:-42px;padding-left:42px}:root[data-density=compact][data-user-align=right] .message-group.is-self .message-row,:root[data-density=compact][data-other-align=right] .message-group:not(.is-self) .message-row{margin-left:-18px;margin-right:-42px;padding-left:18px;padding-right:42px}:root[data-density=compact] .markdown{font-size:13.5px;line-height:1.42}:root[data-density=compact] .reactions-bar{margin-top:2px}:root[data-density=compact][data-message-layout=outlined] .message-group .message-row{margin-left:0;padding-left:0}:root[data-density=compact][data-message-layout=outlined] .message-group .row-stamp{left:-34px}:root[data-density=compact][data-message-layout=outlined][data-user-align=right] .message-group.is-self .row-stamp,:root[data-density=compact][data-message-layout=outlined][data-other-align=right] .message-group:not(.is-self) .row-stamp{left:auto;right:-34px}@media (width<=520px){:root[data-density=compact] .message-group{padding-left:12px;padding-right:12px}}:root[data-message-layout=outlined][data-user-align=right] .message-group.is-self .message-row,:root[data-message-layout=outlined][data-other-align=right] .message-group:not(.is-self) .message-row,:root[data-message-layout=outlined][data-user-align=right] .message-group.is-self .group-body>header,:root[data-message-layout=outlined][data-other-align=right] .message-group:not(.is-self) .group-body>header{margin-left:0;margin-right:0;padding-left:0;padding-right:0}.composer{--composer-card-top:8px;--composer-overlay-gap:8px;--composer-overlay-inset-x:18px;background:var(--bg);gap:0;padding:8px 18px 6px;display:grid;position:relative}.composer-card{background:var(--panel);border:1px solid var(--line-strong);border-radius:var(--radius-lg);box-shadow:var(--key-edge);flex-direction:column;transition:border-color .12s,box-shadow .12s;display:flex;overflow:hidden}.composer:focus-within .composer-card{border-color:color-mix(in srgb, var(--accent) 55%, var(--line-strong));box-shadow:var(--key-edge), 0 0 0 3px color-mix(in srgb, var(--accent) 14%, transparent)}.composer-suggestions{left:var(--composer-overlay-inset-x);bottom:calc(100% - var(--composer-card-top) + var(--composer-overlay-gap));z-index:40;width:min(560px, calc(100% - (var(--composer-overlay-inset-x) * 2)));border:1px solid var(--line-strong);background:color-mix(in srgb, var(--panel) 97%, transparent);max-height:min(320px,45vh);box-shadow:var(--shadow);border-radius:12px;margin:0;position:absolute;overflow:hidden auto}.composer-suggestions button{border:0;border-bottom:1px solid var(--line);width:100%;min-height:48px;color:var(--text);text-align:left;background:0 0;border-radius:0;grid-template-columns:30px minmax(0,1fr) auto;align-items:center;gap:10px;padding:8px 10px;display:grid}.composer-suggestions button:last-child{border-bottom:0}.composer-suggestions button:hover,.composer-suggestions button.active{background:var(--hover-strong)}.suggestion-mark{background:var(--accent-soft);width:30px;height:30px;color:var(--accent);border-radius:8px;place-items:center;font-size:13px;font-weight:800;display:grid}.suggestion-copy{gap:2px;min-width:0;display:grid}.suggestion-copy strong,.suggestion-copy span{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.suggestion-copy strong{color:var(--text-strong);font-size:13px}.suggestion-copy span{color:var(--muted);font-size:12px}.suggestion-kind{color:var(--muted-2);text-transform:uppercase;font-size:11px;font-weight:700}.suggestion-hint{color:var(--muted);font-size:12px;font-style:normal;font-weight:500}.composer-notice{margin:0 var(--composer-overlay-inset-x,0) 6px;border:1px solid var(--line-strong);background:color-mix(in srgb, var(--panel) 97%, transparent);border-radius:10px;align-items:baseline;gap:8px;padding:7px 10px;font-size:13px;display:flex}.composer-notice__label{color:var(--muted-2);text-transform:uppercase;flex:none;font-size:11px;font-weight:700}.composer-notice--error .composer-notice__label{color:var(--danger)}.composer-notice__text{min-width:0;color:var(--text);overflow-wrap:anywhere;flex:1}.composer-notice__dismiss{width:22px;height:22px;color:var(--muted);cursor:pointer;background:0 0;border:0;border-radius:6px;flex:none;align-self:center;place-items:center;font-size:15px;line-height:1;display:grid}.composer-notice__dismiss:hover{background:var(--hover-strong);color:var(--text-strong)}.composer-toolbar{border:0;border-top:1px solid var(--line);background:color-mix(in srgb, var(--panel-2) 35%, transparent);width:100%;min-width:0;box-shadow:none;scrollbar-width:none;-webkit-overflow-scrolling:touch;border-radius:0;align-items:center;gap:2px;margin:0;padding:4px 6px;display:inline-flex;overflow:auto hidden}.composer-toolbar::-webkit-scrollbar{display:none}.composer-toolbar button{min-width:28px;height:26px;color:var(--text);opacity:.78;background:0 0;border:0;border-radius:6px;flex:none;place-items:center;font-size:11.5px;font-weight:700;transition:background .1s,color .1s,opacity .1s,transform 80ms;display:grid}.composer-toolbar button:hover{background:var(--hover-strong);color:var(--text-strong);opacity:1}.composer-toolbar button.active{background:var(--accent-soft);color:var(--accent);opacity:1}.composer-toolbar button:active{transform:translateY(1px)}.gif-picker{border:1px solid var(--line-strong);background:color-mix(in srgb, var(--panel) 96%, transparent);width:min(520px,100%);max-height:40dvh;box-shadow:var(--shadow);border-radius:16px;margin-top:8px;margin-bottom:8px;padding:10px;animation:.16s cubic-bezier(.2,.8,.2,1) picker-in;overflow-y:auto}.gif-picker-head{grid-template-columns:auto minmax(0,1fr);align-items:center;gap:10px;padding:2px 2px 10px;display:grid}.gif-picker-head strong{color:var(--text-strong);font-size:13px}.gif-picker-head input{border:1px solid var(--line);border-radius:var(--radius);background:var(--panel-2);min-width:0;height:32px;padding:0 10px}.gif-grid{grid-template-columns:repeat(3,minmax(0,1fr));gap:8px;max-height:240px;display:grid;overflow-y:auto}.gif-grid button{aspect-ratio:4/3;background:var(--panel-2);color:#fff;box-shadow:inset 0 0 0 1px var(--line);border:0;border-radius:12px;padding:0;transition:transform .12s,box-shadow .12s;position:relative;overflow:hidden}.gif-grid button:hover{box-shadow:inset 0 0 0 2px var(--accent), 0 14px 30px -22px #000c;transform:translateY(-2px)}.gif-grid img{object-fit:cover;width:100%;height:100%;display:block}.gif-grid span{text-overflow:ellipsis;white-space:nowrap;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);background:#0000008f;border-radius:999px;padding:4px 7px;font-size:10.5px;font-weight:700;position:absolute;bottom:6px;left:6px;right:6px;overflow:hidden}@keyframes picker-in{0%{opacity:0;transform:translateY(8px)scale(.98)}to{opacity:1;transform:translateY(0)scale(1)}}.composer-row{--composer-control-size:36px;--composer-line-height:22px;--composer-text-padding-block:7px;background:0 0;border:0;border-radius:0;grid-template-columns:minmax(0,1fr) auto;align-items:start;gap:4px;padding:8px 8px 4px 10px;display:grid}.composer-row:has(.composer-icon){grid-template-columns:auto minmax(0,1fr) auto}.composer:focus-within .composer-toolbar,.composer-row:focus-within{border-color:#0000}.composer-row:focus-within{box-shadow:none}.composer-icon{width:var(--composer-control-size);height:var(--composer-control-size);margin-top:calc(var(--composer-text-padding-block) + (var(--composer-line-height) - var(--composer-control-size)) / 2);color:var(--muted);cursor:pointer;border-radius:10px;align-self:start;place-items:center;transition:background .12s,color .12s;display:grid}.composer-icon:hover{background:var(--hover-strong);color:var(--text-strong)}.composer-icon input[type=file]{opacity:0;pointer-events:none;block-size:1px;inline-size:1px;position:absolute}.composer textarea,.reply-composer textarea{width:100%;height:auto;min-height:44px;max-height:50vh;padding:var(--composer-text-padding-block) 4px;resize:none;color:var(--text);line-height:var(--composer-line-height);box-sizing:border-box;align-self:start;font-size:14.5px;overflow-y:auto}.composer textarea::placeholder,.reply-composer textarea::placeholder{color:var(--muted)}.send{width:var(--composer-control-size);height:var(--composer-control-size);margin-top:calc(var(--composer-text-padding-block) + (var(--composer-line-height) - var(--composer-control-size)) / 2);border:1px solid color-mix(in srgb, var(--accent) 70%, var(--text-strong));border-radius:var(--radius);background:var(--accent);color:var(--accent-contrast);box-shadow:var(--key-edge);align-self:start;place-items:center;transition:background .12s,transform 80ms,box-shadow 80ms,opacity .12s;display:grid}.send:hover:not(:disabled){background:var(--accent-hover);transform:translateY(-1px)}.send:active:not(:disabled){box-shadow:var(--key-edge-pressed);transform:translateY(1px)}.send:disabled{background:var(--panel-3);border-color:var(--line-strong);color:var(--muted-2);cursor:not-allowed;box-shadow:none}.composer-attachment{background:var(--panel);border:1px solid var(--line);border-radius:var(--radius);color:var(--text);align-items:center;gap:8px;width:fit-content;margin-top:8px;margin-bottom:8px;padding:6px 10px;font-size:13px;display:inline-flex}.attachment-icon{background:var(--accent-soft);width:20px;height:20px;color:var(--accent);border-radius:6px;place-items:center;display:grid}.pending-image{object-fit:cover;border:1px solid var(--line);background:var(--panel-2);border-radius:7px;width:42px;height:32px}.attachment-name{text-overflow:ellipsis;white-space:nowrap;max-width:240px;overflow:hidden}.attachment-remove{width:18px;height:18px;color:var(--muted);background:0 0;border:0;border-radius:50%;font-size:14px;line-height:1}.attachment-remove:hover{background:var(--danger);color:#fff}.composer-hint{color:var(--muted-2);padding:7px 4px 0;font-size:11px}.composer-hint kbd{background:var(--panel-2);border:1px solid var(--line-strong);font-family:var(--font-mono);color:var(--text);box-shadow:0 1px 0 var(--line-strong);border-radius:4px;padding:0 5px;font-size:10.5px;display:inline-block}@media (width<=820px){.composer{padding:8px calc(14px + var(--safe-area-right)) calc(6px + var(--safe-area-bottom)) calc(14px + var(--safe-area-left))}.composer textarea,.reply-composer textarea{font-size:16px}.composer-suggestions{max-height:min(320px,42dvh)}}.thread{background:var(--panel);border-left:1px solid var(--line);opacity:0;pointer-events:none;grid-template-rows:auto minmax(0,1fr) auto;grid-template-columns:minmax(0,1fr);min-width:0;transition:opacity .18s,transform .22s cubic-bezier(.2,.8,.2,1);display:grid;overflow:hidden;transform:translate(28px)}.thread.open{opacity:1;pointer-events:auto;transform:translate(0)}.thread.covered{opacity:0;pointer-events:none}.thread>header{border-bottom:1px solid var(--line);background:linear-gradient(180deg, #ffffff05, transparent), var(--panel);align-items:center;gap:10px;min-height:60px;padding:12px 16px;display:flex}.thread>header>div{flex:1;min-width:0}.thread>header p,.thread>header strong{margin:0}.thread>header p{color:var(--muted);font-family:var(--font-mono);text-transform:uppercase;letter-spacing:.08em;text-overflow:ellipsis;white-space:nowrap;font-size:10px;font-weight:600;overflow:hidden}.thread>header strong{color:var(--text-strong);font-size:14px;display:block}.thread .thread-pin-error{color:var(--danger);margin-top:3px;font-size:11px;line-height:1.35;display:block}.thread .close{background:var(--panel-2);width:28px;height:28px;color:var(--muted);border:0;border-radius:50%;font-size:18px;line-height:1}.thread .close:hover{background:var(--panel-3);color:var(--text-strong)}.thread .thread-open-link{color:var(--accent);font-family:var(--font-mono);white-space:nowrap;flex:none;font-size:11px;font-weight:700;text-decoration:none}.thread .thread-open-link:hover{color:var(--accent-hover);text-decoration:underline}.thread .thread-open-link:focus-visible{outline:2px solid var(--accent);outline-offset:3px;border-radius:3px}.thread .thread-back{background:var(--panel-2);width:28px;height:28px;color:var(--muted);border:0;border-radius:50%;flex:none;place-items:center;display:grid}.thread .thread-back:hover{background:var(--panel-3);color:var(--text-strong)}.thread .thread-back:focus-visible,.thread .close:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}.thread-scroll{padding:12px 16px;overflow-y:auto}.thread-root{border-bottom:1px solid var(--line);grid-template-columns:38px minmax(0,1fr);gap:12px;padding-bottom:12px;display:grid}.thread-divider{align-items:center;gap:10px;margin:14px 0 10px;display:flex}.thread-divider:before,.thread-divider:after{content:"";background:var(--line);flex:1;height:1px}.thread-divider span{font-family:var(--font-mono);color:var(--muted);text-transform:uppercase;letter-spacing:.08em;font-size:10px;font-weight:600}.reply-list{flex-direction:column;gap:10px;display:flex}.reply{border-radius:var(--radius-sm);grid-template-columns:30px minmax(0,1fr);gap:10px;padding:6px;display:grid}.reply:hover{background:var(--hover)}.thread .reply-quote-btn,.thread .thread-action-btn{width:26px;height:26px;color:var(--muted);background:0 0;border:0;border-radius:6px;place-items:center;display:inline-grid}.thread .reply-quote-btn:hover,.thread .thread-action-btn:hover{background:var(--hover-strong);color:var(--text-strong)}.thread .reply-quote-btn:disabled,.thread .thread-action-btn:disabled{cursor:default;opacity:.45}.thread .thread-action-btn--danger{color:var(--danger)}.thread .thread-action-btn--danger:hover{background:color-mix(in srgb, var(--danger) 12%, transparent);color:var(--danger)}.thread .thread-more-actions{display:none}@media (hover:none),(pointer:coarse){:root:not([data-pointer-mode=mouse]) .thread .group-body>header{min-height:28px;padding-right:32px;position:relative}:root:not([data-pointer-mode=mouse]) .thread .reply-quote-btn,:root:not([data-pointer-mode=mouse]) .thread .thread-action-btn:not(.thread-more-actions){display:none}:root:not([data-pointer-mode=mouse]) .thread .thread-more-actions{clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap;width:1px;height:1px;margin:-1px;padding:0;display:inline-grid;position:absolute;top:0;right:0;overflow:hidden}:root:not([data-pointer-mode=mouse]) .thread .thread-more-actions:focus-visible{clip:auto;clip-path:none;border:1px solid var(--line-strong);background:var(--panel);width:28px;height:28px;box-shadow:var(--shadow);margin:0;overflow:visible}}.reply-composer{--composer-card-top:10px;--composer-overlay-inset-x:14px;background:var(--panel);border-top:1px solid var(--line);padding:10px 14px 14px}.reply-composer .composer-row{border-radius:0}.thread-empty{text-align:center;grid-row:span 3;align-content:center;place-items:center;gap:8px;padding:32px 24px;display:grid}.thread-icon{background:var(--panel-2);width:56px;height:56px;color:var(--muted);border-radius:16px;place-items:center;display:grid}.thread-empty strong{color:var(--text-strong);font-size:15px}.thread-empty span{color:var(--muted);max-width:260px;font-size:13px;line-height:1.5}.profile-pane{overflow-y:auto}.profile-hero{background:linear-gradient(180deg, transparent, #0000003d), linear-gradient(135deg, hsl(var(--hue,220deg) 76% 58%), hsl(calc(var(--hue,220deg) + 54deg) 74% 38%));border-bottom:1px solid var(--line);place-items:end center;min-height:210px;padding:28px 20px;display:grid}.profile-avatar{aspect-ratio:1;color:#fff;background:#ffffff2e;border-radius:16px;place-items:center;width:min(240px,70%);font-size:clamp(48px,12vw,88px);font-weight:800;display:grid;overflow:hidden;box-shadow:0 26px 60px -30px #000000e6}.profile-avatar img{object-fit:cover;width:100%;height:100%}.profile-pane-body{gap:18px;padding:18px 16px 22px;display:grid}.profile-pane-title{justify-content:space-between;align-items:flex-start;gap:12px;display:flex}.profile-pane-title h2{color:var(--text-strong);letter-spacing:0;margin:0;font-size:22px}.profile-pane-title span{color:var(--muted);margin-top:3px;font-size:13px;display:block}.profile-pane-title .bot-badge{border:1px solid color-mix(in srgb, var(--accent) 45%, transparent);min-height:20px;color:var(--accent);border-radius:999px;align-items:center;margin-top:6px;padding:0 8px;font-size:11px;font-weight:800;line-height:1;display:inline-flex}.text-action{color:var(--accent);background:0 0;border:0;border-radius:6px;padding:4px 6px;font-size:13px;font-weight:700}.text-action:hover{background:var(--accent-soft)}.profile-presence{color:var(--text);align-items:center;gap:8px;font-size:14px;display:inline-flex}.profile-actions-row{grid-template-columns:repeat(auto-fit,minmax(132px,1fr));gap:10px;display:grid}.profile-actions-row .primary-action,.profile-actions-row .ghost-action{border-radius:var(--radius);white-space:nowrap;justify-content:center;align-items:center;width:100%;min-width:0;height:48px;padding:0 16px;font-size:14px;font-weight:800;line-height:1;display:inline-flex}.moderation-actions{grid-template-columns:repeat(auto-fit,minmax(108px,1fr));gap:8px;display:grid}.moderation-actions .primary-action,.moderation-actions .ghost-action,.moderation-actions .danger-action{border-radius:var(--radius);min-height:40px;font-size:13px;font-weight:800}.danger-action{border:1px solid color-mix(in srgb, var(--danger), transparent 35%);background:color-mix(in srgb, var(--danger), transparent 86%);color:var(--danger)}.role-pill{background:var(--panel-2);color:var(--muted);text-transform:uppercase;border-radius:999px;padding:4px 8px;font-size:11px;font-weight:800}.profile-info{border-top:1px solid var(--line);gap:12px;padding-top:18px;display:grid}.profile-info header{justify-content:space-between;align-items:center;gap:10px;display:flex}.profile-info header strong{color:var(--text-strong);font-size:14px}.profile-info-row{grid-template-columns:48px minmax(0,1fr);align-items:center;gap:14px;min-height:48px;display:grid}.info-icon{background:var(--panel-2);width:48px;height:48px;color:var(--muted);border-radius:12px;justify-content:center;align-items:center;line-height:1;display:inline-flex}.info-icon svg{flex:none;display:block}.profile-info-row>div>small,.profile-info-row>div>span{display:block}.profile-info-row>div>small{color:var(--muted);font-size:12px;line-height:1.2}.profile-info-row>div>span{color:var(--text);overflow-wrap:anywhere;font-size:14px;line-height:1.3}.profile-note{color:var(--muted);margin:0;font-size:13px;line-height:1.5}@media (width<=820px){.thread{min-height:100dvh}.thread>header{min-height:calc(60px + var(--safe-area-top));padding-top:calc(12px + var(--safe-area-top));padding-right:calc(16px + var(--safe-area-right));padding-left:calc(16px + var(--safe-area-left))}.thread-scroll{padding-right:calc(16px + var(--safe-area-right));padding-left:calc(16px + var(--safe-area-left))}.reply-composer{padding-right:calc(14px + var(--safe-area-right));padding-bottom:calc(14px + var(--safe-area-bottom));padding-left:calc(14px + var(--safe-area-left))}}.thread-scroll{overflow-anchor:none}.thread-history{text-align:center;padding:8px 16px}.thread-history p{color:var(--danger);font-size:12px}.thread-history--latest{border-top:1px solid var(--line)}.thread-target{outline:2px solid var(--accent);outline-offset:-2px;border-radius:var(--radius)}.artifact-viewer{z-index:2;border-left:1px solid var(--line);background:var(--panel);opacity:0;pointer-events:none;grid-template-rows:auto minmax(0,1fr);min-width:0;transition:opacity .18s,transform .22s cubic-bezier(.2,.8,.2,1);display:grid;overflow:hidden;transform:translate(28px)}.artifact-viewer.open{opacity:1;pointer-events:auto;transform:translate(0)}.artifact-viewer__header{border-bottom:1px solid var(--line);background:color-mix(in srgb, var(--panel) 92%, var(--bg));justify-content:space-between;align-items:center;gap:16px;min-height:64px;padding:10px 12px 10px 16px;display:flex}.artifact-viewer__identity{grid-template-columns:auto minmax(0,1fr) auto;align-items:baseline;gap:5px 10px;min-width:0;display:grid}.artifact-viewer__identity span{color:var(--muted);letter-spacing:.04em;text-transform:uppercase;grid-column:1/-1;font-size:11px;font-weight:700}.artifact-viewer__identity strong{min-width:0;color:var(--text-strong);text-overflow:ellipsis;white-space:nowrap;font-size:14px;overflow:hidden}.artifact-viewer__identity small{color:var(--muted);font-variant-numeric:tabular-nums;white-space:nowrap;font-size:11px}.artifact-viewer__actions,.artifact-viewer__segmented{align-items:center;gap:4px;display:inline-flex}.artifact-viewer__actions>a,.artifact-viewer__actions>button,.artifact-viewer__segmented button,.artifact-viewer__pdf-toolbar button{border-radius:var(--radius-sm);min-width:32px;height:32px;color:var(--muted);background:0 0;border:1px solid #0000;place-items:center;padding:0 9px;text-decoration:none;display:inline-grid}.artifact-viewer__office-toolbar button,.artifact-viewer__sheet-tabs button{border-radius:var(--radius-sm);min-height:30px;color:var(--muted);background:0 0;border:1px solid #0000;padding:0 10px;font-size:11px}.artifact-viewer__actions>button{font-size:20px;line-height:1}.artifact-viewer__actions>a:hover,.artifact-viewer__actions>button:hover,.artifact-viewer__segmented button:hover,.artifact-viewer__pdf-toolbar button:hover:not(:disabled){border-color:var(--line);background:var(--hover-strong);color:var(--text-strong)}.artifact-viewer__actions :focus-visible,.artifact-viewer__pdf-toolbar button:focus-visible{outline:2px solid var(--accent);outline-offset:2px}.artifact-viewer__segmented{border:1px solid var(--line);border-radius:var(--radius);background:var(--panel-2);padding:2px}.artifact-viewer__segmented button{min-width:58px;height:28px;font-size:11px;font-weight:650}.artifact-viewer__segmented button.active{border-color:var(--line);background:var(--panel);color:var(--text-strong)}.artifact-viewer__body{background:var(--bg);min-height:0;overflow:auto}.artifact-viewer__state{min-height:100%;color:var(--muted);text-align:center;align-content:center;justify-items:center;gap:10px;padding:32px 24px;display:grid}.artifact-viewer__state strong{color:var(--text-strong);font-size:15px}.artifact-viewer__state p{max-width:34ch;margin:0;font-size:13px;line-height:1.5}.artifact-viewer__state a{border:1px solid var(--line-strong);border-radius:var(--radius-sm);background:var(--panel);min-height:36px;color:var(--text-strong);margin-top:4px;padding:8px 12px;font-size:13px;font-weight:650;text-decoration:none}.artifact-viewer__state--error svg{color:var(--danger)}.artifact-viewer__spinner{border:2px solid var(--line-strong);border-top-color:var(--accent);border-radius:50%;width:26px;height:26px;animation:.7s linear infinite artifact-spin}@keyframes artifact-spin{to{transform:rotate(360deg)}}.artifact-viewer__source{background:color-mix(in srgb, var(--bg) 90%, #090b10);width:max-content;min-width:100%;min-height:100%;color:var(--text);font-family:var(--font-mono);tab-size:2;white-space:pre;margin:0;padding:20px;font-size:12px;line-height:1.65}.artifact-viewer__source code{font:inherit}.artifact-viewer__document{border:1px solid var(--line);border-radius:var(--radius);background:var(--panel);width:min(100%,760px);min-height:calc(100% - 32px);color:var(--text);overflow-wrap:anywhere;margin:16px auto;padding:clamp(24px,5vw,56px);font-size:15px;line-height:1.65}.artifact-viewer__document>:first-child{margin-top:0}.artifact-viewer__document>:last-child{margin-bottom:0}.artifact-viewer__document h1,.artifact-viewer__document h2,.artifact-viewer__document h3{color:var(--text-strong);line-height:1.25}.artifact-viewer__document h1{font-size:28px}.artifact-viewer__document h2{margin-top:1.75em;font-size:21px}.artifact-viewer__document h3{margin-top:1.5em;font-size:17px}.artifact-viewer__document pre{border-radius:var(--radius);background:var(--panel-2);padding:14px;overflow:auto}.artifact-viewer__document code{font-family:var(--font-mono)}.artifact-viewer__document table{border-collapse:collapse;width:100%}.artifact-viewer__document th,.artifact-viewer__document td{border:1px solid var(--line-strong);text-align:left;padding:8px 10px}.artifact-viewer__document img{max-width:100%;height:auto}.artifact-viewer__document a{color:var(--accent)}.artifact-viewer__body.is-pdf{grid-template-rows:auto minmax(0,1fr);display:grid;overflow:hidden}.artifact-viewer__body.is-office{grid-template-rows:auto minmax(0,1fr) auto;display:grid;overflow:hidden}.artifact-viewer__office-toolbar,.artifact-viewer__sheet-tabs{border-bottom:1px solid var(--line);background:var(--panel);min-height:44px;color:var(--muted);font-variant-numeric:tabular-nums;justify-content:center;align-items:center;gap:4px;padding:6px 10px;font-size:11px;display:flex}.artifact-viewer__office-toolbar button:disabled{cursor:not-allowed;opacity:.4}.artifact-viewer__office-toolbar button:hover:not(:disabled),.artifact-viewer__sheet-tabs button:hover,.artifact-viewer__sheet-tabs button.active{border-color:var(--line);background:var(--hover-strong);color:var(--text-strong)}.artifact-viewer__office-toolbar button:focus-visible,.artifact-viewer__sheet-tabs button:focus-visible{outline:2px solid var(--accent);outline-offset:2px}.artifact-viewer__office-toolbar{flex-wrap:wrap}.artifact-viewer__spreadsheet{background:var(--panel);min-height:0;overflow:auto}.artifact-viewer__spreadsheet table{table-layout:fixed;border-spacing:0;border-collapse:separate;width:max-content;color:var(--text);font-size:12px}.artifact-viewer__spreadsheet th,.artifact-viewer__spreadsheet td{box-sizing:border-box;border-right:1px solid var(--line);border-bottom:1px solid var(--line);background:var(--panel);text-align:left;text-overflow:ellipsis;white-space:nowrap;width:160px;min-width:160px;max-width:160px;height:30px;padding:5px 8px;overflow:hidden}.artifact-viewer__spreadsheet thead th{z-index:2;background:var(--panel-2);color:var(--muted);text-align:center;position:sticky;top:0}.artifact-viewer__spreadsheet .row-heading{z-index:1;background:var(--panel-2);width:44px;min-width:44px;color:var(--muted);text-align:right;font-variant-numeric:tabular-nums;position:sticky;left:0}.artifact-viewer__spreadsheet thead .row-heading{z-index:3}.artifact-viewer__grid-note{border:1px solid var(--line);border-radius:var(--radius-sm);background:var(--panel-2);width:max-content;max-width:min(480px,100vw - 48px);color:var(--muted);white-space:normal;margin:16px;padding:8px 10px;font-size:12px;line-height:1.45;position:sticky;left:0}.artifact-viewer__sheet-tabs{border-top:1px solid var(--line);border-bottom:0;justify-content:flex-start;overflow-x:auto}.artifact-viewer__sheet-tabs button{flex:none}.artifact-viewer__slide-stage{align-content:center;place-items:center;gap:12px;min-height:0;padding:24px;display:grid;overflow:auto}.artifact-viewer__slide{aspect-ratio:16/9;color:#172033;background:#fff;flex-direction:column;justify-content:safe center;width:min(100%,860px);padding:48px;display:flex;overflow:auto;box-shadow:0 16px 48px -24px #000000a6}.artifact-viewer__slide h2{letter-spacing:0;margin:0 0 .7em;font-size:36px;line-height:1.15}.artifact-viewer__slide p{margin:.35em 0;font-size:20px;line-height:1.4}.artifact-viewer__office-note{color:var(--muted);margin:0;font-size:12px}@media (width<=640px){.artifact-viewer__slide{padding:28px}.artifact-viewer__slide h2{font-size:24px}.artifact-viewer__slide p{font-size:15px}}.artifact-viewer__pdf-toolbar{border-bottom:1px solid var(--line);background:var(--panel);min-height:44px;color:var(--muted);font-variant-numeric:tabular-nums;justify-content:center;align-items:center;gap:4px;padding:6px 10px;font-size:11px;display:flex}.artifact-viewer__pdf-toolbar button{min-width:30px;height:30px;font-size:11px}.artifact-viewer__pdf-toolbar button:disabled{cursor:not-allowed;opacity:.4}.artifact-viewer__toolbar-divider{background:var(--line);width:1px;height:18px;margin:0 4px}.artifact-viewer__pdf-stage{text-align:center;min-height:0;padding:24px;overflow:auto}.artifact-viewer__pdf-stage canvas{background:#fff;max-width:none;transition:opacity .12s;display:inline-block;box-shadow:0 16px 48px -24px #000000a6}.artifact-viewer__pdf-text{clip:rect(0, 0, 0, 0);white-space:nowrap;border:0;width:1px;height:1px;padding:0;position:absolute;overflow:hidden}.artifact-viewer__pdf-stage.is-rendering canvas{opacity:.55}.hljs-comment,.hljs-quote{color:var(--muted);font-style:italic}.hljs-keyword,.hljs-selector-tag,.hljs-literal,.hljs-section,.hljs-link{color:var(--accent)}.hljs-string,.hljs-title,.hljs-name,.hljs-type,.hljs-attribute,.hljs-symbol,.hljs-bullet,.hljs-addition{color:var(--success)}.hljs-number,.hljs-meta,.hljs-built_in,.hljs-builtin-name,.hljs-params{color:var(--activity-accent)}.hljs-deletion{color:var(--danger)}@media (width<=820px){.artifact-viewer{z-index:40;border-left:0;min-height:100dvh;position:fixed;inset:0}.artifact-viewer__header{min-height:calc(64px + var(--safe-area-top));padding-top:calc(10px + var(--safe-area-top));padding-right:calc(12px + var(--safe-area-right));padding-left:calc(16px + var(--safe-area-left))}.artifact-viewer__identity small{display:none}.artifact-viewer__document{border:0;border-radius:0;min-height:100%;margin:0}}@media (prefers-reduced-motion:reduce){.artifact-viewer{transition:none}.artifact-viewer__spinner{animation-duration:1.4s}}.modal-scrim{z-index:50;-webkit-backdrop-filter:blur(14px);backdrop-filter:blur(14px);background:#05080f8a;place-items:center;padding:24px;display:grid;position:fixed;inset:0}.modal-backdrop{background:0 0;border:0;position:absolute;inset:0}.modal-backdrop:focus{outline:0}.profile-modal{z-index:1;background:var(--panel);border:1px solid var(--line-strong);border-radius:var(--radius-xl);width:min(480px,100%);box-shadow:var(--key-edge), var(--shadow);animation:.15s ease-out settings-modal-fade;position:relative;overflow:hidden}.profile-modal>header{justify-content:space-between;align-items:flex-start;gap:12px;padding:18px 20px 4px;display:flex}.profile-modal>header p{color:var(--muted);font-family:var(--font-mono);text-transform:uppercase;letter-spacing:.08em;margin:0 0 4px;font-size:10px;font-weight:600}.profile-modal>header h2{color:var(--text-strong);font-family:var(--font-display);letter-spacing:-.01em;margin:0;font-size:20px;font-weight:700}.profile-modal>header>button{border:1px solid var(--line);border-radius:var(--radius-sm);background:var(--panel-2);width:28px;height:28px;color:var(--muted);flex:none;place-items:center;font-size:16px;line-height:1;display:grid}.profile-modal>header>button:hover{background:var(--panel-3);color:var(--text-strong)}.create-modal{width:min(420px,100%)}.profile-form{gap:14px;padding:20px;display:grid}.field{gap:6px;display:grid}.field span{color:var(--muted);font-size:12px;font-weight:700}.field input,.field select{border:1px solid var(--line);border-radius:var(--radius-sm);background:var(--panel-2);width:100%;height:38px;color:var(--text);padding:0 12px}.field select{cursor:pointer}.field input:focus,.field select:focus{border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-soft);outline:0}.profile-status{color:var(--success);font-size:12px}.profile-status.error{color:var(--danger)}.profile-actions{justify-content:flex-end;gap:8px;padding-top:4px;display:flex}.person-picker{border:1px solid var(--line);border-radius:var(--radius);background:var(--panel-2);gap:4px;max-height:240px;padding:4px;display:grid;overflow-y:auto}.person-choice{border-radius:var(--radius-sm);width:100%;min-height:44px;color:var(--text);text-align:left;background:0 0;border:0;grid-template-columns:32px minmax(0,1fr);align-items:center;gap:10px;padding:6px 8px;display:grid}.person-choice:hover{background:var(--hover-strong)}.person-choice .dm-avatar{width:32px;height:32px}.person-choice strong,.person-choice small{text-overflow:ellipsis;white-space:nowrap;min-width:0;display:block;overflow:hidden}.person-choice strong{color:var(--text-strong);font-size:13px}.person-choice small{color:var(--muted);font-size:12px}.person-empty{color:var(--muted);padding:10px 8px;font-size:12px}.profile-actions .ghost-action,.profile-actions .primary-action,.profile-actions .danger-action{box-sizing:border-box;border-radius:var(--radius);white-space:nowrap;min-height:44px;box-shadow:var(--key-edge);flex:none;justify-content:center;align-items:center;padding:0 14px;font-weight:700;line-height:1;transition:background .12s,box-shadow 80ms,transform 80ms;display:inline-flex}.ghost-action{border:1px solid var(--line-strong);background:var(--panel);color:var(--text)}.primary-action{border:1px solid color-mix(in srgb, var(--accent) 70%, var(--text-strong));background:var(--accent);color:var(--accent-contrast)}.profile-actions .danger-action{border:1px solid color-mix(in srgb, var(--danger) 76%, var(--text-strong));background:var(--danger);color:#fff}.ghost-action:hover{background:var(--hover)}.primary-action:hover{background:var(--accent-hover)}.profile-actions .danger-action:hover:not(:disabled){background:color-mix(in srgb, var(--danger) 86%, #000)}.profile-actions .ghost-action:disabled,.profile-actions .primary-action:disabled,.profile-actions .danger-action:disabled{cursor:default;opacity:.58}.profile-actions .ghost-action:active,.profile-actions .primary-action:active,.profile-actions .danger-action:active{box-shadow:var(--key-edge-pressed);transform:translateY(1px)}.delete-message-scrim{padding:20px}.delete-message-modal{width:min(520px,100%)}.delete-message-modal>header{padding-bottom:10px}.delete-message-content{gap:18px;padding:4px 20px 20px;display:grid}.delete-message-content>p{color:var(--text);margin:0;font-size:14px;line-height:1.5}.delete-message-preview{border:1px solid var(--line-strong);border-radius:var(--radius);background:var(--panel-2);grid-template-columns:36px minmax(0,1fr);align-items:start;gap:12px;padding:14px;display:grid}.delete-message-preview__content{min-width:0}.delete-message-preview>.avatar{border-radius:9px;width:36px;height:36px;margin:0}.delete-message-preview__meta{align-items:baseline;gap:8px;min-width:0;display:flex}.delete-message-preview__meta strong{color:var(--text-strong);text-overflow:ellipsis;white-space:nowrap;font-size:14px;overflow:hidden}.delete-message-preview__meta time{color:var(--muted);flex:none;font-size:11px}.delete-message-preview__body{max-height:128px;color:var(--text);overflow-wrap:anywhere;white-space:pre-wrap;margin-top:4px;font-size:14px;line-height:1.45;overflow:auto}.delete-message-actions{grid-template-columns:repeat(2,minmax(0,1fr));gap:10px;padding-top:0;display:grid}.delete-message-actions button{width:100%}@media (width<=520px){.delete-message-modal{width:100%}.delete-message-content,.delete-message-modal>header{padding-inline:16px}}.channel-settings-scrim{padding:20px}.channel-settings-modal{width:min(460px,100%)}.channel-settings-content{gap:18px;padding:14px 20px 20px;display:grid}.channel-settings-name{color:var(--text-strong);font-family:var(--font-display);font-size:16px;display:block}.channel-settings-content p{color:var(--muted);margin:6px 0 0;font-size:13px;line-height:1.5}.channel-settings-content .channel-settings-warning{border-left:3px solid var(--danger);background:color-mix(in srgb, var(--danger) 8%, var(--panel-2));color:var(--text);margin:0;padding:12px}.channel-settings-actions{grid-template-columns:repeat(2,minmax(0,1fr));gap:10px;padding-top:0;display:grid}.channel-settings-actions button{width:100%}@media (width<=520px){.channel-settings-content,.channel-settings-modal>header{padding-inline:16px}}.image-viewer-scrim{-webkit-backdrop-filter:blur(18px);backdrop-filter:blur(18px);background:#000000c7;padding:28px}.image-viewer{z-index:1;color:#fff;background:#07090f;border:1px solid #ffffff1f;border-radius:14px;grid-template-rows:auto minmax(0,1fr);width:min(1280px,100%);height:min(900px,100dvh - 56px);max-height:100%;animation:.15s cubic-bezier(.2,.8,.2,1) picker-in;display:grid;position:relative;overflow:hidden;box-shadow:0 34px 90px -34px #000000f2}.image-viewer>header{background:#ffffff0a;border-bottom:1px solid #ffffff1a;justify-content:space-between;align-items:center;gap:16px;min-height:52px;padding:10px 12px 10px 16px;display:flex}.image-viewer>header strong{color:#fff;text-overflow:ellipsis;white-space:nowrap;min-width:0;font-size:13px;overflow:hidden}.image-viewer>header div{flex-shrink:0;align-items:center;gap:8px;display:inline-flex}.image-viewer>header a{color:#fff;background:#ffffff14;border-radius:7px;align-items:center;height:30px;padding:0 10px;font-size:12px;font-weight:700;text-decoration:none;display:inline-flex}.image-viewer>header a:hover{background:#ffffff24}.image-viewer>header a:focus-visible,.image-viewer>header button:focus-visible{outline-offset:2px;outline:2px solid #fff}.image-viewer>header button{color:#ffffffc7;background:0 0;border:0;border-radius:7px;place-items:center;width:30px;height:30px;font-size:22px;line-height:1;display:grid}.image-viewer>header button:hover{color:#fff;background:#ffffff1f}.image-viewer-stage{place-items:center;min-height:0;padding:18px;display:grid}.image-viewer-stage img{object-fit:contain;background:#ffffff0a;border-radius:8px;max-width:100%;max-height:100%;display:block}@media (width<=720px),(height<=520px) and (orientation:landscape){.image-viewer-scrim{padding:0}.image-viewer{border:0;border-radius:0;width:100%;height:100dvh}.image-viewer>header{padding-top:calc(10px + var(--safe-area-top));padding-right:calc(12px + var(--safe-area-right));padding-left:calc(16px + var(--safe-area-left))}.image-viewer-stage{padding-right:calc(12px + var(--safe-area-right));padding-bottom:calc(12px + var(--safe-area-bottom));padding-left:calc(12px + var(--safe-area-left))}}.mobile-nav-toggle{top:calc(14px + var(--safe-area-top));left:calc(14px + var(--safe-area-left));z-index:30;border:1px solid var(--line-strong);background:var(--panel);width:38px;height:38px;color:var(--text);border-radius:10px;font-size:22px;line-height:1;display:none;position:fixed}.mobile-nav-toggle .bars{gap:3px;display:grid}.mobile-nav-toggle .bars i{background:currentColor;border-radius:2px;width:16px;height:2px;display:block}.mobile-nav-backdrop{display:none}@media (width<=1180px){.shell{grid-template-columns:72px 240px minmax(0,1fr)}.shell.sidebar-collapsed,.shell.sidebar-collapsed.thread-open,.shell.sidebar-collapsed.search-open{grid-template-columns:72px 0 minmax(0,1fr)}.thread,.search-results{width:min(420px,100vw);box-shadow:var(--shadow);z-index:4;border-left:1px solid var(--line-strong);transition:transform .18s;position:fixed;inset:0 0 0 auto;transform:translate(100%)}.thread.open,.search-results{transform:translate(0)}.desktop-shell .thread,.desktop-shell .search-results{top:52px;bottom:0}}@media (width<=820px){.mobile-nav-toggle{place-items:center;display:grid}.shell,.shell.thread-open,.shell.search-open,.shell.sidebar-collapsed,.shell.sidebar-collapsed.thread-open,.shell.sidebar-collapsed.search-open{grid-template-columns:1fr}.sidebar-collapsed .sidebar{opacity:1;pointer-events:none;transform:translate(calc(-100% - 72px))}.guild-rail,.sidebar{z-index:20;pointer-events:none;height:100dvh;transition:transform .18s;position:fixed;inset:0 auto 0 0;transform:translate(-100%)}.guild-rail{width:72px;padding-top:calc(14px + var(--safe-area-top));padding-bottom:calc(14px + var(--safe-area-bottom))}.sidebar{width:min(260px,100vw - 72px);left:72px;transform:translate(calc(-100% - 72px))}.nav-open .guild-rail,.nav-open .sidebar{pointer-events:auto;transform:translate(0,0)}.nav-open .guild-rail{padding-top:calc(62px + var(--safe-area-top))}.desktop-shell .guild-rail,.desktop-shell .sidebar{height:calc(100dvh - 52px);top:52px}.desktop-shell.nav-open .guild-rail{padding-top:calc(14px + var(--safe-area-top))}.desktop-shell .mobile-nav-backdrop{top:52px}.mobile-nav-backdrop{z-index:15;background:#05081075;border:0;padding:0;display:block;position:fixed;inset:0 0 0 min(332px,100vw)}.topbar{min-height:calc(60px + var(--safe-area-top));padding-top:calc(12px + var(--safe-area-top));padding-right:calc(20px + var(--safe-area-right));padding-left:calc(64px + var(--safe-area-left))}.thread>header,.search-results-head{padding-top:calc(12px + var(--safe-area-top));padding-left:calc(64px + var(--safe-area-left))}.search{width:180px}}@media (width<=520px){.search,.topbar-meta,.topbar-divider{display:none}}.message-row.highlight,.thread-root.highlight,.reply.highlight{animation:1.4s ease-out quote-flash}@keyframes quote-flash{0%{background:color-mix(in srgb, var(--accent) 22%, transparent)}to{background:0 0}}.quote-block{color:inherit;cursor:pointer;text-align:left;max-width:100%;font:inherit;background:0 0;border:0;border-radius:6px;align-items:stretch;gap:.5rem;margin:0 0 .35rem;padding:.25rem .5rem .25rem 0;display:inline-flex}.quote-block:hover:not(:disabled){background:color-mix(in srgb, var(--accent) 8%, transparent)}.quote-block:disabled{cursor:default;opacity:.75}.quote-block .quote-bar{background:var(--accent);border-radius:2px;flex:0 0 3px;align-self:stretch;width:3px}.quote-block .quote-content{flex-direction:column;gap:.1rem;min-width:0;display:flex}.quote-block .quote-author{color:var(--accent);font-size:.78rem;font-weight:600}.quote-block .quote-snippet{color:var(--muted);white-space:nowrap;text-overflow:ellipsis;max-width:56ch;font-size:.85rem;overflow:hidden}.quote-block .quote-snippet.muted{opacity:.75;font-style:italic}.quote-preview{background:color-mix(in srgb, var(--accent) 5%, transparent);border:0;border-bottom:1px solid var(--line);color:var(--muted);border-radius:0;align-items:center;gap:.5rem;margin:0;padding:6px 10px 6px 12px;font-size:12.5px;display:flex}.quote-preview .quote-bar{display:none}.quote-preview-body{flex:1;align-items:baseline;gap:.4rem;min-width:0;display:flex;overflow:hidden}.quote-preview-label{color:color-mix(in srgb, var(--accent) 85%, var(--text));white-space:nowrap;font-size:12px}.quote-preview-label strong{color:var(--text-strong);font-weight:600}.quote-preview-snippet{white-space:nowrap;text-overflow:ellipsis;color:var(--muted);flex:1;min-width:0;font-size:12px;overflow:hidden}.quote-preview-clear{color:var(--muted);cursor:pointer;background:0 0;border:0;border-radius:6px;padding:2px 6px;font-size:16px;line-height:1;transition:background .1s,color .1s}.quote-preview-clear:hover{color:var(--text-strong);background:var(--hover-strong)}.reply-quote-btn{color:var(--muted);cursor:pointer;opacity:0;background:0 0;border:0;margin-left:auto;padding:0 .3rem;font-size:.95rem;transition:opacity .15s;position:relative}.reply:hover .reply-quote-btn,.thread-root:hover .reply-quote-btn,.reply-quote-btn:focus-visible{opacity:1}.reply-quote-btn:hover{color:var(--accent)}.tooltip{position:relative}.tooltip:before,.reply-quote-btn:before{content:attr(data-tooltip);z-index:20;background:var(--tooltip-bg);color:var(--tooltip-fg);white-space:nowrap;opacity:0;pointer-events:none;border-radius:9px;padding:.42rem .62rem;font-size:.78rem;font-weight:700;line-height:1;transition:opacity .12s,transform .12s;position:absolute;bottom:calc(100% + 12px);left:50%;transform:translate(-50%,4px)scale(.96);box-shadow:0 10px 28px #00000047}.tooltip:after,.reply-quote-btn:after{content:"";z-index:20;background:var(--tooltip-bg);opacity:0;pointer-events:none;border-radius:2px;width:12px;height:12px;transition:opacity .12s,transform .12s;position:absolute;bottom:calc(100% + 5px);left:50%;transform:translate(-50%,4px)rotate(45deg)scale(.9)}.tooltip:hover:before,.tooltip:focus-visible:before,.reply-quote-btn:hover:before,.reply-quote-btn:focus-visible:before,.tooltip:hover:after,.tooltip:focus-visible:after,.reply-quote-btn:hover:after,.reply-quote-btn:focus-visible:after{opacity:1;transform:translate(-50%)scale(1)}.tooltip:hover:after,.tooltip:focus-visible:after,.reply-quote-btn:hover:after,.reply-quote-btn:focus-visible:after{transform:translate(-50%)rotate(45deg)scale(1)}.tooltip-align-end:before{transform-origin:100% 100%;left:auto;right:0;transform:translateY(4px)scale(.96)}.tooltip-align-end:hover:before,.tooltip-align-end:focus-visible:before{transform:translateY(0)scale(1)}.settings-modal-scrim{z-index:1000;color:var(--text);-webkit-font-smoothing:antialiased;background:var(--lightningcss-light,#080a0e6b)var(--lightningcss-dark,#0000008c);place-items:center;font-size:14px;line-height:1.5;animation:.15s ease-out settings-modal-fade;display:grid;position:fixed;inset:0}@keyframes settings-modal-fade{0%{opacity:0}to{opacity:1}}.settings-modal{background:var(--panel);border:1px solid var(--line);border-radius:var(--radius-lg);width:min(1100px,96vw);height:min(760px,92vh);box-shadow:var(--shadow);grid-template-columns:232px minmax(0,1fr);display:grid;position:relative;overflow:hidden}.settings-modal__close{z-index:6;width:28px;height:28px;color:var(--muted);cursor:pointer;border-radius:var(--radius-sm);background:0 0;border:0;place-items:center;transition:background .12s,color .12s;display:grid;position:absolute;top:14px;right:14px}.settings-modal__close:hover{background:var(--hover);color:var(--text-strong)}.settings-modal__rail{background:var(--panel-2);border-right:1px solid var(--line);flex-direction:column;padding:16px 10px;display:flex;overflow-y:auto}.settings-modal__rail-group+.settings-modal__rail-group{margin-top:14px}.settings-modal__rail-heading{font-family:var(--font-mono);text-transform:uppercase;letter-spacing:.09em;color:var(--muted);margin:0;padding:6px 8px 4px;font-size:10px;font-weight:600}.settings-modal__rail-select{background:var(--bg);border:1px solid var(--line);border-radius:var(--radius-sm);width:100%;height:32px;color:var(--text);font:inherit;cursor:pointer;margin:2px 0 6px;padding:0 8px;font-size:13.5px;transition:border-color .12s,box-shadow .12s,background .12s}.settings-modal__rail-select:hover{border-color:var(--line-strong)}.settings-modal__rail-select:focus{border-color:var(--accent);background:var(--panel);box-shadow:0 0 0 3px var(--accent-soft);outline:0}.settings-modal__rail ul{margin:0;padding:0;list-style:none}.settings-modal__rail-item{border-radius:var(--radius-sm);cursor:pointer;width:100%;font:inherit;color:var(--text);text-align:left;background:0 0;border:0;align-items:center;gap:10px;margin:1px 0;padding:6px 10px;font-size:13.5px;line-height:1.4;transition:background .1s,color .1s;display:flex}.settings-modal__rail-item:hover{background:var(--hover)}.settings-modal__rail-item.is-active{background:var(--hover-strong);color:var(--text-strong);font-weight:600}.settings-modal__rail-icon{width:16px;height:16px;color:var(--muted);flex-shrink:0;place-items:center;display:grid}.settings-modal__rail-icon svg{width:16px;height:16px;display:block}.settings-modal__rail-item.is-active .settings-modal__rail-icon{color:var(--text-strong)}.settings-modal__rail-avatar{color:#fff;background:linear-gradient(135deg, hsl(var(--hue,220deg) 70% 55%), hsl(calc(var(--hue,220deg) + 40deg) 70% 45%));border-radius:4px;flex-shrink:0;place-items:center;width:18px;height:18px;font-size:9px;font-weight:700;display:grid;overflow:hidden}.settings-modal__rail-avatar img{object-fit:cover;width:100%;height:100%;display:block}.settings-modal__rail-label{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.settings-modal__content{background:var(--panel);color:var(--text);padding:40px 56px 56px;overflow-y:auto}.settings-modal__content .settings-page__header{margin-bottom:32px}.settings-modal__content .settings-page__eyebrow{font-family:var(--font-mono);text-transform:uppercase;letter-spacing:.09em;color:var(--muted);margin:0 0 6px;font-size:10px;font-weight:600}.settings-modal__content .settings-page__h1{letter-spacing:-.01em;color:var(--text-strong);font-size:26px;font-weight:700;line-height:1.2;font-family:var(--font-display);margin:0 0 6px}.settings-modal__content .settings-page__lead{color:var(--muted);margin:0;font-size:14px;line-height:1.5}.settings-modal__content .settings-form{flex-direction:column;gap:24px;max-width:640px;display:flex}.settings-modal__content .settings-footer{border-top:1px solid var(--line);justify-content:space-between;align-items:center;gap:12px;margin-top:8px;padding-top:20px;display:flex}.settings-modal__content .settings-footer__spacer{flex:1}.settings-modal__content .settings-section{flex-direction:column;gap:20px;display:flex}.settings-modal__content .settings-section__h{text-transform:uppercase;letter-spacing:.06em;color:var(--muted);margin:0 0 4px;font-size:12px;font-weight:600}.settings-modal__content .settings-field{flex-direction:column;gap:6px;display:flex}.settings-modal__content .settings-field__label{color:var(--text-strong);font-size:13px;font-weight:600}.settings-modal__content .settings-field__hint{color:var(--muted);margin:0;font-size:12.5px;line-height:1.5}.settings-modal__content .settings-field__hint.is-error{color:var(--danger)}.settings-modal__content .settings-identity{background:var(--panel-2);border:1px solid var(--line);border-radius:var(--radius);align-items:center;gap:14px;padding:14px 16px;display:flex}.settings-modal__content .settings-identity__meta{flex-direction:column;flex:1;gap:2px;min-width:0;display:flex}.settings-modal__content .settings-identity__name{color:var(--text-strong);white-space:nowrap;text-overflow:ellipsis;font-size:15px;font-weight:700;line-height:1.25;overflow:hidden}.settings-modal__content .settings-identity__handle{color:var(--muted);white-space:nowrap;text-overflow:ellipsis;font-size:13px;line-height:1.3;overflow:hidden}.settings-modal__content .settings-identity__tag{text-transform:uppercase;letter-spacing:.08em;color:var(--muted);background:var(--panel);border:1px solid var(--line);border-radius:999px;flex-shrink:0;padding:3px 8px;font-size:10px;font-weight:600}.settings-modal__content .settings-rows{flex-direction:column;display:flex}.settings-modal__content .settings-rows--sectioned .settings-row2{border-top:0;align-items:center;padding:12px 0}.settings-modal__content .settings-row2{border-top:1px solid var(--line);grid-template-columns:minmax(0,220px) minmax(0,1fr);gap:32px;padding:20px 0;display:grid}.settings-modal__content .settings-row2--toggle{grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:24px}.settings-modal__content .settings-row2:first-child{border-top:0;padding-top:4px}.settings-modal__content .settings-row2__desc{min-width:0}.settings-modal__content .settings-row2__label{color:var(--text-strong);margin-bottom:4px;font-size:13.5px;font-weight:600;display:block}.settings-modal__content .settings-row2__hint{color:var(--muted);margin:0;font-size:12.5px;line-height:1.5}.settings-modal__content .settings-row2__control{flex-direction:column;align-items:flex-start;gap:8px;min-width:0;max-width:380px;display:flex}.settings-modal__content .settings-row2__control--end{flex-direction:row;justify-content:center;align-items:flex-end;max-width:none}.settings-modal__content .settings-rows__head{border-top:1px solid var(--line);text-transform:uppercase;letter-spacing:.08em;color:var(--muted);margin:0;padding:24px 0 12px;font-size:11px;font-weight:600}.settings-modal__content .settings-rows__head:first-child{border-top:0;padding-top:4px}.settings-modal__content .settings-rows__head+.settings-row2{border-top:0;padding-top:0}.settings-modal__content .settings-input-group{background:var(--bg);border:1px solid var(--line);border-radius:var(--radius-sm);align-items:stretch;width:100%;transition:border-color .12s,box-shadow .12s,background .12s;display:flex}.settings-modal__content .settings-input-group:hover{border-color:var(--line-strong)}.settings-modal__content .settings-input-group:focus-within{border-color:var(--accent);background:var(--panel);box-shadow:0 0 0 3px var(--accent-soft)}.settings-modal__content .settings-input-group__prefix{color:var(--muted);border-right:1px solid var(--line);background:var(--panel-2);border-radius:var(--radius-sm) 0 0 var(--radius-sm);place-items:center;padding:0 10px;font-size:14px;font-weight:500;display:grid}.settings-modal__content .settings-input--in-group{box-shadow:none!important;border-radius:0 var(--radius-sm) var(--radius-sm) 0!important;background:0 0!important;border:0!important;max-width:none!important}.settings-modal__content .settings-input--in-group:focus{box-shadow:none!important;background:0 0!important;border:0!important}.settings-modal__content .settings-linklike{color:var(--muted);cursor:pointer;font:inherit;text-underline-offset:2px;background:0 0;border:0;padding:2px 0;font-size:12.5px;text-decoration:underline;transition:color .12s}.settings-modal__content .settings-linklike:hover{color:var(--text-strong)}.settings-modal__content .settings-row{grid-template-columns:1fr auto;align-items:center;gap:24px;display:grid}.settings-modal__content .settings-row__main{min-width:0}.settings-modal__content .settings-row__label{color:var(--text-strong);margin-bottom:2px;font-size:13.5px;font-weight:600}.settings-modal__content .settings-row__hint{color:var(--muted);font-size:12.5px;line-height:1.5}.settings-modal__content .settings-row__hint.is-error{color:var(--danger)}.settings-modal__content .settings-input{background:var(--bg);border:1px solid var(--line);border-radius:var(--radius-sm);width:100%;max-width:420px;height:36px;color:var(--text);font:inherit;padding:0 12px;font-size:14px;transition:border-color .12s,box-shadow .12s,background .12s}.settings-modal__content .settings-input:hover{border-color:var(--line-strong)}.settings-modal__content .settings-input:focus{border-color:var(--accent);background:var(--panel);box-shadow:0 0 0 3px var(--accent-soft);outline:0}.settings-modal__content .settings-input--wide{max-width:560px}.settings-modal__content .settings-row .settings-input{width:auto;min-width:240px;max-width:320px}.settings-modal__content .settings-button{background:var(--panel-2);height:34px;color:var(--text);border:1px solid var(--line-strong);border-radius:var(--radius);font:inherit;cursor:pointer;white-space:nowrap;box-shadow:var(--key-edge);justify-content:center;align-items:center;gap:6px;padding:0 14px;font-size:13.5px;font-weight:600;transition:background .1s,border-color .1s,box-shadow 80ms,transform 80ms;display:inline-flex}.settings-modal__content .settings-button:hover{background:var(--panel-3);border-color:var(--line-strong)}.settings-modal__content .settings-button:active:not(:disabled){box-shadow:var(--key-edge-pressed);transform:translateY(1px)}.settings-modal__content .settings-button:focus-visible{box-shadow:0 0 0 3px var(--accent-soft);outline:0}.settings-modal__content .settings-button:disabled{opacity:.55;cursor:not-allowed}.settings-modal__content .settings-button--primary{background:var(--accent);color:var(--accent-contrast);border-color:color-mix(in srgb, var(--accent) 70%, var(--text-strong))}.settings-modal__content .settings-button--primary:hover{background:var(--accent-hover);border-color:var(--accent-hover)}.settings-modal__content .settings-switch{appearance:none;background:var(--line-strong);cursor:pointer;border:0;border-radius:9px;flex-shrink:0;width:32px;height:18px;margin:0;transition:background .15s;position:relative}.settings-modal__content .settings-switch:checked{background:var(--accent)}.settings-modal__content .settings-switch:disabled{opacity:.5;cursor:not-allowed}.settings-modal__content .settings-switch:after{content:"";background:#fff;border-radius:50%;width:14px;height:14px;transition:transform .15s;position:absolute;top:2px;left:2px;box-shadow:0 1px 2px #00000040}.settings-modal__content .settings-switch:checked:after{transform:translate(14px)}.settings-modal__content .settings-switch:focus-visible{box-shadow:0 0 0 3px var(--accent-soft);outline:0}.settings-modal__content .settings-actions{justify-content:flex-end;align-items:center;gap:12px;margin-top:4px;display:flex}.settings-modal__content .settings-status{color:var(--muted);margin:0;font-size:13px}.settings-modal__content .settings-status.is-error{color:var(--danger)}@media (width<=720px){.settings-modal{border-radius:0;grid-template-rows:auto 1fr;grid-template-columns:1fr;width:100vw;height:100dvh}.settings-modal__rail{border-right:0;border-bottom:1px solid var(--line);flex-direction:row;padding:8px;overflow-x:auto}.settings-modal__content{padding:24px 20px 60px}.settings-modal__content .settings-row2{grid-template-columns:1fr;gap:10px}.settings-modal__content .settings-row2__control{max-width:none}}.ws-settings{color:var(--text);z-index:50;background:var(--lightningcss-light,#0f0f0f38)var(--lightningcss-dark,#00000059);place-items:center;padding:28px 80px 28px 28px;font-size:14px;line-height:1.5;display:grid;position:fixed;inset:0}.ws-settings__panel{background:var(--panel);border:1px solid var(--line);width:100%;max-width:1400px;height:100%;box-shadow:var(--shadow);grid-template-columns:260px minmax(0,1fr);display:grid;overflow:hidden}.ws-settings__rail{background:var(--panel-2);border-right:1px solid var(--line);flex-direction:column;padding:14px 10px 18px;display:flex;overflow-y:auto}.ws-settings__rail-search{margin:2px 4px 12px;position:relative}.ws-settings__rail-search-icon{color:var(--muted);pointer-events:none;position:absolute;top:50%;left:10px;transform:translateY(-50%)}.ws-settings__rail-search-icon svg{width:14px;height:14px;display:block}.ws-settings__rail-search-input{background:var(--panel);border:1px solid var(--line);border-radius:var(--radius-sm);width:100%;height:32px;color:var(--text);font:inherit;padding:0 12px 0 32px;font-size:13px}.ws-settings__rail-search-input::placeholder{color:var(--muted)}.ws-settings__rail-search-input:disabled{cursor:not-allowed;opacity:.65}.ws-settings__rail-group{margin-top:6px}.ws-settings__rail-heading{color:var(--muted);letter-spacing:.02em;margin:0;padding:8px 10px 6px;font-size:11.5px;font-weight:600}.ws-settings__rail-heading-name{color:var(--text-strong);font-weight:700}.ws-settings__rail-list{margin:0;padding:0;list-style:none}.ws-settings__rail-item{border-radius:var(--radius-sm);cursor:pointer;width:100%;font:inherit;color:var(--text);text-align:left;background:0 0;border:0;align-items:center;gap:10px;margin:1px 0;padding:6px 10px;font-size:14px;line-height:1.4;transition:background .1s,color .1s;display:flex}.ws-settings__rail-item:hover{background:var(--hover)}.ws-settings__rail-item.is-active{background:var(--hover-strong);color:var(--text-strong);font-weight:600}.ws-settings__rail-item-icon{width:16px;height:16px;color:var(--muted);flex-shrink:0;place-items:center;display:grid}.ws-settings__rail-item-icon svg{width:16px;height:16px;display:block}.ws-settings__rail-item.is-active .ws-settings__rail-item-icon{color:var(--text-strong)}.ws-settings__rail-item-label{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.ws-settings__content{background:var(--bg);position:relative;overflow-y:auto}.ws-settings__content-inner{max-width:740px;padding:56px 80px 80px}.ws-settings__close{border:1px solid var(--line-strong);background:var(--panel);width:36px;height:36px;color:var(--text-strong);cursor:pointer;z-index:60;border-radius:50%;place-items:center;transition:background .12s,color .12s,border-color .12s;display:grid;position:fixed;top:28px;right:22px;box-shadow:0 1px 3px #00000026}@media (width<=760px){.ws-settings{padding:0}.ws-settings__panel{border:0;border-radius:0;max-width:none}}.ws-settings__close:hover{background:var(--panel-2);color:var(--text-strong);border-color:var(--line-strong)}.ws-settings__error{background:var(--panel-2);border:1px solid var(--line);border-radius:var(--radius);color:var(--danger);margin:0 0 20px;padding:14px 16px;font-size:13.5px}.ws-settings .ws-page__header{margin-bottom:32px}.ws-settings .ws-page__h1{letter-spacing:-.01em;color:var(--text-strong);font-size:28px;font-weight:700;line-height:1.2;font-family:var(--font-display);margin:0 0 8px}.ws-settings .ws-page__lead{color:var(--muted);margin:0;font-size:14px;line-height:1.5}.workspace-settings-empty{background:var(--panel-2);border:1px dashed var(--line);border-radius:var(--radius);color:var(--muted);padding:24px;font-size:14px;line-height:1.6}.workspace-settings-empty p{margin:0}.ws-section{border-top:1px solid var(--line);flex-direction:column;margin-top:24px;display:flex}.ws-section__h{color:var(--text-strong);margin:0;padding:18px 0 6px;font-size:14px;font-weight:700}.ws-row{border-top:1px solid var(--line);grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:24px;padding:18px 0;display:grid}.ws-section>.ws-row:first-child,.ws-section>.ws-section__h+.ws-row{border-top:0}.ws-row__main{min-width:0}.ws-row__label{color:var(--text-strong);margin-bottom:4px;font-size:14px;font-weight:600}.ws-row__hint{color:var(--muted);font-size:13px;line-height:1.5}.ws-row__hint b{color:var(--text-strong);font-weight:600}.ws-row__value{color:var(--text-strong);text-align:right;word-break:break-word;max-width:320px;font-size:14px;font-weight:500}.ws-row__control{flex-wrap:wrap;justify-content:flex-end;align-items:center;gap:8px;min-width:0;max-width:420px;display:flex}.ws-strip{background:var(--panel-2);border:1px solid var(--line);border-radius:var(--radius);align-items:center;gap:12px;margin-bottom:8px;padding:10px 14px;font-size:14px;display:flex}.ws-strip__avatar{background:linear-gradient(135deg, var(--brand-a), var(--brand-b));width:28px;height:28px;color:var(--brand-contrast);border-radius:6px;flex-shrink:0;place-items:center;font-size:12px;font-weight:700;display:grid;overflow:hidden}.ws-strip__avatar img{object-fit:cover;width:100%;height:100%;display:block}.ws-strip__name{color:var(--text-strong);font-weight:600}.ws-strip__pill{letter-spacing:.01em;border-radius:999px;margin-left:auto;padding:2px 10px;font-size:12px;font-weight:600}.ws-strip__pill--owner{background:color-mix(in srgb, var(--success) 15%, transparent);color:var(--success);border:1px solid color-mix(in srgb, var(--success) 32%, transparent)}.ws-strip__pill--moderator{background:color-mix(in srgb, var(--delivery-accent) 15%, transparent);color:var(--delivery-accent);border:1px solid color-mix(in srgb, var(--delivery-accent) 32%, transparent)}.ws-strip__pill--member,.ws-strip__pill--guest,.ws-strip__pill--bot{background:var(--panel-3,var(--hover));color:var(--text);border:1px solid var(--line)}.ws-input{background:var(--panel-2);border:1px solid var(--line);border-radius:var(--radius-sm);width:220px;max-width:100%;height:34px;color:var(--text-strong);font:inherit;padding:0 12px;font-size:14px}.ws-input:focus{border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-soft);outline:0}.ws-input:disabled{opacity:.65;cursor:not-allowed}.ws-select{background:var(--panel-2);border:1px solid var(--line);border-radius:var(--radius-sm);width:220px;max-width:100%;height:34px;color:var(--text-strong);font:inherit;padding:0 34px 0 10px;font-size:13.5px}.ws-select:focus{border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-soft);outline:0}.ws-select:disabled{opacity:.65;cursor:not-allowed}.ws-file{display:none}.ws-actions{border-top:1px solid var(--line);justify-content:flex-end;align-items:center;gap:12px;padding:14px 0 0;display:flex}.ws-status{min-height:20px;color:var(--muted);flex:1;margin:0;font-size:13px}.ws-status.is-error{color:var(--danger)}.ws-input[readonly]{cursor:default;color:var(--text)}.ws-btn{background:var(--panel-2);border:1px solid var(--line-strong);border-radius:var(--radius);height:34px;color:var(--text-strong);font:inherit;cursor:pointer;box-shadow:var(--key-edge);padding:0 14px;font-size:13.5px;font-weight:500;transition:background .12s,color .12s,border-color .12s,box-shadow 80ms,transform 80ms}.ws-btn:active:not(:disabled){box-shadow:var(--key-edge-pressed);transform:translateY(1px)}.ws-btn:hover:not(:disabled){background:var(--panel-3,var(--hover-strong));border-color:var(--line-strong)}.ws-btn:disabled{opacity:.55;cursor:not-allowed}.ws-btn--danger{color:var(--danger);border-color:var(--line)}.ws-btn--danger:hover:not(:disabled){background:color-mix(in srgb, var(--danger) 9%, transparent);border-color:var(--danger)}.ws-btn--primary{background:var(--accent);border-color:color-mix(in srgb, var(--accent) 70%, var(--text-strong));color:var(--accent-contrast);align-items:center;gap:6px;display:inline-flex}.ws-btn--primary:hover:not(:disabled){background:var(--accent-hover);border-color:var(--accent-hover)}.ws-btn--primary svg{width:14px;height:14px}.ws-settings__content:has(.ws-members-page){overflow:hidden}.ws-settings__content-inner:has(.ws-members-page){flex-direction:column;max-width:none;height:100%;min-height:0;padding:56px 80px 28px;display:flex}.ws-members-page{flex-direction:column;flex:1;min-height:0;display:flex}.ws-members-page__header{flex:none}.ws-members__toolbar{background:var(--bg);border-bottom:1px solid var(--line);flex-wrap:wrap;flex:none;justify-content:space-between;align-items:center;gap:16px;margin:4px 0 12px;padding:14px 0 12px;display:flex}.ws-members__count{color:var(--muted);text-transform:uppercase;letter-spacing:.06em;font-size:12.5px;font-weight:600}.ws-members__controls{flex-wrap:wrap;align-items:center;gap:8px;display:flex}.ws-members__search{align-items:center;display:flex;position:relative}.ws-members__search-icon{width:14px;height:14px;color:var(--muted);pointer-events:none;display:inline-flex;position:absolute;left:10px}.ws-members__search-icon svg{width:100%;height:100%}.ws-members__search-input{width:220px;height:34px;color:var(--text);background:var(--panel-2);border:1px solid var(--line);border-radius:6px;outline:none;padding:0 12px 0 32px;font-size:13px}.ws-members__search-input::-webkit-search-cancel-button{appearance:none}.ws-members__search-input:focus{border-color:var(--accent)}.ws-members__role-select{height:34px;color:var(--text);background:var(--panel-2);border:1px solid var(--line);cursor:pointer;border-radius:6px;outline:none;padding:0 28px 0 10px;font-size:13px}.ws-members__list{border:1px solid var(--line);background:var(--panel);border-radius:6px;flex:auto;min-height:0;overflow:hidden auto}.ws-members__row{border-bottom:1px solid var(--line);box-sizing:border-box;grid-template-columns:36px 1fr auto auto;align-items:center;gap:14px;padding:0 16px;display:grid}.ws-members__avatar{letter-spacing:-.02em;background:var(--accent-soft);width:36px;height:36px;color:var(--accent);border-radius:7px;flex-shrink:0;justify-content:center;align-items:center;font-size:13px;font-weight:600;display:inline-flex;overflow:hidden}.ws-members__avatar--bot{background:color-mix(in srgb, var(--warn) 18%, transparent);color:color-mix(in srgb, var(--warn) 72%, var(--text))}.ws-members__avatar img{object-fit:cover;width:100%;height:100%}.ws-members__main{flex-direction:column;gap:2px;min-width:0;display:flex}.ws-members__name{color:var(--text-strong,var(--text));white-space:nowrap;text-overflow:ellipsis;font-size:14px;font-weight:600;overflow:hidden}.ws-members__meta{color:var(--muted);white-space:nowrap;text-overflow:ellipsis;align-items:center;gap:6px;font-size:12.5px;display:flex;overflow:hidden}.ws-members__handle{font-family:var(--font-mono);color:var(--text);background:var(--bg);border:1px solid var(--line);border-radius:4px;padding:1px 6px;font-size:12px}.ws-members__dot{opacity:.6}.ws-members__pill{text-transform:capitalize;color:var(--text);white-space:nowrap;background:#7f7f7f24;border-radius:999px;padding:3px 10px;font-size:11.5px;font-weight:600}.ws-members__pill--owner{background:color-mix(in srgb, var(--success) 16%, transparent);color:var(--success)}.ws-members__pill--moderator{background:color-mix(in srgb, var(--delivery-accent) 16%, transparent);color:var(--delivery-accent)}.ws-members__pill--bot{background:var(--accent-soft);color:var(--accent)}.ws-members__pill--guest{background:color-mix(in srgb, var(--warn) 18%, transparent);color:color-mix(in srgb, var(--warn) 72%, var(--text))}.ws-members__actions{width:28px;height:28px;color:var(--muted);cursor:pointer;background:0 0;border:1px solid #0000;border-radius:6px;justify-content:center;align-items:center;display:inline-flex}.ws-members__actions:hover:not(:disabled){background:var(--bg);border-color:var(--line);color:var(--text)}.ws-members__actions:disabled{opacity:.45;cursor:not-allowed}.ws-members__empty{text-align:center;border:1px dashed var(--line);color:var(--muted);background:var(--panel);border-radius:8px;margin-top:24px;padding:36px 20px;font-size:13.5px}.ws-members__loading{color:var(--muted);text-align:center;border-top:1px solid var(--line);padding:10px 16px;font-size:12.5px}.ws-members__row--skeleton{height:64px}.ws-members__skeleton{background:linear-gradient(90deg,#7f7f7f14,#7f7f7f2e,#7f7f7f14) 0 0/200% 100%;border-radius:6px;animation:1.4s ease-in-out infinite ws-members-shimmer}.ws-members__skeleton--line{height:10px;margin:4px 0}.ws-members__skeleton--pill{border-radius:999px;width:64px;height:18px}@keyframes ws-members-shimmer{0%{background-position:200% 0}to{background-position:-200% 0}}@media (width<=760px){.ws-settings__panel{grid-template-rows:auto 1fr;grid-template-columns:1fr}.ws-settings__rail{border-right:0;border-bottom:1px solid var(--line);padding:10px}.ws-settings__content-inner{padding:32px 20px 60px}.ws-settings__close{top:10px;right:12px}}.ws-bots-page{flex-direction:column;gap:0;display:flex}.ws-bots__toolbar{background:var(--bg);border-bottom:1px solid var(--line);flex-wrap:wrap;justify-content:space-between;align-items:center;gap:16px;margin:4px 0 12px;padding:14px 0 12px;display:flex}.ws-bots__count{color:var(--muted);text-transform:uppercase;letter-spacing:.06em;font-size:12.5px;font-weight:600}.ws-bots__toolbar-actions{align-items:center;gap:8px;display:flex}.ws-bots__panel{background:var(--surface);border:1px solid var(--line);border-radius:8px;margin:8px 0 16px;padding:18px 20px}.ws-bots__empty{text-align:center;border:1px dashed var(--line);color:var(--muted);background:var(--surface);border-radius:8px;margin-top:16px;padding:36px 20px;font-size:13.5px}.ws-bots__list{flex-direction:column;margin-bottom:60px;display:flex}.ws-bots__row{border-bottom:1px solid var(--line)}.ws-bots__row:last-child{border-bottom:0}.ws-bots__row.is-expanded{background:var(--surface)}.ws-bots__row-main{text-align:left;cursor:pointer;width:100%;color:inherit;background:0 0;border:0;grid-template-columns:36px 1fr auto auto;align-items:center;gap:14px;padding:14px 16px;display:grid}.ws-bots__row-main:hover{background:var(--hover,#7f7f7f0f)}.ws-bots__row-text{flex-direction:column;gap:2px;min-width:0;display:flex}.ws-bots__row-name{color:var(--text-strong,var(--text));white-space:nowrap;text-overflow:ellipsis;font-size:14px;font-weight:600;overflow:hidden}.ws-bots__row-meta{color:var(--muted);white-space:nowrap;text-overflow:ellipsis;align-items:center;gap:6px;font-size:12.5px;display:flex;overflow:hidden}.ws-bots__owner-pill{color:var(--text);white-space:nowrap;background:#7f7f7f24;border-radius:999px;padding:3px 10px;font-size:11.5px;font-weight:600}.ws-bots__owner-pill--service{background:color-mix(in srgb, var(--delivery-accent) 16%, transparent);color:var(--delivery-accent)}.ws-bots__owner-pill--user{background:color-mix(in srgb, var(--warn) 18%, transparent);color:color-mix(in srgb, var(--warn) 72%, var(--text))}.ws-bots__chevron{width:20px;height:20px;color:var(--muted);justify-content:center;align-items:center;display:inline-flex}.ws-bots__detail{border-top:1px dashed var(--line);flex-direction:column;gap:12px;padding:4px 16px 18px;display:flex}.ws-bots__detail-header{flex-wrap:wrap;justify-content:space-between;align-items:flex-start;gap:16px;padding-top:14px;display:flex}.ws-bots__detail-title{color:var(--text-strong,var(--text));margin:0 0 4px;font-size:13.5px;font-weight:600}.ws-bots__detail-hint{color:var(--muted);max-width:60ch;margin:0;font-size:12.5px}.ws-bots__detail-actions{flex-wrap:wrap;gap:8px;display:flex}.ws-bots__detail-empty{color:var(--muted);background:var(--bg);border:1px dashed var(--line);border-radius:6px;margin:0;padding:16px;font-size:13px}.ws-bots__token-list{flex-direction:column;gap:8px;margin:0;padding:0;list-style:none;display:flex}.ws-bots__token-row{background:var(--bg);border:1px solid var(--line);border-radius:6px;flex-wrap:wrap;justify-content:space-between;align-items:flex-start;gap:10px 16px;padding:12px 14px;display:flex}.ws-bots__token-row>.ws-btn{flex-shrink:0}.ws-bots__token-main{flex-direction:column;flex:240px;gap:4px;min-width:0;display:flex}.ws-bots__token-name{color:var(--text-strong,var(--text));font-size:13.5px;font-weight:600}.ws-bots__token-meta{color:var(--muted);font-size:12.5px}.ws-bots__scope-row{flex-wrap:wrap;gap:6px;margin-top:2px;display:flex}.ws-bots__scope-chip{font-family:var(--font-mono);background:var(--bg);border:1px solid var(--line);color:var(--text);border-radius:999px;padding:2px 8px;font-size:11.5px}.ws-bots__scope-chip--bundle{color:var(--accent);background:color-mix(in srgb, var(--accent) 10%, transparent);border-color:color-mix(in srgb, var(--accent) 35%, transparent);font-family:inherit;font-weight:600}.ws-bots__scope-toggle{color:var(--muted);text-underline-offset:2px;cursor:pointer;background:0 0;border:none;padding:2px 4px;font-size:11.5px;text-decoration:underline}.ws-bots__scope-toggle:hover{color:var(--text)}.ws-bots__scope-details{margin-top:6px}.ws-bots__scope-details>summary{color:var(--muted);cursor:pointer;width:fit-content;font-size:11.5px}.ws-bots__scope-details[open]>summary{margin-bottom:6px}.ws-bots__form{flex-direction:column;gap:16px;display:flex}.ws-bots__form-header{flex-direction:column;gap:4px;display:flex}.ws-bots__form-title{color:var(--text-strong,var(--text));margin:0;font-size:16px;font-weight:600}.ws-bots__form-hint{color:var(--muted);max-width:60ch;margin:0;font-size:13px}.ws-bots__form-grid{grid-template-columns:1fr 1fr;gap:12px;display:grid}@media (width<=640px){.ws-bots__form-grid{grid-template-columns:1fr}}.ws-bots__form-field{border:0;flex-direction:column;gap:6px;min-width:0;margin:0;padding:0;display:flex}.ws-bots__form-label{color:var(--muted);text-transform:uppercase;letter-spacing:.04em;font-size:12px;font-weight:600}.ws-bots__form-input{height:34px;color:var(--text);background:var(--surface);border:1px solid var(--line);border-radius:6px;outline:none;padding:0 12px;font-size:13.5px}.ws-bots__form-input:focus{border-color:var(--accent)}.ws-bots__form-handle{background:var(--surface);border:1px solid var(--line);border-radius:6px;align-items:center;gap:6px;padding:0 10px;display:flex}.ws-bots__form-handle span{color:var(--muted);font-family:var(--font-mono);font-size:13px}.ws-bots__form-handle .ws-bots__form-input{background:0 0;border:0;flex:1;padding-left:0}.ws-bots__choices{flex-direction:column;gap:8px;display:flex}.ws-bots__choice{border:1px solid var(--line);background:var(--surface);cursor:pointer;border-radius:6px;grid-template-rows:auto auto;grid-template-columns:18px 1fr;gap:2px 10px;padding:10px 12px;display:grid}.ws-bots__choice.is-active{border-color:var(--accent);background:color-mix(in srgb, var(--accent) 7%, transparent)}.ws-bots__choice input{accent-color:var(--accent);grid-row:1/span 2;align-self:center}.ws-bots__choice-title{color:var(--text-strong,var(--text));font-size:13.5px;font-weight:600}.ws-bots__choice-hint{color:var(--muted);font-size:12.5px}.ws-bots__form-error{background:color-mix(in srgb, var(--danger) 9%, transparent);color:var(--danger);border:1px solid color-mix(in srgb, var(--danger) 32%, transparent);border-radius:6px;margin:0;padding:10px 12px;font-size:13px}.ws-bots__form-actions{justify-content:flex-end;gap:8px;display:flex}.ws-bots__token-form-panel{background:var(--bg);border:1px solid var(--line);border-radius:6px;padding:14px}.ws-bots__token-form .ws-bots__choices{grid-template-columns:repeat(3,minmax(0,1fr));display:grid}@media (width<=720px){.ws-bots__token-form .ws-bots__choices{grid-template-columns:1fr}}.ws-bots__reveal{background:var(--surface);border:1px solid var(--accent);border-radius:8px;flex-direction:column;gap:14px;margin:8px 0 16px;padding:18px 20px;display:flex}.ws-bots__reveal-header{flex-direction:column;gap:4px;display:flex}.ws-bots__reveal-title{color:var(--text-strong,var(--text));margin:0;font-size:16px;font-weight:600}.ws-bots__reveal-hint{color:var(--muted);max-width:60ch;margin:0;font-size:13px}.ws-bots__reveal-hint code{background:var(--bg);border:1px solid var(--line);font-family:var(--font-mono);color:var(--text);white-space:nowrap;border-radius:4px;padding:1px 6px;font-size:12px}.ws-bots__reveal-field{flex-direction:column;gap:6px;display:flex}.ws-bots__reveal-label{color:var(--muted);text-transform:uppercase;letter-spacing:.04em;font-size:12px;font-weight:600}.ws-bots__reveal-row{align-items:center;gap:8px;display:flex}.ws-bots__reveal-input{height:34px;font-family:var(--font-mono);color:var(--text);background:var(--bg);border:1px solid var(--line);border-radius:6px;flex:1;padding:0 12px;font-size:13px}.ws-bots__reveal-snippet-header{justify-content:space-between;align-items:center;gap:8px;display:flex}.ws-bots__reveal-details{border:1px solid var(--line);background:var(--bg);border-radius:6px}.ws-bots__reveal-summary{color:var(--muted);text-transform:uppercase;letter-spacing:.04em;cursor:pointer;-webkit-user-select:none;user-select:none;padding:10px 14px;font-size:11px;font-weight:600}.ws-bots__reveal-summary:hover{color:var(--text)}.ws-bots__reveal-details-body{gap:8px;padding:0 14px 12px;display:grid}.ws-bots__reveal-details-body .ws-bots__reveal-hint{margin:0}.ws-bots__setup-mode{background:var(--bg);border:1px solid var(--line);border-radius:6px;grid-template-columns:repeat(2,minmax(0,1fr));width:min(320px,100%);padding:3px;display:inline-grid}.ws-bots__setup-mode button{min-height:30px;color:var(--muted);font:inherit;cursor:pointer;background:0 0;border:0;border-radius:4px;padding:0 12px;font-size:12.5px;font-weight:600}.ws-bots__setup-mode button.is-active{background:var(--surface);color:var(--text);box-shadow:0 0 0 1px var(--line)}.ws-bots__reveal-snippet{background:var(--bg);border:1px solid var(--line);font-family:var(--font-mono);color:var(--text);white-space:pre-wrap;border-radius:6px;margin:0;padding:12px 14px;font-size:12.5px;overflow-x:auto}.ws-bots__reveal-ack{color:var(--text);align-items:center;gap:8px;font-size:13px;display:flex}.ws-bots__reveal-actions{justify-content:flex-end;display:flex}.ws-bots__my-list{flex-direction:column;gap:18px;display:flex}.ws-bots__my-group{flex-direction:column;gap:8px;display:flex}.ws-bots__my-group-header{justify-content:space-between;align-items:center;gap:12px;display:flex}.ws-bots__my-group-title{color:var(--muted);text-transform:uppercase;letter-spacing:.06em;margin:0;font-size:13px;font-weight:600}.ws-bots__my-rows{border:1px solid var(--line);background:var(--surface);border-radius:6px;flex-direction:column;margin:0;padding:0;list-style:none;display:flex}.ws-bots__my-row{border-bottom:1px solid var(--line);grid-template-columns:36px 1fr auto;align-items:center;gap:14px;padding:12px 14px;display:grid}.ws-bots__my-row:last-child{border-bottom:0}.ws-bots__my-row-text{flex-direction:column;gap:2px;min-width:0;display:flex}.ws-bots__my-row-name{color:var(--text-strong,var(--text));font-size:14px;font-weight:600}.ws-bots__my-row-meta{color:var(--muted);align-items:center;gap:6px;font-size:12.5px;display:flex}.appearance-preview{border:1px solid var(--line-strong);border-radius:var(--radius-lg);background:var(--bg);overflow:hidden}.appearance-preview__bar{border-bottom:1px solid var(--line);background:var(--panel);color:var(--text-strong);align-items:baseline;gap:8px;padding:9px 14px;font-size:12px;font-weight:700;display:flex}.appearance-preview__hash{color:var(--accent)}.appearance-preview__topic{color:var(--muted);font-size:11.5px;font-weight:500}.appearance-preview__chat{gap:14px;padding:14px 16px 16px;display:grid}.appearance-preview[data-density=compact] .appearance-preview__chat{gap:7px;padding:10px 14px 12px}.appearance-preview__msg{grid-template-columns:34px minmax(0,1fr);gap:10px;display:grid}.appearance-preview[data-density=compact] .appearance-preview__msg{grid-template-columns:24px minmax(0,1fr);gap:8px}.appearance-preview__avatar{background:var(--accent);width:34px;height:34px;color:var(--accent-contrast);border-radius:9px;place-items:center;font-size:14px;font-weight:700;display:grid}.appearance-preview[data-density=compact] .appearance-preview__avatar{border-radius:7px;width:24px;height:24px;font-size:11px}.appearance-preview__avatar.is-agent{background:var(--accent-2)}.appearance-preview__body{gap:3px;min-width:0;display:grid}.appearance-preview[data-density=compact] .appearance-preview__body{gap:1px}.appearance-preview__head{align-items:baseline;gap:7px;display:flex}.appearance-preview__who{color:var(--text-strong);font-size:13px;font-weight:700}.appearance-preview[data-density=compact] .appearance-preview__who{font-size:12px}.appearance-preview__when{color:var(--muted);font-size:10px}.appearance-preview__text{font-size:13px;line-height:1.5}.appearance-preview[data-density=compact] .appearance-preview__text{font-size:12.5px;line-height:1.4}.appearance-preview__activity{background:color-mix(in srgb, var(--accent-2) 9%, var(--panel));color:var(--muted);border-radius:7px 7px 0 0;margin-top:3px;padding:6px 10px;font-size:11.5px}.appearance-preview__activity code{color:var(--text-strong);font-family:var(--font-mono,ui-monospace, monospace);font-size:10.5px}.appearance-preview__answer{background:color-mix(in srgb, var(--accent) 7%, var(--panel));border-radius:0 0 7px 7px;padding:7px 10px 8px;font-size:13px;line-height:1.5}.appearance-preview[data-density=compact] .appearance-preview__activity{padding:4px 8px;font-size:11px}.appearance-preview[data-density=compact] .appearance-preview__answer{padding:5px 8px 6px;font-size:12.5px}.appearance-preview[data-layout=outlined] .appearance-preview__activity{border:1px solid color-mix(in srgb, var(--accent-2) 45%, var(--line));background:0 0;border-bottom:0}.appearance-preview[data-layout=outlined] .appearance-preview__answer{border:1px solid color-mix(in srgb, var(--accent) 40%, var(--line));background:0 0}.appearance-preview__reactions{gap:5px;margin-top:5px;display:flex}.appearance-preview[data-density=compact] .appearance-preview__reactions{margin-top:2px}.appearance-preview__reaction{border:1px solid var(--line);background:var(--panel);color:var(--muted);border-radius:999px;padding:2px 8px;font-size:11px}.appearance-preview__reaction.is-mine{border-color:var(--accent);background:color-mix(in srgb, var(--accent) 12%, var(--panel));color:var(--text-strong)}.appearance-preview__caption{color:var(--muted-2);text-align:right;margin:-14px 2px 0;font-size:11px}.appearance-rows{display:grid}.appearance-row{grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:24px;padding:14px 0;display:grid}.appearance-row+.appearance-row{border-top:1px solid var(--line)}.appearance-row__meta{gap:2px;display:grid}.appearance-row__label{color:var(--text-strong);font-size:13.5px;font-weight:650}.appearance-row__desc{color:var(--muted);font-size:12px}.appearance-row__control{align-items:center;gap:12px;display:inline-flex}.appearance-seg{border:1px solid var(--line);border-radius:var(--radius-lg);background:var(--panel-2);gap:2px;padding:2px;display:inline-flex}.appearance-seg__btn{color:var(--muted);cursor:pointer;background:0 0;border:1px solid #0000;border-radius:8px;padding:5px 12px;font-size:12.5px;font-weight:600}.appearance-seg__btn:hover{color:var(--text-strong)}.appearance-seg__btn:focus-visible{outline:2px solid var(--accent);outline-offset:1px}.appearance-seg__btn.is-active{border-color:var(--line-strong);background:var(--panel);color:var(--text-strong);box-shadow:0 1px 2px #10151d1a}.board-chips__name{min-width:44px;color:var(--muted);text-align:right;font-size:12px}.board-chips{align-items:center;gap:10px;display:inline-flex}.board-chip{border:1px solid var(--line-strong);background:linear-gradient(135deg, var(--panel) 52%, var(--accent) 52%);cursor:pointer;border-radius:8px;width:26px;height:26px;padding:0;position:relative}.board-chip:focus-visible{outline:2px solid var(--accent);outline-offset:4px}.board-chip.is-active:after{content:"";border:2px solid var(--accent);border-radius:11px;position:absolute;inset:-5px}@media (width<=640px){.appearance-row{grid-template-columns:1fr;gap:10px}.appearance-row__control,.board-chips__name{text-align:left;justify-self:start}}.ws-intg-page{padding-bottom:60px}.ws-intg__app-icon{background:var(--surface);border:1px solid var(--line);width:36px;height:36px;color:var(--text);border-radius:8px;flex-shrink:0;justify-content:center;align-items:center;display:inline-flex}.ws-intg__wizard{background:var(--surface);border:1px solid var(--line);border-radius:8px;flex-direction:column;gap:16px;margin:8px 0 16px;padding:18px 20px;display:flex}.ws-intg__wizard-header{justify-content:space-between;align-items:flex-start;gap:16px;display:flex}.ws-intg__wizard-step{color:var(--muted);white-space:nowrap;padding-top:2px;font-size:11.5px;font-weight:600}.ws-intg__wizard-body{flex-direction:column;gap:14px;display:flex}.ws-intg__catalog{grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:12px;display:grid}.ws-intg__catalog-card{border:1px solid var(--line);text-align:left;cursor:pointer;color:inherit;background:0 0;border-radius:8px;flex-direction:column;align-items:flex-start;gap:8px;padding:16px;transition:border-color .12s,background .12s;display:flex}.ws-intg__catalog-card:hover{border-color:var(--accent);background:var(--hover,#7f7f7f0f)}.ws-intg__catalog-name{color:var(--text-strong,var(--text));font-size:14px;font-weight:600}.ws-intg__catalog-desc{color:var(--muted);font-size:12.5px;line-height:1.45}.ws-intg__chips{flex-wrap:wrap;gap:6px;margin-bottom:8px;display:flex}.ws-intg__chip{background:color-mix(in srgb, var(--accent) 14%, transparent);color:var(--text);border-radius:999px;align-items:center;gap:6px;padding:3px 6px 3px 10px;font-size:12px;font-weight:600;display:inline-flex}.ws-intg__chip-remove{width:16px;height:16px;color:var(--muted);cursor:pointer;background:0 0;border:0;border-radius:50%;justify-content:center;align-items:center;font-size:13px;line-height:1;display:inline-flex}.ws-intg__chip-remove:hover{color:var(--text);background:#7f7f7f2e}.ws-intg__member-results{border:1px solid var(--line);background:var(--surface);border-radius:8px;flex-direction:column;gap:2px;max-height:220px;margin:6px 0 0;padding:4px;list-style:none;display:flex;overflow-y:auto}.ws-intg__member-result{text-align:left;cursor:pointer;width:100%;color:inherit;background:0 0;border:0;border-radius:6px;align-items:center;gap:8px;padding:7px 10px;font-size:13px;display:flex}.ws-intg__member-result:hover{background:var(--hover,#7f7f7f14)}.ws-intg__toggle{cursor:pointer;align-items:flex-start;gap:10px;display:flex}.ws-intg__toggle input[type=checkbox]{flex-shrink:0;margin-top:3px}.ws-intg__toggle>span{flex-direction:column;gap:2px;display:flex}.ws-intg__panel{border:1px solid var(--line);background:var(--surface);border-radius:8px;flex-direction:column;gap:12px;padding:14px 16px;display:flex}.ws-intg__panel-header{flex-wrap:wrap;justify-content:space-between;align-items:flex-start;gap:16px;display:flex}.ws-intg__panel-title{color:var(--text-strong,var(--text));margin:0 0 3px;font-size:13px;font-weight:600}.ws-intg__panel-hint{color:var(--muted);max-width:560px;margin:0;font-size:12.5px;line-height:1.45}.ws-intg__panel-empty{color:var(--muted);margin:0;font-size:12.5px}.ws-intg__inline-form{border:1px dashed var(--line);border-radius:8px;flex-direction:column;gap:12px;padding:14px;display:flex}.ws-intg__item-list{flex-direction:column;margin:0;padding:0;list-style:none;display:flex}.ws-intg__item-row{border-bottom:1px solid var(--line);justify-content:space-between;align-items:flex-start;gap:14px;padding:11px 0;display:flex}.ws-intg__item-row:last-child{border-bottom:0}.ws-intg__item-row--stacked{flex-direction:column;align-items:stretch}.ws-intg__item-top{justify-content:space-between;align-items:flex-start;gap:14px;display:flex}.ws-intg__item-main{flex-direction:column;gap:4px;min-width:0;display:flex}.ws-intg__item-name{color:var(--text-strong,var(--text));font-size:13.5px;font-weight:600}.ws-intg__item-meta{color:var(--muted);overflow-wrap:anywhere;font-size:12px}.ws-intg__url{font-family:var(--mono,ui-monospace, monospace);font-size:11.5px}.ws-intg__item-actions{flex-wrap:wrap;flex-shrink:0;justify-content:flex-end;align-items:center;gap:8px;display:flex}.ws-intg__type-chips{flex-wrap:wrap;gap:5px;display:flex}.ws-intg__secret{border:1px solid color-mix(in srgb, var(--warn) 45%, var(--line));background:color-mix(in srgb, var(--warn) 7%, transparent);border-radius:8px;flex-direction:column;gap:6px;margin-top:6px;padding:10px 12px;display:flex}.ws-intg__secret-label{text-transform:uppercase;letter-spacing:.05em;color:var(--muted);font-size:11px;font-weight:700}.ws-intg__secret-row{align-items:center;gap:8px;display:flex}.ws-intg__secret-row .ws-bots__reveal-input{flex:1;min-width:0}.ws-intg__confirm{border:1px solid color-mix(in srgb, var(--danger,#d33) 40%, var(--line));background:color-mix(in srgb, var(--danger,#d33) 6%, transparent);border-radius:8px;flex-direction:column;gap:12px;padding:14px 16px;display:flex}.ws-intg__confirm-text{color:var(--text);margin:0;font-size:13px;line-height:1.5}.ws-intg__event-grid{grid-template-columns:repeat(auto-fill,minmax(230px,1fr));gap:6px;margin-top:10px;display:grid}.ws-intg__event-option{border:1px solid var(--line);cursor:pointer;border-radius:6px;align-items:center;gap:8px;padding:7px 10px;font-size:12px;display:flex}.ws-intg__event-option.is-active{border-color:var(--accent);background:color-mix(in srgb, var(--accent) 8%, transparent)}.ws-intg__deliveries{border-top:1px dashed var(--line);flex-direction:column;gap:8px;padding-top:10px;display:flex}.ws-intg__deliveries-scroll{border:1px solid var(--line);border-radius:8px;max-height:420px;overflow-y:auto}.ws-intg__delivery{border-bottom:1px solid var(--line)}.ws-intg__delivery:last-child{border-bottom:0}.ws-intg__delivery-row{text-align:left;cursor:pointer;width:100%;color:inherit;background:0 0;border:0;grid-template-columns:84px 1fr auto auto;align-items:center;gap:12px;padding:10px 12px;font-size:12.5px;display:grid}.ws-intg__delivery-row:hover{background:var(--hover,#7f7f7f0f)}.ws-intg__delivery-status{text-align:center;white-space:nowrap;border-radius:999px;padding:2px 8px;font-size:11px;font-weight:700}.ws-intg__delivery-status--ok{background:color-mix(in srgb, var(--delivery-accent,#2a9d5c) 16%, transparent);color:var(--delivery-accent,#2a9d5c)}.ws-intg__delivery-status--fail{background:color-mix(in srgb, var(--danger,#d33) 14%, transparent);color:var(--danger,#d33)}.ws-intg__delivery-type{text-overflow:ellipsis;white-space:nowrap;font-size:11.5px;overflow:hidden}.ws-intg__delivery-attempt,.ws-intg__delivery-time{color:var(--muted);white-space:nowrap;font-size:11.5px}.ws-intg__delivery-detail{flex-direction:column;gap:10px;padding:4px 12px 14px;display:flex}.ws-intg__delivery-block{flex-direction:column;gap:4px;display:flex}.ws-intg__delivery-block .ws-bots__reveal-snippet{max-height:260px;overflow:auto}.ws-intg__deliveries-more{justify-content:center;display:flex}.ws-intg__deliveries-retry{justify-content:space-between;align-items:center;gap:12px;display:flex}.ws-intg__section{flex-direction:column;gap:12px;margin-top:28px;display:flex}.ws-intg__section-title{color:var(--text-strong,var(--text));margin:0;font-size:15px;font-weight:600}.ws-intg__section-hint{color:var(--muted);margin:-6px 0 0;font-size:12.5px}.ws-bots__choice.is-disabled{opacity:.55;cursor:not-allowed}.settings-signout{border-top:1px solid var(--line);flex-wrap:wrap;justify-content:space-between;align-items:center;gap:16px;margin-top:24px;padding-top:20px;display:flex}.settings-signout strong{color:var(--text-strong);display:block}.settings-signout p{color:var(--muted);margin:2px 0 0;font-size:12.5px}.settings-signout .profile-actions{padding-top:0}.settings-password{border-top:1px solid var(--line);margin-top:24px;padding-top:20px}.settings-password__intro strong{color:var(--text-strong);display:block}.settings-password__intro p{color:var(--muted);margin:2px 0 0;font-size:12.5px} +@font-face{font-family:Geist Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(./geist-cyrillic-ext-wght-normal.DjL33-gN.woff2)format("woff2-variations");unicode-range:U+460-52F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Geist Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(./geist-cyrillic-wght-normal.BEAKL7Jp.woff2)format("woff2-variations");unicode-range:U+301,U+400-45F,U+490-491,U+4B0-4B1,U+2116}@font-face{font-family:Geist Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(./geist-vietnamese-wght-normal.6IgcOCM7.woff2)format("woff2-variations");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+300-301,U+303-304,U+308-309,U+323,U+329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Geist Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(./geist-latin-ext-wght-normal.DC-KSUi6.woff2)format("woff2-variations");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Geist Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(./geist-latin-wght-normal.BgDaEnEv.woff2)format("woff2-variations");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Geist Mono Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(./geist-mono-cyrillic-ext-wght-normal.X_5orZeX.woff2)format("woff2-variations");unicode-range:U+460-52F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Geist Mono Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(./geist-mono-cyrillic-wght-normal.DiZS0aHC.woff2)format("woff2-variations");unicode-range:U+301,U+400-45F,U+490-491,U+4B0-4B1,U+2116}@font-face{font-family:Geist Mono Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(./geist-mono-symbols2-wght-normal.CO5SzqOn.woff2)format("woff2-variations");unicode-range:U+2000-2001,U+2004-2008,U+200A,U+23B8-23BD,U+2500-259F}@font-face{font-family:Geist Mono Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(./geist-mono-vietnamese-wght-normal.DadHysG0.woff2)format("woff2-variations");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+300-301,U+303-304,U+308-309,U+323,U+329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Geist Mono Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(./geist-mono-latin-ext-wght-normal.Bwz-egvJ.woff2)format("woff2-variations");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Geist Mono Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(./geist-mono-latin-wght-normal.XN7g48iV.woff2)format("woff2-variations");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Bricolage Grotesque Variable;font-style:normal;font-display:swap;font-weight:200 800;src:url(./bricolage-grotesque-vietnamese-wght-normal.BUzh504Q.woff2)format("woff2-variations");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+300-301,U+303-304,U+308-309,U+323,U+329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Bricolage Grotesque Variable;font-style:normal;font-display:swap;font-weight:200 800;src:url(./bricolage-grotesque-latin-ext-wght-normal.CcLUaPy7.woff2)format("woff2-variations");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Bricolage Grotesque Variable;font-style:normal;font-display:swap;font-weight:200 800;src:url(./bricolage-grotesque-latin-wght-normal.DLoelf7F.woff2)format("woff2-variations");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}:root{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light dark;font-feature-settings:"ss01", "cv11";--font-display:"Bricolage Grotesque Variable", "Geist Variable", ui-sans-serif, system-ui, sans-serif;--font-mono:"Geist Mono Variable", ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;--rail:var(--lightningcss-light,#e2e5ea)var(--lightningcss-dark,#0b0e14);--bg:var(--lightningcss-light,#edeff2)var(--lightningcss-dark,#0e1219);--panel:var(--lightningcss-light,#f8f9fb)var(--lightningcss-dark,#141926);--panel-2:var(--lightningcss-light,#e8ebef)var(--lightningcss-dark,#1b2232);--panel-3:var(--lightningcss-light,#dde1e7)var(--lightningcss-dark,#232c3f);--surface:var(--panel-2);--hover:var(--lightningcss-light,#10151d0d)var(--lightningcss-dark,#d6e4ff0b);--hover-strong:var(--lightningcss-light,#10151d14)var(--lightningcss-dark,#d6e4ff14);--line:var(--lightningcss-light,#10151d1a)var(--lightningcss-dark,#bed2ff17);--line-strong:var(--lightningcss-light,#10151d2b)var(--lightningcss-dark,#bed2ff29);--text:var(--lightningcss-light,#232a35)var(--lightningcss-dark,#dbe2ec);--text-strong:var(--lightningcss-light,#10151d)var(--lightningcss-dark,#f4f7fb);--muted:var(--lightningcss-light,#5d6878)var(--lightningcss-dark,#8a95a8);--muted-2:var(--lightningcss-light,#8b94a3)var(--lightningcss-dark,#5c6577);--accent:var(--lightningcss-light,#0080c4)var(--lightningcss-dark,#41c6ff);--accent-hover:var(--lightningcss-light,#006aa6)var(--lightningcss-dark,#6ad3ff);--accent-contrast:var(--lightningcss-light,#fff)var(--lightningcss-dark,#061420);--accent-2:var(--lightningcss-light,#f56a1d)var(--lightningcss-dark,#ff9550);--accent-soft:var(--lightningcss-light,#0080c421)var(--lightningcss-dark,#41c6ff26);--brand-a:var(--lightningcss-light,#0072b0)var(--lightningcss-dark,#41c6ff);--brand-b:var(--lightningcss-light,#2653e8)var(--lightningcss-dark,#6d8bff);--brand-contrast:var(--lightningcss-light,#fff)var(--lightningcss-dark,#061420);--activity-accent:var(--lightningcss-light,#c07e0a)var(--lightningcss-dark,#e8b23e);--activity-accent-soft:var(--lightningcss-light,#c07e0a17)var(--lightningcss-dark,#e8b23e1a);--delivery-accent:var(--lightningcss-light,#5558d9)var(--lightningcss-dark,#8b8df2);--delivery-accent-soft:var(--lightningcss-light,#5558d90f)var(--lightningcss-dark,#8b8df214);--tool-call-bg:var(--lightningcss-light,#5558d917)var(--lightningcss-dark,#8b8df21f);--tool-call-bg-hover:var(--lightningcss-light,#5558d924)var(--lightningcss-dark,#8b8df22e);--accent-glow:0 0 0 1px color-mix(in srgb, var(--accent) 32%, transparent), 0 8px 30px -12px color-mix(in srgb, var(--accent) 48%, transparent);--success:var(--lightningcss-light,#14876a)var(--lightningcss-dark,#30c48d);--warn:#e8a33e;--danger:var(--lightningcss-light,#d13438)var(--lightningcss-dark,#ff6d68);--scrollbar:var(--lightningcss-light,#10151d2e)var(--lightningcss-dark,#bed2ff1f);--scrollbar-hover:var(--lightningcss-light,#10151d4d)var(--lightningcss-dark,#bed2ff38);--shadow:0 24px 60px -22px var(--lightningcss-light,#10151d4d)var(--lightningcss-dark,#02050ab3);--tooltip-bg:var(--lightningcss-light,#10151d)var(--lightningcss-dark,#2b3448);--tooltip-fg:var(--lightningcss-light,#f0f4fa)var(--lightningcss-dark,#f4f7fb);--key-edge:0 1px 0 var(--line-strong), 0 2px 0 var(--lightningcss-light,#10151d1a)var(--lightningcss-dark,#00000073);--key-edge-pressed:0 1px 0 var(--line-strong);--radius-sm:4px;--radius:6px;--radius-lg:10px;--radius-xl:14px;--safe-area-top:env(safe-area-inset-top,0px);--safe-area-right:env(safe-area-inset-right,0px);--safe-area-bottom:env(safe-area-inset-bottom,0px);--safe-area-left:env(safe-area-inset-left,0px);background:var(--bg);color:var(--text);font-family:Geist Variable,Inter,SF Pro Text,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif}@media (prefers-color-scheme:dark){:root{--lightningcss-light: ;--lightningcss-dark:initial}}:root[data-color-mode=light]{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light}:root[data-color-mode=dark]{--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark}[data-board=ember]{--rail:var(--lightningcss-light,#e9e1d7)var(--lightningcss-dark,#16110d);--bg:var(--lightningcss-light,#f7f3ed)var(--lightningcss-dark,#1a1511);--panel:var(--lightningcss-light,#fffaf2)var(--lightningcss-dark,#211a15);--panel-2:var(--lightningcss-light,#efe7dc)var(--lightningcss-dark,#29211a);--panel-3:var(--lightningcss-light,#e4dbcf)var(--lightningcss-dark,#322820);--hover:var(--lightningcss-light,#1020270d)var(--lightningcss-dark,#fff4eb0b);--hover-strong:var(--lightningcss-light,#10202714)var(--lightningcss-dark,#fff4eb14);--line:var(--lightningcss-light,#1020271a)var(--lightningcss-dark,#ffece014);--line-strong:var(--lightningcss-light,#10202729)var(--lightningcss-dark,#ffece024);--text:var(--lightningcss-light,#22201d)var(--lightningcss-dark,#ece4da);--text-strong:var(--lightningcss-light,#11100e)var(--lightningcss-dark,#fbf6f0);--muted:var(--lightningcss-light,#6f675f)var(--lightningcss-dark,#a4917f);--muted-2:var(--lightningcss-light,#958b80)var(--lightningcss-dark,#6f6152);--accent:var(--lightningcss-light,#c94a32)var(--lightningcss-dark,#f0714c);--accent-hover:var(--lightningcss-light,#b13c26)var(--lightningcss-dark,#ff8560);--accent-contrast:var(--lightningcss-light,#fff)var(--lightningcss-dark,#241009);--accent-2:var(--lightningcss-light,#006d77)var(--lightningcss-dark,#45b8ac);--accent-soft:var(--lightningcss-light,#c94a3224)var(--lightningcss-dark,#f0714c2b);--brand-a:var(--lightningcss-light,#c64b32)var(--lightningcss-dark,#f0714c);--brand-b:var(--lightningcss-light,#c8425a)var(--lightningcss-dark,#d84a63);--brand-contrast:var(--lightningcss-light,#fff)var(--lightningcss-dark,#11100e);--scrollbar:var(--lightningcss-light,#1020272e)var(--lightningcss-dark,#ffece01a);--scrollbar-hover:var(--lightningcss-light,#1020274d)var(--lightningcss-dark,#ffece033);--shadow:0 24px 60px -22px var(--lightningcss-light,#10202752)var(--lightningcss-dark,#080402a6)}[data-board=moss]{--rail:var(--lightningcss-light,#dfe5e0)var(--lightningcss-dark,#0a100d);--bg:var(--lightningcss-light,#ecf0ed)var(--lightningcss-dark,#0e1512);--panel:var(--lightningcss-light,#f7f9f7)var(--lightningcss-dark,#131b16);--panel-2:var(--lightningcss-light,#e6ebe7)var(--lightningcss-dark,#1a241d);--panel-3:var(--lightningcss-light,#dbe2dc)var(--lightningcss-dark,#223026);--hover:var(--lightningcss-light,#0f17120d)var(--lightningcss-dark,#d6ffe40b);--hover-strong:var(--lightningcss-light,#0f171214)var(--lightningcss-dark,#d6ffe414);--line:var(--lightningcss-light,#0f17121a)var(--lightningcss-dark,#c8ffdc17);--line-strong:var(--lightningcss-light,#0f17122b)var(--lightningcss-dark,#c8ffdc29);--text:var(--lightningcss-light,#212b24)var(--lightningcss-dark,#dbe7de);--text-strong:var(--lightningcss-light,#0f1712)var(--lightningcss-dark,#f3faf4);--muted:var(--lightningcss-light,#5c6b60)var(--lightningcss-dark,#8fa295);--muted-2:var(--lightningcss-light,#8a9a8e)var(--lightningcss-dark,#5d6e62);--accent:var(--lightningcss-light,#177a50)var(--lightningcss-dark,#3ddc97);--accent-hover:var(--lightningcss-light,#0f6a44)var(--lightningcss-dark,#63e6ab);--accent-contrast:var(--lightningcss-light,#fff)var(--lightningcss-dark,#05140c);--accent-2:var(--lightningcss-light,#d97f26)var(--lightningcss-dark,#ffab5e);--accent-soft:var(--lightningcss-light,#177a5021)var(--lightningcss-dark,#3ddc9726);--brand-a:var(--lightningcss-light,#177a50)var(--lightningcss-dark,#3ddc97);--brand-b:var(--lightningcss-light,#0e7490)var(--lightningcss-dark,#2bb3a3);--brand-contrast:var(--lightningcss-light,#fff)var(--lightningcss-dark,#05140c);--scrollbar:var(--lightningcss-light,#0f17122e)var(--lightningcss-dark,#c8ffdc1f);--scrollbar-hover:var(--lightningcss-light,#0f17124d)var(--lightningcss-dark,#c8ffdc38)}[data-board=iris]{--rail:var(--lightningcss-light,#e2e2ea)var(--lightningcss-dark,#0d0c15);--bg:var(--lightningcss-light,#eeeef4)var(--lightningcss-dark,#12111c);--panel:var(--lightningcss-light,#f8f8fb)var(--lightningcss-dark,#181726);--panel-2:var(--lightningcss-light,#e9e9f0)var(--lightningcss-dark,#201e33);--panel-3:var(--lightningcss-light,#dedee8)var(--lightningcss-dark,#2a2742);--hover:var(--lightningcss-light,#1213270d)var(--lightningcss-dark,#e0dcff0b);--hover-strong:var(--lightningcss-light,#12132714)var(--lightningcss-dark,#e0dcff14);--line:var(--lightningcss-light,#1213271a)var(--lightningcss-dark,#d2cdff17);--line-strong:var(--lightningcss-light,#1213272b)var(--lightningcss-dark,#d2cdff29);--text:var(--lightningcss-light,#26283a)var(--lightningcss-dark,#e0dff0);--text-strong:var(--lightningcss-light,#121327)var(--lightningcss-dark,#f6f5fd);--muted:var(--lightningcss-light,#61637a)var(--lightningcss-dark,#918fa9);--muted-2:var(--lightningcss-light,#9092a8)var(--lightningcss-dark,#605e78);--accent:var(--lightningcss-light,#7048d9)var(--lightningcss-dark,#a78bfa);--accent-hover:var(--lightningcss-light,#5f39c2)var(--lightningcss-dark,#bda4ff);--accent-contrast:var(--lightningcss-light,#fff)var(--lightningcss-dark,#150f26);--accent-2:var(--lightningcss-light,#d94f8a)var(--lightningcss-dark,#ff8bb3);--accent-soft:var(--lightningcss-light,#7048d921)var(--lightningcss-dark,#a78bfa29);--brand-a:var(--lightningcss-light,#7048d9)var(--lightningcss-dark,#a78bfa);--brand-b:var(--lightningcss-light,#2653e8)var(--lightningcss-dark,#6d8bff);--brand-contrast:var(--lightningcss-light,#fff)var(--lightningcss-dark,#150f26);--scrollbar:var(--lightningcss-light,#1213272e)var(--lightningcss-dark,#d2cdff1f);--scrollbar-hover:var(--lightningcss-light,#1213274d)var(--lightningcss-dark,#d2cdff38)}[data-board=signal]{--rail:var(--lightningcss-light,#e2e5ea)var(--lightningcss-dark,#0b0e14);--bg:var(--lightningcss-light,#edeff2)var(--lightningcss-dark,#0e1219);--panel:var(--lightningcss-light,#f8f9fb)var(--lightningcss-dark,#141926);--panel-2:var(--lightningcss-light,#e8ebef)var(--lightningcss-dark,#1b2232);--panel-3:var(--lightningcss-light,#dde1e7)var(--lightningcss-dark,#232c3f);--hover:var(--lightningcss-light,#10151d0d)var(--lightningcss-dark,#d6e4ff0b);--hover-strong:var(--lightningcss-light,#10151d14)var(--lightningcss-dark,#d6e4ff14);--line:var(--lightningcss-light,#10151d1a)var(--lightningcss-dark,#bed2ff17);--line-strong:var(--lightningcss-light,#10151d2b)var(--lightningcss-dark,#bed2ff29);--text:var(--lightningcss-light,#232a35)var(--lightningcss-dark,#dbe2ec);--text-strong:var(--lightningcss-light,#10151d)var(--lightningcss-dark,#f4f7fb);--muted:var(--lightningcss-light,#5d6878)var(--lightningcss-dark,#8a95a8);--muted-2:var(--lightningcss-light,#8b94a3)var(--lightningcss-dark,#5c6577);--accent:var(--lightningcss-light,#0080c4)var(--lightningcss-dark,#41c6ff);--accent-hover:var(--lightningcss-light,#006aa6)var(--lightningcss-dark,#6ad3ff);--accent-contrast:var(--lightningcss-light,#fff)var(--lightningcss-dark,#061420);--accent-2:var(--lightningcss-light,#f56a1d)var(--lightningcss-dark,#ff9550);--accent-soft:var(--lightningcss-light,#0080c421)var(--lightningcss-dark,#41c6ff26);--brand-a:var(--lightningcss-light,#0072b0)var(--lightningcss-dark,#41c6ff);--brand-b:var(--lightningcss-light,#2653e8)var(--lightningcss-dark,#6d8bff);--brand-contrast:var(--lightningcss-light,#fff)var(--lightningcss-dark,#061420)}*{box-sizing:border-box}html,body{height:100%;margin:0;padding:0}body{background:radial-gradient(1000px 600px at 0% 0%, color-mix(in srgb, var(--accent) 6%, transparent), transparent 60%), radial-gradient(900px 700px at 100% 100%, color-mix(in srgb, var(--delivery-accent) 5%, transparent), transparent 60%), var(--bg);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}button,input,textarea{font:inherit;color:inherit}code,pre,kbd,samp{font-variant-ligatures:none}button{cursor:pointer}input,textarea{background:0 0;border:0;outline:0}::-webkit-scrollbar{width:10px;height:10px}::-webkit-scrollbar-thumb{background:var(--scrollbar);background-clip:content-box;border:2px solid #0000;border-radius:999px}::-webkit-scrollbar-thumb:hover{background:var(--scrollbar-hover);background-clip:content-box}.auth-shell{min-height:100dvh;padding:calc(32px + var(--safe-area-top)) calc(32px + var(--safe-area-right)) calc(32px + var(--safe-area-bottom)) calc(32px + var(--safe-area-left));background:radial-gradient(color-mix(in srgb, var(--text) 6%, transparent) 1px, transparent 1.5px) 0 0 / 18px 18px, radial-gradient(700px 500px at 30% 20%, color-mix(in srgb, var(--brand-a) 14%, transparent), transparent 60%), radial-gradient(700px 500px at 80% 90%, color-mix(in srgb, var(--brand-b) 10%, transparent), transparent 60%), var(--bg);place-items:center;display:grid}.auth-panel{border:1px solid var(--line-strong);border-radius:var(--radius-xl);background:linear-gradient(180deg, #ffffff0a, #fff0) var(--panel);width:min(100%,440px);box-shadow:var(--key-edge), var(--shadow);gap:22px;padding:36px;display:grid}.auth-brand{align-items:center;gap:12px;display:flex}.auth-brand .mark{box-shadow:inset 0 0 0 1px #bed2ff21, var(--key-edge), 0 10px 24px -8px color-mix(in srgb, var(--brand-b) 65%, transparent)}.auth-brand .brand-text strong{color:var(--text-strong);letter-spacing:-.01em;display:block}.auth-brand .brand-text span{color:var(--muted);font-size:12px;display:block}.auth-copy{gap:8px;margin-top:8px;display:grid}.auth-copy h1{letter-spacing:-.02em;color:var(--text-strong);font-size:28px;font-family:var(--font-display);margin:0;font-weight:700}.auth-copy p{color:var(--muted);margin:0;line-height:1.5}.github-login{color:#fff;background:#0d1117;border:1px solid #2b2f36;border-radius:12px;justify-content:center;align-items:center;gap:10px;min-height:46px;font-weight:600;text-decoration:none;transition:transform 80ms,background .12s,border-color .12s;display:inline-flex}.github-login:hover{background:#161b22;border-color:#3f4750;transform:translateY(-1px)}.openclaw-login{min-height:46px;color:var(--text-strong);border:1px solid var(--muted-2);background:0 0;border-radius:12px;justify-content:center;align-items:center;gap:10px;font-weight:600;text-decoration:none;transition:transform 80ms,background .12s,border-color .12s;display:inline-flex}.openclaw-login:hover{background:color-mix(in srgb, var(--text-strong) 6%, transparent);border-color:var(--muted);transform:translateY(-1px)}.auth-form{gap:14px;display:grid}.auth-submit{border:1px solid color-mix(in srgb, var(--accent) 70%, var(--text-strong));background:var(--accent);min-height:46px;color:var(--accent-contrast);cursor:pointer;border-radius:12px;font-weight:700;transition:transform 80ms,background .12s}.auth-submit:hover:not(:disabled){background:var(--accent-hover);transform:translateY(-1px)}.auth-submit:disabled{cursor:default;opacity:.58;transform:none}.auth-submit-quiet{border-color:var(--line-strong);background:var(--panel-2);min-height:38px;color:var(--text)}.auth-submit-quiet:hover:not(:disabled){background:var(--hover)}.auth-divider{color:var(--muted-2);align-items:center;gap:12px;margin:0;font-size:12px;display:flex}.auth-divider:before,.auth-divider:after{content:"";background:var(--line);flex:1;height:1px}.auth-error{border:1px solid color-mix(in srgb, var(--danger) 45%, var(--line));border-radius:var(--radius-sm);background:color-mix(in srgb, var(--danger) 10%, transparent);color:var(--text);margin:0;padding:10px 12px;font-size:13px}.auth-magic summary{cursor:pointer;color:var(--muted);font-size:12px}.auth-magic[open] summary{margin-bottom:12px}.auth-foot{color:var(--muted-2);text-align:center;margin:0;font-size:12px}.shell{grid-template-rows:minmax(0,1fr);grid-template-columns:72px 260px minmax(0,1fr) 0;height:100dvh;min-height:100dvh;transition:grid-template-columns .22s cubic-bezier(.2,.8,.2,1);display:grid;overflow:clip}.shell.thread-open,.shell.search-open{grid-template-columns:72px 260px minmax(0,1fr) minmax(340px,28vw)}.shell.artifact-open{grid-template-columns:72px 260px minmax(0,1fr) minmax(460px,42vw)}.shell.sidebar-collapsed{grid-template-columns:72px 0 minmax(0,1fr) 0}.shell.sidebar-collapsed.thread-open,.shell.sidebar-collapsed.search-open{grid-template-columns:72px 0 minmax(0,1fr) minmax(340px,28vw)}.shell.sidebar-collapsed.artifact-open{grid-template-columns:72px 0 minmax(0,1fr) minmax(460px,42vw)}.shell>.thread,.shell>.search-results,.shell>.artifact-viewer{grid-area:1/4}.shell.desktop-shell{background:radial-gradient(color-mix(in srgb, var(--text) 7%, transparent) 1px, transparent 1.5px) 0 0 / 14px 14px, var(--rail);grid-template-rows:52px minmax(0,1fr)}.desktop-shell>.guild-rail,.desktop-shell>.sidebar{background:0 0;border-right:0}.desktop-shell>.sidebar{grid-template-rows:minmax(0,1fr) auto}@media (width<=820px){.desktop-shell>.guild-rail{background:radial-gradient(color-mix(in srgb, var(--text) 7%, transparent) 1px, transparent 1.5px) 0 0 / 14px 14px, var(--rail);border-right:1px solid var(--line)}.desktop-shell>.sidebar{background:var(--panel);border-right:1px solid var(--line)}}.desktop-shell>.timeline{border-top:1px solid var(--line);border-left:1px solid var(--line);border-top-left-radius:12px}.desktop-shell:not(.thread-open):not(.search-open):not(.artifact-open)>.timeline{border-top-right-radius:12px}.desktop-shell>.thread,.desktop-shell>.search-results,.desktop-shell>.artifact-viewer{border-top:1px solid var(--line);border-top-right-radius:12px}.desktop-shell>.desktop-titlebar{grid-area:1/1/auto/-1}.desktop-shell>.guild-rail,.desktop-shell>.sidebar,.desktop-shell>.timeline,.desktop-shell>.thread,.desktop-shell>.search-results,.desktop-shell>.artifact-viewer{grid-row:2}.desktop-shell .mobile-nav-toggle{display:none}.desktop-auth-titlebar{z-index:10;-webkit-app-region:drag;height:52px;position:fixed;inset:0 0 auto}.desktop-titlebar{z-index:8;-webkit-app-region:drag;-webkit-user-select:none;user-select:none;background:0 0;align-items:center;min-width:0;height:52px;padding:0;display:flex;position:relative}.desktop-titlebar-safe-area{-webkit-app-region:drag;align-items:center;width:100%;min-width:0;height:100%;padding:0 14px;display:flex;position:relative}.desktop-titlebar[data-platform=darwin] .desktop-titlebar-safe-area{padding-left:78px}.desktop-titlebar[data-platform=win32] .desktop-titlebar-safe-area,.desktop-titlebar[data-platform=linux] .desktop-titlebar-safe-area{left:env(titlebar-area-x,0px);width:env(titlebar-area-width,calc(100% - 148px));position:absolute}.desktop-titlebar-leading{-webkit-app-region:no-drag;align-items:center;gap:9px;min-width:0;max-width:max(150px,50% - 300px);display:flex;overflow:hidden}.desktop-titlebar button,.desktop-external-link{color:var(--muted);background:0 0;border:1px solid #0000;place-items:center;display:grid}.desktop-titlebar button:hover,.desktop-external-link:hover{border-color:var(--line);background:var(--hover-strong);color:var(--text-strong)}.desktop-external-link{border-radius:var(--radius-sm);width:28px;height:28px;color:var(--muted);flex:0 0 28px;place-items:center;text-decoration:none;display:grid}.desktop-titlebar-leading>.desktop-sidebar-toggle{border-radius:8px;width:30px;height:30px}.desktop-titlebar-workspace{min-width:36px;max-width:190px;color:var(--text-strong);font-family:var(--font-display);letter-spacing:-.01em;text-overflow:ellipsis;white-space:nowrap;border-radius:8px;flex:0 auto;padding:5px 9px;font-size:13px;font-weight:650;overflow:hidden}.desktop-titlebar-channel{min-width:30px;max-width:230px;color:var(--text-strong);font-family:var(--font-display);letter-spacing:-.01em;text-overflow:ellipsis;white-space:nowrap;flex:0 auto;margin:0;font-size:13px;font-weight:650;overflow:hidden}.desktop-titlebar-channel.with-glyph:first-letter{color:var(--accent);margin-right:1px}.desktop-titlebar-divider{flex:none}.desktop-titlebar-status{color:var(--muted);white-space:nowrap;flex:none;align-items:center;gap:6px;margin-left:auto;font-size:11px;display:inline-flex}.desktop-titlebar-status:before{content:"";background:var(--muted-2);border-radius:50%;width:7px;height:7px;animation:1.6s ease-in-out infinite presence-pulse}.desktop-titlebar-actions{-webkit-app-region:no-drag;flex:none;align-items:center;margin-left:auto;display:flex}.desktop-titlebar-actions button{border-radius:8px;width:30px;height:30px}.desktop-titlebar-actions button:disabled{cursor:wait;opacity:.55}.desktop-titlebar-actions button.active{background:var(--accent-soft);color:var(--accent)}.desktop-titlebar-actions+.desktop-titlebar-status{margin-left:8px}@media (prefers-reduced-motion:reduce){.desktop-titlebar-status:before{animation:none}}.desktop-titlebar-search.search{border-color:var(--line-strong);background:color-mix(in srgb, var(--panel-2) 84%, transparent);-webkit-app-region:no-drag;width:clamp(220px,100vw - 700px,520px);height:32px;position:absolute;left:50%;transform:translate(-50%);box-shadow:inset 0 1px #ffffff09}.desktop-titlebar-search.search:focus-within{border-color:color-mix(in srgb, var(--accent) 66%, var(--line));background:var(--panel-2);box-shadow:0 0 0 3px color-mix(in srgb, var(--accent) 13%, transparent)}.timeline{background:var(--bg);isolation:isolate;flex-direction:column;min-width:0;display:flex;overflow:hidden}.timeline>*{flex-shrink:0;min-width:0}.timeline>.messages{flex:1 1 0;min-height:0}.topbar{border-bottom:1px solid var(--line);background:linear-gradient(180deg, #ffffff05, transparent), var(--bg);align-items:center;gap:14px;min-height:60px;padding:12px 20px;display:flex}.topbar-title{flex:1;align-items:center;gap:10px;min-width:0;display:flex}.topbar-title h1{letter-spacing:-.01em;color:var(--text-strong);font-size:16px;font-weight:650;font-family:var(--font-display);white-space:nowrap;text-overflow:ellipsis;margin:0;overflow:hidden}.topbar-title h1.with-glyph:first-letter{color:var(--accent);margin-right:1px}.topbar-divider{background:var(--line-strong);width:1px;height:18px;margin:0 6px}.topbar-meta{color:var(--muted);white-space:nowrap;text-overflow:ellipsis;margin:0;font-size:12px;overflow:hidden}.search{border-radius:var(--radius);background:var(--panel);border:1px solid var(--line);width:min(280px,30vw);height:34px;color:var(--muted);align-items:center;gap:8px;padding:0 10px;transition:border-color .12s,background .12s;display:flex}.search:focus-within{border-color:var(--accent);background:var(--panel-2);color:var(--text)}.search input{min-width:0;height:100%;color:var(--text);flex:1}.search input::placeholder{color:var(--muted)}.search-clear{background:var(--panel-3);width:18px;height:18px;color:var(--muted);border:0;border-radius:50%;place-items:center;font-size:14px;line-height:1;display:grid}.search-clear:hover{background:var(--accent);color:var(--accent-contrast)}.search-submit{background:var(--accent-soft);height:22px;color:var(--accent);font-family:var(--font-mono);letter-spacing:.06em;text-transform:uppercase;border:0;border-radius:5px;padding:0 8px;font-size:10px;font-weight:600}.search-submit:hover{background:var(--accent);color:var(--accent-contrast)}.topbar-actions{align-items:center;gap:6px;display:inline-flex}.topbar-actions button,.topbar-actions a{border:1px solid var(--line-strong);border-radius:var(--radius);background:var(--panel);width:32px;height:32px;color:var(--muted);box-shadow:var(--key-edge);place-items:center;text-decoration:none;transition:background .12s,color .12s,border-color .12s,box-shadow .12s,transform 80ms;display:grid}.topbar-actions button:hover,.topbar-actions a:hover,.topbar-actions button.active{background:var(--accent-soft);border-color:color-mix(in srgb, var(--accent) 55%, var(--line-strong));color:var(--accent)}.topbar-actions button:active,.topbar-actions a:active{box-shadow:var(--key-edge-pressed);transform:translateY(1px)}.notif-toggle{width:28px;height:28px;color:var(--muted);cursor:pointer;background:0 0;border:0;border-radius:6px;justify-content:center;align-items:center;margin-left:4px;display:inline-flex}.notif-toggle:hover{background:var(--accent-soft);color:var(--accent)}@keyframes pulse{0%,to{opacity:1}50%{opacity:.5}}.search-results{border-left:1px solid var(--line);background:var(--panel);opacity:1;grid-template-rows:auto auto minmax(0,1fr);min-width:0;transition:opacity .18s,transform .22s cubic-bezier(.2,.8,.2,1);display:grid;overflow:hidden;transform:translate(0)}.search-results.covered{opacity:0;pointer-events:none}.search-results-head{border-bottom:1px solid var(--line);background:linear-gradient(180deg, #ffffff05, transparent), var(--panel);justify-content:space-between;align-items:center;min-height:60px;padding:10px 16px;display:flex}.search-results-head>div{min-width:0}.search-results-head p{color:var(--muted);font-family:var(--font-mono);letter-spacing:0;text-transform:uppercase;margin:0 0 2px;font-size:10px;font-weight:600}.search-results-head strong{color:var(--text-strong);text-overflow:ellipsis;white-space:nowrap;font-size:14px;display:block;overflow:hidden}.search-results-head button{background:var(--panel-2);width:30px;height:30px;color:var(--muted);border:0;border-radius:50%;flex:none;place-items:center;font-size:19px;line-height:1;display:grid}.search-results-head button:hover{background:var(--hover);color:var(--text)}.search-results-summary{color:var(--muted);padding:12px 16px 8px;font-size:12px;font-weight:600}.search-results-scroll{min-height:0;padding:0 8px 16px;overflow-y:auto}.search-result-list{margin:0;padding:0;list-style:none}.search-result{color:var(--text);border-radius:var(--radius);text-align:left;background:0 0;border:0;align-items:flex-start;gap:10px;width:100%;padding:10px 8px;display:flex}.search-result:hover{background:var(--hover)}.search-result.is-active{background:color-mix(in srgb, var(--accent) 10%, transparent)}.search-result:focus-visible,.search-results-head button:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}.search-result .dm-avatar{width:30px;height:30px;font-size:13px}.search-result-body{flex-direction:column;flex:1;gap:2px;min-width:0;display:flex}.search-result-meta{align-items:baseline;gap:8px;min-width:0;display:flex}.search-result-meta strong{color:var(--text-strong);text-overflow:ellipsis;white-space:nowrap;font-size:13px;overflow:hidden}.search-result-handle{color:var(--muted);text-overflow:ellipsis;white-space:nowrap;font-size:11px;overflow:hidden}.search-result-meta time{color:var(--muted);flex:none;margin-left:auto;font-size:11px}.search-result-snippet{color:var(--muted);-webkit-line-clamp:3;-webkit-box-orient:vertical;line-height:1.45;display:-webkit-box;overflow:hidden}.search-result-snippet mark{background:color-mix(in srgb, var(--accent) 22%, transparent);color:var(--text-strong);border-radius:2px;font-weight:650}.search-result-context{min-width:0;color:var(--muted-2);align-items:center;gap:10px;margin-top:1px;font-size:11px;display:flex}.search-result-context:empty{display:none}.search-result-where{text-overflow:ellipsis;white-space:nowrap;font-weight:600;overflow:hidden}.search-result-thread{color:var(--accent);flex:none;align-items:center;gap:4px;font-weight:600;display:inline-flex}.search-load-more{border:1px solid var(--line-strong);border-radius:var(--radius);background:var(--panel-2);width:calc(100% - 16px);color:var(--text);margin:8px auto 0;padding:8px 12px;font-size:12px;font-weight:600;display:block}.search-load-more:hover:not(:disabled){background:var(--hover)}.search-load-more:disabled{color:var(--muted)}.search-load-more:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}.search-end{color:var(--muted-2);text-align:center;padding:14px 8px 4px;font-size:11px}.search-foot-error{border:1px solid color-mix(in srgb, var(--danger) 40%, transparent);border-radius:var(--radius);background:color-mix(in srgb, var(--danger) 8%, transparent);color:var(--text);justify-content:space-between;align-items:center;gap:10px;margin:8px 8px 0;padding:8px 12px;font-size:12px;display:flex}.search-foot-error p{min-width:0;margin:0}.search-foot-error button{border:1px solid var(--line-strong);border-radius:var(--radius);background:var(--panel-2);color:var(--text);flex:none;padding:4px 10px;font-size:12px;font-weight:600}.search-foot-error button:hover{background:var(--hover)}.search-state{color:var(--muted);text-align:center;justify-items:center;padding:56px 24px;display:grid}.search-state-icon{border:1px solid var(--line-strong);background:var(--panel-2);width:44px;height:44px;color:var(--muted-2);border-radius:50%;place-items:center;margin-bottom:14px;font-size:23px;display:grid}.search-state strong{color:var(--text-strong);font-size:14px}.search-state p{margin:5px 0 0;font-size:12px}.search-state-loading{grid-template-columns:repeat(3,7px);justify-content:center;gap:6px}.search-state-loading span{background:var(--accent);border-radius:50%;width:7px;height:7px;animation:1.2s ease-in-out infinite pulse}.search-state-loading span:nth-child(2){animation-delay:.12s}.search-state-loading span:nth-child(3){animation-delay:.24s}.guild-rail{background:radial-gradient(color-mix(in srgb, var(--text) 7%, transparent) 1px, transparent 1.5px) 0 0 / 14px 14px, var(--rail);border-right:1px solid var(--line);flex-direction:column;align-items:center;gap:8px;padding:14px 0;display:flex;position:relative}.guild-rail .guild{background:var(--panel);width:48px;height:48px;color:var(--text);border:1px solid var(--line-strong);letter-spacing:-.02em;box-shadow:var(--key-edge);border-radius:12px;place-items:center;font-size:14px;font-weight:700;text-decoration:none;transition:border-color .12s,background .12s,transform .12s,box-shadow .12s;display:grid;position:relative}.guild-rail .guild:hover{border-color:color-mix(in srgb, var(--accent) 55%, var(--line-strong));color:var(--accent);box-shadow:var(--key-edge), 0 6px 16px -8px color-mix(in srgb, var(--accent) 45%, transparent);transform:translateY(-1px)}.guild-rail .guild:active{box-shadow:var(--key-edge-pressed);transform:translateY(1px)}.guild-rail .guild.home{background:linear-gradient(135deg, var(--brand-a), var(--brand-b));border-color:color-mix(in srgb, var(--brand-b) 55%, var(--line-strong));color:var(--brand-contrast);font-weight:800;font-family:var(--font-display)}.guild-rail .guild.home:hover{color:var(--brand-contrast);transform:translateY(-1px)}.guild-rail .guild.home>span{text-overflow:ellipsis;white-space:nowrap;max-width:100%;padding:0 4px;overflow:hidden}.guild-rail .guild.home.home--mark{border-color:color-mix(in srgb, #41c6ff 35%, var(--line-strong));background:#141926;padding:0}.guild-rail .guild.home.home--mark .keystroke-mark{border-radius:inherit;width:100%;height:100%}.guild-rail .guild.home:active{box-shadow:var(--key-edge-pressed);transform:translateY(1px)}.guild-rail .guild__image{border-radius:inherit;object-fit:cover;width:100%;height:100%;display:block}.guild-rail .guild.add{color:var(--success);border:1px dashed color-mix(in srgb, var(--success) 45%, transparent);background:0 0}.guild-rail .guild.add:hover{background:color-mix(in srgb, var(--success) 14%, transparent);color:var(--success);border-style:solid;border-color:var(--success)}.guild-divider{background:var(--line-strong);width:36px;height:1px;margin:4px 0}.guild-list{flex-direction:column;flex:auto;align-items:center;gap:8px;min-height:0;display:flex;overflow-y:auto}.guild-wrap{position:relative}.guild-wrap:before{content:"";background:var(--accent);opacity:0;border-radius:0 4px 4px 0;width:4px;height:28px;transition:opacity .14s,transform .14s;position:absolute;top:50%;left:-14px;transform:translateY(-50%)scaleY(.2)}.guild-wrap:hover:before{opacity:.6;transform:translateY(-50%)scaleY(.5)}.guild-wrap.active:before{opacity:1;transform:translateY(-50%)scaleY(1)}.guild-wrap.active .guild{background:var(--accent);border-color:color-mix(in srgb, var(--accent) 70%, var(--text-strong));color:var(--accent-contrast)}.guild-create{background:var(--panel);border:1px solid var(--line-strong);border-radius:var(--radius);box-shadow:var(--shadow);z-index:20;margin-left:8px;padding:8px;position:absolute;top:14px;left:100%}.guild-create .profile-status{max-width:200px}.guild-create input{border-radius:var(--radius-sm);background:var(--panel-2);width:200px;height:32px;color:var(--text);padding:0 10px}.sidebar{background:var(--panel);border-right:1px solid var(--line);grid-template-rows:auto minmax(0,1fr) auto;grid-template-columns:minmax(0,1fr);min-width:0;transition:opacity .16s,transform .22s cubic-bezier(.2,.8,.2,1);display:grid;overflow:hidden}.sidebar-collapsed .sidebar{opacity:0;pointer-events:none;transform:translate(-14px)}.workspace-header{border-bottom:1px solid var(--line);justify-content:space-between;align-items:center;gap:6px;min-height:60px;padding:14px 16px;display:flex}.workspace-header-icon{object-fit:cover;background:var(--panel-2);border-radius:8px;flex:none;width:28px;height:28px}.workspace-header-actions{flex-shrink:0;align-items:center;gap:4px;display:flex}.workspace-menu{min-width:0;color:inherit;text-align:left;cursor:pointer;background:0 0;border:0;border-radius:8px;flex:1;align-items:center;gap:10px;margin-left:-8px;padding:5px 8px;transition:background .12s;display:flex}.workspace-menu:hover{background:var(--panel-2)}.workspace-menu-caret{color:var(--muted);flex:none;transition:color .12s}.workspace-menu:hover .workspace-menu-caret{color:var(--text-strong)}.sidebar-collapse{background:var(--panel-2);width:30px;height:30px;color:var(--muted);border:0;border-radius:8px;place-items:center;transition:color .12s,background .12s,transform .12s;display:grid}.sidebar-collapse:hover{background:var(--panel-3);color:var(--text-strong);transform:translate(-1px)}.workspace-name{flex-direction:column;gap:2px;min-width:0;display:flex}.workspace-name strong{min-width:0;color:var(--text-strong);letter-spacing:-.01em;font-size:15px;font-family:var(--font-display);align-items:center;gap:5px;font-weight:650;display:flex}.workspace-name-label{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.workspace-name .presence{color:var(--muted);align-items:center;gap:6px;font-size:11px;display:inline-flex}.workspace-name .presence:before{content:"";background:var(--muted-2);border-radius:50%;width:7px;height:7px;animation:1.6s ease-in-out infinite presence-pulse}@keyframes presence-pulse{0%,to{opacity:.4}50%{opacity:1}}@media (prefers-reduced-motion:reduce){.workspace-name .presence:before{animation:none}}.sidebar-scroll{padding:12px 8px 16px;overflow-y:auto}.nav-section+.nav-section{margin-top:12px}.section-title{border-radius:var(--radius-sm);background:0 0;border:0;align-items:center;gap:4px;width:100%;padding:2px 4px;display:flex}.nav-section.collapsed+.nav-section{margin-top:4px}.section-toggle{border-radius:var(--radius-sm);min-width:0;min-height:28px;color:var(--muted);text-transform:uppercase;font-family:var(--font-mono);letter-spacing:.09em;text-align:left;background:0 0;border:0;flex:1;align-items:center;gap:6px;padding:4px;font-size:10px;font-weight:600;display:flex}.section-toggle:hover{color:var(--text);background:var(--hover)}.section-toggle:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}.section-toggle .caret{opacity:.7;font-size:10px;transition:transform .14s}.section-toggle[aria-expanded=false] .caret{transform:rotate(-90deg)}.section-toggle .label{text-align:left;flex:1}.section-title .add-button{background:var(--hover-strong);width:18px;height:18px;color:var(--text);border:0;border-radius:4px;flex:none;place-items:center;padding:0;font-size:14px;font-weight:700;line-height:1;display:grid}.section-title .add-button:focus-visible{outline:2px solid var(--accent);outline-offset:1px}.section-title:hover .add-button{background:var(--accent);color:var(--accent-contrast)}.nav-list{flex-direction:column;gap:1px;margin-top:4px;display:flex}.nav-list[hidden]{display:none}.channel-subgroup{gap:1px;margin-top:6px;display:grid}.channel-subgroup-toggle{border-radius:var(--radius-sm);width:100%;min-height:26px;color:var(--muted);font-family:var(--font-mono);letter-spacing:.06em;text-align:left;text-transform:uppercase;background:0 0;border:0;align-items:center;gap:6px;padding:4px 9px 4px 28px;font-size:10px;font-weight:600;display:flex}.channel-subgroup-toggle:hover,.channel-subgroup-toggle:focus-visible{background:var(--hover);color:var(--text);outline:none}.channel-subgroup-toggle .caret{opacity:.7;font-size:10px;transition:transform .14s}.channel-subgroup-toggle[aria-expanded=false] .caret{transform:rotate(-90deg)}.channel-subgroup-count{color:var(--muted-2);font-variant-numeric:tabular-nums;margin-left:auto}.channel-subgroup-list{gap:1px;display:grid}.channel-subgroup-list[hidden]{display:none}.archived-channel-group{border-top:1px solid color-mix(in srgb, var(--line) 70%, transparent);margin-top:10px;padding-top:6px}@media (prefers-reduced-motion:reduce){.section-toggle .caret{transition:none}}.sr-only{clip:rect(0, 0, 0, 0);white-space:nowrap;border:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.channel-row{border-radius:var(--radius-sm);align-items:center;display:flex;position:relative}.channel-row .nav-item{flex:1;min-width:0}.channel-row.subdued .nav-item:not(.active){color:var(--muted-2)}.managed-channel-marker{color:var(--muted-2);flex:none;place-items:center;display:inline-grid}.nav-item.active .managed-channel-marker,.nav-item:hover .managed-channel-marker{color:var(--accent)}.channel-row.reorderable .nav-item{padding-left:2px}.channel-drag-handle{border-radius:var(--radius-sm);color:var(--muted-2);cursor:grab;opacity:0;background:0 0;border:0;flex:0 0 24px;align-self:stretch;place-items:center;display:grid}.channel-row:hover .channel-drag-handle,.channel-drag-handle:focus-visible{opacity:1}.channel-drag-handle:hover{color:var(--text);background:var(--hover)}.channel-drag-handle:active{cursor:grabbing}.channel-drag-handle:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}.channel-drag-handle svg{fill:currentColor}.channel-move-menu{z-index:4;border:1px solid var(--line-strong);border-radius:var(--radius-sm);background:var(--panel);min-width:112px;box-shadow:var(--shadow);padding:4px;display:grid;position:absolute;top:calc(100% + 2px);left:0}.channel-move-menu button{color:var(--text);text-align:left;background:0 0;border:0;border-radius:4px;padding:6px 8px}.channel-move-menu button:hover:not(:disabled),.channel-move-menu button:focus-visible{background:var(--hover-strong);outline:none}.channel-move-menu button:disabled{color:var(--muted-2);cursor:default}.channel-row.dragging{opacity:.45}.channel-row.drop-before:before,.channel-row.drop-after:after{content:"";z-index:1;background:var(--accent);pointer-events:none;border-radius:1px;height:2px;position:absolute;left:4px;right:4px}.channel-row.drop-before:before{top:-1px}.channel-row.drop-after:after{bottom:-1px}@media (hover:none){.channel-drag-handle{opacity:1}}@media (prefers-reduced-motion:reduce){.channel-subgroup-toggle .caret{transition:none}}.nav-item{border-radius:var(--radius-sm);width:100%;color:var(--muted);text-align:left;background:0 0;border:0;align-items:center;gap:8px;min-height:30px;padding:6px 10px;text-decoration:none;transition:background .1s,color .1s;display:flex}.nav-item:hover{background:var(--hover);color:var(--text)}.nav-item:focus{outline:none}.nav-item:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}.nav-item.active{background:var(--accent-soft);color:var(--text-strong);box-shadow:inset 0 0 0 1px color-mix(in srgb, var(--accent) 35%, transparent)}.nav-item.has-unread{color:var(--text-strong);font-weight:600}.nav-item.has-unread .hash{color:var(--text-strong)}.unread-badge{background:var(--accent);min-width:18px;height:18px;color:var(--accent-contrast,white);text-align:center;letter-spacing:.01em;border-radius:9px;flex-shrink:0;padding:0 6px;font-size:11px;font-weight:700;line-height:18px}.nav-item .hash{color:var(--muted);text-align:center;width:14px;font-weight:600}.nav-item.active .hash{color:var(--accent)}.nav-label{white-space:nowrap;text-overflow:ellipsis;flex:1;font-size:14px;overflow:hidden}.dm-row{grid-template-columns:minmax(0,1fr) 24px;align-items:center;gap:2px;display:grid;position:relative}.dm-row .nav-item{min-width:0}.dm-actions-trigger{border-radius:var(--radius-sm);width:22px;height:22px;color:var(--muted-2);opacity:0;background:0 0;border:0;place-items:center;font-size:18px;font-weight:700;line-height:1;display:grid}.dm-row:hover .dm-actions-trigger,.dm-row:focus-within .dm-actions-trigger,.dm-row.active .dm-actions-trigger{opacity:1}.dm-actions-trigger:hover,.dm-actions-trigger:focus-visible,.dm-actions-trigger[aria-expanded=true]{background:var(--hover);color:var(--text);outline:none}.dm-actions-menu{z-index:30;border:1px solid var(--line-strong);border-radius:var(--radius-sm);background:var(--panel-2);min-width:164px;box-shadow:var(--shadow);padding:4px;position:absolute;top:28px;right:0}.dm-actions-item{width:100%;min-height:30px;color:var(--text);text-align:left;background:0 0;border:0;border-radius:6px;padding:0 10px;font-size:13px}.dm-actions-item:hover,.dm-actions-item:focus-visible{background:var(--hover);color:var(--text-strong);outline:none}.dm-undo{border:1px solid var(--line);border-radius:var(--radius-sm);background:var(--panel-2);color:var(--muted);align-items:center;gap:8px;margin:6px 8px 2px;padding:6px 8px;font-size:12px;display:flex}.dm-undo span{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}.dm-undo button{background:var(--hover);color:var(--text);border:0;border-radius:6px;padding:4px 8px;font-size:12px;font-weight:700}.dm-undo button:hover,.dm-undo button:focus-visible{background:var(--accent);color:var(--accent-contrast);outline:none}.nav-empty{color:var(--muted-2);margin:4px 8px;font-size:12px}.dm-avatar{color:#fff;background:linear-gradient(135deg, hsl(var(--hue,220deg) 70% 55%), hsl(calc(var(--hue,220deg) + 40deg) 70% 45%));border-radius:50%;flex-shrink:0;place-items:center;width:22px;height:22px;font-size:11px;font-weight:700;display:grid;overflow:hidden}.dm-avatar img,.avatar img{object-fit:cover;width:100%;height:100%;display:block}.presence-dot{background:var(--muted-2);border-radius:50%;flex-shrink:0;width:8px;height:8px}.presence-dot.active{background:var(--success);box-shadow:0 0 0 2px var(--panel)}.inline-create{grid-template-columns:minmax(0,1fr) auto;gap:6px;margin:6px 4px 2px;display:grid}.inline-create input{border-radius:var(--radius-sm);background:var(--panel-2);width:100%;min-width:0;height:30px;color:var(--text);border:1px solid var(--line);padding:0 10px}.inline-create input:focus{border-color:var(--accent);background:var(--panel-3)}.inline-create button.ghost,button.ghost{border-radius:var(--radius-sm);background:var(--panel-3);width:30px;height:30px;color:var(--muted);border:0;place-items:center;padding:0;font-size:14px;font-weight:600;display:grid}.inline-create button.ghost:hover{background:var(--accent);color:var(--accent-contrast)}.user-card{background:var(--panel-2);border-top:1px solid var(--line);width:100%;color:inherit;text-align:left;cursor:pointer;border-bottom:0;border-left:0;border-right:0;align-items:center;gap:10px;padding:10px 12px;transition:background .12s;display:flex}.user-card:hover{background:var(--panel-3)}.user-card .dm-avatar{width:28px;height:28px;font-size:12px}.user-card .user-meta{flex:1;min-width:0}.user-card .user-meta strong{color:var(--text-strong);white-space:nowrap;text-overflow:ellipsis;font-size:13px;display:block;overflow:hidden}.user-card .user-meta span{color:var(--muted);white-space:nowrap;text-overflow:ellipsis;font-size:11px;display:block;overflow:hidden}@media (width<=820px){.workspace-header{min-height:calc(60px + var(--safe-area-top));padding-top:calc(14px + var(--safe-area-top));padding-right:calc(16px + var(--safe-area-right))}.sidebar-scroll{padding-bottom:calc(16px + var(--safe-area-bottom))}.user-card{padding-bottom:calc(10px + var(--safe-area-bottom))}}.messages{flex-direction:column;display:flex;position:relative}.messages-scroll{overflow-anchor:none;opacity:1;isolation:isolate;flex-direction:column;flex:1;min-height:0;padding:0 4px;transition:opacity .14s ease-out;display:flex;overflow-y:auto}.messages-scroll:focus{outline:none}.messages.is-revealing .messages-scroll{opacity:0;pointer-events:none;transition:opacity}.messages-spacer{flex-grow:1}.history-loader{pointer-events:none;gap:14px;margin:4px 0 6px;padding:6px 18px;animation:.22s ease-out both history-loader-fade;display:grid}.history-loader--newer{margin-top:6px;margin-bottom:4px}@keyframes history-loader-fade{0%{opacity:0}to{opacity:1}}.history-loader__row{grid-template-columns:56px minmax(0,1fr);min-height:44px;display:grid}.history-loader__avatar,.history-loader__meta,.history-loader__line,.history-loader__block{background:linear-gradient(90deg, color-mix(in srgb, var(--muted-2) 16%, transparent), color-mix(in srgb, var(--muted-2) 36%, transparent), color-mix(in srgb, var(--muted-2) 16%, transparent));animation:1.4s ease-in-out infinite history-loading;animation-delay:calc(var(--history-row,0) * 80ms);background-size:220% 100%;display:block}.history-loader__avatar{border-radius:10px;width:38px;height:38px}.history-loader__body{align-content:start;gap:8px;min-width:0;padding-top:4px;display:grid}.history-loader__meta{border-radius:999px;width:min(180px,38%);height:11px}.history-loader__line{border-radius:999px;height:10px}.history-loader__line--wide{width:min(540px,72%)}.history-loader__line--mid{width:min(360px,48%)}@keyframes history-loading{0%{background-position:120% 0}to{background-position:-120% 0}}@media (prefers-reduced-motion:reduce){.history-loader{animation:none}.history-loader__avatar,.history-loader__meta,.history-loader__line,.history-loader__block{background:color-mix(in srgb, var(--muted-2) 22%, transparent);animation:none}}.unread-bar{z-index:5;background:color-mix(in srgb, var(--panel) 82%, transparent);-webkit-backdrop-filter:blur(14px)saturate(140%);border:1px solid color-mix(in srgb, var(--accent) 38%, transparent);max-width:calc(100% - 32px);height:30px;color:var(--text);letter-spacing:.005em;box-shadow:inset 0 1px 0 #ffffff14, 0 10px 24px -14px #0000008c, 0 0 0 4px color-mix(in srgb, var(--accent) 10%, transparent);opacity:1;border-radius:999px;align-items:center;gap:6px;padding:0 5px 0 14px;font-size:12px;font-weight:600;transition:opacity .16s ease-out,transform .18s cubic-bezier(.2,.8,.2,1);display:inline-flex;position:absolute;top:10px;left:50%;transform:translate(-50%)}.unread-bar.is-clearing{opacity:0;pointer-events:none;transform:translate(-50%,-6px)}.unread-bar__jump,.unread-bar__mark{color:inherit;font:inherit;cursor:pointer;background:0 0;border:0;align-items:center;gap:8px;transition:background-color .12s ease-out,color .12s ease-out;display:inline-flex}.unread-bar__jump{text-align:left;min-width:0;color:color-mix(in srgb, var(--accent) 92%, var(--text));flex:0 auto;padding:0 6px 0 0}.unread-bar__jump:before{content:"";background:var(--accent);width:7px;height:7px;box-shadow:0 0 0 0 color-mix(in srgb, var(--accent) 55%, transparent);border-radius:50%;flex-shrink:0;animation:1.8s ease-out 3 unread-bar-pulse}@keyframes unread-bar-pulse{0%{box-shadow:0 0 0 0 color-mix(in srgb, var(--accent) 55%, transparent)}70%{box-shadow:0 0 0 7px color-mix(in srgb, var(--accent) 0%, transparent)}to{box-shadow:0 0 0 0 color-mix(in srgb, var(--accent) 0%, transparent)}}@media (prefers-reduced-motion:reduce){.unread-bar__jump:before{animation:none}}.unread-bar__mark{background:color-mix(in srgb, var(--accent) 14%, transparent);height:22px;color:color-mix(in srgb, var(--accent) 90%, var(--text));letter-spacing:.01em;border-radius:999px;flex-shrink:0;padding:0 10px;font-size:11px;font-weight:600}.unread-bar__jump:hover{color:var(--accent)}.unread-bar__mark:hover{background:color-mix(in srgb, var(--accent) 24%, transparent);color:var(--accent)}.unread-bar__jump:focus-visible,.unread-bar__mark:focus-visible{outline:2px solid color-mix(in srgb, var(--accent) 70%, transparent);outline-offset:2px;border-radius:999px}.unread-bar__label{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.typing-indicator{height:0;color:var(--text-muted);opacity:0;pointer-events:none;align-items:center;gap:8px;margin-top:0;padding:0 22px;font-size:12px;transition:height .12s ease-out,margin-top .12s ease-out,opacity .12s ease-out,transform .16s cubic-bezier(.2,.8,.2,1);display:flex;overflow:hidden;transform:translateY(2px)}.typing-indicator.visible{opacity:1;height:20px;margin-top:-4px;transform:translateY(0)}.composer-dock{padding-top:20px;position:relative}.topic-filter{border-bottom:1px solid var(--line);background:color-mix(in srgb, var(--accent) 8%, var(--panel));color:var(--muted);justify-content:space-between;align-items:center;gap:12px;padding:8px 18px;font-size:13px;display:flex}.topic-filter strong{color:var(--text)}.topic-filter button,.message-topic{color:var(--accent);font:inherit;cursor:pointer;background:0 0;border:0}.topic-filter button:hover,.message-topic:hover{text-decoration:underline}.message-topic{background:color-mix(in srgb, var(--accent) 12%, transparent);border-radius:999px;margin:0 0 4px;padding:2px 7px;font-size:11px;font-weight:700;display:inline-flex}.topic-picker{border:1px solid var(--line);background:var(--panel);color:var(--muted);border-bottom:0;border-radius:10px 10px 0 0;align-items:center;gap:8px;margin:0 14px -1px;padding:7px 10px;font-size:12px;display:flex}.topic-picker select{min-width:0;max-width:min(280px,65vw);color:var(--text);font:inherit;background:0 0;border:0}.composer-dock .typing-indicator,.composer-dock .agent-responding{opacity:0;pointer-events:none;align-items:center;height:20px;margin:0;padding:0 22px;transition:opacity .12s ease-out;display:flex;position:absolute;top:0;left:0;right:0;overflow:hidden;transform:none}.composer-dock .typing-indicator.visible,.composer-dock .agent-responding.visible{opacity:1;height:20px;margin:0;transform:none}.composer-dock .typing-indicator__label{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.composer-dock:has(>.agent-responding)>.typing-indicator:not(.agent-responding){justify-content:flex-end;left:50%}.composer-dock:has(>.typing-indicator.visible:not(.agent-responding))>.agent-responding{right:50%}.typing-indicator__dots{align-items:center;gap:3px;display:inline-flex}.typing-indicator__dots i{opacity:.55;background:currentColor;border-radius:50%;width:4px;height:4px;animation:1.1s ease-in-out infinite typing-dot}.typing-indicator:not(.visible) .typing-indicator__dots i{animation:none}.typing-indicator__dots i:nth-child(2){animation-delay:.15s}.typing-indicator__dots i:nth-child(3){animation-delay:.3s}@keyframes typing-dot{0%,60%,to{opacity:.35;transform:translateY(0)}30%{opacity:1;transform:translateY(-3px)}}.message-row.is-pending{opacity:.55}.message-row.is-pending .message-content,.message-row.is-pending .markdown{pointer-events:none}.message-row.is-failed{opacity:1}.message-row.is-deleted{color:var(--muted)}.message-failed{background:color-mix(in srgb, var(--danger,#d04848) 14%, transparent);color:var(--danger,#d04848);border-radius:999px;align-items:center;gap:10px;margin-top:6px;padding:4px 10px;font-size:12px;display:inline-flex}.message-failed__label{font-weight:500}.message-failed__action{color:inherit;font:inherit;cursor:pointer;background:0 0;border:1px solid;border-radius:999px;padding:2px 8px;line-height:1}.message-failed__action:hover{background:color-mix(in srgb, currentColor 12%, transparent)}.message-failed__action--ghost{border-color:color-mix(in srgb, currentColor 50%, transparent)}@media (prefers-reduced-motion:reduce){.typing-indicator{transition:opacity 80ms ease-out;transform:none}.typing-indicator.visible{transform:none}.typing-indicator__dots i{opacity:.7;animation:none}}.empty{text-align:center;align-content:center;place-items:center;gap:10px;min-height:50vh;padding:48px 24px;display:grid}.empty-icon{background:linear-gradient(135deg, var(--brand-a), var(--brand-b));border:1px solid color-mix(in srgb, var(--brand-b) 55%, var(--line-strong));width:64px;height:64px;color:var(--brand-contrast);box-shadow:var(--key-edge), 0 18px 40px -16px color-mix(in srgb, var(--brand-b) 60%, transparent);border-radius:16px;place-items:center;font-size:26px;font-weight:800;display:grid}.empty strong{color:var(--text-strong);letter-spacing:-.01em;font-size:19px;font-family:var(--font-display);overflow-wrap:anywhere;font-weight:700}.empty span{color:var(--muted);max-width:380px;line-height:1.5}.day-divider{pointer-events:none;align-items:center;gap:12px;margin:18px 18px 8px;display:flex}.day-divider:before,.day-divider:after{content:"";background:var(--line);flex:1;height:1px}.day-divider span{background:var(--bg);border:1px solid var(--line);font-family:var(--font-mono);color:var(--muted);text-transform:uppercase;letter-spacing:.07em;border-radius:999px;padding:4px 12px;font-size:10px;font-weight:600}.new-messages-divider{pointer-events:none;opacity:1;align-items:center;gap:0;margin:4px 0 2px;padding:0 18px;transition:opacity .16s ease-out,transform .18s cubic-bezier(.2,.8,.2,1);display:flex;position:relative;transform:translateY(0)}.new-messages-divider.is-clearing{opacity:0;transform:translateY(-4px)}.new-messages-divider:before{content:"";background:var(--danger,#ed4245);opacity:.9;flex:1;height:1px}.new-messages-divider span{background:var(--danger,#ed4245);color:#fff;letter-spacing:.04em;text-transform:uppercase;border-radius:3px;align-items:center;height:14px;margin-left:8px;padding:0 5px;font-size:9px;font-weight:700;display:inline-flex}.message-group{grid-template-columns:56px minmax(0,1fr);padding:8px 18px;display:grid;position:relative}.avatar{color:#fff;background:linear-gradient(135deg, hsl(var(--hue,220deg) 70% 55%), hsl(calc(var(--hue,220deg) + 40deg) 70% 45%));border-radius:10px;place-items:center;width:38px;height:38px;margin-top:2px;font-size:14px;font-weight:700;display:grid;overflow:hidden;box-shadow:0 6px 20px -10px #0009}.avatar-button{z-index:2;cursor:pointer;border:0;padding:0;transition:transform .1s,box-shadow .12s,filter .12s;position:relative}.avatar-button:hover{filter:brightness(1.05);transform:translateY(-1px);box-shadow:0 10px 24px -12px #000c}.avatar.small{border-radius:10px;width:30px;height:30px;font-size:12px}.avatar.large{border-radius:16px;width:56px;height:56px;margin:0;font-size:18px}.group-body{min-width:0}.group-body>header{align-items:baseline;gap:8px;margin-bottom:2px;display:flex}.message-group .group-body>header{margin:0 -18px 0 -56px;padding:0 18px 2px 56px}.group-body>header strong{color:var(--text-strong);letter-spacing:-.005em;font-size:14.5px;font-weight:700}.author-name{color:var(--text-strong);letter-spacing:0;background:0 0;border:0;border-radius:4px;padding:0;font-size:14.5px;font-weight:700}.author-name:hover{color:var(--accent);text-underline-offset:2px;text-decoration:underline}.author-name--static:hover{color:var(--text-strong);text-decoration:none}.group-body>header time{color:var(--muted);font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-size:10.5px}.group-body>header span{color:var(--muted);font-size:12px}.bot-chip{border:1px solid color-mix(in srgb, var(--accent) 45%, transparent);height:18px;color:var(--accent);font-family:var(--font-mono);text-transform:uppercase;letter-spacing:.05em;border-radius:4px;align-items:center;padding:0 6px;font-size:9.5px;font-weight:700;line-height:1;display:inline-flex}.bot-chip--deleted{border-color:var(--line-strong);color:var(--muted)}.message-row{border-radius:0;margin-left:-56px;margin-right:-18px;padding:1px 18px 1px 56px;transition:background 80ms;position:relative}.message-row:not(:first-child){margin-top:1px}.message-row:hover,.message-group .group-body>header:hover,.message-group .group-body>header:hover+.message-row{background:var(--hover)}.message-group .group-body>header:has(+.message-row:hover){background:var(--hover)}.message-group .group-body>header:hover+.message-row .message-actions{opacity:1;pointer-events:auto}.message-row.selected{background:var(--accent-soft)}.message-row.can-open-thread{cursor:pointer}.row-stamp{font-family:var(--font-mono);color:var(--muted-2);opacity:0;font-variant-numeric:tabular-nums;font-size:9.5px;position:absolute;top:4px;left:8px}.message-row.is-preamble{background:0 0;margin-bottom:6px;padding-top:4px;padding-bottom:4px}.message-row.is-preamble:not(.before-final-message) .message-content{border:1px solid color-mix(in srgb, var(--activity-accent) 20%, transparent);border-radius:var(--radius-lg);background:var(--activity-accent-soft);box-shadow:0 2px 0 color-mix(in srgb, var(--activity-accent) 14%, transparent);padding:10px 14px}.message-row.is-preamble-collapsed .message-content{padding-top:6px;padding-bottom:6px}.message-row.is-preamble.before-final-message{background:0 0;margin-bottom:0;padding-top:2px;padding-bottom:0}.message-row.after-preamble{margin-top:0;padding-top:0;padding-bottom:2px}.message-row.is-preamble.before-final-message:before{display:none}.message-row.is-preamble.before-final-message .message-content{border:1px solid color-mix(in srgb, var(--activity-accent) 20%, transparent);background:var(--activity-accent-soft);border-top-left-radius:var(--radius-lg);border-top-right-radius:var(--radius-lg);border-bottom:0;padding:10px 14px}.message-row.after-preamble .message-content{border:1px solid color-mix(in srgb, var(--delivery-accent) 20%, transparent);border-bottom-left-radius:var(--radius-lg);border-bottom-right-radius:var(--radius-lg);background:var(--delivery-accent-soft);box-shadow:0 2px 0 color-mix(in srgb, var(--delivery-accent) 14%, transparent);border-top:0;padding:10px 14px}.message-row.is-preamble.before-final-message.is-preamble-collapsed .message-content{background:color-mix(in srgb, var(--activity-accent) 10%, var(--panel));border-bottom:1px solid color-mix(in srgb, var(--activity-accent) 30%, transparent);padding-top:7px;padding-bottom:7px}:root[data-user-align=right] .message-group.is-self,:root[data-other-align=right] .message-group:not(.is-self){grid-template-columns:minmax(0,1fr) 56px}:root[data-user-align=right] .message-group.is-self>.avatar,:root[data-other-align=right] .message-group:not(.is-self)>.avatar{grid-area:1/2;justify-self:end}:root[data-user-align=right] .message-group.is-self>.group-body,:root[data-other-align=right] .message-group:not(.is-self)>.group-body{grid-area:1/1;min-width:0}:root[data-user-align=right] .message-group.is-self .group-body>header,:root[data-other-align=right] .message-group:not(.is-self) .group-body>header{justify-content:flex-end;margin:0 -56px 0 -18px;padding:0 56px 2px 18px}:root[data-user-align=right] .message-group.is-self .message-row,:root[data-other-align=right] .message-group:not(.is-self) .message-row{margin-left:-18px;margin-right:-56px;padding-left:18px;padding-right:56px}:root[data-user-align=right] .message-group.is-self .message-content,:root[data-other-align=right] .message-group:not(.is-self) .message-content{text-align:right;margin-left:auto}:root[data-user-align=right] .message-group.is-self .markdown,:root[data-other-align=right] .message-group:not(.is-self) .markdown{text-align:right}:root:not([data-message-layout=outlined])[data-user-align=right] .message-group.is-self .markdown ul,:root:not([data-message-layout=outlined])[data-user-align=right] .message-group.is-self .markdown ol,:root:not([data-message-layout=outlined])[data-other-align=right] .message-group:not(.is-self) .markdown ul,:root:not([data-message-layout=outlined])[data-other-align=right] .message-group:not(.is-self) .markdown ol{padding-left:0;padding-right:0;list-style-position:inside}:root:not([data-message-layout=outlined])[data-user-align=right] .message-group.is-self .markdown li>ul,:root:not([data-message-layout=outlined])[data-user-align=right] .message-group.is-self .markdown li>ol,:root:not([data-message-layout=outlined])[data-other-align=right] .message-group:not(.is-self) .markdown li>ul,:root:not([data-message-layout=outlined])[data-other-align=right] .message-group:not(.is-self) .markdown li>ol{padding-left:0;padding-right:22px}:root:not([data-message-layout=outlined])[data-user-align=right] .message-group.is-self .markdown li>p:first-child,:root:not([data-message-layout=outlined])[data-other-align=right] .message-group:not(.is-self) .markdown li>p:first-child{display:inline}:root:not([data-message-layout=outlined])[data-user-align=right] .message-group.is-self .markdown blockquote,:root:not([data-message-layout=outlined])[data-other-align=right] .message-group:not(.is-self) .markdown blockquote{border-left:0;border-right:3px solid var(--accent);padding-left:0;padding-right:12px}:root[data-user-align=right] .message-group.is-self .attachment-grid,:root[data-other-align=right] .message-group:not(.is-self) .attachment-grid{margin-left:auto}.preamble-contract{gap:7px;min-width:0;display:grid}.preamble-toggle{width:100%;min-height:20px;color:var(--activity-accent);font:inherit;text-align:left;cursor:pointer;background:0 0;border:0;grid-template-columns:auto auto auto minmax(0,1fr);align-items:center;gap:7px;padding:0;display:grid}.preamble-chevron{color:var(--activity-accent);font-size:10px;transition:transform .12s}.preamble-chevron.open{transform:rotate(90deg)}.preamble-state,.preamble-action{line-height:1}.preamble-state{border:1px solid color-mix(in srgb, var(--activity-accent) 30%, transparent);height:17px;color:var(--activity-accent);text-transform:uppercase;letter-spacing:.03em;border-radius:999px;align-items:center;padding:0 7px;font-size:9.5px;font-weight:750;display:inline-flex}.preamble-state.is-live{border-color:color-mix(in srgb, var(--activity-accent) 55%, transparent);animation:1.6s ease-in-out infinite preamble-live-pulse}@keyframes preamble-live-pulse{0%,to{opacity:1}50%{opacity:.45}}@media (prefers-reduced-motion:reduce){.preamble-state.is-live{animation:none}}.preamble-action{min-width:0;color:var(--muted);text-overflow:ellipsis;white-space:nowrap;font-size:11px;font-weight:600;overflow:hidden}.preamble-body{color:var(--muted);overflow-wrap:anywhere;word-break:break-word;min-width:0}.preamble-flow{gap:7px;min-width:0;padding-left:17px;display:grid}.preamble-tool{--tool-accent:var(--activity-accent);background:var(--tool-call-bg);border-radius:7px;min-width:0;overflow:hidden}.preamble-tool-summary{width:100%;min-width:0;font:inherit;text-align:left;cursor:pointer;background:0 0;border:0;align-items:baseline;gap:7px;padding:4px 9px;line-height:1.5;display:flex}.preamble-tool-summary:hover{background:var(--tool-call-bg-hover)}.preamble-tool-full{color:var(--muted);overflow-wrap:anywhere;word-break:break-word;gap:5px;min-width:0;padding:2px 10px 8px 27px;font-size:12px;display:grid}.preamble-tool-full-head{font-family:var(--font-mono);color:color-mix(in srgb, var(--tool-accent) 45%, var(--muted));font-size:11px;font-weight:600}.preamble-tool-full-body{min-width:0}.preamble-tool-full pre{white-space:pre-wrap;overflow-wrap:anywhere}.tool-line-chevron{color:var(--muted-2);flex-shrink:0;font-size:9px;transition:transform .12s}.tool-line-chevron.open{transform:rotate(90deg)}.tool-line-glyph{filter:saturate(.85);flex-shrink:0;font-size:11px}.tool-line-action{color:color-mix(in srgb, var(--tool-accent) 38%, var(--text));flex-shrink:0;font-size:11.5px;font-weight:600}.tool-line-name{text-overflow:ellipsis;white-space:nowrap;max-width:40%;color:color-mix(in srgb, var(--tool-accent) 55%, var(--muted));font-size:11px;font-weight:500;font-family:var(--font-mono);flex-shrink:0;overflow:hidden}.tool-line-detail{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--muted);font-size:11px;font-weight:400;font-family:var(--font-mono);opacity:.85;flex:auto;overflow:hidden}.message-row:hover .row-stamp{opacity:1}.message-content{min-width:0;display:flow-root}.thread-hint{min-height:22px;color:var(--muted-2);cursor:pointer;background:0 0;border:1px solid #0000;border-radius:8px;align-items:center;gap:6px;margin-top:4px;padding:3px 8px;font-size:12px;font-weight:700;line-height:1;display:inline-flex}.thread-hint:not(.has-replies):not(.is-open){display:none}.thread-hint svg{flex:none}.thread-hint time{color:var(--muted);font-variant-numeric:tabular-nums;font-size:10.5px;font-weight:500}.thread-hint.has-replies,.thread-hint.is-open{color:var(--accent)}.thread-hint.is-open{border-color:color-mix(in srgb, var(--accent) 40%, transparent);background:color-mix(in srgb, var(--accent-soft) 70%, transparent)}.thread-hint:hover{border-color:var(--line-strong);background:var(--panel)}.thread-hint:disabled{cursor:default;opacity:.45}.message-actions{opacity:0;pointer-events:none;background:var(--panel);border:1px solid var(--line-strong);box-shadow:var(--shadow);border-radius:8px;align-items:flex-start;gap:4px;padding:2px;transition:opacity .1s;display:flex;position:absolute;top:-24px;right:8px}.message-row:hover .message-actions,.message-row.selected .message-actions,.message-row.menu-open .message-actions{opacity:1;pointer-events:auto}.message-row:has(:focus-visible) .message-actions{opacity:1;pointer-events:auto}.message-row.actions-flip .message-actions{top:auto;bottom:-24px}.message-row.menu-open{z-index:6}.message-row:hover,.message-row.selected{z-index:5}.message-row:has(:focus-visible){z-index:5}.messages:has(.message-row.menu-open) .message-row:hover:not(.menu-open) .message-actions{opacity:0;pointer-events:none}.messages:has(.message-row.menu-open) .message-group .group-body>header:hover+.message-row:not(.menu-open) .message-actions{opacity:0;pointer-events:none}@media (hover:none),(pointer:coarse){:root:not([data-pointer-mode=mouse]) .message-row{-webkit-touch-callout:none}:root:not([data-pointer-mode=mouse]) .message-actions{width:1px;height:1px;box-shadow:none;opacity:1;pointer-events:auto;background:0 0;border:0;padding:0;top:1px;bottom:auto;overflow:visible;transform:none}:root:not([data-pointer-mode=mouse]) .message-actions>:not(.message-more){display:none}:root:not([data-pointer-mode=mouse]) .message-row.actions-flip .message-actions{top:1px;bottom:auto}:root:not([data-pointer-mode=mouse]) .message-actions .message-more{position:static}:root:not([data-pointer-mode=mouse]) .message-actions .message-actions-trigger{clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}:root:not([data-pointer-mode=mouse]) .message-actions .message-actions-trigger:focus-visible{clip:auto;clip-path:none;border:1px solid var(--line-strong);background:var(--panel);width:36px;height:36px;box-shadow:var(--shadow);margin:0;top:0;right:0;overflow:visible}:root:not([data-pointer-mode=mouse]) .message-row:has(.message-actions-trigger:focus-visible) .message-content{padding-right:44px}}.message-actions button{width:28px;height:28px;color:var(--muted);background:0 0;border:0;border-radius:6px;place-items:center;display:grid}.message-actions button:hover{background:var(--hover-strong);color:var(--text-strong)}.message-actions button:disabled{opacity:.45}.message-copy-status{background:var(--accent-soft);height:24px;color:var(--accent);white-space:nowrap;border-radius:5px;align-self:center;align-items:center;padding:0 6px;font-size:11px;font-weight:700;display:inline-flex}.message-copy-status.is-error{background:color-mix(in srgb, var(--danger) 10%, transparent);color:var(--danger)}.message-sheet-scrim{z-index:60;background:#05080f66;flex-direction:column;justify-content:flex-end;display:flex;position:fixed;inset:0}.message-sheet-backdrop{background:0 0;border:0;padding:0;position:absolute;inset:0}.message-sheet-scrim,.message-sheet-scrim *{-webkit-user-select:none;user-select:none;-webkit-touch-callout:none}.message-action-sheet{z-index:1;background:var(--panel);border:1px solid var(--line);max-height:calc(100dvh - 16px - env(safe-area-inset-top,0px));padding:8px 12px calc(10px + env(safe-area-inset-bottom,0px));overscroll-behavior:contain;border-bottom:0;border-radius:16px 16px 0 0;animation:.16s ease-out sheet-rise;position:relative;overflow-y:auto}@keyframes sheet-rise{0%{opacity:0;transform:translateY(24px)}to{opacity:1;transform:translateY(0)}}@media (prefers-reduced-motion:reduce){.message-action-sheet{animation:none}}.message-action-sheet .sheet-grabber{background:var(--line-strong);border-radius:999px;width:36px;height:4px;margin:0 auto 8px}.message-action-sheet .sheet-emoji-row{border-bottom:1px solid var(--line);justify-content:space-around;gap:4px;padding-bottom:8px;display:flex}.message-action-sheet .sheet-emoji-row button{background:0 0;border:0;border-radius:10px;place-items:center;width:44px;height:44px;font-size:22px;line-height:1;display:grid}.message-action-sheet .sheet-emoji-row button:active{background:var(--hover-strong)}.message-action-sheet .sheet-actions{flex-direction:column;padding-top:4px;display:flex}.message-action-sheet .sheet-actions button{width:100%;color:var(--text-strong);text-align:left;background:0 0;border:0;border-radius:8px;align-items:center;gap:12px;padding:12px 8px;font-size:15px;display:flex}.message-action-sheet .sheet-actions button:active{background:var(--hover-strong)}.message-action-sheet .sheet-actions button:disabled{opacity:.45}.message-action-sheet .sheet-actions svg{color:var(--muted);flex:none}.message-action-sheet .sheet-danger,.message-action-sheet .sheet-danger svg{color:var(--danger)}.message-action-sheet .sheet-copy-status{background:var(--accent-soft);height:22px;color:var(--accent);white-space:nowrap;border-radius:5px;align-items:center;margin-left:auto;padding:0 6px;font-size:11px;font-weight:700;display:inline-flex}.message-action-sheet .sheet-copy-status.is-error{background:color-mix(in srgb, var(--danger) 10%, transparent);color:var(--danger)}.message-action-sheet .sheet-action-error{color:var(--danger);margin:-4px 12px 4px;font-size:12px;line-height:1.35}.message-actions .message-action-react{font-size:15px;line-height:1}.message-actions .action-sep{background:var(--line);flex:none;align-self:center;width:1px;height:18px;margin:0 3px}.message-actions .picker-wrapper,.message-actions .message-more{position:relative}.message-menu{z-index:30;background:var(--panel);border:1px solid var(--line-strong);min-width:190px;box-shadow:var(--shadow);border-radius:10px;padding:5px;font-size:13px;position:absolute;top:calc(100% + 4px);right:0}.message-menu.above{top:auto;bottom:calc(100% + 4px)}.message-menu button{width:100%;height:auto;color:var(--text);font:inherit;text-align:left;cursor:pointer;background:0 0;border:0;border-radius:7px;align-items:center;gap:9px;padding:7px 10px;font-size:13px;display:flex}.message-menu button:hover{background:var(--hover-strong);color:var(--text-strong)}.message-menu button svg{color:var(--muted);flex:none}.message-menu .menu-sep{border-top:1px solid var(--line);margin:5px 4px}.message-menu .menu-danger,.message-menu .menu-danger svg{color:var(--danger)}.message-menu .menu-danger:hover{background:color-mix(in srgb, var(--danger) 10%, transparent);color:var(--danger)}.message-edit{gap:7px;width:min(100%,760px);padding:5px 0 3px;display:grid}.message-edit__textarea{border:1px solid var(--line-strong);background:color-mix(in srgb, var(--panel) 94%, var(--text) 6%);width:100%;min-height:72px;max-height:240px;color:var(--text);font:inherit;resize:vertical;box-sizing:border-box;box-shadow:inset 0 1px 1px color-mix(in srgb, var(--text) 5%, transparent);border-radius:7px;padding:9px 11px;font-size:14.5px;line-height:1.5;transition:border-color .12s,box-shadow .12s,background .12s}.message-edit__textarea:hover:not(:disabled){border-color:color-mix(in srgb, var(--line-strong) 62%, var(--text) 38%)}.message-edit__textarea:focus{border-color:var(--accent);background:var(--panel);box-shadow:inset 0 1px 1px color-mix(in srgb, var(--text) 4%, transparent), 0 0 0 3px color-mix(in srgb, var(--accent) 18%, transparent);outline:none}.message-edit__textarea:disabled{cursor:progress;opacity:.78}.message-edit__footer{flex-wrap:wrap;align-items:center;gap:6px;min-height:30px;display:flex}.message-edit__footer .message-edit__save{background:var(--accent);min-width:68px;min-height:30px;color:var(--accent-contrast);cursor:pointer;border:0;border-radius:6px;justify-content:center;align-items:center;gap:4px;padding:5px 12px;font-size:13px;font-weight:500;display:inline-flex}.message-edit__footer .message-edit__save:hover{filter:brightness(1.1)}.message-edit__footer .message-edit__save:focus-visible,.message-edit__footer .message-edit__cancel:focus-visible{outline:2px solid var(--accent);outline-offset:2px}.message-edit__footer .message-edit__save:disabled{opacity:.5;cursor:progress}.message-edit__footer .message-edit__cancel{min-height:30px;color:var(--muted);cursor:pointer;background:0 0;border:1px solid #0000;border-radius:6px;justify-content:center;align-items:center;padding:5px 10px;font-size:13px;display:inline-flex}.message-edit__footer .message-edit__cancel:hover{border-color:var(--line);background:var(--hover-strong);color:var(--text-strong)}.message-edit__error{border-left:2px solid var(--danger);background:color-mix(in srgb, var(--danger) 8%, transparent);width:fit-content;max-width:100%;color:var(--danger);border-radius:3px;margin:0;padding:5px 8px;font-size:12.5px;line-height:1.35}.message-edit__indicator{color:var(--muted);align-items:center;gap:3px;margin-left:8px;font-size:11px;display:inline-flex}.message-row.editing .message-actions{display:none}@media (width<=520px){.message-edit__footer .message-edit__save,.message-edit__footer .message-edit__cancel{flex:1 1 0}}.message-deleted{min-height:22px;color:var(--muted);align-items:center;font-size:13px;font-style:italic;display:inline-flex}.markdown{color:var(--text);overflow-wrap:anywhere;word-break:break-word;font-size:14.5px;line-height:1.5}.markdown>:first-child{margin-top:0}.markdown>:last-child{margin-bottom:0}.markdown p{margin:0}.markdown p+p,.markdown ul,.markdown ol,.markdown blockquote,.markdown pre{margin-top:6px}.markdown a{color:var(--accent);text-decoration:none}.markdown a:hover{text-decoration:underline}.message-mention{border:1px solid color-mix(in srgb, currentColor 18%, transparent);background:color-mix(in srgb, currentColor 8%, transparent);color:inherit;border-radius:4px;margin:0 1px;padding:0 3px;font-weight:600}.message-mention.is-current-user{border-color:color-mix(in srgb, var(--accent) 42%, transparent);background:color-mix(in srgb, var(--accent) 20%, transparent);color:var(--accent);font-weight:700}.markdown code{background:var(--panel-2);border:1px solid var(--line);border-radius:4px;padding:1px 5px;font-family:Geist Mono Variable,JetBrains Mono,ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:.9em}.markdown pre{background:var(--panel-2);border:1px solid var(--line);border-radius:var(--radius);padding:12px 14px;overflow-x:auto}.markdown pre code{background:0 0;border:0;padding:0}.markdown blockquote{border-left:3px solid var(--accent);color:var(--muted);margin:0;padding:4px 0 4px 12px}.markdown ul,.markdown ol{padding-left:22px}.markdown img{border-radius:var(--radius);border:1px solid var(--line);object-fit:contain;background:var(--panel);cursor:zoom-in;max-width:100%;max-height:360px;margin-top:6px}.markdown-table-scroll{-webkit-overflow-scrolling:touch;overscroll-behavior-inline:contain;max-width:100%;margin-top:6px;overflow-x:auto}.markdown-table-scroll[data-overflowing]:focus-visible{outline:2px solid var(--accent);outline-offset:2px}.markdown-table-scroll:first-child{margin-top:0}.markdown-table-scroll>table{border-collapse:collapse;border-spacing:0;width:max-content;min-width:100%;font-size:.9em}.markdown thead{background:var(--muted-2)}.markdown th,.markdown td{vertical-align:top;border:1px solid var(--line);padding:8px 12px}.markdown thead th{color:var(--text-strong);font-weight:700}.markdown tbody tr:nth-child(2n){background:color-mix(in srgb, var(--muted-2) 18%, transparent)}.markdown tbody tr:hover{background:color-mix(in srgb, var(--muted-2) 26%, transparent)}.gif-player{vertical-align:top;max-width:100%;display:inline-block;position:relative}.gif-player img{display:block}.gif-badge,.gif-replay{z-index:1;color:#fff;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);border:0;position:absolute}.gif-badge{letter-spacing:.04em;pointer-events:none;background:#0000008a;border-radius:999px;padding:4px 7px;font-size:10px;font-weight:800;bottom:9px;left:9px}.gif-replay{opacity:0;pointer-events:none;background:#0a0c12b8;border-radius:999px;place-items:center;width:30px;height:30px;font-size:16px;line-height:1;transition:opacity .13s,transform .13s,background .12s;display:grid;bottom:9px;right:9px;transform:scale(.88)}.gif-replay:hover{background:var(--accent)}.gif-player.paused .gif-replay{opacity:1;pointer-events:auto;transform:scale(1)}.gif-player.playing .gif-badge{animation:.9s ease-in-out infinite gif-breathe}@keyframes gif-breathe{0%,to{opacity:.85}50%{opacity:.45}}.attachment-grid{grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:8px;max-width:560px;margin-top:8px;display:grid}.attachment-grid.compact{grid-template-columns:minmax(0,1fr);max-width:420px}.media-tile{border:1px solid var(--line);border-radius:var(--radius-lg);isolation:isolate;text-align:left;width:100%;color:inherit;cursor:pointer;background:#0a0c12;margin:0;padding:0;text-decoration:none;transition:border-color .14s,transform .14s,box-shadow .14s;display:block;position:relative;overflow:hidden}.media-tile:hover{border-color:var(--line-strong);box-shadow:0 18px 40px -28px #000000e6}.media-tile:focus-visible{border-color:var(--line-strong);box-shadow:0 0 0 2px color-mix(in srgb, var(--accent) 35%, transparent);outline:none}.media-tile--image{cursor:zoom-in}.media-tile__open{width:100%;color:inherit;cursor:zoom-in;background:0 0;border:0;margin:0;padding:0;display:block}.media-tile__open:focus{outline:0}.media-tile__open:focus-visible+.media-tile__caption .media-tile__name{text-underline-offset:3px;text-decoration:underline;text-decoration-thickness:1px}.media-tile--video{cursor:default}.media-tile img,.media-tile video{object-fit:contain;background:#05070d;width:100%;max-height:360px;display:block}.media-tile--image img{max-height:320px}.media-tile__caption{z-index:3;opacity:0;pointer-events:none;background:linear-gradient(#0000 0%,#00000080 60%,#000000c7 100%);align-items:center;gap:8px;padding:22px 10px 8px;transition:opacity .14s;display:flex;position:absolute;inset:auto 0 0}.media-tile__caption>*{pointer-events:auto}.media-tile:hover .media-tile__caption,.media-tile:focus-within .media-tile__caption{opacity:1}.media-tile--video.is-started .media-tile__caption{display:none}.media-tile__name{color:#fff;white-space:nowrap;text-overflow:ellipsis;text-shadow:0 1px 2px #0009;flex:1;min-width:0;font-size:12px;font-weight:500;overflow:hidden}.media-tile__chip{z-index:4;color:#fff;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);background:#00000080;border:1px solid #ffffff2e;border-radius:8px;flex:none;place-items:center;width:28px;height:28px;text-decoration:none;transition:background .12s,border-color .12s,transform .12s;display:inline-grid;position:relative}.media-tile__chip:hover{background:#000000b3;border-color:#ffffff52;transform:translateY(-1px)}.media-tile__play{cursor:pointer;z-index:1;background:0 0;border:0;place-items:center;width:100%;height:auto;margin:0;padding:0;display:grid;position:absolute;inset:0 0 48px}.media-tile__play:before{content:"";opacity:.7;pointer-events:none;background:radial-gradient(#0000002e 0%,#0000000d 45%,#0000 70%);transition:opacity .16s;position:absolute;inset:0}.media-tile__play:hover:before{opacity:.9}.media-tile__play-icon{color:#fff;-webkit-backdrop-filter:blur(10px);background:#0000008c;border-radius:999px;place-items:center;width:46px;height:46px;padding-left:3px;transition:transform .2s cubic-bezier(.2,.8,.2,1),background .18s,box-shadow .2s;display:grid;position:relative;box-shadow:0 6px 20px -8px #0000008c}.media-tile__play-icon svg{filter:drop-shadow(0 1px 2px #0006)}.media-tile__play:hover .media-tile__play-icon{background:#000000b3;transform:scale(1.06);box-shadow:0 10px 28px -10px #000000a6}.media-tile__play:active .media-tile__play-icon{transition-duration:80ms;transform:scale(.97)}.media-tile__play:focus-visible{outline:none}.media-tile__play:focus-visible .media-tile__play-icon{box-shadow:0 0 0 2px #fff9,0 10px 28px -10px #000000a6}.media-tile__duration{z-index:2;color:#fff;font-variant-numeric:tabular-nums;letter-spacing:.02em;pointer-events:none;background:#000000b8;border-radius:4px;padding:2px 6px;font-size:11px;font-weight:600;position:absolute;bottom:8px;left:8px}.file-attachment{border:1px solid var(--line);border-radius:var(--radius);background:var(--panel);align-items:center;gap:10px;max-width:360px;padding:10px;display:flex}.file-attachment:hover{border-color:var(--line-strong);background:var(--panel-2)}.file-icon{background:var(--accent-soft);width:34px;height:34px;color:var(--accent);border-radius:8px;place-items:center;font-weight:800;display:grid}.file-attachment strong,.file-attachment small{display:block}.file-attachment strong{color:var(--text-strong);font-size:13px}.file-attachment small{color:var(--muted);font-size:11px}.audio-attachment,.document-attachment{border:1px solid var(--line);border-radius:var(--radius);background:var(--panel);width:min(100%,420px);overflow:hidden}.audio-attachment{gap:10px;padding:10px;display:grid}.audio-attachment__meta{align-items:center;gap:10px;min-width:0;display:flex}.audio-attachment audio{width:100%;height:36px}.document-attachment{grid-template-columns:64px minmax(0,1fr) auto;align-items:center;gap:12px;padding:10px;display:grid}.document-attachment__thumbnail{border:1px solid var(--line);background:linear-gradient(135deg, transparent 0 76%, var(--panel-3) 76% 100%), linear-gradient(180deg, #fff 0%, #f0f2f7 100%);width:64px;height:82px;color:var(--accent);letter-spacing:0;cursor:pointer;border-radius:6px;place-items:center;font-size:13px;font-weight:800;text-decoration:none;display:inline-grid;position:relative;overflow:hidden;box-shadow:0 8px 18px -16px #0009}.document-attachment__thumbnail:before,.document-attachment__thumbnail:after{content:"";background:color-mix(in srgb, var(--muted) 36%, transparent);border-radius:999px;height:2px;position:absolute;left:14px;right:14px}.document-attachment__thumbnail:before{top:48px}.document-attachment__thumbnail:after{top:56px}.document-attachment__meta{gap:5px;min-width:0;display:grid}.document-attachment__title{width:100%;min-width:0;color:var(--text-strong);white-space:nowrap;text-overflow:ellipsis;text-align:left;cursor:pointer;background:0 0;border:0;padding:0;font-size:13px;font-weight:700;text-decoration:none;overflow:hidden}.document-attachment__title:hover{text-underline-offset:3px;text-decoration:underline}.document-attachment__meta small{color:var(--muted);white-space:nowrap;font-size:11px}.document-attachment__download{width:30px;height:30px;color:var(--muted);border-radius:8px;place-items:center;text-decoration:none;transition:background .12s,color .12s;display:inline-grid}.document-attachment__download:hover{background:var(--panel-2);color:var(--text-strong)}@media (width<=520px){.message-group{grid-template-columns:44px minmax(0,1fr);padding:7px 12px}:root[data-user-align=right] .message-group.is-self,:root[data-other-align=right] .message-group:not(.is-self){grid-template-columns:minmax(0,1fr) 44px}.message-row{margin-left:-44px;margin-right:-12px;padding-left:44px;padding-right:12px}:root[data-user-align=right] .message-group.is-self .message-row,:root[data-other-align=right] .message-group:not(.is-self) .message-row{margin-left:-12px;margin-right:-44px;padding-left:12px;padding-right:44px}.message-group .group-body>header{margin-left:-44px;margin-right:-12px;padding-left:44px;padding-right:12px}:root[data-user-align=right] .message-group.is-self .group-body>header,:root[data-other-align=right] .message-group:not(.is-self) .group-body>header{margin-left:-12px;margin-right:-44px;padding-left:12px;padding-right:44px}.row-stamp{display:none}.attachment-grid,.attachment-grid.compact{grid-template-columns:minmax(0,1fr);max-width:100%}}:root[data-message-layout=outlined] .message-group .group-body{width:100%}:root[data-message-layout=outlined] .message-group .message-row{margin-left:0;margin-right:0;padding:0}:root[data-message-layout=outlined] .message-group .group-body>header{margin-left:0;margin-right:0;padding-left:0;padding-right:0}:root[data-message-layout=outlined][data-user-align=right] .message-group.is-self .message-content,:root[data-message-layout=outlined][data-other-align=right] .message-group:not(.is-self) .message-content,:root[data-message-layout=outlined][data-user-align=right] .message-group.is-self .markdown,:root[data-message-layout=outlined][data-other-align=right] .message-group:not(.is-self) .markdown{text-align:start}:root[data-message-layout=outlined][data-user-align=right] .message-group.is-self .thread-hint,:root[data-message-layout=outlined][data-other-align=right] .message-group:not(.is-self) .thread-hint{width:fit-content;margin-left:auto;display:flex}:root[data-message-layout=outlined] .message-group .row-stamp{left:-48px}:root[data-message-layout=outlined][data-user-align=right] .message-group.is-self .row-stamp,:root[data-message-layout=outlined][data-other-align=right] .message-group:not(.is-self) .row-stamp{left:auto;right:-48px}:root[data-message-layout=outlined] .message-group .message-row:not(:first-child){margin-top:4px}:root[data-message-layout=outlined] .message-group .message-content{border-radius:var(--radius-lg);width:fit-content;max-width:min(96%,1100px);margin-top:2px;padding:10px 14px;position:relative}:root[data-message-layout=outlined] .message-group .message-row:not(.is-preamble):not(.after-preamble) .message-content{border:1px solid var(--line-strong)}:root[data-message-layout=outlined] .message-group.is-agent .message-content{width:96%;max-width:1100px}:root[data-message-layout=outlined] .message-group .message-row.before-final-message+.message-row.after-preamble{margin-top:-1px}:root[data-message-layout=outlined] .message-group.is-agent .message-row.before-final-message .message-content{border-bottom-right-radius:0;border-bottom-left-radius:0}:root[data-message-layout=outlined] .message-group.is-agent .message-row.after-preamble .message-content{border-top-left-radius:0;border-top-right-radius:0}:root[data-density=compact] .message-group{grid-template-columns:42px minmax(0,1fr);padding:2px 18px}:root[data-density=compact][data-user-align=right] .message-group.is-self,:root[data-density=compact][data-other-align=right] .message-group:not(.is-self){grid-template-columns:minmax(0,1fr) 42px}:root[data-density=compact] .message-group>.avatar{border-radius:7px;width:26px;height:26px;font-size:11px}:root[data-density=compact] .group-body>header{gap:6px;margin-bottom:0}:root[data-density=compact] .message-group .group-body>header{margin-left:-42px;padding-left:42px}:root[data-density=compact][data-user-align=right] .message-group.is-self .group-body>header,:root[data-density=compact][data-other-align=right] .message-group:not(.is-self) .group-body>header{margin-left:-18px;margin-right:-42px;padding-left:18px;padding-right:42px}:root[data-density=compact] .group-body>header strong,:root[data-density=compact] .author-name{font-size:13px}:root[data-density=compact] .group-body>header time{font-size:10px}:root[data-density=compact] .message-row{margin-left:-42px;padding-left:42px}:root[data-density=compact][data-user-align=right] .message-group.is-self .message-row,:root[data-density=compact][data-other-align=right] .message-group:not(.is-self) .message-row{margin-left:-18px;margin-right:-42px;padding-left:18px;padding-right:42px}:root[data-density=compact] .markdown{font-size:13.5px;line-height:1.42}:root[data-density=compact] .reactions-bar{margin-top:2px}:root[data-density=compact][data-message-layout=outlined] .message-group .message-row{margin-left:0;padding-left:0}:root[data-density=compact][data-message-layout=outlined] .message-group .row-stamp{left:-34px}:root[data-density=compact][data-message-layout=outlined][data-user-align=right] .message-group.is-self .row-stamp,:root[data-density=compact][data-message-layout=outlined][data-other-align=right] .message-group:not(.is-self) .row-stamp{left:auto;right:-34px}@media (width<=520px){:root[data-density=compact] .message-group{padding-left:12px;padding-right:12px}}:root[data-message-layout=outlined][data-user-align=right] .message-group.is-self .message-row,:root[data-message-layout=outlined][data-other-align=right] .message-group:not(.is-self) .message-row,:root[data-message-layout=outlined][data-user-align=right] .message-group.is-self .group-body>header,:root[data-message-layout=outlined][data-other-align=right] .message-group:not(.is-self) .group-body>header{margin-left:0;margin-right:0;padding-left:0;padding-right:0}.composer{--composer-card-top:8px;--composer-overlay-gap:8px;--composer-overlay-inset-x:18px;background:var(--bg);gap:0;padding:8px 18px 6px;display:grid;position:relative}.composer-card{background:var(--panel);border:1px solid var(--line-strong);border-radius:var(--radius-lg);box-shadow:var(--key-edge);flex-direction:column;transition:border-color .12s,box-shadow .12s;display:flex;overflow:hidden}.composer:focus-within .composer-card{border-color:color-mix(in srgb, var(--accent) 55%, var(--line-strong));box-shadow:var(--key-edge), 0 0 0 3px color-mix(in srgb, var(--accent) 14%, transparent)}.composer-suggestions{left:var(--composer-overlay-inset-x);bottom:calc(100% - var(--composer-card-top) + var(--composer-overlay-gap));z-index:40;width:min(560px, calc(100% - (var(--composer-overlay-inset-x) * 2)));border:1px solid var(--line-strong);background:color-mix(in srgb, var(--panel) 97%, transparent);max-height:min(320px,45vh);box-shadow:var(--shadow);border-radius:12px;margin:0;position:absolute;overflow:hidden auto}.composer-suggestions button{border:0;border-bottom:1px solid var(--line);width:100%;min-height:48px;color:var(--text);text-align:left;background:0 0;border-radius:0;grid-template-columns:30px minmax(0,1fr) auto;align-items:center;gap:10px;padding:8px 10px;display:grid}.composer-suggestions button:last-child{border-bottom:0}.composer-suggestions button:hover,.composer-suggestions button.active{background:var(--hover-strong)}.suggestion-mark{background:var(--accent-soft);width:30px;height:30px;color:var(--accent);border-radius:8px;place-items:center;font-size:13px;font-weight:800;display:grid}.suggestion-copy{gap:2px;min-width:0;display:grid}.suggestion-copy strong,.suggestion-copy span{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.suggestion-copy strong{color:var(--text-strong);font-size:13px}.suggestion-copy span{color:var(--muted);font-size:12px}.suggestion-kind{color:var(--muted-2);text-transform:uppercase;font-size:11px;font-weight:700}.suggestion-hint{color:var(--muted);font-size:12px;font-style:normal;font-weight:500}.composer-notice{margin:0 var(--composer-overlay-inset-x,0) 6px;border:1px solid var(--line-strong);background:color-mix(in srgb, var(--panel) 97%, transparent);border-radius:10px;align-items:baseline;gap:8px;padding:7px 10px;font-size:13px;display:flex}.composer-notice__label{color:var(--muted-2);text-transform:uppercase;flex:none;font-size:11px;font-weight:700}.composer-notice--error .composer-notice__label{color:var(--danger)}.composer-notice__text{min-width:0;color:var(--text);overflow-wrap:anywhere;flex:1}.composer-notice__dismiss{width:22px;height:22px;color:var(--muted);cursor:pointer;background:0 0;border:0;border-radius:6px;flex:none;align-self:center;place-items:center;font-size:15px;line-height:1;display:grid}.composer-notice__dismiss:hover{background:var(--hover-strong);color:var(--text-strong)}.composer-toolbar{border:0;border-top:1px solid var(--line);background:color-mix(in srgb, var(--panel-2) 35%, transparent);width:100%;min-width:0;box-shadow:none;scrollbar-width:none;-webkit-overflow-scrolling:touch;border-radius:0;align-items:center;gap:2px;margin:0;padding:4px 6px;display:inline-flex;overflow:auto hidden}.composer-toolbar::-webkit-scrollbar{display:none}.composer-toolbar button{min-width:28px;height:26px;color:var(--text);opacity:.78;background:0 0;border:0;border-radius:6px;flex:none;place-items:center;font-size:11.5px;font-weight:700;transition:background .1s,color .1s,opacity .1s,transform 80ms;display:grid}.composer-toolbar button:hover{background:var(--hover-strong);color:var(--text-strong);opacity:1}.composer-toolbar button.active{background:var(--accent-soft);color:var(--accent);opacity:1}.composer-toolbar button:active{transform:translateY(1px)}.gif-picker{border:1px solid var(--line-strong);background:color-mix(in srgb, var(--panel) 96%, transparent);width:min(520px,100%);max-height:40dvh;box-shadow:var(--shadow);border-radius:16px;margin-top:8px;margin-bottom:8px;padding:10px;animation:.16s cubic-bezier(.2,.8,.2,1) picker-in;overflow-y:auto}.gif-picker-head{grid-template-columns:auto minmax(0,1fr);align-items:center;gap:10px;padding:2px 2px 10px;display:grid}.gif-picker-head strong{color:var(--text-strong);font-size:13px}.gif-picker-head input{border:1px solid var(--line);border-radius:var(--radius);background:var(--panel-2);min-width:0;height:32px;padding:0 10px}.gif-grid{grid-template-columns:repeat(3,minmax(0,1fr));gap:8px;max-height:240px;display:grid;overflow-y:auto}.gif-grid button{aspect-ratio:4/3;background:var(--panel-2);color:#fff;box-shadow:inset 0 0 0 1px var(--line);border:0;border-radius:12px;padding:0;transition:transform .12s,box-shadow .12s;position:relative;overflow:hidden}.gif-grid button:hover{box-shadow:inset 0 0 0 2px var(--accent), 0 14px 30px -22px #000c;transform:translateY(-2px)}.gif-grid img{object-fit:cover;width:100%;height:100%;display:block}.gif-grid span{text-overflow:ellipsis;white-space:nowrap;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);background:#0000008f;border-radius:999px;padding:4px 7px;font-size:10.5px;font-weight:700;position:absolute;bottom:6px;left:6px;right:6px;overflow:hidden}@keyframes picker-in{0%{opacity:0;transform:translateY(8px)scale(.98)}to{opacity:1;transform:translateY(0)scale(1)}}.composer-row{--composer-control-size:36px;--composer-line-height:22px;--composer-text-padding-block:7px;background:0 0;border:0;border-radius:0;grid-template-columns:minmax(0,1fr) auto;align-items:start;gap:4px;padding:8px 8px 4px 10px;display:grid}.composer-row:has(.composer-icon){grid-template-columns:auto minmax(0,1fr) auto}.composer:focus-within .composer-toolbar,.composer-row:focus-within{border-color:#0000}.composer-row:focus-within{box-shadow:none}.composer-icon{width:var(--composer-control-size);height:var(--composer-control-size);margin-top:calc(var(--composer-text-padding-block) + (var(--composer-line-height) - var(--composer-control-size)) / 2);color:var(--muted);cursor:pointer;border-radius:10px;align-self:start;place-items:center;transition:background .12s,color .12s;display:grid}.composer-icon:hover{background:var(--hover-strong);color:var(--text-strong)}.composer-icon input[type=file]{opacity:0;pointer-events:none;block-size:1px;inline-size:1px;position:absolute}.composer textarea,.reply-composer textarea{width:100%;height:auto;min-height:44px;max-height:50vh;padding:var(--composer-text-padding-block) 4px;resize:none;color:var(--text);line-height:var(--composer-line-height);box-sizing:border-box;align-self:start;font-size:14.5px;overflow-y:auto}.composer textarea::placeholder,.reply-composer textarea::placeholder{color:var(--muted)}.send{width:var(--composer-control-size);height:var(--composer-control-size);margin-top:calc(var(--composer-text-padding-block) + (var(--composer-line-height) - var(--composer-control-size)) / 2);border:1px solid color-mix(in srgb, var(--accent) 70%, var(--text-strong));border-radius:var(--radius);background:var(--accent);color:var(--accent-contrast);box-shadow:var(--key-edge);align-self:start;place-items:center;transition:background .12s,transform 80ms,box-shadow 80ms,opacity .12s;display:grid}.send:hover:not(:disabled){background:var(--accent-hover);transform:translateY(-1px)}.send:active:not(:disabled){box-shadow:var(--key-edge-pressed);transform:translateY(1px)}.send:disabled{background:var(--panel-3);border-color:var(--line-strong);color:var(--muted-2);cursor:not-allowed;box-shadow:none}.composer-attachment{background:var(--panel);border:1px solid var(--line);border-radius:var(--radius);color:var(--text);align-items:center;gap:8px;width:fit-content;margin-top:8px;margin-bottom:8px;padding:6px 10px;font-size:13px;display:inline-flex}.attachment-icon{background:var(--accent-soft);width:20px;height:20px;color:var(--accent);border-radius:6px;place-items:center;display:grid}.pending-image{object-fit:cover;border:1px solid var(--line);background:var(--panel-2);border-radius:7px;width:42px;height:32px}.attachment-name{text-overflow:ellipsis;white-space:nowrap;max-width:240px;overflow:hidden}.attachment-remove{width:18px;height:18px;color:var(--muted);background:0 0;border:0;border-radius:50%;font-size:14px;line-height:1}.attachment-remove:hover{background:var(--danger);color:#fff}.composer-hint{color:var(--muted-2);padding:7px 4px 0;font-size:11px}.composer-hint kbd{background:var(--panel-2);border:1px solid var(--line-strong);font-family:var(--font-mono);color:var(--text);box-shadow:0 1px 0 var(--line-strong);border-radius:4px;padding:0 5px;font-size:10.5px;display:inline-block}@media (width<=820px){.composer{padding:8px calc(14px + var(--safe-area-right)) calc(6px + var(--safe-area-bottom)) calc(14px + var(--safe-area-left))}.composer textarea,.reply-composer textarea{font-size:16px}.composer-suggestions{max-height:min(320px,42dvh)}}.thread{background:var(--panel);border-left:1px solid var(--line);opacity:0;pointer-events:none;grid-template-rows:auto minmax(0,1fr) auto;grid-template-columns:minmax(0,1fr);min-width:0;transition:opacity .18s,transform .22s cubic-bezier(.2,.8,.2,1);display:grid;overflow:hidden;transform:translate(28px)}.thread.open{opacity:1;pointer-events:auto;transform:translate(0)}.thread.covered{opacity:0;pointer-events:none}.thread>header{border-bottom:1px solid var(--line);background:linear-gradient(180deg, #ffffff05, transparent), var(--panel);align-items:center;gap:10px;min-height:60px;padding:12px 16px;display:flex}.thread>header>div{flex:1;min-width:0}.thread>header p,.thread>header strong{margin:0}.thread>header p{color:var(--muted);font-family:var(--font-mono);text-transform:uppercase;letter-spacing:.08em;text-overflow:ellipsis;white-space:nowrap;font-size:10px;font-weight:600;overflow:hidden}.thread>header strong{color:var(--text-strong);font-size:14px;display:block}.thread .thread-pin-error{color:var(--danger);margin-top:3px;font-size:11px;line-height:1.35;display:block}.thread .close{background:var(--panel-2);width:28px;height:28px;color:var(--muted);border:0;border-radius:50%;font-size:18px;line-height:1}.thread .close:hover{background:var(--panel-3);color:var(--text-strong)}.thread .thread-open-link{color:var(--accent);font-family:var(--font-mono);white-space:nowrap;flex:none;font-size:11px;font-weight:700;text-decoration:none}.thread .thread-open-link:hover{color:var(--accent-hover);text-decoration:underline}.thread .thread-open-link:focus-visible{outline:2px solid var(--accent);outline-offset:3px;border-radius:3px}.thread .thread-back{background:var(--panel-2);width:28px;height:28px;color:var(--muted);border:0;border-radius:50%;flex:none;place-items:center;display:grid}.thread .thread-back:hover{background:var(--panel-3);color:var(--text-strong)}.thread .thread-back:focus-visible,.thread .close:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}.thread-scroll{padding:12px 16px;overflow-y:auto}.thread-root{border-bottom:1px solid var(--line);grid-template-columns:38px minmax(0,1fr);gap:12px;padding-bottom:12px;display:grid}.thread-divider{align-items:center;gap:10px;margin:14px 0 10px;display:flex}.thread-divider:before,.thread-divider:after{content:"";background:var(--line);flex:1;height:1px}.thread-divider span{font-family:var(--font-mono);color:var(--muted);text-transform:uppercase;letter-spacing:.08em;font-size:10px;font-weight:600}.reply-list{flex-direction:column;gap:10px;display:flex}.reply{border-radius:var(--radius-sm);grid-template-columns:30px minmax(0,1fr);gap:10px;padding:6px;display:grid}.reply:hover{background:var(--hover)}.thread .reply-quote-btn,.thread .thread-action-btn{width:26px;height:26px;color:var(--muted);background:0 0;border:0;border-radius:6px;place-items:center;display:inline-grid}.thread .reply-quote-btn:hover,.thread .thread-action-btn:hover{background:var(--hover-strong);color:var(--text-strong)}.thread .reply-quote-btn:disabled,.thread .thread-action-btn:disabled{cursor:default;opacity:.45}.thread .thread-action-btn--danger{color:var(--danger)}.thread .thread-action-btn--danger:hover{background:color-mix(in srgb, var(--danger) 12%, transparent);color:var(--danger)}.thread .thread-more-actions{display:none}@media (hover:none),(pointer:coarse){:root:not([data-pointer-mode=mouse]) .thread .group-body>header{min-height:28px;padding-right:32px;position:relative}:root:not([data-pointer-mode=mouse]) .thread .reply-quote-btn,:root:not([data-pointer-mode=mouse]) .thread .thread-action-btn:not(.thread-more-actions){display:none}:root:not([data-pointer-mode=mouse]) .thread .thread-more-actions{clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap;width:1px;height:1px;margin:-1px;padding:0;display:inline-grid;position:absolute;top:0;right:0;overflow:hidden}:root:not([data-pointer-mode=mouse]) .thread .thread-more-actions:focus-visible{clip:auto;clip-path:none;border:1px solid var(--line-strong);background:var(--panel);width:28px;height:28px;box-shadow:var(--shadow);margin:0;overflow:visible}}.reply-composer{--composer-card-top:10px;--composer-overlay-inset-x:14px;background:var(--panel);border-top:1px solid var(--line);padding:10px 14px 14px}.reply-composer .composer-row{border-radius:0}.thread-empty{text-align:center;grid-row:span 3;align-content:center;place-items:center;gap:8px;padding:32px 24px;display:grid}.thread-icon{background:var(--panel-2);width:56px;height:56px;color:var(--muted);border-radius:16px;place-items:center;display:grid}.thread-empty strong{color:var(--text-strong);font-size:15px}.thread-empty span{color:var(--muted);max-width:260px;font-size:13px;line-height:1.5}.profile-pane{overflow-y:auto}.profile-hero{background:linear-gradient(180deg, transparent, #0000003d), linear-gradient(135deg, hsl(var(--hue,220deg) 76% 58%), hsl(calc(var(--hue,220deg) + 54deg) 74% 38%));border-bottom:1px solid var(--line);place-items:end center;min-height:210px;padding:28px 20px;display:grid}.profile-avatar{aspect-ratio:1;color:#fff;background:#ffffff2e;border-radius:16px;place-items:center;width:min(240px,70%);font-size:clamp(48px,12vw,88px);font-weight:800;display:grid;overflow:hidden;box-shadow:0 26px 60px -30px #000000e6}.profile-avatar img{object-fit:cover;width:100%;height:100%}.profile-pane-body{gap:18px;padding:18px 16px 22px;display:grid}.profile-pane-title{justify-content:space-between;align-items:flex-start;gap:12px;display:flex}.profile-pane-title h2{color:var(--text-strong);letter-spacing:0;margin:0;font-size:22px}.profile-pane-title span{color:var(--muted);margin-top:3px;font-size:13px;display:block}.profile-pane-title .bot-badge{border:1px solid color-mix(in srgb, var(--accent) 45%, transparent);min-height:20px;color:var(--accent);border-radius:999px;align-items:center;margin-top:6px;padding:0 8px;font-size:11px;font-weight:800;line-height:1;display:inline-flex}.text-action{color:var(--accent);background:0 0;border:0;border-radius:6px;padding:4px 6px;font-size:13px;font-weight:700}.text-action:hover{background:var(--accent-soft)}.profile-presence{color:var(--text);align-items:center;gap:8px;font-size:14px;display:inline-flex}.profile-actions-row{grid-template-columns:repeat(auto-fit,minmax(132px,1fr));gap:10px;display:grid}.profile-actions-row .primary-action,.profile-actions-row .ghost-action{border-radius:var(--radius);white-space:nowrap;justify-content:center;align-items:center;width:100%;min-width:0;height:48px;padding:0 16px;font-size:14px;font-weight:800;line-height:1;display:inline-flex}.moderation-actions{grid-template-columns:repeat(auto-fit,minmax(108px,1fr));gap:8px;display:grid}.moderation-actions .primary-action,.moderation-actions .ghost-action,.moderation-actions .danger-action{border-radius:var(--radius);min-height:40px;font-size:13px;font-weight:800}.danger-action{border:1px solid color-mix(in srgb, var(--danger), transparent 35%);background:color-mix(in srgb, var(--danger), transparent 86%);color:var(--danger)}.role-pill{background:var(--panel-2);color:var(--muted);text-transform:uppercase;border-radius:999px;padding:4px 8px;font-size:11px;font-weight:800}.profile-info{border-top:1px solid var(--line);gap:12px;padding-top:18px;display:grid}.profile-info header{justify-content:space-between;align-items:center;gap:10px;display:flex}.profile-info header strong{color:var(--text-strong);font-size:14px}.profile-info-row{grid-template-columns:48px minmax(0,1fr);align-items:center;gap:14px;min-height:48px;display:grid}.info-icon{background:var(--panel-2);width:48px;height:48px;color:var(--muted);border-radius:12px;justify-content:center;align-items:center;line-height:1;display:inline-flex}.info-icon svg{flex:none;display:block}.profile-info-row>div>small,.profile-info-row>div>span{display:block}.profile-info-row>div>small{color:var(--muted);font-size:12px;line-height:1.2}.profile-info-row>div>span{color:var(--text);overflow-wrap:anywhere;font-size:14px;line-height:1.3}.profile-note{color:var(--muted);margin:0;font-size:13px;line-height:1.5}@media (width<=820px){.thread{min-height:100dvh}.thread>header{min-height:calc(60px + var(--safe-area-top));padding-top:calc(12px + var(--safe-area-top));padding-right:calc(16px + var(--safe-area-right));padding-left:calc(16px + var(--safe-area-left))}.thread-scroll{padding-right:calc(16px + var(--safe-area-right));padding-left:calc(16px + var(--safe-area-left))}.reply-composer{padding-right:calc(14px + var(--safe-area-right));padding-bottom:calc(14px + var(--safe-area-bottom));padding-left:calc(14px + var(--safe-area-left))}}.thread-scroll{overflow-anchor:none}.thread-history{text-align:center;padding:8px 16px}.thread-history p{color:var(--danger);font-size:12px}.thread-history--latest{border-top:1px solid var(--line)}.thread-target{outline:2px solid var(--accent);outline-offset:-2px;border-radius:var(--radius)}.artifact-viewer{z-index:2;border-left:1px solid var(--line);background:var(--panel);opacity:0;pointer-events:none;grid-template-rows:auto minmax(0,1fr);min-width:0;transition:opacity .18s,transform .22s cubic-bezier(.2,.8,.2,1);display:grid;overflow:hidden;transform:translate(28px)}.artifact-viewer.open{opacity:1;pointer-events:auto;transform:translate(0)}.artifact-viewer__header{border-bottom:1px solid var(--line);background:color-mix(in srgb, var(--panel) 92%, var(--bg));justify-content:space-between;align-items:center;gap:16px;min-height:64px;padding:10px 12px 10px 16px;display:flex}.artifact-viewer__identity{grid-template-columns:auto minmax(0,1fr) auto;align-items:baseline;gap:5px 10px;min-width:0;display:grid}.artifact-viewer__identity span{color:var(--muted);letter-spacing:.04em;text-transform:uppercase;grid-column:1/-1;font-size:11px;font-weight:700}.artifact-viewer__identity strong{min-width:0;color:var(--text-strong);text-overflow:ellipsis;white-space:nowrap;font-size:14px;overflow:hidden}.artifact-viewer__identity small{color:var(--muted);font-variant-numeric:tabular-nums;white-space:nowrap;font-size:11px}.artifact-viewer__actions,.artifact-viewer__segmented{align-items:center;gap:4px;display:inline-flex}.artifact-viewer__actions>a,.artifact-viewer__actions>button,.artifact-viewer__segmented button,.artifact-viewer__pdf-toolbar button{border-radius:var(--radius-sm);min-width:32px;height:32px;color:var(--muted);background:0 0;border:1px solid #0000;place-items:center;padding:0 9px;text-decoration:none;display:inline-grid}.artifact-viewer__office-toolbar button,.artifact-viewer__sheet-tabs button{border-radius:var(--radius-sm);min-height:30px;color:var(--muted);background:0 0;border:1px solid #0000;padding:0 10px;font-size:11px}.artifact-viewer__actions>button{font-size:20px;line-height:1}.artifact-viewer__actions>a:hover,.artifact-viewer__actions>button:hover,.artifact-viewer__segmented button:hover,.artifact-viewer__pdf-toolbar button:hover:not(:disabled){border-color:var(--line);background:var(--hover-strong);color:var(--text-strong)}.artifact-viewer__actions :focus-visible,.artifact-viewer__pdf-toolbar button:focus-visible{outline:2px solid var(--accent);outline-offset:2px}.artifact-viewer__segmented{border:1px solid var(--line);border-radius:var(--radius);background:var(--panel-2);padding:2px}.artifact-viewer__segmented button{min-width:58px;height:28px;font-size:11px;font-weight:650}.artifact-viewer__segmented button.active{border-color:var(--line);background:var(--panel);color:var(--text-strong)}.artifact-viewer__body{background:var(--bg);min-height:0;overflow:auto}.artifact-viewer__state{min-height:100%;color:var(--muted);text-align:center;align-content:center;justify-items:center;gap:10px;padding:32px 24px;display:grid}.artifact-viewer__state strong{color:var(--text-strong);font-size:15px}.artifact-viewer__state p{max-width:34ch;margin:0;font-size:13px;line-height:1.5}.artifact-viewer__state a{border:1px solid var(--line-strong);border-radius:var(--radius-sm);background:var(--panel);min-height:36px;color:var(--text-strong);margin-top:4px;padding:8px 12px;font-size:13px;font-weight:650;text-decoration:none}.artifact-viewer__state--error svg{color:var(--danger)}.artifact-viewer__spinner{border:2px solid var(--line-strong);border-top-color:var(--accent);border-radius:50%;width:26px;height:26px;animation:.7s linear infinite artifact-spin}@keyframes artifact-spin{to{transform:rotate(360deg)}}.artifact-viewer__source{background:color-mix(in srgb, var(--bg) 90%, #090b10);width:max-content;min-width:100%;min-height:100%;color:var(--text);font-family:var(--font-mono);tab-size:2;white-space:pre;margin:0;padding:20px;font-size:12px;line-height:1.65}.artifact-viewer__source code{font:inherit}.artifact-viewer__document{border:1px solid var(--line);border-radius:var(--radius);background:var(--panel);width:min(100%,760px);min-height:calc(100% - 32px);color:var(--text);overflow-wrap:anywhere;margin:16px auto;padding:clamp(24px,5vw,56px);font-size:15px;line-height:1.65}.artifact-viewer__document>:first-child{margin-top:0}.artifact-viewer__document>:last-child{margin-bottom:0}.artifact-viewer__document h1,.artifact-viewer__document h2,.artifact-viewer__document h3{color:var(--text-strong);line-height:1.25}.artifact-viewer__document h1{font-size:28px}.artifact-viewer__document h2{margin-top:1.75em;font-size:21px}.artifact-viewer__document h3{margin-top:1.5em;font-size:17px}.artifact-viewer__document pre{border-radius:var(--radius);background:var(--panel-2);padding:14px;overflow:auto}.artifact-viewer__document code{font-family:var(--font-mono)}.artifact-viewer__document table{border-collapse:collapse;width:100%}.artifact-viewer__document th,.artifact-viewer__document td{border:1px solid var(--line-strong);text-align:left;padding:8px 10px}.artifact-viewer__document img{max-width:100%;height:auto}.artifact-viewer__document a{color:var(--accent)}.artifact-viewer__body.is-pdf{grid-template-rows:auto minmax(0,1fr);display:grid;overflow:hidden}.artifact-viewer__body.is-office{grid-template-rows:auto minmax(0,1fr) auto;display:grid;overflow:hidden}.artifact-viewer__office-toolbar,.artifact-viewer__sheet-tabs{border-bottom:1px solid var(--line);background:var(--panel);min-height:44px;color:var(--muted);font-variant-numeric:tabular-nums;justify-content:center;align-items:center;gap:4px;padding:6px 10px;font-size:11px;display:flex}.artifact-viewer__office-toolbar button:disabled{cursor:not-allowed;opacity:.4}.artifact-viewer__office-toolbar button:hover:not(:disabled),.artifact-viewer__sheet-tabs button:hover,.artifact-viewer__sheet-tabs button.active{border-color:var(--line);background:var(--hover-strong);color:var(--text-strong)}.artifact-viewer__office-toolbar button:focus-visible,.artifact-viewer__sheet-tabs button:focus-visible{outline:2px solid var(--accent);outline-offset:2px}.artifact-viewer__office-toolbar{flex-wrap:wrap}.artifact-viewer__spreadsheet{background:var(--panel);min-height:0;overflow:auto}.artifact-viewer__spreadsheet table{table-layout:fixed;border-spacing:0;border-collapse:separate;width:max-content;color:var(--text);font-size:12px}.artifact-viewer__spreadsheet th,.artifact-viewer__spreadsheet td{box-sizing:border-box;border-right:1px solid var(--line);border-bottom:1px solid var(--line);background:var(--panel);text-align:left;text-overflow:ellipsis;white-space:nowrap;width:160px;min-width:160px;max-width:160px;height:30px;padding:5px 8px;overflow:hidden}.artifact-viewer__spreadsheet thead th{z-index:2;background:var(--panel-2);color:var(--muted);text-align:center;position:sticky;top:0}.artifact-viewer__spreadsheet .row-heading{z-index:1;background:var(--panel-2);width:44px;min-width:44px;color:var(--muted);text-align:right;font-variant-numeric:tabular-nums;position:sticky;left:0}.artifact-viewer__spreadsheet thead .row-heading{z-index:3}.artifact-viewer__grid-note{border:1px solid var(--line);border-radius:var(--radius-sm);background:var(--panel-2);width:max-content;max-width:min(480px,100vw - 48px);color:var(--muted);white-space:normal;margin:16px;padding:8px 10px;font-size:12px;line-height:1.45;position:sticky;left:0}.artifact-viewer__sheet-tabs{border-top:1px solid var(--line);border-bottom:0;justify-content:flex-start;overflow-x:auto}.artifact-viewer__sheet-tabs button{flex:none}.artifact-viewer__slide-stage{align-content:center;place-items:center;gap:12px;min-height:0;padding:24px;display:grid;overflow:auto}.artifact-viewer__slide{aspect-ratio:16/9;color:#172033;background:#fff;flex-direction:column;justify-content:safe center;width:min(100%,860px);padding:48px;display:flex;overflow:auto;box-shadow:0 16px 48px -24px #000000a6}.artifact-viewer__slide h2{letter-spacing:0;margin:0 0 .7em;font-size:36px;line-height:1.15}.artifact-viewer__slide p{margin:.35em 0;font-size:20px;line-height:1.4}.artifact-viewer__office-note{color:var(--muted);margin:0;font-size:12px}@media (width<=640px){.artifact-viewer__slide{padding:28px}.artifact-viewer__slide h2{font-size:24px}.artifact-viewer__slide p{font-size:15px}}.artifact-viewer__pdf-toolbar{border-bottom:1px solid var(--line);background:var(--panel);min-height:44px;color:var(--muted);font-variant-numeric:tabular-nums;justify-content:center;align-items:center;gap:4px;padding:6px 10px;font-size:11px;display:flex}.artifact-viewer__pdf-toolbar button{min-width:30px;height:30px;font-size:11px}.artifact-viewer__pdf-toolbar button:disabled{cursor:not-allowed;opacity:.4}.artifact-viewer__toolbar-divider{background:var(--line);width:1px;height:18px;margin:0 4px}.artifact-viewer__pdf-stage{text-align:center;min-height:0;padding:24px;overflow:auto}.artifact-viewer__pdf-stage canvas{background:#fff;max-width:none;transition:opacity .12s;display:inline-block;box-shadow:0 16px 48px -24px #000000a6}.artifact-viewer__pdf-text{clip:rect(0, 0, 0, 0);white-space:nowrap;border:0;width:1px;height:1px;padding:0;position:absolute;overflow:hidden}.artifact-viewer__pdf-stage.is-rendering canvas{opacity:.55}.hljs-comment,.hljs-quote{color:var(--muted);font-style:italic}.hljs-keyword,.hljs-selector-tag,.hljs-literal,.hljs-section,.hljs-link{color:var(--accent)}.hljs-string,.hljs-title,.hljs-name,.hljs-type,.hljs-attribute,.hljs-symbol,.hljs-bullet,.hljs-addition{color:var(--success)}.hljs-number,.hljs-meta,.hljs-built_in,.hljs-builtin-name,.hljs-params{color:var(--activity-accent)}.hljs-deletion{color:var(--danger)}@media (width<=820px){.artifact-viewer{z-index:40;border-left:0;min-height:100dvh;position:fixed;inset:0}.artifact-viewer__header{min-height:calc(64px + var(--safe-area-top));padding-top:calc(10px + var(--safe-area-top));padding-right:calc(12px + var(--safe-area-right));padding-left:calc(16px + var(--safe-area-left))}.artifact-viewer__identity small{display:none}.artifact-viewer__document{border:0;border-radius:0;min-height:100%;margin:0}}@media (prefers-reduced-motion:reduce){.artifact-viewer{transition:none}.artifact-viewer__spinner{animation-duration:1.4s}}.modal-scrim{z-index:50;-webkit-backdrop-filter:blur(14px);backdrop-filter:blur(14px);background:#05080f8a;place-items:center;padding:24px;display:grid;position:fixed;inset:0}.modal-backdrop{background:0 0;border:0;position:absolute;inset:0}.modal-backdrop:focus{outline:0}.profile-modal{z-index:1;background:var(--panel);border:1px solid var(--line-strong);border-radius:var(--radius-xl);width:min(480px,100%);box-shadow:var(--key-edge), var(--shadow);animation:.15s ease-out settings-modal-fade;position:relative;overflow:hidden}.profile-modal>header{justify-content:space-between;align-items:flex-start;gap:12px;padding:18px 20px 4px;display:flex}.profile-modal>header p{color:var(--muted);font-family:var(--font-mono);text-transform:uppercase;letter-spacing:.08em;margin:0 0 4px;font-size:10px;font-weight:600}.profile-modal>header h2{color:var(--text-strong);font-family:var(--font-display);letter-spacing:-.01em;margin:0;font-size:20px;font-weight:700}.profile-modal>header>button{border:1px solid var(--line);border-radius:var(--radius-sm);background:var(--panel-2);width:28px;height:28px;color:var(--muted);flex:none;place-items:center;font-size:16px;line-height:1;display:grid}.profile-modal>header>button:hover{background:var(--panel-3);color:var(--text-strong)}.create-modal{width:min(420px,100%)}.profile-form{gap:14px;padding:20px;display:grid}.field{gap:6px;display:grid}.field span{color:var(--muted);font-size:12px;font-weight:700}.field input,.field select{border:1px solid var(--line);border-radius:var(--radius-sm);background:var(--panel-2);width:100%;height:38px;color:var(--text);padding:0 12px}.field select{cursor:pointer}.field input:focus,.field select:focus{border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-soft);outline:0}.profile-status{color:var(--success);font-size:12px}.profile-status.error{color:var(--danger)}.profile-actions{justify-content:flex-end;gap:8px;padding-top:4px;display:flex}.person-picker{border:1px solid var(--line);border-radius:var(--radius);background:var(--panel-2);gap:4px;max-height:240px;padding:4px;display:grid;overflow-y:auto}.person-choice{border-radius:var(--radius-sm);width:100%;min-height:44px;color:var(--text);text-align:left;background:0 0;border:0;grid-template-columns:32px minmax(0,1fr);align-items:center;gap:10px;padding:6px 8px;display:grid}.person-choice:hover{background:var(--hover-strong)}.person-choice .dm-avatar{width:32px;height:32px}.person-choice strong,.person-choice small{text-overflow:ellipsis;white-space:nowrap;min-width:0;display:block;overflow:hidden}.person-choice strong{color:var(--text-strong);font-size:13px}.person-choice small{color:var(--muted);font-size:12px}.person-empty{color:var(--muted);padding:10px 8px;font-size:12px}.profile-actions .ghost-action,.profile-actions .primary-action,.profile-actions .danger-action{box-sizing:border-box;border-radius:var(--radius);white-space:nowrap;min-height:44px;box-shadow:var(--key-edge);flex:none;justify-content:center;align-items:center;padding:0 14px;font-weight:700;line-height:1;transition:background .12s,box-shadow 80ms,transform 80ms;display:inline-flex}.ghost-action{border:1px solid var(--line-strong);background:var(--panel);color:var(--text)}.primary-action{border:1px solid color-mix(in srgb, var(--accent) 70%, var(--text-strong));background:var(--accent);color:var(--accent-contrast)}.profile-actions .danger-action{border:1px solid color-mix(in srgb, var(--danger) 76%, var(--text-strong));background:var(--danger);color:#fff}.ghost-action:hover{background:var(--hover)}.primary-action:hover{background:var(--accent-hover)}.profile-actions .danger-action:hover:not(:disabled){background:color-mix(in srgb, var(--danger) 86%, #000)}.profile-actions .ghost-action:disabled,.profile-actions .primary-action:disabled,.profile-actions .danger-action:disabled{cursor:default;opacity:.58}.profile-actions .ghost-action:active,.profile-actions .primary-action:active,.profile-actions .danger-action:active{box-shadow:var(--key-edge-pressed);transform:translateY(1px)}.delete-message-scrim{padding:20px}.delete-message-modal{width:min(520px,100%)}.delete-message-modal>header{padding-bottom:10px}.delete-message-content{gap:18px;padding:4px 20px 20px;display:grid}.delete-message-content>p{color:var(--text);margin:0;font-size:14px;line-height:1.5}.delete-message-preview{border:1px solid var(--line-strong);border-radius:var(--radius);background:var(--panel-2);grid-template-columns:36px minmax(0,1fr);align-items:start;gap:12px;padding:14px;display:grid}.delete-message-preview__content{min-width:0}.delete-message-preview>.avatar{border-radius:9px;width:36px;height:36px;margin:0}.delete-message-preview__meta{align-items:baseline;gap:8px;min-width:0;display:flex}.delete-message-preview__meta strong{color:var(--text-strong);text-overflow:ellipsis;white-space:nowrap;font-size:14px;overflow:hidden}.delete-message-preview__meta time{color:var(--muted);flex:none;font-size:11px}.delete-message-preview__body{max-height:128px;color:var(--text);overflow-wrap:anywhere;white-space:pre-wrap;margin-top:4px;font-size:14px;line-height:1.45;overflow:auto}.delete-message-actions{grid-template-columns:repeat(2,minmax(0,1fr));gap:10px;padding-top:0;display:grid}.delete-message-actions button{width:100%}@media (width<=520px){.delete-message-modal{width:100%}.delete-message-content,.delete-message-modal>header{padding-inline:16px}}.channel-settings-scrim{padding:20px}.channel-settings-modal{width:min(460px,100%)}.channel-settings-content{gap:18px;padding:14px 20px 20px;display:grid}.channel-settings-name{color:var(--text-strong);font-family:var(--font-display);font-size:16px;display:block}.channel-settings-content p{color:var(--muted);margin:6px 0 0;font-size:13px;line-height:1.5}.channel-settings-content .channel-settings-warning{border-left:3px solid var(--danger);background:color-mix(in srgb, var(--danger) 8%, var(--panel-2));color:var(--text);margin:0;padding:12px}.channel-settings-actions{grid-template-columns:repeat(2,minmax(0,1fr));gap:10px;padding-top:0;display:grid}.channel-settings-actions button{width:100%}.channel-settings-danger{border:1px solid color-mix(in srgb, var(--danger) 40%, var(--line-strong));border-radius:var(--radius);background:color-mix(in srgb, var(--danger) 6%, var(--panel-2));grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:12px;padding:12px;display:grid}.channel-settings-danger strong{color:var(--text-strong);font-size:14px}.channel-settings-content .channel-settings-danger p{margin-top:4px}.channel-settings-danger__actions{padding-top:0}@media (width<=520px){.channel-settings-content,.channel-settings-modal>header{padding-inline:16px}.channel-settings-danger{grid-template-columns:minmax(0,1fr)}}.delete-channel-scrim{padding:20px}.delete-channel-modal{width:min(540px,100%)}.delete-channel-modal>header p.delete-channel-eyebrow{color:var(--danger)}.delete-channel-content{gap:16px;padding:14px 20px 20px;display:grid}.delete-channel-content p{margin:0;font-size:14px;line-height:1.5}.delete-channel-warning{border:1px solid color-mix(in srgb, var(--danger) 45%, var(--line-strong));border-radius:var(--radius);background:color-mix(in srgb, var(--danger) 9%, var(--panel-2));color:var(--text-strong);padding:12px}.delete-channel-counts{border:1px solid var(--line-strong);border-radius:var(--radius);grid-template-columns:repeat(4,minmax(0,1fr));margin:0;display:grid;overflow:hidden}.delete-channel-counts>div{border-left:1px solid var(--line);background:var(--panel-2);gap:2px;padding:10px 12px;display:grid}.delete-channel-counts>div:first-child{border-left:0}.delete-channel-counts dt{color:var(--muted);font-family:var(--font-mono);letter-spacing:.08em;text-transform:uppercase;order:2;font-size:10px}.delete-channel-counts dd{color:var(--text-strong);font-family:var(--font-display);margin:0;font-size:19px;font-weight:700}.delete-channel-consequences{color:var(--text);gap:6px;margin:0;padding-left:18px;font-size:13px;line-height:1.45;display:grid}.delete-channel-consequences .is-warning{color:var(--text-strong)}.delete-channel-consequences .is-warning::marker{color:var(--warn)}.delete-channel-confirm{color:var(--text);gap:6px;font-size:13px;display:grid}.delete-channel-confirm code{border-radius:var(--radius-sm);background:var(--panel-3);color:var(--text-strong);font-family:var(--font-mono);padding:1px 6px}.delete-channel-confirm input{border:1px solid var(--line-strong);border-radius:var(--radius);background:var(--bg);min-height:40px;color:var(--text-strong);font-family:var(--font-mono);padding:0 12px;font-size:14px}.delete-channel-confirm input:focus-visible{border-color:var(--danger);box-shadow:0 0 0 3px color-mix(in srgb, var(--danger) 18%, transparent);outline:none}.delete-channel-actions{flex-wrap:wrap;padding-top:0}.delete-channel-actions>:first-child{margin-right:auto}@media (width<=520px){.delete-channel-content,.delete-channel-modal>header{padding-inline:16px}.delete-channel-counts{grid-template-columns:repeat(2,minmax(0,1fr))}.delete-channel-counts>div:nth-child(3){border-left:0}}.image-viewer-scrim{-webkit-backdrop-filter:blur(18px);backdrop-filter:blur(18px);background:#000000c7;padding:28px}.image-viewer{z-index:1;color:#fff;background:#07090f;border:1px solid #ffffff1f;border-radius:14px;grid-template-rows:auto minmax(0,1fr);width:min(1280px,100%);height:min(900px,100dvh - 56px);max-height:100%;animation:.15s cubic-bezier(.2,.8,.2,1) picker-in;display:grid;position:relative;overflow:hidden;box-shadow:0 34px 90px -34px #000000f2}.image-viewer>header{background:#ffffff0a;border-bottom:1px solid #ffffff1a;justify-content:space-between;align-items:center;gap:16px;min-height:52px;padding:10px 12px 10px 16px;display:flex}.image-viewer>header strong{color:#fff;text-overflow:ellipsis;white-space:nowrap;min-width:0;font-size:13px;overflow:hidden}.image-viewer>header div{flex-shrink:0;align-items:center;gap:8px;display:inline-flex}.image-viewer>header a{color:#fff;background:#ffffff14;border-radius:7px;align-items:center;height:30px;padding:0 10px;font-size:12px;font-weight:700;text-decoration:none;display:inline-flex}.image-viewer>header a:hover{background:#ffffff24}.image-viewer>header a:focus-visible,.image-viewer>header button:focus-visible{outline-offset:2px;outline:2px solid #fff}.image-viewer>header button{color:#ffffffc7;background:0 0;border:0;border-radius:7px;place-items:center;width:30px;height:30px;font-size:22px;line-height:1;display:grid}.image-viewer>header button:hover{color:#fff;background:#ffffff1f}.image-viewer-stage{place-items:center;min-height:0;padding:18px;display:grid}.image-viewer-stage img{object-fit:contain;background:#ffffff0a;border-radius:8px;max-width:100%;max-height:100%;display:block}@media (width<=720px),(height<=520px) and (orientation:landscape){.image-viewer-scrim{padding:0}.image-viewer{border:0;border-radius:0;width:100%;height:100dvh}.image-viewer>header{padding-top:calc(10px + var(--safe-area-top));padding-right:calc(12px + var(--safe-area-right));padding-left:calc(16px + var(--safe-area-left))}.image-viewer-stage{padding-right:calc(12px + var(--safe-area-right));padding-bottom:calc(12px + var(--safe-area-bottom));padding-left:calc(12px + var(--safe-area-left))}}.mobile-nav-toggle{top:calc(14px + var(--safe-area-top));left:calc(14px + var(--safe-area-left));z-index:30;border:1px solid var(--line-strong);background:var(--panel);width:38px;height:38px;color:var(--text);border-radius:10px;font-size:22px;line-height:1;display:none;position:fixed}.mobile-nav-toggle .bars{gap:3px;display:grid}.mobile-nav-toggle .bars i{background:currentColor;border-radius:2px;width:16px;height:2px;display:block}.mobile-nav-backdrop{display:none}@media (width<=1180px){.shell{grid-template-columns:72px 240px minmax(0,1fr)}.shell.sidebar-collapsed,.shell.sidebar-collapsed.thread-open,.shell.sidebar-collapsed.search-open{grid-template-columns:72px 0 minmax(0,1fr)}.thread,.search-results{width:min(420px,100vw);box-shadow:var(--shadow);z-index:4;border-left:1px solid var(--line-strong);transition:transform .18s;position:fixed;inset:0 0 0 auto;transform:translate(100%)}.thread.open,.search-results{transform:translate(0)}.desktop-shell .thread,.desktop-shell .search-results{top:52px;bottom:0}}@media (width<=820px){.mobile-nav-toggle{place-items:center;display:grid}.shell,.shell.thread-open,.shell.search-open,.shell.sidebar-collapsed,.shell.sidebar-collapsed.thread-open,.shell.sidebar-collapsed.search-open{grid-template-columns:1fr}.sidebar-collapsed .sidebar{opacity:1;pointer-events:none;transform:translate(calc(-100% - 72px))}.guild-rail,.sidebar{z-index:20;pointer-events:none;height:100dvh;transition:transform .18s;position:fixed;inset:0 auto 0 0;transform:translate(-100%)}.guild-rail{width:72px;padding-top:calc(14px + var(--safe-area-top));padding-bottom:calc(14px + var(--safe-area-bottom))}.sidebar{width:min(260px,100vw - 72px);left:72px;transform:translate(calc(-100% - 72px))}.nav-open .guild-rail,.nav-open .sidebar{pointer-events:auto;transform:translate(0,0)}.nav-open .guild-rail{padding-top:calc(62px + var(--safe-area-top))}.desktop-shell .guild-rail,.desktop-shell .sidebar{height:calc(100dvh - 52px);top:52px}.desktop-shell.nav-open .guild-rail{padding-top:calc(14px + var(--safe-area-top))}.desktop-shell .mobile-nav-backdrop{top:52px}.mobile-nav-backdrop{z-index:15;background:#05081075;border:0;padding:0;display:block;position:fixed;inset:0 0 0 min(332px,100vw)}.topbar{min-height:calc(60px + var(--safe-area-top));padding-top:calc(12px + var(--safe-area-top));padding-right:calc(20px + var(--safe-area-right));padding-left:calc(64px + var(--safe-area-left))}.thread>header,.search-results-head{padding-top:calc(12px + var(--safe-area-top));padding-left:calc(64px + var(--safe-area-left))}.search{width:180px}}@media (width<=520px){.search,.topbar-meta,.topbar-divider{display:none}}.message-row.highlight,.thread-root.highlight,.reply.highlight{animation:1.4s ease-out quote-flash}@keyframes quote-flash{0%{background:color-mix(in srgb, var(--accent) 22%, transparent)}to{background:0 0}}.quote-block{color:inherit;cursor:pointer;text-align:left;max-width:100%;font:inherit;background:0 0;border:0;border-radius:6px;align-items:stretch;gap:.5rem;margin:0 0 .35rem;padding:.25rem .5rem .25rem 0;display:inline-flex}.quote-block:hover:not(:disabled){background:color-mix(in srgb, var(--accent) 8%, transparent)}.quote-block:disabled{cursor:default;opacity:.75}.quote-block .quote-bar{background:var(--accent);border-radius:2px;flex:0 0 3px;align-self:stretch;width:3px}.quote-block .quote-content{flex-direction:column;gap:.1rem;min-width:0;display:flex}.quote-block .quote-author{color:var(--accent);font-size:.78rem;font-weight:600}.quote-block .quote-snippet{color:var(--muted);white-space:nowrap;text-overflow:ellipsis;max-width:56ch;font-size:.85rem;overflow:hidden}.quote-block .quote-snippet.muted{opacity:.75;font-style:italic}.quote-preview{background:color-mix(in srgb, var(--accent) 5%, transparent);border:0;border-bottom:1px solid var(--line);color:var(--muted);border-radius:0;align-items:center;gap:.5rem;margin:0;padding:6px 10px 6px 12px;font-size:12.5px;display:flex}.quote-preview .quote-bar{display:none}.quote-preview-body{flex:1;align-items:baseline;gap:.4rem;min-width:0;display:flex;overflow:hidden}.quote-preview-label{color:color-mix(in srgb, var(--accent) 85%, var(--text));white-space:nowrap;font-size:12px}.quote-preview-label strong{color:var(--text-strong);font-weight:600}.quote-preview-snippet{white-space:nowrap;text-overflow:ellipsis;color:var(--muted);flex:1;min-width:0;font-size:12px;overflow:hidden}.quote-preview-clear{color:var(--muted);cursor:pointer;background:0 0;border:0;border-radius:6px;padding:2px 6px;font-size:16px;line-height:1;transition:background .1s,color .1s}.quote-preview-clear:hover{color:var(--text-strong);background:var(--hover-strong)}.reply-quote-btn{color:var(--muted);cursor:pointer;opacity:0;background:0 0;border:0;margin-left:auto;padding:0 .3rem;font-size:.95rem;transition:opacity .15s;position:relative}.reply:hover .reply-quote-btn,.thread-root:hover .reply-quote-btn,.reply-quote-btn:focus-visible{opacity:1}.reply-quote-btn:hover{color:var(--accent)}.tooltip{position:relative}.tooltip:before,.reply-quote-btn:before{content:attr(data-tooltip);z-index:20;background:var(--tooltip-bg);color:var(--tooltip-fg);white-space:nowrap;opacity:0;pointer-events:none;border-radius:9px;padding:.42rem .62rem;font-size:.78rem;font-weight:700;line-height:1;transition:opacity .12s,transform .12s;position:absolute;bottom:calc(100% + 12px);left:50%;transform:translate(-50%,4px)scale(.96);box-shadow:0 10px 28px #00000047}.tooltip:after,.reply-quote-btn:after{content:"";z-index:20;background:var(--tooltip-bg);opacity:0;pointer-events:none;border-radius:2px;width:12px;height:12px;transition:opacity .12s,transform .12s;position:absolute;bottom:calc(100% + 5px);left:50%;transform:translate(-50%,4px)rotate(45deg)scale(.9)}.tooltip:hover:before,.tooltip:focus-visible:before,.reply-quote-btn:hover:before,.reply-quote-btn:focus-visible:before,.tooltip:hover:after,.tooltip:focus-visible:after,.reply-quote-btn:hover:after,.reply-quote-btn:focus-visible:after{opacity:1;transform:translate(-50%)scale(1)}.tooltip:hover:after,.tooltip:focus-visible:after,.reply-quote-btn:hover:after,.reply-quote-btn:focus-visible:after{transform:translate(-50%)rotate(45deg)scale(1)}.tooltip-align-end:before{transform-origin:100% 100%;left:auto;right:0;transform:translateY(4px)scale(.96)}.tooltip-align-end:hover:before,.tooltip-align-end:focus-visible:before{transform:translateY(0)scale(1)}.settings-modal-scrim{z-index:1000;color:var(--text);-webkit-font-smoothing:antialiased;background:var(--lightningcss-light,#080a0e6b)var(--lightningcss-dark,#0000008c);place-items:center;font-size:14px;line-height:1.5;animation:.15s ease-out settings-modal-fade;display:grid;position:fixed;inset:0}@keyframes settings-modal-fade{0%{opacity:0}to{opacity:1}}.settings-modal{background:var(--panel);border:1px solid var(--line);border-radius:var(--radius-lg);width:min(1100px,96vw);height:min(760px,92vh);box-shadow:var(--shadow);grid-template-columns:232px minmax(0,1fr);display:grid;position:relative;overflow:hidden}.settings-modal__close{z-index:6;width:28px;height:28px;color:var(--muted);cursor:pointer;border-radius:var(--radius-sm);background:0 0;border:0;place-items:center;transition:background .12s,color .12s;display:grid;position:absolute;top:14px;right:14px}.settings-modal__close:hover{background:var(--hover);color:var(--text-strong)}.settings-modal__rail{background:var(--panel-2);border-right:1px solid var(--line);flex-direction:column;padding:16px 10px;display:flex;overflow-y:auto}.settings-modal__rail-group+.settings-modal__rail-group{margin-top:14px}.settings-modal__rail-heading{font-family:var(--font-mono);text-transform:uppercase;letter-spacing:.09em;color:var(--muted);margin:0;padding:6px 8px 4px;font-size:10px;font-weight:600}.settings-modal__rail-select{background:var(--bg);border:1px solid var(--line);border-radius:var(--radius-sm);width:100%;height:32px;color:var(--text);font:inherit;cursor:pointer;margin:2px 0 6px;padding:0 8px;font-size:13.5px;transition:border-color .12s,box-shadow .12s,background .12s}.settings-modal__rail-select:hover{border-color:var(--line-strong)}.settings-modal__rail-select:focus{border-color:var(--accent);background:var(--panel);box-shadow:0 0 0 3px var(--accent-soft);outline:0}.settings-modal__rail ul{margin:0;padding:0;list-style:none}.settings-modal__rail-item{border-radius:var(--radius-sm);cursor:pointer;width:100%;font:inherit;color:var(--text);text-align:left;background:0 0;border:0;align-items:center;gap:10px;margin:1px 0;padding:6px 10px;font-size:13.5px;line-height:1.4;transition:background .1s,color .1s;display:flex}.settings-modal__rail-item:hover{background:var(--hover)}.settings-modal__rail-item.is-active{background:var(--hover-strong);color:var(--text-strong);font-weight:600}.settings-modal__rail-icon{width:16px;height:16px;color:var(--muted);flex-shrink:0;place-items:center;display:grid}.settings-modal__rail-icon svg{width:16px;height:16px;display:block}.settings-modal__rail-item.is-active .settings-modal__rail-icon{color:var(--text-strong)}.settings-modal__rail-avatar{color:#fff;background:linear-gradient(135deg, hsl(var(--hue,220deg) 70% 55%), hsl(calc(var(--hue,220deg) + 40deg) 70% 45%));border-radius:4px;flex-shrink:0;place-items:center;width:18px;height:18px;font-size:9px;font-weight:700;display:grid;overflow:hidden}.settings-modal__rail-avatar img{object-fit:cover;width:100%;height:100%;display:block}.settings-modal__rail-label{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.settings-modal__content{background:var(--panel);color:var(--text);padding:40px 56px 56px;overflow-y:auto}.settings-modal__content .settings-page__header{margin-bottom:32px}.settings-modal__content .settings-page__eyebrow{font-family:var(--font-mono);text-transform:uppercase;letter-spacing:.09em;color:var(--muted);margin:0 0 6px;font-size:10px;font-weight:600}.settings-modal__content .settings-page__h1{letter-spacing:-.01em;color:var(--text-strong);font-size:26px;font-weight:700;line-height:1.2;font-family:var(--font-display);margin:0 0 6px}.settings-modal__content .settings-page__lead{color:var(--muted);margin:0;font-size:14px;line-height:1.5}.settings-modal__content .settings-form{flex-direction:column;gap:24px;max-width:640px;display:flex}.settings-modal__content .settings-footer{border-top:1px solid var(--line);justify-content:space-between;align-items:center;gap:12px;margin-top:8px;padding-top:20px;display:flex}.settings-modal__content .settings-footer__spacer{flex:1}.settings-modal__content .settings-section{flex-direction:column;gap:20px;display:flex}.settings-modal__content .settings-section__h{text-transform:uppercase;letter-spacing:.06em;color:var(--muted);margin:0 0 4px;font-size:12px;font-weight:600}.settings-modal__content .settings-field{flex-direction:column;gap:6px;display:flex}.settings-modal__content .settings-field__label{color:var(--text-strong);font-size:13px;font-weight:600}.settings-modal__content .settings-field__hint{color:var(--muted);margin:0;font-size:12.5px;line-height:1.5}.settings-modal__content .settings-field__hint.is-error{color:var(--danger)}.settings-modal__content .settings-identity{background:var(--panel-2);border:1px solid var(--line);border-radius:var(--radius);align-items:center;gap:14px;padding:14px 16px;display:flex}.settings-modal__content .settings-identity__meta{flex-direction:column;flex:1;gap:2px;min-width:0;display:flex}.settings-modal__content .settings-identity__name{color:var(--text-strong);white-space:nowrap;text-overflow:ellipsis;font-size:15px;font-weight:700;line-height:1.25;overflow:hidden}.settings-modal__content .settings-identity__handle{color:var(--muted);white-space:nowrap;text-overflow:ellipsis;font-size:13px;line-height:1.3;overflow:hidden}.settings-modal__content .settings-identity__tag{text-transform:uppercase;letter-spacing:.08em;color:var(--muted);background:var(--panel);border:1px solid var(--line);border-radius:999px;flex-shrink:0;padding:3px 8px;font-size:10px;font-weight:600}.settings-modal__content .settings-rows{flex-direction:column;display:flex}.settings-modal__content .settings-rows--sectioned .settings-row2{border-top:0;align-items:center;padding:12px 0}.settings-modal__content .settings-row2{border-top:1px solid var(--line);grid-template-columns:minmax(0,220px) minmax(0,1fr);gap:32px;padding:20px 0;display:grid}.settings-modal__content .settings-row2--toggle{grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:24px}.settings-modal__content .settings-row2:first-child{border-top:0;padding-top:4px}.settings-modal__content .settings-row2__desc{min-width:0}.settings-modal__content .settings-row2__label{color:var(--text-strong);margin-bottom:4px;font-size:13.5px;font-weight:600;display:block}.settings-modal__content .settings-row2__hint{color:var(--muted);margin:0;font-size:12.5px;line-height:1.5}.settings-modal__content .settings-row2__control{flex-direction:column;align-items:flex-start;gap:8px;min-width:0;max-width:380px;display:flex}.settings-modal__content .settings-row2__control--end{flex-direction:row;justify-content:center;align-items:flex-end;max-width:none}.settings-modal__content .settings-rows__head{border-top:1px solid var(--line);text-transform:uppercase;letter-spacing:.08em;color:var(--muted);margin:0;padding:24px 0 12px;font-size:11px;font-weight:600}.settings-modal__content .settings-rows__head:first-child{border-top:0;padding-top:4px}.settings-modal__content .settings-rows__head+.settings-row2{border-top:0;padding-top:0}.settings-modal__content .settings-input-group{background:var(--bg);border:1px solid var(--line);border-radius:var(--radius-sm);align-items:stretch;width:100%;transition:border-color .12s,box-shadow .12s,background .12s;display:flex}.settings-modal__content .settings-input-group:hover{border-color:var(--line-strong)}.settings-modal__content .settings-input-group:focus-within{border-color:var(--accent);background:var(--panel);box-shadow:0 0 0 3px var(--accent-soft)}.settings-modal__content .settings-input-group__prefix{color:var(--muted);border-right:1px solid var(--line);background:var(--panel-2);border-radius:var(--radius-sm) 0 0 var(--radius-sm);place-items:center;padding:0 10px;font-size:14px;font-weight:500;display:grid}.settings-modal__content .settings-input--in-group{box-shadow:none!important;border-radius:0 var(--radius-sm) var(--radius-sm) 0!important;background:0 0!important;border:0!important;max-width:none!important}.settings-modal__content .settings-input--in-group:focus{box-shadow:none!important;background:0 0!important;border:0!important}.settings-modal__content .settings-linklike{color:var(--muted);cursor:pointer;font:inherit;text-underline-offset:2px;background:0 0;border:0;padding:2px 0;font-size:12.5px;text-decoration:underline;transition:color .12s}.settings-modal__content .settings-linklike:hover{color:var(--text-strong)}.settings-modal__content .settings-row{grid-template-columns:1fr auto;align-items:center;gap:24px;display:grid}.settings-modal__content .settings-row__main{min-width:0}.settings-modal__content .settings-row__label{color:var(--text-strong);margin-bottom:2px;font-size:13.5px;font-weight:600}.settings-modal__content .settings-row__hint{color:var(--muted);font-size:12.5px;line-height:1.5}.settings-modal__content .settings-row__hint.is-error{color:var(--danger)}.settings-modal__content .settings-input{background:var(--bg);border:1px solid var(--line);border-radius:var(--radius-sm);width:100%;max-width:420px;height:36px;color:var(--text);font:inherit;padding:0 12px;font-size:14px;transition:border-color .12s,box-shadow .12s,background .12s}.settings-modal__content .settings-input:hover{border-color:var(--line-strong)}.settings-modal__content .settings-input:focus{border-color:var(--accent);background:var(--panel);box-shadow:0 0 0 3px var(--accent-soft);outline:0}.settings-modal__content .settings-input--wide{max-width:560px}.settings-modal__content .settings-row .settings-input{width:auto;min-width:240px;max-width:320px}.settings-modal__content .settings-button{background:var(--panel-2);height:34px;color:var(--text);border:1px solid var(--line-strong);border-radius:var(--radius);font:inherit;cursor:pointer;white-space:nowrap;box-shadow:var(--key-edge);justify-content:center;align-items:center;gap:6px;padding:0 14px;font-size:13.5px;font-weight:600;transition:background .1s,border-color .1s,box-shadow 80ms,transform 80ms;display:inline-flex}.settings-modal__content .settings-button:hover{background:var(--panel-3);border-color:var(--line-strong)}.settings-modal__content .settings-button:active:not(:disabled){box-shadow:var(--key-edge-pressed);transform:translateY(1px)}.settings-modal__content .settings-button:focus-visible{box-shadow:0 0 0 3px var(--accent-soft);outline:0}.settings-modal__content .settings-button:disabled{opacity:.55;cursor:not-allowed}.settings-modal__content .settings-button--primary{background:var(--accent);color:var(--accent-contrast);border-color:color-mix(in srgb, var(--accent) 70%, var(--text-strong))}.settings-modal__content .settings-button--primary:hover{background:var(--accent-hover);border-color:var(--accent-hover)}.settings-modal__content .settings-switch{appearance:none;background:var(--line-strong);cursor:pointer;border:0;border-radius:9px;flex-shrink:0;width:32px;height:18px;margin:0;transition:background .15s;position:relative}.settings-modal__content .settings-switch:checked{background:var(--accent)}.settings-modal__content .settings-switch:disabled{opacity:.5;cursor:not-allowed}.settings-modal__content .settings-switch:after{content:"";background:#fff;border-radius:50%;width:14px;height:14px;transition:transform .15s;position:absolute;top:2px;left:2px;box-shadow:0 1px 2px #00000040}.settings-modal__content .settings-switch:checked:after{transform:translate(14px)}.settings-modal__content .settings-switch:focus-visible{box-shadow:0 0 0 3px var(--accent-soft);outline:0}.settings-modal__content .settings-actions{justify-content:flex-end;align-items:center;gap:12px;margin-top:4px;display:flex}.settings-modal__content .settings-status{color:var(--muted);margin:0;font-size:13px}.settings-modal__content .settings-status.is-error{color:var(--danger)}@media (width<=720px){.settings-modal{border-radius:0;grid-template-rows:auto 1fr;grid-template-columns:1fr;width:100vw;height:100dvh}.settings-modal__rail{border-right:0;border-bottom:1px solid var(--line);flex-direction:row;padding:8px;overflow-x:auto}.settings-modal__content{padding:24px 20px 60px}.settings-modal__content .settings-row2{grid-template-columns:1fr;gap:10px}.settings-modal__content .settings-row2__control{max-width:none}}.ws-settings{color:var(--text);z-index:50;background:var(--lightningcss-light,#0f0f0f38)var(--lightningcss-dark,#00000059);place-items:center;padding:28px 80px 28px 28px;font-size:14px;line-height:1.5;display:grid;position:fixed;inset:0}.ws-settings__panel{background:var(--panel);border:1px solid var(--line);width:100%;max-width:1400px;height:100%;box-shadow:var(--shadow);grid-template-columns:260px minmax(0,1fr);display:grid;overflow:hidden}.ws-settings__rail{background:var(--panel-2);border-right:1px solid var(--line);flex-direction:column;padding:14px 10px 18px;display:flex;overflow-y:auto}.ws-settings__rail-search{margin:2px 4px 12px;position:relative}.ws-settings__rail-search-icon{color:var(--muted);pointer-events:none;position:absolute;top:50%;left:10px;transform:translateY(-50%)}.ws-settings__rail-search-icon svg{width:14px;height:14px;display:block}.ws-settings__rail-search-input{background:var(--panel);border:1px solid var(--line);border-radius:var(--radius-sm);width:100%;height:32px;color:var(--text);font:inherit;padding:0 12px 0 32px;font-size:13px}.ws-settings__rail-search-input::placeholder{color:var(--muted)}.ws-settings__rail-search-input:disabled{cursor:not-allowed;opacity:.65}.ws-settings__rail-group{margin-top:6px}.ws-settings__rail-heading{color:var(--muted);letter-spacing:.02em;margin:0;padding:8px 10px 6px;font-size:11.5px;font-weight:600}.ws-settings__rail-heading-name{color:var(--text-strong);font-weight:700}.ws-settings__rail-list{margin:0;padding:0;list-style:none}.ws-settings__rail-item{border-radius:var(--radius-sm);cursor:pointer;width:100%;font:inherit;color:var(--text);text-align:left;background:0 0;border:0;align-items:center;gap:10px;margin:1px 0;padding:6px 10px;font-size:14px;line-height:1.4;transition:background .1s,color .1s;display:flex}.ws-settings__rail-item:hover{background:var(--hover)}.ws-settings__rail-item.is-active{background:var(--hover-strong);color:var(--text-strong);font-weight:600}.ws-settings__rail-item-icon{width:16px;height:16px;color:var(--muted);flex-shrink:0;place-items:center;display:grid}.ws-settings__rail-item-icon svg{width:16px;height:16px;display:block}.ws-settings__rail-item.is-active .ws-settings__rail-item-icon{color:var(--text-strong)}.ws-settings__rail-item-label{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.ws-settings__content{background:var(--bg);position:relative;overflow-y:auto}.ws-settings__content-inner{max-width:740px;padding:56px 80px 80px}.ws-settings__close{border:1px solid var(--line-strong);background:var(--panel);width:36px;height:36px;color:var(--text-strong);cursor:pointer;z-index:60;border-radius:50%;place-items:center;transition:background .12s,color .12s,border-color .12s;display:grid;position:fixed;top:28px;right:22px;box-shadow:0 1px 3px #00000026}@media (width<=760px){.ws-settings{padding:0}.ws-settings__panel{border:0;border-radius:0;max-width:none}}.ws-settings__close:hover{background:var(--panel-2);color:var(--text-strong);border-color:var(--line-strong)}.ws-settings__error{background:var(--panel-2);border:1px solid var(--line);border-radius:var(--radius);color:var(--danger);margin:0 0 20px;padding:14px 16px;font-size:13.5px}.ws-settings .ws-page__header{margin-bottom:32px}.ws-settings .ws-page__h1{letter-spacing:-.01em;color:var(--text-strong);font-size:28px;font-weight:700;line-height:1.2;font-family:var(--font-display);margin:0 0 8px}.ws-settings .ws-page__lead{color:var(--muted);margin:0;font-size:14px;line-height:1.5}.workspace-settings-empty{background:var(--panel-2);border:1px dashed var(--line);border-radius:var(--radius);color:var(--muted);padding:24px;font-size:14px;line-height:1.6}.workspace-settings-empty p{margin:0}.ws-section{border-top:1px solid var(--line);flex-direction:column;margin-top:24px;display:flex}.ws-section__h{color:var(--text-strong);margin:0;padding:18px 0 6px;font-size:14px;font-weight:700}.ws-row{border-top:1px solid var(--line);grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:24px;padding:18px 0;display:grid}.ws-section>.ws-row:first-child,.ws-section>.ws-section__h+.ws-row{border-top:0}.ws-row__main{min-width:0}.ws-row__label{color:var(--text-strong);margin-bottom:4px;font-size:14px;font-weight:600}.ws-row__hint{color:var(--muted);font-size:13px;line-height:1.5}.ws-row__hint b{color:var(--text-strong);font-weight:600}.ws-row__value{color:var(--text-strong);text-align:right;word-break:break-word;max-width:320px;font-size:14px;font-weight:500}.ws-row__control{flex-wrap:wrap;justify-content:flex-end;align-items:center;gap:8px;min-width:0;max-width:420px;display:flex}.ws-strip{background:var(--panel-2);border:1px solid var(--line);border-radius:var(--radius);align-items:center;gap:12px;margin-bottom:8px;padding:10px 14px;font-size:14px;display:flex}.ws-strip__avatar{background:linear-gradient(135deg, var(--brand-a), var(--brand-b));width:28px;height:28px;color:var(--brand-contrast);border-radius:6px;flex-shrink:0;place-items:center;font-size:12px;font-weight:700;display:grid;overflow:hidden}.ws-strip__avatar img{object-fit:cover;width:100%;height:100%;display:block}.ws-strip__name{color:var(--text-strong);font-weight:600}.ws-strip__pill{letter-spacing:.01em;border-radius:999px;margin-left:auto;padding:2px 10px;font-size:12px;font-weight:600}.ws-strip__pill--owner{background:color-mix(in srgb, var(--success) 15%, transparent);color:var(--success);border:1px solid color-mix(in srgb, var(--success) 32%, transparent)}.ws-strip__pill--moderator{background:color-mix(in srgb, var(--delivery-accent) 15%, transparent);color:var(--delivery-accent);border:1px solid color-mix(in srgb, var(--delivery-accent) 32%, transparent)}.ws-strip__pill--member,.ws-strip__pill--guest,.ws-strip__pill--bot{background:var(--panel-3,var(--hover));color:var(--text);border:1px solid var(--line)}.ws-input{background:var(--panel-2);border:1px solid var(--line);border-radius:var(--radius-sm);width:220px;max-width:100%;height:34px;color:var(--text-strong);font:inherit;padding:0 12px;font-size:14px}.ws-input:focus{border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-soft);outline:0}.ws-input:disabled{opacity:.65;cursor:not-allowed}.ws-select{background:var(--panel-2);border:1px solid var(--line);border-radius:var(--radius-sm);width:220px;max-width:100%;height:34px;color:var(--text-strong);font:inherit;padding:0 34px 0 10px;font-size:13.5px}.ws-select:focus{border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-soft);outline:0}.ws-select:disabled{opacity:.65;cursor:not-allowed}.ws-file{display:none}.ws-actions{border-top:1px solid var(--line);justify-content:flex-end;align-items:center;gap:12px;padding:14px 0 0;display:flex}.ws-status{min-height:20px;color:var(--muted);flex:1;margin:0;font-size:13px}.ws-status.is-error{color:var(--danger)}.ws-input[readonly]{cursor:default;color:var(--text)}.ws-btn{background:var(--panel-2);border:1px solid var(--line-strong);border-radius:var(--radius);height:34px;color:var(--text-strong);font:inherit;cursor:pointer;box-shadow:var(--key-edge);padding:0 14px;font-size:13.5px;font-weight:500;transition:background .12s,color .12s,border-color .12s,box-shadow 80ms,transform 80ms}.ws-btn:active:not(:disabled){box-shadow:var(--key-edge-pressed);transform:translateY(1px)}.ws-btn:hover:not(:disabled){background:var(--panel-3,var(--hover-strong));border-color:var(--line-strong)}.ws-btn:disabled{opacity:.55;cursor:not-allowed}.ws-btn--danger{color:var(--danger);border-color:var(--line)}.ws-btn--danger:hover:not(:disabled){background:color-mix(in srgb, var(--danger) 9%, transparent);border-color:var(--danger)}.ws-btn--primary{background:var(--accent);border-color:color-mix(in srgb, var(--accent) 70%, var(--text-strong));color:var(--accent-contrast);align-items:center;gap:6px;display:inline-flex}.ws-btn--primary:hover:not(:disabled){background:var(--accent-hover);border-color:var(--accent-hover)}.ws-btn--primary svg{width:14px;height:14px}.ws-settings__content:has(.ws-members-page){overflow:hidden}.ws-settings__content-inner:has(.ws-members-page){flex-direction:column;max-width:none;height:100%;min-height:0;padding:56px 80px 28px;display:flex}.ws-members-page{flex-direction:column;flex:1;min-height:0;display:flex}.ws-members-page__header{flex:none}.ws-members__toolbar{background:var(--bg);border-bottom:1px solid var(--line);flex-wrap:wrap;flex:none;justify-content:space-between;align-items:center;gap:16px;margin:4px 0 12px;padding:14px 0 12px;display:flex}.ws-members__count{color:var(--muted);text-transform:uppercase;letter-spacing:.06em;font-size:12.5px;font-weight:600}.ws-members__controls{flex-wrap:wrap;align-items:center;gap:8px;display:flex}.ws-members__search{align-items:center;display:flex;position:relative}.ws-members__search-icon{width:14px;height:14px;color:var(--muted);pointer-events:none;display:inline-flex;position:absolute;left:10px}.ws-members__search-icon svg{width:100%;height:100%}.ws-members__search-input{width:220px;height:34px;color:var(--text);background:var(--panel-2);border:1px solid var(--line);border-radius:6px;outline:none;padding:0 12px 0 32px;font-size:13px}.ws-members__search-input::-webkit-search-cancel-button{appearance:none}.ws-members__search-input:focus{border-color:var(--accent)}.ws-members__role-select{height:34px;color:var(--text);background:var(--panel-2);border:1px solid var(--line);cursor:pointer;border-radius:6px;outline:none;padding:0 28px 0 10px;font-size:13px}.ws-members__list{border:1px solid var(--line);background:var(--panel);border-radius:6px;flex:auto;min-height:0;overflow:hidden auto}.ws-members__row{border-bottom:1px solid var(--line);box-sizing:border-box;grid-template-columns:36px 1fr auto auto;align-items:center;gap:14px;padding:0 16px;display:grid}.ws-members__avatar{letter-spacing:-.02em;background:var(--accent-soft);width:36px;height:36px;color:var(--accent);border-radius:7px;flex-shrink:0;justify-content:center;align-items:center;font-size:13px;font-weight:600;display:inline-flex;overflow:hidden}.ws-members__avatar--bot{background:color-mix(in srgb, var(--warn) 18%, transparent);color:color-mix(in srgb, var(--warn) 72%, var(--text))}.ws-members__avatar img{object-fit:cover;width:100%;height:100%}.ws-members__main{flex-direction:column;gap:2px;min-width:0;display:flex}.ws-members__name{color:var(--text-strong,var(--text));white-space:nowrap;text-overflow:ellipsis;font-size:14px;font-weight:600;overflow:hidden}.ws-members__meta{color:var(--muted);white-space:nowrap;text-overflow:ellipsis;align-items:center;gap:6px;font-size:12.5px;display:flex;overflow:hidden}.ws-members__handle{font-family:var(--font-mono);color:var(--text);background:var(--bg);border:1px solid var(--line);border-radius:4px;padding:1px 6px;font-size:12px}.ws-members__dot{opacity:.6}.ws-members__pill{text-transform:capitalize;color:var(--text);white-space:nowrap;background:#7f7f7f24;border-radius:999px;padding:3px 10px;font-size:11.5px;font-weight:600}.ws-members__pill--owner{background:color-mix(in srgb, var(--success) 16%, transparent);color:var(--success)}.ws-members__pill--moderator{background:color-mix(in srgb, var(--delivery-accent) 16%, transparent);color:var(--delivery-accent)}.ws-members__pill--bot{background:var(--accent-soft);color:var(--accent)}.ws-members__pill--guest{background:color-mix(in srgb, var(--warn) 18%, transparent);color:color-mix(in srgb, var(--warn) 72%, var(--text))}.ws-members__actions{width:28px;height:28px;color:var(--muted);cursor:pointer;background:0 0;border:1px solid #0000;border-radius:6px;justify-content:center;align-items:center;display:inline-flex}.ws-members__actions:hover:not(:disabled){background:var(--bg);border-color:var(--line);color:var(--text)}.ws-members__actions:disabled{opacity:.45;cursor:not-allowed}.ws-members__empty{text-align:center;border:1px dashed var(--line);color:var(--muted);background:var(--panel);border-radius:8px;margin-top:24px;padding:36px 20px;font-size:13.5px}.ws-members__loading{color:var(--muted);text-align:center;border-top:1px solid var(--line);padding:10px 16px;font-size:12.5px}.ws-members__row--skeleton{height:64px}.ws-members__skeleton{background:linear-gradient(90deg,#7f7f7f14,#7f7f7f2e,#7f7f7f14) 0 0/200% 100%;border-radius:6px;animation:1.4s ease-in-out infinite ws-members-shimmer}.ws-members__skeleton--line{height:10px;margin:4px 0}.ws-members__skeleton--pill{border-radius:999px;width:64px;height:18px}@keyframes ws-members-shimmer{0%{background-position:200% 0}to{background-position:-200% 0}}@media (width<=760px){.ws-settings__panel{grid-template-rows:auto 1fr;grid-template-columns:1fr}.ws-settings__rail{border-right:0;border-bottom:1px solid var(--line);padding:10px}.ws-settings__content-inner{padding:32px 20px 60px}.ws-settings__close{top:10px;right:12px}}.ws-bots-page{flex-direction:column;gap:0;display:flex}.ws-bots__toolbar{background:var(--bg);border-bottom:1px solid var(--line);flex-wrap:wrap;justify-content:space-between;align-items:center;gap:16px;margin:4px 0 12px;padding:14px 0 12px;display:flex}.ws-bots__count{color:var(--muted);text-transform:uppercase;letter-spacing:.06em;font-size:12.5px;font-weight:600}.ws-bots__toolbar-actions{align-items:center;gap:8px;display:flex}.ws-bots__panel{background:var(--surface);border:1px solid var(--line);border-radius:8px;margin:8px 0 16px;padding:18px 20px}.ws-bots__empty{text-align:center;border:1px dashed var(--line);color:var(--muted);background:var(--surface);border-radius:8px;margin-top:16px;padding:36px 20px;font-size:13.5px}.ws-bots__list{flex-direction:column;margin-bottom:60px;display:flex}.ws-bots__row{border-bottom:1px solid var(--line)}.ws-bots__row:last-child{border-bottom:0}.ws-bots__row.is-expanded{background:var(--surface)}.ws-bots__row-main{text-align:left;cursor:pointer;width:100%;color:inherit;background:0 0;border:0;grid-template-columns:36px 1fr auto auto;align-items:center;gap:14px;padding:14px 16px;display:grid}.ws-bots__row-main:hover{background:var(--hover,#7f7f7f0f)}.ws-bots__row-text{flex-direction:column;gap:2px;min-width:0;display:flex}.ws-bots__row-name{color:var(--text-strong,var(--text));white-space:nowrap;text-overflow:ellipsis;font-size:14px;font-weight:600;overflow:hidden}.ws-bots__row-meta{color:var(--muted);white-space:nowrap;text-overflow:ellipsis;align-items:center;gap:6px;font-size:12.5px;display:flex;overflow:hidden}.ws-bots__owner-pill{color:var(--text);white-space:nowrap;background:#7f7f7f24;border-radius:999px;padding:3px 10px;font-size:11.5px;font-weight:600}.ws-bots__owner-pill--service{background:color-mix(in srgb, var(--delivery-accent) 16%, transparent);color:var(--delivery-accent)}.ws-bots__owner-pill--user{background:color-mix(in srgb, var(--warn) 18%, transparent);color:color-mix(in srgb, var(--warn) 72%, var(--text))}.ws-bots__chevron{width:20px;height:20px;color:var(--muted);justify-content:center;align-items:center;display:inline-flex}.ws-bots__detail{border-top:1px dashed var(--line);flex-direction:column;gap:12px;padding:4px 16px 18px;display:flex}.ws-bots__detail-header{flex-wrap:wrap;justify-content:space-between;align-items:flex-start;gap:16px;padding-top:14px;display:flex}.ws-bots__detail-title{color:var(--text-strong,var(--text));margin:0 0 4px;font-size:13.5px;font-weight:600}.ws-bots__detail-hint{color:var(--muted);max-width:60ch;margin:0;font-size:12.5px}.ws-bots__detail-actions{flex-wrap:wrap;gap:8px;display:flex}.ws-bots__detail-empty{color:var(--muted);background:var(--bg);border:1px dashed var(--line);border-radius:6px;margin:0;padding:16px;font-size:13px}.ws-bots__token-list{flex-direction:column;gap:8px;margin:0;padding:0;list-style:none;display:flex}.ws-bots__token-row{background:var(--bg);border:1px solid var(--line);border-radius:6px;flex-wrap:wrap;justify-content:space-between;align-items:flex-start;gap:10px 16px;padding:12px 14px;display:flex}.ws-bots__token-row>.ws-btn{flex-shrink:0}.ws-bots__token-main{flex-direction:column;flex:240px;gap:4px;min-width:0;display:flex}.ws-bots__token-name{color:var(--text-strong,var(--text));font-size:13.5px;font-weight:600}.ws-bots__token-meta{color:var(--muted);font-size:12.5px}.ws-bots__scope-row{flex-wrap:wrap;gap:6px;margin-top:2px;display:flex}.ws-bots__scope-chip{font-family:var(--font-mono);background:var(--bg);border:1px solid var(--line);color:var(--text);border-radius:999px;padding:2px 8px;font-size:11.5px}.ws-bots__scope-chip--bundle{color:var(--accent);background:color-mix(in srgb, var(--accent) 10%, transparent);border-color:color-mix(in srgb, var(--accent) 35%, transparent);font-family:inherit;font-weight:600}.ws-bots__scope-toggle{color:var(--muted);text-underline-offset:2px;cursor:pointer;background:0 0;border:none;padding:2px 4px;font-size:11.5px;text-decoration:underline}.ws-bots__scope-toggle:hover{color:var(--text)}.ws-bots__scope-details{margin-top:6px}.ws-bots__scope-details>summary{color:var(--muted);cursor:pointer;width:fit-content;font-size:11.5px}.ws-bots__scope-details[open]>summary{margin-bottom:6px}.ws-bots__form{flex-direction:column;gap:16px;display:flex}.ws-bots__form-header{flex-direction:column;gap:4px;display:flex}.ws-bots__form-title{color:var(--text-strong,var(--text));margin:0;font-size:16px;font-weight:600}.ws-bots__form-hint{color:var(--muted);max-width:60ch;margin:0;font-size:13px}.ws-bots__form-grid{grid-template-columns:1fr 1fr;gap:12px;display:grid}@media (width<=640px){.ws-bots__form-grid{grid-template-columns:1fr}}.ws-bots__form-field{border:0;flex-direction:column;gap:6px;min-width:0;margin:0;padding:0;display:flex}.ws-bots__form-label{color:var(--muted);text-transform:uppercase;letter-spacing:.04em;font-size:12px;font-weight:600}.ws-bots__form-input{height:34px;color:var(--text);background:var(--surface);border:1px solid var(--line);border-radius:6px;outline:none;padding:0 12px;font-size:13.5px}.ws-bots__form-input:focus{border-color:var(--accent)}.ws-bots__form-handle{background:var(--surface);border:1px solid var(--line);border-radius:6px;align-items:center;gap:6px;padding:0 10px;display:flex}.ws-bots__form-handle span{color:var(--muted);font-family:var(--font-mono);font-size:13px}.ws-bots__form-handle .ws-bots__form-input{background:0 0;border:0;flex:1;padding-left:0}.ws-bots__choices{flex-direction:column;gap:8px;display:flex}.ws-bots__choice{border:1px solid var(--line);background:var(--surface);cursor:pointer;border-radius:6px;grid-template-rows:auto auto;grid-template-columns:18px 1fr;gap:2px 10px;padding:10px 12px;display:grid}.ws-bots__choice.is-active{border-color:var(--accent);background:color-mix(in srgb, var(--accent) 7%, transparent)}.ws-bots__choice input{accent-color:var(--accent);grid-row:1/span 2;align-self:center}.ws-bots__choice-title{color:var(--text-strong,var(--text));font-size:13.5px;font-weight:600}.ws-bots__choice-hint{color:var(--muted);font-size:12.5px}.ws-bots__form-error{background:color-mix(in srgb, var(--danger) 9%, transparent);color:var(--danger);border:1px solid color-mix(in srgb, var(--danger) 32%, transparent);border-radius:6px;margin:0;padding:10px 12px;font-size:13px}.ws-bots__form-actions{justify-content:flex-end;gap:8px;display:flex}.ws-bots__token-form-panel{background:var(--bg);border:1px solid var(--line);border-radius:6px;padding:14px}.ws-bots__token-form .ws-bots__choices{grid-template-columns:repeat(3,minmax(0,1fr));display:grid}@media (width<=720px){.ws-bots__token-form .ws-bots__choices{grid-template-columns:1fr}}.ws-bots__reveal{background:var(--surface);border:1px solid var(--accent);border-radius:8px;flex-direction:column;gap:14px;margin:8px 0 16px;padding:18px 20px;display:flex}.ws-bots__reveal-header{flex-direction:column;gap:4px;display:flex}.ws-bots__reveal-title{color:var(--text-strong,var(--text));margin:0;font-size:16px;font-weight:600}.ws-bots__reveal-hint{color:var(--muted);max-width:60ch;margin:0;font-size:13px}.ws-bots__reveal-hint code{background:var(--bg);border:1px solid var(--line);font-family:var(--font-mono);color:var(--text);white-space:nowrap;border-radius:4px;padding:1px 6px;font-size:12px}.ws-bots__reveal-field{flex-direction:column;gap:6px;display:flex}.ws-bots__reveal-label{color:var(--muted);text-transform:uppercase;letter-spacing:.04em;font-size:12px;font-weight:600}.ws-bots__reveal-row{align-items:center;gap:8px;display:flex}.ws-bots__reveal-input{height:34px;font-family:var(--font-mono);color:var(--text);background:var(--bg);border:1px solid var(--line);border-radius:6px;flex:1;padding:0 12px;font-size:13px}.ws-bots__reveal-snippet-header{justify-content:space-between;align-items:center;gap:8px;display:flex}.ws-bots__reveal-details{border:1px solid var(--line);background:var(--bg);border-radius:6px}.ws-bots__reveal-summary{color:var(--muted);text-transform:uppercase;letter-spacing:.04em;cursor:pointer;-webkit-user-select:none;user-select:none;padding:10px 14px;font-size:11px;font-weight:600}.ws-bots__reveal-summary:hover{color:var(--text)}.ws-bots__reveal-details-body{gap:8px;padding:0 14px 12px;display:grid}.ws-bots__reveal-details-body .ws-bots__reveal-hint{margin:0}.ws-bots__setup-mode{background:var(--bg);border:1px solid var(--line);border-radius:6px;grid-template-columns:repeat(2,minmax(0,1fr));width:min(320px,100%);padding:3px;display:inline-grid}.ws-bots__setup-mode button{min-height:30px;color:var(--muted);font:inherit;cursor:pointer;background:0 0;border:0;border-radius:4px;padding:0 12px;font-size:12.5px;font-weight:600}.ws-bots__setup-mode button.is-active{background:var(--surface);color:var(--text);box-shadow:0 0 0 1px var(--line)}.ws-bots__reveal-snippet{background:var(--bg);border:1px solid var(--line);font-family:var(--font-mono);color:var(--text);white-space:pre-wrap;border-radius:6px;margin:0;padding:12px 14px;font-size:12.5px;overflow-x:auto}.ws-bots__reveal-ack{color:var(--text);align-items:center;gap:8px;font-size:13px;display:flex}.ws-bots__reveal-actions{justify-content:flex-end;display:flex}.ws-bots__my-list{flex-direction:column;gap:18px;display:flex}.ws-bots__my-group{flex-direction:column;gap:8px;display:flex}.ws-bots__my-group-header{justify-content:space-between;align-items:center;gap:12px;display:flex}.ws-bots__my-group-title{color:var(--muted);text-transform:uppercase;letter-spacing:.06em;margin:0;font-size:13px;font-weight:600}.ws-bots__my-rows{border:1px solid var(--line);background:var(--surface);border-radius:6px;flex-direction:column;margin:0;padding:0;list-style:none;display:flex}.ws-bots__my-row{border-bottom:1px solid var(--line);grid-template-columns:36px 1fr auto;align-items:center;gap:14px;padding:12px 14px;display:grid}.ws-bots__my-row:last-child{border-bottom:0}.ws-bots__my-row-text{flex-direction:column;gap:2px;min-width:0;display:flex}.ws-bots__my-row-name{color:var(--text-strong,var(--text));font-size:14px;font-weight:600}.ws-bots__my-row-meta{color:var(--muted);align-items:center;gap:6px;font-size:12.5px;display:flex}.appearance-preview{border:1px solid var(--line-strong);border-radius:var(--radius-lg);background:var(--bg);overflow:hidden}.appearance-preview__bar{border-bottom:1px solid var(--line);background:var(--panel);color:var(--text-strong);align-items:baseline;gap:8px;padding:9px 14px;font-size:12px;font-weight:700;display:flex}.appearance-preview__hash{color:var(--accent)}.appearance-preview__topic{color:var(--muted);font-size:11.5px;font-weight:500}.appearance-preview__chat{gap:14px;padding:14px 16px 16px;display:grid}.appearance-preview[data-density=compact] .appearance-preview__chat{gap:7px;padding:10px 14px 12px}.appearance-preview__msg{grid-template-columns:34px minmax(0,1fr);gap:10px;display:grid}.appearance-preview[data-density=compact] .appearance-preview__msg{grid-template-columns:24px minmax(0,1fr);gap:8px}.appearance-preview__avatar{background:var(--accent);width:34px;height:34px;color:var(--accent-contrast);border-radius:9px;place-items:center;font-size:14px;font-weight:700;display:grid}.appearance-preview[data-density=compact] .appearance-preview__avatar{border-radius:7px;width:24px;height:24px;font-size:11px}.appearance-preview__avatar.is-agent{background:var(--accent-2)}.appearance-preview__body{gap:3px;min-width:0;display:grid}.appearance-preview[data-density=compact] .appearance-preview__body{gap:1px}.appearance-preview__head{align-items:baseline;gap:7px;display:flex}.appearance-preview__who{color:var(--text-strong);font-size:13px;font-weight:700}.appearance-preview[data-density=compact] .appearance-preview__who{font-size:12px}.appearance-preview__when{color:var(--muted);font-size:10px}.appearance-preview__text{font-size:13px;line-height:1.5}.appearance-preview[data-density=compact] .appearance-preview__text{font-size:12.5px;line-height:1.4}.appearance-preview__activity{background:color-mix(in srgb, var(--accent-2) 9%, var(--panel));color:var(--muted);border-radius:7px 7px 0 0;margin-top:3px;padding:6px 10px;font-size:11.5px}.appearance-preview__activity code{color:var(--text-strong);font-family:var(--font-mono,ui-monospace, monospace);font-size:10.5px}.appearance-preview__answer{background:color-mix(in srgb, var(--accent) 7%, var(--panel));border-radius:0 0 7px 7px;padding:7px 10px 8px;font-size:13px;line-height:1.5}.appearance-preview[data-density=compact] .appearance-preview__activity{padding:4px 8px;font-size:11px}.appearance-preview[data-density=compact] .appearance-preview__answer{padding:5px 8px 6px;font-size:12.5px}.appearance-preview[data-layout=outlined] .appearance-preview__activity{border:1px solid color-mix(in srgb, var(--accent-2) 45%, var(--line));background:0 0;border-bottom:0}.appearance-preview[data-layout=outlined] .appearance-preview__answer{border:1px solid color-mix(in srgb, var(--accent) 40%, var(--line));background:0 0}.appearance-preview__reactions{gap:5px;margin-top:5px;display:flex}.appearance-preview[data-density=compact] .appearance-preview__reactions{margin-top:2px}.appearance-preview__reaction{border:1px solid var(--line);background:var(--panel);color:var(--muted);border-radius:999px;padding:2px 8px;font-size:11px}.appearance-preview__reaction.is-mine{border-color:var(--accent);background:color-mix(in srgb, var(--accent) 12%, var(--panel));color:var(--text-strong)}.appearance-preview__caption{color:var(--muted-2);text-align:right;margin:-14px 2px 0;font-size:11px}.appearance-rows{display:grid}.appearance-row{grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:24px;padding:14px 0;display:grid}.appearance-row+.appearance-row{border-top:1px solid var(--line)}.appearance-row__meta{gap:2px;display:grid}.appearance-row__label{color:var(--text-strong);font-size:13.5px;font-weight:650}.appearance-row__desc{color:var(--muted);font-size:12px}.appearance-row__control{align-items:center;gap:12px;display:inline-flex}.appearance-seg{border:1px solid var(--line);border-radius:var(--radius-lg);background:var(--panel-2);gap:2px;padding:2px;display:inline-flex}.appearance-seg__btn{color:var(--muted);cursor:pointer;background:0 0;border:1px solid #0000;border-radius:8px;padding:5px 12px;font-size:12.5px;font-weight:600}.appearance-seg__btn:hover{color:var(--text-strong)}.appearance-seg__btn:focus-visible{outline:2px solid var(--accent);outline-offset:1px}.appearance-seg__btn.is-active{border-color:var(--line-strong);background:var(--panel);color:var(--text-strong);box-shadow:0 1px 2px #10151d1a}.board-chips__name{min-width:44px;color:var(--muted);text-align:right;font-size:12px}.board-chips{align-items:center;gap:10px;display:inline-flex}.board-chip{border:1px solid var(--line-strong);background:linear-gradient(135deg, var(--panel) 52%, var(--accent) 52%);cursor:pointer;border-radius:8px;width:26px;height:26px;padding:0;position:relative}.board-chip:focus-visible{outline:2px solid var(--accent);outline-offset:4px}.board-chip.is-active:after{content:"";border:2px solid var(--accent);border-radius:11px;position:absolute;inset:-5px}@media (width<=640px){.appearance-row{grid-template-columns:1fr;gap:10px}.appearance-row__control,.board-chips__name{text-align:left;justify-self:start}}.ws-intg-page{padding-bottom:60px}.ws-intg__app-icon{background:var(--surface);border:1px solid var(--line);width:36px;height:36px;color:var(--text);border-radius:8px;flex-shrink:0;justify-content:center;align-items:center;display:inline-flex}.ws-intg__wizard{background:var(--surface);border:1px solid var(--line);border-radius:8px;flex-direction:column;gap:16px;margin:8px 0 16px;padding:18px 20px;display:flex}.ws-intg__wizard-header{justify-content:space-between;align-items:flex-start;gap:16px;display:flex}.ws-intg__wizard-step{color:var(--muted);white-space:nowrap;padding-top:2px;font-size:11.5px;font-weight:600}.ws-intg__wizard-body{flex-direction:column;gap:14px;display:flex}.ws-intg__catalog{grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:12px;display:grid}.ws-intg__catalog-card{border:1px solid var(--line);text-align:left;cursor:pointer;color:inherit;background:0 0;border-radius:8px;flex-direction:column;align-items:flex-start;gap:8px;padding:16px;transition:border-color .12s,background .12s;display:flex}.ws-intg__catalog-card:hover{border-color:var(--accent);background:var(--hover,#7f7f7f0f)}.ws-intg__catalog-name{color:var(--text-strong,var(--text));font-size:14px;font-weight:600}.ws-intg__catalog-desc{color:var(--muted);font-size:12.5px;line-height:1.45}.ws-intg__chips{flex-wrap:wrap;gap:6px;margin-bottom:8px;display:flex}.ws-intg__chip{background:color-mix(in srgb, var(--accent) 14%, transparent);color:var(--text);border-radius:999px;align-items:center;gap:6px;padding:3px 6px 3px 10px;font-size:12px;font-weight:600;display:inline-flex}.ws-intg__chip-remove{width:16px;height:16px;color:var(--muted);cursor:pointer;background:0 0;border:0;border-radius:50%;justify-content:center;align-items:center;font-size:13px;line-height:1;display:inline-flex}.ws-intg__chip-remove:hover{color:var(--text);background:#7f7f7f2e}.ws-intg__member-results{border:1px solid var(--line);background:var(--surface);border-radius:8px;flex-direction:column;gap:2px;max-height:220px;margin:6px 0 0;padding:4px;list-style:none;display:flex;overflow-y:auto}.ws-intg__member-result{text-align:left;cursor:pointer;width:100%;color:inherit;background:0 0;border:0;border-radius:6px;align-items:center;gap:8px;padding:7px 10px;font-size:13px;display:flex}.ws-intg__member-result:hover{background:var(--hover,#7f7f7f14)}.ws-intg__toggle{cursor:pointer;align-items:flex-start;gap:10px;display:flex}.ws-intg__toggle input[type=checkbox]{flex-shrink:0;margin-top:3px}.ws-intg__toggle>span{flex-direction:column;gap:2px;display:flex}.ws-intg__panel{border:1px solid var(--line);background:var(--surface);border-radius:8px;flex-direction:column;gap:12px;padding:14px 16px;display:flex}.ws-intg__panel-header{flex-wrap:wrap;justify-content:space-between;align-items:flex-start;gap:16px;display:flex}.ws-intg__panel-title{color:var(--text-strong,var(--text));margin:0 0 3px;font-size:13px;font-weight:600}.ws-intg__panel-hint{color:var(--muted);max-width:560px;margin:0;font-size:12.5px;line-height:1.45}.ws-intg__panel-empty{color:var(--muted);margin:0;font-size:12.5px}.ws-intg__inline-form{border:1px dashed var(--line);border-radius:8px;flex-direction:column;gap:12px;padding:14px;display:flex}.ws-intg__item-list{flex-direction:column;margin:0;padding:0;list-style:none;display:flex}.ws-intg__item-row{border-bottom:1px solid var(--line);justify-content:space-between;align-items:flex-start;gap:14px;padding:11px 0;display:flex}.ws-intg__item-row:last-child{border-bottom:0}.ws-intg__item-row--stacked{flex-direction:column;align-items:stretch}.ws-intg__item-top{justify-content:space-between;align-items:flex-start;gap:14px;display:flex}.ws-intg__item-main{flex-direction:column;gap:4px;min-width:0;display:flex}.ws-intg__item-name{color:var(--text-strong,var(--text));font-size:13.5px;font-weight:600}.ws-intg__item-meta{color:var(--muted);overflow-wrap:anywhere;font-size:12px}.ws-intg__url{font-family:var(--mono,ui-monospace, monospace);font-size:11.5px}.ws-intg__item-actions{flex-wrap:wrap;flex-shrink:0;justify-content:flex-end;align-items:center;gap:8px;display:flex}.ws-intg__type-chips{flex-wrap:wrap;gap:5px;display:flex}.ws-intg__secret{border:1px solid color-mix(in srgb, var(--warn) 45%, var(--line));background:color-mix(in srgb, var(--warn) 7%, transparent);border-radius:8px;flex-direction:column;gap:6px;margin-top:6px;padding:10px 12px;display:flex}.ws-intg__secret-label{text-transform:uppercase;letter-spacing:.05em;color:var(--muted);font-size:11px;font-weight:700}.ws-intg__secret-row{align-items:center;gap:8px;display:flex}.ws-intg__secret-row .ws-bots__reveal-input{flex:1;min-width:0}.ws-intg__confirm{border:1px solid color-mix(in srgb, var(--danger,#d33) 40%, var(--line));background:color-mix(in srgb, var(--danger,#d33) 6%, transparent);border-radius:8px;flex-direction:column;gap:12px;padding:14px 16px;display:flex}.ws-intg__confirm-text{color:var(--text);margin:0;font-size:13px;line-height:1.5}.ws-intg__event-grid{grid-template-columns:repeat(auto-fill,minmax(230px,1fr));gap:6px;margin-top:10px;display:grid}.ws-intg__event-option{border:1px solid var(--line);cursor:pointer;border-radius:6px;align-items:center;gap:8px;padding:7px 10px;font-size:12px;display:flex}.ws-intg__event-option.is-active{border-color:var(--accent);background:color-mix(in srgb, var(--accent) 8%, transparent)}.ws-intg__deliveries{border-top:1px dashed var(--line);flex-direction:column;gap:8px;padding-top:10px;display:flex}.ws-intg__deliveries-scroll{border:1px solid var(--line);border-radius:8px;max-height:420px;overflow-y:auto}.ws-intg__delivery{border-bottom:1px solid var(--line)}.ws-intg__delivery:last-child{border-bottom:0}.ws-intg__delivery-row{text-align:left;cursor:pointer;width:100%;color:inherit;background:0 0;border:0;grid-template-columns:84px 1fr auto auto;align-items:center;gap:12px;padding:10px 12px;font-size:12.5px;display:grid}.ws-intg__delivery-row:hover{background:var(--hover,#7f7f7f0f)}.ws-intg__delivery-status{text-align:center;white-space:nowrap;border-radius:999px;padding:2px 8px;font-size:11px;font-weight:700}.ws-intg__delivery-status--ok{background:color-mix(in srgb, var(--delivery-accent,#2a9d5c) 16%, transparent);color:var(--delivery-accent,#2a9d5c)}.ws-intg__delivery-status--fail{background:color-mix(in srgb, var(--danger,#d33) 14%, transparent);color:var(--danger,#d33)}.ws-intg__delivery-type{text-overflow:ellipsis;white-space:nowrap;font-size:11.5px;overflow:hidden}.ws-intg__delivery-attempt,.ws-intg__delivery-time{color:var(--muted);white-space:nowrap;font-size:11.5px}.ws-intg__delivery-detail{flex-direction:column;gap:10px;padding:4px 12px 14px;display:flex}.ws-intg__delivery-block{flex-direction:column;gap:4px;display:flex}.ws-intg__delivery-block .ws-bots__reveal-snippet{max-height:260px;overflow:auto}.ws-intg__deliveries-more{justify-content:center;display:flex}.ws-intg__deliveries-retry{justify-content:space-between;align-items:center;gap:12px;display:flex}.ws-intg__section{flex-direction:column;gap:12px;margin-top:28px;display:flex}.ws-intg__section-title{color:var(--text-strong,var(--text));margin:0;font-size:15px;font-weight:600}.ws-intg__section-hint{color:var(--muted);margin:-6px 0 0;font-size:12.5px}.ws-bots__choice.is-disabled{opacity:.55;cursor:not-allowed}.settings-signout{border-top:1px solid var(--line);flex-wrap:wrap;justify-content:space-between;align-items:center;gap:16px;margin-top:24px;padding-top:20px;display:flex}.settings-signout strong{color:var(--text-strong);display:block}.settings-signout p{color:var(--muted);margin:2px 0 0;font-size:12.5px}.settings-signout .profile-actions{padding-top:0}.settings-password{border-top:1px solid var(--line);margin-top:24px;padding-top:20px}.settings-password__intro strong{color:var(--text-strong);display:block}.settings-password__intro p{color:var(--muted);margin:2px 0 0;font-size:12.5px} diff --git a/apps/api/internal/webassets/dist/_app/immutable/chunks/T0GVabNa.js b/apps/api/internal/webassets/dist/_app/immutable/chunks/BNjDjM6i.js similarity index 92% rename from apps/api/internal/webassets/dist/_app/immutable/chunks/T0GVabNa.js rename to apps/api/internal/webassets/dist/_app/immutable/chunks/BNjDjM6i.js index 67141e44d..60af795a7 100644 --- a/apps/api/internal/webassets/dist/_app/immutable/chunks/T0GVabNa.js +++ b/apps/api/internal/webassets/dist/_app/immutable/chunks/BNjDjM6i.js @@ -1,4 +1,4 @@ -import{$ as e,At as t,C as n,Ct as r,Et as i,H as a,I as o,L as s,M as c,P as l,R as u,S as d,St as f,T as p,Tt as m,U as h,V as g,W as _,Y as v,a as y,ct as b,ft as x,g as S,gt as C,h as w,ht as T,j as E,kt as D,mt as O,n as ee,pt as te,r as ne,st as k,u as A,v as re,vt as j,w as ie,yt as M,z as N}from"./BTIB_WQZ.js";import"./xihTtKlq.js";import{a as P,n as F,o as ae,t as oe,u as I}from"./DEPNME54.js";import{d as se,f as ce,l as le,r as ue,u as L}from"./ByQ3bZN5.js";var R=Symbol(`clickclackAnimatedURL`),z=new WeakMap;function de(e){let t=e.scrollWidth-e.clientWidth>1;if(e.toggleAttribute(`data-overflowing`,t),t){e.tabIndex=0,e.setAttribute(`role`,`group`),e.setAttribute(`aria-label`,`Scrollable table`);return}e.removeAttribute(`tabindex`),e.removeAttribute(`role`),e.removeAttribute(`aria-label`)}var B=typeof ResizeObserver>`u`?null:new ResizeObserver(e=>{let t=new Set;for(let n of e){let e=z.get(n.target);e&&t.add(e)}for(let e of t)de(e)});function V(e){return e[R]||e.currentSrc||e.src}function H(e){let t=new Map,n=new Map,r=new Map,i=new Map,a=!1,o=e=>{let t=r.get(e);t&&(B?.unobserve(e),B?.unobserve(t),r.delete(e))},s=()=>{for(let t of r.keys())e.contains(t)||o(t);for(let t of e.querySelectorAll(`table`)){let e=t.parentElement?.classList.contains(`markdown-table-scroll`)===!0?t.parentElement:null;e&&r.has(e)||(e||(e=document.createElement(`div`),e.className=`markdown-table-scroll`,t.before(e),e.append(t)),r.set(e,t),z.set(e,e),z.set(t,e),B?.observe(e),B?.observe(t),de(e))}},c=e=>{try{let t=new URL(e,window.location.href);if(t.hostname!==`giphy.com`&&!t.hostname.endsWith(`.giphy.com`))return``;let n=t.pathname.match(/\/media\/(?:v1\.[^/]+\/)?([^/]+)\/giphy\.gif$/);if(n)return`${t.origin}/media/${n[1]}/giphy_s.gif`}catch{return``}return``},l=e=>`${e}${e.includes(`?`)?`&`:`?`}cc_replay=${Date.now()}`,u=(e,r,i,o,s,c=!1)=>{let u=t.get(r);u&&window.clearTimeout(u);let d=(n.get(r)||0)+1;n.set(r,d),e.classList.add(`playing`),e.classList.remove(`paused`),i.disabled=!0,i.tabIndex=-1,i.ariaHidden=`true`;let f=!1,p=()=>{if(f||(f=!0,a||n.get(r)!==d))return;let o=window.setTimeout(()=>{a||n.get(r)!==d||(e.classList.remove(`playing`),e.classList.add(`paused`),i.disabled=!1,i.tabIndex=0,i.ariaHidden=`false`,s&&(r.src=s))},2600);t.set(r,o)},m=()=>{r.decode().catch(()=>{}).then(p)};r.addEventListener(`load`,m,{once:!0}),c&&(r.src=l(o)),r.complete&&r.naturalWidth>0&&m()},d=()=>{s();for(let t of e.querySelectorAll(`img`)){if(t.closest(`.gif-player`)||t.closest(`a`))continue;let e=t.getAttribute(`src`)||t.src;if(!/\.gif(?:$|[?#])/i.test(e))continue;let n=c(e);if(!n)continue;let r=document.createElement(`span`);r.className=`gif-player`;let a=document.createElement(`span`);a.className=`gif-badge`,a.textContent=`GIF`;let o=document.createElement(`button`);o.type=`button`,o.className=`gif-replay`,o.disabled=!0,o.tabIndex=-1,o.ariaHidden=`true`,o.ariaLabel=`Replay GIF ${t.alt||`image`}`,o.title=`Replay GIF`,o.textContent=`↻`;let s=t.parentNode,l=t.nextSibling,d=t.getAttribute(`src`)||t.src;t[R]=e,s?.insertBefore(r,t),r.append(t,a,o);let f=i=>{i.preventDefault(),i.stopPropagation(),u(r,t,o,e,n,!0)};i.set(t,{wrapper:r,replay:o,originalSrc:d,originalParent:s,originalNextSibling:l,onReplay:f}),o.addEventListener(`click`,f),u(r,t,o,e,n)}},f=new MutationObserver(d);return f.observe(e,{childList:!0,subtree:!0}),d(),{destroy(){a=!0,f.disconnect();for(let e of r.keys())o(e);for(let e of t.values())window.clearTimeout(e);for(let[e,t]of i)t.replay.removeEventListener(`click`,t.onReplay),delete e[R],e.src=t.originalSrc,t.wrapper.parentNode?t.wrapper.replaceWith(e):t.originalParent&&e.parentNode!==t.originalParent&&t.originalParent.insertBefore(e,t.originalNextSibling);i.clear(),t.clear(),n.clear()}}}var fe=1e3;function pe(e,t,n){if(e.length<=900)return e;let r=me(e,n);if(t===`prepend`)return he(e,0,700,r,`start`);if(t===`append`)return he(e,Math.max(0,e.length-700),e.length,r,`end`);if(t===`around`){let t=r?.first??-1,n=t>=0?t:Math.floor(e.length/2),i=Math.max(0,n-350),a=Math.min(e.length,i+700);return i=Math.max(0,a-700),he(e,i,a,r,`start`)}return he(e,Math.max(0,e.length-700),e.length,r,`end`)}function me(e,t){if(t.size===0)return null;let n=-1,r=-1;for(let i=0;i1e3&&(i===`start`?(a=t,o=Math.min(e.length,a+fe)):(o=n,a=Math.max(0,o-fe))),e.slice(a,o)}function ge(e,t=120){if(!e||t<=0)return``;let n=e.replace(/\s+/g,` `).trim();return n.length<=t?n:t<=3?`.`.repeat(t):`${n.slice(0,t-3)}...`}function _e(e){return se(e.quoted_author,`Unknown`)}function ve(e,t){if(t===e.id)return`Open`;let n=e.thread_state?.reply_count||0;return n===0?`No replies yet`:`${n} ${n===1?`reply`:`replies`}`}function ye(e){let t=e.thread_state?.reply_count||0;return t===0?`Thread`:`${t} ${t===1?`reply`:`replies`}`}function be(e){let t=e.thread_state?.last_reply_at;return t?xe(t):``}function xe(e){let t=new Date(e).getTime();if(!Number.isFinite(t))return``;let n=Math.max(0,Date.now()-t),r=Math.floor(n/6e4);if(r<1)return`now`;if(r<60)return`${r}m`;let i=Math.floor(r/60);return i<24?`${i}h`:`${Math.floor(i/24)}d`}function Se(e){let t=new Date(e),n=new Date,r=new Date;r.setDate(n.getDate()-1);let i=(e,t)=>e.getFullYear()===t.getFullYear()&&e.getMonth()===t.getMonth()&&e.getDate()===t.getDate();return i(t,n)?`Today`:i(t,r)?`Yesterday`:new Intl.DateTimeFormat(void 0,{weekday:`long`,month:`long`,day:`numeric`}).format(t)}function Ce(e){let t=[],n=``,r=``,i=0;for(let a of e){let e=new Date(a.created_at),o=e.toDateString(),s=a.author?.id||a.author_id||`local`,c=o!==n,l=s!==r,u=e.getTime()-i>3e5;c||l||u||t.length===0?t.push({key:a.id,dayLabel:c?Se(a.created_at):null,messages:[a],authorName:a.author?.display_name||`Local User`,authorHandle:ce(a.author),authorAvatarURL:L(a.author)?``:a.author?.avatar_url||``,authorID:s,authorDeleted:L(a.author),timestamp:a.created_at}):t[t.length-1].messages.push(a),n=o,r=s,i=e.getTime()}return t}function we(){return typeof crypto<`u`&&typeof crypto.randomUUID==`function`?crypto.randomUUID().replace(/-/g,``):`${Date.now().toString(36)}${Math.random().toString(36).slice(2,10)}`}function Te(e,t){let n={...e,...t,thread_state:t.thread_state?Ee(e.thread_state??null,t.thread_state):e.thread_state};return(e.deleted_at||!t.deleted_at&&(e.edited_at?.replace(/Z$/,``)??``)>(t.edited_at?.replace(/Z$/,``)??``))&&(n.body=e.body,n.edited_at=e.edited_at,n.deleted_at=e.deleted_at,e.deleted_at&&(n.attachments=e.attachments)),n}function Ee(e,t){return e?.root_message_id===t.root_message_id&&e.reply_count>t.reply_count?e:t}var De=12;function Oe(e){return e.replace(/^\p{White_Space}+/u,``).replace(/\p{White_Space}+$/u,``)}var ke=class{reveal;#e=M(C(new Map));get sessions(){return v(this.#e)}set sessions(e){j(this.#e,e,!0)}generation=0;touchSequence=0;constructor(e){this.reveal=e}session(e){return e?this.sessions.get(e):void 0}isEditing(e,t,n){let r=this.session(e);return r?.messageID===t&&r.surface===n}start(e,t,n){if(!e||!t.id||t.deleted_at||t.status===`pending`||t.status===`failed`)return`invalid`;let r=this.sessions.get(e);if(r){if(r.messageID===t.id&&r.surface===n)return this.cancel(e)?`cancelled`:`blocked`;let i=this.touched(r);return this.setSession(e,i),this.reveal?.(e,i),`blocked`}let i={messageID:t.id,surface:n,threadRootID:n===`thread`?t.thread_root_id:void 0,threadSeq:t.thread_seq,originalBody:t.body,draft:t.body,error:``,saving:!1,generation:++this.generation,touchedAt:++this.touchSequence};return this.setSession(e,i),this.trimSessions(e),`started`}updateDraft(e,t){let n=this.sessions.get(e);n&&!n.saving&&this.setSession(e,this.touched({...n,draft:t,error:``}))}cancel(e,t){let n=this.sessions.get(e);return!n||n.saving||t&&n.surface!==t?!1:(this.deleteSession(e),!0)}cancelMessage(e,t){let n=this.sessions.get(e);return!n||n.messageID!==t?!1:this.cancel(e)}clear(){this.generation+=1,this.sessions=new Map}reconcile(e,t){let n=this.sessions.get(e);if(!n||n.saving)return;let r=t.find(e=>e.id===n.messageID);if(r){if(r.deleted_at){this.deleteSession(e);return}if(r.body!==n.originalBody){if(n.draft===n.originalBody){this.setSession(e,this.touched({...n,originalBody:r.body,draft:r.body,error:``}));return}this.setSession(e,this.touched({...n,originalBody:r.body,error:`This message changed elsewhere. Review your draft before saving.`}))}}}async save(e,t,n){let r=this.sessions.get(e);if(!r||r.messageID!==t.id||r.saving)return`invalid`;let i=Oe(r.draft);if(!i)return this.setSession(e,this.touched({...r,error:`Message body is required`})),`invalid`;if(i===t.body)return this.deleteSession(e),`cancelled`;this.setSession(e,this.touched({...r,error:``,saving:!0}));let a=r.generation;try{let i=await F(`/api/messages/${t.id}`,{method:`PATCH`,body:JSON.stringify({body:r.draft})});if(this.sessions.get(e)?.generation!==a)return`invalid`;let{id:o,thread_root_id:s,body:c,edited_at:l}=i.message;return n({id:o,thread_root_id:s,body:c,edited_at:l}),this.deleteSession(e),`saved`}catch(t){let n=this.sessions.get(e);return n?.generation===a?(this.setSession(e,this.touched({...n,error:I(t,`Could not edit message`)})),`failed`):`invalid`}finally{let t=this.sessions.get(e);t?.generation===a&&this.setSession(e,this.touched({...t,saving:!1}))}}touched(e){return{...e,touchedAt:++this.touchSequence}}setSession(e,t){let n=new Map(this.sessions);n.delete(e),n.set(e,t),this.sessions=n}deleteSession(e){if(!this.sessions.has(e))return;let t=new Map(this.sessions);t.delete(e),this.sessions=t}trimSessions(e){if(this.sessions.size<=De)return;let t=[...this.sessions.entries()].filter(([t,n])=>t!==e&&!n.saving).sort((e,t)=>e[1].touchedAt-t[1].touchedAt),n=this.sessions.size-De,r=new Map(this.sessions);for(let[e]of t.slice(0,n))r.delete(e);this.sessions=r}},Ae=4001;function je(e){return e===Ae}async function Me(e){let t=e.readCursor();if(!e.isActive())return{active:!1};let n=await e.fetchTailCursor();return e.isActive()?{active:!0,cursor:t||n,persistAfterOpen:!t}:{active:!1}}var Ne=8192;function Pe(e){let t=e.isActive??(()=>!0),n=e.maxPendingEvents??Ne,r=[],i=[],a=!1,o=!1;function s(){if(a)return!1;try{return t()}catch{return!1}}function c(){if(!(o||r.length>0))for(let e of i.splice(0))e()}function l(t){if(s()){a=!0,r.length=0;try{e.onError?.(t)}catch{}try{e.onFailure?.()}catch{}c()}}async function u(){if(!o){for(o=!0;s()&&r.length>0;){let t=r.shift();try{if(await e.onEvent(t),!s()){r.length=0;break}t.cursor&&e.persistCursor(t.cursor)}catch(e){l(e);break}}o=!1,c()}}return{enqueue(e){if(s()){if(r.length>=n){l(Error(`Realtime event queue overflowed; reconnecting to recover`));return}r.push(e),u()}},stop(){a=!0,r.length=0,c()},whenIdle(){return!o&&r.length===0?Promise.resolve():new Promise(e=>i.push(e))}}}var Fe=class extends Error{},Ie=e=>`clickclack:${e}:cursor`;function Le(e){let{workspaceID:t,onEvent:n,onOpen:r,onError:i,onStatusChange:a}=e,o=e.reconnectDelayMs??1200,s=null,c=null,l,u=0,d=null,f=!1,p=!0,m=!1,h=null,g=!1,_=!1;function v(e){_!==e&&(_=e,a?.(e))}function y(e){try{i?.(e)}catch{}}function b(){if(m)return null;if(d!==null||f)return d;f=!0;try{d=localStorage.getItem(Ie(t))}catch{p=!1}return d}function x(e){if(d=e,p)try{localStorage.setItem(Ie(t),e)}catch{p=!1}}function S(e){return!g&&u===e}function C(e){if(!S(e)||l!==void 0)return;let t=++u;c?.abort(),c=null,v(!1),l=window.setTimeout(()=>{l=void 0,!g&&u===t&&E()},o)}async function w(e){let n=new URLSearchParams({workspace_id:t,limit:`1`,include_tail:`true`}),r=await ae(`/api/realtime/events?${n.toString()}`,{signal:e}).catch(async n=>{if(n instanceof oe&&[400,403].includes(n.status)){let{workspaces:n}=await ae(`/api/workspaces`,{signal:e});if(!n.some(e=>e.id===t))throw new Fe(`You no longer have access to this workspace.`)}throw n});if(typeof r.tail_cursor!=`string`)throw Error(`Realtime bootstrap response did not include a tail cursor`);return m?h??=r.tail_cursor:r.tail_cursor}async function T(e,i){let a=await Me({readCursor:b,fetchTailCursor:()=>w(i),isActive:()=>S(e)});if(!a.active||!S(e))return;let o=new URL(P(`/api/realtime/ws`),window.location.href);o.protocol=o.protocol===`https:`?`wss:`:`ws:`,o.searchParams.set(`workspace_id`,t),a.cursor&&o.searchParams.set(`after_cursor`,a.cursor);let c=new WebSocket(o);s=c;let l=()=>S(e)&&s===c,u=Promise.resolve(),d=!1,f=t=>{l()&&(d||y(t),d=!0,C(e),c.close())},p=Pe({async onEvent(e){await u,l()&&await n(e,l)},persistCursor(e){x(e)},onError:f,isActive:l});c.addEventListener(`open`,()=>{l()&&(u=Promise.resolve().then(()=>r?.(l,a.persistAfterOpen)).then(()=>{a.persistAfterOpen&&l()&&(x(a.cursor),m=!1,h=null)}),u.then(()=>{l()&&v(!0)},f))}),c.addEventListener(`message`,e=>{if(!l())return;let t;try{t=JSON.parse(String(e.data))}catch{return}Re(t)&&p.enqueue(t)}),c.addEventListener(`close`,t=>{p.stop(),l()&&(je(t.code)&&(m=!0,h=null),s=null,v(!1),C(e))})}function E(){if(g)return;let e=++u,t=new AbortController;c=t,T(e,t.signal).catch(t=>{S(e)&&(y(t instanceof oe&&t.status!==401?Error(t.message,{cause:t}):t),C(e))}).finally(()=>{c===t&&(c=null)})}return E(),{get connected(){return _},close(){g=!0,u+=1,c?.abort(),c=null,v(!1),l&&window.clearTimeout(l),l=void 0,s?.close(),s=null}}}function Re(e){return typeof e==`object`&&!!e&&typeof e.type==`string`}var U=fe+50,ze=class{currentUserID;#e=M(C(new Map));get entries(){return v(this.#e)}set entries(e){j(this.#e,e,!0)}revision=0;generation=0;constructor(e){this.currentUserID=e}clear(){this.generation+=1,this.revision=0,this.entries=new Map}seedMessages(e){if(e.length===0)return;let t=new Map(this.entries),n=!1;for(let r of e){let e=Be(r.reactions??[]),i=t.get(r.id);if(!i){t.set(r.id,this.newEntry(e,!0)),n=!0;continue}if(i.complete)continue;let a=Ve(e,i.confirmed,i.partialEmojis);t.set(r.id,{...i,confirmed:a,displayed:W(a,i.pendingIntent),complete:!0,partialEmojis:new Map,revision:++this.revision}),n=!0}n&&(this.entries=Ke(t))}reactionsFor(e){return this.entries.get(e.id)?.displayed??e.reactions??[]}pending(e){return!!this.entries.get(e)?.pendingIntent}error(e){return this.entries.get(e)?.error??``}applyEvent(e){if(e.type!==`reaction.added`&&e.type!==`reaction.removed`)return;let t=e.payload.message_id,n=e.payload.emoji,r=e.payload.count;if(!t||!n||typeof r!=`number`)return;let i=this.entries.get(t);if(i?.lastEventCursor&&e.cursor&&e.cursor<=i.lastEventCursor)return;let a=e.payload.user_id===this.currentUserID(),o=new Map(i?.partialEmojis);i?.complete||o.set(n,r<=0?!1:a?e.type===`reaction.added`:o.get(n));let s=He(i?.confirmed??[],n,Math.max(0,r),e.type===`reaction.added`,a),c=i?.pendingIntent,l=a&&c?.emoji===n;this.setEntry(t,{confirmed:s,displayed:l?s:W(s,c),complete:i?.complete??!1,partialEmojis:o,revision:++this.revision,lastEventCursor:e.cursor||i?.lastEventCursor||``,pendingIntent:c,error:``})}async toggle(e,t){if(!this.currentUserID()||!t)return;let n=this.ensureEntry(e);if(n.pendingIntent)return;let r=Ue(n.displayed,t)?`remove`:`add`,i=this.generation,a=n.revision,o={emoji:t,intent:r};this.setEntry(e.id,{...n,displayed:W(n.confirmed,o),pendingIntent:o,error:``});try{let n=r===`remove`?await F(`/api/messages/${e.id}/reactions/${encodeURIComponent(t)}`,{method:`DELETE`}):await F(`/api/messages/${e.id}/reactions`,{method:`POST`,body:JSON.stringify({emoji:t})});if(i!==this.generation)return;let o=this.entries.get(e.id);if(!o)return;let s=n.event?.cursor??``;if(o.revision===a||s&&(!o.lastEventCursor||s>=o.lastEventCursor)){let t=Be(n.reactions);this.setEntry(e.id,{...o,confirmed:t,displayed:W(t,o.pendingIntent),complete:!0,partialEmojis:new Map,revision:++this.revision})}}catch(t){if(i!==this.generation)return;let n=this.entries.get(e.id)?.revision;try{let t=await F(`/api/messages/${e.id}`);if(i===this.generation&&this.entries.get(e.id)?.revision===n){let n=Be(t.message.reactions??[]),r=this.entries.get(e.id);r&&this.setEntry(e.id,{...r,confirmed:n,displayed:W(n,r.pendingIntent),complete:!0,partialEmojis:new Map,revision:++this.revision})}}catch{}let r=this.entries.get(e.id);i===this.generation&&r&&this.setEntry(e.id,{...r,error:We(r.confirmed,o)?``:I(t,`Could not update reaction`)})}finally{if(i===this.generation){let t=this.entries.get(e.id);t?.pendingIntent===o&&this.setEntry(e.id,{...t,displayed:t.confirmed,pendingIntent:void 0})}}}ensureEntry(e){let t=this.entries.get(e.id);if(t)return t;let n=this.newEntry(Be(e.reactions??[]),!0);return this.setEntry(e.id,n),n}newEntry(e,t){return{confirmed:e,displayed:e,complete:t,partialEmojis:new Map,revision:++this.revision,lastEventCursor:``,error:``}}setEntry(e,t){let n=new Map(this.entries);n.delete(e),n.set(e,t),this.entries=Ke(n)}};function Be(e){let t=new Map;for(let n of e)!n.emoji||n.count<=0||t.set(n.emoji,{emoji:n.emoji,count:n.count,reacted_by_me:n.reacted_by_me});return Ge([...t.values()])}function Ve(e,t,n){let r=new Map(e.map(e=>[e.emoji,e])),i=new Map(t.map(e=>[e.emoji,e]));for(let[e,t]of n){let n=i.get(e);n?r.set(e,{...n,reacted_by_me:t??r.get(e)?.reacted_by_me??!1}):r.delete(e)}return Ge([...r.values()])}function W(e,t){if(!t)return e;let n=e.map(e=>({...e})),r=n.findIndex(e=>e.emoji===t.emoji);if(t.intent===`remove`){if(r<0||!n[r].reacted_by_me)return n;n[r].count<=1?n.splice(r,1):n[r]={...n[r],count:n[r].count-1,reacted_by_me:!1}}else r<0?n.push({emoji:t.emoji,count:1,reacted_by_me:!0}):n[r].reacted_by_me||(n[r]={...n[r],count:n[r].count+1,reacted_by_me:!0});return Ge(n)}function He(e,t,n,r,i){let a=e.map(e=>({...e})),o=a.findIndex(e=>e.emoji===t);if(n===0)return o>=0&&a.splice(o,1),Ge(a);let s={emoji:t,count:n,reacted_by_me:i?r:o>=0&&a[o].reacted_by_me};return o>=0?a[o]=s:a.push(s),Ge(a)}function Ue(e,t){return e.some(e=>e.emoji===t&&e.reacted_by_me)}function We(e,t){return Ue(e,t.emoji)===(t.intent===`add`)}function Ge(e){return e.sort((e,t)=>t.count-e.count||e.emoji.localeCompare(t.emoji))}function Ke(e){let t=e.size;for(;e.size>U&&t>0;){--t;let n=e.keys().next().value;if(!n)break;let r=e.get(n);e.delete(n),r?.pendingIntent&&e.set(n,r)}return e}function qe(e,t){let n=()=>{let t=e.style.height;e.style.height=`auto`;let n=`${e.scrollHeight}px`;t===n?e.style.height=t:e.style.height=n},r=()=>n(),i=()=>n();return requestAnimationFrame(n),e.addEventListener(`input`,r),window.addEventListener(`resize`,i),{update(){requestAnimationFrame(n)},destroy(){e.removeEventListener(`input`,r),window.removeEventListener(`resize`,i)}}}function Je(e){return P(`/api/uploads/${encodeURIComponent(e.id)}`)}function Ye(e){return e.content_type.startsWith(`image/`)}function Xe(e){return e<1024?`${e} B`:e<1048576?`${Math.round(e/1024)} KB`:`${(e/1048576).toFixed(1)} MB`}var Ze=[{title:`Ship it`,url:`https://media.giphy.com/media/v1.Y2lkPTc5MGI3NjExYjJ1bm1meHE4N2x3bnN0djJkMWtjNGc5bXYzZDFiOHBsbG16M3F0ZSZlcD12MV9naWZzX3NlYXJjaCZjdD1n/l0HlHFRbmaZtBRhXG/giphy.gif`,tags:[`ship`,`launch`,`done`]},{title:`Approved`,url:`https://media.giphy.com/media/v1.Y2lkPTc5MGI3NjExazBpbzJ6ODZ3bXQ3OHBvNGJidWZoajc0cHV6YnVub3MzZ3c1a2Z2dSZlcD12MV9naWZzX3NlYXJjaCZjdD1n/111ebonMs90YLu/giphy.gif`,tags:[`yes`,`approved`,`nice`]},{title:`Deploy dance`,url:`https://media.giphy.com/media/v1.Y2lkPTc5MGI3NjExY3NkaTVmZW9ydWNnZnl0ZWQ5aHQyeGNrd2k3NG4wZWNqYzNmd3k1ZCZlcD12MV9naWZzX3NlYXJjaCZjdD1n/GeimqsH0TLDt4tScGw/giphy.gif`,tags:[`deploy`,`dance`,`celebrate`]},{title:`Looking`,url:`https://media.giphy.com/media/v1.Y2lkPTc5MGI3NjExYWZ3emE0dm5mN2h0bGVsY2w0OXBodGd2cGJlNDRiZXo1YWNtdWRmZyZlcD12MV9naWZzX3NlYXJjaCZjdD1n/26n6WywJyh39n1pBu/giphy.gif`,tags:[`search`,`looking`,`debug`]},{title:`Typing faster`,url:`https://media.giphy.com/media/v1.Y2lkPTc5MGI3NjExOWFlbnJnbnIzbHYxcDIzdXZ3NGF3N2FocHNvMmR5enU3bHpycHBlZSZlcD12MV9naWZzX3NlYXJjaCZjdD1n/13HgwGsXF0aiGY/giphy.gif`,tags:[`typing`,`code`,`work`]},{title:`Tiny victory`,url:`https://media.giphy.com/media/v1.Y2lkPTc5MGI3NjExdjJ2b2tqNmF4dG16NjE0eXhuc3h5bTlvamgwNTR0Zmd6ZjhtM2JuaSZlcD12MV9naWZzX3NlYXJjaCZjdD1n/3o7abKhOpu0NwenH3O/giphy.gif`,tags:[`win`,`victory`,`celebrate`]}],Qe=N(`
`);function G(e,r){i(r,!0);let a=y(r,`disabled`,3,!1);var o=Qe(),c=x(o),l=T(c,2),u=T(l,2),d=x(u);d.textContent=`<>`,t(u);var f=T(u,2),p=x(f);p.textContent=`{}`,t(f);var g=T(f,2),_=T(g,2);let v;t(o),k(()=>{c.disabled=a(),l.disabled=a(),u.disabled=a(),f.disabled=a(),g.disabled=a(),S(_,`aria-expanded`,r.showGifPicker),_.disabled=a(),v=n(_,1,``,null,v,{active:r.showGifPicker})}),h(`click`,c,()=>r.onWrap(`**`)),h(`click`,l,()=>r.onWrap(`_`)),h(`click`,u,()=>r.onWrap("`")),h(`click`,f,()=>r.onWrap("\n```\n","\n```\n",`code`)),h(`click`,g,()=>r.onWrap(`[`,`](https://)`,`label`)),h(`click`,_,function(...e){r.onToggleGif?.apply(this,e)}),s(e,o),m()}a([`click`]);var $e=N(``),et=N(`

No GIFs found

`),tt=N(``);function nt(e,n){i(n,!0);let r=M(void 0);ne(()=>v(r)?.focus());var a=tt(),c=x(a),u=T(x(c),2);w(u),A(u,e=>j(r,e),()=>v(r)),t(c);var d=T(c,2);E(d,21,()=>n.gifs,e=>e.url,(e,r)=>{var i=$e(),a=x(i),c=T(a,2),l=O(c,!0);t(i),k(()=>{S(a,`src`,v(r).url),S(a,`alt`,v(r).title),o(l,v(r).title)}),h(`click`,i,()=>n.onPick(v(r).url,v(r).title)),s(e,i)}),t(d);var f=T(d,2),p=e=>{var t=et();s(e,t)};l(f,e=>{n.gifs.length===0&&e(p)}),t(a),k(()=>re(u,n.query)),h(`keydown`,a,e=>{e.isComposing||e.keyCode===229||e.key===`Escape`&&(e.preventDefault(),n.onClose())}),h(`input`,u,e=>n.onQuery(e.currentTarget.value)),s(e,a),m()}a([`keydown`,`input`,`click`]);var rt=N(`
Replying to
`);function it(e,n){i(n,!0);var r=rt(),a=T(x(r),2),c=x(a),l=T(x(c)),u=O(l,!0);t(c);var d=T(c,2),f=O(d,!0);t(a);var p=T(a,2);t(r),k((e,t)=>{o(u,e),o(f,t)},[()=>se(n.target.author),()=>ge(n.target.body)]),h(`click`,p,function(...e){n.onClear?.apply(this,e)}),s(e,r),m()}a([`click`]);var at=N(` `),ot=N(``),st=N(`
`),ct=N(``),lt=N(`
`),ut=N(``),dt=N(`
`);function ft(a,c){i(c,!0);let u=y(c,`formClass`,3,`composer`),d=y(c,`pendingUpload`,3,null),C=y(c,`replyTarget`,3,null),w=y(c,`showUpload`,3,!1),ee=y(c,`showToolbar`,3,!1),te=y(c,`slashCommands`,19,()=>[]),ne=y(c,`botCommands`,19,()=>[]),N=y(c,`mentionPeople`,19,()=>[]),P=y(c,`disabled`,3,!1),F=y(c,`onUploadFile`,3,()=>{}),ae=y(c,`onRemoveUpload`,3,()=>{}),oe=y(c,`onClearReply`,3,()=>{}),I=M(null),se=M(0),ce=M(``),L=M(0),R=M(!1),z=M(``),de=f(()=>{let e=v(z).trim().toLowerCase();return Ze.filter(t=>!e||t.title.toLowerCase().includes(e)||t.tags.some(t=>t.includes(e)))}),B=f(()=>H(c.value,v(se))),V=f(()=>!v(B)||fe(v(B))===v(ce)?[]:v(B).kind===`slash`?he(v(B)):_e(v(B)));b(()=>(c.onInputRef(v(I)),()=>c.onInputRef(null))),b(()=>{if(v(V).length===0){j(L,0);return}v(L)>=v(V).length&&j(L,0)});function H(e,t){let n=e.slice(0,t),r=/(^|\s)([/@][^\s]*)$/.exec(n);if(!r)return null;let i=r[2],a=n.length-i.length;return i.startsWith(`/`)&&a!==0?null:{kind:i.startsWith(`/`)?`slash`:`mention`,start:a,end:n.length,query:i.slice(1).toLowerCase(),raw:i}}function fe(e){return`${e.kind}:${e.start}:${e.raw}`}function pe(e=v(I)){j(se,e?.selectionStart??c.value.length,!0)}function me(e){return e.startsWith(`/`)?e:`/${e}`}function he(e){let t=e.query,n=te().filter(e=>!e.revoked_at).map(e=>{let t=me(e.command);return{id:e.id,kind:`slash`,label:t,detail:e.description||`Slash command`,insertText:`${t} `,sortText:t.slice(1).toLowerCase()}}),r=new Set(n.map(e=>e.label)),i=ne().filter(e=>!r.has(me(e.command))).map(e=>{let t=me(e.command);return{id:e.id,kind:`slash`,label:t,detail:e.description,insertText:`${t} `,sortText:t.slice(1).toLowerCase(),hint:e.args_hint||void 0,source:e.bot.handle?`@${e.bot.handle}`:e.bot.display_name}});return[...n,...i].filter(e=>!t||e.sortText.includes(t)).sort((e,n)=>Number(!e.sortText.startsWith(t))-Number(!n.sortText.startsWith(t))||e.sortText.localeCompare(n.sortText)).slice(0,6)}function ge(e){return le(e.handle||e.display_name.replace(/\s+/g,``))}function _e(e){let t=e.query,n=new Set;return N().filter(e=>!e.id||!e.handle?.trim()||n.has(e.id)?!1:(n.add(e.id),!0)).map(e=>{let t=ge(e),n=`${e.handle||``} ${e.display_name}`.trim().toLowerCase();return{id:e.id,kind:`mention`,label:t,detail:e.kind===`bot`?`${e.display_name} · bot`:e.display_name,insertText:`${t} `,sortText:n}}).filter(e=>!t||e.sortText.includes(t)).sort((e,n)=>Number(!e.sortText.startsWith(t))-Number(!n.sortText.startsWith(t))||e.sortText.localeCompare(n.sortText)).slice(0,6)}function ve(e){v(B)&&ye(`${c.value.slice(0,v(B).start)}${e.insertText}${c.value.slice(v(B).end)}`,v(B).start+e.insertText.length)}async function ye(t,n=t.length,r=n){P()||(c.onValue(t),await e(),!P()&&(v(I)?.focus(),v(I)?.setSelectionRange(n,r),j(se,n,!0)))}function be(e,t=e,n=`text`){let r=v(I)?.selectionStart??c.value.length,i=v(I)?.selectionEnd??r,a=c.value.slice(r,i)||n;ye(`${c.value.slice(0,r)}${e}${a}${t}${c.value.slice(i)}`,r+e.length,r+e.length+a.length)}function xe(){v(R)&&(j(R,!1),j(z,``),v(I)?.focus())}function Se(e,t){let n=c.value&&!c.value.endsWith(` +import{$ as e,At as t,C as n,Ct as r,Et as i,H as a,I as o,L as s,M as c,P as l,R as u,S as d,St as f,T as p,Tt as m,U as h,V as g,W as _,Y as v,a as y,ct as b,ft as x,g as S,gt as C,h as w,ht as T,j as E,kt as D,mt as O,n as ee,pt as te,r as ne,st as k,u as A,v as re,vt as j,w as ie,yt as M,z as N}from"./BTIB_WQZ.js";import"./xihTtKlq.js";import{a as P,n as F,o as ae,t as oe,u as I}from"./DEPNME54.js";import{d as se,f as ce,l as le,r as ue,u as L}from"./ByQ3bZN5.js";var R=Symbol(`clickclackAnimatedURL`),z=new WeakMap;function de(e){let t=e.scrollWidth-e.clientWidth>1;if(e.toggleAttribute(`data-overflowing`,t),t){e.tabIndex=0,e.setAttribute(`role`,`group`),e.setAttribute(`aria-label`,`Scrollable table`);return}e.removeAttribute(`tabindex`),e.removeAttribute(`role`),e.removeAttribute(`aria-label`)}var B=typeof ResizeObserver>`u`?null:new ResizeObserver(e=>{let t=new Set;for(let n of e){let e=z.get(n.target);e&&t.add(e)}for(let e of t)de(e)});function V(e){return e[R]||e.currentSrc||e.src}function H(e){let t=new Map,n=new Map,r=new Map,i=new Map,a=!1,o=e=>{let t=r.get(e);t&&(B?.unobserve(e),B?.unobserve(t),r.delete(e))},s=()=>{for(let t of r.keys())e.contains(t)||o(t);for(let t of e.querySelectorAll(`table`)){let e=t.parentElement?.classList.contains(`markdown-table-scroll`)===!0?t.parentElement:null;e&&r.has(e)||(e||(e=document.createElement(`div`),e.className=`markdown-table-scroll`,t.before(e),e.append(t)),r.set(e,t),z.set(e,e),z.set(t,e),B?.observe(e),B?.observe(t),de(e))}},c=e=>{try{let t=new URL(e,window.location.href);if(t.hostname!==`giphy.com`&&!t.hostname.endsWith(`.giphy.com`))return``;let n=t.pathname.match(/\/media\/(?:v1\.[^/]+\/)?([^/]+)\/giphy\.gif$/);if(n)return`${t.origin}/media/${n[1]}/giphy_s.gif`}catch{return``}return``},l=e=>`${e}${e.includes(`?`)?`&`:`?`}cc_replay=${Date.now()}`,u=(e,r,i,o,s,c=!1)=>{let u=t.get(r);u&&window.clearTimeout(u);let d=(n.get(r)||0)+1;n.set(r,d),e.classList.add(`playing`),e.classList.remove(`paused`),i.disabled=!0,i.tabIndex=-1,i.ariaHidden=`true`;let f=!1,p=()=>{if(f||(f=!0,a||n.get(r)!==d))return;let o=window.setTimeout(()=>{a||n.get(r)!==d||(e.classList.remove(`playing`),e.classList.add(`paused`),i.disabled=!1,i.tabIndex=0,i.ariaHidden=`false`,s&&(r.src=s))},2600);t.set(r,o)},m=()=>{r.decode().catch(()=>{}).then(p)};r.addEventListener(`load`,m,{once:!0}),c&&(r.src=l(o)),r.complete&&r.naturalWidth>0&&m()},d=()=>{s();for(let t of e.querySelectorAll(`img`)){if(t.closest(`.gif-player`)||t.closest(`a`))continue;let e=t.getAttribute(`src`)||t.src;if(!/\.gif(?:$|[?#])/i.test(e))continue;let n=c(e);if(!n)continue;let r=document.createElement(`span`);r.className=`gif-player`;let a=document.createElement(`span`);a.className=`gif-badge`,a.textContent=`GIF`;let o=document.createElement(`button`);o.type=`button`,o.className=`gif-replay`,o.disabled=!0,o.tabIndex=-1,o.ariaHidden=`true`,o.ariaLabel=`Replay GIF ${t.alt||`image`}`,o.title=`Replay GIF`,o.textContent=`↻`;let s=t.parentNode,l=t.nextSibling,d=t.getAttribute(`src`)||t.src;t[R]=e,s?.insertBefore(r,t),r.append(t,a,o);let f=i=>{i.preventDefault(),i.stopPropagation(),u(r,t,o,e,n,!0)};i.set(t,{wrapper:r,replay:o,originalSrc:d,originalParent:s,originalNextSibling:l,onReplay:f}),o.addEventListener(`click`,f),u(r,t,o,e,n)}},f=new MutationObserver(d);return f.observe(e,{childList:!0,subtree:!0}),d(),{destroy(){a=!0,f.disconnect();for(let e of r.keys())o(e);for(let e of t.values())window.clearTimeout(e);for(let[e,t]of i)t.replay.removeEventListener(`click`,t.onReplay),delete e[R],e.src=t.originalSrc,t.wrapper.parentNode?t.wrapper.replaceWith(e):t.originalParent&&e.parentNode!==t.originalParent&&t.originalParent.insertBefore(e,t.originalNextSibling);i.clear(),t.clear(),n.clear()}}}var fe=1e3;function pe(e,t,n){if(e.length<=900)return e;let r=me(e,n);if(t===`prepend`)return he(e,0,700,r,`start`);if(t===`append`)return he(e,Math.max(0,e.length-700),e.length,r,`end`);if(t===`around`){let t=r?.first??-1,n=t>=0?t:Math.floor(e.length/2),i=Math.max(0,n-350),a=Math.min(e.length,i+700);return i=Math.max(0,a-700),he(e,i,a,r,`start`)}return he(e,Math.max(0,e.length-700),e.length,r,`end`)}function me(e,t){if(t.size===0)return null;let n=-1,r=-1;for(let i=0;i1e3&&(i===`start`?(a=t,o=Math.min(e.length,a+fe)):(o=n,a=Math.max(0,o-fe))),e.slice(a,o)}function ge(e,t=120){if(!e||t<=0)return``;let n=e.replace(/\s+/g,` `).trim();return n.length<=t?n:t<=3?`.`.repeat(t):`${n.slice(0,t-3)}...`}function _e(e){return se(e.quoted_author,`Unknown`)}function ve(e,t){if(t===e.id)return`Open`;let n=e.thread_state?.reply_count||0;return n===0?`No replies yet`:`${n} ${n===1?`reply`:`replies`}`}function ye(e){let t=e.thread_state?.reply_count||0;return t===0?`Thread`:`${t} ${t===1?`reply`:`replies`}`}function be(e){let t=e.thread_state?.last_reply_at;return t?xe(t):``}function xe(e){let t=new Date(e).getTime();if(!Number.isFinite(t))return``;let n=Math.max(0,Date.now()-t),r=Math.floor(n/6e4);if(r<1)return`now`;if(r<60)return`${r}m`;let i=Math.floor(r/60);return i<24?`${i}h`:`${Math.floor(i/24)}d`}function Se(e){let t=new Date(e),n=new Date,r=new Date;r.setDate(n.getDate()-1);let i=(e,t)=>e.getFullYear()===t.getFullYear()&&e.getMonth()===t.getMonth()&&e.getDate()===t.getDate();return i(t,n)?`Today`:i(t,r)?`Yesterday`:new Intl.DateTimeFormat(void 0,{weekday:`long`,month:`long`,day:`numeric`}).format(t)}function Ce(e){let t=[],n=``,r=``,i=0;for(let a of e){let e=new Date(a.created_at),o=e.toDateString(),s=a.author?.id||a.author_id||`local`,c=o!==n,l=s!==r,u=e.getTime()-i>3e5;c||l||u||t.length===0?t.push({key:a.id,dayLabel:c?Se(a.created_at):null,messages:[a],authorName:a.author?.display_name||`Local User`,authorHandle:ce(a.author),authorAvatarURL:L(a.author)?``:a.author?.avatar_url||``,authorID:s,authorDeleted:L(a.author),timestamp:a.created_at}):t[t.length-1].messages.push(a),n=o,r=s,i=e.getTime()}return t}function we(){return typeof crypto<`u`&&typeof crypto.randomUUID==`function`?crypto.randomUUID().replace(/-/g,``):`${Date.now().toString(36)}${Math.random().toString(36).slice(2,10)}`}function Te(e,t){let n={...e,...t,thread_state:t.thread_state?Ee(e.thread_state??null,t.thread_state):e.thread_state};return(e.deleted_at||!t.deleted_at&&(e.edited_at?.replace(/Z$/,``)??``)>(t.edited_at?.replace(/Z$/,``)??``))&&(n.body=e.body,n.edited_at=e.edited_at,n.deleted_at=e.deleted_at,e.deleted_at&&(n.attachments=e.attachments)),n}function Ee(e,t){return e?.root_message_id===t.root_message_id&&e.reply_count>t.reply_count?e:t}var De=12;function Oe(e){return e.replace(/^\p{White_Space}+/u,``).replace(/\p{White_Space}+$/u,``)}var ke=class{reveal;#e=M(C(new Map));get sessions(){return v(this.#e)}set sessions(e){j(this.#e,e,!0)}generation=0;touchSequence=0;constructor(e){this.reveal=e}session(e){return e?this.sessions.get(e):void 0}isEditing(e,t,n){let r=this.session(e);return r?.messageID===t&&r.surface===n}start(e,t,n){if(!e||!t.id||t.deleted_at||t.status===`pending`||t.status===`failed`)return`invalid`;let r=this.sessions.get(e);if(r){if(r.messageID===t.id&&r.surface===n)return this.cancel(e)?`cancelled`:`blocked`;let i=this.touched(r);return this.setSession(e,i),this.reveal?.(e,i),`blocked`}let i={messageID:t.id,surface:n,threadRootID:n===`thread`?t.thread_root_id:void 0,threadSeq:t.thread_seq,originalBody:t.body,draft:t.body,error:``,saving:!1,generation:++this.generation,touchedAt:++this.touchSequence};return this.setSession(e,i),this.trimSessions(e),`started`}updateDraft(e,t){let n=this.sessions.get(e);n&&!n.saving&&this.setSession(e,this.touched({...n,draft:t,error:``}))}cancel(e,t){let n=this.sessions.get(e);return!n||n.saving||t&&n.surface!==t?!1:(this.deleteSession(e),!0)}cancelMessage(e,t){let n=this.sessions.get(e);return!n||n.messageID!==t?!1:this.cancel(e)}clear(){this.generation+=1,this.sessions=new Map}reconcile(e,t){let n=this.sessions.get(e);if(!n||n.saving)return;let r=t.find(e=>e.id===n.messageID);if(r){if(r.deleted_at){this.deleteSession(e);return}if(r.body!==n.originalBody){if(n.draft===n.originalBody){this.setSession(e,this.touched({...n,originalBody:r.body,draft:r.body,error:``}));return}this.setSession(e,this.touched({...n,originalBody:r.body,error:`This message changed elsewhere. Review your draft before saving.`}))}}}async save(e,t,n){let r=this.sessions.get(e);if(!r||r.messageID!==t.id||r.saving)return`invalid`;let i=Oe(r.draft);if(!i)return this.setSession(e,this.touched({...r,error:`Message body is required`})),`invalid`;if(i===t.body)return this.deleteSession(e),`cancelled`;this.setSession(e,this.touched({...r,error:``,saving:!0}));let a=r.generation;try{let i=await F(`/api/messages/${t.id}`,{method:`PATCH`,body:JSON.stringify({body:r.draft})});if(this.sessions.get(e)?.generation!==a)return`invalid`;let{id:o,thread_root_id:s,body:c,edited_at:l}=i.message;return n({id:o,thread_root_id:s,body:c,edited_at:l}),this.deleteSession(e),`saved`}catch(t){let n=this.sessions.get(e);return n?.generation===a?(this.setSession(e,this.touched({...n,error:I(t,`Could not edit message`)})),`failed`):`invalid`}finally{let t=this.sessions.get(e);t?.generation===a&&this.setSession(e,this.touched({...t,saving:!1}))}}touched(e){return{...e,touchedAt:++this.touchSequence}}setSession(e,t){let n=new Map(this.sessions);n.delete(e),n.set(e,t),this.sessions=n}deleteSession(e){if(!this.sessions.has(e))return;let t=new Map(this.sessions);t.delete(e),this.sessions=t}trimSessions(e){if(this.sessions.size<=De)return;let t=[...this.sessions.entries()].filter(([t,n])=>t!==e&&!n.saving).sort((e,t)=>e[1].touchedAt-t[1].touchedAt),n=this.sessions.size-De,r=new Map(this.sessions);for(let[e]of t.slice(0,n))r.delete(e);this.sessions=r}},Ae=4001;function je(e){return e===Ae}async function Me(e){let t=e.readCursor();if(!e.isActive())return{active:!1};let n=await e.fetchTailCursor();return e.isActive()?{active:!0,cursor:t||n,persistAfterOpen:!t}:{active:!1}}var Ne=8192;function Pe(e){let t=e.isActive??(()=>!0),n=e.maxPendingEvents??Ne,r=[],i=[],a=!1,o=!1;function s(){if(a)return!1;try{return t()}catch{return!1}}function c(){if(!(o||r.length>0))for(let e of i.splice(0))e()}function l(t){if(s()){a=!0,r.length=0;try{e.onError?.(t)}catch{}try{e.onFailure?.()}catch{}c()}}async function u(){if(!o){for(o=!0;s()&&r.length>0;){let t=r.shift();try{if(await e.onEvent(t),!s()){r.length=0;break}t.cursor&&e.persistCursor(t.cursor)}catch(e){l(e);break}}o=!1,c()}}return{enqueue(e){if(s()){if(r.length>=n){l(Error(`Realtime event queue overflowed; reconnecting to recover`));return}r.push(e),u()}},stop(){a=!0,r.length=0,c()},whenIdle(){return!o&&r.length===0?Promise.resolve():new Promise(e=>i.push(e))}}}var Fe=class extends Error{},Ie=e=>`clickclack:${e}:cursor`;function Le(e){let{workspaceID:t,onEvent:n,onOpen:r,onError:i,onStatusChange:a}=e,o=e.reconnectDelayMs??1200,s=null,c=null,l,u=0,d=null,f=!1,p=!0,m=!1,h=null,g=!1,_=!1;function v(e){_!==e&&(_=e,a?.(e))}function y(e){try{i?.(e)}catch{}}function b(){if(m)return null;if(d!==null||f)return d;f=!0;try{d=localStorage.getItem(Ie(t))}catch{p=!1}return d}function x(e){if(d=e,p)try{localStorage.setItem(Ie(t),e)}catch{p=!1}}function S(e){return!g&&u===e}function C(e){if(!S(e)||l!==void 0)return;let t=++u;c?.abort(),c=null,v(!1),l=window.setTimeout(()=>{l=void 0,!g&&u===t&&E()},o)}async function w(e){let n=new URLSearchParams({workspace_id:t,limit:`1`,include_tail:`true`}),r=await ae(`/api/realtime/events?${n.toString()}`,{signal:e}).catch(async n=>{if(n instanceof oe&&[400,403].includes(n.status)){let{workspaces:n}=await ae(`/api/workspaces`,{signal:e});if(!n.some(e=>e.id===t))throw new Fe(`You no longer have access to this workspace.`)}throw n});if(typeof r.tail_cursor!=`string`)throw Error(`Realtime bootstrap response did not include a tail cursor`);return m?h??=r.tail_cursor:r.tail_cursor}async function T(e,i){let a=await Me({readCursor:b,fetchTailCursor:()=>w(i),isActive:()=>S(e)});if(!a.active||!S(e))return;let o=new URL(P(`/api/realtime/ws`),window.location.href);o.protocol=o.protocol===`https:`?`wss:`:`ws:`,o.searchParams.set(`workspace_id`,t),a.cursor&&o.searchParams.set(`after_cursor`,a.cursor);let c=new WebSocket(o);s=c;let l=()=>S(e)&&s===c,u=Promise.resolve(),d=!1,f=t=>{l()&&(d||y(t),d=!0,C(e),c.close())},p=Pe({async onEvent(e){await u,l()&&await n(e,l)},persistCursor(e){x(e)},onError:f,isActive:l});c.addEventListener(`open`,()=>{l()&&(u=Promise.resolve().then(()=>r?.(l,a.persistAfterOpen)).then(()=>{a.persistAfterOpen&&l()&&(x(a.cursor),m=!1,h=null)}),u.then(()=>{l()&&v(!0)},f))}),c.addEventListener(`message`,e=>{if(!l())return;let t;try{t=JSON.parse(String(e.data))}catch{return}Re(t)&&p.enqueue(t)}),c.addEventListener(`close`,t=>{p.stop(),l()&&(je(t.code)&&(m=!0,h=null),s=null,v(!1),C(e))})}function E(){if(g)return;let e=++u,t=new AbortController;c=t,T(e,t.signal).catch(t=>{S(e)&&(y(t instanceof oe&&t.status!==401?Error(t.message,{cause:t}):t),C(e))}).finally(()=>{c===t&&(c=null)})}return E(),{get connected(){return _},close(){g=!0,u+=1,c?.abort(),c=null,v(!1),l&&window.clearTimeout(l),l=void 0,s?.close(),s=null}}}function Re(e){return typeof e==`object`&&!!e&&typeof e.type==`string`}var U=fe+50,ze=class{currentUserID;#e=M(C(new Map));get entries(){return v(this.#e)}set entries(e){j(this.#e,e,!0)}revision=0;generation=0;constructor(e){this.currentUserID=e}clear(){this.generation+=1,this.revision=0,this.entries=new Map}seedMessages(e){if(e.length===0)return;let t=new Map(this.entries),n=!1;for(let r of e){let e=Be(r.reactions??[]),i=t.get(r.id);if(!i){t.set(r.id,this.newEntry(e,!0)),n=!0;continue}if(i.complete)continue;let a=Ve(e,i.confirmed,i.partialEmojis);t.set(r.id,{...i,confirmed:a,displayed:W(a,i.pendingIntent),complete:!0,partialEmojis:new Map,revision:++this.revision}),n=!0}n&&(this.entries=Ke(t))}reactionsFor(e){return this.entries.get(e.id)?.displayed??e.reactions??[]}pending(e){return!!this.entries.get(e)?.pendingIntent}error(e){return this.entries.get(e)?.error??``}applyEvent(e){if(e.type!==`reaction.added`&&e.type!==`reaction.removed`)return;let t=e.payload.message_id,n=e.payload.emoji,r=e.payload.count;if(!t||!n||typeof r!=`number`)return;let i=this.entries.get(t);if(i?.lastEventCursor&&e.cursor&&e.cursor<=i.lastEventCursor)return;let a=e.payload.user_id===this.currentUserID(),o=new Map(i?.partialEmojis);i?.complete||o.set(n,r<=0?!1:a?e.type===`reaction.added`:o.get(n));let s=He(i?.confirmed??[],n,Math.max(0,r),e.type===`reaction.added`,a),c=i?.pendingIntent,l=a&&c?.emoji===n;this.setEntry(t,{confirmed:s,displayed:l?s:W(s,c),complete:i?.complete??!1,partialEmojis:o,revision:++this.revision,lastEventCursor:e.cursor||i?.lastEventCursor||``,pendingIntent:c,error:``})}async toggle(e,t){if(!this.currentUserID()||!t)return;let n=this.ensureEntry(e);if(n.pendingIntent)return;let r=Ue(n.displayed,t)?`remove`:`add`,i=this.generation,a=n.revision,o={emoji:t,intent:r};this.setEntry(e.id,{...n,displayed:W(n.confirmed,o),pendingIntent:o,error:``});try{let n=r===`remove`?await F(`/api/messages/${e.id}/reactions/${encodeURIComponent(t)}`,{method:`DELETE`}):await F(`/api/messages/${e.id}/reactions`,{method:`POST`,body:JSON.stringify({emoji:t})});if(i!==this.generation)return;let o=this.entries.get(e.id);if(!o)return;let s=n.event?.cursor??``;if(o.revision===a||s&&(!o.lastEventCursor||s>=o.lastEventCursor)){let t=Be(n.reactions);this.setEntry(e.id,{...o,confirmed:t,displayed:W(t,o.pendingIntent),complete:!0,partialEmojis:new Map,revision:++this.revision})}}catch(t){if(i!==this.generation)return;let n=this.entries.get(e.id)?.revision;try{let t=await F(`/api/messages/${e.id}`);if(i===this.generation&&this.entries.get(e.id)?.revision===n){let n=Be(t.message.reactions??[]),r=this.entries.get(e.id);r&&this.setEntry(e.id,{...r,confirmed:n,displayed:W(n,r.pendingIntent),complete:!0,partialEmojis:new Map,revision:++this.revision})}}catch{}let r=this.entries.get(e.id);i===this.generation&&r&&this.setEntry(e.id,{...r,error:We(r.confirmed,o)?``:I(t,`Could not update reaction`)})}finally{if(i===this.generation){let t=this.entries.get(e.id);t?.pendingIntent===o&&this.setEntry(e.id,{...t,displayed:t.confirmed,pendingIntent:void 0})}}}ensureEntry(e){let t=this.entries.get(e.id);if(t)return t;let n=this.newEntry(Be(e.reactions??[]),!0);return this.setEntry(e.id,n),n}newEntry(e,t){return{confirmed:e,displayed:e,complete:t,partialEmojis:new Map,revision:++this.revision,lastEventCursor:``,error:``}}setEntry(e,t){let n=new Map(this.entries);n.delete(e),n.set(e,t),this.entries=Ke(n)}};function Be(e){let t=new Map;for(let n of e)!n.emoji||n.count<=0||t.set(n.emoji,{emoji:n.emoji,count:n.count,reacted_by_me:n.reacted_by_me});return Ge([...t.values()])}function Ve(e,t,n){let r=new Map(e.map(e=>[e.emoji,e])),i=new Map(t.map(e=>[e.emoji,e]));for(let[e,t]of n){let n=i.get(e);n?r.set(e,{...n,reacted_by_me:t??r.get(e)?.reacted_by_me??!1}):r.delete(e)}return Ge([...r.values()])}function W(e,t){if(!t)return e;let n=e.map(e=>({...e})),r=n.findIndex(e=>e.emoji===t.emoji);if(t.intent===`remove`){if(r<0||!n[r].reacted_by_me)return n;n[r].count<=1?n.splice(r,1):n[r]={...n[r],count:n[r].count-1,reacted_by_me:!1}}else r<0?n.push({emoji:t.emoji,count:1,reacted_by_me:!0}):n[r].reacted_by_me||(n[r]={...n[r],count:n[r].count+1,reacted_by_me:!0});return Ge(n)}function He(e,t,n,r,i){let a=e.map(e=>({...e})),o=a.findIndex(e=>e.emoji===t);if(n===0)return o>=0&&a.splice(o,1),Ge(a);let s={emoji:t,count:n,reacted_by_me:i?r:o>=0&&a[o].reacted_by_me};return o>=0?a[o]=s:a.push(s),Ge(a)}function Ue(e,t){return e.some(e=>e.emoji===t&&e.reacted_by_me)}function We(e,t){return Ue(e,t.emoji)===(t.intent===`add`)}function Ge(e){return e.sort((e,t)=>t.count-e.count||e.emoji.localeCompare(t.emoji))}function Ke(e){let t=e.size;for(;e.size>U&&t>0;){--t;let n=e.keys().next().value;if(!n)break;let r=e.get(n);e.delete(n),r?.pendingIntent&&e.set(n,r)}return e}function qe(e,t){let n=()=>{let t=e.style.height;e.style.height=`auto`;let n=`${e.scrollHeight}px`;t===n?e.style.height=t:e.style.height=n},r=()=>n(),i=()=>n();return requestAnimationFrame(n),e.addEventListener(`input`,r),window.addEventListener(`resize`,i),{update(){requestAnimationFrame(n)},destroy(){e.removeEventListener(`input`,r),window.removeEventListener(`resize`,i)}}}function Je(e){return P(`/api/uploads/${encodeURIComponent(e.id)}`)}function Ye(e){return e.content_type.startsWith(`image/`)}function Xe(e){return e<1024?`${e} B`:e<1048576?`${Math.round(e/1024)} KB`:e<1073741824?`${(e/1048576).toFixed(1)} MB`:`${(e/1073741824).toFixed(1)} GB`}var Ze=[{title:`Ship it`,url:`https://media.giphy.com/media/v1.Y2lkPTc5MGI3NjExYjJ1bm1meHE4N2x3bnN0djJkMWtjNGc5bXYzZDFiOHBsbG16M3F0ZSZlcD12MV9naWZzX3NlYXJjaCZjdD1n/l0HlHFRbmaZtBRhXG/giphy.gif`,tags:[`ship`,`launch`,`done`]},{title:`Approved`,url:`https://media.giphy.com/media/v1.Y2lkPTc5MGI3NjExazBpbzJ6ODZ3bXQ3OHBvNGJidWZoajc0cHV6YnVub3MzZ3c1a2Z2dSZlcD12MV9naWZzX3NlYXJjaCZjdD1n/111ebonMs90YLu/giphy.gif`,tags:[`yes`,`approved`,`nice`]},{title:`Deploy dance`,url:`https://media.giphy.com/media/v1.Y2lkPTc5MGI3NjExY3NkaTVmZW9ydWNnZnl0ZWQ5aHQyeGNrd2k3NG4wZWNqYzNmd3k1ZCZlcD12MV9naWZzX3NlYXJjaCZjdD1n/GeimqsH0TLDt4tScGw/giphy.gif`,tags:[`deploy`,`dance`,`celebrate`]},{title:`Looking`,url:`https://media.giphy.com/media/v1.Y2lkPTc5MGI3NjExYWZ3emE0dm5mN2h0bGVsY2w0OXBodGd2cGJlNDRiZXo1YWNtdWRmZyZlcD12MV9naWZzX3NlYXJjaCZjdD1n/26n6WywJyh39n1pBu/giphy.gif`,tags:[`search`,`looking`,`debug`]},{title:`Typing faster`,url:`https://media.giphy.com/media/v1.Y2lkPTc5MGI3NjExOWFlbnJnbnIzbHYxcDIzdXZ3NGF3N2FocHNvMmR5enU3bHpycHBlZSZlcD12MV9naWZzX3NlYXJjaCZjdD1n/13HgwGsXF0aiGY/giphy.gif`,tags:[`typing`,`code`,`work`]},{title:`Tiny victory`,url:`https://media.giphy.com/media/v1.Y2lkPTc5MGI3NjExdjJ2b2tqNmF4dG16NjE0eXhuc3h5bTlvamgwNTR0Zmd6ZjhtM2JuaSZlcD12MV9naWZzX3NlYXJjaCZjdD1n/3o7abKhOpu0NwenH3O/giphy.gif`,tags:[`win`,`victory`,`celebrate`]}],Qe=N(`
`);function G(e,r){i(r,!0);let a=y(r,`disabled`,3,!1);var o=Qe(),c=x(o),l=T(c,2),u=T(l,2),d=x(u);d.textContent=`<>`,t(u);var f=T(u,2),p=x(f);p.textContent=`{}`,t(f);var g=T(f,2),_=T(g,2);let v;t(o),k(()=>{c.disabled=a(),l.disabled=a(),u.disabled=a(),f.disabled=a(),g.disabled=a(),S(_,`aria-expanded`,r.showGifPicker),_.disabled=a(),v=n(_,1,``,null,v,{active:r.showGifPicker})}),h(`click`,c,()=>r.onWrap(`**`)),h(`click`,l,()=>r.onWrap(`_`)),h(`click`,u,()=>r.onWrap("`")),h(`click`,f,()=>r.onWrap("\n```\n","\n```\n",`code`)),h(`click`,g,()=>r.onWrap(`[`,`](https://)`,`label`)),h(`click`,_,function(...e){r.onToggleGif?.apply(this,e)}),s(e,o),m()}a([`click`]);var $e=N(``),et=N(`

No GIFs found

`),tt=N(``);function nt(e,n){i(n,!0);let r=M(void 0);ne(()=>v(r)?.focus());var a=tt(),c=x(a),u=T(x(c),2);w(u),A(u,e=>j(r,e),()=>v(r)),t(c);var d=T(c,2);E(d,21,()=>n.gifs,e=>e.url,(e,r)=>{var i=$e(),a=x(i),c=T(a,2),l=O(c,!0);t(i),k(()=>{S(a,`src`,v(r).url),S(a,`alt`,v(r).title),o(l,v(r).title)}),h(`click`,i,()=>n.onPick(v(r).url,v(r).title)),s(e,i)}),t(d);var f=T(d,2),p=e=>{var t=et();s(e,t)};l(f,e=>{n.gifs.length===0&&e(p)}),t(a),k(()=>re(u,n.query)),h(`keydown`,a,e=>{e.isComposing||e.keyCode===229||e.key===`Escape`&&(e.preventDefault(),n.onClose())}),h(`input`,u,e=>n.onQuery(e.currentTarget.value)),s(e,a),m()}a([`keydown`,`input`,`click`]);var rt=N(`
Replying to
`);function it(e,n){i(n,!0);var r=rt(),a=T(x(r),2),c=x(a),l=T(x(c)),u=O(l,!0);t(c);var d=T(c,2),f=O(d,!0);t(a);var p=T(a,2);t(r),k((e,t)=>{o(u,e),o(f,t)},[()=>se(n.target.author),()=>ge(n.target.body)]),h(`click`,p,function(...e){n.onClear?.apply(this,e)}),s(e,r),m()}a([`click`]);var at=N(` `),ot=N(``),st=N(`
`),ct=N(``),lt=N(`
`),ut=N(``),dt=N(`
`);function ft(a,c){i(c,!0);let u=y(c,`formClass`,3,`composer`),d=y(c,`pendingUpload`,3,null),C=y(c,`replyTarget`,3,null),w=y(c,`showUpload`,3,!1),ee=y(c,`showToolbar`,3,!1),te=y(c,`slashCommands`,19,()=>[]),ne=y(c,`botCommands`,19,()=>[]),N=y(c,`mentionPeople`,19,()=>[]),P=y(c,`disabled`,3,!1),F=y(c,`onUploadFile`,3,()=>{}),ae=y(c,`onRemoveUpload`,3,()=>{}),oe=y(c,`onClearReply`,3,()=>{}),I=M(null),se=M(0),ce=M(``),L=M(0),R=M(!1),z=M(``),de=f(()=>{let e=v(z).trim().toLowerCase();return Ze.filter(t=>!e||t.title.toLowerCase().includes(e)||t.tags.some(t=>t.includes(e)))}),B=f(()=>H(c.value,v(se))),V=f(()=>!v(B)||fe(v(B))===v(ce)?[]:v(B).kind===`slash`?he(v(B)):_e(v(B)));b(()=>(c.onInputRef(v(I)),()=>c.onInputRef(null))),b(()=>{if(v(V).length===0){j(L,0);return}v(L)>=v(V).length&&j(L,0)});function H(e,t){let n=e.slice(0,t),r=/(^|\s)([/@][^\s]*)$/.exec(n);if(!r)return null;let i=r[2],a=n.length-i.length;return i.startsWith(`/`)&&a!==0?null:{kind:i.startsWith(`/`)?`slash`:`mention`,start:a,end:n.length,query:i.slice(1).toLowerCase(),raw:i}}function fe(e){return`${e.kind}:${e.start}:${e.raw}`}function pe(e=v(I)){j(se,e?.selectionStart??c.value.length,!0)}function me(e){return e.startsWith(`/`)?e:`/${e}`}function he(e){let t=e.query,n=te().filter(e=>!e.revoked_at).map(e=>{let t=me(e.command);return{id:e.id,kind:`slash`,label:t,detail:e.description||`Slash command`,insertText:`${t} `,sortText:t.slice(1).toLowerCase()}}),r=new Set(n.map(e=>e.label)),i=ne().filter(e=>!r.has(me(e.command))).map(e=>{let t=me(e.command);return{id:e.id,kind:`slash`,label:t,detail:e.description,insertText:`${t} `,sortText:t.slice(1).toLowerCase(),hint:e.args_hint||void 0,source:e.bot.handle?`@${e.bot.handle}`:e.bot.display_name}});return[...n,...i].filter(e=>!t||e.sortText.includes(t)).sort((e,n)=>Number(!e.sortText.startsWith(t))-Number(!n.sortText.startsWith(t))||e.sortText.localeCompare(n.sortText)).slice(0,6)}function ge(e){return le(e.handle||e.display_name.replace(/\s+/g,``))}function _e(e){let t=e.query,n=new Set;return N().filter(e=>!e.id||!e.handle?.trim()||n.has(e.id)?!1:(n.add(e.id),!0)).map(e=>{let t=ge(e),n=`${e.handle||``} ${e.display_name}`.trim().toLowerCase();return{id:e.id,kind:`mention`,label:t,detail:e.kind===`bot`?`${e.display_name} · bot`:e.display_name,insertText:`${t} `,sortText:n}}).filter(e=>!t||e.sortText.includes(t)).sort((e,n)=>Number(!e.sortText.startsWith(t))-Number(!n.sortText.startsWith(t))||e.sortText.localeCompare(n.sortText)).slice(0,6)}function ve(e){v(B)&&ye(`${c.value.slice(0,v(B).start)}${e.insertText}${c.value.slice(v(B).end)}`,v(B).start+e.insertText.length)}async function ye(t,n=t.length,r=n){P()||(c.onValue(t),await e(),!P()&&(v(I)?.focus(),v(I)?.setSelectionRange(n,r),j(se,n,!0)))}function be(e,t=e,n=`text`){let r=v(I)?.selectionStart??c.value.length,i=v(I)?.selectionEnd??r,a=c.value.slice(r,i)||n;ye(`${c.value.slice(0,r)}${e}${a}${t}${c.value.slice(i)}`,r+e.length,r+e.length+a.length)}function xe(){v(R)&&(j(R,!1),j(z,``),v(I)?.focus())}function Se(e,t){let n=c.value&&!c.value.endsWith(` `)?` `:``;ye(`${c.value}${n}![${t}](${e})`),xe()}function Ce(e){let t=e.currentTarget;c.onValue(t.value),pe(t)}function we(){pe(),c.onFocus()}function Te(e){if(!(e.defaultPrevented||e.isComposing||e.keyCode===229)){if(e.key===`Escape`&&v(V).length>0&&v(B)){e.preventDefault(),j(ce,fe(v(B)),!0),v(I)?.focus();return}if(e.target===v(I)){if(v(V).length>0&&!e.shiftKey&&!e.ctrlKey&&!e.metaKey&&!e.altKey){if(e.key===`ArrowDown`||e.key===`ArrowUp`){e.preventDefault();let t=e.key===`ArrowDown`?1:-1;j(L,(v(L)+t+v(V).length)%v(V).length);return}if(e.key===`Enter`||e.key===`Tab`){e.preventDefault(),ve(v(V)[v(L)]);return}}c.onKeydown(e)}}}var Ee=dt(),De=x(Ee),Oe=e=>{nt(e,{get gifs(){return v(de)},get query(){return v(z)},onQuery:e=>j(z,e,!0),onPick:Se,onClose:xe})};l(De,e=>{ee()&&v(R)&&!P()&&e(Oe)});var ke=T(De,2),Ae=e=>{var r=st();E(r,23,()=>v(V),e=>e.id,(e,r,i)=>{var a=ot();let c;var u=x(a),d=x(u),f=e=>{var t=g(`/`);s(e,t)},p=e=>{var t=g();k(e=>o(t,e),[()=>ue(v(r).detail)]),s(e,t)};l(d,e=>{v(r).kind===`slash`?e(f):e(p,-1)}),t(u);var m=T(u,2),_=x(m),y=x(_,!0),b=T(y),C=e=>{var t=at(),n=O(t,!0);k(()=>o(n,v(r).hint)),s(e,t)};l(b,e=>{v(r).hint&&e(C)}),t(_);var w=T(_,2),E=O(w,!0);t(m);var D=T(m,2),ee=O(D,!0);t(a),k(()=>{S(a,`aria-selected`,v(i)===v(L)),c=n(a,1,``,null,c,{active:v(i)===v(L)}),o(y,v(r).label),o(E,v(r).detail),o(ee,v(r).source??(v(r).kind===`slash`?`command`:`mention`))}),h(`mousedown`,a,e=>e.preventDefault()),h(`click`,a,()=>ve(v(r))),s(e,a)}),t(r),k(()=>S(r,`aria-label`,v(B)?.kind===`slash`?`Slash command suggestions`:`Mention suggestions`)),s(e,r)};l(ke,e=>{v(V).length>0&&e(Ae)});var je=T(ke,2),Me=x(je),Ne=e=>{var n=lt(),r=T(x(n),2),i=e=>{var t=ct();k(e=>{S(t,`src`,e),S(t,`alt`,d().filename)},[()=>Je(d())]),s(e,t)},a=f(()=>Ye(d()));l(r,e=>{v(a)&&e(i)});var c=T(r,2),u=O(c),p=T(c,2);t(n),k(e=>o(u,`${d().filename??``} · ${e??``}`),[()=>Xe(d().byte_size)]),h(`click`,p,function(...e){ae()?.apply(this,e)}),s(e,n)};l(Me,e=>{d()&&e(Ne)});var Pe=T(Me,2),Fe=e=>{it(e,{get target(){return C()},get onClear(){return oe()}})};l(Pe,e=>{C()&&e(Fe)});var Ie=T(Pe,2),Le=x(Ie),Re=e=>{var n=ut(),r=x(n);D(2),t(n),k(()=>r.disabled=P()),h(`change`,r,function(...e){F()?.apply(this,e)}),s(e,n)};l(Le,e=>{w()&&e(Re)});var U=T(Le,2);r(U),A(U,e=>j(I,e),()=>v(I)),p(U,(e,t)=>qe?.(e,t),()=>c.value);var ze=T(U,2);t(Ie);var Be=T(Ie,2),Ve=e=>{G(e,{get showGifPicker(){return v(R)},get disabled(){return P()},onWrap:be,onToggleGif:()=>{v(R)?xe():j(R,!0)}})};l(Be,e=>{ee()&&e(Ve)}),t(je),t(Ee),k(e=>{n(Ee,1,ie(u())),S(Ee,`data-handles-escape`,v(V).length>0?``:void 0),re(U,c.value),S(U,`placeholder`,c.placeholder),S(U,`aria-label`,c.ariaLabel),U.disabled=P(),S(ze,`aria-label`,c.submitLabel),ze.disabled=e},[()=>P()||!c.value.trim()]),h(`keydown`,Ee,Te),_(`submit`,je,e=>{e.preventDefault(),!P()&&(xe(),c.onSubmit())}),h(`input`,U,Ce),_(`focus`,U,we),h(`keyup`,U,()=>pe()),h(`mouseup`,U,()=>pe()),_(`select`,U,()=>pe()),s(a,Ee),m()}a([`keydown`,`mousedown`,`click`,`change`,`input`,`keyup`,`mouseup`]);function pt(e,t){this.v=e,this.k=t}function mt(e,t){(t==null||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n`u`?null:Y(BigInt.prototype.toString),Gt=typeof Symbol>`u`?null:Y(Symbol.prototype.toString),Kt=Y(Object.prototype.hasOwnProperty),qt=Y(Object.prototype.toString),J=Y(RegExp.prototype.test),Jt=Yt(TypeError);function Y(e){return function(t){t instanceof RegExp&&(t.lastIndex=0);var n=[...arguments].slice(1);return Ot(e,t,n)}}function Yt(e){return function(){return kt(e,[...arguments])}}function X(e,t){let n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:It;if(St&&St(e,null),!Ft(t))return e;let r=t.length;for(;r--;){let i=t[r];if(typeof i==`string`){let e=n(i);e!==i&&(Ct(t)||(t[r]=e),i=e)}e[i]=!0}return e}function Xt(e){for(let t=0;t/g),hn=q(/\${[\w\W]*/g),gn=q(/^data-[\-\w.\u00B7-\uFFFF]+$/),_n=q(/^aria-[\-\w]+$/),vn=q(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp|matrix):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i),yn=q(/^(?:\w+script|data):/i),bn=q(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g),xn=q(/^html$/i),Sn=q(/^[a-z][.\w]*(-[.\w]+)+$/i),Cn=q(/<[/\w!]/g),wn=q(/<[/\w]/g),Tn=q(/<\/no(script|embed|frames)/i),En=q(/\/>/i),Dn={element:1,attribute:2,text:3,cdataSection:4,entityReference:5,entityNode:6,processingInstruction:7,comment:8,document:9,documentType:10,documentFragment:11,notation:12},On=[`style`,`script`,`xmp`,`iframe`,`noembed`,`noframes`,`plaintext`,`noscript`],kn=K(X({},On)),An=function(){let e={};return At(On,t=>{e[t]=q(RegExp(`])`,`i`))}),K(e)}(),jn=function(){return typeof window>`u`?null:window},Mn=function(e,t){if(typeof e!=`object`||typeof e.createPolicy!=`function`)return null;let n=null,r=`data-tt-policy-suffix`;t&&t.hasAttribute(r)&&(n=t.getAttribute(r));let i=`dompurify`+(n?`#`+n:``);try{return e.createPolicy(i,{createHTML(e){return e},createScriptURL(e){return e}})}catch{return console.warn(`TrustedTypes policy `+i+` could not be created.`),null}},Nn=function(){return{afterSanitizeAttributes:[],afterSanitizeElements:[],afterSanitizeShadowDOM:[],beforeSanitizeAttributes:[],beforeSanitizeElements:[],beforeSanitizeShadowDOM:[],uponSanitizeAttribute:[],uponSanitizeElement:[],uponSanitizeShadowNode:[]}},Pn=function(e,t,n,r){return Kt(e,t)&&Ft(e[t])?X(r.base?Zt(r.base):{},e[t],r.transform):n},Fn=function(e,t,n){let r=Kt(e,t)?e[t]:void 0;return r&&typeof r==`object`?Zt(r):n()};function In(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:jn(),t=e=>In(e);if(t.version=`3.4.16`,t.removed=[],!e||!e.document||e.document.nodeType!==Dn.document||!e.Element)return t.isSupported=!1,t;let n=e.document,r=n,i=r.currentScript;e.DocumentFragment;let a=e.HTMLTemplateElement,o=e.Node,s=e.Element,c=e.NodeFilter;e.NamedNodeMap===void 0&&(e.NamedNodeMap||e.MozNamedAttrMap),e.HTMLFormElement;let l=e.DOMParser,u=e.trustedTypes,d=s.prototype,f=$t(d,`cloneNode`),p=$t(d,`remove`),m=$t(d,`removeAttributeNode`),h=$t(d,`nextSibling`),g=$t(d,`childNodes`),_=$t(d,`parentNode`),v=$t(d,`shadowRoot`),y=$t(d,`attributes`),b=o&&o.prototype?$t(o.prototype,`nodeType`):null,x=o&&o.prototype?$t(o.prototype,`nodeName`):null,S=o&&o.prototype?$t(o.prototype,`ownerDocument`):null,C=function(e){return b?b(e):e.nodeType},w=function(e){return x?x(e):e.nodeName};if(typeof a==`function`){let e=n.createElement(`template`);e.content&&e.content.ownerDocument&&(n=e.content.ownerDocument)}let T,E=``,D,O=!1,ee=0,te=function(){if(ee>0)throw Jt(`A configured TRUSTED_TYPES_POLICY callback (createHTML or createScriptURL) must not call DOMPurify.sanitize, as that causes infinite recursion. Do not pass a policy whose callbacks wrap DOMPurify as TRUSTED_TYPES_POLICY; see the "DOMPurify and Trusted Types" section of the README.`)},ne=function(e){te(),ee++;try{return T.createHTML(e)}finally{ee--}},k=function(e){te(),ee++;try{return T.createScriptURL(e)}finally{ee--}},A=function(){return O||=(D=Mn(u,i),!0),D},re=n,j=re.implementation,ie=re.createNodeIterator,M=re.createDocumentFragment,N=re.getElementsByTagName,P=r.importNode,F=Nn();t.isSupported=typeof xt==`function`&&typeof _==`function`&&j&&j.createHTMLDocument!==void 0;let ae=pn,oe=mn,I=hn,se=gn,ce=_n,le=yn,ue=bn,L=Sn,R=vn,z=null,de=X({},[...tn,...nn,...rn,...on,...cn]),B=null,V=X({},[...ln,...un,...dn,...fn]),H=Object.seal(Et(null,{tagNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},allowCustomizedBuiltInElements:{writable:!0,configurable:!1,enumerable:!0,value:!1}})),fe=null,pe=null,me=Object.seal(Et(null,{tagCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeCheck:{writable:!0,configurable:!1,enumerable:!0,value:null}})),he=!0,ge=!0,_e=!1,ve=!0,ye=!1,be=!0,xe=!1,Se=!1,Ce=null,we=null,Te=!1,Ee=!1,De=!1,Oe=!1,ke=!0,Ae=!1,je=`user-content-`,Me=!0,Ne=!1,Pe={},Fe=null,Ie=X({},`annotation-xml.audio.colgroup.desc.foreignobject.head.iframe.math.mi.mn.mo.ms.mtext.noembed.noframes.noscript.plaintext.script.selectedcontent.style.svg.template.thead.title.video.xmp`.split(`.`)),Le=null,Re=X({},[`audio`,`video`,`img`,`source`,`image`,`track`]),U=null,ze=X({},[`alt`,`class`,`for`,`id`,`label`,`name`,`pattern`,`placeholder`,`role`,`summary`,`title`,`value`,`style`,`xmlns`]),Be=`http://www.w3.org/1998/Math/MathML`,Ve=`http://www.w3.org/2000/svg`,W=`http://www.w3.org/1999/xhtml`,He=W,Ue=!1,We=null,Ge=X({},[Be,Ve,W],Lt),Ke=K([`mi`,`mo`,`mn`,`ms`,`mtext`]),qe=X({},Ke),Je=K([`annotation-xml`]),Ye=X({},Je),Xe=X({},[`title`,`style`,`font`,`a`,`script`]),Ze=null,Qe=[`application/xhtml+xml`,`text/html`],G=null,$e=null,et=n.createElement(`form`),tt=function(e){return e instanceof RegExp||e instanceof Function},nt=function(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};if($e&&$e===e)return;(!e||typeof e!=`object`)&&(e={}),e=Zt(e),Ze=Qe.indexOf(e.PARSER_MEDIA_TYPE)===-1?`text/html`:e.PARSER_MEDIA_TYPE,G=Ze===`application/xhtml+xml`?Lt:It,z=Pn(e,`ALLOWED_TAGS`,de,{transform:G}),B=Pn(e,`ALLOWED_ATTR`,V,{transform:G}),We=Pn(e,`ALLOWED_NAMESPACES`,Ge,{transform:Lt}),U=Pn(e,`ADD_URI_SAFE_ATTR`,ze,{transform:G,base:ze}),Le=Pn(e,`ADD_DATA_URI_TAGS`,Re,{transform:G,base:Re}),Fe=Pn(e,`FORBID_CONTENTS`,Ie,{transform:G}),fe=Pn(e,`FORBID_TAGS`,Zt({}),{transform:G}),pe=Pn(e,`FORBID_ATTR`,Zt({}),{transform:G}),Pe=Kt(e,`USE_PROFILES`)?e.USE_PROFILES&&typeof e.USE_PROFILES==`object`?Zt(e.USE_PROFILES):e.USE_PROFILES:!1,he=e.ALLOW_ARIA_ATTR!==!1,ge=e.ALLOW_DATA_ATTR!==!1,_e=e.ALLOW_UNKNOWN_PROTOCOLS||!1,ve=e.ALLOW_SELF_CLOSE_IN_ATTR!==!1,ye=e.SAFE_FOR_TEMPLATES||!1,be=e.SAFE_FOR_XML!==!1,xe=e.WHOLE_DOCUMENT||!1,Ee=e.RETURN_DOM||!1,De=e.RETURN_DOM_FRAGMENT||!1,Oe=e.RETURN_TRUSTED_TYPE||!1,Te=e.FORCE_BODY||!1,ke=e.SANITIZE_DOM!==!1,Ae=e.SANITIZE_NAMED_PROPS||!1,Me=e.KEEP_CONTENT!==!1,Ne=e.IN_PLACE||!1,R=en(e.ALLOWED_URI_REGEXP)?e.ALLOWED_URI_REGEXP:vn,He=typeof e.NAMESPACE==`string`?e.NAMESPACE:W,qe=Fn(e,`MATHML_TEXT_INTEGRATION_POINTS`,()=>X({},Ke)),Ye=Fn(e,`HTML_INTEGRATION_POINTS`,()=>X({},Je));let t=Fn(e,`CUSTOM_ELEMENT_HANDLING`,()=>Et(null));if(H=Et(null),Kt(t,`tagNameCheck`)&&tt(t.tagNameCheck)&&(H.tagNameCheck=t.tagNameCheck),Kt(t,`attributeNameCheck`)&&tt(t.attributeNameCheck)&&(H.attributeNameCheck=t.attributeNameCheck),Kt(t,`allowCustomizedBuiltInElements`)&&typeof t.allowCustomizedBuiltInElements==`boolean`&&(H.allowCustomizedBuiltInElements=t.allowCustomizedBuiltInElements),q(H),ye&&(ge=!1),De&&(Ee=!0),Pe&&(z=X({},cn),B=Et(null),Pe.html===!0&&(X(z,tn),X(B,ln)),Pe.svg===!0&&(X(z,nn),X(B,un),X(B,fn)),Pe.svgFilters===!0&&(X(z,rn),X(B,un),X(B,fn)),Pe.mathMl===!0&&(X(z,on),X(B,dn),X(B,fn))),me.tagCheck=null,me.attributeCheck=null,Kt(e,`ADD_TAGS`)&&(typeof e.ADD_TAGS==`function`?me.tagCheck=e.ADD_TAGS:Ft(e.ADD_TAGS)&&(z===de&&(z=Zt(z)),X(z,e.ADD_TAGS,G))),Kt(e,`ADD_ATTR`)&&(typeof e.ADD_ATTR==`function`?me.attributeCheck=e.ADD_ATTR:Ft(e.ADD_ATTR)&&(B===V&&(B=Zt(B)),X(B,e.ADD_ATTR,G))),Kt(e,`ADD_FORBID_CONTENTS`)&&Ft(e.ADD_FORBID_CONTENTS)&&(Fe===Ie&&(Fe=Zt(Fe)),X(Fe,e.ADD_FORBID_CONTENTS,G)),Me&&(z[`#text`]=!0),xe&&X(z,[`html`,`head`,`body`]),z.table&&(X(z,[`tbody`]),delete fe.tbody),e.TRUSTED_TYPES_POLICY){if(typeof e.TRUSTED_TYPES_POLICY.createHTML!=`function`)throw Jt(`TRUSTED_TYPES_POLICY configuration option must provide a "createHTML" hook.`);if(typeof e.TRUSTED_TYPES_POLICY.createScriptURL!=`function`)throw Jt(`TRUSTED_TYPES_POLICY configuration option must provide a "createScriptURL" hook.`);let t=T;T=e.TRUSTED_TYPES_POLICY;try{E=ne(``)}catch(e){throw T=t,e}}else e.TRUSTED_TYPES_POLICY===null?(T=void 0,E=``):(T===void 0&&(T=A()),T&&typeof E==`string`&&(E=ne(``)));K&&K(e),$e=e},rt=X({},[...nn,...rn,...an]),it=X({},[...on,...sn]),at=function(e,t,n){return t.namespaceURI===W?e===`svg`:t.namespaceURI===Be?e===`svg`&&(n===`annotation-xml`||qe[n]):!!rt[e]},ot=function(e,t,n){return t.namespaceURI===W?e===`math`:t.namespaceURI===Ve?e===`math`&&Ye[n]:!!it[e]},st=function(e,t,n){return t.namespaceURI===Ve&&!Ye[n]||t.namespaceURI===Be&&!qe[n]?!1:!it[e]&&(Xe[e]||!rt[e])},ct=function(e){let t=_(e);(!t||!t.tagName)&&(t={namespaceURI:He,tagName:`template`});let n=It(e.tagName),r=It(t.tagName);return We[e.namespaceURI]?e.namespaceURI===Ve?at(n,t,r):e.namespaceURI===Be?ot(n,t,r):e.namespaceURI===W?st(n,t,r):!!(Ze===`application/xhtml+xml`&&We[e.namespaceURI]):!1},lt=function(e){Nt(t.removed,{element:e});try{_(e).removeChild(e)}catch{if(p(e),!_(e))throw Jt(`a node selected for removal could not be detached from its tree and cannot be safely returned; refusing to sanitize in place`)}},ut=function(e,t,n){try{m(e,t)}catch{try{e.removeAttribute(n)}catch{}}},dt=function(e){mt(e);let t=g(e);if(t){let e=[];At(t,t=>{Nt(e,t)}),At(e,e=>{try{p(e)}catch{}})}let n=y(e);if(n)for(let t=n.length-1;t>=0;--t){let r=n[t],i=r&&r.name;typeof i==`string`&&ut(e,r,i)}},ft=function(e,n,r){if(!r)try{r=n.getAttributeNode(e)}catch{r=null}Nt(t.removed,{attribute:r||null,from:n});try{r?m(n,r):n.removeAttribute(e)}catch{try{n.removeAttribute(e)}catch{}}if(e===`is`){if(Ee||De)try{lt(n)}catch{}else try{n.setAttribute(e,``)}catch{}}},pt=function(e){let t=y(e);if(t)for(let n=t.length-1;n>=0;--n){let r=t[n],i=r&&r.name;typeof i!=`string`||B[G(i)]||ut(e,r,i)}},mt=function(e){let t=[e];for(;t.length>0;){let e=t.pop();C(e)===Dn.element&&pt(e);let n=g(e);if(n)for(let e=n.length-1;e>=0;--e)t.push(n[e])}},ht=function(e,t){return be?e===`patchsrc`||e===`for`&&t!==`label`&&t!==`output`:!1},gt=function(e){if(!be)return;let t=[e];for(;t.length>0;){let e=t.pop(),n=C(e);if(n===Dn.processingInstruction||n===Dn.comment&&J(wn,e.data)){try{p(e)}catch{}continue}if(n===Dn.element){let t=e,n=G(w(e));try{t.hasAttribute&&t.hasAttribute(`patchsrc`)&&t.removeAttribute(`patchsrc`),t.hasAttribute&&t.hasAttribute(`for`)&&ht(`for`,n)&&t.removeAttribute(`for`)}catch{}}let r=g(e);if(r)for(let e=r.length-1;e>=0;--e)t.push(r[e])}},_t=function(e){let t=null,r=null;if(Te)e=``+e;else{let t=Rt(e,/^[\r\n\t ]+/);r=t&&t[0]}Ze===`application/xhtml+xml`&&He===W&&(e=``+e+``);let i=T?ne(e):e;if(He===W)try{t=new l().parseFromString(i,Ze)}catch{}if(!t||!t.documentElement){t=j.createDocument(He,`template`,null);try{t.documentElement.innerHTML=Ue?E:i}catch{}}let a=t.body||t.documentElement;return e&&r&&a.insertBefore(n.createTextNode(r),a.childNodes[0]||null),He===W?N.call(t,xe?`html`:`body`)[0]:xe?t.documentElement:a},vt=function(e){let t=S?S(e):e.ownerDocument;return ie.call(t||e,e,c.SHOW_ELEMENT|c.SHOW_COMMENT|c.SHOW_TEXT|c.SHOW_PROCESSING_INSTRUCTION|c.SHOW_CDATA_SECTION,null)},yt=function(e){return e=zt(e,ae,` `),e=zt(e,oe,` `),e=zt(e,I,` `),e},bt=function(e){e.normalize();let t=S?S(e):e.ownerDocument,n=ie.call(t||e,e,c.SHOW_TEXT|c.SHOW_COMMENT|c.SHOW_CDATA_SECTION|c.SHOW_PROCESSING_INSTRUCTION,null),r=n.nextNode();for(;r;)r.data=yt(r.data),r=n.nextNode();let i=e.querySelectorAll?.call(e,`template`);i&&At(i,e=>{Ct(e.content)&&bt(e.content)})},St=function(e){let t=x?x(e):null;return typeof t!=`string`||G(t)!==`form`?!1:typeof e.nodeName!=`string`||typeof e.textContent!=`string`||typeof e.removeChild!=`function`||e.attributes!==y(e)||typeof e.removeAttribute!=`function`||typeof e.removeAttributeNode!=`function`||typeof e.getAttributeNode!=`function`||typeof e.setAttribute!=`function`||typeof e.namespaceURI!=`string`||typeof e.insertBefore!=`function`||typeof e.hasChildNodes!=`function`||e.nodeType!==b(e)||e.childNodes!==g(e)},Ct=function(e){if(!b||typeof e!=`object`||!e)return!1;try{return b(e)===Dn.documentFragment}catch{return!1}},wt=function(e){if(!b||typeof e!=`object`||!e)return!1;try{return typeof b(e)==`number`}catch{return!1}};function Tt(e,n,r){e.length!==0&&At(e,e=>{e.call(t,n,r,$e)})}let Dt=function(e,t){return!!(be&&e.hasChildNodes()&&!wt(e.firstElementChild)&&J(Cn,e.textContent)&&J(Cn,e.innerHTML)||be&&e.namespaceURI===W&&kn[t]&&(wt(e.firstElementChild)||typeof e.textContent==`string`&&J(An[t],e.textContent))||e.nodeType===Dn.processingInstruction||be&&e.nodeType===Dn.comment&&J(wn,e.data))},Ot=function(e,t){return e instanceof RegExp?J(e,t):e instanceof Function&&!!e(t,...[...arguments].slice(2))},kt=function(e,t,n){if(!fe[t]&&Y(t)&&Ot(H.tagNameCheck,t))return!1;if(Me&&!Fe[t]){let t=_(e),r=g(e);if(r&&t){let i=r.length;for(let a=i-1;a>=0;--a){let i=e===n?f(r[a],!0):r[a];t.insertBefore(i,h(e))}}}return lt(e),!0},Ht=function(e,t,n,r){return e.length===0?t:t===n||t===r?Zt(t):t},Ut=function(e,t){return e===t||_(e)!==null?!1:(Ne&&mt(e),!0)},Wt=function(e,n){if(Tt(F.beforeSanitizeElements,e,null),Ut(e,n))return!0;if(St(e))return lt(e),!0;let r=G(w(e));if(z=Ht(F.uponSanitizeElement,z,de,Ce),Tt(F.uponSanitizeElement,e,{tagName:r,allowedTags:z}),Ut(e,n))return!0;if(Dt(e,r))return lt(e),!0;if(fe[r]||!(me.tagCheck instanceof Function&&me.tagCheck(r))&&!z[r]){let t=kt(e,r,n);return t===!1&&(Tt(F.afterSanitizeElements,e,null),Ut(e,n))?!0:t}if(C(e)===Dn.element&&!ct(e)||(r===`noscript`||r===`noembed`||r===`noframes`)&&J(Tn,e.innerHTML))return lt(e),!0;if(ye&&e.nodeType===Dn.text){let n=yt(e.textContent);e.textContent!==n&&(Nt(t.removed,{element:e.cloneNode()}),e.textContent=n)}return Tt(F.afterSanitizeElements,e,null),Ut(e,n)},Gt=function(e,t,r){if(pe[t]||ht(t,e)||ke&&(t===`id`||t===`name`)&&(r in n||r in et))return!1;let i=B[t]||me.attributeCheck instanceof Function&&me.attributeCheck(t,e);return ge&&J(se,t)||he&&J(ce,t)?!0:i?U[t]||J(R,zt(r,ue,``))||(t===`src`||t===`xlink:href`||t===`href`)&&e!==`script`&&Bt(r,`data:`)===0&&Le[e]||_e&&!J(le,zt(r,ue,``))?!0:!r:Y(e)&&Ot(H.tagNameCheck,e)&&Ot(H.attributeNameCheck,t,e)||t===`is`&&H.allowCustomizedBuiltInElements&&Ot(H.tagNameCheck,r)},qt=X({},[`annotation-xml`,`color-profile`,`font-face`,`font-face-format`,`font-face-name`,`font-face-src`,`font-face-uri`,`missing-glyph`]),Y=function(e){return!qt[It(e)]&&J(L,e)},Yt=function(e,t,n,r){if(T&&typeof u==`object`&&typeof u.getAttributeType==`function`&&!n)switch(u.getAttributeType(e,t)){case`TrustedHTML`:return ne(r);case`TrustedScriptURL`:return k(r)}return r},Xt=function(e,t,n,r){try{return n?e.setAttributeNS(n,t,r):e.setAttribute(t,r),!St(e)||(lt(e),!1)}catch{return ft(t,e),!1}},On=function(e,n){if(Tt(F.beforeSanitizeAttributes,e,null),Ut(e,n))return;let r=e.attributes;if(!r||St(e))return;B=Ht(F.uponSanitizeAttribute,B,V,we);let i={attrName:``,attrValue:``,keepAttr:!0,allowedAttributes:B,forceKeepAttr:void 0},a=r.length,o=G(e.nodeName);for(;a--;){let n=r[a],s=n.name,c=n.namespaceURI,l=n.value,u=G(s),d=l,f=s===`value`?d:Vt(d),p=!1;if(i.attrName=u,i.attrValue=f,i.keepAttr=!0,i.forceKeepAttr=void 0,Tt(F.uponSanitizeAttribute,e,i),f=i.attrValue,Ae&&(u===`id`||u===`name`)&&Bt(f,je)!==0&&(ft(s,e,n),f=je+f,p=!0),be&&J(/((--!?|])>)|<\/(style|script|title|xmp|textarea|noscript|iframe|noembed|noframes)/i,f)){ft(s,e,n);continue}if(u===`attributename`&&Rt(f,`href`)){ft(s,e,n);continue}if(!i.forceKeepAttr){if(!i.keepAttr){ft(s,e,n);continue}if(!ve&&J(En,f)){ft(s,e,n);continue}if(ye&&(f=yt(f)),!Gt(o,u,f)){ft(s,e,n);continue}f=Yt(o,u,c,f),f!==d&&Xt(e,s,c,f)&&p&&Mt(t.removed)}}Tt(F.afterSanitizeAttributes,e,null),Ut(e,n)},Ln=function(e){let t=null,n=vt(e);for(Tt(F.beforeSanitizeShadowDOM,e,null);t=n.nextNode();)if(Tt(F.uponSanitizeShadowNode,t,null),Wt(t,e),On(t,e),Ct(t.content)&&Ln(t.content),C(t)===Dn.element){let e=v(t);Ct(e)&&(Rn(e),Ln(e))}Tt(F.afterSanitizeShadowDOM,e,null)},Rn=function(e){let t=[{node:e,shadow:null}];for(;t.length>0;){let e=t.pop();if(e.shadow){Ln(e.shadow);continue}let n=e.node,r=C(n)===Dn.element,i=g(n);if(i)for(let e=i.length-1;e>=0;--e)t.push({node:i[e],shadow:null});if(r){let e=x?x(n):null;if(typeof e==`string`&&G(e)===`template`){let e=n.content;Ct(e)&&t.push({node:e,shadow:null})}}if(r){let e=v(n);Ct(e)&&t.push({node:null,shadow:e},{node:e,shadow:null})}}};return t.sanitize=function(e){let n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},i=null,a=null,o=null,s=null;if(Ue=!e,Ue&&(e=``),typeof e!=`string`&&!wt(e)&&(e=Qt(e),typeof e!=`string`))throw Jt(`dirty is not a string, aborting`);if(!t.isSupported)return e;Se?(z=Ce,B=we):nt(n),(F.uponSanitizeElement.length>0||F.uponSanitizeAttribute.length>0)&&(z=Zt(z)),F.uponSanitizeAttribute.length>0&&(B=Zt(B)),t.removed=[];let c=Ne&&typeof e!=`string`&&wt(e);if(c){gt(e);let t=w(e);if(typeof t==`string`){let n=G(t);if(!z[n]||fe[n])throw dt(e),Jt(`root node is forbidden and cannot be sanitized in-place`)}if(St(e))throw dt(e),Jt(`root node is clobbered and cannot be sanitized in-place`);try{Rn(e)}catch(t){throw dt(e),t}}else if(wt(e))i=_t(``),a=i.ownerDocument.importNode(e,!0),a.nodeType===Dn.element&&a.nodeName===`BODY`||a.nodeName===`HTML`?i=a:i.appendChild(a),Rn(i);else{if(!Ee&&!ye&&!xe&&e.indexOf(`<`)===-1)return T&&Oe?ne(e):e;if(i=_t(e),!i)return Ee?null:Oe?E:``}i&&Te&<(i.firstChild);let l=c?e:i;try{let e=vt(l);for(;o=e.nextNode();)Wt(o,l),On(o,l),Ct(o.content)&&Ln(o.content)}catch(n){throw c&&(dt(e),At(t.removed,e=>{e.element&&mt(e.element)})),n}if(c){let n=!1;if(At(t.removed,t=>{t.element&&(t.element===e&&(n=!0),mt(t.element))}),n)throw Jt(`a node selected for removal could not be safely returned; refusing to sanitize in place`);return ye&&bt(e),e}if(Ee){if(ye&&bt(i),De)for(s=M.call(i.ownerDocument);i.firstChild;)s.appendChild(i.firstChild);else s=i;return(B.shadowroot||B.shadowrootmode)&&(s=P.call(r,s,!0)),s}let u=xe?i.outerHTML:i.innerHTML;return xe&&z[`!doctype`]&&i.ownerDocument&&i.ownerDocument.doctype&&i.ownerDocument.doctype.name&&J(xn,i.ownerDocument.doctype.name)&&(u=` diff --git a/apps/api/internal/webassets/dist/_app/immutable/chunks/C16fMXIp.js b/apps/api/internal/webassets/dist/_app/immutable/chunks/CSysFL2J.js similarity index 99% rename from apps/api/internal/webassets/dist/_app/immutable/chunks/C16fMXIp.js rename to apps/api/internal/webassets/dist/_app/immutable/chunks/CSysFL2J.js index 27d7d4049..9492b897b 100644 --- a/apps/api/internal/webassets/dist/_app/immutable/chunks/C16fMXIp.js +++ b/apps/api/internal/webassets/dist/_app/immutable/chunks/CSysFL2J.js @@ -1 +1 @@ -import{$ as e,A as t,At as n,C as r,Et as i,H as a,I as o,L as s,M as c,P as l,R as u,S as d,St as f,T as p,Tt as m,U as h,V as g,W as _,Y as v,a as y,ct as b,ft as x,g as S,gt as C,ht as w,j as T,jt as E,kt as ee,mt as D,n as te,pt as O,st as k,u as A,vt as j,yt as M,z as N}from"./BTIB_WQZ.js";import"./xihTtKlq.js";import{t as P}from"./DLuhiCle.js";import{u as ne}from"./DEPNME54.js";import{A as F,C as re,L as ie,M as ae,N as oe,O as se,P as ce,a as le,c as ue,d as de,h as fe,i as pe,k as I,l as L,m as R,n as me,o as z,r as he,s as ge,t as _e,u as ve}from"./T0GVabNa.js";import{c as ye,l as B,n as V,t as be}from"./ByQ3bZN5.js";import{t as xe}from"./DlGnnCJo.js";import{t as Se}from"./CmtSSHF9.js";var H=class{scope;reads=new Set;constructor(e){this.scope=e}get pending(){return this.reads.size>0}clear(){this.reads.clear()}prune(){for(let e of this.reads)e.current()||this.reads.delete(e)}updateMessage(e){for(let t of this.reads)if(t.messages.size+t.authors.size<=1e3){let n=t.messages.get(e.id);t.messages.set(e.id,n?I(n,e):e)}return t=>t.id===e.id?I(t,e):t}updateAuthor(e){for(let t of this.reads)t.messages.size+t.authors.size<=1e3&&t.authors.set(e.id,{...t.authors.get(e.id),...e});let t=t=>t?.id===e.id?{...t,...e}:t;return e=>({...e,author:t(e.author),quoted_author:t(e.quoted_author)})}async run(e,t,n=()=>!0){let r=this.scope(),i={messages:new Map,authors:new Map,current:()=>this.reads.has(i)&&this.scope()===r&&n()};this.reads.add(i);try{let n=await e();if(!i.current())return;if(i.messages.size+i.authors.size>1e3)throw Error(`Too many messages changed while loading. Please try again.`);let r=e=>{let t=i.messages.get(e.id);return t&&(e=I(e,t)),{...e,author:e.author&&{...e.author,...i.authors.get(e.author.id)},quoted_author:e.quoted_author&&{...e.quoted_author,...i.authors.get(e.quoted_author.id)}}};return`messages`in n?n.messages=n.messages.map(r):`message`in n?n.message=r(n.message):(n.root=r(n.root),n.replies=n.replies.map(r),n.thread_state=se(n.root.thread_state??null,n.thread_state)),t(n),n}catch(e){if(i.current())throw e}finally{this.reads.delete(i)}}},U={bash:{glyph:`🖥`,action:`Ran shell command`},exec:{glyph:`🖥`,action:`Ran shell command`},command:{glyph:`🖥`,action:`Ran shell command`},bashsession:{glyph:`🖥`,action:`Managed shell session`},sessions_send:{glyph:`🖥`,action:`Managed shell session`},read:{glyph:`📖`,action:`Read file`},write:{glyph:`📝`,action:`Wrote file`},edit:{glyph:`✏`,action:`Edited file`},apply_patch:{glyph:`🧩`,action:`Applied patch`},applypatch:{glyph:`🧩`,action:`Applied patch`},browsercontrol:{glyph:`🌐`,action:`Controlled browser`},websearch:{glyph:`🔍`,action:`Searched the web`},webfetch:{glyph:`🔗`,action:`Fetched a page`},image:{glyph:`🖼`,action:`Analyzed image`},imagecreate:{glyph:`🎨`,action:`Generated image`},scheduler:{glyph:`⏰`,action:`Scheduled a job`},sendmessage:{glyph:`📤`,action:`Sent a message`},message:{glyph:`📤`,action:`Sent a message`},systemctl:{glyph:`⚙`,action:`Controlled the system`},process:{glyph:`⚙`,action:`Managed a process`},devicecontrol:{glyph:`📱`,action:`Controlled a device`},pdfparse:{glyph:`📄`,action:`Parsed a PDF`},statuscheck:{glyph:`📊`,action:`Checked status`}},W=[{test:e=>e.includes(`search`),glyph:`🔍`,action:`Searched`},{test:e=>e.includes(`fetch`),glyph:`🔗`,action:`Fetched`},{test:e=>e.includes(`browser`),glyph:`🌐`,action:`Controlled browser`},{test:e=>e.includes(`patch`),glyph:`🧩`,action:`Applied patch`},{test:e=>e.includes(`write`),glyph:`📝`,action:`Wrote file`},{test:e=>e.includes(`edit`),glyph:`✏`,action:`Edited file`},{test:e=>e.includes(`read`),glyph:`📖`,action:`Read file`},{test:e=>e.includes(`session`),glyph:`🖥`,action:`Managed shell session`},{test:e=>e.includes(`bash`)||e.includes(`shell`)||e.includes(`exec`),glyph:`🖥`,action:`Ran command`},{test:e=>e.includes(`image`),glyph:`🖼`,action:`Worked with image`},{test:e=>e.includes(`message`)||e.includes(`send`),glyph:`📤`,action:`Sent a message`},{test:e=>e.includes(`agent`)||e.includes(`subagent`),glyph:`🤖`,action:`Ran a sub-agent`},{test:e=>e.includes(`schedul`)||e.includes(`cron`),glyph:`⏰`,action:`Scheduled a job`},{test:e=>e.includes(`device`),glyph:`📱`,action:`Controlled a device`},{test:e=>e.includes(`file`)||e.includes(`dir`),glyph:`📁`,action:`Worked with files`}];function Ce(e,t){let n=String(e||``).trim(),r=n.toLowerCase().replace(/[^a-z0-9_]/g,``),i=String(t||``).trim()||void 0,a=U[r];if(a)return{name:n,glyph:a.glyph,action:a.action,detail:i};for(let e of W)if(e.test(r))return{name:n,glyph:e.glyph,action:e.action,detail:i};return{name:n||`tool`,glyph:`🔧`,action:`Used tool`,detail:i}}var we=N(`
`),Te=N(` `),G=N(` `),Ee=N(`
`),K=N(`
`),De=N(`
`),Oe=N(`
`),ke=N(`
`),Ae=N(`
`);function je(e,a){i(a,!0);let c=y(a,`mentionPeople`,19,()=>[]),d=M(!0),g=M(void 0);b(()=>{(v(g)===void 0||a.block.final!==v(g))&&(j(g,a.block.final,!0),j(d,!a.block.final))});let _=C({});function E(e){_[e]=!_[e]}function ee(e){let t=e.match(/^\*\*([^]*?)\*\*\s*\n*([^]*)$/);if(!t)return{text:e};let n=t[1].trim(),r=t[2].trim();return{head:n||void 0,text:r}}let te=f(()=>a.block.items.map(e=>e.type===`tool`?{item:e,tool:Ce(e.name,e.detail)}:{item:e,tool:null})),A=f(()=>a.block.final?v(d)?`expanded`:`collapsed`:`live`),N=f(()=>v(d)?`Hide preamble`:`Show preamble`);var P=Ae();let ne;var F=x(P),re=x(F);let ae;var oe=w(re,2);let se;var ce=D(oe,!0),le=w(oe,2),ue=D(le,!0);n(F);var de=w(F,2),fe=e=>{var i=ke();T(i,21,()=>v(te),e=>e.item.id,(e,i)=>{var d=u(),m=O(d),g=e=>{var r=we();t(r,()=>R(v(i).item.body),!0),n(r),p(r,e=>ie?.(e)),p(r,(e,t)=>ve?.(e,t),()=>({people:c(),attentionUserID:a.mentionAttentionUserID})),s(e,r)},y=e=>{let u=f(()=>_[v(i).item.id]===!0);var d=Oe();let m;var g=x(d),y=x(g);let b;var C=w(y,2),T=D(C,!0),te=w(C,2),O=D(te,!0),A=w(te,2),j=e=>{var t=Te(),n=D(t,!0);k(()=>o(n,v(i).tool.name)),s(e,t)};l(A,e=>{v(i).tool.name&&v(i).tool.name!==`tool`&&e(j)});var M=w(A,2),N=e=>{var t=G(),n=D(t,!0);k(()=>{S(t,`title`,v(i).tool.detail),o(n,v(i).tool.detail)}),s(e,t)};l(M,e=>{!v(u)&&v(i).tool.detail&&e(N)}),n(g);var P=w(g,2),ne=e=>{let r=f(()=>ee(v(i).item.full));var u=De(),d=x(u),m=e=>{var t=Ee(),n=D(t,!0);k(()=>o(n,v(r).head)),s(e,t)};l(d,e=>{v(r).head&&e(m)});var h=w(d,2),g=e=>{var i=K();t(i,()=>R(v(r).text),!0),n(i),p(i,e=>ie?.(e)),p(i,(e,t)=>ve?.(e,t),()=>({people:c(),attentionUserID:a.mentionAttentionUserID})),s(e,i)};l(h,e=>{v(r).text&&e(g)}),n(u),s(e,u)};l(P,e=>{v(u)&&e(ne)}),n(d),k(()=>{m=r(d,1,`preamble-tool`,null,m,{expanded:v(u)}),S(g,`aria-expanded`,v(u)),b=r(y,1,`tool-line-chevron`,null,b,{open:v(u)}),o(T,v(i).tool.glyph),o(O,v(i).tool.action)}),h(`click`,g,()=>E(v(i).item.id)),s(e,d)};l(m,e=>{v(i).item.type===`commentary`?e(g):v(i).tool&&e(y,1)}),s(e,d)}),n(i),s(e,i)};l(de,e=>{v(d)&&e(fe)}),n(P),k(()=>{ne=r(P,1,`preamble-contract`,null,ne,{"is-final":a.block.final}),S(F,`aria-expanded`,v(d)),ae=r(re,1,`preamble-chevron`,null,ae,{open:v(d)}),se=r(oe,1,`preamble-state`,null,se,{"is-live":!a.block.final}),o(ce,v(A)),o(ue,v(N))}),h(`click`,F,()=>j(d,!v(d))),s(e,P),m()}a([`click`]);var Me=N(``),Ne=N(` `);function Pe(e,t){i(t,!0);var n=u(),r=O(n),a=e=>{var n=u(),r=O(n),i=e=>{var n=Me(),r=D(n,!0);k(()=>{S(n,`aria-label`,`Filter by topic ${t.topic.name}`),o(r,t.topic.name)}),h(`click`,n,e=>{e.stopPropagation(),t.onSelect(t.topic.id)}),s(e,n)},a=e=>{var n=Ne(),r=D(n,!0);k(()=>o(r,t.topic.name)),s(e,n)};l(r,e=>{t.onSelect?e(i):e(a,-1)}),s(e,n)};l(r,e=>{t.topic&&e(a)}),s(e,n),m()}a([`click`]);var Fe=N(`
This message was deleted.
`),Ie=N(`(edited)`),Le=N(`
`),Re=N(``),ze=N(``),Be=N(``),Ve=N(`
`,1),He=N(``),Ue=N(` `,1),q=N(``),We=N(` `),Ge=N(``),Ke=N(`Couldn't create link`),qe=N(` `,1),Je=N(` `),Ye=N(` `,1),Xe=N(` `,1),Ze=N(` `,1),Qe=N(`
`),$e=N(`
`),et=N(`
`);function tt(a,d){i(d,!0);let g=y(d,`mentionPeople`,19,()=>[]),E=y(d,`reactionsDisabled`,3,!1),ee=y(d,`canDeleteAnyMessage`,3,!1),N=y(d,`deleting`,3,!1),F=y(d,`editScope`,3,``),se=y(d,`topics`,19,()=>[]),de=y(d,`onSelectTopic`,3,()=>{}),I=y(d,`channelID`,3,``),ye=y(d,`pinned`,3,!1),B=f(()=>d.editController?.session(F())),V=f(()=>v(B)?.surface===`timeline`&&v(B).messageID===d.message.id);async function be(){await e(),v(vt)?.focus()}function xe(){d.editController?.start(F(),d.message,`timeline`)===`cancelled`&&be()}function Se(){d.editController?.cancel(F(),`timeline`)&&be()}async function H(){if(!d.editController)return;let e=await d.editController.save(F(),d.message,e=>d.onMessageEdited?.(e));(e===`saved`||e===`cancelled`)&&await be()}let U=f(()=>d.message.status===`pending`),W=f(()=>d.message.status===`failed`),Ce=f(()=>!!d.message.deleted_at),we=f(()=>ee()||!!d.currentUserID&&(d.message.author?.id||d.message.author_id)===d.currentUserID),Te=f(()=>!!d.currentUserID&&(d.message.author?.id||d.message.author_id)===d.currentUserID),G=f(()=>d.message.preamble_block),Ee=f(()=>!!d.previousMessage?.preamble_block&&!v(G)),K=f(()=>!!v(G)&&!!d.nextMessage&&!d.nextMessage?.preamble_block),De=f(()=>d.message.thread_state?.reply_count||0),Oe=f(()=>v(De)>0),ke=f(()=>oe(d.message)),Ae=f(()=>d.selectedThreadID===d.message.id),Me=f(()=>!v(G)&&!v(U)&&!v(W)&&(!v(Ce)||v(Oe)||v(Ae))),Ne=f(()=>se().find(e=>e.id===d.message.topic_id));function tt(e){if(Zt||v(Kt)){Zt=!1,e.preventDefault(),e.stopPropagation();return}v(Me)&&(window.getSelection()?.toString()||e.target?.closest(Ht)||d.onOpenThread(d.message))}function nt(e){return e.addEventListener(`click`,tt),{destroy(){e.removeEventListener(`click`,tt)}}}let J=M(!1),Y=M(!1),X=M(``),Z=M(``),rt=M(``),it=M(void 0),at=M(!1),ot=M(``),st=M(!1),ct=M(!1),lt=M(void 0),ut=M(!1),dt=M(!1),ft=f(()=>v(ut)||v(dt)||d.selected),pt=M(!1);function mt(){let e=v(lt)?.closest(`.messages-scroll`);if(!v(lt)||!e){j(pt,!1);return}let t=v(lt).getBoundingClientRect().top-e.getBoundingClientRect().top;j(pt,t<26)}let ht=M(void 0),gt=M(void 0),_t=M(void 0),vt=M(void 0),yt,Q,bt=!1,xt=f(()=>`toolbar-reaction-picker-${d.message.id}`),St=f(()=>d.reactionController.pending(d.message.id)),Ct=f(()=>E()||!d.currentUserID||v(U)||v(W)||v(St));function wt(t){d.reactionController.toggle(d.message,t),e().then(Tt)}function Tt(){let e=v(lt)?.closest(`.messages-scroll`),t=v(lt)?.querySelector(`.reactions-bar`);if(!t||!e)return;let n=t.getBoundingClientRect(),r=e.getBoundingClientRect();n.bottom>r.bottom?e.scrollTop+=Math.ceil(n.bottom-r.bottom):n.tope.getClientRects().length>0)}function Pt(e){if(e.key===`Escape`){e.preventDefault(),Mt();return}if(e.key===`Tab`){Mt(!1);return}let t=Nt();if(t.length===0)return;let n=t.indexOf(document.activeElement),r;e.key===`ArrowDown`?r=n<0?0:(n+1)%t.length:e.key===`ArrowUp`?r=n<=0?t.length-1:n-1:e.key===`Home`?r=0:e.key===`End`&&(r=t.length-1),r!==void 0&&(e.preventDefault(),t[r]?.focus())}function Ft(e){bt||(j(X,e,!0),yt&&window.clearTimeout(yt),yt=window.setTimeout(()=>{j(X,``),yt=void 0},1800))}async function It(){Mt(),await Lt()}async function Lt(){try{if(!navigator.clipboard)throw Error(`Clipboard unavailable`);return await navigator.clipboard.writeText(d.message.body??``),Ft(`copied`),!0}catch{return Ft(`failed`),!1}}async function Rt(){if(!d.onCopyLink||v(Z)===`pending`)return{copied:!1};j(Z,`pending`);let e;try{e=await d.onCopyLink(d.message)}catch{return j(Z,`failed`),{copied:!1}}try{if(!navigator.clipboard)throw Error(`Clipboard unavailable`);return await navigator.clipboard.writeText(e),j(Z,``),Ft(`copied`),{copied:!0}}catch{return j(Z,``),{copied:!1,fallback:e}}}async function zt(){let e=await Rt();(e.copied||e.fallback)&&(Mt(!1),e.fallback?(j(it,v(vt),!0),j(rt,e.fallback,!0)):v(vt)?.focus())}function Bt(){Mt(!1),xe()}function Vt(){Mt(!1),d.onDeleteMessage?.(d.message)}let Ht=`a, button, input, textarea, select, .attachment-grid, .media-tile, .markdown img, .gif-player, .markdown-table-scroll, .message-actions, .message-failed`,Ut=typeof window<`u`?window.matchMedia(`(hover: none), (pointer: coarse)`):null,Wt=M(C(Ut?.matches??!1)),Gt=f(()=>v(Wt)&&!P.mouse),Kt=M(!1),qt,Jt,Yt=0,Xt=M(void 0),Zt=!1,Qt=f(()=>`message-action-sheet-${d.message.id}`);b(()=>{if(!Ut)return;let e=()=>{j(Wt,Ut.matches,!0)};return Ut.addEventListener(`change`,e),()=>Ut.removeEventListener(`change`,e)});function $t(){qt!==void 0&&(window.clearTimeout(qt),qt=void 0)}function en(){Jt?.(),Jt=void 0}function tn(){Q!==void 0&&(window.clearTimeout(Q),Q=void 0)}function nn(e){tn(),Yt+=1,j(Xt,e,!0),j(Y,!1),j(J,!1),j(Kt,!0)}function rn(e){if(e.pointerType!==`touch`||!e.isPrimary||e.button!==0||v(G)||v(Ce)||v(U)||v(W)||v(V)||e.target?.closest(Ht))return;en();let t=e.pointerId,n=e.clientX,r=e.clientY;qt=window.setTimeout(()=>{qt=void 0,Zt=!0,nn()},450);let i=e=>{e.pointerId===t&&(Math.abs(e.clientX-n)>10||Math.abs(e.clientY-r)>10)&&o()},a=e=>{e.pointerId===t&&o()},o=()=>{$t(),window.removeEventListener(`pointermove`,i),window.removeEventListener(`pointerup`,a),window.removeEventListener(`pointercancel`,a),Jt===o&&(Jt=void 0)};Jt=o,window.addEventListener(`pointermove`,i),window.addEventListener(`pointerup`,a),window.addEventListener(`pointercancel`,a)}function an(e){(v(Kt)||qt!==void 0)&&e.preventDefault()}function on(){tn(),Yt+=1,j(Kt,!1),Zt=!1}function sn(e){on(),!v(Ct)&&wt(e)}function cn(){on(),d.onOpenThread(d.message)}function ln(){on(),d.onReply(d.message,d.replyContext)}async function un(){tn();let e=Yt;await Lt()&&v(Kt)&&e===Yt&&(Q=window.setTimeout(()=>{Q=void 0,!bt&&e===Yt&&on()},900))}async function dn(){let t=await Rt();if(!t.copied&&!t.fallback)return;let n=v(Xt);on(),t.fallback&&(await e(),j(it,n,!0),j(rt,t.fallback,!0))}function fn(){on(),xe()}function pn(){on(),d.onDeleteMessage?.(d.message)}async function mn(){if(I()&&d.onTogglePin&&!v(at)){j(at,!0),j(ot,``);try{await d.onTogglePin(d.message,ye()),Mt()}catch(e){j(ot,ne(e,`Could not update pin`),!0)}finally{j(at,!1)}}}async function hn(){await mn(),v(ot)||on()}b(()=>{if(!v(J)&&!v(Y))return;let e=e=>{let t=e.target;v(J)&&v(ht)&&!v(ht).contains(t)&&j(J,!1),v(Y)&&v(gt)&&!v(gt).contains(t)&&j(Y,!1)};return document.addEventListener(`click`,e),()=>document.removeEventListener(`click`,e)}),b(()=>{v(Ct)&&j(J,!1)}),te(()=>{bt=!0,yt&&window.clearTimeout(yt),tn(),en()}),b(()=>{if(!(v(Y)||v(J)||v(ft))||!v(lt))return;let e=v(lt).parentElement;for(;e&&e.style.position!==`absolute`;)e=e.parentElement;if(!e)return;let t=e.style.zIndex;return e.style.zIndex=`10`,()=>{e.style.zIndex=t}});var $=et();let gn;var _n=x($),vn=D(_n,!0),yn=w(_n,2),bn=x(yn),xn=e=>{je(e,{get block(){return v(G)},get mentionPeople(){return g()},get mentionAttentionUserID(){return d.mentionAttentionUserID}})},Sn=e=>{var t=Fe();s(e,t)},Cn=e=>{var t=u(),n=O(t),r=e=>{me(e,{get body(){return v(B).draft},get errorMessage(){return v(B).error},get saving(){return v(B).saving},onBody:e=>d.editController?.updateDraft(F(),e),onCancel:Se,onSave:H})};l(n,e=>{v(B)&&e(r)}),s(e,t)},wn=e=>{var r=Ve(),i=O(r);Pe(i,{get topic(){return v(Ne)},get onSelect(){return de()}});var a=w(i,2);_e(a,{get message(){return d.message},get onJump(){return d.onJumpToQuote}});var o=w(a,2);t(o,()=>R(d.message.body),!0),n(o),p(o,e=>ie?.(e)),p(o,(e,t)=>ve?.(e,t),()=>({people:g(),attentionUserID:d.mentionAttentionUserID}));var c=w(o,2),u=e=>{var t=Ie();k(e=>S(t,`title`,`Edited ${e??``}`),[()=>fe(d.message.edited_at)]),s(e,t)};l(c,e=>{d.message.edited_at&&e(u)});var m=w(c,2),_=e=>{{let t=f(()=>d.reactionController.reactionsFor(d.message)),n=f(()=>d.reactionController.pending(d.message.id)),r=f(()=>d.reactionController.error(d.message.id)),i=f(()=>E()||!d.currentUserID);ge(e,{get messageId(){return d.message.id},get reactions(){return v(t)},get pending(){return v(n)},get error(){return v(r)},get disabled(){return v(i)},onToggle:e=>wt(e)})}};l(m,e=>{!v(U)&&!v(W)&&e(_)});var y=w(m,2),b=e=>{var t=Le();T(t,21,()=>d.message.attachments,e=>e.id,(e,t)=>{{let n=f(()=>re(v(t)));he(e,{get upload(){return v(t)},get url(){return v(n)},get onOpenImage(){return d.onOpenImage},get onOpenArtifact(){return d.onOpenArtifact}})}}),n(t),s(e,t)};l(y,e=>{d.message.attachments?.length&&e(b)});var C=w(y,2),ee=e=>{var t=Be(),r=w(x(t),2),i=e=>{var t=Re();h(`click`,t,()=>d.onRetry?.(d.message)),s(e,t)};l(r,e=>{d.onRetry&&e(i)});var a=w(r,2),o=e=>{var t=ze();h(`click`,t,()=>d.onDiscard?.(d.message)),s(e,t)};l(a,e=>{d.onDiscard&&e(o)}),n(t),s(e,t)};l(C,e=>{v(W)&&e(ee)}),s(e,r)};l(bn,e=>{v(G)?e(xn):v(Ce)?e(Sn,1):v(V)?e(Cn,2):e(wn,-1)});var Tn=w(bn,2),En=e=>{var t=q();let i;var a=w(x(t),2),c=e=>{var t=Ue(),n=O(t),r=D(n,!0),i=w(n,2),a=e=>{var t=He(),n=D(t,!0);k(()=>{S(t,`datetime`,d.message.thread_state?.last_reply_at),o(n,v(ke))}),s(e,t)};l(i,e=>{v(ke)&&e(a)}),k(e=>o(r,e),[()=>ae(d.message)]),s(e,t)};l(a,e=>{(v(Oe)||v(Ae))&&e(c)}),n(t),k((e,n)=>{i=r(t,1,`thread-hint tooltip`,null,i,{"has-replies":v(Oe),"is-open":v(Ae)}),S(t,`data-tooltip`,e),S(t,`aria-label`,n)},[()=>ce(d.message,d.selectedThreadID),()=>ce(d.message,d.selectedThreadID)]),h(`click`,t,()=>d.onOpenThread(d.message)),s(e,t)};l(Tn,e=>{v(Me)&&e(En)}),n(yn);var Dn=w(yn,2),On=e=>{var t=$e(),i=x(t),a=e=>{var t=We();let n;var i=D(t,!0);k(()=>{n=r(t,1,`message-copy-status`,null,n,{"is-error":v(X)===`failed`}),o(i,v(X)===`copied`?`Copied`:`Couldn't copy`)}),s(e,t)};l(i,e=>{v(X)&&e(a)});var u=w(i,2);T(u,17,()=>L,c,(e,t)=>{var n=Ge(),r=D(n,!0);k(()=>{S(n,`aria-label`,`React with ${v(t)}`),S(n,`data-tooltip`,`React with ${v(t)}`),n.disabled=v(Ct),o(r,v(t))}),h(`click`,n,()=>Et(v(t))),s(e,n)});var p=w(u,2),m=x(p);A(m,e=>j(_t,e),()=>v(_t));var g=w(m,2),_=e=>{{let t=f(()=>v(st)?`above-right`:`below`);ue(e,{get id(){return v(xt)},get placement(){return v(t)},get disabled(){return v(Ct)},onPick:Ot,onEscape:kt})}};l(g,e=>{v(J)&&e(_)}),n(p),A(p,e=>j(ht,e),()=>v(ht));var y=w(p,4),b=w(y,2),C=w(b,4),E=x(C);let ee;A(E,e=>j(vt,e),()=>v(vt));var te=w(E,2),M=e=>{var t=Qe();let i;var a=x(t),c=w(a,2),u=e=>{var t=qe(),r=O(t),i=w(x(r));n(r);var a=w(r,2),c=e=>{var t=Ke();s(e,t)};l(a,e=>{v(Z)===`failed`&&e(c)}),k(()=>{r.disabled=v(Z)===`pending`,o(i,` ${v(Z)===`pending`?`Creating link…`:`Copy link`}`)}),h(`click`,r,()=>void zt()),s(e,t)};l(c,e=>{I()&&d.onCopyLink&&e(u)});var f=w(c,2),p=e=>{var t=Ye(),r=O(t),i=w(x(r));n(r);var a=w(r,2),c=e=>{var t=Je(),n=D(t,!0);k(()=>o(n,v(ot))),s(e,t)};l(a,e=>{v(ot)&&e(c)}),k(()=>{r.disabled=v(at),o(i,` ${ye()?`Unpin message`:`Pin message`}`)}),h(`click`,r,mn),s(e,t)};l(f,e=>{I()&&d.onTogglePin&&e(p)});var m=w(f,2),g=e=>{var t=Xe(),n=w(O(t),2);h(`click`,n,Bt),s(e,t)};l(m,e=>{v(Te)&&d.editController&&F()&&!v(V)&&e(g)});var _=w(m,2),y=e=>{var t=Ze(),n=w(O(t),2);k(()=>n.disabled=N()),h(`click`,n,Vt),s(e,t)};l(_,e=>{v(we)&&d.onDeleteMessage&&e(y)}),n(t),k(()=>i=r(t,1,`message-menu`,null,i,{above:v(ct)})),h(`keydown`,t,Pt),h(`click`,a,It),s(e,t)};l(te,e=>{v(Y)&&e(M)}),n(C),A(C,e=>j(gt,e),()=>v(gt)),n(t),k(e=>{S(m,`aria-controls`,v(xt)),S(m,`aria-expanded`,v(J)),m.disabled=v(Ct),S(y,`data-tooltip`,e),y.disabled=v(U)||v(W),b.disabled=v(U)||v(W),ee=r(E,1,`message-actions-trigger`,null,ee,{tooltip:!v(Gt),"tooltip-align-end":!v(Gt)}),S(E,`data-tooltip`,v(Gt)?void 0:`More actions`),S(E,`aria-haspopup`,v(Gt)?`dialog`:`menu`),S(E,`aria-controls`,v(Gt)?v(Qt):void 0),S(E,`aria-expanded`,v(Gt)?v(Kt):v(Y)),E.disabled=v(U)||v(W)},[()=>ce(d.message,d.selectedThreadID)]),h(`click`,m,Dt),h(`click`,y,()=>d.onOpenThread(d.message)),h(`click`,b,()=>d.onReply(d.message,d.replyContext)),h(`click`,E,jt),s(e,t)};l(Dn,e=>{!v(G)&&!v(Ce)&&e(On)});var kn=w(Dn,2),An=e=>{{let t=f(()=>!v(Ct)),n=f(()=>!v(U)&&!v(W)),r=f(()=>v(Te)&&!!d.editController&&!!F()&&!v(V)),i=f(()=>!!(I()&&d.onTogglePin)),a=f(()=>v(we)&&!!d.onDeleteMessage),o=f(()=>!!(I()&&d.onCopyLink));z(e,{get id(){return v(Qt)},get canReact(){return v(t)},get canReply(){return v(n)},get canOpenThread(){return v(Me)},get canEdit(){return v(r)},get canPin(){return v(i)},get pinned(){return ye()},get pinning(){return v(at)},get pinError(){return v(ot)},get canDelete(){return v(a)},get deleting(){return N()},get copyStatus(){return v(X)},get canCopyLink(){return v(o)},get copyLinkStatus(){return v(Z)},onReact:sn,onOpenThread:cn,onReply:ln,onCopy:un,onCopyLink:dn,onEdit:fn,onTogglePin:hn,onDelete:pn,onClose:on,get returnFocus(){return v(Xt)}})}};l(kn,e=>{v(Kt)&&e(An)});var jn=w(kn,2),Mn=e=>{le(e,{get url(){return v(rt)},onClose:()=>j(rt,``),get returnFocus(){return v(it)}})};l(jn,e=>{v(rt)&&e(Mn)}),n($),A($,e=>j(lt,e),()=>v(lt)),p($,e=>nt?.(e)),k((e,t)=>{gn=r($,1,`message-row`,null,gn,{selected:d.selected,"is-pending":v(U),"is-failed":v(W),"is-deleted":v(Ce),"is-preamble":e,"is-preamble-collapsed":v(G)?.final===!0,"is-preamble-live":v(G)?.final===!1,"before-final-message":v(K),"after-preamble":v(Ee),"can-open-thread":v(Me),editing:v(V),"menu-open":v(Y)||v(J),"actions-flip":v(pt)}),S($,`data-message-id`,d.message.id),o(vn,t)},[()=>!!v(G),()=>d.index===0?``:fe(d.message.created_at)]),h(`pointerdown`,$,rn),h(`contextmenu`,$,an),_(`mouseenter`,$,()=>{!v(ut)&&!v(dt)&&mt(),j(ut,!0)}),_(`mouseleave`,$,()=>j(ut,!1)),h(`focusin`,$,()=>{!v(ut)&&!v(dt)&&mt(),j(dt,!0)}),h(`focusout`,$,e=>{v(lt)?.contains(e.relatedTarget)||j(dt,!1)}),s(a,$),m()}a([`pointerdown`,`contextmenu`,`focusin`,`focusout`,`click`,`keydown`]);var nt=N(` deleted bot`,1),J=N(`bot`),Y=N(` `,1),X=N(` `),Z=N(`
`);function rt(e,t){i(t,!0);let a=y(t,`reactionsDisabled`,3,!1),c=y(t,`mentionPeople`,19,()=>[]),u=y(t,`canDeleteAnyMessage`,3,!1),d=y(t,`deletingMessageIDs`,19,()=>new Set),p=y(t,`channelID`,3,``),g=y(t,`pinnedMessageIDs`,19,()=>new Set),_=y(t,`editScope`,3,``),b=y(t,`topics`,19,()=>[]),S=y(t,`onSelectTopic`,3,()=>{}),C=f(()=>t.group.messages[0]?.author),E=f(()=>v(C)?.kind===`bot`),te=f(()=>!v(E)&&!!t.currentUserID&&t.group.authorID===t.currentUserID);var A=Z();let j;var M=x(A);{let e=f(()=>t.group.authorDeleted?`avatar`:`avatar avatar-button`),n=f(()=>t.group.authorDeleted?void 0:`View profile for ${t.group.authorName}`);be(M,{get class(){return v(e)},get id(){return t.group.authorID},get name(){return t.group.authorName},get src(){return t.group.authorAvatarURL},size:38,get buttonLabel(){return v(n)},onclick:()=>t.onOpenProfile(t.group.messages[0]?.author)})}var N=w(M,2),P=x(N),ne=x(P),F=e=>{var n=nt(),r=O(n),i=D(r,!0);ee(2),k(()=>o(i,t.group.authorName)),s(e,n)},re=e=>{var n=Y(),r=O(n),i=D(r,!0),a=w(r,2),c=e=>{var t=J();s(e,t)};l(a,e=>{v(E)&&e(c)}),k(()=>o(i,t.group.authorName)),h(`click`,r,()=>t.onOpenProfile(t.group.messages[0]?.author)),s(e,n)};l(ne,e=>{t.group.authorDeleted?e(F):e(re,-1)});var ie=w(ne,2),ae=e=>{var n=X(),r=D(n,!0);k(e=>o(r,e),[()=>B(t.group.authorHandle)]),s(e,n)};l(ie,e=>{t.group.authorHandle&&e(ae)});var oe=w(ie,2),se=D(oe,!0);n(P);var ce=w(P,2);T(ce,19,()=>t.group.messages,e=>e.id,(e,n,r)=>{{let i=f(()=>t.selectedThreadID===v(n).id),o=f(()=>d().has(v(n).id)),s=f(()=>g().has(v(n).id));tt(e,{get message(){return v(n)},get index(){return v(r)},get previousMessage(){return t.group.messages[v(r)-1]},get nextMessage(){return t.group.messages[v(r)+1]},get selected(){return v(i)},get replyContext(){return t.replyContext},get selectedThreadID(){return t.selectedThreadID},get mentionPeople(){return c()},get mentionAttentionUserID(){return t.mentionAttentionUserID},get currentUserID(){return t.currentUserID},get reactionController(){return t.reactionController},get reactionsDisabled(){return a()},get canDeleteAnyMessage(){return u()},get deleting(){return v(o)},get editController(){return t.editController},get editScope(){return _()},get onMessageEdited(){return t.onMessageEdited},get onReply(){return t.onReply},get onOpenThread(){return t.onOpenThread},get onJumpToQuote(){return t.onJumpToQuote},get onOpenImage(){return t.onOpenImage},get onOpenArtifact(){return t.onOpenArtifact},get onRetry(){return t.onRetry},get onDiscard(){return t.onDiscard},get onDeleteMessage(){return t.onDeleteMessage},get topics(){return b()},get onSelectTopic(){return S()},get channelID(){return p()},get pinned(){return v(s)},get onTogglePin(){return t.onTogglePin},get onCopyLink(){return t.onCopyLink}})}}),n(N),n(A),k(e=>{j=r(A,1,`message-group`,null,j,{"is-agent":v(E),"is-self":v(te)}),o(se,e)},[()=>fe(t.group.timestamp)]),s(e,A),m()}a([`click`]);var it=N(`
Send a message in Markdown — code fences, lists, links all work. Threads open from any message.
`),at=N(`
`),ot=N(`
`),st=N(`
New
`),ct=N(`
`),lt=N(`
`),ut=N(`
`);function dt(t,a){i(a,!0);let c=y(a,`loading`,3,!1),d=y(a,`unreadCount`,3,0),p=y(a,`unreadBoundarySeq`,3,0),_=y(a,`unreadBoundaryLoaded`,3,!1),C=y(a,`unreadSince`,3,``),T=y(a,`hasOlder`,3,!1),N=y(a,`hasNewer`,3,!1),P=y(a,`loadingOlder`,3,!1),ne=y(a,`loadingNewer`,3,!1),re=y(a,`prepending`,3,!1),ie=y(a,`mentionPeople`,19,()=>[]),ae=y(a,`reactionsDisabled`,3,!1),oe=y(a,`canDeleteAnyMessage`,3,!1),se=y(a,`deletingMessageIDs`,19,()=>new Set),ce=y(a,`channelID`,3,``),le=y(a,`pinnedMessageIDs`,19,()=>new Set),ue=y(a,`editScope`,3,``),fe=y(a,`topics`,19,()=>[]),pe=y(a,`onSelectTopic`,3,()=>{}),I=1.5,L=M(void 0),R=M(void 0),me=M(void 0),z=M(0),he=M(0),ge=f(()=>a.selectedDirect?`dm`:`channel`),_e=M(``),ve=M(-1),B=M(0),V=f(()=>v(_e)===a.viewKey&&v(ve)===p()&&d()<=v(B)?0:d()),be=M(``),H=M(0),U=M(!1),W,Ce=f(()=>v(V)>0?v(V):v(H));function we(){W&&=(window.clearTimeout(W),void 0)}b(()=>{if(v(be)&&v(be)!==a.viewKey){we(),j(H,0),j(be,``),j(U,!1);return}if(v(V)>0){we(),j(be,a.viewKey,!0),j(H,v(V),!0),j(U,!1);return}v(H)>0&&!v(U)&&(j(U,!0),W=window.setTimeout(()=>{W=void 0,!(v(V)>0)&&(j(H,0),j(be,``),j(U,!1))},180))}),te(we);let Te=f(()=>{let e=p()+1;if(v(Ce)<=0||e<=0)return!1;let t=1/0,n=0;for(let e of a.messages){if(e.parent_message_id)continue;let r=e.channel_seq||0;r<=0||(t=Math.min(t,r),n=Math.max(n,r))}return t<=e&&n>=e}),G=f(()=>_()&&v(Te)),Ee=f(()=>{let e=[],t=!1,n=e=>!v(G)||e.parent_message_id||e.author?.id===a.currentUserID||e.author_id===a.currentUserID?!1:v(Ce)>0&&(e.channel_seq||0)>p();for(let r of F(a.messages)){let i=-1;if(!t){for(let e=0;ea.messages.map(e=>{let t=e.preamble_block;if(!t)return``;let n=t.items.map(e=>e.type===`commentary`?`${e.id}\u0000${e.body}`:`${e.id}\u0000${e.name}\u0000${e.detail||``}\u0000${e.full}`).join(``);return`${e.id}\u0000${t.final?`final`:`live`}\u0000${n}`}).filter(Boolean).join(``)),Oe=M(!0),ke=M(!1),Ae,je=0,Me=``,Ne=``,Pe,Fe=M(void 0),Ie=0,Le=!1,Re=!1,ze=!1,Be=!1,Ve=0,He=0;function Ue(e=!0){return e&&(Le=!1,j(ke,!0)),He+=1,He}function q(e,t){return Z(e)&&t===He}function We(e=2){let t=++Ve;Re=!0;let n=e=>{requestAnimationFrame(()=>{if(t===Ve){if(e<=1){Re=!1;return}n(e-1)}})};n(e)}function Ge(){if(!v(L))return 0;let e=v(L).getScrollSize()+v(z);return Math.max(0,e-v(L).getScrollOffset()-v(L).getViewportSize())}function Ke(){return!v(L)||Ge()<=I}function qe(e=I){return!v(L)||Ge()<=e}function Je(){if(!v(L))return{atBottom:!0,nearOlder:!1,nearNewer:!1};let e=Ge();return{atBottom:Ke(),nearOlder:v(L).getScrollOffset()-v(z)<=160,nearNewer:e<=260}}function Ye(){a.onHistorySettled?.(Je())}function Xe(e=!1){N()||!e&&v(V)>0||a.onReachedBottom?.()}b(()=>{if(ne()){Be=!0;return}Be&&(Be=!1,ze=!1)});async function Ze(){v(L)&&v(Ee).length!==0&&(K=!N(),await Qe(Ue()))}async function Qe(t=Ue()){if(!v(L)||!v(R)||v(Ee).length===0)return;let n=a.viewKey;document.activeElement===v(R)&&v(R).blur();let r=-1;for(let i=0;i<6;i+=1){if(await e(),!v(L)||!v(R)||!q(n,t)||(K=!N(),We(2),v(R).scrollTop=v(R).scrollHeight,await X(),!v(L)||!q(n,t)))return;let i=v(L).getScrollSize(),a=r>=0&&Math.abs(i-r)<=I;if(r=i,a&&Ke())break}j(ke,!0),K=!N(),Ke()&&(j(Oe,!0),Xe(!0)),Ye()}b(()=>{if(!v(R))return;let e=v(R),t=()=>{let e=Ue();Re=!1,_t(a.viewKey,e)},n=e=>{e.defaultPrevented||e.ctrlKey||e.deltaY===0||(t(),e.deltaY>0&&N()&&Ke()&&(ze=!0,a.onLoadNewer?.(`wheel`)))},r=e=>{let n=e.target;e.defaultPrevented||!(n instanceof HTMLElement)||n.isContentEditable||n.closest(`input, textarea, select`)||e.key===` `&&n.closest(`button, [role=button]`)||[`ArrowUp`,`ArrowDown`,`PageUp`,`PageDown`,`Home`,`End`,` `].includes(e.key)&&t()},i=e=>{!e.defaultPrevented&&e.touches.length===1&&t()},o=n=>{n.target===e&&n.button===0&&t()};return e.addEventListener(`wheel`,n,{passive:!0}),e.addEventListener(`keydown`,r),e.addEventListener(`touchmove`,i,{passive:!0}),e.addEventListener(`pointerdown`,o),()=>{e.removeEventListener(`wheel`,n),e.removeEventListener(`keydown`,r),e.removeEventListener(`touchmove`,i),e.removeEventListener(`pointerdown`,o)}});function $e(e){return v(Ee).findIndex(t=>t.kind===`group`&&t.group.messages.some(t=>t.id===e))}let et=f(()=>{if(!T()||c()||!re())return 0;let e=Math.max(v(he),480);return Math.max(4,Math.ceil(e/52))});b(()=>{if(!v(R))return;let e=()=>{v(R)&&j(he,v(R).clientHeight,!0)};e();let t=new ResizeObserver(e);return t.observe(v(R)),()=>t.disconnect()});let tt=0;b(()=>{if(!v(me)||!v(R)){j(z,0),tt=0;return}let e=v(me),t=()=>{let t=e.offsetHeight,n=tt;if(j(z,t,!0),tt=t,n>0&&t!==n){let e=t-n;v(R)&&v(R).scrollTop>0&&(v(R).scrollTop+=e)}};t();let n=new ResizeObserver(t);return n.observe(e),()=>{n.disconnect(),j(z,0),tt=0}});function nt(){return v(Ee).findIndex(e=>e.kind===`divider`)}function J(){let e=0;for(let t of a.messages)e=Math.max(e,t.channel_seq||0);return e}function Y(){j(_e,a.viewKey,!0),j(ve,p()),j(B,d()),a.onMarkRead?.(J())}function X(){return new Promise(e=>requestAnimationFrame(()=>e()))}function Z(e){return e===a.viewKey&&e===Ae}async function dt(e,t,n,r,i=0){We(3);for(let a=0;a<24;a++){if(!q(e,t)||!v(L)||!v(R))return!1;let a=v(R).querySelector(r);if(a){let e=a.getBoundingClientRect().top-v(R).getBoundingClientRect().top-i;if(Math.abs(e)<=I)return!0;v(R).scrollTop+=e}else{let e=n();if(e<0)return!1;v(R).scrollTop=v(z)+v(L).getItemOffset(e)}await X()}return!1}function ft(t,n,r){if(!v(L)||t()<0)return!1;K=!1;let i=a.viewKey,o=Ue();return dt(i,o,t,n).then(async a=>{q(i,o)&&(Ye(),await e(),q(i,o)&&(a&&=await dt(i,o,t,n),!a&&q(i,o)&&r?.()))}),!0}function pt(e){return ft(()=>$e(e),`[data-message-id="${CSS.escape(e)}"]`)}function mt(e=!0){return ft(nt,`[data-unread-divider='true']`,e?a.onJumpToUnread:void 0)}function ht(){if(!(v(G)&&mt(!1))&&a.onJumpToUnread){a.onJumpToUnread();return}}function gt(){if(!v(L)||!v(R))return null;if(j(Fe,{atBottom:Ke()},!0),Ie=He,!v(Fe).atBottom){let e=v(R).getBoundingClientRect().top;for(let t of v(R).querySelectorAll(`[data-message-id]`)){let n=t.getBoundingClientRect();if(!(n.bottom<=e)){v(Fe).anchorMessageID=t.dataset.messageId,v(Fe).anchorPixelOffset=n.top-e;break}}}return v(Fe)}b(()=>(a.onListRef({scrollToBottom:Ze,scrollToMessage:pt,scrollToDivider:mt,captureState:gt,isFollowing:()=>K,isNearBottom:e=>qe(e)}),()=>a.onListRef(null))),b(()=>{let e=a.viewKey,t=v(Ee).length,n=v(De),r=a.messages.at(-1)?.id||``,i=r!==Me;if(Me=r,e!==Ae){Ae=e,je=t,Ne=n,Pe=a.restoreState,j(Fe,void 0),K=!0,j(Oe,!0),j(ke,!1),ze=!1,Le=!0,vt(e,a.restoreState,!0);return}let o=a.restoreState,s=o&&o!==Pe;if(s){let r=o===v(Fe)&&Ie!==He;if(j(Fe,void 0),Pe=o,!r&&(o.atBottom||o.anchorMessageID)){je=t,Ne=n,Le=!0,vt(e,o,o.atBottom);return}r&&!K&&v(L)&&yt(v(L).getScrollOffset())}let c=s||t!==je||i||n!==Ne;c&&K&&!N()&&!Le?Qe():c&&!Le&&_t(e),je=t,Ne=n});async function _t(t,n=He){await e(),await X(),q(t,n)&&Ye()}async function vt(t,n,r){let i=Ue(!1),a=n&&!n.atBottom?n.anchorMessageID:void 0,o=a?()=>dt(t,i,()=>$e(a),`[data-message-id="${CSS.escape(a)}"]`,n?.anchorPixelOffset??0):void 0,s=!1;if(await e(),await X(),q(t,i)){if(o){let e=await o();if(!q(t,i))return;!e&&r?await Qe(i):K=!1}else v(Ee).findIndex(e=>e.kind===`divider`)>=0&&v(L)?(s=!0,await dt(t,i,()=>nt(),`[data-unread-divider='true']`),K=!1):await Qe(i);await X(),q(t,i)&&(Le=!1,j(ke,!0),j(Oe,Ke(),!0),K=v(Oe)&&!N(),s||(v(Oe)&&Xe(),v(L)&&yt(v(L).getScrollOffset())),Ye(),o&&(await e(),q(t,i)&&await o()))}}function yt(e){if(!v(L)||Le&&!v(ke))return;let t=Ge(),n=Ke(),r=n||t<=260;K=n&&!N(),j(Oe,n,!0),N()||(ze=!1),!n&&T()&&e-v(z)<=160&&a.onLoadOlder?.(),!Re&&N()&&r&&!ze&&(ze=!0,a.onLoadNewer?.(`scroll`)),n&&!Re&&Xe()}var Q=ut();let bt;var xt=x(Q),St=e=>{var t=it(),r=x(t),i=x(r),c=e=>{var t=g(`@`);s(e,t)},u=e=>{var t=g(`#`);s(e,t)};l(i,e=>{a.selectedDirect?e(c):e(u,-1)}),n(r);var d=w(r,2),f=x(d),p=e=>{var t=g();k(e=>o(t,`This is the start of your conversation with ${e??``}.`),[()=>ye(a.selectedDirect,a.currentUserID)]),s(e,t)},m=e=>{var t=g();k(e=>o(t,`Welcome to #${e??``}!`),[()=>xe(a.selectedChannel)]),s(e,t)},h=e=>{var t=g(`Pick a channel to get started.`);s(e,t)};l(f,e=>{a.selectedDirect?e(p):a.selectedChannel?e(m,1):e(h,-1)}),n(d),ee(2),n(t),s(e,t)},Ct=e=>{var t=ct(),i=w(x(t),2),d=e=>{var t=at(),r=x(t);de(r,{direction:`older`,get rows(){return v(et)}}),n(t),A(t,e=>j(me,e),()=>v(me)),k(()=>S(t,`aria-hidden`,P()?`false`:`true`)),s(e,t)};l(i,e=>{v(et)>0&&e(d)});var f=w(i,2);A(Se(f,{get data(){return v(Ee)},getKey:e=>e.id,itemProps:()=>c()||!v(ke)?void 0:{style:{"pointer-events":`auto`}},get scrollRef(){return v(R)},get shift(){return re()},get startMargin(){return v(z)},onscroll:yt,children:(e,t=E,i=E)=>{var c=u(),d=O(c),f=e=>{de(e,{get direction(){return t().direction},get rows(){return t().rows}})},p=e=>{var r=ot(),i=x(r),a=D(i,!0);n(r),k(()=>o(a,t().label)),s(e,r)},m=e=>{var t=st();let n;k(()=>n=r(t,1,`new-messages-divider`,null,n,{"is-clearing":v(U)})),s(e,t)},h=e=>{rt(e,{get group(){return t().group},get currentUserID(){return a.currentUserID},get reactionController(){return a.reactionController},get reactionsDisabled(){return ae()},get selectedThreadID(){return a.selectedThreadID},get mentionPeople(){return ie()},get mentionAttentionUserID(){return a.mentionAttentionUserID},get replyContext(){return v(ge)},get canDeleteAnyMessage(){return oe()},get deletingMessageIDs(){return se()},get editController(){return a.editController},get editScope(){return ue()},get onMessageEdited(){return a.onMessageEdited},get onOpenProfile(){return a.onOpenProfile},get onReply(){return a.onReply},get onOpenThread(){return a.onOpenThread},get onJumpToQuote(){return a.onJumpToQuote},get onOpenImage(){return a.onOpenImage},get onOpenArtifact(){return a.onOpenArtifact},get onRetry(){return a.onRetry},get onDiscard(){return a.onDiscard},get onDeleteMessage(){return a.onDeleteMessage},get topics(){return fe()},get onSelectTopic(){return pe()},get channelID(){return ce()},get pinnedMessageIDs(){return le()},get onTogglePin(){return a.onTogglePin},get onCopyLink(){return a.onCopyLink}})};l(d,e=>{t().kind===`loader`?e(f):t().kind===`day`?e(p,1):t().kind===`divider`?e(m,2):t().kind===`group`&&e(h,3)}),s(e,c)},$$slots:{default:!0}}),e=>j(L,e,!0),()=>v(L)),n(t),A(t,e=>j(R,e),()=>v(R)),s(e,t)};l(xt,e=>{!c()&&a.messages.length===0?e(St):a.messages.length>0&&e(Ct,1)});var wt=w(xt,2),Tt=e=>{var t=lt();let i;var a=x(t),c=x(a),l=D(c);n(a);var u=w(a,2);n(t),k(e=>{i=r(t,1,`unread-bar`,null,i,{"is-clearing":v(U)}),S(t,`aria-hidden`,v(U)?`true`:void 0),a.disabled=v(U),S(a,`aria-label`,e),o(l,`${(v(H)>99?`99+`:v(H))??``} new message${v(H)===1?``:`s`}${C()?` since ${C()}`:``}`),u.disabled=v(U)},[()=>`Jump to ${v(H)>0?v(H):``} new message${v(H)===1?``:`s`}`.replace(/ +/g,` `)]),h(`click`,a,ht),h(`click`,u,Y),s(e,t)};l(wt,e=>{!c()&&a.messages.length>0&&v(H)>0&&e(Tt)}),n(Q),k(()=>bt=r(Q,1,`messages`,null,bt,{"is-revealing":c()||!v(ke)&&a.messages.length>0})),h(`pointerdown`,Q,function(...e){a.onActivateMessageComposer?.apply(this,e)}),h(`pointerup`,Q,function(...e){a.onInlineImagePointerUp?.apply(this,e)}),s(t,Q),m()}a([`pointerdown`,`pointerup`,`click`]);var ft=N(` `),pt=N(` `),mt=N(``),ht=N(`
`),gt=N(``),_t=N(`
User kind
`),vt=N(`

`),yt=N(`

Blocked.

`),Q=N(``),bt=N(``),xt=N(``),St=N(``),Ct=N(`
Moderation
`),wt=N(`

Profile

Active
Contact information
Handle
User ID
About

`,1);function Tt(e,t){i(t,!0);let r=y(t,`messagePending`,3,!1),a=y(t,`messageError`,3,``),c=f(()=>t.profile.kind===`bot`?t.profile.owner_user_id?`Bot of ${t.profile.owner_user_id}`:`Service bot`:``),u=f(()=>t.moderation?.role||`member`),p=f(()=>!!t.moderation&&v(u)!==`owner`&&(t.currentUserRole===`owner`||t.currentUserRole===`moderator`&&(v(u)===`member`||v(u)===`guest`))),g=f(()=>t.currentUser?.id!==t.profile.id&&v(p)),_=f(()=>!!t.moderation?.blocked_at),b=f(()=>v(u));var S=wt(),C=O(S),T=x(C),E=w(x(T),2),ee=D(E,!0);n(T);var te=w(T,2);n(C);var A=w(C,2),j=x(A),M=x(j);be(M,{class:`profile-avatar`,get id(){return t.profile.id},get name(){return t.profile.display_name},get src(){return t.profile.avatar_url},size:240,loading:`eager`,fetchPriority:`auto`}),n(j);var N=w(j,2),P=x(N),ne=x(P),F=x(ne),re=D(F,!0),ie=w(F,2),ae=e=>{var t=ft(),n=D(t,!0);k(()=>o(n,v(c))),s(e,t)};l(ie,e=>{v(c)&&e(ae)});var oe=w(ie,2),se=e=>{var n=pt(),r=D(n,!0);k(e=>o(r,e),[()=>B(t.profile.handle)]),s(e,n)};l(oe,e=>{t.profile.handle&&e(se)}),n(ne);var ce=w(ne,2),le=e=>{var n=mt();h(`click`,n,function(...e){t.onEdit?.apply(this,e)}),s(e,n)};l(ce,e=>{t.currentUser?.id===t.profile.id&&t.onEdit&&e(le)}),n(P);var ue=w(P,4),de=e=>{var i=ht(),a=x(i),c=D(a,!0);n(i),k(()=>{a.disabled=r(),o(c,r()?`Starting…`:`Message`)}),h(`click`,a,()=>t.onMessage?.(t.profile.id)),s(e,i)};l(ue,e=>{t.currentUser?.id!==t.profile.id&&t.onMessage&&e(de)});var fe=w(ue,2),pe=e=>{var t=gt(),n=D(t,!0);k(()=>o(n,a())),s(e,t)};l(fe,e=>{a()&&e(pe)});var I=w(fe,2),L=x(I),R=w(x(L),2),me=e=>{var n=mt();h(`click`,n,function(...e){t.onEdit?.apply(this,e)}),s(e,n)};l(R,e=>{t.currentUser?.id===t.profile.id&&t.onEdit&&e(me)}),n(L);var z=w(L,2),he=w(x(z),2),ge=w(x(he),2),_e=D(ge,!0);n(he),n(z);var ve=w(z,2),ye=w(x(ve),2),xe=w(x(ye),2),Se=D(xe,!0);n(ye),n(ve);var H=w(ve,2),U=e=>{var t=_t(),r=w(x(t),2),i=w(x(r),2),a=D(i,!0);n(r),n(t),k(()=>o(a,v(c))),s(e,t)};l(H,e=>{t.profile.kind===`bot`&&e(U)}),n(I);var W=w(I,2),Ce=w(x(W),2),we=D(Ce);n(W);var Te=w(W,2),G=e=>{var r=Ct(),i=x(r),a=w(x(i),2),c=D(a,!0);n(i);var u=w(i,2),d=e=>{var n=vt(),r=D(n);k(()=>o(r,`${t.moderation.posts_remaining??``} of ${t.moderation.post_limit??``} waiting-room posts left today.`)),s(e,n)};l(u,e=>{t.moderation.role===`guest`&&t.moderation.post_limit>0&&e(d)});var f=w(u,2),p=e=>{var n=vt(),r=D(n);k(e=>o(r,`Timed out until ${e??``}.`),[()=>new Date(t.moderation.timeout_until).toLocaleString()]),s(e,n)};l(f,e=>{t.moderation.timeout_until&&e(p)});var m=w(f,2),g=e=>{var t=yt();s(e,t)};l(m,e=>{t.moderation.blocked_at&&e(g)});var y=w(m,2),S=x(y),C=e=>{var n=Q();h(`click`,n,()=>t.onApprove?.(t.profile.id)),s(e,n)};l(S,e=>{t.moderation.role===`guest`&&t.onApprove&&e(C)});var T=w(S,2),E=e=>{var n=bt();h(`click`,n,()=>t.onTimeout?.(t.profile.id)),s(e,n)};l(T,e=>{t.onTimeout&&e(E)});var ee=w(T,2),te=e=>{var n=xt();h(`click`,n,()=>t.onUnblock?.(t.profile.id)),s(e,n)},O=e=>{var n=St();h(`click`,n,()=>t.onBlock?.(t.profile.id)),s(e,n)};l(ee,e=>{v(_)&&t.onUnblock?e(te):!v(_)&&t.onBlock&&e(O,1)}),n(y),n(r),k(()=>o(c,v(b))),s(e,r)};l(Te,e=>{v(g)&&t.moderation&&e(G)}),n(N),n(A),k((e,n)=>{o(ee,t.profile.display_name),d(j,`--hue: ${e??``}deg`),o(re,t.profile.display_name),o(_e,n),o(Se,t.profile.id),o(we,`Member of ${(t.workspaceName||`this workspace`)??``}.`)},[()=>V(t.profile.id),()=>t.profile.handle?B(t.profile.handle):`No handle set`]),h(`click`,te,function(...e){t.onClose?.apply(this,e)}),s(e,S),m()}a([`click`]);export{H as i,dt as n,Pe as r,Tt as t}; \ No newline at end of file +import{$ as e,A as t,At as n,C as r,Et as i,H as a,I as o,L as s,M as c,P as l,R as u,S as d,St as f,T as p,Tt as m,U as h,V as g,W as _,Y as v,a as y,ct as b,ft as x,g as S,gt as C,ht as w,j as T,jt as E,kt as ee,mt as D,n as te,pt as O,st as k,u as A,vt as j,yt as M,z as N}from"./BTIB_WQZ.js";import"./xihTtKlq.js";import{t as P}from"./DLuhiCle.js";import{u as ne}from"./DEPNME54.js";import{A as F,C as re,L as ie,M as ae,N as oe,O as se,P as ce,a as le,c as ue,d as de,h as fe,i as pe,k as I,l as L,m as R,n as me,o as z,r as he,s as ge,t as _e,u as ve}from"./BNjDjM6i.js";import{c as ye,l as B,n as V,t as be}from"./ByQ3bZN5.js";import{t as xe}from"./DlGnnCJo.js";import{t as Se}from"./CmtSSHF9.js";var H=class{scope;reads=new Set;constructor(e){this.scope=e}get pending(){return this.reads.size>0}clear(){this.reads.clear()}prune(){for(let e of this.reads)e.current()||this.reads.delete(e)}updateMessage(e){for(let t of this.reads)if(t.messages.size+t.authors.size<=1e3){let n=t.messages.get(e.id);t.messages.set(e.id,n?I(n,e):e)}return t=>t.id===e.id?I(t,e):t}updateAuthor(e){for(let t of this.reads)t.messages.size+t.authors.size<=1e3&&t.authors.set(e.id,{...t.authors.get(e.id),...e});let t=t=>t?.id===e.id?{...t,...e}:t;return e=>({...e,author:t(e.author),quoted_author:t(e.quoted_author)})}async run(e,t,n=()=>!0){let r=this.scope(),i={messages:new Map,authors:new Map,current:()=>this.reads.has(i)&&this.scope()===r&&n()};this.reads.add(i);try{let n=await e();if(!i.current())return;if(i.messages.size+i.authors.size>1e3)throw Error(`Too many messages changed while loading. Please try again.`);let r=e=>{let t=i.messages.get(e.id);return t&&(e=I(e,t)),{...e,author:e.author&&{...e.author,...i.authors.get(e.author.id)},quoted_author:e.quoted_author&&{...e.quoted_author,...i.authors.get(e.quoted_author.id)}}};return`messages`in n?n.messages=n.messages.map(r):`message`in n?n.message=r(n.message):(n.root=r(n.root),n.replies=n.replies.map(r),n.thread_state=se(n.root.thread_state??null,n.thread_state)),t(n),n}catch(e){if(i.current())throw e}finally{this.reads.delete(i)}}},U={bash:{glyph:`🖥`,action:`Ran shell command`},exec:{glyph:`🖥`,action:`Ran shell command`},command:{glyph:`🖥`,action:`Ran shell command`},bashsession:{glyph:`🖥`,action:`Managed shell session`},sessions_send:{glyph:`🖥`,action:`Managed shell session`},read:{glyph:`📖`,action:`Read file`},write:{glyph:`📝`,action:`Wrote file`},edit:{glyph:`✏`,action:`Edited file`},apply_patch:{glyph:`🧩`,action:`Applied patch`},applypatch:{glyph:`🧩`,action:`Applied patch`},browsercontrol:{glyph:`🌐`,action:`Controlled browser`},websearch:{glyph:`🔍`,action:`Searched the web`},webfetch:{glyph:`🔗`,action:`Fetched a page`},image:{glyph:`🖼`,action:`Analyzed image`},imagecreate:{glyph:`🎨`,action:`Generated image`},scheduler:{glyph:`⏰`,action:`Scheduled a job`},sendmessage:{glyph:`📤`,action:`Sent a message`},message:{glyph:`📤`,action:`Sent a message`},systemctl:{glyph:`⚙`,action:`Controlled the system`},process:{glyph:`⚙`,action:`Managed a process`},devicecontrol:{glyph:`📱`,action:`Controlled a device`},pdfparse:{glyph:`📄`,action:`Parsed a PDF`},statuscheck:{glyph:`📊`,action:`Checked status`}},W=[{test:e=>e.includes(`search`),glyph:`🔍`,action:`Searched`},{test:e=>e.includes(`fetch`),glyph:`🔗`,action:`Fetched`},{test:e=>e.includes(`browser`),glyph:`🌐`,action:`Controlled browser`},{test:e=>e.includes(`patch`),glyph:`🧩`,action:`Applied patch`},{test:e=>e.includes(`write`),glyph:`📝`,action:`Wrote file`},{test:e=>e.includes(`edit`),glyph:`✏`,action:`Edited file`},{test:e=>e.includes(`read`),glyph:`📖`,action:`Read file`},{test:e=>e.includes(`session`),glyph:`🖥`,action:`Managed shell session`},{test:e=>e.includes(`bash`)||e.includes(`shell`)||e.includes(`exec`),glyph:`🖥`,action:`Ran command`},{test:e=>e.includes(`image`),glyph:`🖼`,action:`Worked with image`},{test:e=>e.includes(`message`)||e.includes(`send`),glyph:`📤`,action:`Sent a message`},{test:e=>e.includes(`agent`)||e.includes(`subagent`),glyph:`🤖`,action:`Ran a sub-agent`},{test:e=>e.includes(`schedul`)||e.includes(`cron`),glyph:`⏰`,action:`Scheduled a job`},{test:e=>e.includes(`device`),glyph:`📱`,action:`Controlled a device`},{test:e=>e.includes(`file`)||e.includes(`dir`),glyph:`📁`,action:`Worked with files`}];function Ce(e,t){let n=String(e||``).trim(),r=n.toLowerCase().replace(/[^a-z0-9_]/g,``),i=String(t||``).trim()||void 0,a=U[r];if(a)return{name:n,glyph:a.glyph,action:a.action,detail:i};for(let e of W)if(e.test(r))return{name:n,glyph:e.glyph,action:e.action,detail:i};return{name:n||`tool`,glyph:`🔧`,action:`Used tool`,detail:i}}var we=N(`
`),Te=N(` `),G=N(` `),Ee=N(`
`),K=N(`
`),De=N(`
`),Oe=N(`
`),ke=N(`
`),Ae=N(`
`);function je(e,a){i(a,!0);let c=y(a,`mentionPeople`,19,()=>[]),d=M(!0),g=M(void 0);b(()=>{(v(g)===void 0||a.block.final!==v(g))&&(j(g,a.block.final,!0),j(d,!a.block.final))});let _=C({});function E(e){_[e]=!_[e]}function ee(e){let t=e.match(/^\*\*([^]*?)\*\*\s*\n*([^]*)$/);if(!t)return{text:e};let n=t[1].trim(),r=t[2].trim();return{head:n||void 0,text:r}}let te=f(()=>a.block.items.map(e=>e.type===`tool`?{item:e,tool:Ce(e.name,e.detail)}:{item:e,tool:null})),A=f(()=>a.block.final?v(d)?`expanded`:`collapsed`:`live`),N=f(()=>v(d)?`Hide preamble`:`Show preamble`);var P=Ae();let ne;var F=x(P),re=x(F);let ae;var oe=w(re,2);let se;var ce=D(oe,!0),le=w(oe,2),ue=D(le,!0);n(F);var de=w(F,2),fe=e=>{var i=ke();T(i,21,()=>v(te),e=>e.item.id,(e,i)=>{var d=u(),m=O(d),g=e=>{var r=we();t(r,()=>R(v(i).item.body),!0),n(r),p(r,e=>ie?.(e)),p(r,(e,t)=>ve?.(e,t),()=>({people:c(),attentionUserID:a.mentionAttentionUserID})),s(e,r)},y=e=>{let u=f(()=>_[v(i).item.id]===!0);var d=Oe();let m;var g=x(d),y=x(g);let b;var C=w(y,2),T=D(C,!0),te=w(C,2),O=D(te,!0),A=w(te,2),j=e=>{var t=Te(),n=D(t,!0);k(()=>o(n,v(i).tool.name)),s(e,t)};l(A,e=>{v(i).tool.name&&v(i).tool.name!==`tool`&&e(j)});var M=w(A,2),N=e=>{var t=G(),n=D(t,!0);k(()=>{S(t,`title`,v(i).tool.detail),o(n,v(i).tool.detail)}),s(e,t)};l(M,e=>{!v(u)&&v(i).tool.detail&&e(N)}),n(g);var P=w(g,2),ne=e=>{let r=f(()=>ee(v(i).item.full));var u=De(),d=x(u),m=e=>{var t=Ee(),n=D(t,!0);k(()=>o(n,v(r).head)),s(e,t)};l(d,e=>{v(r).head&&e(m)});var h=w(d,2),g=e=>{var i=K();t(i,()=>R(v(r).text),!0),n(i),p(i,e=>ie?.(e)),p(i,(e,t)=>ve?.(e,t),()=>({people:c(),attentionUserID:a.mentionAttentionUserID})),s(e,i)};l(h,e=>{v(r).text&&e(g)}),n(u),s(e,u)};l(P,e=>{v(u)&&e(ne)}),n(d),k(()=>{m=r(d,1,`preamble-tool`,null,m,{expanded:v(u)}),S(g,`aria-expanded`,v(u)),b=r(y,1,`tool-line-chevron`,null,b,{open:v(u)}),o(T,v(i).tool.glyph),o(O,v(i).tool.action)}),h(`click`,g,()=>E(v(i).item.id)),s(e,d)};l(m,e=>{v(i).item.type===`commentary`?e(g):v(i).tool&&e(y,1)}),s(e,d)}),n(i),s(e,i)};l(de,e=>{v(d)&&e(fe)}),n(P),k(()=>{ne=r(P,1,`preamble-contract`,null,ne,{"is-final":a.block.final}),S(F,`aria-expanded`,v(d)),ae=r(re,1,`preamble-chevron`,null,ae,{open:v(d)}),se=r(oe,1,`preamble-state`,null,se,{"is-live":!a.block.final}),o(ce,v(A)),o(ue,v(N))}),h(`click`,F,()=>j(d,!v(d))),s(e,P),m()}a([`click`]);var Me=N(``),Ne=N(` `);function Pe(e,t){i(t,!0);var n=u(),r=O(n),a=e=>{var n=u(),r=O(n),i=e=>{var n=Me(),r=D(n,!0);k(()=>{S(n,`aria-label`,`Filter by topic ${t.topic.name}`),o(r,t.topic.name)}),h(`click`,n,e=>{e.stopPropagation(),t.onSelect(t.topic.id)}),s(e,n)},a=e=>{var n=Ne(),r=D(n,!0);k(()=>o(r,t.topic.name)),s(e,n)};l(r,e=>{t.onSelect?e(i):e(a,-1)}),s(e,n)};l(r,e=>{t.topic&&e(a)}),s(e,n),m()}a([`click`]);var Fe=N(`
This message was deleted.
`),Ie=N(`(edited)`),Le=N(`
`),Re=N(``),ze=N(``),Be=N(``),Ve=N(`
`,1),He=N(``),Ue=N(` `,1),q=N(``),We=N(` `),Ge=N(``),Ke=N(`Couldn't create link`),qe=N(` `,1),Je=N(` `),Ye=N(` `,1),Xe=N(` `,1),Ze=N(` `,1),Qe=N(`
`),$e=N(`
`),et=N(`
`);function tt(a,d){i(d,!0);let g=y(d,`mentionPeople`,19,()=>[]),E=y(d,`reactionsDisabled`,3,!1),ee=y(d,`canDeleteAnyMessage`,3,!1),N=y(d,`deleting`,3,!1),F=y(d,`editScope`,3,``),se=y(d,`topics`,19,()=>[]),de=y(d,`onSelectTopic`,3,()=>{}),I=y(d,`channelID`,3,``),ye=y(d,`pinned`,3,!1),B=f(()=>d.editController?.session(F())),V=f(()=>v(B)?.surface===`timeline`&&v(B).messageID===d.message.id);async function be(){await e(),v(vt)?.focus()}function xe(){d.editController?.start(F(),d.message,`timeline`)===`cancelled`&&be()}function Se(){d.editController?.cancel(F(),`timeline`)&&be()}async function H(){if(!d.editController)return;let e=await d.editController.save(F(),d.message,e=>d.onMessageEdited?.(e));(e===`saved`||e===`cancelled`)&&await be()}let U=f(()=>d.message.status===`pending`),W=f(()=>d.message.status===`failed`),Ce=f(()=>!!d.message.deleted_at),we=f(()=>ee()||!!d.currentUserID&&(d.message.author?.id||d.message.author_id)===d.currentUserID),Te=f(()=>!!d.currentUserID&&(d.message.author?.id||d.message.author_id)===d.currentUserID),G=f(()=>d.message.preamble_block),Ee=f(()=>!!d.previousMessage?.preamble_block&&!v(G)),K=f(()=>!!v(G)&&!!d.nextMessage&&!d.nextMessage?.preamble_block),De=f(()=>d.message.thread_state?.reply_count||0),Oe=f(()=>v(De)>0),ke=f(()=>oe(d.message)),Ae=f(()=>d.selectedThreadID===d.message.id),Me=f(()=>!v(G)&&!v(U)&&!v(W)&&(!v(Ce)||v(Oe)||v(Ae))),Ne=f(()=>se().find(e=>e.id===d.message.topic_id));function tt(e){if(Zt||v(Kt)){Zt=!1,e.preventDefault(),e.stopPropagation();return}v(Me)&&(window.getSelection()?.toString()||e.target?.closest(Ht)||d.onOpenThread(d.message))}function nt(e){return e.addEventListener(`click`,tt),{destroy(){e.removeEventListener(`click`,tt)}}}let J=M(!1),Y=M(!1),X=M(``),Z=M(``),rt=M(``),it=M(void 0),at=M(!1),ot=M(``),st=M(!1),ct=M(!1),lt=M(void 0),ut=M(!1),dt=M(!1),ft=f(()=>v(ut)||v(dt)||d.selected),pt=M(!1);function mt(){let e=v(lt)?.closest(`.messages-scroll`);if(!v(lt)||!e){j(pt,!1);return}let t=v(lt).getBoundingClientRect().top-e.getBoundingClientRect().top;j(pt,t<26)}let ht=M(void 0),gt=M(void 0),_t=M(void 0),vt=M(void 0),yt,Q,bt=!1,xt=f(()=>`toolbar-reaction-picker-${d.message.id}`),St=f(()=>d.reactionController.pending(d.message.id)),Ct=f(()=>E()||!d.currentUserID||v(U)||v(W)||v(St));function wt(t){d.reactionController.toggle(d.message,t),e().then(Tt)}function Tt(){let e=v(lt)?.closest(`.messages-scroll`),t=v(lt)?.querySelector(`.reactions-bar`);if(!t||!e)return;let n=t.getBoundingClientRect(),r=e.getBoundingClientRect();n.bottom>r.bottom?e.scrollTop+=Math.ceil(n.bottom-r.bottom):n.tope.getClientRects().length>0)}function Pt(e){if(e.key===`Escape`){e.preventDefault(),Mt();return}if(e.key===`Tab`){Mt(!1);return}let t=Nt();if(t.length===0)return;let n=t.indexOf(document.activeElement),r;e.key===`ArrowDown`?r=n<0?0:(n+1)%t.length:e.key===`ArrowUp`?r=n<=0?t.length-1:n-1:e.key===`Home`?r=0:e.key===`End`&&(r=t.length-1),r!==void 0&&(e.preventDefault(),t[r]?.focus())}function Ft(e){bt||(j(X,e,!0),yt&&window.clearTimeout(yt),yt=window.setTimeout(()=>{j(X,``),yt=void 0},1800))}async function It(){Mt(),await Lt()}async function Lt(){try{if(!navigator.clipboard)throw Error(`Clipboard unavailable`);return await navigator.clipboard.writeText(d.message.body??``),Ft(`copied`),!0}catch{return Ft(`failed`),!1}}async function Rt(){if(!d.onCopyLink||v(Z)===`pending`)return{copied:!1};j(Z,`pending`);let e;try{e=await d.onCopyLink(d.message)}catch{return j(Z,`failed`),{copied:!1}}try{if(!navigator.clipboard)throw Error(`Clipboard unavailable`);return await navigator.clipboard.writeText(e),j(Z,``),Ft(`copied`),{copied:!0}}catch{return j(Z,``),{copied:!1,fallback:e}}}async function zt(){let e=await Rt();(e.copied||e.fallback)&&(Mt(!1),e.fallback?(j(it,v(vt),!0),j(rt,e.fallback,!0)):v(vt)?.focus())}function Bt(){Mt(!1),xe()}function Vt(){Mt(!1),d.onDeleteMessage?.(d.message)}let Ht=`a, button, input, textarea, select, .attachment-grid, .media-tile, .markdown img, .gif-player, .markdown-table-scroll, .message-actions, .message-failed`,Ut=typeof window<`u`?window.matchMedia(`(hover: none), (pointer: coarse)`):null,Wt=M(C(Ut?.matches??!1)),Gt=f(()=>v(Wt)&&!P.mouse),Kt=M(!1),qt,Jt,Yt=0,Xt=M(void 0),Zt=!1,Qt=f(()=>`message-action-sheet-${d.message.id}`);b(()=>{if(!Ut)return;let e=()=>{j(Wt,Ut.matches,!0)};return Ut.addEventListener(`change`,e),()=>Ut.removeEventListener(`change`,e)});function $t(){qt!==void 0&&(window.clearTimeout(qt),qt=void 0)}function en(){Jt?.(),Jt=void 0}function tn(){Q!==void 0&&(window.clearTimeout(Q),Q=void 0)}function nn(e){tn(),Yt+=1,j(Xt,e,!0),j(Y,!1),j(J,!1),j(Kt,!0)}function rn(e){if(e.pointerType!==`touch`||!e.isPrimary||e.button!==0||v(G)||v(Ce)||v(U)||v(W)||v(V)||e.target?.closest(Ht))return;en();let t=e.pointerId,n=e.clientX,r=e.clientY;qt=window.setTimeout(()=>{qt=void 0,Zt=!0,nn()},450);let i=e=>{e.pointerId===t&&(Math.abs(e.clientX-n)>10||Math.abs(e.clientY-r)>10)&&o()},a=e=>{e.pointerId===t&&o()},o=()=>{$t(),window.removeEventListener(`pointermove`,i),window.removeEventListener(`pointerup`,a),window.removeEventListener(`pointercancel`,a),Jt===o&&(Jt=void 0)};Jt=o,window.addEventListener(`pointermove`,i),window.addEventListener(`pointerup`,a),window.addEventListener(`pointercancel`,a)}function an(e){(v(Kt)||qt!==void 0)&&e.preventDefault()}function on(){tn(),Yt+=1,j(Kt,!1),Zt=!1}function sn(e){on(),!v(Ct)&&wt(e)}function cn(){on(),d.onOpenThread(d.message)}function ln(){on(),d.onReply(d.message,d.replyContext)}async function un(){tn();let e=Yt;await Lt()&&v(Kt)&&e===Yt&&(Q=window.setTimeout(()=>{Q=void 0,!bt&&e===Yt&&on()},900))}async function dn(){let t=await Rt();if(!t.copied&&!t.fallback)return;let n=v(Xt);on(),t.fallback&&(await e(),j(it,n,!0),j(rt,t.fallback,!0))}function fn(){on(),xe()}function pn(){on(),d.onDeleteMessage?.(d.message)}async function mn(){if(I()&&d.onTogglePin&&!v(at)){j(at,!0),j(ot,``);try{await d.onTogglePin(d.message,ye()),Mt()}catch(e){j(ot,ne(e,`Could not update pin`),!0)}finally{j(at,!1)}}}async function hn(){await mn(),v(ot)||on()}b(()=>{if(!v(J)&&!v(Y))return;let e=e=>{let t=e.target;v(J)&&v(ht)&&!v(ht).contains(t)&&j(J,!1),v(Y)&&v(gt)&&!v(gt).contains(t)&&j(Y,!1)};return document.addEventListener(`click`,e),()=>document.removeEventListener(`click`,e)}),b(()=>{v(Ct)&&j(J,!1)}),te(()=>{bt=!0,yt&&window.clearTimeout(yt),tn(),en()}),b(()=>{if(!(v(Y)||v(J)||v(ft))||!v(lt))return;let e=v(lt).parentElement;for(;e&&e.style.position!==`absolute`;)e=e.parentElement;if(!e)return;let t=e.style.zIndex;return e.style.zIndex=`10`,()=>{e.style.zIndex=t}});var $=et();let gn;var _n=x($),vn=D(_n,!0),yn=w(_n,2),bn=x(yn),xn=e=>{je(e,{get block(){return v(G)},get mentionPeople(){return g()},get mentionAttentionUserID(){return d.mentionAttentionUserID}})},Sn=e=>{var t=Fe();s(e,t)},Cn=e=>{var t=u(),n=O(t),r=e=>{me(e,{get body(){return v(B).draft},get errorMessage(){return v(B).error},get saving(){return v(B).saving},onBody:e=>d.editController?.updateDraft(F(),e),onCancel:Se,onSave:H})};l(n,e=>{v(B)&&e(r)}),s(e,t)},wn=e=>{var r=Ve(),i=O(r);Pe(i,{get topic(){return v(Ne)},get onSelect(){return de()}});var a=w(i,2);_e(a,{get message(){return d.message},get onJump(){return d.onJumpToQuote}});var o=w(a,2);t(o,()=>R(d.message.body),!0),n(o),p(o,e=>ie?.(e)),p(o,(e,t)=>ve?.(e,t),()=>({people:g(),attentionUserID:d.mentionAttentionUserID}));var c=w(o,2),u=e=>{var t=Ie();k(e=>S(t,`title`,`Edited ${e??``}`),[()=>fe(d.message.edited_at)]),s(e,t)};l(c,e=>{d.message.edited_at&&e(u)});var m=w(c,2),_=e=>{{let t=f(()=>d.reactionController.reactionsFor(d.message)),n=f(()=>d.reactionController.pending(d.message.id)),r=f(()=>d.reactionController.error(d.message.id)),i=f(()=>E()||!d.currentUserID);ge(e,{get messageId(){return d.message.id},get reactions(){return v(t)},get pending(){return v(n)},get error(){return v(r)},get disabled(){return v(i)},onToggle:e=>wt(e)})}};l(m,e=>{!v(U)&&!v(W)&&e(_)});var y=w(m,2),b=e=>{var t=Le();T(t,21,()=>d.message.attachments,e=>e.id,(e,t)=>{{let n=f(()=>re(v(t)));he(e,{get upload(){return v(t)},get url(){return v(n)},get onOpenImage(){return d.onOpenImage},get onOpenArtifact(){return d.onOpenArtifact}})}}),n(t),s(e,t)};l(y,e=>{d.message.attachments?.length&&e(b)});var C=w(y,2),ee=e=>{var t=Be(),r=w(x(t),2),i=e=>{var t=Re();h(`click`,t,()=>d.onRetry?.(d.message)),s(e,t)};l(r,e=>{d.onRetry&&e(i)});var a=w(r,2),o=e=>{var t=ze();h(`click`,t,()=>d.onDiscard?.(d.message)),s(e,t)};l(a,e=>{d.onDiscard&&e(o)}),n(t),s(e,t)};l(C,e=>{v(W)&&e(ee)}),s(e,r)};l(bn,e=>{v(G)?e(xn):v(Ce)?e(Sn,1):v(V)?e(Cn,2):e(wn,-1)});var Tn=w(bn,2),En=e=>{var t=q();let i;var a=w(x(t),2),c=e=>{var t=Ue(),n=O(t),r=D(n,!0),i=w(n,2),a=e=>{var t=He(),n=D(t,!0);k(()=>{S(t,`datetime`,d.message.thread_state?.last_reply_at),o(n,v(ke))}),s(e,t)};l(i,e=>{v(ke)&&e(a)}),k(e=>o(r,e),[()=>ae(d.message)]),s(e,t)};l(a,e=>{(v(Oe)||v(Ae))&&e(c)}),n(t),k((e,n)=>{i=r(t,1,`thread-hint tooltip`,null,i,{"has-replies":v(Oe),"is-open":v(Ae)}),S(t,`data-tooltip`,e),S(t,`aria-label`,n)},[()=>ce(d.message,d.selectedThreadID),()=>ce(d.message,d.selectedThreadID)]),h(`click`,t,()=>d.onOpenThread(d.message)),s(e,t)};l(Tn,e=>{v(Me)&&e(En)}),n(yn);var Dn=w(yn,2),On=e=>{var t=$e(),i=x(t),a=e=>{var t=We();let n;var i=D(t,!0);k(()=>{n=r(t,1,`message-copy-status`,null,n,{"is-error":v(X)===`failed`}),o(i,v(X)===`copied`?`Copied`:`Couldn't copy`)}),s(e,t)};l(i,e=>{v(X)&&e(a)});var u=w(i,2);T(u,17,()=>L,c,(e,t)=>{var n=Ge(),r=D(n,!0);k(()=>{S(n,`aria-label`,`React with ${v(t)}`),S(n,`data-tooltip`,`React with ${v(t)}`),n.disabled=v(Ct),o(r,v(t))}),h(`click`,n,()=>Et(v(t))),s(e,n)});var p=w(u,2),m=x(p);A(m,e=>j(_t,e),()=>v(_t));var g=w(m,2),_=e=>{{let t=f(()=>v(st)?`above-right`:`below`);ue(e,{get id(){return v(xt)},get placement(){return v(t)},get disabled(){return v(Ct)},onPick:Ot,onEscape:kt})}};l(g,e=>{v(J)&&e(_)}),n(p),A(p,e=>j(ht,e),()=>v(ht));var y=w(p,4),b=w(y,2),C=w(b,4),E=x(C);let ee;A(E,e=>j(vt,e),()=>v(vt));var te=w(E,2),M=e=>{var t=Qe();let i;var a=x(t),c=w(a,2),u=e=>{var t=qe(),r=O(t),i=w(x(r));n(r);var a=w(r,2),c=e=>{var t=Ke();s(e,t)};l(a,e=>{v(Z)===`failed`&&e(c)}),k(()=>{r.disabled=v(Z)===`pending`,o(i,` ${v(Z)===`pending`?`Creating link…`:`Copy link`}`)}),h(`click`,r,()=>void zt()),s(e,t)};l(c,e=>{I()&&d.onCopyLink&&e(u)});var f=w(c,2),p=e=>{var t=Ye(),r=O(t),i=w(x(r));n(r);var a=w(r,2),c=e=>{var t=Je(),n=D(t,!0);k(()=>o(n,v(ot))),s(e,t)};l(a,e=>{v(ot)&&e(c)}),k(()=>{r.disabled=v(at),o(i,` ${ye()?`Unpin message`:`Pin message`}`)}),h(`click`,r,mn),s(e,t)};l(f,e=>{I()&&d.onTogglePin&&e(p)});var m=w(f,2),g=e=>{var t=Xe(),n=w(O(t),2);h(`click`,n,Bt),s(e,t)};l(m,e=>{v(Te)&&d.editController&&F()&&!v(V)&&e(g)});var _=w(m,2),y=e=>{var t=Ze(),n=w(O(t),2);k(()=>n.disabled=N()),h(`click`,n,Vt),s(e,t)};l(_,e=>{v(we)&&d.onDeleteMessage&&e(y)}),n(t),k(()=>i=r(t,1,`message-menu`,null,i,{above:v(ct)})),h(`keydown`,t,Pt),h(`click`,a,It),s(e,t)};l(te,e=>{v(Y)&&e(M)}),n(C),A(C,e=>j(gt,e),()=>v(gt)),n(t),k(e=>{S(m,`aria-controls`,v(xt)),S(m,`aria-expanded`,v(J)),m.disabled=v(Ct),S(y,`data-tooltip`,e),y.disabled=v(U)||v(W),b.disabled=v(U)||v(W),ee=r(E,1,`message-actions-trigger`,null,ee,{tooltip:!v(Gt),"tooltip-align-end":!v(Gt)}),S(E,`data-tooltip`,v(Gt)?void 0:`More actions`),S(E,`aria-haspopup`,v(Gt)?`dialog`:`menu`),S(E,`aria-controls`,v(Gt)?v(Qt):void 0),S(E,`aria-expanded`,v(Gt)?v(Kt):v(Y)),E.disabled=v(U)||v(W)},[()=>ce(d.message,d.selectedThreadID)]),h(`click`,m,Dt),h(`click`,y,()=>d.onOpenThread(d.message)),h(`click`,b,()=>d.onReply(d.message,d.replyContext)),h(`click`,E,jt),s(e,t)};l(Dn,e=>{!v(G)&&!v(Ce)&&e(On)});var kn=w(Dn,2),An=e=>{{let t=f(()=>!v(Ct)),n=f(()=>!v(U)&&!v(W)),r=f(()=>v(Te)&&!!d.editController&&!!F()&&!v(V)),i=f(()=>!!(I()&&d.onTogglePin)),a=f(()=>v(we)&&!!d.onDeleteMessage),o=f(()=>!!(I()&&d.onCopyLink));z(e,{get id(){return v(Qt)},get canReact(){return v(t)},get canReply(){return v(n)},get canOpenThread(){return v(Me)},get canEdit(){return v(r)},get canPin(){return v(i)},get pinned(){return ye()},get pinning(){return v(at)},get pinError(){return v(ot)},get canDelete(){return v(a)},get deleting(){return N()},get copyStatus(){return v(X)},get canCopyLink(){return v(o)},get copyLinkStatus(){return v(Z)},onReact:sn,onOpenThread:cn,onReply:ln,onCopy:un,onCopyLink:dn,onEdit:fn,onTogglePin:hn,onDelete:pn,onClose:on,get returnFocus(){return v(Xt)}})}};l(kn,e=>{v(Kt)&&e(An)});var jn=w(kn,2),Mn=e=>{le(e,{get url(){return v(rt)},onClose:()=>j(rt,``),get returnFocus(){return v(it)}})};l(jn,e=>{v(rt)&&e(Mn)}),n($),A($,e=>j(lt,e),()=>v(lt)),p($,e=>nt?.(e)),k((e,t)=>{gn=r($,1,`message-row`,null,gn,{selected:d.selected,"is-pending":v(U),"is-failed":v(W),"is-deleted":v(Ce),"is-preamble":e,"is-preamble-collapsed":v(G)?.final===!0,"is-preamble-live":v(G)?.final===!1,"before-final-message":v(K),"after-preamble":v(Ee),"can-open-thread":v(Me),editing:v(V),"menu-open":v(Y)||v(J),"actions-flip":v(pt)}),S($,`data-message-id`,d.message.id),o(vn,t)},[()=>!!v(G),()=>d.index===0?``:fe(d.message.created_at)]),h(`pointerdown`,$,rn),h(`contextmenu`,$,an),_(`mouseenter`,$,()=>{!v(ut)&&!v(dt)&&mt(),j(ut,!0)}),_(`mouseleave`,$,()=>j(ut,!1)),h(`focusin`,$,()=>{!v(ut)&&!v(dt)&&mt(),j(dt,!0)}),h(`focusout`,$,e=>{v(lt)?.contains(e.relatedTarget)||j(dt,!1)}),s(a,$),m()}a([`pointerdown`,`contextmenu`,`focusin`,`focusout`,`click`,`keydown`]);var nt=N(` deleted bot`,1),J=N(`bot`),Y=N(` `,1),X=N(` `),Z=N(`
`);function rt(e,t){i(t,!0);let a=y(t,`reactionsDisabled`,3,!1),c=y(t,`mentionPeople`,19,()=>[]),u=y(t,`canDeleteAnyMessage`,3,!1),d=y(t,`deletingMessageIDs`,19,()=>new Set),p=y(t,`channelID`,3,``),g=y(t,`pinnedMessageIDs`,19,()=>new Set),_=y(t,`editScope`,3,``),b=y(t,`topics`,19,()=>[]),S=y(t,`onSelectTopic`,3,()=>{}),C=f(()=>t.group.messages[0]?.author),E=f(()=>v(C)?.kind===`bot`),te=f(()=>!v(E)&&!!t.currentUserID&&t.group.authorID===t.currentUserID);var A=Z();let j;var M=x(A);{let e=f(()=>t.group.authorDeleted?`avatar`:`avatar avatar-button`),n=f(()=>t.group.authorDeleted?void 0:`View profile for ${t.group.authorName}`);be(M,{get class(){return v(e)},get id(){return t.group.authorID},get name(){return t.group.authorName},get src(){return t.group.authorAvatarURL},size:38,get buttonLabel(){return v(n)},onclick:()=>t.onOpenProfile(t.group.messages[0]?.author)})}var N=w(M,2),P=x(N),ne=x(P),F=e=>{var n=nt(),r=O(n),i=D(r,!0);ee(2),k(()=>o(i,t.group.authorName)),s(e,n)},re=e=>{var n=Y(),r=O(n),i=D(r,!0),a=w(r,2),c=e=>{var t=J();s(e,t)};l(a,e=>{v(E)&&e(c)}),k(()=>o(i,t.group.authorName)),h(`click`,r,()=>t.onOpenProfile(t.group.messages[0]?.author)),s(e,n)};l(ne,e=>{t.group.authorDeleted?e(F):e(re,-1)});var ie=w(ne,2),ae=e=>{var n=X(),r=D(n,!0);k(e=>o(r,e),[()=>B(t.group.authorHandle)]),s(e,n)};l(ie,e=>{t.group.authorHandle&&e(ae)});var oe=w(ie,2),se=D(oe,!0);n(P);var ce=w(P,2);T(ce,19,()=>t.group.messages,e=>e.id,(e,n,r)=>{{let i=f(()=>t.selectedThreadID===v(n).id),o=f(()=>d().has(v(n).id)),s=f(()=>g().has(v(n).id));tt(e,{get message(){return v(n)},get index(){return v(r)},get previousMessage(){return t.group.messages[v(r)-1]},get nextMessage(){return t.group.messages[v(r)+1]},get selected(){return v(i)},get replyContext(){return t.replyContext},get selectedThreadID(){return t.selectedThreadID},get mentionPeople(){return c()},get mentionAttentionUserID(){return t.mentionAttentionUserID},get currentUserID(){return t.currentUserID},get reactionController(){return t.reactionController},get reactionsDisabled(){return a()},get canDeleteAnyMessage(){return u()},get deleting(){return v(o)},get editController(){return t.editController},get editScope(){return _()},get onMessageEdited(){return t.onMessageEdited},get onReply(){return t.onReply},get onOpenThread(){return t.onOpenThread},get onJumpToQuote(){return t.onJumpToQuote},get onOpenImage(){return t.onOpenImage},get onOpenArtifact(){return t.onOpenArtifact},get onRetry(){return t.onRetry},get onDiscard(){return t.onDiscard},get onDeleteMessage(){return t.onDeleteMessage},get topics(){return b()},get onSelectTopic(){return S()},get channelID(){return p()},get pinned(){return v(s)},get onTogglePin(){return t.onTogglePin},get onCopyLink(){return t.onCopyLink}})}}),n(N),n(A),k(e=>{j=r(A,1,`message-group`,null,j,{"is-agent":v(E),"is-self":v(te)}),o(se,e)},[()=>fe(t.group.timestamp)]),s(e,A),m()}a([`click`]);var it=N(`
Send a message in Markdown — code fences, lists, links all work. Threads open from any message.
`),at=N(`
`),ot=N(`
`),st=N(`
New
`),ct=N(`
`),lt=N(`
`),ut=N(`
`);function dt(t,a){i(a,!0);let c=y(a,`loading`,3,!1),d=y(a,`unreadCount`,3,0),p=y(a,`unreadBoundarySeq`,3,0),_=y(a,`unreadBoundaryLoaded`,3,!1),C=y(a,`unreadSince`,3,``),T=y(a,`hasOlder`,3,!1),N=y(a,`hasNewer`,3,!1),P=y(a,`loadingOlder`,3,!1),ne=y(a,`loadingNewer`,3,!1),re=y(a,`prepending`,3,!1),ie=y(a,`mentionPeople`,19,()=>[]),ae=y(a,`reactionsDisabled`,3,!1),oe=y(a,`canDeleteAnyMessage`,3,!1),se=y(a,`deletingMessageIDs`,19,()=>new Set),ce=y(a,`channelID`,3,``),le=y(a,`pinnedMessageIDs`,19,()=>new Set),ue=y(a,`editScope`,3,``),fe=y(a,`topics`,19,()=>[]),pe=y(a,`onSelectTopic`,3,()=>{}),I=1.5,L=M(void 0),R=M(void 0),me=M(void 0),z=M(0),he=M(0),ge=f(()=>a.selectedDirect?`dm`:`channel`),_e=M(``),ve=M(-1),B=M(0),V=f(()=>v(_e)===a.viewKey&&v(ve)===p()&&d()<=v(B)?0:d()),be=M(``),H=M(0),U=M(!1),W,Ce=f(()=>v(V)>0?v(V):v(H));function we(){W&&=(window.clearTimeout(W),void 0)}b(()=>{if(v(be)&&v(be)!==a.viewKey){we(),j(H,0),j(be,``),j(U,!1);return}if(v(V)>0){we(),j(be,a.viewKey,!0),j(H,v(V),!0),j(U,!1);return}v(H)>0&&!v(U)&&(j(U,!0),W=window.setTimeout(()=>{W=void 0,!(v(V)>0)&&(j(H,0),j(be,``),j(U,!1))},180))}),te(we);let Te=f(()=>{let e=p()+1;if(v(Ce)<=0||e<=0)return!1;let t=1/0,n=0;for(let e of a.messages){if(e.parent_message_id)continue;let r=e.channel_seq||0;r<=0||(t=Math.min(t,r),n=Math.max(n,r))}return t<=e&&n>=e}),G=f(()=>_()&&v(Te)),Ee=f(()=>{let e=[],t=!1,n=e=>!v(G)||e.parent_message_id||e.author?.id===a.currentUserID||e.author_id===a.currentUserID?!1:v(Ce)>0&&(e.channel_seq||0)>p();for(let r of F(a.messages)){let i=-1;if(!t){for(let e=0;ea.messages.map(e=>{let t=e.preamble_block;if(!t)return``;let n=t.items.map(e=>e.type===`commentary`?`${e.id}\u0000${e.body}`:`${e.id}\u0000${e.name}\u0000${e.detail||``}\u0000${e.full}`).join(``);return`${e.id}\u0000${t.final?`final`:`live`}\u0000${n}`}).filter(Boolean).join(``)),Oe=M(!0),ke=M(!1),Ae,je=0,Me=``,Ne=``,Pe,Fe=M(void 0),Ie=0,Le=!1,Re=!1,ze=!1,Be=!1,Ve=0,He=0;function Ue(e=!0){return e&&(Le=!1,j(ke,!0)),He+=1,He}function q(e,t){return Z(e)&&t===He}function We(e=2){let t=++Ve;Re=!0;let n=e=>{requestAnimationFrame(()=>{if(t===Ve){if(e<=1){Re=!1;return}n(e-1)}})};n(e)}function Ge(){if(!v(L))return 0;let e=v(L).getScrollSize()+v(z);return Math.max(0,e-v(L).getScrollOffset()-v(L).getViewportSize())}function Ke(){return!v(L)||Ge()<=I}function qe(e=I){return!v(L)||Ge()<=e}function Je(){if(!v(L))return{atBottom:!0,nearOlder:!1,nearNewer:!1};let e=Ge();return{atBottom:Ke(),nearOlder:v(L).getScrollOffset()-v(z)<=160,nearNewer:e<=260}}function Ye(){a.onHistorySettled?.(Je())}function Xe(e=!1){N()||!e&&v(V)>0||a.onReachedBottom?.()}b(()=>{if(ne()){Be=!0;return}Be&&(Be=!1,ze=!1)});async function Ze(){v(L)&&v(Ee).length!==0&&(K=!N(),await Qe(Ue()))}async function Qe(t=Ue()){if(!v(L)||!v(R)||v(Ee).length===0)return;let n=a.viewKey;document.activeElement===v(R)&&v(R).blur();let r=-1;for(let i=0;i<6;i+=1){if(await e(),!v(L)||!v(R)||!q(n,t)||(K=!N(),We(2),v(R).scrollTop=v(R).scrollHeight,await X(),!v(L)||!q(n,t)))return;let i=v(L).getScrollSize(),a=r>=0&&Math.abs(i-r)<=I;if(r=i,a&&Ke())break}j(ke,!0),K=!N(),Ke()&&(j(Oe,!0),Xe(!0)),Ye()}b(()=>{if(!v(R))return;let e=v(R),t=()=>{let e=Ue();Re=!1,_t(a.viewKey,e)},n=e=>{e.defaultPrevented||e.ctrlKey||e.deltaY===0||(t(),e.deltaY>0&&N()&&Ke()&&(ze=!0,a.onLoadNewer?.(`wheel`)))},r=e=>{let n=e.target;e.defaultPrevented||!(n instanceof HTMLElement)||n.isContentEditable||n.closest(`input, textarea, select`)||e.key===` `&&n.closest(`button, [role=button]`)||[`ArrowUp`,`ArrowDown`,`PageUp`,`PageDown`,`Home`,`End`,` `].includes(e.key)&&t()},i=e=>{!e.defaultPrevented&&e.touches.length===1&&t()},o=n=>{n.target===e&&n.button===0&&t()};return e.addEventListener(`wheel`,n,{passive:!0}),e.addEventListener(`keydown`,r),e.addEventListener(`touchmove`,i,{passive:!0}),e.addEventListener(`pointerdown`,o),()=>{e.removeEventListener(`wheel`,n),e.removeEventListener(`keydown`,r),e.removeEventListener(`touchmove`,i),e.removeEventListener(`pointerdown`,o)}});function $e(e){return v(Ee).findIndex(t=>t.kind===`group`&&t.group.messages.some(t=>t.id===e))}let et=f(()=>{if(!T()||c()||!re())return 0;let e=Math.max(v(he),480);return Math.max(4,Math.ceil(e/52))});b(()=>{if(!v(R))return;let e=()=>{v(R)&&j(he,v(R).clientHeight,!0)};e();let t=new ResizeObserver(e);return t.observe(v(R)),()=>t.disconnect()});let tt=0;b(()=>{if(!v(me)||!v(R)){j(z,0),tt=0;return}let e=v(me),t=()=>{let t=e.offsetHeight,n=tt;if(j(z,t,!0),tt=t,n>0&&t!==n){let e=t-n;v(R)&&v(R).scrollTop>0&&(v(R).scrollTop+=e)}};t();let n=new ResizeObserver(t);return n.observe(e),()=>{n.disconnect(),j(z,0),tt=0}});function nt(){return v(Ee).findIndex(e=>e.kind===`divider`)}function J(){let e=0;for(let t of a.messages)e=Math.max(e,t.channel_seq||0);return e}function Y(){j(_e,a.viewKey,!0),j(ve,p()),j(B,d()),a.onMarkRead?.(J())}function X(){return new Promise(e=>requestAnimationFrame(()=>e()))}function Z(e){return e===a.viewKey&&e===Ae}async function dt(e,t,n,r,i=0){We(3);for(let a=0;a<24;a++){if(!q(e,t)||!v(L)||!v(R))return!1;let a=v(R).querySelector(r);if(a){let e=a.getBoundingClientRect().top-v(R).getBoundingClientRect().top-i;if(Math.abs(e)<=I)return!0;v(R).scrollTop+=e}else{let e=n();if(e<0)return!1;v(R).scrollTop=v(z)+v(L).getItemOffset(e)}await X()}return!1}function ft(t,n,r){if(!v(L)||t()<0)return!1;K=!1;let i=a.viewKey,o=Ue();return dt(i,o,t,n).then(async a=>{q(i,o)&&(Ye(),await e(),q(i,o)&&(a&&=await dt(i,o,t,n),!a&&q(i,o)&&r?.()))}),!0}function pt(e){return ft(()=>$e(e),`[data-message-id="${CSS.escape(e)}"]`)}function mt(e=!0){return ft(nt,`[data-unread-divider='true']`,e?a.onJumpToUnread:void 0)}function ht(){if(!(v(G)&&mt(!1))&&a.onJumpToUnread){a.onJumpToUnread();return}}function gt(){if(!v(L)||!v(R))return null;if(j(Fe,{atBottom:Ke()},!0),Ie=He,!v(Fe).atBottom){let e=v(R).getBoundingClientRect().top;for(let t of v(R).querySelectorAll(`[data-message-id]`)){let n=t.getBoundingClientRect();if(!(n.bottom<=e)){v(Fe).anchorMessageID=t.dataset.messageId,v(Fe).anchorPixelOffset=n.top-e;break}}}return v(Fe)}b(()=>(a.onListRef({scrollToBottom:Ze,scrollToMessage:pt,scrollToDivider:mt,captureState:gt,isFollowing:()=>K,isNearBottom:e=>qe(e)}),()=>a.onListRef(null))),b(()=>{let e=a.viewKey,t=v(Ee).length,n=v(De),r=a.messages.at(-1)?.id||``,i=r!==Me;if(Me=r,e!==Ae){Ae=e,je=t,Ne=n,Pe=a.restoreState,j(Fe,void 0),K=!0,j(Oe,!0),j(ke,!1),ze=!1,Le=!0,vt(e,a.restoreState,!0);return}let o=a.restoreState,s=o&&o!==Pe;if(s){let r=o===v(Fe)&&Ie!==He;if(j(Fe,void 0),Pe=o,!r&&(o.atBottom||o.anchorMessageID)){je=t,Ne=n,Le=!0,vt(e,o,o.atBottom);return}r&&!K&&v(L)&&yt(v(L).getScrollOffset())}let c=s||t!==je||i||n!==Ne;c&&K&&!N()&&!Le?Qe():c&&!Le&&_t(e),je=t,Ne=n});async function _t(t,n=He){await e(),await X(),q(t,n)&&Ye()}async function vt(t,n,r){let i=Ue(!1),a=n&&!n.atBottom?n.anchorMessageID:void 0,o=a?()=>dt(t,i,()=>$e(a),`[data-message-id="${CSS.escape(a)}"]`,n?.anchorPixelOffset??0):void 0,s=!1;if(await e(),await X(),q(t,i)){if(o){let e=await o();if(!q(t,i))return;!e&&r?await Qe(i):K=!1}else v(Ee).findIndex(e=>e.kind===`divider`)>=0&&v(L)?(s=!0,await dt(t,i,()=>nt(),`[data-unread-divider='true']`),K=!1):await Qe(i);await X(),q(t,i)&&(Le=!1,j(ke,!0),j(Oe,Ke(),!0),K=v(Oe)&&!N(),s||(v(Oe)&&Xe(),v(L)&&yt(v(L).getScrollOffset())),Ye(),o&&(await e(),q(t,i)&&await o()))}}function yt(e){if(!v(L)||Le&&!v(ke))return;let t=Ge(),n=Ke(),r=n||t<=260;K=n&&!N(),j(Oe,n,!0),N()||(ze=!1),!n&&T()&&e-v(z)<=160&&a.onLoadOlder?.(),!Re&&N()&&r&&!ze&&(ze=!0,a.onLoadNewer?.(`scroll`)),n&&!Re&&Xe()}var Q=ut();let bt;var xt=x(Q),St=e=>{var t=it(),r=x(t),i=x(r),c=e=>{var t=g(`@`);s(e,t)},u=e=>{var t=g(`#`);s(e,t)};l(i,e=>{a.selectedDirect?e(c):e(u,-1)}),n(r);var d=w(r,2),f=x(d),p=e=>{var t=g();k(e=>o(t,`This is the start of your conversation with ${e??``}.`),[()=>ye(a.selectedDirect,a.currentUserID)]),s(e,t)},m=e=>{var t=g();k(e=>o(t,`Welcome to #${e??``}!`),[()=>xe(a.selectedChannel)]),s(e,t)},h=e=>{var t=g(`Pick a channel to get started.`);s(e,t)};l(f,e=>{a.selectedDirect?e(p):a.selectedChannel?e(m,1):e(h,-1)}),n(d),ee(2),n(t),s(e,t)},Ct=e=>{var t=ct(),i=w(x(t),2),d=e=>{var t=at(),r=x(t);de(r,{direction:`older`,get rows(){return v(et)}}),n(t),A(t,e=>j(me,e),()=>v(me)),k(()=>S(t,`aria-hidden`,P()?`false`:`true`)),s(e,t)};l(i,e=>{v(et)>0&&e(d)});var f=w(i,2);A(Se(f,{get data(){return v(Ee)},getKey:e=>e.id,itemProps:()=>c()||!v(ke)?void 0:{style:{"pointer-events":`auto`}},get scrollRef(){return v(R)},get shift(){return re()},get startMargin(){return v(z)},onscroll:yt,children:(e,t=E,i=E)=>{var c=u(),d=O(c),f=e=>{de(e,{get direction(){return t().direction},get rows(){return t().rows}})},p=e=>{var r=ot(),i=x(r),a=D(i,!0);n(r),k(()=>o(a,t().label)),s(e,r)},m=e=>{var t=st();let n;k(()=>n=r(t,1,`new-messages-divider`,null,n,{"is-clearing":v(U)})),s(e,t)},h=e=>{rt(e,{get group(){return t().group},get currentUserID(){return a.currentUserID},get reactionController(){return a.reactionController},get reactionsDisabled(){return ae()},get selectedThreadID(){return a.selectedThreadID},get mentionPeople(){return ie()},get mentionAttentionUserID(){return a.mentionAttentionUserID},get replyContext(){return v(ge)},get canDeleteAnyMessage(){return oe()},get deletingMessageIDs(){return se()},get editController(){return a.editController},get editScope(){return ue()},get onMessageEdited(){return a.onMessageEdited},get onOpenProfile(){return a.onOpenProfile},get onReply(){return a.onReply},get onOpenThread(){return a.onOpenThread},get onJumpToQuote(){return a.onJumpToQuote},get onOpenImage(){return a.onOpenImage},get onOpenArtifact(){return a.onOpenArtifact},get onRetry(){return a.onRetry},get onDiscard(){return a.onDiscard},get onDeleteMessage(){return a.onDeleteMessage},get topics(){return fe()},get onSelectTopic(){return pe()},get channelID(){return ce()},get pinnedMessageIDs(){return le()},get onTogglePin(){return a.onTogglePin},get onCopyLink(){return a.onCopyLink}})};l(d,e=>{t().kind===`loader`?e(f):t().kind===`day`?e(p,1):t().kind===`divider`?e(m,2):t().kind===`group`&&e(h,3)}),s(e,c)},$$slots:{default:!0}}),e=>j(L,e,!0),()=>v(L)),n(t),A(t,e=>j(R,e),()=>v(R)),s(e,t)};l(xt,e=>{!c()&&a.messages.length===0?e(St):a.messages.length>0&&e(Ct,1)});var wt=w(xt,2),Tt=e=>{var t=lt();let i;var a=x(t),c=x(a),l=D(c);n(a);var u=w(a,2);n(t),k(e=>{i=r(t,1,`unread-bar`,null,i,{"is-clearing":v(U)}),S(t,`aria-hidden`,v(U)?`true`:void 0),a.disabled=v(U),S(a,`aria-label`,e),o(l,`${(v(H)>99?`99+`:v(H))??``} new message${v(H)===1?``:`s`}${C()?` since ${C()}`:``}`),u.disabled=v(U)},[()=>`Jump to ${v(H)>0?v(H):``} new message${v(H)===1?``:`s`}`.replace(/ +/g,` `)]),h(`click`,a,ht),h(`click`,u,Y),s(e,t)};l(wt,e=>{!c()&&a.messages.length>0&&v(H)>0&&e(Tt)}),n(Q),k(()=>bt=r(Q,1,`messages`,null,bt,{"is-revealing":c()||!v(ke)&&a.messages.length>0})),h(`pointerdown`,Q,function(...e){a.onActivateMessageComposer?.apply(this,e)}),h(`pointerup`,Q,function(...e){a.onInlineImagePointerUp?.apply(this,e)}),s(t,Q),m()}a([`pointerdown`,`pointerup`,`click`]);var ft=N(` `),pt=N(` `),mt=N(``),ht=N(`
`),gt=N(``),_t=N(`
User kind
`),vt=N(`

`),yt=N(`

Blocked.

`),Q=N(``),bt=N(``),xt=N(``),St=N(``),Ct=N(`
Moderation
`),wt=N(`

Profile

Active
Contact information
Handle
User ID
About

`,1);function Tt(e,t){i(t,!0);let r=y(t,`messagePending`,3,!1),a=y(t,`messageError`,3,``),c=f(()=>t.profile.kind===`bot`?t.profile.owner_user_id?`Bot of ${t.profile.owner_user_id}`:`Service bot`:``),u=f(()=>t.moderation?.role||`member`),p=f(()=>!!t.moderation&&v(u)!==`owner`&&(t.currentUserRole===`owner`||t.currentUserRole===`moderator`&&(v(u)===`member`||v(u)===`guest`))),g=f(()=>t.currentUser?.id!==t.profile.id&&v(p)),_=f(()=>!!t.moderation?.blocked_at),b=f(()=>v(u));var S=wt(),C=O(S),T=x(C),E=w(x(T),2),ee=D(E,!0);n(T);var te=w(T,2);n(C);var A=w(C,2),j=x(A),M=x(j);be(M,{class:`profile-avatar`,get id(){return t.profile.id},get name(){return t.profile.display_name},get src(){return t.profile.avatar_url},size:240,loading:`eager`,fetchPriority:`auto`}),n(j);var N=w(j,2),P=x(N),ne=x(P),F=x(ne),re=D(F,!0),ie=w(F,2),ae=e=>{var t=ft(),n=D(t,!0);k(()=>o(n,v(c))),s(e,t)};l(ie,e=>{v(c)&&e(ae)});var oe=w(ie,2),se=e=>{var n=pt(),r=D(n,!0);k(e=>o(r,e),[()=>B(t.profile.handle)]),s(e,n)};l(oe,e=>{t.profile.handle&&e(se)}),n(ne);var ce=w(ne,2),le=e=>{var n=mt();h(`click`,n,function(...e){t.onEdit?.apply(this,e)}),s(e,n)};l(ce,e=>{t.currentUser?.id===t.profile.id&&t.onEdit&&e(le)}),n(P);var ue=w(P,4),de=e=>{var i=ht(),a=x(i),c=D(a,!0);n(i),k(()=>{a.disabled=r(),o(c,r()?`Starting…`:`Message`)}),h(`click`,a,()=>t.onMessage?.(t.profile.id)),s(e,i)};l(ue,e=>{t.currentUser?.id!==t.profile.id&&t.onMessage&&e(de)});var fe=w(ue,2),pe=e=>{var t=gt(),n=D(t,!0);k(()=>o(n,a())),s(e,t)};l(fe,e=>{a()&&e(pe)});var I=w(fe,2),L=x(I),R=w(x(L),2),me=e=>{var n=mt();h(`click`,n,function(...e){t.onEdit?.apply(this,e)}),s(e,n)};l(R,e=>{t.currentUser?.id===t.profile.id&&t.onEdit&&e(me)}),n(L);var z=w(L,2),he=w(x(z),2),ge=w(x(he),2),_e=D(ge,!0);n(he),n(z);var ve=w(z,2),ye=w(x(ve),2),xe=w(x(ye),2),Se=D(xe,!0);n(ye),n(ve);var H=w(ve,2),U=e=>{var t=_t(),r=w(x(t),2),i=w(x(r),2),a=D(i,!0);n(r),n(t),k(()=>o(a,v(c))),s(e,t)};l(H,e=>{t.profile.kind===`bot`&&e(U)}),n(I);var W=w(I,2),Ce=w(x(W),2),we=D(Ce);n(W);var Te=w(W,2),G=e=>{var r=Ct(),i=x(r),a=w(x(i),2),c=D(a,!0);n(i);var u=w(i,2),d=e=>{var n=vt(),r=D(n);k(()=>o(r,`${t.moderation.posts_remaining??``} of ${t.moderation.post_limit??``} waiting-room posts left today.`)),s(e,n)};l(u,e=>{t.moderation.role===`guest`&&t.moderation.post_limit>0&&e(d)});var f=w(u,2),p=e=>{var n=vt(),r=D(n);k(e=>o(r,`Timed out until ${e??``}.`),[()=>new Date(t.moderation.timeout_until).toLocaleString()]),s(e,n)};l(f,e=>{t.moderation.timeout_until&&e(p)});var m=w(f,2),g=e=>{var t=yt();s(e,t)};l(m,e=>{t.moderation.blocked_at&&e(g)});var y=w(m,2),S=x(y),C=e=>{var n=Q();h(`click`,n,()=>t.onApprove?.(t.profile.id)),s(e,n)};l(S,e=>{t.moderation.role===`guest`&&t.onApprove&&e(C)});var T=w(S,2),E=e=>{var n=bt();h(`click`,n,()=>t.onTimeout?.(t.profile.id)),s(e,n)};l(T,e=>{t.onTimeout&&e(E)});var ee=w(T,2),te=e=>{var n=xt();h(`click`,n,()=>t.onUnblock?.(t.profile.id)),s(e,n)},O=e=>{var n=St();h(`click`,n,()=>t.onBlock?.(t.profile.id)),s(e,n)};l(ee,e=>{v(_)&&t.onUnblock?e(te):!v(_)&&t.onBlock&&e(O,1)}),n(y),n(r),k(()=>o(c,v(b))),s(e,r)};l(Te,e=>{v(g)&&t.moderation&&e(G)}),n(N),n(A),k((e,n)=>{o(ee,t.profile.display_name),d(j,`--hue: ${e??``}deg`),o(re,t.profile.display_name),o(_e,n),o(Se,t.profile.id),o(we,`Member of ${(t.workspaceName||`this workspace`)??``}.`)},[()=>V(t.profile.id),()=>t.profile.handle?B(t.profile.handle):`No handle set`]),h(`click`,te,function(...e){t.onClose?.apply(this,e)}),s(e,S),m()}a([`click`]);export{H as i,dt as n,Pe as r,Tt as t}; \ No newline at end of file diff --git a/apps/api/internal/webassets/dist/_app/immutable/chunks/CmseFvlq.js b/apps/api/internal/webassets/dist/_app/immutable/chunks/CmseFvlq.js deleted file mode 100644 index d58e14a9f..000000000 --- a/apps/api/internal/webassets/dist/_app/immutable/chunks/CmseFvlq.js +++ /dev/null @@ -1,4 +0,0 @@ -const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./DKccj-zk.js","./BaNbYf_w.js"])))=>i.map(i=>d[i]); -import{t as e}from"./DK3Fl9T5.js";import{$ as t,A as n,At as r,C as i,E as a,Et as o,H as s,I as c,J as l,L as u,M as d,P as f,R as p,St as m,T as h,Tt as g,U as _,V as v,W as y,Y as b,_ as x,_t as S,a as C,at as w,b as T,ct as E,d as D,dt as O,et as k,ft as A,g as j,gt as ee,h as M,ht as N,it as P,j as F,jt as I,k as L,kt as te,l as ne,mt as R,n as re,o as ie,p as z,pt as ae,r as oe,s as se,st as B,u as ce,v as le,vt as V,x as ue,xt as H,yt as U,z as W}from"./BTIB_WQZ.js";import{c as de,n as fe,t as pe}from"./CRok6MwI.js";import{t as me}from"./BaNbYf_w.js";import"./xihTtKlq.js";import"./DFzK05fS.js";import{a as he,c as ge,i as _e,l as ve,n as G,s as ye,t as be,u as xe}from"./DEPNME54.js";import{c as Se,d as Ce,f as we,h as Te,i as Ee,l as De,m as Oe,n as ke,p as Ae,r as je,s as Me,t as Ne,u as Pe}from"./Dqjw8vaP.js";import{a as K,i as Fe,n as Ie,o as Le,s as Re,t as q}from"./B4px22Nd.js";import{n as ze,t as Be}from"./DBpO2iwN.js";import"./j4GI4VLW.js";import{C as Ve,D as He,E as Ue,I as We,L as Ge,R as Ke,S as qe,T as Je,_ as Ye,b as J,f as Xe,g as Y,h as X,j as Ze,k as Qe,m as Z,p as $e,r as Q,u as et,v as tt,w as nt,x as rt,y as it}from"./T0GVabNa.js";import{a as at,c as ot,f as st,i as ct,l as lt,o as ut,p as dt,s as ft,t as pt,u as mt}from"./ByQ3bZN5.js";import{i as ht,n as gt,r as _t,t as vt}from"./C16fMXIp.js";import{n as yt,t as bt}from"./DlGnnCJo.js";import{n as xt,r as St,t as Ct}from"./DfsrRaIf.js";import{p as wt,r as Tt}from"./CVdgRPye.js";import{r as Et,t as Dt}from"./BIhzYFGW.js";var Ot={url:`/`,label:`cc`};function kt(e){if(e.startsWith(`//`))return!1;try{if(e.startsWith(`/`)){let t=`https://clickclack.invalid`;return new URL(e,t).origin===t}let t=new URL(e);return(t.protocol===`http:`||t.protocol===`https:`)&&t.host!==``&&!t.username&&!t.password}catch{return!1}}function At(e){if(!e||typeof e!=`object`)return Ot;let t=e,n=typeof t.url==`string`?t.url:``,r=n.trim(),i=typeof t.label==`string`?t.label.trim():``,a=/[\u0000-\u001f\u007f\\]/u.test(n);return{url:r&&!a&&kt(r)?r:Ot.url,label:i&&Array.from(i).length<=32?i:Ot.label}}function jt(e){return e===Ot.label}function Mt(e){return jt(e.label)?`ClickClack home`:`${e.label} home`}async function Nt(e){try{return At(await e(`/api/home-link`))}catch{return Ot}}var Pt=`clickclack:browser-notifications-enabled:v1:`;function Ft(e){return`${Pt}${e}`}function It(e){if(!e)return!1;try{return window.localStorage.getItem(Ft(e))===`enabled`}catch{return!1}}function Lt(e,t){if(!e)return!1;try{return t?window.localStorage.setItem(Ft(e),`enabled`):window.localStorage.removeItem(Ft(e)),!0}catch{return!1}}var Rt=typeof window>`u`?void 0:window.clickclackDesktop;function zt(){return typeof navigator<`u`&&`serviceWorker`in navigator&&typeof window<`u`&&`PushManager`in window&&`Notification`in window}function Bt(){return typeof window>`u`?!1:window.navigator.standalone===!0||typeof window.matchMedia==`function`&&window.matchMedia(`(display-mode: standalone)`).matches}function Vt(){if(typeof navigator>`u`)return!1;let e=navigator.userAgent;return/iPhone|iPad|iPod/.test(e)?!0:e.includes(`Macintosh`)&&(navigator.maxTouchPoints||0)>1}function Ht(e=typeof navigator>`u`?``:navigator.userAgent,t=typeof navigator>`u`?0:navigator.maxTouchPoints||0){let n=[[/iPhone/,`iPhone`],[/iPad/,`iPad`],[/Android/,`Android`],[/Macintosh|Mac OS X/,/Macintosh/.test(e)&&t>1?`iPad`:`Mac`],[/Windows/,`Windows`],[/Linux/,`Linux`]].find(([t])=>t.test(e))?.[1]??`This device`,r=/Edg\//.test(e)?`Edge`:/Chrome\//.test(e)?`Chrome`:/Firefox\//.test(e)?`Firefox`:/Safari\//.test(e)?`Safari`:``;return r?`${n} ${r}`:n}function Ut(e,t){if(!e)return!0;let n=ArrayBuffer.isView(e)?new Uint8Array(e.buffer,e.byteOffset,e.byteLength):new Uint8Array(e);return n.length===t.length&&n.every((e,n)=>e===t[n])}function Wt(e){let t=e.trim().replace(/-/g,`+`).replace(/_/g,`/`),n=atob(t+`=`.repeat((4-t.length%4)%4)),r=new Uint8Array(new ArrayBuffer(n.length));for(let e=0;evoid 0)}let o=await e.pushManager.subscribe({userVisibleOnly:!0,applicationServerKey:i});return en(n,r),o}async function an(){if(!zt())return null;let e=await navigator.serviceWorker.getRegistration(`/`);return e?await e.pushManager.getSubscription():null}async function on(){return(await G(`/api/me`)).user.id}async function sn(e,t){let n=e.toJSON();return(await G(`/api/me/push/subscriptions`,{method:`PUT`,body:JSON.stringify({user_id:t,endpoint:n.endpoint??e.endpoint,keys:{p256dh:n.keys?.p256dh??``,auth:n.keys?.auth??``},user_agent:Ht()})})).subscription}async function cn(e,t){await G(`/api/me/push/subscriptions`,{method:`DELETE`,body:JSON.stringify({user_id:t,endpoint:e})})}async function ln(e){if(e&&zt())try{let t=await an(),n=Zt(e);if(!n&&!t||await on()!==e)return;let r=await tn(t);if(!r.enabled)return;if(!n){if(t&&!r.this_device){await t.unsubscribe();let e=await navigator.serviceWorker.getRegistration(`/`);for(let t of await e?.getNotifications()??[])t.close()}return}await sn(await rn(await nn(),r,e),e)}catch{}}var un=`from`,dn=`push`;function fn(e){let t=new URL(e,`https://clickclack.invalid`);return t.searchParams.get(un)===dn?(t.searchParams.delete(un),`${t.pathname}${t.search}${t.hash}`):null}function pn(e,t){let n={width:0,height:0,durationMS:0},r=e.type.startsWith(`image/`);return t.aborted||!r&&!e.type.startsWith(`video/`)?Promise.resolve(n):new Promise(i=>{let a=URL.createObjectURL(e),o=r?new Image:document.createElement(`video`),s=r?`load`:`loadedmetadata`;function c(e=n){o.removeEventListener(s,u),o.removeEventListener(`error`,l),t.removeEventListener(`abort`,l),o.removeAttribute(`src`),o instanceof HTMLVideoElement&&o.load(),URL.revokeObjectURL(a),i(e)}function l(){c()}function u(){c(o instanceof HTMLImageElement?{width:o.naturalWidth,height:o.naturalHeight,durationMS:0}:{width:o.videoWidth,height:o.videoHeight,durationMS:Number.isFinite(o.duration)&&o.duration>0?Math.round(o.duration*1e3):0})}o instanceof HTMLVideoElement&&(o.preload=`metadata`,o.muted=!0),o.addEventListener(s,u),o.addEventListener(`error`,l),t.addEventListener(`abort`,l,{once:!0}),o.src=a})}var mn=new Set([`agent_commentary`,`agent_tool`]),hn=18e4;function gn(e){return e.kind!==void 0&&mn.has(e.kind)}function _n(e){return e.kind===void 0||e.kind===`message`}function vn(e){return e.author?.id||e.author_id||``}function yn(e){return`${e.channel_id?`channel:${e.channel_id}`:`direct:${e.direct_conversation_id||``}`}\u0000${vn(e)}\u0000${e.turn_id||e.id}`}function bn(e){let t=e.trim(),n=``,r=``,i=t.match(/^\*\*([^*]+)\*\*\s*\n+([\s\S]+)$/),a=t.match(/^\*\*([^*]+)\*\*$/);if(i)n=i[1].trim(),r=Sn(i[2]);else if(a)n=a[1].trim();else return xn(t.replace(/\*\*/g,``).trim(),``);return xn(n,r)}function xn(e,t){let n=Sn(e),r=n.indexOf(` `),i,a;r===-1?(i=n,a=``):(i=n.slice(0,r),a=n.slice(r+1).trim());let o=[a,t].filter(e=>e.length>0).join(` · `);return{name:i,detail:o||void 0}}function Sn(e){return e.replace(/\s+/g,` `).trim()}function Cn(e,t,n,r){let i=[];for(let e of t)if(e.kind===`agent_tool`){if(r.hideToolCalls)continue;let t=bn(e.body);i.push({type:`tool`,id:e.id,name:t.name,detail:t.detail,full:e.body.trim()})}else{if(r.hideCommentary)continue;let t=e.body.trim();t&&i.push({type:`commentary`,id:e.id,body:t})}return i.length===0?null:{turnId:e,items:i,final:n}}function wn(e,t,n=Date.now()){let r=new Map,i=new Map;for(let t=0;to.firstIndex;if(!r){let e=Date.parse(o.rows[o.rows.length-1].created_at);Number.isFinite(e)&&n-e>hn&&(r=!0)}a.set(t,r)}let o=[];for(let n=0;n=Kn)&&(qn.active=!0,qn.lastPingAt=t,Xn(e,`typing.started`)),qn.idleTimer&&window.clearTimeout(qn.idleTimer),qn.idleTimer=window.setTimeout(()=>{qn&&=(Qn(qn),null)},Gn)}async function Qn(e){e.idleTimer&&window.clearTimeout(e.idleTimer),e.active&&await Xn(e.scope,`typing.stopped`)}function $n(){qn&&=(Qn(qn),null)}var er=2e3,tr=2097152;function nr(e){let t=document.createElement(`span`);return t.textContent=e,t.innerHTML}function rr(e,t,n){return!t||e.length>262144?Promise.resolve(nr(e)):new Promise((r,i)=>{let a=new Worker(new URL(new URL(`../workers/highlight.worker-8wMHDvrm.js`,import.meta.url).href,``+import.meta.url),{type:`module`}),o=!1,s=e=>{o||(o=!0,clearTimeout(l),n.removeEventListener(`abort`,c),a.terminate(),e())},c=()=>s(()=>i(new DOMException(`Syntax highlighting was aborted.`,`AbortError`))),l=window.setTimeout(()=>s(()=>r(nr(e))),er);if(a.onmessage=t=>{let n=t.data;`error`in n?s(()=>r(nr(e))):s(()=>r(n.html))},a.onerror=()=>s(()=>r(nr(e))),n.addEventListener(`abort`,c,{once:!0}),n.aborted){c();return}a.postMessage({source:e,language:t,outputLimit:tr})})}var ir=5e3;function ar(e,t,n){return new Promise((r,i)=>{let a=new Worker(new URL(new URL(`../workers/office.worker-DYsoLmCH.js`,import.meta.url).href,``+import.meta.url),{type:`module`}),o=!1,s=e=>{o||(o=!0,clearTimeout(l),n.removeEventListener(`abort`,c),a.terminate(),e())},c=()=>s(()=>i(new DOMException(`Office preview was aborted.`,`AbortError`))),l=window.setTimeout(()=>s(()=>i(Error(`Office preview took too long and was stopped.`))),ir);if(a.onmessage=t=>{let n=t.data;if(`error`in n){s(()=>i(Error(n.error)));return}if(n.kind!==e){s(()=>i(Error(`Office preview returned an unexpected result.`)));return}s(()=>r(n.preview))},a.onerror=()=>s(()=>i(Error(`Could not parse this Office file safely.`))),n.addEventListener(`abort`,c,{once:!0}),n.aborted){c();return}let u=t.byteOffset===0&&t.buffer instanceof ArrayBuffer&&t.byteLength===t.buffer.byteLength?t:t.slice(),d={kind:e,bytes:u};a.postMessage(d,[u.buffer])})}var or=16777216,sr=1e4,cr=1e4,lr=`This PDF page is too large to preview safely. Download the original to open it locally.`;function ur(e,t){if(!Number.isSafeInteger(e)||!Number.isSafeInteger(t)||e<1||t<1||e>8192||t>8192||e*t>16777216)throw Error(lr)}var dr=new URL(`../assets/pdf.worker.PhvoOpM7.mjs`,import.meta.url).href,fr=W(`
`),pr=W(`

Preparing a safe preview.

`),mr=W(``),hr=W(`
No preview for this file type

You can still download the original file.

Download original
`),gr=W(`
`,1),_r=W(` `),vr=W(` `),yr=W(` `),br=W(` `),xr=W(`

Preview is limited to 10,000 cells, the first 1,000 rows, and the first 100 columns. Download the original to inspect omitted cells.

`),Sr=W(``),Cr=W(`
Raw cached values; number and date formatting omitted
`,1),wr=W(`

`),Tr=W(`

`),Er=W(`

`),Dr=W(`

Some slide content was omitted by preview limits.

`),Or=W(`

Text outline only. Visuals, layout, animations, and speaker notes are omitted.

`,1),kr=W(`
`),Ar=W(`
`),jr=W(`
`),Mr=W(`
 
`),Nr=W(`
`,1);function Pr(e,t){o(t,!0);let a=U(null),s=m(()=>it(t.upload)),l=U(`preview`),h=U(`idle`),v=U(``),y=U(``),x=U(``),S=U(!1),C=U(``),w=U(null),T=U(1),D=U(1),O=U(!1),k=U(``),ee=null,M=!1,P=U(null),I=U(0),L=U(null),ne=U(0),ie=1e4,z=65536,oe=5e3;class se extends Error{}let le=m(()=>Y(b(s))),ue=m(()=>Ve(t.upload)),H=m(()=>(b(s)===`markdown`||b(s)===`html`)&&b(h)===`ready`&&b(S));function W(e){return`This ${b(le).toLowerCase()} is ${qe(t.upload.byte_size)}. Preview is limited to ${qe(e)}.`}function de(e){pe(e);let t=document.createElement(`template`);t.innerHTML=e;let n=J.sanitize(t.content,{RETURN_DOM_FRAGMENT:!0,USE_PROFILES:{html:!0},FORBID_TAGS:[`base`,`embed`,`form`,`iframe`,`link`,`meta`,`object`,`script`,`style`],FORBID_ATTR:[`action`,`formaction`,`srcset`,`style`,`xlink:href`]});for(let e of n.querySelectorAll(`*`))for(let t of Array.from(e.attributes))e.removeAttribute(t.name);let r=document.createElement(`div`);r.append(n);let i=r.innerHTML;return he(i),`${i}`}function fe(e){pe(e);let t=Z(e);return he(t),J.sanitize(t,{ALLOWED_TAGS:[`blockquote`,`br`,`code`,`del`,`em`,`h1`,`h2`,`h3`,`h4`,`h5`,`h6`,`hr`,`li`,`ol`,`p`,`pre`,`strong`,`table`,`tbody`,`td`,`th`,`thead`,`tr`,`ul`],ALLOWED_ATTR:[]})}function pe(e){if(e.length>65536)throw new se(`Structured preview exceeded the safe source limit.`);let t=0;for(let n of e)if("<[]>*_`-+.!#>|~".includes(n)&&(t+=1,t>ie))throw new se(`Structured preview exceeded the safe complexity limit.`)}function he(e){if(e.length>4194304)throw new se(`Rendered preview exceeded the safe output limit.`);let t=0;for(let n of e)if(n===`<`&&++t>ie*2)throw new se(`Rendered preview exceeded the safe element limit.`)}function ge(e){return`Preview data exceeded the ${qe(e)} safety limit.`}async function _e(e,t){let n=await fetch(b(ue),{credentials:`include`,signal:e});if(!n.ok)throw n.status===401||n.status===403?Error(`You no longer have access to this artifact.`):n.status===404?Error(`This artifact is no longer available.`):Error(`Could not load this artifact (${n.status}).`);let r=Number(n.headers.get(`Content-Length`));if(Number.isFinite(r)&&r>t)throw Error(ge(t));if(!n.body){let e=new Uint8Array(await n.arrayBuffer());if(e.byteLength>t)throw Error(ge(t));return e}let i=n.body.getReader(),a=[],o=0;try{for(;;){let{done:e,value:n}=await i.read();if(e)break;if(o+=n.byteLength,o>t)throw await i.cancel(),Error(ge(t));a.push(n)}}finally{i.releaseLock()}let s=new Uint8Array(o),c=0;for(let e of a)s.set(e,c),c+=e.byteLength;return s}async function ve(e,t){return new TextDecoder(`utf-8`,{fatal:!1}).decode(await _e(e,t))}async function G(e){ee?.(),ee=null,V(w,null),V(y,``),V(x,``),V(S,!1),V(C,``),V(T,1),V(D,1),V(k,``),M=!1,V(P,null),V(I,0),V(L,null),V(ne,0),V(l,`preview`),V(v,``);let n=tt(b(s));if(n!==void 0&&t.upload.byte_size>n){V(h,`error`),V(v,W(n),!0);return}if(b(s)===`unsupported`){V(h,`ready`);return}V(h,`loading`);try{if(b(s)===`pdf`){let t=await me(()=>import(`./DKccj-zk.js`),__vite__mapDeps([0,1]),import.meta.url);if(e.aborted)return;t.GlobalWorkerOptions.workerSrc=dr;let r=new AbortController,i=()=>r.abort();e.addEventListener(`abort`,i,{once:!0});let a=null,o=0,s=new Promise((e,t)=>{o=window.setTimeout(()=>{r.abort(),a?.destroy(),t(Error(`PDF preview took too long and was stopped.`))},sr)}),c;try{if(c=await Promise.race([_e(r.signal,n),s]),e.aborted)throw new DOMException(`Aborted`,`AbortError`);a=new t.PDFWorker,await Promise.race([a.promise,s])}catch(t){throw clearTimeout(o),e.removeEventListener(`abort`,i),t}if(e.aborted||!a){clearTimeout(o),e.removeEventListener(`abort`,i),a?.destroy();return}let l=a.port,u=e=>{let t=e.data;typeof t==`object`&&t&&`reason`in t&&typeof t.reason==`object`&&t.reason!==null&&`message`in t.reason&&t.reason.message===`Image exceeded maximum allowed size and was removed.`&&(M=!0,ee?.(),V(h,`error`),V(v,`PDF page content could not be rendered completely within safety limits.`))};l.addEventListener(`message`,u);let d=null,f=!1;ee=()=>{f||(f=!0,l.removeEventListener(`message`,u),d&&d.destroy(),a.destroy(),V(w,null))};let p=t.getDocument({data:c,maxImageSize:or,canvasMaxAreaInBytes:or*4,stopAtErrors:!0,worker:a});d=p;try{V(w,await Promise.race([p.promise,s]),!0)}finally{clearTimeout(o),e.removeEventListener(`abort`,i)}}else if(b(s)===`spreadsheet`||b(s)===`presentation`){let t=await _e(e,n);if(e.aborted)return;if(b(s)===`spreadsheet`){let n=await ar(b(s),t,e);if(e.aborted)return;V(P,n,!0)}else{let n=await ar(b(s),t,e);if(e.aborted)return;V(L,n,!0)}}else{if(V(y,await ve(e,n),!0),e.aborted)return;b(s)===`code`&&V(C,await rr(b(y),Ye(t.upload),e),!0);try{b(s)===`markdown`&&(V(x,fe(b(y)),!0),V(S,!0)),b(s)===`html`&&(V(x,de(b(y)),!0),V(S,!0))}catch(e){if(!(e instanceof se))throw e;V(x,``),V(l,`source`)}}e.aborted||V(h,`ready`)}catch(t){if(e.aborted||t instanceof Error&&t.name===`AbortError`)return;ee?.(),ee=null,V(h,`error`),V(v,t instanceof Error?t.message:`Could not preview this artifact.`,!0)}}E(()=>{let e=new AbortController;return G(e.signal),()=>e.abort()}),E(()=>{if(b(s)!==`pdf`||!b(w)||!b(a)||b(h)!==`ready`)return;let e=b(w),t=b(T),n=b(D),r=!1,i=null,o=null,c=null,l=0;return V(O,!0),V(k,``),(async()=>{try{if(l=window.setTimeout(()=>{r||(i?.cancel(),c?.cancel(),ee?.(),V(h,`error`),V(v,`PDF page rendering took too long and was stopped.`))},cr),o=await e.getPage(t),r||!b(a))return;let s=``,u=0;c=o.streamTextContent().getReader();try{for(;!r;){let{done:e,value:t}=await c.read();if(e)break;for(let e of t.items){if(u+=1,u>oe){await c.cancel(),s=`${s}…`;break}if(!(`str`in e)||!e.str)continue;let t=`${s}${s?` `:``}${e.str}`;if(t.length>z){await c.cancel(),s=`${t.slice(0,z)}…`;break}s=t}if(u>oe||s.endsWith(`…`))break}}finally{c.releaseLock(),c=null}if(r)return;V(k,s||`This page has no extractable text.`,!0);let d=o.getViewport({scale:n}),f=Math.min(window.devicePixelRatio||1,2),p=Math.max(1,Math.floor(d.width*f)),m=Math.max(1,Math.floor(d.height*f));ur(p,m);let g=b(a).getContext(`2d`);if(!g)throw Error(`PDF canvas is unavailable.`);if(b(a).width=p,b(a).height=m,b(a).style.width=`${d.width}px`,b(a).style.height=`${d.height}px`,g.setTransform(f,0,0,f,0,0),i=o.render({canvasContext:g,viewport:d}),await i.promise,M)throw Error(`PDF page content could not be rendered completely within safety limits.`)}catch(e){!r&&!(e instanceof Error&&e.name===`RenderingCancelledException`)&&(ee?.(),V(h,`error`),V(v,e instanceof Error?e.message:`Could not render this PDF page.`,!0))}finally{clearTimeout(l),o?.cleanup(),o=null,r||V(O,!1)}})(),()=>{r=!0,clearTimeout(l),i?.cancel(),c?.cancel()}}),re(()=>ee?.());function ye(e){let t=e.match(/^[A-Z]+/i)?.[0]?.toUpperCase()||`A`,n=0;for(let e of t)n=n*26+e.charCodeAt(0)-64;return n}function be(e){return Number(e.match(/\d+$/)?.[0]||1)}function xe(e){let t=``;for(let n=e;n>0;n=Math.floor((n-1)/26))t=String.fromCharCode(65+(n-1)%26)+t;return t}let Se=m(()=>{let e=b(P)?.sheets[b(I)];if(!e)return{columns:[],rows:[],clipped:!1};let t=Math.max(1,...e.cells.map(e=>ye(e.reference))),n=Math.max(1,...e.cells.map(e=>be(e.reference))),r=Math.min(100,t),i=Math.min(1e3,Math.floor(1e4/r),n),a=new Map(e.cells.map(e=>[e.reference.toUpperCase(),e.value])),o=Array.from({length:r},(e,t)=>xe(t+1));return{columns:o,rows:Array.from({length:i},(e,t)=>({number:t+1,values:o.map(e=>a.get(`${e}${t+1}`)||``)})),clipped:t>r||n>i}});var Ce=Nr(),we=ae(Ce),Te=A(we),Ee=A(Te),De=R(Ee,!0),Oe=N(Ee,2),ke=R(Oe,!0),Ae=N(Oe,2),je=R(Ae,!0);r(Te);var Me=N(Te,2),Ne=A(Me),Pe=e=>{var t=fr(),n=A(t);let a;var o=N(n,2);let s;r(t),B(()=>{j(t,`aria-label`,`${b(le)} view`),j(n,`aria-pressed`,b(l)===`preview`),a=i(n,1,``,null,a,{active:b(l)===`preview`}),j(o,`aria-pressed`,b(l)===`source`),s=i(o,1,``,null,s,{active:b(l)===`source`})}),_(`click`,n,()=>V(l,`preview`)),_(`click`,o,()=>V(l,`source`)),u(e,t)};f(Ne,e=>{b(H)&&e(Pe)});var K=N(Ne,2),Fe=N(K,2);r(Me),r(we);var Ie=N(we,2);let Le;var Re=A(Ie),q=e=>{var t=pr(),n=N(A(t),2),i=R(n);te(2),r(t),B(e=>c(i,`Opening ${e??``}`),[()=>b(le).toLowerCase()]),u(e,t)},ze=e=>{var n=mr(),i=N(A(n),4),a=R(i,!0),o=N(i,2);r(n),B(()=>{c(a,b(v)),j(o,`href`,b(ue)),j(o,`download`,t.upload.filename)}),u(e,n)},Be=e=>{var n=hr(),i=N(A(n),6);r(n),B(()=>{j(i,`href`,b(ue)),j(i,`download`,t.upload.filename)}),u(e,n)},He=e=>{var t=gr(),n=ae(t),o=A(n),s=N(o,2),l=R(s),d=N(s,2),f=N(d,4),p=N(f,2),m=R(p),h=N(p,2);r(n);var g=N(n,2);let v;var y=A(g);ce(y,e=>V(a,e),()=>b(a));var x=N(y,2),S=R(x,!0);r(g),B(e=>{o.disabled=b(T)<=1||b(O),c(l,`Page ${b(T)??``} of ${b(w).numPages??``}`),d.disabled=b(T)>=b(w).numPages||b(O),f.disabled=b(D)<=.6||b(O),c(m,`${e??``}%`),h.disabled=b(D)>=2||b(O),v=i(g,1,`artifact-viewer__pdf-stage`,null,v,{"is-rendering":b(O)}),j(g,`aria-label`,`PDF page ${b(T)} visual preview`),j(x,`aria-label`,`PDF page ${b(T)} text`),c(S,b(k))},[()=>Math.round(b(D)*100)]),_(`click`,o,()=>V(T,b(T)-1)),_(`click`,d,()=>V(T,b(T)+1)),_(`click`,f,()=>V(D,Math.max(.6,b(D)-.2),!0)),_(`click`,h,()=>V(D,Math.min(2,b(D)+.2),!0)),u(e,t)},Ue=e=>{var t=Cr(),n=ae(t),a=A(n),o=R(a),s=N(a,4),l=e=>{var t=_r(),n=R(t);B(()=>c(n,`${b(P).hiddenSheets??``} hidden ${b(P).hiddenSheets===1?`sheet`:`sheets`} omitted`)),u(e,t)};f(s,e=>{b(P).hiddenSheets>0&&e(l)});var p=N(s,2),m=e=>{var t=_r(),n=R(t);B(()=>c(n,`${b(P).unsupportedSheets??``} non-worksheet ${b(P).unsupportedSheets===1?`sheet`:`sheets`} omitted`)),u(e,t)};f(p,e=>{b(P).unsupportedSheets>0&&e(m)}),r(n);var h=N(n,2),g=A(h),v=A(g),y=A(v),x=N(A(y));F(x,17,()=>b(Se).columns,d,(e,t)=>{var n=vr(),r=R(n,!0);B(()=>c(r,b(t))),u(e,n)}),r(y),r(v);var S=N(v);F(S,21,()=>b(Se).rows,d,(e,t)=>{var n=br(),i=A(n),a=R(i,!0),o=N(i);F(o,17,()=>b(t).values,d,(e,t)=>{var n=yr(),r=R(n,!0);B(()=>c(r,b(t))),u(e,n)}),r(n),B(()=>c(a,b(t).number)),u(e,n)}),r(S),r(g);var C=N(g,2),w=e=>{var t=xr();u(e,t)};f(C,e=>{(b(Se).clipped||b(P).sheets[b(I)].truncated)&&e(w)}),r(h);var T=N(h,2);F(T,21,()=>b(P).sheets,d,(e,t,n)=>{var r=Sr();let a;var o=R(r,!0);B(()=>{j(r,`aria-selected`,b(I)===n),a=i(r,1,``,null,a,{active:b(I)===n}),c(o,b(t).name)}),_(`click`,r,()=>V(I,n,!0)),u(e,r)}),r(T),B(()=>{c(o,`${b(P).sheets.length??``} ${b(P).sheets.length===1?`sheet`:`sheets`}`),j(h,`aria-label`,`${b(P).sheets[b(I)].name} worksheet`)}),u(e,t)},We=e=>{var t=Or(),n=ae(t),i=A(n),a=N(i,2),o=R(a),s=N(a,2);r(n);var l=N(n,2),m=A(l);F(m,21,()=>b(L).slides[b(ne)].paragraphs,d,(e,t,n)=>{var r=p(),i=ae(r),a=e=>{var n=wr(),r=R(n,!0);B(()=>c(r,b(t))),u(e,n)},o=e=>{var n=Tr(),r=R(n,!0);B(()=>c(r,b(t))),u(e,n)};f(i,e=>{n===0?e(a):e(o,-1)}),u(e,r)}),r(m);var h=N(m,4),g=e=>{var t=Er(),n=R(t);B(()=>c(n,`${b(L).hiddenSlides??``} hidden ${b(L).hiddenSlides===1?`slide`:`slides`} omitted.`)),u(e,t)};f(h,e=>{b(L).hiddenSlides>0&&e(g)});var v=N(h,2),y=e=>{var t=Dr();u(e,t)};f(v,e=>{b(L).truncated&&e(y)}),r(l),B(()=>{i.disabled=b(ne)===0,c(o,`Slide ${b(ne)+1} of ${b(L).slides.length??``}`),s.disabled=b(ne)>=b(L).slides.length-1,j(m,`aria-label`,`Slide ${b(ne)+1}: ${b(L).slides[b(ne)].title}`)}),_(`click`,i,()=>V(ne,b(ne)-1)),_(`click`,s,()=>V(ne,b(ne)+1)),u(e,t)},Ge=e=>{var t=kr();n(t,()=>b(x),!0),r(t),u(e,t)},Ke=e=>{var t=Ar();n(t,()=>b(x),!0),r(t),u(e,t)},Je=e=>{var t=jr(),i=A(t);n(i,()=>b(C),!0),r(i),r(t),u(e,t)},Xe=e=>{var t=Mr(),n=A(t),i=R(n,!0);r(t),B(()=>c(i,b(y))),u(e,t)};f(Re,e=>{b(h)===`loading`?e(q):b(h)===`error`?e(ze,1):b(s)===`unsupported`?e(Be,2):b(s)===`pdf`&&b(w)?e(He,3):b(s)===`spreadsheet`&&b(P)?e(Ue,4):b(s)===`presentation`&&b(L)?e(We,5):b(s)===`html`&&b(l)===`preview`&&b(x)?e(Ge,6):b(s)===`markdown`&&b(l)===`preview`?e(Ke,7):b(s)===`code`?e(Je,8):e(Xe,-1)}),r(Ie),B(e=>{c(De,b(le)),j(Oe,`title`,t.upload.filename),c(ke,t.upload.filename),c(je,e),j(K,`href`,b(ue)),j(K,`download`,t.upload.filename),j(K,`aria-label`,`Download ${t.upload.filename}`),Le=i(Ie,1,`artifact-viewer__body`,null,Le,{"is-pdf":b(s)===`pdf`,"is-office":b(s)===`spreadsheet`||b(s)===`presentation`})},[()=>qe(t.upload.byte_size)]),_(`click`,Fe,function(...e){t.onClose?.apply(this,e)}),u(e,Ce),g()}s([`click`]);var Fr=W(``),Ir=W(`
`),Lr=W(`

or

`),Rr=W(` `,1),zr=W(``),Br=W(``),Vr=W(`

`),Hr=W(`
ClickClack OpenClaw workspace chat

Welcome.

Have a sign-in token?
`,1);function Ur(e,t){o(t,!0);let n=Rt?.integratedTitleBar===!0,i=U(``),a=ge(),s=a.includes(`github`),l=a.includes(`password`),d=!Rt&&a.includes(`openclaw`),p=U(``),m=U(``),h=U(``),v=U(!1),x=U(``),S=l?s?`Sign in with your ClickClack account, or continue with GitHub.`:`Sign in with your ClickClack account.`:s?`Sign in with GitHub to join the guest room.`:d?`Sign in with OpenClaw ID to join the guest room.`:`Sign in with a token from your ClickClack administrator.`,C=s&&!l?`Any GitHub account can join.`:``;async function w(e){if(Rt){e.preventDefault(),V(i,`Opening GitHub in your browser…`);try{await Rt.signInWithGitHub(),V(i,`Finish signing in in your browser. ClickClack will complete here automatically.`)}catch{V(i,`Could not open your browser. Try again.`)}}}async function T(e,t){if(!b(v)){V(v,!0),V(x,``);try{await G(e,{method:`POST`,body:JSON.stringify(t)}),window.location.reload()}catch(e){V(x,xe(e,`Could not sign in.`),!0),V(v,!1)}}}function E(e){e.preventDefault(),T(`/api/auth/password/login`,{identifier:b(p),password:b(m)})}function D(e){e.preventDefault(),T(`/api/auth/magic/consume`,{token:b(h)})}var O=Hr(),k=ae(O),ee=e=>{var t=Fr();B(()=>j(t,`data-platform`,Rt.platform)),u(e,t)};f(k,e=>{n&&Rt&&e(ee)});var P=N(k,2),F=A(P),I=A(F),L=A(I);Xe(L,{class:`mark`,size:44}),te(2),r(I);var ne=N(I,2),re=N(A(ne),2),ie=R(re,!0);r(ne);var oe=N(ne,2),se=e=>{var t=Ir(),n=A(t),i=N(A(n),2);M(i),r(n);var a=N(n,2),o=N(A(a),2);M(o),r(a);var s=N(a,2),l=R(s,!0);r(t),B(()=>{s.disabled=b(v),c(l,b(v)?`Signing in...`:`Sign in`)}),y(`submit`,t,E),z(i,()=>b(p),e=>V(p,e)),z(o,()=>b(m),e=>V(m,e)),u(e,t)};f(oe,e=>{l&&e(se)});var ce=N(oe,2),le=e=>{var t=Rr(),n=ae(t),r=e=>{var t=Lr();u(e,t)};f(n,e=>{l&&e(r)});var i=N(n,2);B(e=>j(i,`href`,e),[()=>he(`/api/auth/github/start`)]),_(`click`,i,w),u(e,t)};f(ce,e=>{s&&e(le)});var ue=N(ce,2),H=e=>{var t=zr();B(e=>j(t,`href`,e),[()=>he(`/api/auth/openclaw/start`)]),u(e,t)};f(ue,e=>{d&&e(H)});var W=N(ue,2),de=e=>{var t=Br(),n=R(t,!0);B(()=>c(n,b(x))),u(e,t)};f(W,e=>{b(x)&&e(de)});var fe=N(W,2),pe=N(A(fe),2),me=A(pe),_e=N(A(me),2);M(_e),r(me);var ve=N(me,2);r(pe),r(fe);var ye=N(fe,2),be=e=>{var t=Vr(),n=R(t,!0);B(()=>c(n,b(i)||C)),u(e,t)};f(ye,e=>{(b(i)||C)&&e(be)}),r(F),r(P),B(()=>{c(ie,S),fe.open=!s&&!l&&!d,ve.disabled=b(v)}),y(`submit`,pe,D),z(_e,()=>b(h),e=>V(h,e)),u(e,O),g()}s([`click`]);var Wr=W(``),Gr=W(``);function Kr(e,t){o(t,!0);let n=C(t,`deleting`,3,!1),i=C(t,`error`,3,``),a=m(()=>t.message.author?.display_name||`Local User`);function s(){n()||t.onClose()}var l=Gr(),d=A(l),p=N(d,2),h=A(p),v=N(A(h),2);r(h);var y=N(h,2),x=N(A(y),2),S=A(x);{let e=m(()=>t.message.author?.id||t.message.author_id),n=m(()=>t.message.author?.avatar_url);pt(S,{class:`avatar`,get id(){return b(e)},get name(){return b(a)},get src(){return b(n)},size:36,loading:`eager`,fetchPriority:`auto`})}var w=N(S,2),T=A(w),E=A(T),D=R(E,!0),O=N(E,2),k=R(O,!0);r(T);var ee=N(T,2),M=R(ee,!0);r(w),r(x);var P=N(x,2),F=e=>{var t=Wr(),n=R(t,!0);B(()=>c(n,i())),u(e,t)};f(P,e=>{i()&&e(F)});var I=N(P,2),L=A(I),te=N(L,2),ne=R(te,!0);r(I),r(y),r(p),r(l),B(e=>{d.disabled=n(),v.disabled=n(),c(D,b(a)),j(O,`datetime`,t.message.created_at),c(k,e),c(M,t.message.body),L.disabled=n(),te.disabled=n(),c(ne,n()?`Deleting...`:`Delete`)},[()=>X(t.message.created_at)]),_(`click`,d,s),_(`click`,v,s),_(`click`,L,s),_(`click`,te,function(...e){t.onConfirm?.apply(this,e)}),u(e,l),g()}s([`click`]);var qr=6500,Jr=W(`
`);function Yr(e,t){o(t,!0);let n=m(()=>t.entries.filter(e=>e.userID!==t.currentUserID));function a(e,t=`Someone`){return e?.display_name?.trim()||(e?.handle?`@${e.handle}`:t)}let s=m(()=>b(n).length===0?``:b(n).length===1?`${a(b(n)[0].user)} is typing…`:b(n).length===2?`${a(b(n)[0].user)} and ${a(b(n)[1].user)} are typing…`:b(n).length===3?`${a(b(n)[0].user)}, ${a(b(n)[1].user)}, and ${a(b(n)[2].user)} are typing…`:`Several people are typing…`);var l=Jr();let d;var f=N(A(l),2),p=R(f,!0);r(l),B(()=>{d=i(l,1,`typing-indicator`,null,d,{visible:b(n).length>0}),c(p,b(s))}),u(e,l),g()}var Xr=W(`
`),Zr=W(`
`),Qr=W(`
`);function $r(e,t){o(t,!0);function n(e){return e.kind===`tool`&&e.toolName?!e.text||e.text===e.toolName?e.toolName:`${e.toolName}: ${e.text}`:e.text}function a(e){switch(e){case`tool`:return`⚙`;case`thinking`:case`commentary`:return`✦`;case`plan`:return`☰`;case`patch`:return`±`;case`command_output`:return`›`;case`error`:return`✕`;default:return`·`}}var s=p(),l=ae(s),d=e=>{var o=Qr();F(o,21,()=>t.turns,e=>e.key,(e,t)=>{var o=Zr();F(o,21,()=>b(t).lines,e=>e.id,(e,t)=>{var o=Xr();let s;var l=A(o),d=R(l,!0),f=N(l,2),p=R(f,!0);r(o),B((e,n)=>{s=i(o,1,`agent-progress__line svelte-6vwkyv`,null,s,{"agent-progress__line--done":b(t).finalized}),j(o,`data-kind`,b(t).kind),c(d,e),c(p,n)},[()=>a(b(t).kind),()=>n(b(t))]),u(e,o)}),r(o),u(e,o)}),r(o),u(e,o)};f(l,e=>{t.turns.length>0&&e(d)}),u(e,s),g()}function ei(e,t){return`${e}\u0000${t}`}var ti=45e3;function ni(e,t,n){let r=typeof t.turn_id==`string`?t.turn_id:``,i=typeof t.op==`string`?t.op:``;if(!r||!i)return e;let a=typeof t.user_id==`string`?t.user_id:``,o=ei(a,r);if(i===`clear`)return e.filter(e=>e.turnId===r?a&&e.userId?e.key!==o:!1:!0);let s=t.line,c=s&&typeof s.id==`string`?s.id:``;if(!c)return e;let l=s&&typeof s.text==`string`?s.text:``,u=s&&typeof s.title==`string`?s.title:``,d=l||u,f=s&&typeof s.tool_name==`string`?s.tool_name:typeof s?.toolName==`string`?s.toolName:void 0,p=s&&typeof s.status==`string`?s.status:void 0,m=s&&typeof s.kind==`string`?s.kind:void 0,h=e.find(e=>e.key===o),g=h?.lines.find(e=>e.id===c),_={id:c,kind:m??g?.kind??`lifecycle`,text:d||g?.text||``,toolName:f??g?.toolName,status:p??g?.status,finalized:i===`finalize`||(g?.finalized??!1)};if(!g&&!_.text&&!_.toolName)return e;let v=n+ti;if(!h)e=[...e,{key:o,turnId:r,userId:a,lines:[_],expiresAt:v}];else{let t=h.lines.some(e=>e.id===c)?h.lines.map(e=>e.id===c?_:e):[...h.lines,_];e=e.map(e=>e.key===o?{...e,lines:t,expiresAt:v}:e)}return e}var ri=W(``),ii=W(``);function ai(e,t){o(t,!0);var n=ii(),i=A(n),a=N(i,2),s=A(a),l=N(A(s),2);r(s);var d=N(s,2),p=A(d),m=N(A(p),2);M(m),r(p);var h=N(p,2),v=e=>{var n=ri(),r=R(n,!0);B(()=>c(r,t.error)),u(e,n)};f(h,e=>{t.error&&e(v)});var b=N(h,2),x=A(b),S=N(x,2),C=R(S,!0);r(b),r(d),r(a),r(n),B(e=>{le(m,t.channelName),m.disabled=t.pending,S.disabled=e,c(C,t.pending?`Creating…`:`Create channel`)},[()=>t.pending||!t.channelName.trim()]),_(`click`,i,function(...e){t.onClose?.apply(this,e)}),_(`click`,l,function(...e){t.onClose?.apply(this,e)}),y(`submit`,d,e=>{e.preventDefault(),t.onCreate()}),_(`input`,m,e=>t.onChannelName(e.currentTarget.value)),_(`click`,x,function(...e){t.onClose?.apply(this,e)}),u(e,n),g()}s([`click`,`input`]);var oi=W(``),si=W(`
No matching people yet
`),ci=W(`

`),li=W(``),ui=W(``);function di(e,t){o(t,!0);let n=m(()=>t.memberID.trim().toLowerCase().replace(/^@/,``)),i=m(()=>t.people.filter(e=>e.id!==t.currentUserID).filter(e=>!b(n)||e.display_name.toLowerCase().includes(b(n))||e.handle?.toLowerCase().includes(b(n))||e.id.toLowerCase().includes(b(n)))),a=m(()=>t.memberID.trim().startsWith(`usr_`)?t.memberID.trim():b(n)&&b(i).length===1?b(i)[0].id:``);function s(e){!t.pending&&e&&(t.onMemberID(e),t.onStart(e))}var l=ui(),d=A(l),p=N(d,2),h=A(p),v=N(A(h),2);r(h);var x=N(h,2),S=A(x),C=N(A(S),2);M(C),r(S);var w=N(S,2),T=A(w);F(T,17,()=>b(i),e=>e.id,(e,n)=>{var i=oi(),a=A(i);pt(a,{class:`dm-avatar`,get id(){return b(n).id},get name(){return b(n).display_name},get src(){return b(n).avatar_url},size:32});var o=N(a,2),l=A(o),d=R(l,!0),f=N(l,2),p=R(f,!0);r(o),r(i),B(e=>{i.disabled=t.pending,c(d,b(n).display_name),c(p,e)},[()=>lt(b(n).handle)||b(n).id]),_(`click`,i,()=>s(b(n).id)),u(e,i)});var E=N(T,2),D=e=>{var t=si();u(e,t)};f(E,e=>{b(i).length===0&&e(D)}),r(w);var O=N(w,2),k=e=>{var t=ci(),n=R(t,!0);B(()=>c(n,b(i).length>1?`Choose a person from the results.`:`Choose a person or enter a user ID.`)),u(e,t)};f(O,e=>{b(n)&&!b(a)&&e(k)});var j=N(O,2),ee=e=>{var n=li(),r=R(n,!0);B(()=>c(r,t.error)),u(e,n)};f(j,e=>{t.error&&e(ee)});var P=N(j,2),I=A(P),L=N(I,2),te=R(L,!0);r(P),r(x),r(p),r(l),B(()=>{le(C,t.memberID),C.disabled=t.pending,L.disabled=t.pending||!b(a),c(te,t.pending?`Starting…`:`Start DM`)}),_(`click`,d,function(...e){t.onClose?.apply(this,e)}),_(`click`,v,function(...e){t.onClose?.apply(this,e)}),y(`submit`,x,e=>{e.preventDefault(),s(b(a))}),_(`input`,C,e=>t.onMemberID(e.currentTarget.value)),_(`click`,I,function(...e){t.onClose?.apply(this,e)}),u(e,l),g()}s([`click`,`input`]);var fi=W(` `),pi=W(``),mi=W(`
`),hi=W(``),gi=W(`

Creating workspace…

`),_i=W(`
`),vi=W(``);function yi(e,t){o(t,!0);let n=C(t,`homeHref`,3,`/`),a=C(t,`homeLabel`,3,`cc`),s=C(t,`homeTitle`,3,`ClickClack home`);function l(e){return e.button===0&&!e.metaKey&&!e.ctrlKey&&!e.shiftKey&&!e.altKey}var d=vi(),p=A(d);let h;var v=A(p),x=e=>{Xe(e,{size:48})},S=m(()=>jt(a())),w=e=>{var t=fi(),n=R(t,!0);B(()=>c(n,a())),u(e,t)};f(v,e=>{b(S)?e(x):e(w,-1)}),r(p);var T=N(p,4),E=A(T);F(E,17,()=>t.workspaces,e=>e.id,(e,n)=>{var a=mi();let o;var s=A(a),d=A(s),p=e=>{var t=pi();B(e=>j(t,`src`,e),[()=>_e(b(n).icon_url)]),u(e,t)},m=e=>{var t=fi(),r=R(t,!0);B(e=>c(r,e),[()=>dt(b(n).name)]),u(e,t)};f(d,e=>{b(n).icon_url?e(p):e(m,-1)}),r(s),r(a),B(e=>{o=i(a,1,`guild-wrap`,null,o,{active:b(n).id===t.selectedWorkspaceID}),j(s,`title`,b(n).name),j(s,`aria-label`,b(n).name),j(s,`href`,e)},[()=>t.hrefForWorkspace(b(n).id)]),_(`click`,s,e=>{l(e)&&(e.preventDefault(),t.onSelectWorkspace(b(n).id))}),u(e,a)});var D=N(E,2);r(T);var O=N(T,2),k=e=>{var n=_i(),i=A(n);M(i);var a=N(i,2),o=e=>{var n=hi(),r=R(n,!0);B(()=>c(r,t.createError)),u(e,n)};f(a,e=>{t.createError&&e(o)});var s=N(a,2),l=e=>{var t=gi();u(e,t)};f(s,e=>{t.createPending&&e(l)}),r(n),B(()=>{le(i,t.workspaceName),i.disabled=t.createPending}),y(`submit`,n,e=>{e.preventDefault(),t.onCreateWorkspace()}),_(`input`,i,e=>t.onWorkspaceName(e.currentTarget.value)),u(e,n)};f(O,e=>{t.showWorkspaceCreate&&e(k)}),r(d),B(e=>{h=i(p,1,`guild home`,null,h,{"home--mark":e}),j(p,`title`,s()),j(p,`aria-label`,s()),j(p,`href`,n())},[()=>jt(a())]),_(`click`,D,function(...e){t.onToggleWorkspaceCreate?.apply(this,e)}),u(e,d),g()}s([`click`,`input`]);var bi=`clickclack:sidebar-channel-order:v1:`,xi=new Map,Si=new Map;function Ci(e,t){return`${bi}${t}:${e}`}function wi(e){if(!e||e.length>1e6)return[];try{let t=JSON.parse(e);return Array.isArray(t)&&t.length<=1e4&&t.every(e=>typeof e==`string`&&e.length<=128)?[...new Set(t)]:[]}catch{return[]}}function Ti(e,t){try{window.localStorage.setItem(e,JSON.stringify(t))}catch{}}function Ei(e,t,n){e?.startsWith(`${bi}${n}:`)&&xi.set(e,wi(t))}function Di(e,t){if(!e?.id||!t)return[];let n=Ci(t,e.id),r=xi.get(n);if(r)return r;let i=[];try{i=wi(window.localStorage.getItem(n))}catch{}let a=e.sidebar_preferences?.channel_order?.[t];if(a===void 0)return i;let o=a.length?[...new Set([...a,...i])].slice(0,1e4):[];return Ti(n,o),o}function Oi(e,t,n,r,i){let a=Ci(t,e);xi.set(a,n),Ti(a,n);let o=(Si.get(a)??Promise.resolve()).then(async()=>{if(xi.get(a)===n&&i())try{let e=JSON.stringify({sidebar_preferences:{channel_order:{[t]:n.slice(0,500)}}});await r(`/api/me`,{method:`PATCH`,keepalive:new TextEncoder().encode(e).length<6e4,body:e})}catch{}});return Si.set(a,o),o.then(()=>{Si.get(a)===o&&Si.delete(a)}),o}var ki=W(``),Ai=W(` `,1),ji=W(``),Mi=W(` `),Ni=W(``),Pi=W(`
`),Fi=W(``),Ii=W(`Drag with a pointer, use Arrow Up and Arrow Down while focused, or open the move menu. Moves stay within the current channel section. `,1),Li=W(`
`);function Ri(e,n){o(n,!0);let a=(e,t=I,a=I,o=I,s=I,l=I)=>{let p=m(()=>t().unread_count||0),g=m(()=>a().findIndex(e=>e.id===t().id));var S=Ni();let T;var E=A(S),D=e=>{var n=Ai(),i=ae(n),s=N(i,2),c=e=>{var n=ki(),i=A(n),o=N(i,2);r(n),ce(n,e=>V(w,e),()=>b(w)),B(e=>{j(n,`aria-label`,e),i.disabled=b(g)<=0,o.disabled=b(g)<0||b(g)>=a().length-1},[()=>`Move #${bt(t())}`]),_(`keydown`,n,e=>{e.key===`Escape`&&(e.preventDefault(),_e(!0))}),_(`click`,i,()=>ve(t().id,-1,a())),_(`click`,o,()=>ve(t().id,1,a())),u(e,n)};f(s,e=>{b(C)===t().id&&e(c)}),B(e=>{j(i,`aria-label`,e),j(i,`aria-expanded`,b(C)===t().id)},[()=>`Move #${bt(t())}`]),_(`click`,i,e=>void ge(t().id,e.currentTarget)),y(`dragstart`,i,e=>fe(e,t().id,o())),y(`dragend`,i,he),_(`keydown`,i,e=>{e.key===`ArrowUp`||e.key===`ArrowDown`?(e.preventDefault(),V(C,``),de(t().id,e.key===`ArrowUp`?-1:1,a())):e.key===`Escape`&&V(C,``)}),u(e,n)};f(E,e=>{l()&&e(D)});var O=N(E,2);let k;var ee=N(A(O),2),M=R(ee,!0),P=N(ee,2),F=e=>{var t=ji();u(e,t)};f(P,e=>{t().external_managed&&e(F)});var L=N(P,2),te=e=>{var t=Mi(),n=R(t,!0);B(()=>{j(t,`aria-label`,`${b(p)} unread`),c(n,b(p)>99?`99+`:b(p))}),u(e,t)};f(L,e=>{b(p)>0&&(t().id!==n.selectedChannelID||n.selectedDirectID)&&e(te)}),r(O),r(S),B((e,r)=>{T=i(S,1,`channel-row`,null,T,{reorderable:l(),subdued:s(),dragging:b(d)===t().id,"drop-before":b(v)===t().id&&b(x),"drop-after":b(v)===t().id&&!b(x)}),j(O,`href`,e),k=i(O,1,`nav-item channel`,null,k,{active:t().id===n.selectedChannelID&&!n.selectedDirectID,"has-unread":b(p)>0&&!(t().id===n.selectedChannelID&&!n.selectedDirectID)}),c(M,r)},[()=>n.hrefForChannel(t().id),()=>bt(t())]),y(`dragover`,S,e=>{l()&&pe(e,t().id,o())}),y(`drop`,S,e=>{e.preventDefault(),l()&&b(h)===o()&&(W(b(d),t().id,b(x),a()),he())}),_(`focusout`,S,e=>{e.currentTarget.contains(e.relatedTarget)||V(C,``)}),_(`click`,O,e=>{G(e)&&(e.preventDefault(),n.onSelectChannel(t().id))}),u(e,S)},s=(e,t=I,n=I,o=I)=>{let s=m(()=>oe(t().key)),l=m(()=>ue(t()));var d=Pi();let f;var p=A(d),h=N(A(p),2),g=R(h,!0),v=N(h,2),y=R(v,!0);r(p);var x=N(p,2);F(x,21,()=>b(l),e=>e.id,(e,n)=>{a(e,()=>b(n),()=>t().channels,()=>t().key,o,()=>b(s))}),r(x),r(d),B(()=>{f=i(d,1,`channel-subgroup`,null,f,{"archived-channel-group":o()}),j(p,`aria-expanded`,b(s)),j(p,`aria-controls`,n()),c(g,t().label),c(y,t().channels.length),j(x,`id`,n()),j(x,`hidden`,!b(s)&&b(l).length===0)}),_(`click`,p,()=>se(t().key)),u(e,d)},l=`archived`,d=U(``),h=U(``),v=U(``),x=U(!0),S=U(!1),C=U(``),w=U(void 0),T,D=U(``),k=U(ee({})),M=m(()=>n.channels.filter(e=>!e.archived_at)),P=m(()=>n.channels.filter(e=>!!e.archived_at)),L=m(()=>b(M).filter(e=>!e.sidebar_section?.trim())),te=m(()=>{let e=new Map;for(let t of b(M)){let n=t.sidebar_section?.trim();if(!n)continue;let r=e.get(n)??[];r.push(t),e.set(n,r)}return[...e.entries()].map(([e,t])=>({key:`section:${e}`,label:e,channels:t})).sort((e,t)=>e.label.localeCompare(t.label,void 0,{sensitivity:`base`}))}),ne=m(()=>n.channels.filter(e=>e.id===n.selectedChannelID&&!n.selectedDirectID||(e.unread_count||0)>0));function re(e){if(!e)return{};try{let t=JSON.parse(e);if(!t||typeof t!=`object`||Array.isArray(t))return{};let n=Object.entries(t);return n.length>1e3||n.some(([e,t])=>e.length>256||typeof t!=`boolean`)?{}:Object.fromEntries(n)}catch{return{}}}function ie(e){return`clickclack:sidebar-channel-groups:v1:${e}`}function z(e){if(!e)return{};try{return re(window.localStorage.getItem(ie(e)))}catch{return{}}}function oe(e){let t=b(k)[e];return typeof t==`boolean`?t:e!==l}function se(e){if(V(k,{...b(k),[e]:!oe(e)},!0),n.workspaceID)try{window.localStorage.setItem(ie(n.workspaceID),JSON.stringify(b(k)))}catch{}}function le(e){e.key===ie(n.workspaceID)&&V(k,re(e.newValue),!0)}function ue(e){return oe(e.key)?e.channels:e.channels.filter(e=>e.id===n.selectedChannelID&&!n.selectedDirectID||(e.unread_count||0)>0)}function H(e){V(D,``),queueMicrotask(()=>{V(D,e,!0)})}function W(e,t,r,i){if(!e||!t||e===t)return;let a=n.channels.map(e=>e.id),o=a.indexOf(e);if(o<0)return;a.splice(o,1);let s=a.indexOf(t);if(s<0)return;a.splice(s+ +!r,0,e),n.onReorder(a);let c=n.channels.find(t=>t.id===e),l=i.map(e=>e.id).filter(t=>t!==e),u=l.indexOf(t);l.splice(u+ +!r,0,e),c&&H(`Moved #${bt(c)} to position ${l.indexOf(e)+1} of ${l.length}`)}function de(e,t,n){let r=n.findIndex(t=>t.id===e),i=r+t;r<0||i<0||i>=n.length||W(e,n[i].id,t<0,n)}function fe(e,t,n){V(S,!0),V(C,``),V(d,t,!0),V(h,n,!0),e.dataTransfer?.setData(`text/plain`,t),e.dataTransfer&&(e.dataTransfer.effectAllowed=`move`)}function pe(e,t,n){if(!b(d)||b(d)===t||b(h)!==n)return;e.preventDefault();let r=e.currentTarget;V(v,t,!0),V(x,e.clientY{V(S,!1)},0)}async function ge(e,n){if(!b(S)){if(b(C)===e){V(C,``);return}T=n,V(C,e,!0),await t(),b(w)?.querySelector(`button:not(:disabled)`)?.focus()}}async function _e(e=!1){V(C,``),e&&(await t(),T?.focus())}function ve(e,t,n){de(e,t,n),_e(!0)}function G(e){return e.button===0&&!e.metaKey&&!e.ctrlKey&&!e.shiftKey&&!e.altKey}E(()=>{V(k,z(n.workspaceID),!0)}),E(()=>{n.expanded||(V(C,``),me(),V(S,!1))});var ye=Li();y(`storage`,O,le);let be;var xe=A(ye),Se=A(xe),Ce=N(Se,2);r(xe);var we=N(xe,2),Te=A(we),Ee=e=>{var t=Ii(),r=N(ae(t),2);F(r,17,()=>b(L),e=>e.id,(e,t)=>{a(e,()=>b(t),()=>b(L),()=>`unsectioned`,()=>!1,()=>!0)});var i=N(r,2);F(i,19,()=>b(te),e=>e.key,(e,t,n)=>{s(e,()=>b(t),()=>`sidebar-channel-section-${b(n)}`,()=>!1)});var o=N(i,2),c=e=>{s(e,()=>({key:l,label:`Archived`,channels:b(P)}),()=>`sidebar-archived-channels`,()=>!0)};f(o,e=>{b(P).length>0&&e(c)});var d=N(o,2),p=e=>{var t=Fi();u(e,t)};f(d,e=>{n.channels.length===0&&e(p)}),u(e,t)},De=e=>{var t=p(),n=ae(t);F(n,17,()=>b(ne),e=>e.id,(e,t)=>{{let n=m(()=>!!b(t).archived_at);a(e,()=>b(t),()=>b(ne),()=>`priority`,()=>b(n),()=>!1)}}),u(e,t)};f(Te,e=>{n.expanded?e(Ee):e(De,-1)}),r(we);var Oe=N(we,2),ke=R(Oe,!0);r(ye),B(()=>{be=i(ye,1,`nav-section`,null,be,{collapsed:!n.expanded}),j(Se,`aria-expanded`,n.expanded),j(we,`hidden`,!n.expanded&&b(ne).length===0),c(ke,b(D))}),_(`click`,Se,function(...e){n.onToggle?.apply(this,e)}),_(`click`,Ce,function(...e){n.onCreateChannel?.apply(this,e)}),u(e,ye),g()}s([`focusout`,`click`,`keydown`]);var zi=W(` `),Bi=W(``),Vi=W(``),Hi=W(`
`),Ui=W(``),Wi=W(`
`),Gi=W(`
`);function Ki(e,t){o(t,!0);let n=U(``),a=m(()=>t.expanded?t.conversations:t.conversations.filter(e=>e.id===t.selectedDirectID||(e.unread_count||0)>0));function s(e){return e.button===0&&!e.metaKey&&!e.ctrlKey&&!e.shiftKey&&!e.altKey}function l(e){V(n,b(n)===e?``:e,!0)}function d(){V(n,``)}var p=Gi();let h;var v=A(p),y=A(v),x=N(y,2);r(v);var S=N(v,2),C=A(S);F(C,17,()=>b(a),e=>e.id,(e,a)=>{let o=m(()=>ft(b(a),t.currentUserID)),p=m(()=>b(a).unread_count||0),h=m(()=>b(a).id===t.selectedDirectID);var g=Hi();let v;var y=A(g);let x;var S=A(y);{let e=m(()=>b(o)?.id||b(a).id),t=m(()=>b(o)?.display_name),n=m(()=>mt(b(o))?void 0:b(o)?.avatar_url);pt(S,{class:`dm-avatar`,get id(){return b(e)},get name(){return b(t)},get src(){return b(n)},size:22})}var C=N(S,2),w=R(C,!0),T=N(C,2),E=e=>{var t=zi(),n=R(t,!0);B(()=>{j(t,`aria-label`,`${b(p)} unread`),c(n,b(p)>99?`99+`:b(p))}),u(e,t)},D=e=>{var t=Bi();u(e,t)};f(T,e=>{b(p)>0&&!b(h)?e(E):e(D,-1)}),r(y);var O=N(y,2),k=N(O,2),ee=e=>{var n=Vi(),r=R(n);_(`click`,r,e=>{e.preventDefault(),e.stopPropagation(),d(),t.onHideDirect(b(a).id)}),u(e,n)};f(k,e=>{b(n)===b(a).id&&e(ee)}),r(g),B((e,t,r)=>{v=i(g,1,`dm-row`,null,v,{active:b(h)}),j(y,`href`,e),x=i(y,1,`nav-item dm`,null,x,{active:b(h),"has-unread":b(p)>0&&!b(h)}),c(w,t),j(O,`aria-label`,r),j(O,`aria-expanded`,b(n)===b(a).id)},[()=>t.hrefForDirect(b(a).id),()=>ot(b(a),t.currentUserID),()=>`Direct message actions for ${ot(b(a),t.currentUserID)}`]),_(`click`,y,e=>{s(e)&&(e.preventDefault(),t.onSelectDirect(b(a).id))}),_(`click`,O,e=>{e.preventDefault(),e.stopPropagation(),l(b(a).id)}),_(`keydown`,O,e=>{e.key===`Escape`&&d()}),u(e,g)});var w=N(C,2),T=e=>{var t=Ui();u(e,t)};f(w,e=>{t.expanded&&t.conversations.length===0&&e(T)});var E=N(w,2),D=e=>{var n=Wi(),i=A(n),a=R(i),o=N(i,2);r(n),B(()=>c(a,`Closed ${t.hiddenDirectTitle??``}`)),_(`click`,o,function(...e){t.onUndoHideDirect?.apply(this,e)}),u(e,n)};f(E,e=>{t.expanded&&t.hiddenDirectTitle&&e(D)}),r(S),r(p),B(()=>{h=i(p,1,`nav-section`,null,h,{collapsed:!t.expanded}),j(y,`aria-expanded`,t.expanded),j(S,`hidden`,!t.expanded&&b(a).length===0)}),_(`click`,y,function(...e){t.onToggle?.apply(this,e)}),_(`click`,x,function(...e){t.onCreateDirect?.apply(this,e)}),u(e,p),g()}s([`click`,`keydown`]);var qi=W(``),Ji=W(`Connecting…`),Yi=W(`
`),Xi=W(` `),Zi=W(``),Qi=W(``),$i=W(``);function ea(e,t){o(t,!0);let n=C(t,`showHeader`,3,!0),a=`clickclack:sidebar-sections:v1:`,s={channels:!0,directMessages:!0,people:!0},l=U(ee({...s}));function d(e){if(!e||typeof e!=`object`)return!1;let t=e;return typeof t.channels==`boolean`&&typeof t.directMessages==`boolean`&&typeof t.people==`boolean`}function p(e){if(!e)return{...s};try{let t=window.localStorage.getItem(`${a}${e}`);if(!t)return{...s};let n=JSON.parse(t);return d(n)?n:{...s}}catch{return{...s}}}function h(e){if(V(l,{...b(l),[e]:!b(l)[e]},!0),t.workspaceID)try{window.localStorage.setItem(`${a}${t.workspaceID}`,JSON.stringify(b(l)))}catch{}}E(()=>{V(l,p(t.workspaceID),!0)});let v=U(ee([]));function x(e){V(v,e,!0);let n=t.currentUser?.id;t.workspaceID&&n&&Oi(n,t.workspaceID,e,G,()=>t.currentUser?.id===n)}function S(e){t.currentUser?.id&&(Ei(e.key,e.newValue,t.currentUser.id),e.key===Ci(t.workspaceID,t.currentUser.id)&&V(v,wi(e.newValue),!0))}let w=m(()=>{let e=new Map(t.channels.map(e=>[e.id,e]));return[...b(v).flatMap(t=>{let n=e.get(t);return n?(e.delete(t),[n]):[]}),...e.values()]});E(()=>{V(v,Di(t.currentUser,t.workspaceID),!0)});function T(e){return e.button===0&&!e.metaKey&&!e.ctrlKey&&!e.shiftKey&&!e.altKey}var D=$i();y(`storage`,O,S);var k=A(D),M=e=>{var n=Yi(),i=A(n),a=A(i),o=e=>{var n=qi();B(e=>j(n,`src`,e),[()=>_e(t.workspaceIconURL)]),u(e,n)};f(a,e=>{t.workspaceIconURL&&e(o)});var s=N(a,2),l=A(s),d=A(l),p=R(d,!0);te(2),r(l);var m=N(l,2),h=e=>{var t=Ji();u(e,t)};f(m,e=>{t.connected||e(h)}),r(s),r(i);var g=N(i,2),v=A(g),y=A(v),b=R(y);r(v),r(g),r(n),B(()=>{c(p,t.workspaceName||`Pick a workspace`),j(v,`aria-label`,t.sidebarCollapsed?`Expand sidebar`:`Collapse sidebar`),j(v,`title`,t.sidebarCollapsed?`Expand sidebar`:`Collapse sidebar`),j(b,`d`,t.sidebarCollapsed?`m9 6 6 6-6 6`:`m15 6-6 6 6 6`)}),_(`click`,i,function(...e){t.onOpenWorkspaceSettings?.apply(this,e)}),_(`click`,v,function(...e){t.onToggleCollapse?.apply(this,e)}),u(e,n)};f(k,e=>{n()&&e(M)});var P=N(k,2),I=A(P);Ri(I,{get workspaceID(){return t.workspaceID},get expanded(){return b(l).channels},get channels(){return b(w)},get selectedChannelID(){return t.selectedChannelID},get selectedDirectID(){return t.selectedDirectID},get hrefForChannel(){return t.hrefForChannel},get onSelectChannel(){return t.onSelectChannel},get onCreateChannel(){return t.onCreateChannel},onToggle:()=>h(`channels`),onReorder:x});var L=N(I,2);{let e=m(()=>t.currentUser?.id);Ki(L,{get expanded(){return b(l).directMessages},get conversations(){return t.directConversations},get currentUserID(){return b(e)},get selectedDirectID(){return t.selectedDirectID},get hrefForDirect(){return t.hrefForDirect},get onSelectDirect(){return t.onSelectDirect},get onCreateDirect(){return t.onCreateDirect},get onHideDirect(){return t.onHideDirect},get hiddenDirectTitle(){return t.hiddenDirectTitle},get onUndoHideDirect(){return t.onUndoHideDirect},onToggle:()=>h(`directMessages`)})}var ne=N(L,2);let re;var ie=A(ne),z=R(ie),ae=N(ie,2),oe=A(ae);F(oe,17,()=>t.recentPeople,e=>e.id,(e,n)=>{let a=m(()=>ut(t.directConversations,b(n).id,t.currentUser?.id));var o=Xi();let s;var l=A(o);pt(l,{class:`dm-avatar`,get id(){return b(n).id},get name(){return b(n).display_name},get src(){return b(n).avatar_url},size:22});var d=N(l,2),f=R(d,!0);te(2),r(o),B(e=>{j(o,`href`,e),s=i(o,1,`nav-item dm`,null,s,{active:b(a)?.id===t.selectedDirectID||t.selectedProfile?.id===b(n).id}),c(f,b(n).display_name)},[()=>b(a)?t.hrefForDirect(b(a).id):`#`]),_(`click`,o,e=>{if(b(a)){if(!T(e))return;e.preventDefault(),t.onSelectDirect(b(a).id)}else e.preventDefault(),t.onOpenProfile(b(n))}),u(e,o)});var se=N(oe,2),ce=e=>{var t=Zi();u(e,t)};f(se,e=>{t.recentPeople.length===0&&e(ce)}),r(ae),r(ne),r(P);var le=N(P,2),ue=e=>{var n=Qi(),i=A(n);pt(i,{class:`dm-avatar`,get id(){return t.currentUser.id},get name(){return t.currentUser.display_name},get src(){return t.currentUser.avatar_url},size:28,loading:`eager`,fetchPriority:`auto`});var a=N(i,2),o=A(a),s=R(o,!0),l=N(o,2),d=R(l,!0);r(a),te(2),r(n),B((e,r)=>{j(n,`aria-label`,e),c(s,t.currentUser.display_name),c(d,r)},[()=>`Account settings for ${t.currentUser.display_name} ${lt(t.currentUser.handle)}`,()=>t.currentUser.handle?lt(t.currentUser.handle):t.connected?`Active`:`Reconnecting…`]),_(`click`,n,function(...e){t.onOpenSettings?.apply(this,e)}),_(`contextmenu`,n,e=>{e.preventDefault(),t.onOpenSettings()}),u(e,n)};f(le,e=>{t.currentUser&&e(ue)}),r(D),B(()=>{re=i(ne,1,`nav-section`,null,re,{collapsed:!b(l).people}),j(z,`aria-expanded`,b(l).people),j(ae,`hidden`,!b(l).people)}),_(`click`,z,()=>h(`people`)),u(e,D),g()}s([`click`,`contextmenu`]);var ta=W(`
Loading...
`),na=W(`
`),ra=W(`
`),ia=W(`

No pinned messages

Pin important messages to keep them easily accessible.

`),aa=W(`
`),oa=W(`
`),sa=W(`
`),ca=W(` `,1),la=W(`

Pinned Messages

`);function ua(e,t){o(t,!0);let i=C(t,`loading`,3,!1),a=C(t,`error`,3,``),s=C(t,`topics`,19,()=>[]),l=C(t,`mentionPeople`,19,()=>[]),d=C(t,`maxPins`,3,100),p=U(ee(new Set)),v=U(``);async function y(e){if(!b(p).has(e.id)){V(p,new Set(b(p)).add(e.id),!0),V(v,``);try{await t.onUnpin(e)}catch(e){V(v,e instanceof Error?e.message:`Could not unpin message`,!0)}finally{let t=new Set(b(p));t.delete(e.id),V(p,t,!0)}}}var x=la(),S=A(x),w=A(S),T=A(w),E=N(A(T),2),D=R(E);r(T);var O=N(T,2),k=R(O);r(w);var M=N(w,2);r(S);var P=N(S,2),I=A(P),L=e=>{var t=ta();u(e,t)},te=e=>{var t=na(),n=R(t,!0);B(()=>c(n,a())),u(e,t)},ne=e=>{var i=ca(),a=ae(i),o=e=>{var t=ra(),n=R(t,!0);B(()=>c(n,b(v))),u(e,t)};f(a,e=>{b(v)&&e(o)});var d=N(a,2),g=e=>{var t=ia();u(e,t)},x=e=>{var i=sa();F(i,21,()=>t.messages,e=>e.id,(e,i)=>{let a=m(()=>s().find(e=>e.id===b(i).topic_id));var o=oa(),d=A(o),g=A(d),v=R(g,!0),x=N(g,2),S=R(x,!0);r(d);var C=N(d,2);_t(C,{get topic(){return b(a)},get onSelect(){return t.onSelectTopic}});var w=N(C,2);n(w,()=>Z(b(i).body),!0),r(w),h(w,e=>Ge?.(e)),h(w,(e,t)=>et?.(e,t),()=>({people:l(),attentionUserID:t.mentionAttentionUserID}));var T=N(w,2),E=e=>{var n=aa();F(n,21,()=>b(i).attachments,e=>e.id,(e,n)=>{{let r=m(()=>Ve(b(n)));Q(e,{get upload(){return b(n)},get url(){return b(r)},get onOpenImage(){return t.onOpenImage},get onOpenArtifact(){return t.onOpenArtifact}})}}),r(n),u(e,n)};f(T,e=>{b(i).attachments?.length&&e(E)});var D=N(T,2),O=A(D),k=N(O,2);r(D),r(o),B((e,t)=>{j(o,`data-message-id`,b(i).id),c(v,b(i).author?.display_name||`Unknown`),c(S,e),k.disabled=t},[()=>X(b(i).created_at),()=>b(p).has(b(i).id)]),_(`click`,O,()=>t.onOpenThread(b(i))),_(`click`,k,()=>y(b(i))),u(e,o)}),r(i),u(e,i)};f(d,e=>{t.messages.length===0?e(g):e(x,-1)}),u(e,i)};f(I,e=>{i()?e(L):a()?e(te,1):e(ne,-1)}),r(P),r(x),B(()=>{c(D,`${t.messages.length??``} / ${d()??``} pinned`),c(k,`Shared across this channel, with a maximum of ${d()??``} messages.`)}),_(`click`,M,function(...e){t.onClose?.apply(this,e)}),u(e,x),g()}s([`click`]);var da=W(` `,1),fa=W(`
`),pa=W(`
We couldn’t search messages

`),ma=W(`
No messages found

Try another word or phrase.

`),ha=W(`deleted bot`),ga=W(` `),_a=W(` `),va=W(` `),ya=W(` Reply in thread`),ba=W(` `),xa=W(`
  • `),Sa=W(``),Ca=W(``),wa=W(``),Ta=W(`
      `,1),Ea=W(``);function Da(e,t){o(t,!0);let n=C(t,`covered`,3,!1),a=C(t,`inert`,3,!1),s=new Intl.DateTimeFormat(void 0,{hour:`2-digit`,minute:`2-digit`}),l=new Intl.DateTimeFormat(void 0,{month:`short`,day:`numeric`}),h=new Intl.DateTimeFormat(void 0,{month:`short`,day:`numeric`,year:`numeric`});function y(e,t){let n=Array.from(e),r=[],i=0;for(let e of t){let t=Math.max(i,Math.min(n.length,e.start)),a=Math.max(t,Math.min(n.length,e.end));t>i&&r.push({text:n.slice(i,t).join(``),highlighted:!1}),a>t&&r.push({text:n.slice(t,a).join(``),highlighted:!0}),i=a}return i{var t=v(`Searching messages…`);u(e,t)},te=e=>{var n=da(),r=ae(n),i=N(r),a=e=>{var n=v();B(()=>c(n,`in ${t.session.scope.label??``}`)),u(e,n)};f(i,e=>{t.session.scope.label&&e(a)}),B(()=>c(r,`${t.session.results.length??``}${t.session.nextCursor?`+`:``} - ${t.session.results.length===1&&!t.session.nextCursor?`result`:`results`}`)),u(e,n)},ne=e=>{var t=v(`Search unavailable`);u(e,t)};f(I,e=>{t.session.state===`loading`?e(L):t.session.state===`ready`?e(te,1):t.session.state===`error`&&e(ne,2)}),r(P);var re=N(P,2),ie=A(re),z=e=>{var t=fa();u(e,t)},oe=e=>{var n=pa(),i=N(A(n),4),a=R(i,!0);r(n),B(()=>c(a,t.session.error)),u(e,n)},se=e=>{var t=ma();u(e,t)},ce=e=>{var n=Ta(),a=ae(n);F(a,21,()=>t.session.results,e=>e.id,(e,n)=>{let a=m(()=>t.contextFor(b(n)));var o=xa(),s=A(o);let l;var h=A(s);{let e=m(()=>mt(b(n).author)?void 0:b(n).author.avatar_url);pt(h,{class:`dm-avatar`,get id(){return b(n).author.id},get name(){return b(n).author.display_name},get src(){return b(e)},size:30})}var g=N(h,2),S=A(g),C=A(S),w=R(C,!0),T=N(C,2),E=e=>{var t=ha();u(e,t)},D=m(()=>mt(b(n).author)),O=e=>{var t=ga(),r=R(t,!0);B(e=>c(r,e),[()=>lt(st(b(n).author))]),u(e,t)},k=m(()=>st(b(n).author));f(T,e=>{b(D)?e(E):b(k)&&e(O,1)});var ee=N(T,2),M=R(ee,!0);r(S);var P=N(S,2);F(P,21,()=>y(b(n).snippet,b(n).highlights),d,(e,t)=>{var n=p(),r=ae(n),i=e=>{var n=_a(),r=R(n,!0);B(()=>c(r,b(t).text)),u(e,n)},a=e=>{var n=v();B(()=>c(n,b(t).text)),u(e,n)};f(r,e=>{b(t).highlighted?e(i):e(a,-1)}),u(e,n)}),r(P);var I=N(P,2),L=A(I),te=e=>{var t=va(),n=R(t,!0);B(()=>c(n,b(a))),u(e,t)};f(L,e=>{b(a)&&e(te)});var ne=N(L,2),re=e=>{var t=ya();u(e,t)},ie=e=>{var t=ba(),i=N(A(t));r(t),B(()=>c(i,` ${b(n).reply_count??``} ${b(n).reply_count===1?`reply`:`replies`}`)),u(e,t)};f(ne,e=>{b(n).parent_message_id?e(re):b(n).reply_count>0&&e(ie,1)}),r(I),r(g),r(s),r(o),B(e=>{l=i(s,1,`search-result`,null,l,{"is-active":t.session.activeResultID===b(n).id}),j(s,`data-result-id`,b(n).id),c(w,b(n).author.display_name||`Local User`),j(ee,`datetime`,b(n).created_at),c(M,e)},[()=>x(b(n).created_at)]),_(`click`,s,()=>t.onOpenResult(b(n))),u(e,o)}),r(a);var o=N(a,2),s=e=>{var n=Sa(),i=A(n),a=R(i,!0),o=N(i,2);r(n),B(()=>c(a,t.session.moreError)),_(`click`,o,function(...e){t.onLoadMore?.apply(this,e)}),u(e,n)},l=e=>{var n=Ca(),r=R(n,!0);B(()=>{n.disabled=t.session.loadingMore,c(r,t.session.loadingMore?`Loading more…`:`Load more results`)}),_(`click`,n,function(...e){t.onLoadMore?.apply(this,e)}),u(e,n)},h=e=>{var t=wa();u(e,t)};f(o,e=>{t.session.moreError?e(s):t.session.nextCursor?e(l,1):e(h,-1)}),u(e,n)};f(ie,e=>{t.session.state===`loading`?e(z):t.session.state===`error`?e(oe,1):t.session.results.length===0?e(se,2):e(ce,-1)}),r(re),r(S),B(()=>{w=i(S,1,`search-results`,null,w,{covered:n()}),S.inert=a(),j(S,`aria-hidden`,n()?`true`:void 0),c(O,`Search${t.session.scope.label?` in ${t.session.scope.label}`:``}`),c(ee,`Results for “${t.session.query??``}”`)}),_(`click`,M,function(...e){t.onClose?.apply(this,e)}),u(e,S),g()}s([`click`]);var Oa=W(``),ka=W(`
      `),Aa=W(`

      `,1),ja=W(`
      `),Ma=W(``);function Na(e,t){o(t,!0);let n=C(t,`saving`,3,!1),i=C(t,`error`,3,``),a=U(!1),s=m(()=>!!t.channel.archived_at),l=m(()=>`#${bt(t.channel)}`);function d(){n()||t.onClose()}var p=Ma(),h=A(p),v=N(h,2),y=A(v),x=N(A(y),2);r(y);var S=N(y,2),w=A(S),T=A(w),E=R(T,!0);te(2),r(w);var D=N(w,2),O=e=>{var t=Oa(),n=R(t,!0);B(()=>c(n,i())),u(e,t)};f(D,e=>{i()&&e(O)});var k=N(D,2),j=e=>{var i=ka(),a=A(i),o=N(a,2),s=R(o,!0);r(i),B(()=>{a.disabled=n(),o.disabled=n(),c(s,n()?`Restoring...`:`Restore channel`)}),_(`click`,a,d),_(`click`,o,()=>t.onArchivedChange(!1)),u(e,i)},ee=e=>{var i=Aa(),o=ae(i),s=R(o),d=N(o,2),f=A(d),p=N(f,2),m=R(p,!0);r(d),B(()=>{c(s,`Archive ${b(l)??``}? The channel will remain available to workspace members under Archived.`),f.disabled=n(),p.disabled=n(),c(m,n()?`Archiving...`:`Archive channel`)}),_(`click`,f,()=>V(a,!1)),_(`click`,p,()=>t.onArchivedChange(!0)),u(e,i)},M=e=>{var t=ja(),i=A(t),o=N(i,2);r(t),B(()=>{i.disabled=n(),o.disabled=n()}),_(`click`,i,d),_(`click`,o,()=>V(a,!0)),u(e,t)};f(k,e=>{b(s)?e(j):b(a)?e(ee,1):e(M,-1)}),r(S),r(v),r(p),B(()=>{h.disabled=n(),x.disabled=n(),c(E,b(l))}),_(`click`,h,d),_(`click`,x,d),u(e,p),g()}s([`click`]);var Pa=W(`

      `),Fa=W(``),$=W(`
      `);function Ia(e,t){o(t,!0);let n=U(!1),a=U(``),s=U(!1),l=new AbortController;re(()=>l.abort());async function d(){if(!b(n)){V(n,!0),V(a,``),V(s,!1);try{let e=await Ce({method:`PATCH`,body:JSON.stringify(t.payload()),signal:l.signal});l.signal.throwIfAborted(),t.onUserUpdated(e.user),V(a,`Saved`),t.onSaved?.()}catch(e){if(l.signal.aborted)return;V(a,xe(e,`Could not save ${t.section}`),!0),V(s,!0)}finally{V(n,!1)}}}var p=$(),m=A(p),h=A(m);L(h,()=>t.children),r(m);var _=N(m,2),v=A(_),x=e=>{var t=Pa();let n;var r=R(t,!0);B(()=>{n=i(t,1,`settings-status`,null,n,{"is-error":b(s)}),c(r,b(a))}),u(e,t)},S=e=>{var t=Fa();u(e,t)};f(v,e=>{b(a)?e(x):e(S,-1)});var C=N(v,2),w=R(C,!0);r(_),r(p),B(()=>{m.disabled=b(n),C.disabled=b(n),c(w,b(n)?`Saving...`:`Save ${t.section}`)}),y(`submit`,p,e=>{e.preventDefault(),d()}),u(e,p),g()}var La=W(`

      Browser notifications are not supported on this device.

      `),Ra=W(`

      Browser notifications are blocked by this browser.

      `),za=W(`

      `),Ba=W(`

      Show alerts when ClickClack is in the background.

      `);function Va(e,t){o(t,!0);let n=C(t,`isDesktop`,3,!1),a=U(!1),s=U(!1),l=U(`default`),d=U(``),p=U(!1);E(()=>{m(t.user.id,n())});function m(e,n){if(n){V(a,!0),V(l,`granted`),V(s,It(e),!0),t.onChanged?.(b(s));return}V(a,typeof Notification<`u`),V(l,b(a)?Notification.permission:`unsupported`,!0);let r=It(e);V(s,b(l)===`granted`&&r,!0),r&&b(l)!==`granted`&&Lt(e,!1),t.onChanged?.(b(s))}async function h(e){if(V(d,``),V(p,!1),!e){Lt(t.user.id,!1),V(s,!1),t.onChanged?.(!1),V(d,n()?`Desktop notifications disabled`:`Browser notifications disabled`,!0);return}if(n()){V(s,Lt(t.user.id,!0),!0),t.onChanged?.(b(s)),V(d,b(s)?`Desktop notifications enabled`:`Desktop notification preference could not be saved`,!0),V(p,!b(s));return}if(typeof Notification>`u`){V(a,!1),V(l,`unsupported`),V(s,!1),t.onChanged?.(!1),V(d,`Browser notifications are not supported`),V(p,!0);return}if(V(l,Notification.permission==="default"?await Notification.requestPermission():Notification.permission,!0),V(a,!0),b(l)===`granted`){V(s,Lt(t.user.id,!0),!0),t.onChanged?.(b(s)),V(d,b(s)?`Browser notifications enabled`:`Browser notification preference could not be saved`,!0),V(p,!b(s));return}Lt(t.user.id,!1),V(s,!1),t.onChanged?.(!1),V(d,b(l)===`denied`?`Browser notifications are blocked by this browser`:`Browser notifications were not enabled`,!0),V(p,!0)}var v=Ba(),y=A(v),S=A(y),w=R(S,!0),T=N(S,4),D=e=>{var t=La();u(e,t)},O=e=>{var t=Ra();u(e,t)};f(T,e=>{!n()&&!b(a)?e(D):!n()&&b(l)===`denied`&&e(O,1)});var k=N(T,2),ee=e=>{var t=za();let n;var r=R(t,!0);B(()=>{n=i(t,1,`settings-row2__hint`,null,n,{"is-error":b(p)}),c(r,b(d))}),u(e,t)};f(k,e=>{b(d)&&e(ee)}),r(y);var P=N(y,2),F=A(P);M(F),r(P),r(v),B(()=>{c(w,n()?`Desktop notifications`:`Browser notifications`),j(F,`aria-label`,n()?`Desktop notifications`:`Browser notifications`),F.disabled=!b(a)||b(l)===`denied`,x(F,b(s))}),_(`change`,F,e=>void h(e.currentTarget.checked)),u(e,v),g()}s([`change`]);var Ha=W(``),Ua=W(`
      Preview

      Shown in messages, mentions, and your profile card.

      Used in mentions and the quick switcher. Must be unique.

      Paste a public image URL. Your initials show when empty.

      Conversation display

      Keep agent reasoning summaries out of the message timeline.

      Hide tool execution details while keeping ordinary messages visible.

      Choose which side of the timeline shows your messages.

      Choose which side of the timeline shows messages from other people and agents.

      Notifications

      `,1);function Wa(e,t){o(t,!0);let n=C(t,`isDesktop`,3,!1),i=U(``),a=U(``),s=U(``),l=m(()=>b(i).trim()||t.user.display_name||`Your name`),d=m(()=>b(a).trim().replace(/^@+/,``)||t.user.handle||``);E(()=>{V(i,t.user.display_name,!0),V(a,t.user.handle??``,!0),V(s,t.user.avatar_url,!0)});function p(){V(s,``)}Ia(e,{section:`profile`,get onUserUpdated(){return t.onUserUpdated},get onSaved(){return t.onSaved},payload:()=>({display_name:b(i),handle:b(a).trim().replace(/^@+/,``),avatar_url:b(s)}),children:(e,o)=>{var m=Ua(),h=ae(m),g=A(h);pt(g,{get id(){return t.user.id},get name(){return b(l)},get src(){return b(s)},size:52,loading:`eager`,fetchPriority:`auto`});var v=N(g,2),y=A(v),S=R(y,!0),C=N(y,2),w=R(C,!0);r(v),te(2),r(h);var E=N(h,2),D=A(E),O=N(A(D),2),k=A(O);M(k),r(O),r(D);var j=N(D,2),ee=N(A(j),2),P=A(ee),F=N(A(P),2);M(F),r(P),r(ee),r(j);var I=N(j,2),L=N(A(I),2),ne=A(L);M(ne);var re=N(ne,2),ie=e=>{var t=Ha();_(`click`,t,p),u(e,t)};f(re,e=>{b(s)&&e(ie)}),r(L),r(I);var oe=N(I,4),se=N(A(oe),2),ce=A(se);M(ce),r(se),r(oe);var le=N(oe,2),H=N(A(le),2),U=A(H);M(U),r(H),r(le);var W=N(le,2),de=N(A(W),2),fe=A(de),pe=A(fe);pe.value=pe.__value=`left`;var me=N(pe);me.value=me.__value=`right`,r(fe);var he;T(fe),r(de),r(W);var ge=N(W,2),_e=N(A(ge),2),ve=A(_e),G=A(ve);G.value=G.__value=`left`;var ye=N(G);ye.value=ye.__value=`right`,r(ve);var be;T(ve),r(_e),r(ge),Va(N(ge,4),{get user(){return t.user},get isDesktop(){return n()},get onChanged(){return t.onBrowserNotificationsChanged}}),r(E),B(()=>{c(S,b(l)),c(w,b(d)?`@${b(d)}`:`No handle set`),x(ce,t.hideCommentary),x(U,t.hideToolCalls),he!==(he=t.userAlign)&&(fe.value=(fe.__value=he)??``,ue(fe,he)),be!==(be=t.otherAlign)&&(ve.value=(ve.__value=be)??``,ue(ve,be))}),z(k,()=>b(i),e=>V(i,e)),z(F,()=>b(a),e=>V(a,e)),z(ne,()=>b(s),e=>V(s,e)),_(`change`,ce,e=>t.onHideCommentary(e.currentTarget.checked)),_(`change`,U,e=>t.onHideToolCalls(e.currentTarget.checked)),_(`change`,fe,e=>t.onUserAlign(e.currentTarget.value===`right`?`right`:`left`)),_(`change`,ve,e=>t.onOtherAlign(e.currentTarget.value===`right`?`right`:`left`)),u(e,m)},$$slots:{default:!0}}),g()}s([`click`,`change`]);var Ga=W(`

      Add ClickClack to your Home Screen from the Share menu, then open it from there to turn this on.

      `),Ka=W(`

      This browser does not support push notifications.

      `),qa=W(`

      `),Ja=W(`

      `),Ya=W(`

      Receive alerts when the app is closed.

      `);function Xa(e,t){o(t,!0);let n=C(t,`isDesktop`,3,!1),a=`This browser is now signed in to a different account. Reload to continue.`,s=U(!1),l=U(!1),d=U(!1),h=U(!1),v=U(``),y=U(!1);E(()=>{S(t.user.id,n())});async function S(e,t){if(t){V(s,!1);return}V(l,zt(),!0);try{let t=b(l)?await an():null,n=await tn(t),r=n.enabled&&await on()!==e;if(V(s,n.enabled,!0),!n.enabled)return;if(r){V(d,!1),V(v,a),V(y,!0);return}V(d,!!t&&Zt(e)&&n.this_device,!0),!t&&Zt(e)&&Qt(e,!1)}catch{V(s,!1)}}async function w(e){let t=e.checked;V(v,``),V(y,!1),V(h,!0);try{t?await T():await D()}catch(e){t&&V(d,!1),V(v,xe(e,t?`Push notifications could not be turned on`:`Push notifications could not be turned off`),!0),V(y,!0)}finally{V(h,!1),e.checked=b(d)}}async function T(){let e=Notification.permission==="default"?await Notification.requestPermission():Notification.permission;if(e!==`granted`){V(d,!1),V(v,e===`denied`?`Notifications are blocked for this site. Allow them in your browser settings, then try again.`:`Notifications were not enabled.`,!0),V(y,!0);return}let[n,r]=await Promise.all([an().then(tn),on()]);if(!n.enabled){V(s,!1);return}if(r!==t.user.id){V(d,!1),V(v,a),V(y,!0);return}await sn(await rn(await nn(),n,t.user.id),t.user.id),Qt(t.user.id,!0),V(d,!0),V(v,`On for this device`)}async function D(){if(await on()!==t.user.id){V(v,a),V(y,!0);return}let e=await an();e&&await cn(e.endpoint,t.user.id),Qt(t.user.id,!1),en(t.user.id,``),V(d,!1),e&&(await e.unsubscribe(),V(v,`Off for this device`))}let O=m(()=>!b(l)&&Vt()&&!Bt());var k=p(),j=ae(k),ee=e=>{var t=Ya(),n=A(t),a=N(A(n),4),o=e=>{var t=Ga();u(e,t)},s=e=>{var t=Ka();u(e,t)},p=e=>{var t=qa(),n=R(t);B(e=>c(n,`On for ${e??``}`),[()=>Ht()]),u(e,t)};f(a,e=>{b(O)?e(o):b(l)?b(d)&&e(p,2):e(s,1)});var m=N(a,2),g=e=>{var t=Ja();let n;var r=R(t,!0);B(()=>{n=i(t,1,`settings-row2__hint`,null,n,{"is-error":b(y)}),c(r,b(v))}),u(e,t)};f(m,e=>{b(v)&&e(g)}),r(n);var S=N(n,2),C=A(S);M(C),r(S),r(t),B(()=>{C.disabled=!b(l)||b(h),x(C,b(d))}),_(`change`,C,e=>void w(e.currentTarget)),u(e,t)};f(j,e=>{b(s)&&e(ee)}),u(e,k),g()}s([`change`]);var Za=W(`

      Desktop

      Mobile push

      Send push notifications to your phone via Pushover.

      Find this in your Pushover dashboard under "Your User Key".

      `);function Qa(e,t){o(t,!0);let n=C(t,`isDesktop`,3,!1),i=U(!1),a=U(``);E(()=>{V(i,t.user.notification_settings?.pushover_enabled??!1,!0),V(a,t.user.notification_settings?.pushover_user_key??``,!0)}),Ia(e,{section:`notifications`,get onUserUpdated(){return t.onUserUpdated},payload:()=>({notification_settings:{pushover_enabled:b(i),pushover_user_key:b(a)}}),children:(e,o)=>{var s=Za(),c=N(A(s),2);Va(c,{get user(){return t.user},get isDesktop(){return n()},get onChanged(){return t.onBrowserNotificationsChanged}});var l=N(c,4);Xa(l,{get user(){return t.user},get isDesktop(){return n()}});var d=N(l,2),f=N(A(d),2),p=A(f);M(p),r(f),r(d);var m=N(d,2),h=N(A(m),2),g=A(h);M(g),r(h),r(m),r(s),D(p,()=>b(i),e=>V(i,e)),z(g,()=>b(a),e=>V(a,e)),u(e,s)},$$slots:{default:!0}}),g()}var $a=W(`

      Loading…

      `),eo=W(`

      `),to=W(`
      You don't own any bots yet. Open a workspace's Bots & agents page to mint one.
      `),no=W(``),ro=W(`
    • `),io=W(`

        `),ao=W(`
        `),oo=W(`

        Account

        My bots

        Bots you own across your workspaces. Tokens live with the workspace where the bot was created.

        `,1);function so(e,t){o(t,!0);let n=U(ee([])),i=U(`loading`),a=U(``);oe(()=>{s()});async function s(){V(i,`loading`);try{V(n,await wt(),!0),V(i,`ready`)}catch(e){V(i,`error`),V(a,Tt(e),!0)}}function l(e){t.onClose(),fe(Re(e.workspace.route_id||e.workspace.id,`bots`))}function d(e){return e.startsWith(`@`)?e:`@${e}`}function p(e){let t=e.trim().split(/\s+/).filter(Boolean);return t.length>=2?(t[0][0]+t[1][0]).toUpperCase():e.slice(0,2).toUpperCase()}let h=m(()=>{let e=new Map;for(let t of b(n)){let n=t.workspace.id,r=e.get(n);r?r.entries.push(t):e.set(n,{workspace:t.workspace,entries:[t]})}return[...e.values()].sort((e,t)=>e.workspace.name.localeCompare(t.workspace.name))});var y=oo(),x=N(ae(y),2),S=e=>{var t=$a();u(e,t)},C=e=>{var t=eo(),n=R(t,!0);B(()=>c(n,b(a))),u(e,t)},w=e=>{var t=to();u(e,t)},T=e=>{var t=ao();F(t,21,()=>b(h),e=>e.workspace.id,(e,t)=>{var n=io(),i=A(n),a=A(i),o=R(a,!0),s=N(a,2);r(i);var m=N(i,2);F(m,21,()=>b(t).entries,e=>e.bot.id,(e,t)=>{var n=ro(),i=A(n),a=A(i),o=e=>{var n=no();B(()=>j(n,`src`,b(t).bot.avatar_url)),u(e,n)},s=e=>{var n=v();B(e=>c(n,e),[()=>p(b(t).bot.display_name||b(t).bot.handle||`?`)]),u(e,n)};f(a,e=>{b(t).bot.avatar_url?e(o):e(s,-1)}),r(i);var m=N(i,2),h=A(m),g=R(h,!0),y=N(h,2),x=A(y),S=R(x,!0),C=N(x,4),w=R(C);r(y),r(m);var T=N(m,2);r(n),B(e=>{c(g,b(t).bot.display_name||b(t).bot.handle),c(S,e),c(w,`${b(t).active_token_count??``} - active ${b(t).active_token_count===1?`token`:`tokens`}`)},[()=>d(b(t).bot.handle)]),_(`click`,T,()=>l(b(t))),u(e,n)}),r(m),r(n),B(()=>c(o,b(t).workspace.name)),_(`click`,s,()=>l(b(t).entries[0])),u(e,n)}),r(t),u(e,t)};f(x,e=>{b(i)===`loading`?e(S):b(i)===`error`?e(C,1):b(n).length===0?e(w,2):e(T,-1)}),u(e,y),g()}s([`click`]);function co(e,t){return t.includes(`password`)&&e.password_enrolled===!0}function lo(e,t,n){return e?t?[...t].length<8?`New password must be at least 8 characters.`:t===n?``:`New passwords do not match.`:`Enter a new password.`:`Enter your current password.`}var uo=W(`

        `),fo=W(``),po=W(`
        Change password

        Pick a new password for signing in. Your other devices are signed out.

        The password you signed in with.

        At least 8 characters. Longer is better than clever.

        Type it once more so a typo cannot lock you out.

        `);function mo(e,t){o(t,!0);let n=U(``),a=U(``),s=U(``),l=U(``),d=U(!1),p=U(!1);async function m(){if(b(p))return;let e=lo(b(n),b(a),b(s));if(e){V(l,e,!0),V(d,!0);return}V(p,!0),V(l,``),V(d,!1);try{await G(`/api/auth/password/change`,{method:`POST`,body:JSON.stringify({current_password:b(n),new_password:b(a)})}),V(n,``),V(a,``),V(s,``),V(l,`Password updated. Your other devices were signed out.`)}catch(e){V(l,xe(e,`Could not change your password`),!0),V(d,!0)}finally{V(p,!1)}}var h=po(),_=N(A(h),2),v=A(_),x=N(A(v),2),S=A(x);M(S),r(x),r(v);var C=N(v,2),w=N(A(C),2),T=A(w);M(T),r(w),r(C);var E=N(C,2),D=N(A(E),2),O=A(D);M(O),r(D),r(E),r(_);var k=N(_,2),j=A(k),ee=e=>{var t=uo();let n;var r=R(t,!0);B(()=>{n=i(t,1,`settings-status`,null,n,{"is-error":b(d)}),c(r,b(l))}),u(e,t)},P=e=>{var t=fo();u(e,t)};f(j,e=>{b(l)?e(ee):e(P,-1)});var F=N(j,2),I=R(F,!0);r(k),r(h),B(()=>{F.disabled=b(p),c(I,b(p)?`Updating...`:`Update password`)}),y(`submit`,h,e=>{e.preventDefault(),m()}),z(S,()=>b(n),e=>V(n,e)),z(T,()=>b(a),e=>V(a,e)),z(O,()=>b(s),e=>V(s,e)),u(e,h),g()}var ho=W(``),go=W(``),_o=W(`

        Account

        Appearance

        Changes apply instantly and follow your account on every device.

        Live preview — updates as you pick

        Color mode System follows your OS setting
        Board theme Palette for boards, accents, and highlights
        Message layout How agent activity attaches to replies
        Density Compact fits more messages on screen
        `,1);function vo(e,t){o(t,!0);let n=m(()=>t.user.display_name||t.user.handle||`You`),a=m(()=>(b(n)[0]??`Y`).toUpperCase()),s=U(ee(Se())),l=U(ee(Me())),d=U(ee(Pe())),f=U(ee(De()));E(()=>{t.user.appearance_preferences,V(s,Se(),!0),V(l,Me(),!0),V(d,Pe(),!0),V(f,De(),!0)});function p(e){V(s,e,!0),Ae(e)}function h(e){V(l,e,!0),we(e)}function v(e){V(d,e,!0),Te(e)}function y(e){V(f,e,!0),Oe(e)}function x(e,t,n,r){let i;switch(e.key){case`ArrowRight`:case`ArrowDown`:i=(n+1)%t;break;case`ArrowLeft`:case`ArrowUp`:i=(n-1+t)%t;break;case`Home`:i=0;break;case`End`:i=t-1;break;default:return}e.preventDefault(),r(i),(e.currentTarget.parentElement?.querySelectorAll(`[role="radio"]`))?.item(i).focus()}var S=_o(),C=N(ae(S),2),w=A(C),T=N(A(w),2),D=A(T),O=A(D),k=R(O,!0),M=N(O,2),P=A(M),I=A(P),L=R(I,!0);te(2),r(P),te(2),r(M),r(D);var ne=N(D,4),re=A(ne),ie=R(re,!0),z=N(re,2),oe=A(z),se=A(oe),ce=R(se,!0);te(2),r(oe),te(2),r(z),r(ne),r(T),r(w);var le=N(w,4),ue=A(le),H=N(A(ue),2);F(H,23,()=>ke,e=>e.id,(e,t,n)=>{var r=ho();let a;var o=R(r,!0);B(()=>{a=i(r,1,`appearance-seg__btn`,null,a,{"is-active":b(s)===b(t).id}),j(r,`aria-checked`,b(s)===b(t).id),j(r,`tabindex`,b(s)===b(t).id?0:-1),c(o,b(t).label)}),_(`click`,r,()=>p(b(t).id)),_(`keydown`,r,e=>x(e,ke.length,b(n),e=>p(ke[e].id))),u(e,r)}),r(H),r(ue);var W=N(ue,2),de=N(A(W),2),fe=A(de),pe=R(fe,!0),me=N(fe,2);F(me,23,()=>Ne,e=>e.id,(e,t,n)=>{var r=go();let a;B(()=>{a=i(r,1,`board-chip`,null,a,{"is-active":b(l)===b(t).id}),j(r,`aria-checked`,b(l)===b(t).id),j(r,`tabindex`,b(l)===b(t).id?0:-1),j(r,`data-board`,b(t).id),j(r,`aria-label`,`${b(t).label} — ${b(t).blurb}`),j(r,`title`,`${b(t).label} — ${b(t).blurb}`)}),_(`click`,r,()=>h(b(t).id)),_(`keydown`,r,e=>x(e,Ne.length,b(n),e=>h(Ne[e].id))),u(e,r)}),r(me),r(de),r(W);var he=N(W,2),ge=N(A(he),2);F(ge,23,()=>Ee,e=>e.id,(e,t,n)=>{var r=ho();let a;var o=R(r,!0);B(()=>{a=i(r,1,`appearance-seg__btn`,null,a,{"is-active":b(d)===b(t).id}),j(r,`aria-checked`,b(d)===b(t).id),j(r,`tabindex`,b(d)===b(t).id?0:-1),j(r,`title`,b(t).blurb),c(o,b(t).label)}),_(`click`,r,()=>v(b(t).id)),_(`keydown`,r,e=>x(e,Ee.length,b(n),e=>v(Ee[e].id))),u(e,r)}),r(ge),r(he);var _e=N(he,2),ve=N(A(_e),2);F(ve,23,()=>je,e=>e.id,(e,t,n)=>{var r=ho();let a;var o=R(r,!0);B(()=>{a=i(r,1,`appearance-seg__btn`,null,a,{"is-active":b(f)===b(t).id}),j(r,`aria-checked`,b(f)===b(t).id),j(r,`tabindex`,b(f)===b(t).id?0:-1),j(r,`title`,b(t).blurb),c(o,b(t).label)}),_(`click`,r,()=>y(b(t).id)),_(`keydown`,r,e=>x(e,je.length,b(n),e=>y(je[e].id))),u(e,r)}),r(ve),r(_e),r(le),r(C),B(e=>{j(w,`data-layout`,b(d)),j(w,`data-density`,b(f)),c(k,b(a)),c(L,b(n)),c(ie,b(a)),c(ce,b(n)),c(pe,e)},[()=>Ne.find(e=>e.id===b(l))?.label]),u(e,S),g()}s([`click`,`keydown`]);var yo=W(` `,1),bo=W(` `,1),xo=W(` `,1),So=W(` `,1),Co=W(`
      • `),wo=W(``),To=W(`

        Workspace

        `,1),Eo=W(`

        `),Do=W(`
      • `),Oo=W(`
          `),ko=W(`

          Loading...

          `),Ao=W(`

          `),jo=W(`

          `),Mo=W(`

          Account

          Profile settings

          How you appear across ClickClack.

          Sign out

          End this session on this device.

          `,1),No=W(`

          Account

          Notifications

          Decide when and how ClickClack should reach you.

          `,1),Po=W(``);function Fo(e,t){o(t,!0);let n=C(t,`workspaces`,19,()=>[]),a=C(t,`currentWorkspaceID`,3,``),s=C(t,`initialSection`,3,Ie),l=C(t,`isDesktop`,3,!1),d=U(``),h=m(()=>n().find(e=>e.id===b(d))??K(n(),a())),v=U(!1),x=U(``),S=U(ee(Ie)),w=m(()=>co(t.user,ge())),D=U(`loading`),k=U(``);E(()=>{V(S,s(),!0)}),E(()=>{b(S);let e=new AbortController;return P(e.signal),()=>e.abort()});async function M(){if(!b(v)){V(v,!0),V(x,``);try{await G(`/api/auth/logout`,{method:`POST`,body:JSON.stringify({})}),window.location.reload()}catch(e){V(x,xe(e,`Could not sign out. Try again.`),!0),V(v,!1)}}}async function P(e){V(D,`loading`),V(k,``);try{let n=await Ce({signal:e});e.throwIfAborted(),t.onUserUpdated(n.user),V(D,`ready`)}catch(t){if(e.aborted)return;if(t instanceof be&&(t.status===401||t.status===403)){V(D,`error`),V(k,`Sign in to manage your account`);return}V(D,`error`),V(k,t instanceof Error?t.message:`Could not load your account`,!0)}}function I(e){e.target===e.currentTarget&&t.onClose()}function L(e){if(e.key!==`Escape`)return;let n=e.target;(!n||n.tagName!==`INPUT`&&n.tagName!==`TEXTAREA`&&!n.isContentEditable)&&(e.preventDefault(),t.onClose())}function te(e,n){t.onClose(),fe(Re(e.route_id||e.id,n))}var ne=Po();y(`keydown`,O,L);var re=A(ne),ie=A(re),z=N(ie,2),oe=A(z),se=N(A(oe),2);F(se,21,()=>q,e=>e.id,(e,n)=>{var a=Co(),o=A(a);let s;var l=A(o),d=e=>{var r=yo(),i=ae(r);pt(i,{class:`settings-modal__rail-avatar`,get id(){return t.user.id},get name(){return t.user.display_name},get src(){return t.user.avatar_url},size:18});var a=N(i,2),o=R(a,!0);B(()=>c(o,t.user.display_name||b(n).label)),u(e,r)},p=e=>{var t=bo(),r=N(ae(t),2),i=R(r,!0);B(()=>c(i,b(n).label)),u(e,t)},m=e=>{var t=xo(),r=N(ae(t),2),i=R(r,!0);B(()=>c(i,b(n).label)),u(e,t)},h=e=>{var t=So(),r=N(ae(t),2),i=R(r,!0);B(()=>c(i,b(n).label)),u(e,t)};f(l,e=>{b(n).id===`profile`?e(d):b(n).id===`appearance`?e(p,1):b(n).id===`notifications`?e(m,2):b(n).id===`bots`&&e(h,3)}),r(o),r(a),B(()=>{s=i(o,1,`settings-modal__rail-item`,null,s,{"is-active":b(S)===b(n).id}),j(o,`aria-current`,b(S)===b(n).id?`page`:void 0)}),_(`click`,o,()=>V(S,b(n).id,!0)),u(e,a)}),r(se),r(oe);var ce=N(oe,2),le=e=>{var t=Oo(),i=A(t),o=e=>{var t=To(),i=N(ae(t),4);F(i,21,n,e=>e.id,(e,t)=>{var n=wo(),r=R(n,!0),i={};B(e=>{c(r,e),i!==(i=b(t).id)&&(n.value=(n.__value=i)??``)},[()=>Le(b(t),a())?`${b(t).name} (current)`:b(t).name]),u(e,n)}),r(i);var o;T(i),B(()=>{o!==(o=b(h).id)&&(i.value=(i.__value=o)??``,ue(i,o))}),_(`change`,i,e=>V(d,e.currentTarget.value,!0)),u(e,t)},s=e=>{var t=Eo(),n=R(t);B(()=>{j(t,`title`,b(h).name),c(n,`Workspace · ${b(h).name??``}`)}),u(e,t)};f(i,e=>{n().length>1?e(o):e(s,-1)});var l=N(i,2);F(l,21,()=>Fe,e=>e.id,(e,t)=>{var n=p(),i=ae(n),a=e=>{var n=Do(),i=A(n),a=N(A(i),2),o=R(a,!0);r(i),r(n),B(()=>c(o,b(t).label)),_(`click`,i,()=>te(b(h),b(t).slug)),u(e,n)},o=m(()=>!b(t).managersOnly||ze(b(h).role));f(i,e=>{b(o)&&e(a)}),u(e,n)}),r(l),r(t),u(e,t)};f(ce,e=>{b(h)&&e(le)}),r(z);var H=N(z,2),W=A(H),de=e=>{var t=ko();u(e,t)},pe=e=>{var t=Ao(),n=R(t,!0);B(()=>c(n,b(k))),u(e,t)},me=e=>{var n=Mo(),i=N(ae(n),2);Wa(i,{get user(){return t.user},get hideCommentary(){return t.hideCommentary},get hideToolCalls(){return t.hideToolCalls},get userAlign(){return t.userAlign},get otherAlign(){return t.otherAlign},get isDesktop(){return l()},get onUserUpdated(){return t.onUserUpdated},get onSaved(){return t.onClose},get onHideCommentary(){return t.onHideCommentary},get onHideToolCalls(){return t.onHideToolCalls},get onUserAlign(){return t.onUserAlign},get onOtherAlign(){return t.onOtherAlign},get onBrowserNotificationsChanged(){return t.onBrowserNotificationsChanged}});var a=N(i,2),o=e=>{mo(e,{})};f(a,e=>{b(w)&&e(o)});var s=N(a,2),d=A(s),p=N(A(d),4),m=e=>{var t=jo(),n=R(t,!0);B(()=>c(n,b(x))),u(e,t)};f(p,e=>{b(x)&&e(m)}),r(d);var h=N(d,2),g=A(h),y=R(g,!0);r(h),r(s),B(()=>{g.disabled=b(v),c(y,b(v)?`Signing out...`:`Sign out`)}),_(`click`,g,M),u(e,n)},he=e=>{vo(e,{get user(){return t.user}})},_e=e=>{var n=No();Qa(N(ae(n),2),{get user(){return t.user},get isDesktop(){return l()},get onUserUpdated(){return t.onUserUpdated},get onBrowserNotificationsChanged(){return t.onBrowserNotificationsChanged}}),u(e,n)},ve=e=>{so(e,{get onClose(){return t.onClose}})};f(W,e=>{b(D)===`loading`?e(de):b(D)===`error`?e(pe,1):b(S)===`profile`?e(me,2):b(S)===`appearance`?e(he,3):b(S)===`notifications`?e(_e,4):b(S)===`bots`&&e(ve,5)}),r(H),r(re),r(ne),_(`click`,ne,I),_(`click`,ie,function(...e){t.onClose?.apply(this,e)}),u(e,ne),g()}s([`click`,`change`]);var Io=W(`
          No thread open Hover any message and tap the bubble to keep side conversations tidy.
          `);function Lo(e){var t=Io();u(e,t)}var Ro=W(``),zo=W(`

          `,1),Bo=W(``),Vo=W(``),Ho=W(``),Uo=W(``),Wo=W(``),Go=W(``),Ko=W(``),qo=W(`
          `),Jo=W(`Connecting…`),Yo=W(`
          `);function Xo(e,t){o(t,!0);function n(e){return e===`muted`?`Channel muted - click to change`:e===`mentions`?`Notifications for @mentions only - click to change`:`All notifications enabled - click to change`}let a=C(t,`channelNotifPreference`,3,void 0),s=C(t,`channelNotifSaving`,3,!1),l=C(t,`channelSettingsAvailable`,3,!1),d=C(t,`pinsAvailable`,3,!1),p=C(t,`pinnedOpen`,3,!1),h=C(t,`onOpenChannelSettings`,3,()=>{}),v=C(t,`onToggleChannelNotifications`,3,()=>{}),x=m(()=>yt(t.externalURL));var S=Yo(),w=A(S),T=A(w),E=A(T),D=A(E),O=N(A(D),2);r(D),r(E);var k=N(E,2),ee=R(k,!0),P=N(k,2),F=e=>{var n=zo(),r=N(ae(n),2),i=R(r,!0),a=N(r,2),o=e=>{var t=Ro();B(()=>j(t,`href`,b(x))),u(e,t)};f(a,e=>{b(x)&&e(o)}),B(()=>{j(r,`title`,t.channelTitle),c(i,t.channelTitle)}),u(e,n)};f(P,e=>{t.channelTitle&&e(F)}),r(T);var I=N(T,2),L=N(A(I),2);M(L);var ne=N(L,2),re=e=>{var n=Bo();_(`click`,n,function(...e){t.onResetSearch?.apply(this,e)}),u(e,n)};f(ne,e=>{t.searchQuery&&e(re)}),te(2),r(I);var ie=N(I,2),z=e=>{var o=qo(),c=A(o),m=e=>{var t=Wo(),i=A(t),o=e=>{var t=Vo();u(e,t)},c=e=>{var t=Ho();u(e,t)},l=e=>{var t=Uo();u(e,t)};f(i,e=>{a()===`muted`?e(o):a()===`mentions`?e(c,1):e(l,-1)}),r(t),B((e,n)=>{j(t,`title`,e),j(t,`aria-label`,n),j(t,`aria-busy`,s()),t.disabled=s()},[()=>n(a()),()=>n(a())]),_(`click`,t,function(...e){v()?.apply(this,e)}),u(e,t)};f(c,e=>{a()&&e(m)});var g=N(c,2),y=e=>{var n=Go();let r;B(()=>{j(n,`title`,p()?`Close pinned items`:`Pinned items`),j(n,`aria-label`,p()?`Close pinned items`:`Pinned items`),r=i(n,1,``,null,r,{active:p()})}),_(`click`,n,function(...e){t.onPinnedItems?.apply(this,e)}),u(e,n)};f(g,e=>{d()&&e(y)});var b=N(g,2),x=e=>{var t=Ko();_(`click`,t,function(...e){h()?.apply(this,e)}),u(e,t)};f(b,e=>{l()&&e(x)}),r(o),u(e,o)};f(ie,e=>{(a()||d()||l())&&e(z)});var oe=N(ie,2),se=e=>{var t=Jo();u(e,t)};f(oe,e=>{t.connected||e(se)}),r(w),r(S),B(()=>{j(S,`data-platform`,t.platform),j(E,`aria-label`,t.mobileNavigation?t.mobileNavOpen?`Close navigation`:`Open navigation`:t.sidebarCollapsed?`Expand sidebar`:`Collapse sidebar`),j(E,`title`,t.mobileNavigation?t.mobileNavOpen?`Close navigation`:`Open navigation`:t.sidebarCollapsed?`Expand sidebar`:`Collapse sidebar`),j(O,`d`,t.mobileNavigation?t.mobileNavOpen?`m15 9-3 3 3 3`:`m9 9 3 3-3 3`:t.sidebarCollapsed?`m13 9 3 3-3 3`:`m16 9-3 3 3 3`),c(ee,t.workspaceName||`ClickClack`),le(L,t.searchQuery)}),_(`click`,E,function(...e){t.onToggleSidebar?.apply(this,e)}),_(`click`,k,function(...e){t.onOpenWorkspaceSettings?.apply(this,e)}),y(`submit`,I,e=>{e.preventDefault(),t.onSearch()}),_(`input`,L,e=>t.onSearchQuery(e.currentTarget.value)),u(e,S),g()}s([`click`,`input`]);var Zo=W(`

          `),Qo=W(``),$o=W(``),es=W(``),ts=W(``),ns=W(`

          `,1),rs=W(`

          ClickClack

          `),is=W(``),as=W(``),os=W(``),ss=W(``),cs=W(`

          `);function ls(e,t){o(t,!0);function n(e){return e===`muted`?`Channel muted - click to change`:e===`mentions`?`Notifications for @mentions only - click to change`:`All notifications enabled - click to change`}let a=C(t,`pinnedOpen`,3,!1),s=C(t,`channelNotifPreference`,3,void 0),l=C(t,`channelNotifSaving`,3,!1),d=C(t,`channelSettingsAvailable`,3,!1),p=C(t,`onOpenChannelSettings`,3,()=>{}),h=C(t,`onToggleChannelNotifications`,3,()=>{}),v=m(()=>t.selectedDirect?void 0:yt(t.selectedChannel?.external_url));var x=cs(),S=A(x),w=A(S),T=e=>{var n=Zo(),r=R(n,!0);B(e=>c(r,e),[()=>`@${ot(t.selectedDirect,t.currentUserID)}`]),u(e,n)},E=e=>{var i=ns(),a=ae(i),o=R(a,!0),d=N(a,2),p=e=>{var t=ts(),i=A(t),a=e=>{var t=Qo();u(e,t)},o=e=>{var t=$o();u(e,t)},c=e=>{var t=es();u(e,t)};f(i,e=>{s()===`muted`?e(a):s()===`mentions`?e(o,1):e(c,-1)}),r(t),B((e,n)=>{j(t,`title`,e),j(t,`aria-label`,n),j(t,`aria-busy`,l()),t.disabled=l()},[()=>n(s()),()=>n(s())]),_(`click`,t,function(...e){h()?.apply(this,e)}),u(e,t)};f(d,e=>{s()&&e(p)}),B(e=>c(o,e),[()=>`#${bt(t.selectedChannel)}`]),u(e,i)},D=e=>{var t=rs();u(e,t)};f(w,e=>{t.selectedDirect?e(T):t.selectedChannel?e(E,1):e(D,-1)});var O=N(w,4),k=R(O,!0);r(S);var ee=N(S,2),P=N(A(ee),2);M(P);var F=N(P,2),I=e=>{var n=is();_(`click`,n,function(...e){t.onResetSearch?.apply(this,e)}),u(e,n)};f(F,e=>{t.searchQuery&&e(I)}),te(2),r(ee);var L=N(ee,2),ne=A(L),re=e=>{var t=as();B(()=>j(t,`href`,b(v))),u(e,t)};f(ne,e=>{b(v)&&e(re)});var ie=N(ne,2);let z;var oe=N(ie,2),se=e=>{var n=os();let r;B(()=>{j(n,`title`,a()?`Close pinned items`:`Pinned items`),j(n,`aria-label`,a()?`Close pinned items`:`Pinned items`),r=i(n,1,``,null,r,{active:a()})}),_(`click`,n,function(...e){t.onPinnedItems?.apply(this,e)}),u(e,n)};f(oe,e=>{t.selectedChannel&&e(se)});var ce=N(oe,2),V=e=>{var t=ss();_(`click`,t,function(...e){p()?.apply(this,e)}),u(e,t)};f(ce,e=>{t.selectedChannel&&d()&&e(V)}),r(L),r(x),B(()=>{c(k,t.workspaceName||`no workspace`),le(P,t.searchQuery),j(ie,`title`,t.threadOpen?`Close thread`:`Open a message thread`),j(ie,`aria-label`,t.threadOpen?`Close thread`:`Open a message thread`),z=i(ie,1,``,null,z,{active:t.threadOpen})}),y(`submit`,ee,e=>{e.preventDefault(),t.onSearch()}),_(`input`,P,e=>t.onSearchQuery(e.currentTarget.value)),_(`click`,ie,function(...e){t.onToggleThread?.apply(this,e)}),u(e,x),g()}s([`click`,`input`]);function us(e,t,n){let r=t.find(t=>t.bot.id===e)?.bot??n(e);return r?.display_name?.trim()||(r?.handle?`@${r.handle}`:``)}function ds(e,t,n){let r=new Set,i=[];for(let a of e){if(!a.lines.some(e=>!e.finalized)||a.userId&&r.has(a.userId))continue;a.userId&&r.add(a.userId);let e=us(a.userId,t,n);e&&i.push(e)}return i}async function fs(e){return(await G(`/api/workspaces/${e}/bot-commands`)).bot_commands??[]}function ps(e){let t=e.trim().toLowerCase();return t?t.startsWith(`/`)?t:`/${t}`:``}function ms(e){let t=/^(\/\S+)\s*([\s\S]*)$/.exec(e);return t?{command:ps(t[1]),text:t[2].trim()}:null}function hs(e,t){return e.find(e=>!e.revoked_at&&ps(e.command)===t)}async function gs(e,t,n){let r=new URLSearchParams;r.set(`command`,t),r.set(`text`,n);let i=await fetch(he(`/api/hooks/slash/${e}`),ye({method:`POST`,credentials:`include`,headers:{Accept:`application/json`,"Content-Type":`application/x-www-form-urlencoded`,"X-ClickClack-CSRF":`1`},body:r.toString()})),a=await i.text();if(!i.ok)throw new be(i.status,a);let o=a?JSON.parse(a):{};return{response_type:o.response_type||`in_channel`,text:(o.text||``).trim()}}var _s=e({default:()=>Ms}),vs=W(``),ys=W(``),bs=W(``),xs=W(`
          Showing topic
          `),Ss=W(`

          `),Cs=W(`
          `),ws=W(``),Ts=W(``),Es=W(``),Ds=W(` `,1),Os=W(`

          Loading thread…

          `),ks=W(`
          Thread
          `,1),As=W(``),js=W(`
          `,1);function Ms(e,n){o(n,!1);let s=()=>se(et,`$threadView`,d),[d,m]=ie(),h=S(),x=S(),E=S(),D=S(),ee=S(),M=S(),I=S(),L=S(),te=S(),z=S(),le=S(),U=S(),W=S(),me=S(),he=S(),ge=S(),ye=S(),Se=S(),we=S(),Te=S(),Ee=S(),De=S(),Oe=S(),ke=S(),Ae=Date.now(),je=Rt?.integratedTitleBar===!0,Me=S(Ot),Ne=C(n,`routeWorkspaceID`,8,``),Pe=C(n,`routeTargetID`,8,``),K=S(null),Fe=new nt(()=>b(K)?.id||``),Ie=new He(Ao),Le=S([]),q=S([]),ze=S([]),Ve=S(null),Ge=new Map,qe=new Map,Ye=S(!1),J=S([]),Xe=S([]),Y=S(``),X=S(``),Z=S(``),Q=new St(()=>`${b(Y)}:${$()}`,Ro),et=de(()=>({root:Q.root,selection:Q.selection,replies:Q.replies,state:Q.state,draft:Q.draft,error:Q.error})),tt=S(``),it=S(``),st=0,lt=``,ut=new Map,dt=S(null),ft=S(!1),pt=S([]),mt=S(!1),_t=S(``),yt=S(new Set),wt=0,Tt=S([]),kt=S([]),At=S([]),jt=S([]),Pt=S(null),Ft=S([]),zt=S(``),Bt=S(null),Vt=S(null),Ht=S(``),Ut=S(null),Wt=S(null),Gt=S(null),Kt=new Set,qt=S(``),Jt=S(``),Yt=S(``),Xt=S(``),Zt=S(null),Qt=S(``),$t=S(``),en=S(``),tn=0,nn=S(``),rn=S(null),an=S(!1),on=0,sn=0,cn=S(null),un=S(``),dn=null,mn=S(!1),hn=S(`profile`),gn=S(!1),_n=S(!1),vn=S(``),yn=S(!1),bn=S(!1),xn=S(!1),Sn=S(!1),Cn=S(!1),Tn=S(`left`),En=S(`left`),Dn=S(!1),On=S(!1),kn=S(!1),An=S(``),jn=``,Fn=``,In=null,Ln=S(null),zn=new Map,Bn=S(new Map),Vn=new ht(()=>[b(K)?.id,b(Y),$()].join(`:`)),Hn=new Set,Un=S(`idle`),Gn=`idle`,Kn=!1,qn=!1,Jn=S(!1),Yn=S(!1),Xn=S(!1),Qn=S(!1),er=new Map,tr=0,nr=S(``),rr=S(void 0),ir=S(``),ar=S(!0),or=S(!1),sr=S(!1),cr=S(!1),lr=S(!1),ur=S(null),dr=S(null),fr=S(null),pr=S(null),mr=S(`message`),hr=S([]),gr,_r=S([]),vr,yr=S(Date.now()),br,xr=``,Sr=0,Cr=Promise.resolve(),wr=0,Tr=0,Er=0,Dr=0,Or=0,kr=0,Ar=0,jr=null,Mr=S(``),Nr=0,Fr=0,Ir=0,Lr=0,Rr=0,zr=S(null),Br,Vr=S(new Set),Hr=S(null),Wr=S(``);function Gr(e){e!==lt&&(lt=e,V(tt,``),Jr(``))}function Jr(e){e!==b(it)&&(V(it,e),st+=1)}function Xr(){return`${b(Y)}:${$()}:${b(it)}:${st}:${wr}`}function Zr(e,t){return t?e.filter(e=>!e.archived_at&&(!e.channel_id||e.channel_id===t)):[]}pe(()=>{Rt?.setActiveRoute(`${window.location.pathname}${window.location.search}${window.location.hash}`)}),oe(()=>{ri(),Nt(e=>G(e)).then(e=>{V(Me,e)}),br=window.setInterval(()=>{V(yr,Date.now())},3e4),_i(),li(fn(window.location.href));let e=window.matchMedia(`(max-width: 820px)`),t=()=>{V(cr,!1),V(lr,e.matches)};t();let n=Rt?.onNavigate(e=>{fe(e,{keepFocus:!0,noScroll:!0})}),r=Rt?.onQuickCompose(()=>ti());e.addEventListener(`change`,t);let i=e=>{let t=e.data;if(t?.type===`clickclack:push-renew`){b(K)&&!Rt&&ln(b(K).id);return}t?.type===`clickclack:notification-click`&&typeof t.url==`string`&&t.url.startsWith(`/app`)&&Qr(t.url)};return navigator.serviceWorker?.addEventListener(`message`,i),()=>{e.removeEventListener(`change`,t),navigator.serviceWorker?.removeEventListener(`message`,i),n?.(),r?.()}});async function Qr(e){await fe(e,{keepFocus:!0,noScroll:!0}),await ei()}async function ei(){await t();let e=Sr;await Cr,e===Sr&&await bo()}function ti(){t().then(()=>{(b(mr)===`thread`?b(pr):b(fr))?.focus()})}function ri(){(e=>{V(Sn,e.hideCommentary),V(Cn,e.hideToolCalls),V(Tn,e.userAlign),V(En,e.otherAlign)})(Mn()),Pn(b(Tn),b(En))}function ii(e){V(Tn,e),Pn(b(Tn),b(En)),Nn(`userAlign`,e)}function oi(e){V(En,e),Pn(b(Tn),b(En)),Nn(`otherAlign`,e)}function si(e){V(Sn,e),Nn(`hideCommentary`,e)}function ci(e){V(Cn,e),Nn(`hideToolCalls`,e)}re(()=>{ss(),Q.close(),Sr+=1,wr+=1,Vn.clear(),Ar+=1,jr?.abort(),In?.close(),In=null,V(kn,!1),$n(),gr&&window.clearInterval(gr),vr&&window.clearInterval(vr),br&&window.clearInterval(br),Br&&clearTimeout(Br),nc(!1,null)});async function li(e=null){try{let t=await Ce();V(K,t.user),_i(),Rt||ln(b(K).id),await vi(),e!==null&&await fe(e,{replaceState:!0,keepFocus:!0,noScroll:!0}),V(Dn,!0),e!==null&&ei()}catch(e){ui(e)}}function ui(e){if(e instanceof be&&(e.status===401||e.status===403)){In?.close(),In=null,V(mn,!1),V(On,!0),V(Dn,!1);return}V(Pt,{kind:`error`,text:xe(e,`Could not load ClickClack`)})}function fi(){b(K)&&(V(cr,!1),V(hn,`profile`),V(mn,!0))}function pi(){let e=b(x)?.route_id||b(Y)||Ne();e&&fe(Re(e))}function mi(){b(I)&&(V(vn,``),V(gn,!0))}async function hi(e){let t=b(M);if(t&&b(I)&&!b(_n)){V(_n,!0),V(vn,``);try{let n=await G(`/api/channels/${t.id}`,{method:`PATCH`,body:JSON.stringify({archived:e})});V(q,b(q).map(e=>e.id===n.channel.id?n.channel:e)),V(gn,!1)}catch(t){V(vn,xe(t,e?`Could not archive channel`:`Could not restore channel`))}finally{V(_n,!1)}}}function gi(e){V(K,e),mo(e),Q.updateAuthor(e)}function _i(){if(Rt){V(xn,It(b(K)?.id||``));return}let e=It(b(K)?.id||``);V(xn,typeof Notification<`u`&&Notification.permission===`granted`&&e),e&&!b(xn)&&Lt(b(K)?.id||``,!1)}async function vi(){let e=++Tr,t=await G(`/api/workspaces`);e===Tr&&V(Le,t.workspaces)}function bi(e=``,t=``){return`${e||``}/${t||``}`}function xi(e=b(Y),t=``){let n=wi(e);if(!n)return`/app`;let r=`/app/${encodeURIComponent(n)}`,i=Ti(t);return i?`${r}/${encodeURIComponent(i)}`:r}async function Si(e){if(!e.channel_id||e.parent_message_id)throw Error(`Only channel roots have links`);let t=await G(`/api/messages/${e.id}/route`,{method:`POST`});if(!t.message.route_id)throw Error(`Message route was not allocated`);po({id:t.message.id,route_id:t.message.route_id});let n=wi(t.message.workspace_id);if(!n)throw Error(`Workspace route is unavailable`);let r=`/app/${encodeURIComponent(n)}/${encodeURIComponent(t.message.route_id)}`;return new URL(r,`${ve()}/`).toString()}function Ci(e){let t=b(q).find(t=>t.id===e)?.route_id||b(J).find(t=>t.id===e)?.route_id;return t?xi(b(Y),t):!b(Y)||!e?`/app`:`/app/${encodeURIComponent(b(Y))}/${encodeURIComponent(e)}`}function wi(e=b(Y)){return e?b(Le).find(t=>t.id===e||t.route_id===e)?.route_id||e:``}function Ti(e=``){return e?b(q).find(t=>t.id===e||t.route_id===e)?.route_id||b(J).find(t=>t.id===e||t.route_id===e)?.route_id||Q.root?.id===e&&Q.root.route_id||b(Xe).find(t=>t.id===e)?.route_id||e:``}async function Ei(e=b(Y),t=``,n=!1){let r=xi(e,t);window.location.pathname!==r&&await fe(r,{replaceState:n,noScroll:!0,keepFocus:!0})}function Di(e,t){bi(e,t)!==xr&&(Cr=Li(e,t))}function Oi(){Sr++,xr=bi(wi(),Ti($())),Ei(b(Y),$())}function ki(){b(an)&&ts(),Q.close(),V(dt,null),V(ft,!1),V(mr,`message`),V(cr,!1)}function Ai(e=b(Y)){return Pi(e)||b(q).find(e=>e.name.toLowerCase()===`guest`)?.id||b(q)[0]?.id||b(J)[0]?.id||``}function ji(e=b(Y)){return b(Le).find(t=>t.id===e||t.route_id===e)}function Mi(e=b(Y)){let t=ji(e),n=t?.route_id||t?.id||e;return n?`clickclack:last-channel:v1:${n}`:``}function Ni(e){try{let t=JSON.parse(e);return{id:typeof t.id==`string`?t.id:``,routeID:typeof t.routeID==`string`?t.routeID:``}}catch{return{id:e}}}function Pi(e=b(Y)){let t=Mi(e);if(!t)return``;let n;try{let e=window.localStorage.getItem(t);if(!e)return``;n=Ni(e)}catch{return``}let r=b(q).find(e=>e.id===n.id||e.route_id===n.routeID);if(r)return r.id;try{window.localStorage.removeItem(t)}catch{}return``}function Fi(e,t){if(!e||!t)return;let n=b(q).find(e=>e.id===t);if(!n)return;let r=Mi(e);if(r)try{window.localStorage.setItem(r,JSON.stringify({id:n.id,routeID:n.route_id}))}catch{}}function Ii(e){Fn===e&&(Fn=``,Ls())}async function Li(e=``,t=``){let n=++Sr;xr=bi(e,t),t!==Q.selection?.messageID&&t!==Q.root?.route_id&&Q.close();try{Fe.clear();let r=t.trim()?await zi(e,t):null;if(n!==Sr)return;let i=r?b(Le).find(e=>e.id===r.workspace_id):b(Le).find(t=>t.id===e||t.route_id===e)||b(Le)[0];if(!i){ga(``,{messages:[],oldest_seq:0,newest_seq:0,has_older:!1,has_newer:!1},`replace`);return}let a=b(Y)!==i.id;if(a&&(uo(),Ie.clear(),Vn.clear(),Vi(),V(Y,i.id),Dr+=1,Nr+=1,Fr+=1,Ar+=1,jr?.abort(),V(Mr,``),V(At,[]),V(jt,[]),V(ze,[]),V(kt,[]),V(X,``),V(Z,``),Q.close(),V(dt,null),V(mr,`message`),ts(),Ca(),V(ar,!0),Fn=i.id),(a||b(q).length===0)&&await qi(!1,!1),n!==Sr||((a||b(J).length===0)&&await us(),a&&(await Promise.all([Xi(),Qi(i.id),$i(i.id),Ji(i.id)]),Zi(i.id)),n!==Sr))return;if(r){let e=await Ri(r,n);if(n!==Sr)return;if(!e){ki(),await Ei(i.id,Ai(),!0);return}}if(r?.canonical_path&&window.location.pathname!==r.canonical_path&&(xr=bi(r.workspace_route_id,r.target_route_id),await fe(r.canonical_path,{replaceState:!0,noScroll:!0,keepFocus:!0}),n!==Sr))return;if(r?.target_type===`channel`&&b(q).some(e=>e.id===r.target_id)){let e=r.target_id,t=!a&&b(X)===e&&!b(Z)&&b(nr)===e;if(V(X,e),V(Z,``),Fi(i.id,e),ki(),t){ba(e),Ii(i.id);return}if(Gr(e),await Promise.all([la(),sc()]),n!==Sr)return;Ii(i.id);return}if(r?.target_type===`direct`&&b(J).some(e=>e.id===r.target_id)){let e=r.target_id,t=!a&&b(Z)===e&&!b(X)&&b(nr)===e;if(V(Z,e),V(X,``),ki(),t){ba(e),Ii(i.id);return}if(Gr(e),await la(),n!==Sr)return;Ii(i.id);return}if(r?.target_type===`thread`){let e=await Bi(r,n);if(n!==Sr)return;e&&Ii(i.id);return}let o=Ai();if(ki(),!o){V(X,``),V(Z,``),Gr(``),await la(),(e!==i.route_id||t)&&await Ei(i.id,``,!0),Ii(i.id);return}await Ei(i.id,o,!0)}catch(e){n===Sr&&ui(e)}}async function Ri(e,t){return e.target_type===`channel`?(b(q).some(t=>t.id===e.target_id)||await qi(!1,!1,!1),t===Sr&&b(q).some(t=>t.id===e.target_id)):e.target_type===`direct`?(b(J).some(t=>t.id===e.target_id)||(await us(),b(J).some(t=>t.id===e.target_id)||ps((await G(`/api/dms/${e.target_id}`)).conversation)),t===Sr&&b(J).some(t=>t.id===e.target_id)):e.parent_type===`channel`&&e.parent_id?(b(q).some(t=>t.id===e.parent_id)||await qi(!1,!1,!1),t===Sr&&b(q).some(t=>t.id===e.parent_id)):e.parent_type===`direct`&&e.parent_id?(b(J).some(t=>t.id===e.parent_id)||(await us(),b(J).some(t=>t.id===e.parent_id)||ps((await G(`/api/dms/${e.parent_id}`)).conversation)),t===Sr&&b(J).some(t=>t.id===e.parent_id)):!0}async function zi(e,t){try{return(await G(`/api/routes/${encodeURIComponent(e)}/${encodeURIComponent(t)}`)).route}catch(e){if(e instanceof be&&(e.status===403||e.status===404))return null;throw e}}async function Bi(e,t){if(e.workspace_id!==b(Y))return!1;let n=e.parent_type===`channel`&&e.parent_id||``,r=e.parent_type===`direct`&&e.parent_id||``;if(n){if(!b(q).some(e=>e.id===n))return!1;V(X,n),V(Z,``),Fi(e.workspace_id,n)}else if(r){if(!b(J).some(e=>e.id===r))return!1;V(Z,r),V(X,``)}else return!1;Vn.prune();let i=Q.root?.id===e.target_id&&b(nr)===$();if(V(dt,null),V(ft,!1),V(mr,`thread`),V(cr,!1),!await Io(e.target_id,void 0,()=>t===Sr))return!1;let a=Q.selection;if(n&&await sc(),!Q.isCurrent(a)||t!==Sr)return!1;if(!i&&n&&Q.root&&(Q.root.thread_state?.reply_count??0)===0){let e=Q.root;return Q.close(),V(mr,`message`),await as(e),!0}return!i&&Q.root&&await as(Q.root),!0}function Vi(){tn++,V(Zt,null),V(Qt,``),V($t,``),V(en,``),V(or,!1),V(yn,!1),V(bn,!1)}function Hi(){let e=!b(or);Vi(),V(or,e)}function Ui(){Vi(),V(yn,!0)}function Wi(){Vi(),V(bn,!0),Zi()}async function Gi(){if(b(Zt)===`workspace`||!b(Jt).trim())return;let e=b(Y),t=Sr,n=++tn,r=()=>n===tn&&t===Sr&&e===b(Y);V(Zt,`workspace`),V(Qt,``);try{let e=await G(`/api/workspaces`,{method:`POST`,body:JSON.stringify({name:b(Jt)})});if(b(Le).some(t=>t.id===e.workspace.id)||V(Le,[...b(Le),e.workspace]),!r())return;V(Jt,``),V(or,!1),V(cr,!1),await Ei(e.workspace.id)}catch(e){r()&&V(Qt,xe(e,`Could not create workspace`))}finally{n===tn&&V(Zt,null)}}async function Ki(e){V(cr,!1),await Ei(e)}async function qi(e=!0,t=!0,n=!0){let r=b(Y);if(!r)return;let i=++Er,a=await G(`/api/workspaces/${r}/channels`);i===Er&&r===b(Y)&&(V(q,a.channels),t?V(X,b(q).find(e=>e.id===b(X))?.id||b(q).find(e=>!e.archived_at)?.id||b(q)[0]?.id||``):b(X)&&!b(q).some(e=>e.id===b(X))&&V(X,``),n&&(b(an)&&ts(),Q.close(),V(dt,null),V(mr,`message`)),e&&await la())}async function Ji(e=b(Y)){let t=++Dr,n=$(),r=b(X),i=!1;if(!e){V(ze,[]);return}try{let a=await G(`/api/workspaces/${e}/topics`);if(t!==Dr||e!==b(Y)||(V(ze,a.topics),$()!==n||b(X)!==r))return;let o=new Set(Zr(a.topics,r).map(e=>e.id));b(tt)&&!o.has(b(tt))&&V(tt,``),b(it)&&!o.has(b(it))&&(Jr(``),zn.delete($()),b(Bn).delete($()),i=!0)}catch{return}if(i&&$()===n)try{await da()}catch(e){if($()!==n||b(it))return;ho(),V(Pt,{kind:`error`,text:e instanceof Error?`Topic changed, but messages could not reload: ${e.message}`:`Topic changed, but messages could not reload`})}}function Yi(){V(mr,`message`),b(X)&&Ji()}async function Xi(e=b(Y)){let t=++kr;if(!e||e!==b(Y)||b(E)!==`owner`&&b(E)!==`moderator`){t===kr&&V(Tt,[]);return}try{let n=await G(`/api/workspaces/${e}/moderation/members`);if(t!==kr||e!==b(Y))return;V(Tt,n.members)}catch{t===kr&&e===b(Y)&&V(Tt,[])}}async function Zi(e=b(Y)){let t=++Ar;jr?.abort();let n=new AbortController;if(jr=n,V(Mr,``),!e){V(kt,[]);return}try{let r=await Dt({workspaceID:e,limit:100,signal:n.signal});if(t!==Ar||e!==b(Y))return;V(kt,r.map(e=>e.user))}catch(r){!n.signal.aborted&&t===Ar&&e===b(Y)&&(V(kt,[]),V(Mr,Et(r)))}}async function Qi(e=b(Y)){let t=++Nr;if(!e){V(At,[]);return}try{let n=await G(`/api/workspaces/${e}/slash-commands`);if(t!==Nr||e!==b(Y))return;V(At,n.slash_commands)}catch{t===Nr&&e===b(Y)&&V(At,[])}}async function $i(e=b(Y),t=!1){let n=++Fr;if(!e){V(jt,[]);return}try{let t=await fs(e);if(n!==Fr||e!==b(Y))return;V(jt,t)}catch(r){let i=n===Fr&&e===b(Y);if(i&&V(jt,[]),t&&i)throw r}}function ta(e){Rr+=1,V(Pt,null)}async function na(e,t){if(!b(Y))return;let n=await G(`/api/workspaces/${b(Y)}/moderation/members/${e}`,{method:`PATCH`,body:JSON.stringify(t)});V(Tt,[...b(Tt).filter(t=>t.user.id!==e),n.member]),await qi(!1,!1,!1)}async function ra(){if(b(Zt)===`channel`||!b(Y)||!b(Yt).trim())return;let e=b(Y),t=Sr,n=++tn,r=()=>n===tn&&t===Sr&&e===b(Y);V(Zt,`channel`),V($t,``);try{let t=await G(`/api/workspaces/${e}/channels`,{method:`POST`,body:JSON.stringify({name:b(Yt),kind:`public`})});if(e===b(Y)&&!b(q).some(e=>e.id===t.channel.id)&&V(q,[...b(q),t.channel]),!r())return;V(Yt,``),V(yn,!1),await Ei(e,t.channel.id)}catch(e){r()&&V($t,xe(e,`Could not create channel`))}finally{n===tn&&V(Zt,null)}}async function ia(e){V(cr,!1),Fi(b(Y),e);let t=xi(b(Y),e);(e!==b(X)||b(Z)||window.location.pathname!==t)&&await Ei(b(Y),e)}async function aa(e,t){let n=++Ir;if(V(Ve,null),e&&!t)try{let t=await G(`/api/channels/${e}/notification-settings`);if(n!==Ir||e!==b(X)||b(Z))return;no(e,t.preference),V(Ve,t.preference)}catch{if(n===Ir&&e===b(X)&&!b(Z)){let t=to(e)||`all`;no(e,t),V(Ve,t)}}}async function oa(){let e=b(X);if(!e||b(Z)||b(Ye)||!b(Ve))return;let t=++Ir,n=[`all`,`mentions`,`muted`],r=b(Ve),i=n[(n.indexOf(r)+1)%n.length];V(Ve,i),no(e,i),V(Ye,!0);try{await G(`/api/channels/${e}/notification-settings`,{method:`PATCH`,body:JSON.stringify({preference:i})})}catch{Ge.get(e)===i&&no(e,r),t===Ir&&e===b(X)&&!b(Z)&&V(Ve,r)}finally{V(Ye,!1)}}function sa(e=!1){Ca(),V(ar,e),wr+=1,Vn.prune();let t=Xr();return()=>Xr()===t}async function ca(e,t=`replace`,n=sa()){let r=$();r!==b(nr)&&V(ar,!0);try{if(!r){n()&&ga(``,{messages:[],oldest_seq:0,newest_seq:0,has_older:!1,has_newer:!1},t);return}await Vn.run(()=>G(ma(e)),e=>{let n=e,i=b(Bn).get(r);!n.has_newer&&i&&i.newest_seq>n.newest_seq&&(n=i.oldest_seq>n.newest_seq?i:{...n,messages:wa(n.messages,i.messages.filter(e=>go(e)>n.newest_seq)),newest_seq:i.newest_seq,has_newer:i.has_newer}),ga(r,n,t)},n)}catch(e){if(n())throw e}finally{n()&&V(ar,!1)}}async function la(e=!0){return e&&uo(),ca(fa())}async function da(e=sa()){let t=$();if(t)return V(ar,!0),zn.set(t,{atBottom:!0}),ca(`limit=100`,`replace`,e)}function fa(){let e=pa(),t=e.unread_count||0,n=e.last_read_seq||0;return t>0?`around_seq=${encodeURIComponent(String(n+1))}&limit=100`:`limit=100`}function pa(){return b(Z)?b(J).find(e=>e.id===b(Z))||{}:b(X)&&b(q).find(e=>e.id===b(X))||{}}function ma(e){let t=b(Z)?`/api/dms/${b(Z)}/messages`:`/api/channels/${b(X)}/messages`,n=new URLSearchParams(e);!b(Z)&&b(it)&&n.set(`topic_id`,b(it));let r=n.toString();return r?`${t}?${r}`:t}async function ha(e){if(!b(X)||e===b(it))return;let t=$(),n=b(it),r=b(tt),i=b(Bn).get(t),a=zn.get(t);Jr(e);let o=st;e&&V(tt,e),zn.delete(t),b(Bn).delete(t);try{await da()}catch(s){if($()!==t||st!==o)return;Jr(n),b(tt)===e&&V(tt,r),b(Bn).delete(t);let c=st;try{if(await da(),$()!==t||st!==c)return;a&&(zn.set(t,a),V(rr,a))}catch{if($()!==t||st!==c)return;i?(_a(t,i),fo(t,i.messages),ba(t,i)):ho(),a&&(zn.set(t,a),V(rr,a))}V(Pt,{kind:`error`,text:s instanceof Error?`Topic could not change: ${s.message}`:`Topic could not change`})}}function ga(e,t,n){let r=To(e).flatMap(e=>e.receipt?[e.receipt]:[]).sort((e,t)=>go(e)-go(t)),i=go(t.messages.at(-1));if(!t.has_newer)for(let e of r)go(e)===i+1&&(t={...t,messages:[...t.messages,e]},i=go(e));r.some(e=>go(e)>i)&&(t={...t,has_newer:!0});let a=Ea(e,t.messages,n),o=a[0]?.channel_seq||0,s=a[a.length-1]?.channel_seq||0,c=o>(t.messages[0]?.channel_seq||o),l=s<(t.messages[t.messages.length-1]?.channel_seq||s),u={messages:a,oldest_seq:o,newest_seq:s,has_older:t.has_older||c,has_newer:t.has_newer||l};_a(e,u),ba(e,u),(n!==`append`||e!==b(nr))&&V(rr,zn.get(e)),fo(e,a)}function _a(e,t){e&&(b(Bn).delete(e),b(Bn).set(e,t),va(e),ya(e),V(Bn,new Map(b(Bn))))}function va(e){let t=b(Bn).size+1;for(;b(Bn).size>8&&t>0;){t--;let n=b(Bn).keys().next().value;if(!n)return;if(n===e){let e=b(Bn).get(n);b(Bn).delete(n),e&&b(Bn).set(n,e);continue}b(Bn).delete(n)}}function ya(e){let t=zn.size+1;for(;zn.size>16&&t>0;){t--;let n=zn.keys().next().value;if(!n)return;if(n===e){let e=zn.get(n);zn.delete(n),e&&zn.set(n,e);continue}zn.delete(n)}}function ba(e,t=b(Bn).get(e)){e===$()&&(V(Jn,t?.has_older||!1),V(Yn,t?.has_newer||!1))}function xa(e){let t=b(Bn).get(e);e&&t&&(_a(e,{...t,has_newer:!0}),ba(e))}function Sa(e,t){e===`older`?(V(Un,t),V(Xn,t===`loading`)):(Gn=t,V(Qn,t===`loading`))}function Ca(){Hn=new Set,V(Un,`idle`),Gn=`idle`,Kn=!1,qn=!1,V(Xn,!1),V(Qn,!1)}function wa(e,t){let n=new Map;for(let r of[...e,...t])n.set(r.id,r);return[...n.values()].sort((e,t)=>(e.channel_seq||0)-(t.channel_seq||0))}function Ta(e){let t=new Set,n=Ka(e);if(n>=0){let r=qa(e,b(Xe),n);r&&t.add(r.id)}let r=zn.get(e)?.anchorMessageID;r&&t.add(r);let i=Ie.session(e);i&&t.add(i.messageID),Q.root&&_o(Q.root,e)&&t.add(Q.root.id),b(ur)&&_o(b(ur),e)&&t.add(b(ur).id);for(let n of b(Xe))(n.status===`pending`||n.status===`failed`)&&_o(n,e)&&t.add(n.id);return t}function Ea(e,t,n){return We(t,n,Ta(e))}function Oa(){if(b(Un)!==`idle`){Kn=!0;return}Aa()}function ka(e=!1){if(Gn!==`idle`){e&&(qn=!0);return}ja()}async function Aa(){let e=$(),t=Xr(),n=b(Bn).get(e),r=`${t}:older`;if(b(Un)!==`idle`){Kn=!0;return}if(!e||!n?.has_older||n.oldest_seq<=0||Hn.has(r))return;Hn.add(r),Kn=!1,Sa(`older`,`loading`),uo();let i=!1;try{await Vn.run(()=>G(ma(`before_seq=${encodeURIComponent(String(n.oldest_seq))}&limit=50`)),t=>{let n=b(Bn).get(e);n&&(ga(e,{...n,messages:wa(t.messages,n.messages),has_older:t.has_older},`prepend`),i=!0,Sa(`older`,`settling`))},()=>Xr()===t)}catch(e){Xr()===t&&V(Pt,{kind:`error`,text:xe(e,`Could not load older messages`)})}finally{Hn.delete(r),Xr()===t&&!i&&Sa(`older`,`idle`)}}async function ja(){let e=$(),t=Xr(),n=b(Bn).get(e),r=`${t}:newer`;if(Gn!==`idle`){qn=!0;return}if(!e||Hn.has(r))return;if(!n||n.newest_seq<=0){await la();return}Hn.add(r),qn=!1,Sa(`newer`,`loading`);let i=!1;try{await Vn.run(()=>G(ma(`after_seq=${encodeURIComponent(String(n.newest_seq))}&limit=50`)),t=>{i=Pa(e,t,n.newest_seq),i&&Sa(`newer`,`settling`)},()=>Xr()===t)}catch(e){Xr()===t&&V(Pt,{kind:`error`,text:xe(e,`Could not load newer messages`)})}finally{Hn.delete(r),Xr()===t&&!i&&Sa(`newer`,`idle`)}}async function Ma(e){let t=$(),n=Xr();if(!b(Y)||!t)return;let r=b(Bn).get(t);if(!r||r.newest_seq<=0){await la();return}await Vn.run(()=>G(ma(`after_seq=${encodeURIComponent(String(r.newest_seq))}&limit=50`)),e=>{Pa(t,e,r.newest_seq)},()=>e()&&Xr()===n)}function Pa(e,t,n){let r=b(Bn).get(e);if(!r)return!1;let i=t.newest_seq||n,a=i>r.newest_seq?t.has_newer:in&&(n=r.channel_seq));return n}function La(e,t=b(Xe)){let n=0;for(let r of t)r.direct_conversation_id===e&&typeof r.channel_seq==`number`&&r.channel_seq>n&&(n=r.channel_seq);return n}function Ra(e,t){return e&&t.unread_count||0}async function za(e,t){let n=b(q).find(t=>t.id===e);if(n&&!(t<=0||t<=(n.last_read_seq||0))){V(q,b(q).map(n=>n.id===e?(()=>{let e=Math.max(n.last_seq||0,t);return{...n,last_seq:e,unread_count:t>=e?0:n.unread_count||0,last_read_seq:t}})():n));try{await G(`/api/channels/${e}/read`,{method:`POST`,body:JSON.stringify({seq:t})})}catch{}}}async function Ba(e,t){let n=b(J).find(t=>t.id===e);if(n&&!(t<=0||t<=(n.last_read_seq||0))){V(J,b(J).map(n=>n.id===e?(()=>{let e=Math.max(n.last_seq||0,t);return{...n,last_seq:e,unread_count:t>=e?0:n.unread_count||0,last_read_seq:t}})():n));try{await G(`/api/dms/${e}/read`,{method:`POST`,body:JSON.stringify({seq:t})})}catch{}}}function Va(e){let t=b(Bn).get(e)?.newest_seq||0,n=b(q).find(t=>t.id===e);if(n)return Math.max(n.last_seq||0,(n.last_read_seq||0)+(n.unread_count||0),Ia(e),t);let r=b(J).find(t=>t.id===e);return r?Math.max(r.last_seq||0,(r.last_read_seq||0)+(r.unread_count||0),La(e),t):0}function Ha(e){let t=b(Bn).get(e);return!t||t.has_newer?0:b(q).find(t=>t.id===e)?Ia(e):b(J).find(t=>t.id===e)?La(e):0}function Ua(e={}){if(!e.all&&Date.now()e.id===t))return;if(!e.all&&!e.seq){let e=Ka(t);if(e>=0&&!so(t,e))return}let n=e.all?Math.max(e.seq||0,Va(t)):e.seq||Ha(t);if(!(n<=0)){if(b(J).some(e=>e.id===t)){Ba(t,n),e.all&&Wa(t,n);return}b(q).some(e=>e.id===t)&&(za(t,n),e.all&&Wa(t,n))}}function Wa(e,t){er.delete(e),er=new Map(er),V(q,b(q).map(n=>n.id===e?{...n,last_seq:Math.max(n.last_seq||0,t),last_read_seq:Math.max(n.last_read_seq||0,t),unread_count:0}:n)),V(J,b(J).map(n=>n.id===e?{...n,last_seq:Math.max(n.last_seq||0,t),last_read_seq:Math.max(n.last_read_seq||0,t),unread_count:0}:n))}function Ga(e){let t=b(q).find(t=>t.id===e);return t?t.last_read_seq||0:b(J).find(t=>t.id===e)?.last_read_seq||0}function Ka(e){let t=b(q).find(t=>t.id===e);if(t)return Ra(e,t)>0?t.last_read_seq||0:-1;let n=b(J).find(t=>t.id===e);return n&&Ra(e,n)>0?n.last_read_seq||0:-1}function qa(e,t,n){for(let r of t){if(!_o(r,e)||r.parent_message_id||r.author?.id===b(K)?.id||r.author_id===b(K)?.id)continue;let t=r.channel_seq;if(typeof t==`number`&&t>n)return r}return null}function Ja(e,t){if(!e)return;let n=oo(e);if(Ra(e,n)<=0){er.delete(e),er=new Map(er);return}let r=n.last_read_seq||0,i=er.get(e);if(i?.boundarySeq===r&&i.since||!so(e,r))return;let a=qa(e,t,r);a&&(er=new Map(er).set(e,{boundarySeq:r,since:lo(a.created_at)}))}function Ya(e,t,n){if(!e||!n)return;let r=er.get(e);r?.boundarySeq===t&&r.since||(er=new Map(er).set(e,{boundarySeq:t,since:lo(n)}))}function Xa(e){let t=e.payload,n=t.channel_seq??e.seq??t.seq;return typeof n==`number`?n:Number(n)||0}function Za(e){let t=e.payload;return{channelID:e.channel_id||(typeof t.channel_id==`string`?t.channel_id:``),dmID:typeof t.direct_conversation_id==`string`?t.direct_conversation_id:``}}async function Qa(e){try{let t=await G(`/api/channels/${e}/notification-settings`);return no(e,t.preference),e===b(X)&&!b(Z)&&!b(Ye)&&V(Ve,t.preference),t.preference}catch{return to(e)||`all`}}function $a(e){return b(K)?.id&&e?`clickclack:channel-notification:v1:${b(K).id}:${e}`:``}function eo(e){let t=$a(e);if(!t)return null;try{let e=window.localStorage.getItem(t);return e===`all`||e===`mentions`||e===`muted`?e:null}catch{return null}}function to(e){return Ge.get(e)||eo(e)}function no(e,t){Ge=new Map(Ge).set(e,t);let n=$a(e);if(n)try{window.localStorage.setItem(n,t)}catch{}}async function ro(e,t){if(e.type!==`message.created`&&e.type!==`thread.reply_created`)return;let{channelID:n,dmID:r}=Za(e),i=Xa(e);if(e.type===`message.created`&&i>0){let e=n||r;if(i<=(qe.get(e)||0))return;qe.set(e,i)}let a=e.payload,o=typeof a.kind==`string`?a.kind:``;if(o===`agent_commentary`||o===`agent_tool`||!b(xn)||document.visibilityState===`visible`&&t)return;if(n){let t=await Qa(n);if(!t||!b(xn))return;let r=n===b(X)&&!b(Z);if(document.visibilityState===`visible`&&r||t===`muted`||t===`mentions`&&!e.mentioned_user_ids?.includes(b(K)?.id||``))return}let s=typeof a.message_id==`string`?a.message_id:`${e.channel_id||``}:${e.seq||Date.now()}`,c=typeof a.author_id==`string`?a.author_id:``,l=typeof a.body==`string`?a.body:`New message`;if(e.type===`thread.reply_created`&&typeof a.message_id==`string`)try{let e=await G(`/api/messages/${a.message_id}`);c=e.message.author_id,l=e.message.body}catch{}if(c&&c===b(K)?.id||!b(xn)||document.visibilityState===`visible`&&(n&&n===b(X)||r&&r===b(Z)))return;let u=b(q).find(e=>e.id===n),d=qs(c)?.display_name||`ClickClack`,f=u?`#${bt(u)}`:`Direct message`;if(Rt){Rt.notify({body:io(l),route:Ci(n||r),tag:`clickclack:${s}`,title:`${d} in ${f}`});return}if(typeof Notification<`u`&&Notification.permission===`granted`)try{let e=new Notification(`${d} in ${f}`,{body:io(l),tag:`clickclack:${s}`,icon:`/favicon.svg`});e.onclick=()=>{window.focus(),e.close(),n?ia(n):r&&_s(r)}}catch{}}function io(e){let t=e.replace(/!\[[^\]]*]\([^)]+\)/g,`[image]`).replace(/\[[^\]]+]\(([^)]+)\)/g,`$1`).replace(/[`*_>#|]/g,``).replace(/\s+/g,` `).trim();return t?t.length>180?`${t.slice(0,177)}...`:t:`New message`}async function ao(e){let t=e.payload,n=typeof t.direct_conversation_id==`string`?t.direct_conversation_id:``;return!n||b(J).some(e=>e.id===n)?!1:(await us(),b(J).some(e=>e.id===n))}function oo(e){return b(q).find(t=>t.id===e)||b(J).find(t=>t.id===e)||{}}function so(e,t,n=b(Bn)){if(!e||t<0)return!1;let r=n.get(e);if(!r||r.messages.length===0)return!1;let i=t+1;return r.oldest_seq<=i&&r.newest_seq>=i}function co(e,t,n=b(Bn)){let r=er.get(e);if(r?.boundarySeq===t)return r.since;if(!so(e,t,n))return``;let i=qa(e,b(Xe),t);return i?lo(i.created_at):``}function lo(e){let t=new Date(e);return Number.isNaN(t.getTime())?``:new Intl.DateTimeFormat(void 0,{hour:`numeric`,minute:`2-digit`}).format(t)}function uo(){if(!b(nr)||!b(Ln))return;let e=b(Ln).captureState();e&&zn.set(b(nr),e)}function fo(e,t){let n=e!==b(nr);for(let[t,n]of ut)!n.message.status&&(n.draft.viewKey!==e||b(it)&&n.draft.topicID!==b(it))&&ut.delete(t);let r=To(e).map(e=>e.message),i=new Map(r.map(e=>[e.id,e])),a=new Map(r.filter(e=>e.nonce).map(e=>[e.nonce,e]));Fe.seedMessages(t);let o=t.map(e=>{let t=i.get(e.id)||(e.nonce?a.get(e.nonce):void 0);return t?(!t.status&&(t.attachments||[]).every(t=>e.attachments?.some(e=>e.id===t.id))&&ut.delete(t.nonce),{...e,nonce:t.nonce,status:t.status,attachments:t.attachments?.length?t.attachments:e.attachments}):e}),s=new Set(o.map(e=>e.id)),c=new Set(o.map(e=>e.nonce).filter(Boolean)),l=r.filter(e=>!s.has(e.id)&&!(e.nonce&&c.has(e.nonce)));V(Xe,[...o,...l].sort((e,t)=>(e.channel_seq||1/0)-(t.channel_seq||1/0))),Ie.reconcile(e,b(Xe)),V(nr,e),Ja(e,b(Xe)),n&&(V(hr,[]),V(_r,[]),$n())}function po(e){ho(Vn.updateMessage(e))}function mo(e){ho(Vn.updateAuthor(e))}function ho(e){let t=$(),n=t?b(Bn).get(t):void 0;if(e)for(let t of ut.values()){let n=t.message;t.message={...e(n),status:n.status,attachments:n.attachments},t.receipt&&=e(t.receipt)}let r=e?n?.messages.map(e)||[]:n?.messages||[];n?ga(t,{...n,messages:r},`append`):fo(t,r)}function go(e){return e?.channel_seq||0}function _o(e,t){return t?e.channel_id===t||e.direct_conversation_id===t:!1}async function vo(e=()=>!0){await t(),e()&&await b(Ln)?.scrollToBottom()}function yo(){return b(Ln)?.isFollowing()||b(Ln)?.isNearBottom(96)!==!1}async function bo(e=!1){let t=b(ar)||b(Yn)||b(me)>0,n=sa();try{if(t&&await da(n),await vo(n),!n())return;b(Yn)||Ua({all:!0}),await vo(n)}catch(t){n()&&(V(Pt,{kind:`error`,text:xe(t,`Could not jump to latest messages`)}),e&&await vo(n))}}function xo(e,t,n=`tmp_${e}`){let r=new Date().toISOString();return{id:n,workspace_id:t.workspaceID,channel_id:t.channelID,direct_conversation_id:t.directConversationID,topic_id:t.topicID,author_id:b(K)?.id||``,thread_root_id:n,body:t.body,body_format:`markdown`,created_at:r,author:b(K)||void 0,attachments:t.upload?[t.upload]:[],quoted_message_id:t.quotedMessageID,nonce:e,status:`pending`}}async function So(){let e=b(qt).trim();if(!e)return;if(b(z)&&!b(le)){V(Pt,{kind:`error`,text:`This conversation has no active recipient`});return}if(!b(X)&&!b(Z)){V(Pt,{kind:`ephemeral`,text:`Pick or create a channel to send a message.`});return}$n(),V(Pt,null);let t=++Rr,n=$(),r=b(Z)?`dm`:`channel`,i=b(ur)&&b(dr)===r?b(ur):null;if(b(X)&&!b(Z)&&!b(cn)&&!i){let r=ms(e),i=r?hs(b(At),r.command):void 0;if(r&&i){V(qt,``),ss(),await Co(b(X),r.command,r.text,e,n,t);return}}let a={body:e,quotedMessageID:i?.id,upload:b(cn)||void 0,workspaceID:b(Y),channelID:b(X)||void 0,directConversationID:b(Z)||void 0,topicID:b(X)&&b(tt)||void 0,topicFilterID:b(it),topicFilterGeneration:st,viewKey:$()};V(qt,``),i&&Ko(),ss(),await Do(a)}async function Co(e,t,n,r,i,a){try{let r=await gs(e,t,n);if(a!==Rr||$()!==i)return;r.text&&r.response_type!==`in_channel`&&V(Pt,{kind:`ephemeral`,text:r.text})}catch(e){if(console.warn(`slash dispatch failed`,e),a!==Rr||$()!==i)return;V(Pt,{kind:`error`,text:e instanceof be&&e.message?wo(e):`${t} failed`}),b(qt).trim()||V(qt,r)}}function wo(e){try{let t=JSON.parse(e.message);if(t&&typeof t.error==`string`&&t.error)return t.error}catch{}return e.message}function To(e){return[...ut.values()].filter(({draft:t})=>t.viewKey===e&&(!b(it)||t.topicID===b(it)))}async function Eo(e,t,n,r){let{draft:i}=e;if(e.message=t,$()!==i.viewKey)return;let a=!1,o=b(it)===i.topicFilterID&&st===i.topicFilterGeneration;if(r()&&o&&b(it)&&i.topicID!==b(it)){Jr(``),zn.delete(i.viewKey),b(Bn).delete(i.viewKey),r=sa();try{await da(r)}catch{a=!0}}if($()===i.viewKey){if(b(it)&&i.topicID!==b(it)){b(qt).trim()||V(qt,i.body),V(Pt,{kind:`error`,text:`${n} Clear the active topic filter to recover the draft.`});return}ho(),V(Pt,{kind:`error`,text:a?`${n} The unfiltered timeline could not reload.`:n}),await vo(r)}}async function Do(e,t,n){let r=wr,i=()=>wr===r&&$()===e.viewKey,a=t??Ze(),o=`tmp_${a}`,s=n??o,c=!b(it)||e.topicID===b(it),l=!t&&$()===e.viewKey&&c,u=xo(a,e,s),d={draft:e,message:u,receipt:ut.get(a)?.receipt};ut.set(a,d),$()===e.viewKey&&c&&(ho(),t||vo());let f=e.directConversationID?`/api/dms/${e.directConversationID}/messages`:`/api/channels/${e.channelID}/messages`,p={body:e.body,nonce:a};e.quotedMessageID&&(p.quoted_message_id=e.quotedMessageID),e.topicID&&(p.topic_id=e.topicID),e.upload&&(p.upload_id=e.upload.id);try{let t=d.receipt||(await G(f,{method:`POST`,body:JSON.stringify(p)})).message;if(d.receipt=t,e.upload&&!t.attachments?.some(t=>t.id===e.upload?.id))try{await G(`/api/messages/${t.id}/attachments`,{method:`POST`,body:JSON.stringify({upload_id:e.upload.id})}),t={...t,attachments:[...t.attachments||[],e.upload]}}catch(n){console.warn(`attachment fallback failed`,n),await Eo(d,{...t,nonce:a,status:`failed`,attachments:[...t.attachments||[],e.upload]},`The message was sent, but its attachment failed. Retry or discard it below.`,i);return}d.receipt=t,d.message={...t,nonce:a},$()===e.viewKey?ho():ut.delete(a)}catch(t){console.warn(`send failed`,t),await Eo(d,{...u,status:`failed`},e.upload?`The attachment failed, so the message was not sent. Retry or discard it below.`:`The message failed to send. Retry or discard it below.`,i);return}i()&&l&&await bo(!0)}function Oo(e){if(!e.nonce)return;let t=ut.get(e.nonce)?.draft;t&&Do(t,e.nonce,e.id)}function ko(e){if(!e.nonce)return;let t=ut.get(e.nonce);t?.receipt?t.message={...t.receipt,nonce:e.nonce}:ut.delete(e.nonce),ho()}async function Ao(e,n){let r=Q.selection,i=()=>e===b(ir)&&Ie.session(e)?.generation===n.generation&&(n.surface!==`thread`||Q.selection===r);if(i()){if(Sr++,n.surface===`thread`){if(n.threadRootID&&r?.messageID!==n.threadRootID&&(V(ft,!1),Q.select(n.threadRootID),r=Q.selection,!await Io(n.threadRootID,void 0,i))||!await Q.target({messageID:n.messageID,threadSeq:n.threadSeq},i)||!i())return;Q.root?.route_id&&await Ei(b(Y),Q.root.id)}else b(Ln)?.scrollToMessage(n.messageID),await Ei(b(Y),Q.root?.id||$());for(let e=0;e<16;e+=1){if(await t(),await new Promise(e=>requestAnimationFrame(()=>e())),!i())return;let e=document.querySelector(n.surface===`timeline`?`main.timeline`:`[aria-label="Thread pane"]`)?.querySelector(`[data-message-id="${CSS.escape(n.messageID)}"]`)?.querySelector(`textarea[aria-label="Edit message"]`);if(e){e.focus({preventScroll:!0});return}}}}function jo(e){po(e),Q.updateMessage(e),V(pt,b(pt).map(t=>t.id===e.id?Qe(t,e):t))}function Mo(e){!e.id||e.deleted_at||b(Vr).has(e.id)||(V(Hr,e),V(Wr,``))}async function No(){let e=b(Hr);if(e&&!b(Vr).has(e.id)){V(Vr,new Set([...b(Vr),e.id])),V(Wr,``);try{let t=(await G(`/api/messages/${e.id}`,{method:`DELETE`})).message;Ie.cancelMessage($(),t.id),po(t),Q.updateMessage(t),V(pt,b(pt).filter(e=>e.id!==t.id)),b(ur)?.id===t.id&&Ko(),V(Hr,null)}catch(e){V(Wr,e instanceof Error?e.message:`Could not delete message`)}finally{let t=new Set(b(Vr));t.delete(e.id),V(Vr,t)}}}async function Po(e){Sr++,ts(),V(ft,!1),await Io(e.id,e)&&b(Y)&&Q.root?.route_id&&await Ei(b(Y),Q.root.id)}async function Io(e,t,n=()=>!0){V(Vt,null),V(Ht,``),V(dt,null),V(mr,`thread`),Q.select(e,t);try{return await Q.open(n)}catch{return!1}}function Ro(e=[]){let t=Q.root;t&&(Fe.seedMessages(e),Ie.reconcile($(),[t,...Q.replies]),po({id:t.id,thread_state:t.thread_state}))}async function zo(e){await Vn.run(()=>G(`/api/messages/${e}/thread?latest=true&limit=1`),e=>{let t={...e.root,thread_state:e.thread_state};Fe.seedMessages([t]),po(t)})}async function Bo(e,t){(b(Xe).some(t=>t.id===e)||Vn.pending)&&await Vn.run(()=>G(`/api/messages/${e}`),e=>po(e.message),t)}function Vo(e,t){let n=b(Xe).find(t=>t.id===e);if(!n)return!1;let r=new Date(t.created_at).getTime();if(Number.isFinite(r)&&ra}async function Ho(){(!b(z)||b(le))&&await Q.send()}function Uo(e,t){t===`thread`?Q.setQuote(e):(V(ur,e),V(dr,t)),V(mr,t===`thread`?`thread`:`message`)}function Wo(){return b(Hr)!==null||b(Bt)!==null||b(mn)||b(gn)||b(yn)||b(bn)}function Go(){return b(mr)===`thread`&&Q.root&&b(pr)?b(pr):b(fr)}function Ko(){V(ur,null),V(dr,null)}async function qo(e){let t=e.quoted_message_id;if(!t)return;if(e.parent_message_id&&e.thread_root_id===Q.selection?.messageID){await Q.target({messageID:t});return}let n=sa();if(b(Ln)?.scrollToMessage(t)??!1){await Zo(t,n);return}let r=await G(`/api/messages/${t}`);n()&&_o(r.message,$())&&await as(r.message)}async function Jo(){sa(),tr=Date.now()+1200,!(b(ye)&&b(Ln)?.scrollToDivider(!1))&&await Yo()}async function Yo(){let e=$();if(!e)return;tr=Date.now()+1200;let t=Ga(e),n=er.get(e),r=(n?.boundarySeq===t?n.boundarySeq:t)+1;r<=0||await os(r)}async function Zo(e,n){for(let r=0;r<16;r+=1){if(await t(),await new Promise(e=>requestAnimationFrame(()=>e())),!n())return;let r=document.querySelector(`[data-message-id="${CSS.escape(e)}"]`);if(r){r.classList.add(`highlight`),window.setTimeout(()=>r.classList.remove(`highlight`),1500);return}}}async function Qo(){if(!b(Y)||!b(nn).trim()){ts();return}let e=b(nn).trim();b(Vt)&&tc(),(Q.root||b(dt))&&ac();let t=++sn,n=b(Z)&&b(z)?{workspaceID:b(Y),channelID:``,directConversationID:b(Z),label:`@${ot(b(z),b(K)?.id)}`}:b(X)&&b(M)?{workspaceID:b(Y),channelID:b(X),directConversationID:``,label:`#${bt(b(M))}`}:{workspaceID:b(Y),channelID:``,directConversationID:``,label:``};V(an,!1),on=0;let r={query:e,scope:n,results:[],nextCursor:null,state:`loading`,error:``,loadingMore:!1,moreError:``,activeResultID:``};V(rn,r);try{let e=await G(`/api/search?${$o(r).toString()}`);if(t!==sn)return;V(rn,{...r,results:e.results,nextCursor:e.next_cursor,state:`ready`})}catch(e){if(t!==sn)return;V(rn,{...r,state:`error`,error:e instanceof be?e.message:`Search is unavailable right now.`})}}function $o(e,t=``){let n=new URLSearchParams({workspace_id:e.scope.workspaceID,q:e.query});return e.scope.directConversationID?n.set(`direct_conversation_id`,e.scope.directConversationID):e.scope.channelID&&n.set(`channel_id`,e.scope.channelID),t&&n.set(`cursor`,t),n}async function es(){let e=b(rn);if(!e||e.state!==`ready`||!e.nextCursor||e.loadingMore)return;let t=sn;V(rn,{...e,loadingMore:!0,moreError:``});try{let n=await G(`/api/search?${$o(e,e.nextCursor).toString()}`);if(t!==sn||!b(rn))return;let r=new Set(b(rn).results.map(e=>e.id));V(rn,{...b(rn),results:[...b(rn).results,...n.results.filter(e=>!r.has(e.id))],nextCursor:n.next_cursor,loadingMore:!1})}catch(e){if(t!==sn||!b(rn))return;V(rn,{...b(rn),loadingMore:!1,moreError:e instanceof be?e.message:`Couldn’t load more results.`})}}function ts(){sn+=1,V(nn,``),V(rn,null),V(an,!1),on=0}function ns(e){if(e.channel_name)return`#${e.channel_name}`;if(e.direct_conversation_id){let t=b(J).find(t=>t.id===e.direct_conversation_id);return t?`@${ot(t,b(K)?.id)}`:`Direct message`}return``}async function rs(e){let n=b(rn),r=e.channel_id||e.direct_conversation_id||``;if(n&&b(Y)&&r&&(Sr++,V(rn,{...n,activeResultID:e.id}),$()!==r&&(await Ei(b(Y),r),await Li(wi(b(Y)),Ti(r))),$()===r)){if(e.parent_message_id){on=document.querySelector(`.search-results-scroll`)?.scrollTop??0;let n=sn;if(V(an,!0),!await Io(e.thread_root_id,void 0,()=>n===sn&&b(an)&&b(rn)?.activeResultID===e.id))return;let r=()=>n===sn&&b(an)&&b(rn)?.activeResultID===e.id;if(!await Q.target({messageID:e.id,threadSeq:e.thread_seq},r)||!r())return;Q.root?.route_id&&await Ei(b(Y),Q.root.id),await t(),r()&&document.querySelector(`.thread .thread-back`)?.focus({preventScroll:!0});return}if(await Ei(b(Y),r),e.channel_seq&&e.channel_seq>0){await os(e.channel_seq,e.id);return}await la()}}async function is(){if(Sr++,!b(rn)||!b(an))return;let e=$();Q.close(),V(dt,null),V(mr,`message`),V(an,!1),b(Y)&&e&&await Ei(b(Y),e),await t();let n=document.querySelector(`.search-results-scroll`);n&&(n.scrollTop=on),(b(rn).activeResultID?document.querySelector(`.search-result[data-result-id="${CSS.escape(b(rn).activeResultID)}"]`):null)?.focus({preventScroll:!0})}async function as(e){let t=e.channel_seq||0;if(t<=0){await la();return}await os(t,e.id)}async function os(e,n=``){let r=$();if(!r)return;let i=!!b(it);i&&(Jr(``),b(Bn).delete(r));let a=sa(i);n&&zn.set(r,{atBottom:!1,anchorMessageID:n,anchorPixelOffset:0}),await ca(`around_seq=${encodeURIComponent(String(e))}&limit=100`,`around`,a),await t(),a()&&(n?(b(Ln)?.scrollToMessage(n),await Zo(n,a)):b(Ln)?.scrollToDivider(!1))}function ss(){dn?.abort(),dn=null,V(un,``),V(cn,null)}async function cs(e){let t=e.currentTarget,n=t.files?.[0],r=b(Y);if(!n||!r)return;t.value=``,dn?.abort();let i=new AbortController;dn=i,V(un,r),V(Pt,null);let a=()=>dn===i&&!i.signal.aborted&&b(Y)===r;try{let e=await pn(n,i.signal);if(!a())return;let t=new FormData;t.set(`workspace_id`,r),t.set(`file`,n),e.width>0&&t.set(`width`,String(e.width)),e.height>0&&t.set(`height`,String(e.height)),e.durationMS>0&&t.set(`duration_ms`,String(e.durationMS));let o=await G(`/api/uploads`,{method:`POST`,body:t,signal:i.signal});a()&&V(cn,o.upload)}catch(e){a()&&V(Pt,{kind:`error`,text:xe(e,`Could not upload file`)})}finally{dn===i&&(dn=null)}}async function us(e=b(Y)){let t=++Or;if(!e){V(J,[]);return}let n=await G(`/api/dms?workspace_id=${e}`);t===Or&&e===b(Y)&&(V(J,n.conversations),b(Z)&&!b(J).some(e=>e.id===b(Z))&&V(Z,``))}function ps(e){V(J,b(J).some(t=>t.id===e.id)?b(J).map(t=>t.id===e.id?e:t):[...b(J),e])}async function _s(e){V(cr,!1);let t=xi(b(Y),e);(e!==b(Z)||b(X)||window.location.pathname!==t)&&await Ei(b(Y),e)}async function Ms(e){let t=e.trim();if(b(Zt)===`direct`||!b(Y)||!t)return;let n=b(Y),r=Sr,i=++tn,a=()=>i===tn&&r===Sr&&n===b(Y);V(Zt,`direct`),V(en,``);try{let e=await G(`/api/dms`,{method:`POST`,body:JSON.stringify({workspace_id:n,member_ids:[t]})});if(n===b(Y)&&!b(J).some(t=>t.id===e.conversation.id)&&ps(e.conversation),!a())return;V(Xt,``),V(bn,!1),ki(),await Ei(n,e.conversation.id)}catch(e){a()&&V(en,xe(e,`Could not start direct message`))}finally{i===tn&&V(Zt,null)}}function Ns(){Br&&clearTimeout(Br),Br=void 0,V(zr,null)}function Ps(e,t){Ns(),V(zr,{conversation:e,restoreRoute:t,title:ot(e,b(K)?.id)}),Br=setTimeout(()=>{V(zr,null),Br=void 0},8e3)}async function Fs(){let e=b(zr);if(e){Ns();try{let t=await G(`/api/dms/${e.conversation.id}/open`,{method:`POST`});ps(t.conversation),e.restoreRoute&&await Ei(e.conversation.workspace_id,t.conversation.id)}catch(e){V(Pt,{kind:`error`,text:xe(e,`Could not restore direct message`)})}}}async function Is(e){if(!e)return;let t=b(J).find(t=>t.id===e),n=b(Z)===e;if(await G(`/api/dms/${e}`,{method:`DELETE`}),V(J,b(J).filter(t=>t.id!==e)),t&&Ps(t,n),n){ki();let e=b(q)[0]?.id||``;V(Z,``),V(X,e),e&&Fi(b(Y),e),await Ei(b(Y),e),await la()}}function Ls(){if(Lr+=1,In?.close(),In=null,V(kn,!1),!b(Y))return;let e=b(Y);In=Ue({workspaceID:e,onEvent:zs,onOpen:async(t,n)=>{let r=jn===e;await Rs(e,t,r,n),t()&&((!r||n)&&(qe=new Map([...b(q),...b(J)].map(e=>[e.id,e.last_seq||0]))),jn=e,V(An,``))},onError:t=>{if(e===b(Y)){if(t instanceof Je){if(Ne()&&Ne()!==e&&Ne()!==wi(e))return;In?.close(),fe(`/app`,{invalidateAll:!0,replaceState:!0}).catch(ui);return}if(t instanceof be&&t.status===401){ui(t);return}V(An,xe(t,`Could not process realtime event`))}},onStatusChange:e=>{V(kn,e)}})}async function Rs(e,t=()=>!0,n=!0,r=!0){let i=++Lr;if(!e||e!==b(Y)||!t())return;let a=Q.root?.id||``,o=b(dt)?.kind===`bot`?b(dt).id:``;if(V(hr,[]),V(_r,[]),!r){await Promise.all([Qi(e),$i(e,!0)]);return}if(Fe.clear(),await Promise.all([vi(),qi(!1,!1,!1),us(e),Xi(e),Qi(e),$i(e,!0),Ji(e)]),i===Lr&&e===b(Y)&&t()){if(b(X)&&!b(q).some(e=>e.id===b(X))&&V(X,``),b(Z)&&!b(J).some(e=>e.id===b(Z))&&V(Z,``),!b(X)&&!b(Z)){let t=Ai(e);if(t){let n=b(J).some(e=>e.id===t);V(Z,n?t:``),V(X,n?``:t),n||Fi(e,t),await Ei(e,t,!0)}}if(i===Lr&&e===b(Y)&&t()&&(await la(n),i===Lr&&e===b(Y)&&t()&&(await sc(),i===Lr&&e===b(Y)&&t()&&(a&&Q.root?.id===a&&await Q.refresh(t),o&&b(dt)?.id===o)))){let e=qs(o);V(dt,e&&!e.deleted_at?e:null)}}}async function zs(e,t){if((e.type===`pin.added`||e.type===`pin.removed`)&&e.channel_id===b(X)&&!b(Z)){await sc();return}if(e.type===`typing.started`||e.type===`typing.stopped`){Ws(e);return}if(e.type===`agent.progress`){Gs(e);return}if(e.type===`channel.read`||e.type===`dm.read`){Hs(e);return}if(e.type===`bot_command.updated`){e.workspace_id===b(Y)&&$i(e.workspace_id,!0).catch(t=>{e.workspace_id===b(Y)&&(V(An,xe(t,`Could not refresh bot commands`)),Ls())});return}if(e.type===`bot.deleted`){e.workspace_id===b(Y)&&await Bs(e);return}if(e.type===`bot.membership_removed`){e.workspace_id===b(Y)&&await Vs(e);return}if((e.type===`channel.created`||e.type===`channel.updated`)&&e.workspace_id===b(Y)){await qi(!1,!1,!1);return}if(e.type===`member.moderation_updated`&&e.workspace_id===b(Y)){let t=b(Z),n=e.payload.user_id===b(K)?.id;if(await vi(),await Xi(),await qi(!1,n,n),n){if(await us(),t&&(b(J).some(e=>e.id===t)?(V(Z,t),V(X,``)):V(Z,``)),!b(X)&&!b(Z)){ga(``,{messages:[],oldest_seq:0,newest_seq:0,has_older:!1,has_newer:!1},`replace`);return}await la()}return}e.workspace_id===b(Y)&&e.payload.topic_id&&!b(ze).some(t=>t.id===e.payload.topic_id)&&await Ji(e.workspace_id),(e.type===`message.updated`||e.type===`message.deleted`)&&b(yt).has(e.payload.message_id||``)&&await sc();let n=(e.channel_id===b(X)||e.payload.direct_conversation_id===b(Z))&&!(e.type===`message.created`&&b(it)&&e.payload.topic_id!==b(it));if(n&&(e.type===`reaction.added`||e.type===`reaction.removed`)){Fe.applyEvent(e);return}if(ro(e,n),e.type===`message.created`&&!n&&(await ao(e)||Us(e)),n&&(e.type===`message.created`||e.type===`message.updated`||e.type===`message.deleted`)){let n=e.payload.nonce;if(e.type===`message.created`&&n&&ut.has(n))return;let r=yo(),i=Xa(e),a=e.type===`message.created`&&(i<=0||i>(b(Bn).get($())?.newest_seq||0));if(a&&!r?(tr=Date.now()+1200,xa($())):a?await Ma(t):e.type!==`message.created`&&await Bo(e.payload.message_id||``,t),!t())return;e.type===`message.created`&&Us(e,r,a)}if(await Q.handleEvent(e,t))return;let r=e.payload.root_message_id||e.payload.message_id;r&&e.type===`thread.state_updated`&&Vo(r,e)&&await zo(r)}async function Bs(e){let t=e.payload.bot_user_id||``;if(!t)return;let n=e.payload.deleted_at||e.created_at,r=e.payload.former_handle||``,i=e=>e.id===t?{...e,handle:``,former_handle:r,deleted_at:n}:e;V(J,b(J).map(e=>({...e,members:e.members.map(i)}))),V(Tt,b(Tt).filter(e=>e.user.id!==t)),V(At,b(At).filter(e=>e.bot_user_id!==t)),V(jt,b(jt).filter(e=>e.bot.id!==t)),V(hr,b(hr).filter(e=>e.userID!==t)),b(rn)&&V(rn,{...b(rn),results:b(rn).results.map(e=>({...e,author:i(e.author)}))}),b(dt)?.id===t&&V(dt,null);let a=Q.selection;await Promise.all([us(),Xi(),Qi(),$i()]),Zi(),mo({id:t,handle:``,former_handle:r,deleted_at:n}),Q.isCurrent(a)&&await Q.refresh()}async function Vs(e){let t=e.payload.bot_user_id||``;t&&(V(Tt,b(Tt).filter(e=>e.user.id!==t)),V(At,b(At).filter(e=>e.bot_user_id!==t)),V(jt,b(jt).filter(e=>e.bot.id!==t)),b(dt)?.id===t&&V(dt,null),await Promise.all([us(e.workspace_id),Xi(e.workspace_id),Qi(e.workspace_id),$i(e.workspace_id)]),Zi(e.workspace_id))}function Hs(e){let t=e.payload,n=typeof t.user_id==`string`?t.user_id:``;if(!n||n!==b(K)?.id)return;let r=e.seq??t.last_read_seq??t.seq,i=typeof r==`number`?r:Number(r)||0;if(e.type===`channel.read`){let n=typeof t.channel_id==`string`?t.channel_id:e.channel_id||``;if(!n)return;V(q,b(q).map(e=>{if(e.id!==n)return e;let t=Math.max(e.last_read_seq||0,i);return{...e,last_read_seq:t,unread_count:t>=(e.last_seq||0)?0:e.unread_count||0}}))}else{let e=typeof t.direct_conversation_id==`string`?t.direct_conversation_id:``;if(!e)return;V(J,b(J).map(t=>{if(t.id!==e)return t;let n=Math.max(t.last_read_seq||0,i);return{...t,last_read_seq:n,unread_count:n>=(t.last_seq||0)?0:t.unread_count||0}}))}}function Us(e,t,n=!1){let r=e.payload,i=typeof r.kind==`string`?r.kind:``;if(i===`agent_commentary`||i===`agent_tool`)return;let a=typeof r.author_id==`string`?r.author_id:``;if(a&&a===b(K)?.id||r.parent_message_id)return;let o=Xa(e),{channelID:s,dmID:c}=Za(e),l=s||c;if(!l)return;let u=oo(l),d=s?s===b(X)&&!b(Z):c===b(Z),f=d&&(!s||!b(it))&&(t??yo());if(o>0&&o<=(u.last_seq||0)&&!(n&&f))return;let p=o>0?o:(u.last_seq||0)+1,m=d&&!f&&(u.unread_count||0)===0;m&&Ya(l,u.last_read_seq||0,e.created_at);let h={last_seq:Math.max(u.last_seq||0,p),last_read_seq:m?Math.max(u.last_read_seq||0,p-1):u.last_read_seq||0,unread_count:f?0:(u.unread_count||0)+1};s?V(q,b(q).map(e=>e.id===l?{...e,...h}:e)):V(J,b(J).map(e=>e.id===l?{...e,...h}:e))}function Ws(e){let t=e.payload,n=typeof t.user_id==`string`?t.user_id:``;if(!n||n===b(K)?.id)return;let{channelID:r,dmID:i}=Za(e);if(!(b(X)&&r===b(X)||b(Z)&&i===b(Z)))return;if(e.type===`typing.stopped`){V(hr,b(hr).filter(e=>e.userID!==n));return}let a=qs(n),o=b(hr).filter(e=>e.userID!==n);o.push({userID:n,user:a,expiresAt:Date.now()+qr}),V(hr,o),Js()}function Gs(e){let t=e.payload,{channelID:n,dmID:r}=Za(e);if(!(b(X)&&n===b(X)||b(Z)&&r===b(Z)))return;let i=b(_r);V(_r,ni(i,t,Date.now())),t.op!==`clear`&&b(_r)!==i&&Ks()}function Ks(){vr||=window.setInterval(()=>{let e=Date.now(),t=b(_r).filter(t=>t.expiresAt>e);t.length!==b(_r).length&&V(_r,t),t.length===0&&vr&&(window.clearInterval(vr),vr=void 0)},1e3)}function qs(e){if(b(K)?.id===e)return b(K);let t=b(kt).find(t=>t.id===e);if(t)return t;let n=b(Xe).find(t=>t.author?.id===e)?.author;if(n)return n;let r=b(h).find(t=>t.author?.id===e)?.author;if(r)return r;if(Q.root?.author?.id===e)return Q.root.author;let i=b(Tt).find(t=>t.user.id===e)?.user;if(i)return i;for(let t of b(J)){let n=t.members.find(t=>t.id===e);if(n)return n}}function Js(){gr||=window.setInterval(()=>{let e=Date.now(),t=b(hr).filter(t=>t.expiresAt>e);t.length!==b(hr).length&&V(hr,t),t.length===0&&gr&&(window.clearInterval(gr),gr=void 0)},1e3)}function Ys(){b(Y)&&(b(X)||b(Z))&&Zn({workspaceID:b(Y),channelID:b(X)||void 0,directConversationID:b(Z)||void 0})}function Xs(e){e&&!e.deleted_at&&(Vi(),ts(),V(Vt,null),V(Ht,``),ki(),V(dt,e),Oi(),(b(E)===`owner`||b(E)===`moderator`)&&!b(Tt).some(t=>t.user.id===e.id)&&Xi())}function Zs(e){e.key===`Enter`&&!e.shiftKey&&(e.preventDefault(),So())}function Qs(e){e.key===`Enter`&&!e.shiftKey&&(e.preventDefault(),Ho())}function $s(e,t){Wo()||V(Bt,{url:e,title:t})}function ec(e){V(Ut,document.activeElement instanceof HTMLElement?document.activeElement:null),V(Ht,b(ir)),V(Vt,e),t().then(()=>{document.querySelector(`.artifact-viewer__actions > button:last-child`)?.focus()})}function tc(){let e=b(Ut),n=b(Vt)?.id||``;V(Vt,null),V(Ht,``),V(Ut,null),t().then(()=>{if(e?.isConnected){e.focus({preventScroll:!0});return}(Q.root?document.querySelector(`.thread`):document)?.querySelector(`[data-artifact-upload-id="${CSS.escape(n)}"]`)?.focus({preventScroll:!0})})}function nc(e,t){for(let e of Kt)e.inert=!1;if(Kt.clear(),e&&b(Gt)&&t)for(let e of b(Gt).children)e instanceof HTMLElement&&e!==t&&!e.inert&&(e.inert=!0,Kt.add(e))}function rc(e){if(!b(Vt)||!b(lr)||e.key!==`Tab`||!b(Wt))return;let t=Array.from(b(Wt).querySelectorAll(`a[href], button:not([disabled]), [tabindex]:not([tabindex="-1"])`)).filter(e=>!e.inert&&e.getClientRects().length>0);if(t.length===0){e.preventDefault(),b(Wt).focus();return}let n=t[0],r=t[t.length-1];e.shiftKey&&(document.activeElement===n||!b(Wt).contains(document.activeElement))?(e.preventDefault(),r.focus()):!e.shiftKey&&(document.activeElement===r||!b(Wt).contains(document.activeElement))&&(e.preventDefault(),n.focus())}function ic(e){let t=e.target;t instanceof HTMLImageElement&&t.closest(`.markdown`)&&(e.preventDefault(),$s(Ke(t),t.alt||`Image`))}function ac(){if(b(Vt)){tc();return}if(b(ft)){V(ft,!1),Oi();return}Vi(),Ie.cancel($(),`thread`),ki(),Oi()}function oc(){if(Q.root){ac();return}b(De)&&ac(),V(Pt,{kind:`ephemeral`,text:`Pick a message to open its thread.`})}async function sc(){let e=b(X),t=++wt,n=()=>t===wt&&e===b(X)&&!b(Z);if(!e||b(Z)){V(pt,[]),V(_t,``),V(mt,!1);return}V(mt,!0),V(_t,``);try{await Vn.run(()=>G(`/api/channels/${e}/pins?limit=100`),e=>{V(pt,e.messages.filter(e=>!e.deleted_at))},n)}catch(e){if(!n())return;V(_t,e instanceof Error?e.message:`Could not load pinned messages`)}finally{n()&&V(mt,!1)}}async function cc(e,t){let n=b(X);if(!n||b(Z))throw Error(`Pins are available in channels only`);t?await G(`/api/channels/${n}/pins/${e.id}`,{method:`DELETE`}):await G(`/api/channels/${n}/pins`,{method:`POST`,body:JSON.stringify({message_id:e.id})}),n===b(X)&&!b(Z)&&await sc()}function lc(){if(!b(X)||b(Z))return;let e=!b(ft);ts(),ki(),V(ft,e),Oi(),e&&sc()}async function uc(e){Sr++,V(ft,!1),await Io(e.thread_root_id,e.parent_message_id?void 0:e)&&b(Y)&&Q.root?.route_id&&window.location.pathname!==xi(b(Y),Q.root.id)&&await Ei(b(Y),Q.root.id)}function dc(e){if(!(e.isComposing||e.keyCode===229)&&(rc(e),!e.defaultPrevented)){if(e.key===`Escape`){if(e.target instanceof Element&&e.target.closest(`[data-handles-escape]`)||b(Bt))return;if(Wo())fc();else if(b(cr)){e.preventDefault(),pc();return}else if(b(Vt)){e.preventDefault(),ac();return}else if(b(an)){e.preventDefault(),ac();return}else if(b(Oe)){e.preventDefault(),ts();return}else if(b(ur)||Q.draft?.quote){e.preventDefault(),Q.draft?.quote&&(b(mr)===`thread`||!b(ur))?Q.setQuote(null):Ko();return}else{e.preventDefault(),bo();return}}if(b(cr)&&e.key.length===1&&!e.ctrlKey&&!e.metaKey&&!e.altKey){let t=document.activeElement;if(!(t instanceof HTMLInputElement)&&!(t instanceof HTMLTextAreaElement)&&!(t instanceof HTMLSelectElement)&&!(t instanceof HTMLElement&&t.isContentEditable)){e.preventDefault();return}}Wn(e,{authRequired:b(On),isModalOpen:()=>Wo()||b(cr),messageInput:b(fr),replyInput:b(pr),target:Go})}}function fc(){b(Hr)&&b(Vr).has(b(Hr).id)||b(_n)||(Vi(),V(Hr,null),V(Wr,``),V(Bt,null),V(mn,!1),V(gn,!1),V(vn,``))}function pc(){V(cr,!1)}function mc(){if(b(lr)){V(cr,!b(cr));return}V(sr,!b(sr))}P(()=>s(),()=>{V(h,s().replies)}),P(()=>(b(un),b(Y)),()=>{b(un)&&b(un)!==b(Y)&&ss()}),P(()=>(b(Le),b(Y)),()=>{V(x,b(Le).find(e=>e.id===b(Y)))}),P(()=>b(x),()=>{V(E,b(x)?.role||``)}),P(()=>b(E),()=>{V(D,b(E)===`owner`)}),P(()=>(b(dt),b(Tt)),()=>{V(ee,b(dt)?b(Tt).find(e=>e.user.id===b(dt)?.id):void 0)}),P(()=>(b(q),b(X)),()=>{V(M,b(q).find(e=>e.id===b(X)))}),P(()=>(b(M),b(x)),()=>{V(I,!!b(M)&&Be(b(x)?.role))}),P(()=>(b(ze),b(X)),()=>{V(L,Zr(b(ze),b(X)))}),P(()=>(b(L),b(it)),()=>{V(te,b(L).find(e=>e.id===b(it)))}),P(()=>(b(X),b(Z)),()=>{aa(b(X),b(Z))}),P(()=>(b(J),b(Z)),()=>{V(z,b(J).find(e=>e.id===b(Z)))}),P(()=>b(z),()=>{V(le,b(z)?.can_send??!0)}),P(()=>(b(Z),b(X)),()=>{V(ir,b(Z)||b(X)||``)}),P(()=>b(ir),()=>{Gr(b(ir))}),P(()=>b(ir),()=>{ta(b(ir))}),P(()=>(b(X),b(jt),b(z)),()=>{V(U,b(X)?b(jt):b(z)?b(jt).filter(e=>b(z)?.members?.some(t=>t.id===e.bot.id)):[])}),P(()=>(b(Z),b(J),b(X),b(q)),()=>{V(W,b(Z)?b(J).find(e=>e.id===b(Z))||{}:b(X)&&b(q).find(e=>e.id===b(X))||{})}),P(()=>(b(ir),b(W)),()=>{V(me,Ra(b(ir),b(W)))}),P(()=>(b(Dn),b(q),b(J)),()=>{V(he,b(Dn)?b(q).reduce((e,t)=>e+(t.unread_count||0),0)+b(J).reduce((e,t)=>e+(t.unread_count||0),0):0)}),P(()=>b(he),()=>{Rt?.setUnreadCount(b(he))}),P(()=>(b(me),b(W)),()=>{V(ge,b(me)>0&&b(W).last_read_seq||0)}),P(()=>(b(me),b(ir),b(ge),b(Bn)),()=>{V(ye,b(me)>0&&so(b(ir),b(ge),b(Bn)))}),P(()=>(b(me),b(ir),b(ge),b(Bn)),()=>{V(Se,b(me)>0?co(b(ir),b(ge),b(Bn)):``)}),P(()=>(b(Xe),b(Sn),b(Cn),b(yr)),()=>{V(we,wn(b(Xe),{hideCommentary:b(Sn),hideToolCalls:b(Cn)},b(yr)))}),P(()=>b(_r),()=>{V(Te,b(_r).some(e=>e.lines.some(e=>!e.finalized)))}),P(()=>b(pt),()=>{V(yt,new Set(b(pt).map(e=>e.id)))}),P(()=>(b(_r),b(jt)),()=>{V(Ee,ds(b(_r),b(jt),qs))}),P(()=>(b(Vt),b(Ht),b(ir)),()=>{b(Vt)&&b(Ht)&&b(Ht)!==b(ir)&&(V(Vt,null),V(Ht,``),V(Ut,null))}),P(()=>(b(ft),s(),b(dt),b(Vt)),()=>{V(De,b(ft)||s().selection!==null||b(dt)!==null||b(Vt)!==null)}),P(()=>(b(rn),b(an)),()=>{V(Oe,b(rn)!==null&&!b(an))}),P(()=>(b(lr),b(Vt),b(Wt)),()=>{nc(b(lr)&&b(Vt)!==null,b(Wt))}),P(()=>(b(Xe),b(J),b(K)),()=>{V(ke,at(b(Xe),b(J),b(K)?.id||``))}),P(()=>(b(K),b(ke),b(kt),b(z)),()=>{V(Ft,ct(b(K),b(ke),b(kt),b(z)))}),P(()=>(b(K),b(Z),b(X),b(Ve)),()=>{V(zt,b(K)?.id&&(b(Z)||b(X)&&b(Ve)!==null&&b(Ve)!==`muted`)?b(K).id:``)}),P(()=>(b(dr),b(ur),b(Xe)),()=>{b(dr)===`channel`&&b(ur)&&!b(Xe).some(e=>e.id===b(ur)?.id)&&Ko()}),P(()=>(b(dr),b(ur),b(Xe)),()=>{b(dr)===`dm`&&b(ur)&&!b(Xe).some(e=>e.id===b(ur)?.id)&&Ko()}),P(()=>(b(Dn),l(Ne()),l(Pe())),()=>{b(Dn)&&Di(Ne(),Pe())}),w(),ne();var hc=p();a(`1oa2eo8`,e=>{var t=vs();u(e,t)}),y(`keydown`,O,dc,!0),y(`pointerdown`,O,function(...e){Rn?.apply(this,e)},!0);var gc=ae(hc),_c=e=>{Ur(e,{})},vc=e=>{var t=js(),n=ae(t);let a;var o=A(n),d=e=>{{let t=H(()=>b(M)?b(Ve):null),n=H(()=>(b(z),l(ot),b(K),b(M),l(bt),k(()=>b(z)?`@${ot(b(z),b(K)?.id)}`:b(M)?`#${bt(b(M))}`:void 0))),r=H(()=>(b(z),b(M),k(()=>b(z)?void 0:b(M)?.external_url))),i=H(()=>(b(M),k(()=>!!b(M)))),a=H(()=>(b(x),k(()=>b(x)?.name)));Xo(e,{get channelNotifPreference(){return b(t)},get channelNotifSaving(){return b(Ye)},get pinnedOpen(){return b(ft)},get channelTitle(){return b(n)},get externalURL(){return b(r)},get pinsAvailable(){return b(i)},get channelSettingsAvailable(){return b(I)},get connected(){return b(kn)},get platform(){return l(Rt),k(()=>Rt.platform)},get searchQuery(){return b(nn)},get sidebarCollapsed(){return b(sr)},get mobileNavOpen(){return b(cr)},get mobileNavigation(){return b(lr)},get workspaceName(){return b(a)},onOpenChannelSettings:mi,onOpenWorkspaceSettings:pi,onResetSearch:ts,onSearch:()=>void Qo(),onSearchQuery:e=>V(nn,e),onToggleSidebar:mc,onToggleChannelNotifications:()=>void oa(),onPinnedItems:lc})}};f(o,e=>{je&&Rt&&e(d)});var p=N(o,2),m=A(p),g=e=>{var t=v(`×`);u(e,t)},y=e=>{var t=ys();u(e,t)};f(m,e=>{b(cr)?e(g):e(y,-1)}),r(p);var S=N(p,2),C=e=>{var t=bs();_(`click`,t,pc),u(e,t)};f(S,e=>{b(cr)&&e(C)});var w=N(S,2);{let e=H(()=>(b(Me),k(()=>je&&b(Me).url===`/`?`/app`:b(Me).url))),t=H(()=>(l(Mt),b(Me),k(()=>Mt(b(Me))))),n=H(()=>b(Zt)===`workspace`);yi(w,{get workspaces(){return b(Le)},get homeHref(){return b(e)},get homeLabel(){return b(Me),k(()=>b(Me).label)},get homeTitle(){return b(t)},get selectedWorkspaceID(){return b(Y)},get workspaceName(){return b(Jt)},get showWorkspaceCreate(){return b(or)},get createPending(){return b(n)},get createError(){return b(Qt)},hrefForWorkspace:e=>xi(e),onSelectWorkspace:e=>void Ki(e),onToggleWorkspaceCreate:Hi,onWorkspaceName:e=>V(Jt,e),onCreateWorkspace:()=>void Gi()})}var O=N(w,2);{let e=H(()=>(b(x),k(()=>b(x)?.name))),t=H(()=>(b(x),l(_e),k(()=>b(x)?.icon_url?_e(b(x).icon_url):``))),n=H(()=>!je),r=H(()=>(b(zr),k(()=>b(zr)?.title)));ea(O,{get workspaceID(){return b(Y)},get workspaceName(){return b(e)},get workspaceIconURL(){return b(t)},get connected(){return b(kn)},get sidebarCollapsed(){return b(sr)},get showHeader(){return b(n)},get channels(){return b(q)},get directConversations(){return b(J)},get recentPeople(){return b(ke)},get currentUser(){return b(K)},get selectedChannelID(){return b(X)},get selectedDirectID(){return b(Z)},get selectedProfile(){return b(dt)},onToggleCollapse:mc,hrefForChannel:e=>xi(b(Y),e),hrefForDirect:e=>xi(b(Y),e),onSelectChannel:e=>void ia(e),onCreateChannel:Ui,onSelectDirect:e=>void _s(e),onCreateDirect:Wi,onHideDirect:e=>void Is(e),get hiddenDirectTitle(){return b(r)},onUndoHideDirect:()=>void Fs(),onOpenProfile:Xs,onOpenSettings:fi,onOpenWorkspaceSettings:pi})}var P=N(O,2),ne=A(P),re=e=>{{let t=H(()=>(b(x),k(()=>b(x)?.name))),n=H(()=>(b(K),k(()=>b(K)?.id))),r=H(()=>(s(),k(()=>s().root!==null)));ls(e,{get selectedDirect(){return b(z)},get selectedChannel(){return b(M)},get workspaceName(){return b(t)},get currentUserID(){return b(n)},get searchQuery(){return b(nn)},get threadOpen(){return b(r)},get pinnedOpen(){return b(ft)},get channelNotifPreference(){return b(Ve)},get channelNotifSaving(){return b(Ye)},get channelSettingsAvailable(){return b(I)},onSearchQuery:e=>V(nn,e),onSearch:()=>void Qo(),onResetSearch:ts,onToggleThread:oc,onToggleChannelNotifications:()=>void oa(),onPinnedItems:lc,onOpenChannelSettings:mi})}};f(ne,e=>{je||e(re)});var ie=N(ne,2),oe=e=>{var t=xs(),n=A(t),i=N(A(n)),a=R(i,!0);r(n);var o=N(n,2);r(t),B(()=>c(a,(b(te),k(()=>b(te).name)))),_(`click`,o,()=>void ha(``)),u(e,t)};f(ie,e=>{b(te)&&e(oe)});var se=N(ie,2);{let e=H(()=>b(Un)!==`idle`),t=H(()=>(s(),k(()=>s().root?.id))),n=H(()=>(b(K),k(()=>b(K)?.id))),r=H(()=>(b(z),b(le),k(()=>!(!b(z)||b(le))))),i=H(()=>b(D)&&!b(Z));gt(se,{get channelID(){return b(X)},get pinnedMessageIDs(){return b(yt)},onTogglePin:cc,onCopyLink:Si,get messages(){return b(we)},get selectedDirect(){return b(z)},get selectedChannel(){return b(M)},get mentionPeople(){return b(Ft)},get mentionAttentionUserID(){return b(zt)},get restoreState(){return b(rr)},get viewKey(){return b(nr)},get loading(){return b(ar)},get unreadCount(){return b(me)},get unreadBoundarySeq(){return b(ge)},get unreadBoundaryLoaded(){return b(ye)},get unreadSince(){return b(Se)},get hasOlder(){return b(Jn)},get hasNewer(){return b(Yn)},get loadingOlder(){return b(Xn)},get loadingNewer(){return b(Qn)},get prepending(){return b(e)},get selectedThreadID(){return b(t)},get currentUserID(){return b(n)},get reactionController(){return Fe},get reactionsDisabled(){return b(r)},get canDeleteAnyMessage(){return b(i)},get deletingMessageIDs(){return b(Vr)},onListRef:e=>V(Ln,e),onActivateMessageComposer:Yi,onInlineImagePointerUp:ic,onOpenProfile:Xs,onReply:Uo,onOpenThread:Po,onJumpToQuote:e=>void qo(e),onOpenImage:$s,onOpenArtifact:ec,onLoadOlder:Oa,onLoadNewer:e=>ka(e===`wheel`),onJumpToUnread:()=>void Jo(),onHistorySettled:Fa,onReachedBottom:Ua,onMarkRead:e=>{Ua({all:!0,seq:e})},onRetry:Oo,onDiscard:ko,onDeleteMessage:Mo,get editController(){return Ie},get editScope(){return b(ir)},onMessageEdited:jo,get topics(){return b(ze)},onSelectTopic:e=>void ha(e)})}var W=N(se,2);$r(W,{get turns(){return b(_r)}});var de=N(W,2),fe=A(de);{let e=H(()=>(b(K),k(()=>b(K)?.id)));Yr(fe,{get entries(){return b(hr)},get currentUserID(){return b(e)}})}var pe=N(fe,2);{let e=H(()=>(b(Te),s(),k(()=>b(Te)&&s().root===null)));xt(pe,{get active(){return b(e)},get agentNames(){return b(Ee)}})}var he=N(pe,2),ve=e=>{var t=Ss(),n=R(t);B(()=>c(n,`Live updates: ${b(An)??``}`)),u(e,t)};f(he,e=>{b(An)&&e(ve)});var G=N(he,2),be=e=>{var t=Ss(),n=R(t);B(()=>c(n,`Mentions unavailable: ${b(Mr)??``}`)),u(e,t)};f(G,e=>{b(Mr)&&e(be)});var xe=N(G,2),Ce=e=>{var t=Cs();let n;var a=A(t),o=R(a,!0),s=N(a,2),l=R(s,!0),d=N(s,2);r(t),B(()=>{n=i(t,1,`composer-notice`,null,n,{"composer-notice--error":b(Pt).kind===`error`}),c(o,(b(Pt),k(()=>b(Pt).kind===`ephemeral`?`Only visible to you`:`Action failed`))),c(l,(b(Pt),k(()=>b(Pt).text)))}),_(`click`,d,()=>V(Pt,null)),u(e,t)};f(xe,e=>{b(Pt)&&e(Ce)});var Ae=N(xe,2),Ne=e=>{var t=Ts(),n=N(A(t),2),i=A(n);i.value=i.__value=``;var a=N(i);F(a,1,()=>b(L),e=>e.id,(e,t)=>{var n=ws(),r=R(n,!0),i={};B(()=>{c(r,(b(t),k(()=>b(t).name))),i!==(i=(b(t),k(()=>b(t).id)))&&(n.value=(n.__value=i)??``)}),u(e,n)}),r(n);var o;T(n),r(t),B(()=>{o!==(o=b(tt))&&(n.value=(n.__value=o)??``,ue(n,o))}),_(`change`,n,e=>V(tt,e.currentTarget.value)),u(e,t)};f(Ae,e=>{b(X),b(L),k(()=>b(X)&&b(L).length>0)&&e(Ne)});var Pe=N(Ae,2);{let e=H(()=>(b(z),b(le),l(ot),b(K),b(M),l(bt),k(()=>b(z)&&!b(le)?`No active recipient`:b(z)?`Message ${ot(b(z),b(K)?.id)}`:b(M)?`Message #${bt(b(M))}`:`Pick a channel to start`))),t=H(()=>!!b(z)&&!b(le)),n=H(()=>b(ur)&&b(dr)===(b(Z)?`dm`:`channel`)?b(ur):null),r=H(()=>b(X)?b(At):[]);rt(Pe,{get value(){return b(qt)},get placeholder(){return b(e)},ariaLabel:`Message body`,submitLabel:`Send`,get disabled(){return b(t)},get pendingUpload(){return b(cn)},get replyTarget(){return b(n)},showUpload:!0,showToolbar:!0,get slashCommands(){return b(r)},get botCommands(){return b(U)},get mentionPeople(){return b(Ft)},onValue:e=>{let t=b(qt);V(qt,e),e.trim()&&e!==t?Ys():e.trim()||$n()},onSubmit:()=>void So(),onKeydown:Zs,onFocus:Yi,onInputRef:e=>V(fr,e),onUploadFile:cs,onRemoveUpload:ss,onClearReply:Ko})}r(de),r(P);var Re=N(P,2),Be=e=>{var t=Es();Pr(A(t),{get upload(){return b(Vt)},onClose:tc}),r(t),ce(t,e=>V(Wt,e),()=>b(Wt)),B(()=>{t.inert=b(cr),j(t,`role`,b(lr)?`dialog`:`complementary`),j(t,`aria-modal`,b(lr)?`true`:void 0)}),u(e,t)};f(Re,e=>{b(Vt)&&e(Be)});var He=N(Re,2),Ue=e=>{{let t=H(()=>b(Vt)!==null),n=H(()=>b(cr)||b(Vt)!==null);Da(e,{get session(){return b(rn)},get covered(){return b(t)},get inert(){return b(n)},contextFor:ns,onClose:ts,onOpenResult:e=>void rs(e),onLoadMore:()=>void es()})}},We=e=>{var t=As();let n;var a=A(t),o=e=>{ua(e,{get messages(){return b(pt)},get loading(){return b(mt)},get error(){return b(_t)},get topics(){return b(ze)},get mentionPeople(){return b(Ft)},get mentionAttentionUserID(){return b(zt)},onClose:ac,onOpenThread:e=>void uc(e),onOpenImage:$s,onOpenArtifact:ec,onUnpin:e=>cc(e,!0),onSelectTopic:e=>{V(ft,!1),ha(e)}})},l=e=>{{let t=H(()=>(s(),k(()=>s().draft?.body??``))),n=H(()=>(s(),k(()=>s().draft?.quote??null))),r=H(()=>(s(),k(()=>s().draft?.error||s().error))),i=H(()=>(s(),k(()=>s().draft?.sending??!1))),a=H(()=>(b(z),b(le),k(()=>!(!b(z)||b(le))))),o=H(()=>b(an)&&b(rn)?()=>void is():void 0),c=H(()=>(b(K),k(()=>b(K)?.id))),l=H(()=>(b(z),b(le),k(()=>!(!b(z)||b(le))))),u=H(()=>b(D)&&!b(Z));Ct(e,{get history(){return Q},get root(){return s(),k(()=>s().root)},get replies(){return b(h)},get threadState(){return s(),k(()=>s().state)},get replyBody(){return b(t)},get replyTarget(){return b(n)},get replyError(){return b(r)},get replySending(){return b(i)},get mentionPeople(){return b(Ft)},get mentionAttentionUserID(){return b(zt)},get agentResponding(){return b(Te)},get respondingAgentNames(){return b(Ee)},get replyDisabled(){return b(a)},onClose:ac,get onBack(){return b(o)},onReplyBody:e=>Q.updateDraft(e),onSubmitReply:()=>void Ho(),onReplyKeydown:Qs,onReplyFocus:()=>V(mr,`thread`),onReplyInputRef:e=>V(pr,e),get currentUserID(){return b(c)},get reactionController(){return Fe},get reactionsDisabled(){return b(l)},onSetReplyTarget:Uo,onClearReply:()=>Q.setQuote(null),get canDeleteAnyMessage(){return b(u)},get deletingMessageIDs(){return b(Vr)},onDeleteMessage:Mo,get channelID(){return b(X)},get pinnedMessageIDs(){return b(yt)},onTogglePin:cc,onCopyLink:Si,get editController(){return Ie},get editScope(){return b(ir)},onMessageEdited:jo,onActivateThreadComposer:()=>V(mr,`thread`),onInlineImagePointerUp:ic,onJumpToQuote:e=>void qo(e),onOpenImage:$s,onOpenArtifact:ec})}},d=e=>{var t=ks(),n=ae(t),i=N(A(n),2);r(n);var a=N(n,2),o=e=>{var t=Ds(),n=ae(t),r=R(n,!0),i=N(n,2);B(()=>c(r,(s(),k(()=>s().error)))),_(`click`,i,()=>s().selection&&void Io(s().selection.messageID)),u(e,t)},l=e=>{var t=Os();u(e,t)};f(a,e=>{s(),k(()=>s().error)?e(o):e(l,-1)}),_(`click`,i,ac),u(e,t)},p=e=>{{let t=H(()=>(b(x),k(()=>b(x)?.name))),n=H(()=>b(Zt)===`direct`);vt(e,{get profile(){return b(dt)},get currentUser(){return b(K)},get workspaceName(){return b(t)},get currentUserRole(){return b(E)},get moderation(){return b(ee)},onClose:ac,onEdit:fi,get messagePending(){return b(n)},get messageError(){return b(en)},onMessage:e=>void Ms(e),onApprove:e=>void na(e,{role:`member`,clear_timeout:!0,blocked:!1}),onTimeout:e=>void na(e,{timeout_minutes:60}),onBlock:e=>void na(e,{blocked:!0}),onUnblock:e=>void na(e,{blocked:!1,clear_timeout:!0})})}},m=e=>{Lo(e,{})};f(a,e=>{b(ft)?e(o):(s(),k(()=>s().root)?e(l,1):(s(),k(()=>s().selection)?e(d,2):b(dt)?e(p,3):e(m,-1)))}),r(t),B(()=>{n=i(t,1,`thread`,null,n,{open:b(De),covered:b(Vt)!==null}),t.inert=b(cr)||b(Vt)!==null,j(t,`aria-hidden`,b(Vt)?`true`:void 0),j(t,`aria-label`,b(ft)?`Pinned messages pane`:b(dt)?`Profile pane`:`Thread pane`)}),u(e,t)};f(He,e=>{b(Oe)&&b(rn)?e(Ue):e(We,-1)}),r(n),ce(n,e=>V(Gt,e),()=>b(Gt));var Ge=N(n,2),Ke=e=>{{let t=H(()=>Rt!=null);Fo(e,{get user(){return b(K)},get workspaces(){return b(Le)},get currentWorkspaceID(){return b(Y)},get initialSection(){return b(hn)},get hideCommentary(){return b(Sn)},get hideToolCalls(){return b(Cn)},get userAlign(){return b(Tn)},get otherAlign(){return b(En)},get isDesktop(){return b(t)},onUserUpdated:gi,onHideCommentary:si,onHideToolCalls:ci,onUserAlign:ii,onOtherAlign:oi,onBrowserNotificationsChanged:e=>V(xn,e),onClose:fc})}};f(Ge,e=>{b(mn)&&b(K)&&e(Ke)});var qe=N(Ge,2),Je=e=>{Na(e,{get channel(){return b(M)},get saving(){return b(_n)},get error(){return b(vn)},onClose:fc,onArchivedChange:e=>void hi(e)})};f(qe,e=>{b(gn)&&b(M)&&e(Je)});var Xe=N(qe,2),Ze=e=>{{let t=H(()=>b(Zt)===`channel`);ai(e,{get channelName(){return b(Yt)},get pending(){return b(t)},get error(){return b($t)},onChannelName:e=>V(Yt,e),onClose:fc,onCreate:()=>void ra()})}};f(Xe,e=>{b(yn)&&e(Ze)});var Qe=N(Xe,2),et=e=>{{let t=H(()=>(b(K),k(()=>b(K)?.id))),n=H(()=>b(Zt)===`direct`),r=H(()=>b(en)||b(Mr));di(e,{get people(){return b(Ft)},get currentUserID(){return b(t)},get memberID(){return b(Xt)},get pending(){return b(n)},get error(){return b(r)},onMemberID:e=>V(Xt,e),onClose:fc,onStart:e=>void Ms(e)})}};f(Qe,e=>{b(bn)&&e(et)});var nt=N(Qe,2),it=e=>{{let t=H(()=>(b(Vr),b(Hr),k(()=>b(Vr).has(b(Hr).id))));Kr(e,{get message(){return b(Hr)},get deleting(){return b(t)},get error(){return b(Wr)},onClose:fc,onConfirm:()=>void No()})}};f(nt,e=>{b(Hr)&&e(it)});var at=N(nt,2),st=e=>{$e(e,{get url(){return b(Bt),k(()=>b(Bt).url)},get title(){return b(Bt),k(()=>b(Bt).title)},onClose:fc})};f(at,e=>{b(Bt)&&e(st)}),B(()=>{a=i(n,1,`shell`,null,a,{"desktop-shell":je,"nav-open":b(cr),"sidebar-collapsed":b(sr),"thread-open":b(De)&&!b(Oe),"search-open":b(Oe),"artifact-open":b(Vt)!==null}),j(n,`data-connected`,b(kn)),j(n,`data-app-ready`,b(kn)&&b(Dn)),j(p,`aria-expanded`,b(cr)),P.inert=b(cr)}),_(`click`,p,()=>V(cr,!b(cr))),u(e,t)};f(gc,e=>{b(On)?e(_c):e(vc,-1)}),u(e,hc),g(),m()}s([`click`,`change`]);export{_s as n,Ms as t}; \ No newline at end of file diff --git a/apps/api/internal/webassets/dist/_app/immutable/chunks/DACoBCa_.js b/apps/api/internal/webassets/dist/_app/immutable/chunks/DACoBCa_.js new file mode 100644 index 000000000..b3e1dc363 --- /dev/null +++ b/apps/api/internal/webassets/dist/_app/immutable/chunks/DACoBCa_.js @@ -0,0 +1,4 @@ +const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./DKccj-zk.js","./BaNbYf_w.js"])))=>i.map(i=>d[i]); +import{t as e}from"./DK3Fl9T5.js";import{$ as t,A as n,At as r,C as i,E as a,Et as o,H as s,I as c,J as l,L as u,M as d,P as f,R as p,St as m,T as h,Tt as g,U as _,V as v,W as y,Y as b,_ as x,_t as S,a as C,at as w,b as T,ct as E,d as D,dt as O,et as k,ft as A,g as j,gt as ee,h as M,ht as N,it as P,j as F,jt as I,k as L,kt as te,l as ne,mt as R,n as re,o as ie,p as ae,pt as oe,r as se,s as ce,st as z,u as le,v as B,vt as V,x as ue,xt as H,yt as U,z as W}from"./BTIB_WQZ.js";import{c as de,n as fe,t as pe}from"./CRok6MwI.js";import{t as me}from"./BaNbYf_w.js";import"./xihTtKlq.js";import"./DFzK05fS.js";import{a as he,c as ge,i as _e,l as ve,n as G,s as ye,t as be,u as xe}from"./DEPNME54.js";import{c as Se,d as Ce,f as we,h as Te,i as Ee,l as De,m as Oe,n as ke,p as Ae,r as je,s as Me,t as Ne,u as Pe}from"./Dqjw8vaP.js";import{a as Fe,i as K,n as Ie,o as Le,s as Re,t as ze}from"./B4px22Nd.js";import{n as q,t as Be}from"./DBpO2iwN.js";import"./j4GI4VLW.js";import{C as Ve,D as He,E as Ue,I as We,L as Ge,R as Ke,S as qe,T as Je,_ as Ye,b as Xe,f as J,g as Ze,h as Y,j as Qe,k as $e,m as X,p as et,r as Z,u as Q,v as tt,w as nt,x as rt,y as it}from"./BNjDjM6i.js";import{a as at,c as ot,f as st,i as ct,l as lt,o as ut,p as dt,s as ft,t as pt,u as mt}from"./ByQ3bZN5.js";import{i as ht,n as gt,r as _t,t as vt}from"./CSysFL2J.js";import{n as yt,t as bt}from"./DlGnnCJo.js";import{n as xt,r as St,t as Ct}from"./DuhkHvCz.js";import{p as wt,r as Tt}from"./CVdgRPye.js";import{r as Et,t as Dt}from"./BIhzYFGW.js";var Ot={url:`/`,label:`cc`};function kt(e){if(e.startsWith(`//`))return!1;try{if(e.startsWith(`/`)){let t=`https://clickclack.invalid`;return new URL(e,t).origin===t}let t=new URL(e);return(t.protocol===`http:`||t.protocol===`https:`)&&t.host!==``&&!t.username&&!t.password}catch{return!1}}function At(e){if(!e||typeof e!=`object`)return Ot;let t=e,n=typeof t.url==`string`?t.url:``,r=n.trim(),i=typeof t.label==`string`?t.label.trim():``,a=/[\u0000-\u001f\u007f\\]/u.test(n);return{url:r&&!a&&kt(r)?r:Ot.url,label:i&&Array.from(i).length<=32?i:Ot.label}}function jt(e){return e===Ot.label}function Mt(e){return jt(e.label)?`ClickClack home`:`${e.label} home`}async function Nt(e){try{return At(await e(`/api/home-link`))}catch{return Ot}}var Pt=`clickclack:browser-notifications-enabled:v1:`;function Ft(e){return`${Pt}${e}`}function It(e){if(!e)return!1;try{return window.localStorage.getItem(Ft(e))===`enabled`}catch{return!1}}function Lt(e,t){if(!e)return!1;try{return t?window.localStorage.setItem(Ft(e),`enabled`):window.localStorage.removeItem(Ft(e)),!0}catch{return!1}}var Rt=typeof window>`u`?void 0:window.clickclackDesktop;function zt(){return typeof navigator<`u`&&`serviceWorker`in navigator&&typeof window<`u`&&`PushManager`in window&&`Notification`in window}function Bt(){return typeof window>`u`?!1:window.navigator.standalone===!0||typeof window.matchMedia==`function`&&window.matchMedia(`(display-mode: standalone)`).matches}function Vt(){if(typeof navigator>`u`)return!1;let e=navigator.userAgent;return/iPhone|iPad|iPod/.test(e)?!0:e.includes(`Macintosh`)&&(navigator.maxTouchPoints||0)>1}function Ht(e=typeof navigator>`u`?``:navigator.userAgent,t=typeof navigator>`u`?0:navigator.maxTouchPoints||0){let n=[[/iPhone/,`iPhone`],[/iPad/,`iPad`],[/Android/,`Android`],[/Macintosh|Mac OS X/,/Macintosh/.test(e)&&t>1?`iPad`:`Mac`],[/Windows/,`Windows`],[/Linux/,`Linux`]].find(([t])=>t.test(e))?.[1]??`This device`,r=/Edg\//.test(e)?`Edge`:/Chrome\//.test(e)?`Chrome`:/Firefox\//.test(e)?`Firefox`:/Safari\//.test(e)?`Safari`:``;return r?`${n} ${r}`:n}function Ut(e,t){if(!e)return!0;let n=ArrayBuffer.isView(e)?new Uint8Array(e.buffer,e.byteOffset,e.byteLength):new Uint8Array(e);return n.length===t.length&&n.every((e,n)=>e===t[n])}function Wt(e){let t=e.trim().replace(/-/g,`+`).replace(/_/g,`/`),n=atob(t+`=`.repeat((4-t.length%4)%4)),r=new Uint8Array(new ArrayBuffer(n.length));for(let e=0;evoid 0)}let o=await e.pushManager.subscribe({userVisibleOnly:!0,applicationServerKey:i});return en(n,r),o}async function an(){if(!zt())return null;let e=await navigator.serviceWorker.getRegistration(`/`);return e?await e.pushManager.getSubscription():null}async function on(){return(await G(`/api/me`)).user.id}async function sn(e,t){let n=e.toJSON();return(await G(`/api/me/push/subscriptions`,{method:`PUT`,body:JSON.stringify({user_id:t,endpoint:n.endpoint??e.endpoint,keys:{p256dh:n.keys?.p256dh??``,auth:n.keys?.auth??``},user_agent:Ht()})})).subscription}async function cn(e,t){await G(`/api/me/push/subscriptions`,{method:`DELETE`,body:JSON.stringify({user_id:t,endpoint:e})})}async function ln(e){if(e&&zt())try{let t=await an(),n=Zt(e);if(!n&&!t||await on()!==e)return;let r=await tn(t);if(!r.enabled)return;if(!n){if(t&&!r.this_device){await t.unsubscribe();let e=await navigator.serviceWorker.getRegistration(`/`);for(let t of await e?.getNotifications()??[])t.close()}return}await sn(await rn(await nn(),r,e),e)}catch{}}var un=`from`,dn=`push`;function fn(e){let t=new URL(e,`https://clickclack.invalid`);return t.searchParams.get(un)===dn?(t.searchParams.delete(un),`${t.pathname}${t.search}${t.hash}`):null}function pn(e,t){let n={width:0,height:0,durationMS:0},r=e.type.startsWith(`image/`);return t.aborted||!r&&!e.type.startsWith(`video/`)?Promise.resolve(n):new Promise(i=>{let a=URL.createObjectURL(e),o=r?new Image:document.createElement(`video`),s=r?`load`:`loadedmetadata`;function c(e=n){o.removeEventListener(s,u),o.removeEventListener(`error`,l),t.removeEventListener(`abort`,l),o.removeAttribute(`src`),o instanceof HTMLVideoElement&&o.load(),URL.revokeObjectURL(a),i(e)}function l(){c()}function u(){c(o instanceof HTMLImageElement?{width:o.naturalWidth,height:o.naturalHeight,durationMS:0}:{width:o.videoWidth,height:o.videoHeight,durationMS:Number.isFinite(o.duration)&&o.duration>0?Math.round(o.duration*1e3):0})}o instanceof HTMLVideoElement&&(o.preload=`metadata`,o.muted=!0),o.addEventListener(s,u),o.addEventListener(`error`,l),t.addEventListener(`abort`,l,{once:!0}),o.src=a})}var mn=new Set([`agent_commentary`,`agent_tool`]),hn=18e4;function gn(e){return e.kind!==void 0&&mn.has(e.kind)}function _n(e){return e.kind===void 0||e.kind===`message`}function vn(e){return e.author?.id||e.author_id||``}function yn(e){return`${e.channel_id?`channel:${e.channel_id}`:`direct:${e.direct_conversation_id||``}`}\u0000${vn(e)}\u0000${e.turn_id||e.id}`}function bn(e){let t=e.trim(),n=``,r=``,i=t.match(/^\*\*([^*]+)\*\*\s*\n+([\s\S]+)$/),a=t.match(/^\*\*([^*]+)\*\*$/);if(i)n=i[1].trim(),r=Sn(i[2]);else if(a)n=a[1].trim();else return xn(t.replace(/\*\*/g,``).trim(),``);return xn(n,r)}function xn(e,t){let n=Sn(e),r=n.indexOf(` `),i,a;r===-1?(i=n,a=``):(i=n.slice(0,r),a=n.slice(r+1).trim());let o=[a,t].filter(e=>e.length>0).join(` · `);return{name:i,detail:o||void 0}}function Sn(e){return e.replace(/\s+/g,` `).trim()}function Cn(e,t,n,r){let i=[];for(let e of t)if(e.kind===`agent_tool`){if(r.hideToolCalls)continue;let t=bn(e.body);i.push({type:`tool`,id:e.id,name:t.name,detail:t.detail,full:e.body.trim()})}else{if(r.hideCommentary)continue;let t=e.body.trim();t&&i.push({type:`commentary`,id:e.id,body:t})}return i.length===0?null:{turnId:e,items:i,final:n}}function wn(e,t,n=Date.now()){let r=new Map,i=new Map;for(let t=0;to.firstIndex;if(!r){let e=Date.parse(o.rows[o.rows.length-1].created_at);Number.isFinite(e)&&n-e>hn&&(r=!0)}a.set(t,r)}let o=[];for(let n=0;n=Kn)&&(qn.active=!0,qn.lastPingAt=t,Xn(e,`typing.started`)),qn.idleTimer&&window.clearTimeout(qn.idleTimer),qn.idleTimer=window.setTimeout(()=>{qn&&=(Qn(qn),null)},Gn)}async function Qn(e){e.idleTimer&&window.clearTimeout(e.idleTimer),e.active&&await Xn(e.scope,`typing.stopped`)}function $n(){qn&&=(Qn(qn),null)}var er=2e3,tr=2097152;function nr(e){let t=document.createElement(`span`);return t.textContent=e,t.innerHTML}function rr(e,t,n){return!t||e.length>262144?Promise.resolve(nr(e)):new Promise((r,i)=>{let a=new Worker(new URL(new URL(`../workers/highlight.worker-8wMHDvrm.js`,import.meta.url).href,``+import.meta.url),{type:`module`}),o=!1,s=e=>{o||(o=!0,clearTimeout(l),n.removeEventListener(`abort`,c),a.terminate(),e())},c=()=>s(()=>i(new DOMException(`Syntax highlighting was aborted.`,`AbortError`))),l=window.setTimeout(()=>s(()=>r(nr(e))),er);if(a.onmessage=t=>{let n=t.data;`error`in n?s(()=>r(nr(e))):s(()=>r(n.html))},a.onerror=()=>s(()=>r(nr(e))),n.addEventListener(`abort`,c,{once:!0}),n.aborted){c();return}a.postMessage({source:e,language:t,outputLimit:tr})})}var ir=5e3;function ar(e,t,n){return new Promise((r,i)=>{let a=new Worker(new URL(new URL(`../workers/office.worker-DYsoLmCH.js`,import.meta.url).href,``+import.meta.url),{type:`module`}),o=!1,s=e=>{o||(o=!0,clearTimeout(l),n.removeEventListener(`abort`,c),a.terminate(),e())},c=()=>s(()=>i(new DOMException(`Office preview was aborted.`,`AbortError`))),l=window.setTimeout(()=>s(()=>i(Error(`Office preview took too long and was stopped.`))),ir);if(a.onmessage=t=>{let n=t.data;if(`error`in n){s(()=>i(Error(n.error)));return}if(n.kind!==e){s(()=>i(Error(`Office preview returned an unexpected result.`)));return}s(()=>r(n.preview))},a.onerror=()=>s(()=>i(Error(`Could not parse this Office file safely.`))),n.addEventListener(`abort`,c,{once:!0}),n.aborted){c();return}let u=t.byteOffset===0&&t.buffer instanceof ArrayBuffer&&t.byteLength===t.buffer.byteLength?t:t.slice(),d={kind:e,bytes:u};a.postMessage(d,[u.buffer])})}var or=16777216,sr=1e4,cr=1e4,lr=`This PDF page is too large to preview safely. Download the original to open it locally.`;function ur(e,t){if(!Number.isSafeInteger(e)||!Number.isSafeInteger(t)||e<1||t<1||e>8192||t>8192||e*t>16777216)throw Error(lr)}var dr=new URL(`../assets/pdf.worker.PhvoOpM7.mjs`,import.meta.url).href,fr=W(`
          `),pr=W(`

          Preparing a safe preview.

          `),mr=W(``),hr=W(`
          No preview for this file type

          You can still download the original file.

          Download original
          `),gr=W(`
          `,1),_r=W(` `),vr=W(` `),yr=W(` `),br=W(` `),xr=W(`

          Preview is limited to 10,000 cells, the first 1,000 rows, and the first 100 columns. Download the original to inspect omitted cells.

          `),Sr=W(``),Cr=W(`
          Raw cached values; number and date formatting omitted
          `,1),wr=W(`

          `),Tr=W(`

          `),Er=W(`

          `),Dr=W(`

          Some slide content was omitted by preview limits.

          `),Or=W(`

          Text outline only. Visuals, layout, animations, and speaker notes are omitted.

          `,1),kr=W(`
          `),Ar=W(`
          `),jr=W(`
          `),Mr=W(`
           
          `),Nr=W(`
          `,1);function Pr(e,t){o(t,!0);let a=U(null),s=m(()=>it(t.upload)),l=U(`preview`),h=U(`idle`),v=U(``),y=U(``),x=U(``),S=U(!1),C=U(``),w=U(null),T=U(1),D=U(1),O=U(!1),k=U(``),ee=null,M=!1,P=U(null),I=U(0),L=U(null),ne=U(0),ie=1e4,ae=65536,se=5e3;class ce extends Error{}let B=m(()=>Ze(b(s))),ue=m(()=>Ve(t.upload)),H=m(()=>(b(s)===`markdown`||b(s)===`html`)&&b(h)===`ready`&&b(S));function W(e){return`This ${b(B).toLowerCase()} is ${qe(t.upload.byte_size)}. Preview is limited to ${qe(e)}.`}function de(e){pe(e);let t=document.createElement(`template`);t.innerHTML=e;let n=Xe.sanitize(t.content,{RETURN_DOM_FRAGMENT:!0,USE_PROFILES:{html:!0},FORBID_TAGS:[`base`,`embed`,`form`,`iframe`,`link`,`meta`,`object`,`script`,`style`],FORBID_ATTR:[`action`,`formaction`,`srcset`,`style`,`xlink:href`]});for(let e of n.querySelectorAll(`*`))for(let t of Array.from(e.attributes))e.removeAttribute(t.name);let r=document.createElement(`div`);r.append(n);let i=r.innerHTML;return he(i),`${i}`}function fe(e){pe(e);let t=X(e);return he(t),Xe.sanitize(t,{ALLOWED_TAGS:[`blockquote`,`br`,`code`,`del`,`em`,`h1`,`h2`,`h3`,`h4`,`h5`,`h6`,`hr`,`li`,`ol`,`p`,`pre`,`strong`,`table`,`tbody`,`td`,`th`,`thead`,`tr`,`ul`],ALLOWED_ATTR:[]})}function pe(e){if(e.length>65536)throw new ce(`Structured preview exceeded the safe source limit.`);let t=0;for(let n of e)if("<[]>*_`-+.!#>|~".includes(n)&&(t+=1,t>ie))throw new ce(`Structured preview exceeded the safe complexity limit.`)}function he(e){if(e.length>4194304)throw new ce(`Rendered preview exceeded the safe output limit.`);let t=0;for(let n of e)if(n===`<`&&++t>ie*2)throw new ce(`Rendered preview exceeded the safe element limit.`)}function ge(e){return`Preview data exceeded the ${qe(e)} safety limit.`}async function _e(e,t){let n=await fetch(b(ue),{credentials:`include`,signal:e});if(!n.ok)throw n.status===401||n.status===403?Error(`You no longer have access to this artifact.`):n.status===404?Error(`This artifact is no longer available.`):Error(`Could not load this artifact (${n.status}).`);let r=Number(n.headers.get(`Content-Length`));if(Number.isFinite(r)&&r>t)throw Error(ge(t));if(!n.body){let e=new Uint8Array(await n.arrayBuffer());if(e.byteLength>t)throw Error(ge(t));return e}let i=n.body.getReader(),a=[],o=0;try{for(;;){let{done:e,value:n}=await i.read();if(e)break;if(o+=n.byteLength,o>t)throw await i.cancel(),Error(ge(t));a.push(n)}}finally{i.releaseLock()}let s=new Uint8Array(o),c=0;for(let e of a)s.set(e,c),c+=e.byteLength;return s}async function ve(e,t){return new TextDecoder(`utf-8`,{fatal:!1}).decode(await _e(e,t))}async function G(e){ee?.(),ee=null,V(w,null),V(y,``),V(x,``),V(S,!1),V(C,``),V(T,1),V(D,1),V(k,``),M=!1,V(P,null),V(I,0),V(L,null),V(ne,0),V(l,`preview`),V(v,``);let n=tt(b(s));if(n!==void 0&&t.upload.byte_size>n){V(h,`error`),V(v,W(n),!0);return}if(b(s)===`unsupported`){V(h,`ready`);return}V(h,`loading`);try{if(b(s)===`pdf`){let t=await me(()=>import(`./DKccj-zk.js`),__vite__mapDeps([0,1]),import.meta.url);if(e.aborted)return;t.GlobalWorkerOptions.workerSrc=dr;let r=new AbortController,i=()=>r.abort();e.addEventListener(`abort`,i,{once:!0});let a=null,o=0,s=new Promise((e,t)=>{o=window.setTimeout(()=>{r.abort(),a?.destroy(),t(Error(`PDF preview took too long and was stopped.`))},sr)}),c;try{if(c=await Promise.race([_e(r.signal,n),s]),e.aborted)throw new DOMException(`Aborted`,`AbortError`);a=new t.PDFWorker,await Promise.race([a.promise,s])}catch(t){throw clearTimeout(o),e.removeEventListener(`abort`,i),t}if(e.aborted||!a){clearTimeout(o),e.removeEventListener(`abort`,i),a?.destroy();return}let l=a.port,u=e=>{let t=e.data;typeof t==`object`&&t&&`reason`in t&&typeof t.reason==`object`&&t.reason!==null&&`message`in t.reason&&t.reason.message===`Image exceeded maximum allowed size and was removed.`&&(M=!0,ee?.(),V(h,`error`),V(v,`PDF page content could not be rendered completely within safety limits.`))};l.addEventListener(`message`,u);let d=null,f=!1;ee=()=>{f||(f=!0,l.removeEventListener(`message`,u),d&&d.destroy(),a.destroy(),V(w,null))};let p=t.getDocument({data:c,maxImageSize:or,canvasMaxAreaInBytes:or*4,stopAtErrors:!0,worker:a});d=p;try{V(w,await Promise.race([p.promise,s]),!0)}finally{clearTimeout(o),e.removeEventListener(`abort`,i)}}else if(b(s)===`spreadsheet`||b(s)===`presentation`){let t=await _e(e,n);if(e.aborted)return;if(b(s)===`spreadsheet`){let n=await ar(b(s),t,e);if(e.aborted)return;V(P,n,!0)}else{let n=await ar(b(s),t,e);if(e.aborted)return;V(L,n,!0)}}else{if(V(y,await ve(e,n),!0),e.aborted)return;b(s)===`code`&&V(C,await rr(b(y),Ye(t.upload),e),!0);try{b(s)===`markdown`&&(V(x,fe(b(y)),!0),V(S,!0)),b(s)===`html`&&(V(x,de(b(y)),!0),V(S,!0))}catch(e){if(!(e instanceof ce))throw e;V(x,``),V(l,`source`)}}e.aborted||V(h,`ready`)}catch(t){if(e.aborted||t instanceof Error&&t.name===`AbortError`)return;ee?.(),ee=null,V(h,`error`),V(v,t instanceof Error?t.message:`Could not preview this artifact.`,!0)}}E(()=>{let e=new AbortController;return G(e.signal),()=>e.abort()}),E(()=>{if(b(s)!==`pdf`||!b(w)||!b(a)||b(h)!==`ready`)return;let e=b(w),t=b(T),n=b(D),r=!1,i=null,o=null,c=null,l=0;return V(O,!0),V(k,``),(async()=>{try{if(l=window.setTimeout(()=>{r||(i?.cancel(),c?.cancel(),ee?.(),V(h,`error`),V(v,`PDF page rendering took too long and was stopped.`))},cr),o=await e.getPage(t),r||!b(a))return;let s=``,u=0;c=o.streamTextContent().getReader();try{for(;!r;){let{done:e,value:t}=await c.read();if(e)break;for(let e of t.items){if(u+=1,u>se){await c.cancel(),s=`${s}…`;break}if(!(`str`in e)||!e.str)continue;let t=`${s}${s?` `:``}${e.str}`;if(t.length>ae){await c.cancel(),s=`${t.slice(0,ae)}…`;break}s=t}if(u>se||s.endsWith(`…`))break}}finally{c.releaseLock(),c=null}if(r)return;V(k,s||`This page has no extractable text.`,!0);let d=o.getViewport({scale:n}),f=Math.min(window.devicePixelRatio||1,2),p=Math.max(1,Math.floor(d.width*f)),m=Math.max(1,Math.floor(d.height*f));ur(p,m);let g=b(a).getContext(`2d`);if(!g)throw Error(`PDF canvas is unavailable.`);if(b(a).width=p,b(a).height=m,b(a).style.width=`${d.width}px`,b(a).style.height=`${d.height}px`,g.setTransform(f,0,0,f,0,0),i=o.render({canvasContext:g,viewport:d}),await i.promise,M)throw Error(`PDF page content could not be rendered completely within safety limits.`)}catch(e){!r&&!(e instanceof Error&&e.name===`RenderingCancelledException`)&&(ee?.(),V(h,`error`),V(v,e instanceof Error?e.message:`Could not render this PDF page.`,!0))}finally{clearTimeout(l),o?.cleanup(),o=null,r||V(O,!1)}})(),()=>{r=!0,clearTimeout(l),i?.cancel(),c?.cancel()}}),re(()=>ee?.());function ye(e){let t=e.match(/^[A-Z]+/i)?.[0]?.toUpperCase()||`A`,n=0;for(let e of t)n=n*26+e.charCodeAt(0)-64;return n}function be(e){return Number(e.match(/\d+$/)?.[0]||1)}function xe(e){let t=``;for(let n=e;n>0;n=Math.floor((n-1)/26))t=String.fromCharCode(65+(n-1)%26)+t;return t}let Se=m(()=>{let e=b(P)?.sheets[b(I)];if(!e)return{columns:[],rows:[],clipped:!1};let t=Math.max(1,...e.cells.map(e=>ye(e.reference))),n=Math.max(1,...e.cells.map(e=>be(e.reference))),r=Math.min(100,t),i=Math.min(1e3,Math.floor(1e4/r),n),a=new Map(e.cells.map(e=>[e.reference.toUpperCase(),e.value])),o=Array.from({length:r},(e,t)=>xe(t+1));return{columns:o,rows:Array.from({length:i},(e,t)=>({number:t+1,values:o.map(e=>a.get(`${e}${t+1}`)||``)})),clipped:t>r||n>i}});var Ce=Nr(),we=oe(Ce),Te=A(we),Ee=A(Te),De=R(Ee,!0),Oe=N(Ee,2),ke=R(Oe,!0),Ae=N(Oe,2),je=R(Ae,!0);r(Te);var Me=N(Te,2),Ne=A(Me),Pe=e=>{var t=fr(),n=A(t);let a;var o=N(n,2);let s;r(t),z(()=>{j(t,`aria-label`,`${b(B)} view`),j(n,`aria-pressed`,b(l)===`preview`),a=i(n,1,``,null,a,{active:b(l)===`preview`}),j(o,`aria-pressed`,b(l)===`source`),s=i(o,1,``,null,s,{active:b(l)===`source`})}),_(`click`,n,()=>V(l,`preview`)),_(`click`,o,()=>V(l,`source`)),u(e,t)};f(Ne,e=>{b(H)&&e(Pe)});var Fe=N(Ne,2),K=N(Fe,2);r(Me),r(we);var Ie=N(we,2);let Le;var Re=A(Ie),ze=e=>{var t=pr(),n=N(A(t),2),i=R(n);te(2),r(t),z(e=>c(i,`Opening ${e??``}`),[()=>b(B).toLowerCase()]),u(e,t)},q=e=>{var n=mr(),i=N(A(n),4),a=R(i,!0),o=N(i,2);r(n),z(()=>{c(a,b(v)),j(o,`href`,b(ue)),j(o,`download`,t.upload.filename)}),u(e,n)},Be=e=>{var n=hr(),i=N(A(n),6);r(n),z(()=>{j(i,`href`,b(ue)),j(i,`download`,t.upload.filename)}),u(e,n)},He=e=>{var t=gr(),n=oe(t),o=A(n),s=N(o,2),l=R(s),d=N(s,2),f=N(d,4),p=N(f,2),m=R(p),h=N(p,2);r(n);var g=N(n,2);let v;var y=A(g);le(y,e=>V(a,e),()=>b(a));var x=N(y,2),S=R(x,!0);r(g),z(e=>{o.disabled=b(T)<=1||b(O),c(l,`Page ${b(T)??``} of ${b(w).numPages??``}`),d.disabled=b(T)>=b(w).numPages||b(O),f.disabled=b(D)<=.6||b(O),c(m,`${e??``}%`),h.disabled=b(D)>=2||b(O),v=i(g,1,`artifact-viewer__pdf-stage`,null,v,{"is-rendering":b(O)}),j(g,`aria-label`,`PDF page ${b(T)} visual preview`),j(x,`aria-label`,`PDF page ${b(T)} text`),c(S,b(k))},[()=>Math.round(b(D)*100)]),_(`click`,o,()=>V(T,b(T)-1)),_(`click`,d,()=>V(T,b(T)+1)),_(`click`,f,()=>V(D,Math.max(.6,b(D)-.2),!0)),_(`click`,h,()=>V(D,Math.min(2,b(D)+.2),!0)),u(e,t)},Ue=e=>{var t=Cr(),n=oe(t),a=A(n),o=R(a),s=N(a,4),l=e=>{var t=_r(),n=R(t);z(()=>c(n,`${b(P).hiddenSheets??``} hidden ${b(P).hiddenSheets===1?`sheet`:`sheets`} omitted`)),u(e,t)};f(s,e=>{b(P).hiddenSheets>0&&e(l)});var p=N(s,2),m=e=>{var t=_r(),n=R(t);z(()=>c(n,`${b(P).unsupportedSheets??``} non-worksheet ${b(P).unsupportedSheets===1?`sheet`:`sheets`} omitted`)),u(e,t)};f(p,e=>{b(P).unsupportedSheets>0&&e(m)}),r(n);var h=N(n,2),g=A(h),v=A(g),y=A(v),x=N(A(y));F(x,17,()=>b(Se).columns,d,(e,t)=>{var n=vr(),r=R(n,!0);z(()=>c(r,b(t))),u(e,n)}),r(y),r(v);var S=N(v);F(S,21,()=>b(Se).rows,d,(e,t)=>{var n=br(),i=A(n),a=R(i,!0),o=N(i);F(o,17,()=>b(t).values,d,(e,t)=>{var n=yr(),r=R(n,!0);z(()=>c(r,b(t))),u(e,n)}),r(n),z(()=>c(a,b(t).number)),u(e,n)}),r(S),r(g);var C=N(g,2),w=e=>{var t=xr();u(e,t)};f(C,e=>{(b(Se).clipped||b(P).sheets[b(I)].truncated)&&e(w)}),r(h);var T=N(h,2);F(T,21,()=>b(P).sheets,d,(e,t,n)=>{var r=Sr();let a;var o=R(r,!0);z(()=>{j(r,`aria-selected`,b(I)===n),a=i(r,1,``,null,a,{active:b(I)===n}),c(o,b(t).name)}),_(`click`,r,()=>V(I,n,!0)),u(e,r)}),r(T),z(()=>{c(o,`${b(P).sheets.length??``} ${b(P).sheets.length===1?`sheet`:`sheets`}`),j(h,`aria-label`,`${b(P).sheets[b(I)].name} worksheet`)}),u(e,t)},We=e=>{var t=Or(),n=oe(t),i=A(n),a=N(i,2),o=R(a),s=N(a,2);r(n);var l=N(n,2),m=A(l);F(m,21,()=>b(L).slides[b(ne)].paragraphs,d,(e,t,n)=>{var r=p(),i=oe(r),a=e=>{var n=wr(),r=R(n,!0);z(()=>c(r,b(t))),u(e,n)},o=e=>{var n=Tr(),r=R(n,!0);z(()=>c(r,b(t))),u(e,n)};f(i,e=>{n===0?e(a):e(o,-1)}),u(e,r)}),r(m);var h=N(m,4),g=e=>{var t=Er(),n=R(t);z(()=>c(n,`${b(L).hiddenSlides??``} hidden ${b(L).hiddenSlides===1?`slide`:`slides`} omitted.`)),u(e,t)};f(h,e=>{b(L).hiddenSlides>0&&e(g)});var v=N(h,2),y=e=>{var t=Dr();u(e,t)};f(v,e=>{b(L).truncated&&e(y)}),r(l),z(()=>{i.disabled=b(ne)===0,c(o,`Slide ${b(ne)+1} of ${b(L).slides.length??``}`),s.disabled=b(ne)>=b(L).slides.length-1,j(m,`aria-label`,`Slide ${b(ne)+1}: ${b(L).slides[b(ne)].title}`)}),_(`click`,i,()=>V(ne,b(ne)-1)),_(`click`,s,()=>V(ne,b(ne)+1)),u(e,t)},Ge=e=>{var t=kr();n(t,()=>b(x),!0),r(t),u(e,t)},Ke=e=>{var t=Ar();n(t,()=>b(x),!0),r(t),u(e,t)},Je=e=>{var t=jr(),i=A(t);n(i,()=>b(C),!0),r(i),r(t),u(e,t)},J=e=>{var t=Mr(),n=A(t),i=R(n,!0);r(t),z(()=>c(i,b(y))),u(e,t)};f(Re,e=>{b(h)===`loading`?e(ze):b(h)===`error`?e(q,1):b(s)===`unsupported`?e(Be,2):b(s)===`pdf`&&b(w)?e(He,3):b(s)===`spreadsheet`&&b(P)?e(Ue,4):b(s)===`presentation`&&b(L)?e(We,5):b(s)===`html`&&b(l)===`preview`&&b(x)?e(Ge,6):b(s)===`markdown`&&b(l)===`preview`?e(Ke,7):b(s)===`code`?e(Je,8):e(J,-1)}),r(Ie),z(e=>{c(De,b(B)),j(Oe,`title`,t.upload.filename),c(ke,t.upload.filename),c(je,e),j(Fe,`href`,b(ue)),j(Fe,`download`,t.upload.filename),j(Fe,`aria-label`,`Download ${t.upload.filename}`),Le=i(Ie,1,`artifact-viewer__body`,null,Le,{"is-pdf":b(s)===`pdf`,"is-office":b(s)===`spreadsheet`||b(s)===`presentation`})},[()=>qe(t.upload.byte_size)]),_(`click`,K,function(...e){t.onClose?.apply(this,e)}),u(e,Ce),g()}s([`click`]);var Fr=W(``),Ir=W(`
          `),Lr=W(`

          or

          `),Rr=W(` `,1),zr=W(``),Br=W(``),Vr=W(`

          `),Hr=W(`
          ClickClack OpenClaw workspace chat

          Welcome.

          Have a sign-in token?
          `,1);function Ur(e,t){o(t,!0);let n=Rt?.integratedTitleBar===!0,i=U(``),a=ge(),s=a.includes(`github`),l=a.includes(`password`),d=!Rt&&a.includes(`openclaw`),p=U(``),m=U(``),h=U(``),v=U(!1),x=U(``),S=l?s?`Sign in with your ClickClack account, or continue with GitHub.`:`Sign in with your ClickClack account.`:s?`Sign in with GitHub to join the guest room.`:d?`Sign in with OpenClaw ID to join the guest room.`:`Sign in with a token from your ClickClack administrator.`,C=s&&!l?`Any GitHub account can join.`:``;async function w(e){if(Rt){e.preventDefault(),V(i,`Opening GitHub in your browser…`);try{await Rt.signInWithGitHub(),V(i,`Finish signing in in your browser. ClickClack will complete here automatically.`)}catch{V(i,`Could not open your browser. Try again.`)}}}async function T(e,t){if(!b(v)){V(v,!0),V(x,``);try{await G(e,{method:`POST`,body:JSON.stringify(t)}),window.location.reload()}catch(e){V(x,xe(e,`Could not sign in.`),!0),V(v,!1)}}}function E(e){e.preventDefault(),T(`/api/auth/password/login`,{identifier:b(p),password:b(m)})}function D(e){e.preventDefault(),T(`/api/auth/magic/consume`,{token:b(h)})}var O=Hr(),k=oe(O),ee=e=>{var t=Fr();z(()=>j(t,`data-platform`,Rt.platform)),u(e,t)};f(k,e=>{n&&Rt&&e(ee)});var P=N(k,2),F=A(P),I=A(F),L=A(I);J(L,{class:`mark`,size:44}),te(2),r(I);var ne=N(I,2),re=N(A(ne),2),ie=R(re,!0);r(ne);var se=N(ne,2),ce=e=>{var t=Ir(),n=A(t),i=N(A(n),2);M(i),r(n);var a=N(n,2),o=N(A(a),2);M(o),r(a);var s=N(a,2),l=R(s,!0);r(t),z(()=>{s.disabled=b(v),c(l,b(v)?`Signing in...`:`Sign in`)}),y(`submit`,t,E),ae(i,()=>b(p),e=>V(p,e)),ae(o,()=>b(m),e=>V(m,e)),u(e,t)};f(se,e=>{l&&e(ce)});var le=N(se,2),B=e=>{var t=Rr(),n=oe(t),r=e=>{var t=Lr();u(e,t)};f(n,e=>{l&&e(r)});var i=N(n,2);z(e=>j(i,`href`,e),[()=>he(`/api/auth/github/start`)]),_(`click`,i,w),u(e,t)};f(le,e=>{s&&e(B)});var ue=N(le,2),H=e=>{var t=zr();z(e=>j(t,`href`,e),[()=>he(`/api/auth/openclaw/start`)]),u(e,t)};f(ue,e=>{d&&e(H)});var W=N(ue,2),de=e=>{var t=Br(),n=R(t,!0);z(()=>c(n,b(x))),u(e,t)};f(W,e=>{b(x)&&e(de)});var fe=N(W,2),pe=N(A(fe),2),me=A(pe),_e=N(A(me),2);M(_e),r(me);var ve=N(me,2);r(pe),r(fe);var ye=N(fe,2),be=e=>{var t=Vr(),n=R(t,!0);z(()=>c(n,b(i)||C)),u(e,t)};f(ye,e=>{(b(i)||C)&&e(be)}),r(F),r(P),z(()=>{c(ie,S),fe.open=!s&&!l&&!d,ve.disabled=b(v)}),y(`submit`,pe,D),ae(_e,()=>b(h),e=>V(h,e)),u(e,O),g()}s([`click`]);var Wr=W(``),Gr=W(``);function Kr(e,t){o(t,!0);let n=C(t,`deleting`,3,!1),i=C(t,`error`,3,``),a=m(()=>t.message.author?.display_name||`Local User`);function s(){n()||t.onClose()}var l=Gr(),d=A(l),p=N(d,2),h=A(p),v=N(A(h),2);r(h);var y=N(h,2),x=N(A(y),2),S=A(x);{let e=m(()=>t.message.author?.id||t.message.author_id),n=m(()=>t.message.author?.avatar_url);pt(S,{class:`avatar`,get id(){return b(e)},get name(){return b(a)},get src(){return b(n)},size:36,loading:`eager`,fetchPriority:`auto`})}var w=N(S,2),T=A(w),E=A(T),D=R(E,!0),O=N(E,2),k=R(O,!0);r(T);var ee=N(T,2),M=R(ee,!0);r(w),r(x);var P=N(x,2),F=e=>{var t=Wr(),n=R(t,!0);z(()=>c(n,i())),u(e,t)};f(P,e=>{i()&&e(F)});var I=N(P,2),L=A(I),te=N(L,2),ne=R(te,!0);r(I),r(y),r(p),r(l),z(e=>{d.disabled=n(),v.disabled=n(),c(D,b(a)),j(O,`datetime`,t.message.created_at),c(k,e),c(M,t.message.body),L.disabled=n(),te.disabled=n(),c(ne,n()?`Deleting...`:`Delete`)},[()=>Y(t.message.created_at)]),_(`click`,d,s),_(`click`,v,s),_(`click`,L,s),_(`click`,te,function(...e){t.onConfirm?.apply(this,e)}),u(e,l),g()}s([`click`]);var qr=6500,Jr=W(`
          `);function Yr(e,t){o(t,!0);let n=m(()=>t.entries.filter(e=>e.userID!==t.currentUserID));function a(e,t=`Someone`){return e?.display_name?.trim()||(e?.handle?`@${e.handle}`:t)}let s=m(()=>b(n).length===0?``:b(n).length===1?`${a(b(n)[0].user)} is typing…`:b(n).length===2?`${a(b(n)[0].user)} and ${a(b(n)[1].user)} are typing…`:b(n).length===3?`${a(b(n)[0].user)}, ${a(b(n)[1].user)}, and ${a(b(n)[2].user)} are typing…`:`Several people are typing…`);var l=Jr();let d;var f=N(A(l),2),p=R(f,!0);r(l),z(()=>{d=i(l,1,`typing-indicator`,null,d,{visible:b(n).length>0}),c(p,b(s))}),u(e,l),g()}var Xr=W(`
          `),Zr=W(`
          `),Qr=W(`
          `);function $r(e,t){o(t,!0);function n(e){return e.kind===`tool`&&e.toolName?!e.text||e.text===e.toolName?e.toolName:`${e.toolName}: ${e.text}`:e.text}function a(e){switch(e){case`tool`:return`⚙`;case`thinking`:case`commentary`:return`✦`;case`plan`:return`☰`;case`patch`:return`±`;case`command_output`:return`›`;case`error`:return`✕`;default:return`·`}}var s=p(),l=oe(s),d=e=>{var o=Qr();F(o,21,()=>t.turns,e=>e.key,(e,t)=>{var o=Zr();F(o,21,()=>b(t).lines,e=>e.id,(e,t)=>{var o=Xr();let s;var l=A(o),d=R(l,!0),f=N(l,2),p=R(f,!0);r(o),z((e,n)=>{s=i(o,1,`agent-progress__line svelte-6vwkyv`,null,s,{"agent-progress__line--done":b(t).finalized}),j(o,`data-kind`,b(t).kind),c(d,e),c(p,n)},[()=>a(b(t).kind),()=>n(b(t))]),u(e,o)}),r(o),u(e,o)}),r(o),u(e,o)};f(l,e=>{t.turns.length>0&&e(d)}),u(e,s),g()}function ei(e,t){return`${e}\u0000${t}`}var ti=45e3;function ni(e,t,n){let r=typeof t.turn_id==`string`?t.turn_id:``,i=typeof t.op==`string`?t.op:``;if(!r||!i)return e;let a=typeof t.user_id==`string`?t.user_id:``,o=ei(a,r);if(i===`clear`)return e.filter(e=>e.turnId===r?a&&e.userId?e.key!==o:!1:!0);let s=t.line,c=s&&typeof s.id==`string`?s.id:``;if(!c)return e;let l=s&&typeof s.text==`string`?s.text:``,u=s&&typeof s.title==`string`?s.title:``,d=l||u,f=s&&typeof s.tool_name==`string`?s.tool_name:typeof s?.toolName==`string`?s.toolName:void 0,p=s&&typeof s.status==`string`?s.status:void 0,m=s&&typeof s.kind==`string`?s.kind:void 0,h=e.find(e=>e.key===o),g=h?.lines.find(e=>e.id===c),_={id:c,kind:m??g?.kind??`lifecycle`,text:d||g?.text||``,toolName:f??g?.toolName,status:p??g?.status,finalized:i===`finalize`||(g?.finalized??!1)};if(!g&&!_.text&&!_.toolName)return e;let v=n+ti;if(!h)e=[...e,{key:o,turnId:r,userId:a,lines:[_],expiresAt:v}];else{let t=h.lines.some(e=>e.id===c)?h.lines.map(e=>e.id===c?_:e):[...h.lines,_];e=e.map(e=>e.key===o?{...e,lines:t,expiresAt:v}:e)}return e}var ri=W(``),ii=W(``);function ai(e,t){o(t,!0);var n=ii(),i=A(n),a=N(i,2),s=A(a),l=N(A(s),2);r(s);var d=N(s,2),p=A(d),m=N(A(p),2);M(m),r(p);var h=N(p,2),v=e=>{var n=ri(),r=R(n,!0);z(()=>c(r,t.error)),u(e,n)};f(h,e=>{t.error&&e(v)});var b=N(h,2),x=A(b),S=N(x,2),C=R(S,!0);r(b),r(d),r(a),r(n),z(e=>{B(m,t.channelName),m.disabled=t.pending,S.disabled=e,c(C,t.pending?`Creating…`:`Create channel`)},[()=>t.pending||!t.channelName.trim()]),_(`click`,i,function(...e){t.onClose?.apply(this,e)}),_(`click`,l,function(...e){t.onClose?.apply(this,e)}),y(`submit`,d,e=>{e.preventDefault(),t.onCreate()}),_(`input`,m,e=>t.onChannelName(e.currentTarget.value)),_(`click`,x,function(...e){t.onClose?.apply(this,e)}),u(e,n),g()}s([`click`,`input`]);var oi=W(``),si=W(`
          No matching people yet
          `),ci=W(`

          `),li=W(``),ui=W(``);function di(e,t){o(t,!0);let n=m(()=>t.memberID.trim().toLowerCase().replace(/^@/,``)),i=m(()=>t.people.filter(e=>e.id!==t.currentUserID).filter(e=>!b(n)||e.display_name.toLowerCase().includes(b(n))||e.handle?.toLowerCase().includes(b(n))||e.id.toLowerCase().includes(b(n)))),a=m(()=>t.memberID.trim().startsWith(`usr_`)?t.memberID.trim():b(n)&&b(i).length===1?b(i)[0].id:``);function s(e){!t.pending&&e&&(t.onMemberID(e),t.onStart(e))}var l=ui(),d=A(l),p=N(d,2),h=A(p),v=N(A(h),2);r(h);var x=N(h,2),S=A(x),C=N(A(S),2);M(C),r(S);var w=N(S,2),T=A(w);F(T,17,()=>b(i),e=>e.id,(e,n)=>{var i=oi(),a=A(i);pt(a,{class:`dm-avatar`,get id(){return b(n).id},get name(){return b(n).display_name},get src(){return b(n).avatar_url},size:32});var o=N(a,2),l=A(o),d=R(l,!0),f=N(l,2),p=R(f,!0);r(o),r(i),z(e=>{i.disabled=t.pending,c(d,b(n).display_name),c(p,e)},[()=>lt(b(n).handle)||b(n).id]),_(`click`,i,()=>s(b(n).id)),u(e,i)});var E=N(T,2),D=e=>{var t=si();u(e,t)};f(E,e=>{b(i).length===0&&e(D)}),r(w);var O=N(w,2),k=e=>{var t=ci(),n=R(t,!0);z(()=>c(n,b(i).length>1?`Choose a person from the results.`:`Choose a person or enter a user ID.`)),u(e,t)};f(O,e=>{b(n)&&!b(a)&&e(k)});var j=N(O,2),ee=e=>{var n=li(),r=R(n,!0);z(()=>c(r,t.error)),u(e,n)};f(j,e=>{t.error&&e(ee)});var P=N(j,2),I=A(P),L=N(I,2),te=R(L,!0);r(P),r(x),r(p),r(l),z(()=>{B(C,t.memberID),C.disabled=t.pending,L.disabled=t.pending||!b(a),c(te,t.pending?`Starting…`:`Start DM`)}),_(`click`,d,function(...e){t.onClose?.apply(this,e)}),_(`click`,v,function(...e){t.onClose?.apply(this,e)}),y(`submit`,x,e=>{e.preventDefault(),s(b(a))}),_(`input`,C,e=>t.onMemberID(e.currentTarget.value)),_(`click`,I,function(...e){t.onClose?.apply(this,e)}),u(e,l),g()}s([`click`,`input`]);var fi=W(` `),pi=W(``),mi=W(`
          `),hi=W(``),gi=W(`

          Creating workspace…

          `),_i=W(`
          `),vi=W(``);function yi(e,t){o(t,!0);let n=C(t,`homeHref`,3,`/`),a=C(t,`homeLabel`,3,`cc`),s=C(t,`homeTitle`,3,`ClickClack home`);function l(e){return e.button===0&&!e.metaKey&&!e.ctrlKey&&!e.shiftKey&&!e.altKey}var d=vi(),p=A(d);let h;var v=A(p),x=e=>{J(e,{size:48})},S=m(()=>jt(a())),w=e=>{var t=fi(),n=R(t,!0);z(()=>c(n,a())),u(e,t)};f(v,e=>{b(S)?e(x):e(w,-1)}),r(p);var T=N(p,4),E=A(T);F(E,17,()=>t.workspaces,e=>e.id,(e,n)=>{var a=mi();let o;var s=A(a),d=A(s),p=e=>{var t=pi();z(e=>j(t,`src`,e),[()=>_e(b(n).icon_url)]),u(e,t)},m=e=>{var t=fi(),r=R(t,!0);z(e=>c(r,e),[()=>dt(b(n).name)]),u(e,t)};f(d,e=>{b(n).icon_url?e(p):e(m,-1)}),r(s),r(a),z(e=>{o=i(a,1,`guild-wrap`,null,o,{active:b(n).id===t.selectedWorkspaceID}),j(s,`title`,b(n).name),j(s,`aria-label`,b(n).name),j(s,`href`,e)},[()=>t.hrefForWorkspace(b(n).id)]),_(`click`,s,e=>{l(e)&&(e.preventDefault(),t.onSelectWorkspace(b(n).id))}),u(e,a)});var D=N(E,2);r(T);var O=N(T,2),k=e=>{var n=_i(),i=A(n);M(i);var a=N(i,2),o=e=>{var n=hi(),r=R(n,!0);z(()=>c(r,t.createError)),u(e,n)};f(a,e=>{t.createError&&e(o)});var s=N(a,2),l=e=>{var t=gi();u(e,t)};f(s,e=>{t.createPending&&e(l)}),r(n),z(()=>{B(i,t.workspaceName),i.disabled=t.createPending}),y(`submit`,n,e=>{e.preventDefault(),t.onCreateWorkspace()}),_(`input`,i,e=>t.onWorkspaceName(e.currentTarget.value)),u(e,n)};f(O,e=>{t.showWorkspaceCreate&&e(k)}),r(d),z(e=>{h=i(p,1,`guild home`,null,h,{"home--mark":e}),j(p,`title`,s()),j(p,`aria-label`,s()),j(p,`href`,n())},[()=>jt(a())]),_(`click`,D,function(...e){t.onToggleWorkspaceCreate?.apply(this,e)}),u(e,d),g()}s([`click`,`input`]);var bi=`clickclack:sidebar-channel-order:v1:`,xi=new Map,Si=new Map;function Ci(e,t){return`${bi}${t}:${e}`}function wi(e){if(!e||e.length>1e6)return[];try{let t=JSON.parse(e);return Array.isArray(t)&&t.length<=1e4&&t.every(e=>typeof e==`string`&&e.length<=128)?[...new Set(t)]:[]}catch{return[]}}function Ti(e,t){try{window.localStorage.setItem(e,JSON.stringify(t))}catch{}}function Ei(e,t,n){e?.startsWith(`${bi}${n}:`)&&xi.set(e,wi(t))}function Di(e,t){if(!e?.id||!t)return[];let n=Ci(t,e.id),r=xi.get(n);if(r)return r;let i=[];try{i=wi(window.localStorage.getItem(n))}catch{}let a=e.sidebar_preferences?.channel_order?.[t];if(a===void 0)return i;let o=a.length?[...new Set([...a,...i])].slice(0,1e4):[];return Ti(n,o),o}function Oi(e,t,n,r,i){let a=Ci(t,e);xi.set(a,n),Ti(a,n);let o=(Si.get(a)??Promise.resolve()).then(async()=>{if(xi.get(a)===n&&i())try{let e=JSON.stringify({sidebar_preferences:{channel_order:{[t]:n.slice(0,500)}}});await r(`/api/me`,{method:`PATCH`,keepalive:new TextEncoder().encode(e).length<6e4,body:e})}catch{}});return Si.set(a,o),o.then(()=>{Si.get(a)===o&&Si.delete(a)}),o}var ki=W(``),Ai=W(` `,1),ji=W(``),Mi=W(` `),Ni=W(``),Pi=W(`
          `),Fi=W(``),Ii=W(`Drag with a pointer, use Arrow Up and Arrow Down while focused, or open the move menu. Moves stay within the current channel section. `,1),Li=W(`
          `);function Ri(e,n){o(n,!0);let a=(e,t=I,a=I,o=I,s=I,l=I)=>{let p=m(()=>t().unread_count||0),g=m(()=>a().findIndex(e=>e.id===t().id));var S=Ni();let T;var E=A(S),D=e=>{var n=Ai(),i=oe(n),s=N(i,2),c=e=>{var n=ki(),i=A(n),o=N(i,2);r(n),le(n,e=>V(w,e),()=>b(w)),z(e=>{j(n,`aria-label`,e),i.disabled=b(g)<=0,o.disabled=b(g)<0||b(g)>=a().length-1},[()=>`Move #${bt(t())}`]),_(`keydown`,n,e=>{e.key===`Escape`&&(e.preventDefault(),_e(!0))}),_(`click`,i,()=>ve(t().id,-1,a())),_(`click`,o,()=>ve(t().id,1,a())),u(e,n)};f(s,e=>{b(C)===t().id&&e(c)}),z(e=>{j(i,`aria-label`,e),j(i,`aria-expanded`,b(C)===t().id)},[()=>`Move #${bt(t())}`]),_(`click`,i,e=>void ge(t().id,e.currentTarget)),y(`dragstart`,i,e=>fe(e,t().id,o())),y(`dragend`,i,he),_(`keydown`,i,e=>{e.key===`ArrowUp`||e.key===`ArrowDown`?(e.preventDefault(),V(C,``),de(t().id,e.key===`ArrowUp`?-1:1,a())):e.key===`Escape`&&V(C,``)}),u(e,n)};f(E,e=>{l()&&e(D)});var O=N(E,2);let k;var ee=N(A(O),2),M=R(ee,!0),P=N(ee,2),F=e=>{var t=ji();u(e,t)};f(P,e=>{t().external_managed&&e(F)});var L=N(P,2),te=e=>{var t=Mi(),n=R(t,!0);z(()=>{j(t,`aria-label`,`${b(p)} unread`),c(n,b(p)>99?`99+`:b(p))}),u(e,t)};f(L,e=>{b(p)>0&&(t().id!==n.selectedChannelID||n.selectedDirectID)&&e(te)}),r(O),r(S),z((e,r)=>{T=i(S,1,`channel-row`,null,T,{reorderable:l(),subdued:s(),dragging:b(d)===t().id,"drop-before":b(v)===t().id&&b(x),"drop-after":b(v)===t().id&&!b(x)}),j(O,`href`,e),k=i(O,1,`nav-item channel`,null,k,{active:t().id===n.selectedChannelID&&!n.selectedDirectID,"has-unread":b(p)>0&&!(t().id===n.selectedChannelID&&!n.selectedDirectID)}),c(M,r)},[()=>n.hrefForChannel(t().id),()=>bt(t())]),y(`dragover`,S,e=>{l()&&pe(e,t().id,o())}),y(`drop`,S,e=>{e.preventDefault(),l()&&b(h)===o()&&(W(b(d),t().id,b(x),a()),he())}),_(`focusout`,S,e=>{e.currentTarget.contains(e.relatedTarget)||V(C,``)}),_(`click`,O,e=>{G(e)&&(e.preventDefault(),n.onSelectChannel(t().id))}),u(e,S)},s=(e,t=I,n=I,o=I)=>{let s=m(()=>se(t().key)),l=m(()=>ue(t()));var d=Pi();let f;var p=A(d),h=N(A(p),2),g=R(h,!0),v=N(h,2),y=R(v,!0);r(p);var x=N(p,2);F(x,21,()=>b(l),e=>e.id,(e,n)=>{a(e,()=>b(n),()=>t().channels,()=>t().key,o,()=>b(s))}),r(x),r(d),z(()=>{f=i(d,1,`channel-subgroup`,null,f,{"archived-channel-group":o()}),j(p,`aria-expanded`,b(s)),j(p,`aria-controls`,n()),c(g,t().label),c(y,t().channels.length),j(x,`id`,n()),j(x,`hidden`,!b(s)&&b(l).length===0)}),_(`click`,p,()=>ce(t().key)),u(e,d)},l=`archived`,d=U(``),h=U(``),v=U(``),x=U(!0),S=U(!1),C=U(``),w=U(void 0),T,D=U(``),k=U(ee({})),M=m(()=>n.channels.filter(e=>!e.archived_at)),P=m(()=>n.channels.filter(e=>!!e.archived_at)),L=m(()=>b(M).filter(e=>!e.sidebar_section?.trim())),te=m(()=>{let e=new Map;for(let t of b(M)){let n=t.sidebar_section?.trim();if(!n)continue;let r=e.get(n)??[];r.push(t),e.set(n,r)}return[...e.entries()].map(([e,t])=>({key:`section:${e}`,label:e,channels:t})).sort((e,t)=>e.label.localeCompare(t.label,void 0,{sensitivity:`base`}))}),ne=m(()=>n.channels.filter(e=>e.id===n.selectedChannelID&&!n.selectedDirectID||(e.unread_count||0)>0));function re(e){if(!e)return{};try{let t=JSON.parse(e);if(!t||typeof t!=`object`||Array.isArray(t))return{};let n=Object.entries(t);return n.length>1e3||n.some(([e,t])=>e.length>256||typeof t!=`boolean`)?{}:Object.fromEntries(n)}catch{return{}}}function ie(e){return`clickclack:sidebar-channel-groups:v1:${e}`}function ae(e){if(!e)return{};try{return re(window.localStorage.getItem(ie(e)))}catch{return{}}}function se(e){let t=b(k)[e];return typeof t==`boolean`?t:e!==l}function ce(e){if(V(k,{...b(k),[e]:!se(e)},!0),n.workspaceID)try{window.localStorage.setItem(ie(n.workspaceID),JSON.stringify(b(k)))}catch{}}function B(e){e.key===ie(n.workspaceID)&&V(k,re(e.newValue),!0)}function ue(e){return se(e.key)?e.channels:e.channels.filter(e=>e.id===n.selectedChannelID&&!n.selectedDirectID||(e.unread_count||0)>0)}function H(e){V(D,``),queueMicrotask(()=>{V(D,e,!0)})}function W(e,t,r,i){if(!e||!t||e===t)return;let a=n.channels.map(e=>e.id),o=a.indexOf(e);if(o<0)return;a.splice(o,1);let s=a.indexOf(t);if(s<0)return;a.splice(s+ +!r,0,e),n.onReorder(a);let c=n.channels.find(t=>t.id===e),l=i.map(e=>e.id).filter(t=>t!==e),u=l.indexOf(t);l.splice(u+ +!r,0,e),c&&H(`Moved #${bt(c)} to position ${l.indexOf(e)+1} of ${l.length}`)}function de(e,t,n){let r=n.findIndex(t=>t.id===e),i=r+t;r<0||i<0||i>=n.length||W(e,n[i].id,t<0,n)}function fe(e,t,n){V(S,!0),V(C,``),V(d,t,!0),V(h,n,!0),e.dataTransfer?.setData(`text/plain`,t),e.dataTransfer&&(e.dataTransfer.effectAllowed=`move`)}function pe(e,t,n){if(!b(d)||b(d)===t||b(h)!==n)return;e.preventDefault();let r=e.currentTarget;V(v,t,!0),V(x,e.clientY{V(S,!1)},0)}async function ge(e,n){if(!b(S)){if(b(C)===e){V(C,``);return}T=n,V(C,e,!0),await t(),b(w)?.querySelector(`button:not(:disabled)`)?.focus()}}async function _e(e=!1){V(C,``),e&&(await t(),T?.focus())}function ve(e,t,n){de(e,t,n),_e(!0)}function G(e){return e.button===0&&!e.metaKey&&!e.ctrlKey&&!e.shiftKey&&!e.altKey}E(()=>{V(k,ae(n.workspaceID),!0)}),E(()=>{n.expanded||(V(C,``),me(),V(S,!1))});var ye=Li();y(`storage`,O,B);let be;var xe=A(ye),Se=A(xe),Ce=N(Se,2);r(xe);var we=N(xe,2),Te=A(we),Ee=e=>{var t=Ii(),r=N(oe(t),2);F(r,17,()=>b(L),e=>e.id,(e,t)=>{a(e,()=>b(t),()=>b(L),()=>`unsectioned`,()=>!1,()=>!0)});var i=N(r,2);F(i,19,()=>b(te),e=>e.key,(e,t,n)=>{s(e,()=>b(t),()=>`sidebar-channel-section-${b(n)}`,()=>!1)});var o=N(i,2),c=e=>{s(e,()=>({key:l,label:`Archived`,channels:b(P)}),()=>`sidebar-archived-channels`,()=>!0)};f(o,e=>{b(P).length>0&&e(c)});var d=N(o,2),p=e=>{var t=Fi();u(e,t)};f(d,e=>{n.channels.length===0&&e(p)}),u(e,t)},De=e=>{var t=p(),n=oe(t);F(n,17,()=>b(ne),e=>e.id,(e,t)=>{{let n=m(()=>!!b(t).archived_at);a(e,()=>b(t),()=>b(ne),()=>`priority`,()=>b(n),()=>!1)}}),u(e,t)};f(Te,e=>{n.expanded?e(Ee):e(De,-1)}),r(we);var Oe=N(we,2),ke=R(Oe,!0);r(ye),z(()=>{be=i(ye,1,`nav-section`,null,be,{collapsed:!n.expanded}),j(Se,`aria-expanded`,n.expanded),j(we,`hidden`,!n.expanded&&b(ne).length===0),c(ke,b(D))}),_(`click`,Se,function(...e){n.onToggle?.apply(this,e)}),_(`click`,Ce,function(...e){n.onCreateChannel?.apply(this,e)}),u(e,ye),g()}s([`focusout`,`click`,`keydown`]);var zi=W(` `),Bi=W(``),Vi=W(``),Hi=W(`
          `),Ui=W(``),Wi=W(`
          `),Gi=W(`
          `);function Ki(e,t){o(t,!0);let n=U(``),a=m(()=>t.expanded?t.conversations:t.conversations.filter(e=>e.id===t.selectedDirectID||(e.unread_count||0)>0));function s(e){return e.button===0&&!e.metaKey&&!e.ctrlKey&&!e.shiftKey&&!e.altKey}function l(e){V(n,b(n)===e?``:e,!0)}function d(){V(n,``)}var p=Gi();let h;var v=A(p),y=A(v),x=N(y,2);r(v);var S=N(v,2),C=A(S);F(C,17,()=>b(a),e=>e.id,(e,a)=>{let o=m(()=>ft(b(a),t.currentUserID)),p=m(()=>b(a).unread_count||0),h=m(()=>b(a).id===t.selectedDirectID);var g=Hi();let v;var y=A(g);let x;var S=A(y);{let e=m(()=>b(o)?.id||b(a).id),t=m(()=>b(o)?.display_name),n=m(()=>mt(b(o))?void 0:b(o)?.avatar_url);pt(S,{class:`dm-avatar`,get id(){return b(e)},get name(){return b(t)},get src(){return b(n)},size:22})}var C=N(S,2),w=R(C,!0),T=N(C,2),E=e=>{var t=zi(),n=R(t,!0);z(()=>{j(t,`aria-label`,`${b(p)} unread`),c(n,b(p)>99?`99+`:b(p))}),u(e,t)},D=e=>{var t=Bi();u(e,t)};f(T,e=>{b(p)>0&&!b(h)?e(E):e(D,-1)}),r(y);var O=N(y,2),k=N(O,2),ee=e=>{var n=Vi(),r=R(n);_(`click`,r,e=>{e.preventDefault(),e.stopPropagation(),d(),t.onHideDirect(b(a).id)}),u(e,n)};f(k,e=>{b(n)===b(a).id&&e(ee)}),r(g),z((e,t,r)=>{v=i(g,1,`dm-row`,null,v,{active:b(h)}),j(y,`href`,e),x=i(y,1,`nav-item dm`,null,x,{active:b(h),"has-unread":b(p)>0&&!b(h)}),c(w,t),j(O,`aria-label`,r),j(O,`aria-expanded`,b(n)===b(a).id)},[()=>t.hrefForDirect(b(a).id),()=>ot(b(a),t.currentUserID),()=>`Direct message actions for ${ot(b(a),t.currentUserID)}`]),_(`click`,y,e=>{s(e)&&(e.preventDefault(),t.onSelectDirect(b(a).id))}),_(`click`,O,e=>{e.preventDefault(),e.stopPropagation(),l(b(a).id)}),_(`keydown`,O,e=>{e.key===`Escape`&&d()}),u(e,g)});var w=N(C,2),T=e=>{var t=Ui();u(e,t)};f(w,e=>{t.expanded&&t.conversations.length===0&&e(T)});var E=N(w,2),D=e=>{var n=Wi(),i=A(n),a=R(i),o=N(i,2);r(n),z(()=>c(a,`Closed ${t.hiddenDirectTitle??``}`)),_(`click`,o,function(...e){t.onUndoHideDirect?.apply(this,e)}),u(e,n)};f(E,e=>{t.expanded&&t.hiddenDirectTitle&&e(D)}),r(S),r(p),z(()=>{h=i(p,1,`nav-section`,null,h,{collapsed:!t.expanded}),j(y,`aria-expanded`,t.expanded),j(S,`hidden`,!t.expanded&&b(a).length===0)}),_(`click`,y,function(...e){t.onToggle?.apply(this,e)}),_(`click`,x,function(...e){t.onCreateDirect?.apply(this,e)}),u(e,p),g()}s([`click`,`keydown`]);var qi=W(``),Ji=W(`Connecting…`),Yi=W(`
          `),Xi=W(` `),Zi=W(``),Qi=W(``),$i=W(``);function ea(e,t){o(t,!0);let n=C(t,`showHeader`,3,!0),a=`clickclack:sidebar-sections:v1:`,s={channels:!0,directMessages:!0,people:!0},l=U(ee({...s}));function d(e){if(!e||typeof e!=`object`)return!1;let t=e;return typeof t.channels==`boolean`&&typeof t.directMessages==`boolean`&&typeof t.people==`boolean`}function p(e){if(!e)return{...s};try{let t=window.localStorage.getItem(`${a}${e}`);if(!t)return{...s};let n=JSON.parse(t);return d(n)?n:{...s}}catch{return{...s}}}function h(e){if(V(l,{...b(l),[e]:!b(l)[e]},!0),t.workspaceID)try{window.localStorage.setItem(`${a}${t.workspaceID}`,JSON.stringify(b(l)))}catch{}}E(()=>{V(l,p(t.workspaceID),!0)});let v=U(ee([]));function x(e){V(v,e,!0);let n=t.currentUser?.id;t.workspaceID&&n&&Oi(n,t.workspaceID,e,G,()=>t.currentUser?.id===n)}function S(e){t.currentUser?.id&&(Ei(e.key,e.newValue,t.currentUser.id),e.key===Ci(t.workspaceID,t.currentUser.id)&&V(v,wi(e.newValue),!0))}let w=m(()=>{let e=new Map(t.channels.map(e=>[e.id,e]));return[...b(v).flatMap(t=>{let n=e.get(t);return n?(e.delete(t),[n]):[]}),...e.values()]});E(()=>{V(v,Di(t.currentUser,t.workspaceID),!0)});function T(e){return e.button===0&&!e.metaKey&&!e.ctrlKey&&!e.shiftKey&&!e.altKey}var D=$i();y(`storage`,O,S);var k=A(D),M=e=>{var n=Yi(),i=A(n),a=A(i),o=e=>{var n=qi();z(e=>j(n,`src`,e),[()=>_e(t.workspaceIconURL)]),u(e,n)};f(a,e=>{t.workspaceIconURL&&e(o)});var s=N(a,2),l=A(s),d=A(l),p=R(d,!0);te(2),r(l);var m=N(l,2),h=e=>{var t=Ji();u(e,t)};f(m,e=>{t.connected||e(h)}),r(s),r(i);var g=N(i,2),v=A(g),y=A(v),b=R(y);r(v),r(g),r(n),z(()=>{c(p,t.workspaceName||`Pick a workspace`),j(v,`aria-label`,t.sidebarCollapsed?`Expand sidebar`:`Collapse sidebar`),j(v,`title`,t.sidebarCollapsed?`Expand sidebar`:`Collapse sidebar`),j(b,`d`,t.sidebarCollapsed?`m9 6 6 6-6 6`:`m15 6-6 6 6 6`)}),_(`click`,i,function(...e){t.onOpenWorkspaceSettings?.apply(this,e)}),_(`click`,v,function(...e){t.onToggleCollapse?.apply(this,e)}),u(e,n)};f(k,e=>{n()&&e(M)});var P=N(k,2),I=A(P);Ri(I,{get workspaceID(){return t.workspaceID},get expanded(){return b(l).channels},get channels(){return b(w)},get selectedChannelID(){return t.selectedChannelID},get selectedDirectID(){return t.selectedDirectID},get hrefForChannel(){return t.hrefForChannel},get onSelectChannel(){return t.onSelectChannel},get onCreateChannel(){return t.onCreateChannel},onToggle:()=>h(`channels`),onReorder:x});var L=N(I,2);{let e=m(()=>t.currentUser?.id);Ki(L,{get expanded(){return b(l).directMessages},get conversations(){return t.directConversations},get currentUserID(){return b(e)},get selectedDirectID(){return t.selectedDirectID},get hrefForDirect(){return t.hrefForDirect},get onSelectDirect(){return t.onSelectDirect},get onCreateDirect(){return t.onCreateDirect},get onHideDirect(){return t.onHideDirect},get hiddenDirectTitle(){return t.hiddenDirectTitle},get onUndoHideDirect(){return t.onUndoHideDirect},onToggle:()=>h(`directMessages`)})}var ne=N(L,2);let re;var ie=A(ne),ae=R(ie),oe=N(ie,2),se=A(oe);F(se,17,()=>t.recentPeople,e=>e.id,(e,n)=>{let a=m(()=>ut(t.directConversations,b(n).id,t.currentUser?.id));var o=Xi();let s;var l=A(o);pt(l,{class:`dm-avatar`,get id(){return b(n).id},get name(){return b(n).display_name},get src(){return b(n).avatar_url},size:22});var d=N(l,2),f=R(d,!0);te(2),r(o),z(e=>{j(o,`href`,e),s=i(o,1,`nav-item dm`,null,s,{active:b(a)?.id===t.selectedDirectID||t.selectedProfile?.id===b(n).id}),c(f,b(n).display_name)},[()=>b(a)?t.hrefForDirect(b(a).id):`#`]),_(`click`,o,e=>{if(b(a)){if(!T(e))return;e.preventDefault(),t.onSelectDirect(b(a).id)}else e.preventDefault(),t.onOpenProfile(b(n))}),u(e,o)});var ce=N(se,2),le=e=>{var t=Zi();u(e,t)};f(ce,e=>{t.recentPeople.length===0&&e(le)}),r(oe),r(ne),r(P);var B=N(P,2),ue=e=>{var n=Qi(),i=A(n);pt(i,{class:`dm-avatar`,get id(){return t.currentUser.id},get name(){return t.currentUser.display_name},get src(){return t.currentUser.avatar_url},size:28,loading:`eager`,fetchPriority:`auto`});var a=N(i,2),o=A(a),s=R(o,!0),l=N(o,2),d=R(l,!0);r(a),te(2),r(n),z((e,r)=>{j(n,`aria-label`,e),c(s,t.currentUser.display_name),c(d,r)},[()=>`Account settings for ${t.currentUser.display_name} ${lt(t.currentUser.handle)}`,()=>t.currentUser.handle?lt(t.currentUser.handle):t.connected?`Active`:`Reconnecting…`]),_(`click`,n,function(...e){t.onOpenSettings?.apply(this,e)}),_(`contextmenu`,n,e=>{e.preventDefault(),t.onOpenSettings()}),u(e,n)};f(B,e=>{t.currentUser&&e(ue)}),r(D),z(()=>{re=i(ne,1,`nav-section`,null,re,{collapsed:!b(l).people}),j(ae,`aria-expanded`,b(l).people),j(oe,`hidden`,!b(l).people)}),_(`click`,ae,()=>h(`people`)),u(e,D),g()}s([`click`,`contextmenu`]);var ta=W(`
          Loading...
          `),na=W(`
          `),ra=W(`
          `),ia=W(`

          No pinned messages

          Pin important messages to keep them easily accessible.

          `),aa=W(`
          `),oa=W(`
          `),sa=W(`
          `),ca=W(` `,1),la=W(`

          Pinned Messages

          `);function ua(e,t){o(t,!0);let i=C(t,`loading`,3,!1),a=C(t,`error`,3,``),s=C(t,`topics`,19,()=>[]),l=C(t,`mentionPeople`,19,()=>[]),d=C(t,`maxPins`,3,100),p=U(ee(new Set)),v=U(``);async function y(e){if(!b(p).has(e.id)){V(p,new Set(b(p)).add(e.id),!0),V(v,``);try{await t.onUnpin(e)}catch(e){V(v,e instanceof Error?e.message:`Could not unpin message`,!0)}finally{let t=new Set(b(p));t.delete(e.id),V(p,t,!0)}}}var x=la(),S=A(x),w=A(S),T=A(w),E=N(A(T),2),D=R(E);r(T);var O=N(T,2),k=R(O);r(w);var M=N(w,2);r(S);var P=N(S,2),I=A(P),L=e=>{var t=ta();u(e,t)},te=e=>{var t=na(),n=R(t,!0);z(()=>c(n,a())),u(e,t)},ne=e=>{var i=ca(),a=oe(i),o=e=>{var t=ra(),n=R(t,!0);z(()=>c(n,b(v))),u(e,t)};f(a,e=>{b(v)&&e(o)});var d=N(a,2),g=e=>{var t=ia();u(e,t)},x=e=>{var i=sa();F(i,21,()=>t.messages,e=>e.id,(e,i)=>{let a=m(()=>s().find(e=>e.id===b(i).topic_id));var o=oa(),d=A(o),g=A(d),v=R(g,!0),x=N(g,2),S=R(x,!0);r(d);var C=N(d,2);_t(C,{get topic(){return b(a)},get onSelect(){return t.onSelectTopic}});var w=N(C,2);n(w,()=>X(b(i).body),!0),r(w),h(w,e=>Ge?.(e)),h(w,(e,t)=>Q?.(e,t),()=>({people:l(),attentionUserID:t.mentionAttentionUserID}));var T=N(w,2),E=e=>{var n=aa();F(n,21,()=>b(i).attachments,e=>e.id,(e,n)=>{{let r=m(()=>Ve(b(n)));Z(e,{get upload(){return b(n)},get url(){return b(r)},get onOpenImage(){return t.onOpenImage},get onOpenArtifact(){return t.onOpenArtifact}})}}),r(n),u(e,n)};f(T,e=>{b(i).attachments?.length&&e(E)});var D=N(T,2),O=A(D),k=N(O,2);r(D),r(o),z((e,t)=>{j(o,`data-message-id`,b(i).id),c(v,b(i).author?.display_name||`Unknown`),c(S,e),k.disabled=t},[()=>Y(b(i).created_at),()=>b(p).has(b(i).id)]),_(`click`,O,()=>t.onOpenThread(b(i))),_(`click`,k,()=>y(b(i))),u(e,o)}),r(i),u(e,i)};f(d,e=>{t.messages.length===0?e(g):e(x,-1)}),u(e,i)};f(I,e=>{i()?e(L):a()?e(te,1):e(ne,-1)}),r(P),r(x),z(()=>{c(D,`${t.messages.length??``} / ${d()??``} pinned`),c(k,`Shared across this channel, with a maximum of ${d()??``} messages.`)}),_(`click`,M,function(...e){t.onClose?.apply(this,e)}),u(e,x),g()}s([`click`]);var da=W(` `,1),fa=W(`
          `),pa=W(`
          We couldn’t search messages

          `),ma=W(`
          No messages found

          Try another word or phrase.

          `),ha=W(`deleted bot`),ga=W(` `),_a=W(` `),va=W(` `),ya=W(` Reply in thread`),ba=W(` `),xa=W(`
        • `),Sa=W(``),Ca=W(``),wa=W(``),Ta=W(`
            `,1),Ea=W(``);function Da(e,t){o(t,!0);let n=C(t,`covered`,3,!1),a=C(t,`inert`,3,!1),s=new Intl.DateTimeFormat(void 0,{hour:`2-digit`,minute:`2-digit`}),l=new Intl.DateTimeFormat(void 0,{month:`short`,day:`numeric`}),h=new Intl.DateTimeFormat(void 0,{month:`short`,day:`numeric`,year:`numeric`});function y(e,t){let n=Array.from(e),r=[],i=0;for(let e of t){let t=Math.max(i,Math.min(n.length,e.start)),a=Math.max(t,Math.min(n.length,e.end));t>i&&r.push({text:n.slice(i,t).join(``),highlighted:!1}),a>t&&r.push({text:n.slice(t,a).join(``),highlighted:!0}),i=a}return i{var t=v(`Searching messages…`);u(e,t)},te=e=>{var n=da(),r=oe(n),i=N(r),a=e=>{var n=v();z(()=>c(n,`in ${t.session.scope.label??``}`)),u(e,n)};f(i,e=>{t.session.scope.label&&e(a)}),z(()=>c(r,`${t.session.results.length??``}${t.session.nextCursor?`+`:``} + ${t.session.results.length===1&&!t.session.nextCursor?`result`:`results`}`)),u(e,n)},ne=e=>{var t=v(`Search unavailable`);u(e,t)};f(I,e=>{t.session.state===`loading`?e(L):t.session.state===`ready`?e(te,1):t.session.state===`error`&&e(ne,2)}),r(P);var re=N(P,2),ie=A(re),ae=e=>{var t=fa();u(e,t)},se=e=>{var n=pa(),i=N(A(n),4),a=R(i,!0);r(n),z(()=>c(a,t.session.error)),u(e,n)},ce=e=>{var t=ma();u(e,t)},le=e=>{var n=Ta(),a=oe(n);F(a,21,()=>t.session.results,e=>e.id,(e,n)=>{let a=m(()=>t.contextFor(b(n)));var o=xa(),s=A(o);let l;var h=A(s);{let e=m(()=>mt(b(n).author)?void 0:b(n).author.avatar_url);pt(h,{class:`dm-avatar`,get id(){return b(n).author.id},get name(){return b(n).author.display_name},get src(){return b(e)},size:30})}var g=N(h,2),S=A(g),C=A(S),w=R(C,!0),T=N(C,2),E=e=>{var t=ha();u(e,t)},D=m(()=>mt(b(n).author)),O=e=>{var t=ga(),r=R(t,!0);z(e=>c(r,e),[()=>lt(st(b(n).author))]),u(e,t)},k=m(()=>st(b(n).author));f(T,e=>{b(D)?e(E):b(k)&&e(O,1)});var ee=N(T,2),M=R(ee,!0);r(S);var P=N(S,2);F(P,21,()=>y(b(n).snippet,b(n).highlights),d,(e,t)=>{var n=p(),r=oe(n),i=e=>{var n=_a(),r=R(n,!0);z(()=>c(r,b(t).text)),u(e,n)},a=e=>{var n=v();z(()=>c(n,b(t).text)),u(e,n)};f(r,e=>{b(t).highlighted?e(i):e(a,-1)}),u(e,n)}),r(P);var I=N(P,2),L=A(I),te=e=>{var t=va(),n=R(t,!0);z(()=>c(n,b(a))),u(e,t)};f(L,e=>{b(a)&&e(te)});var ne=N(L,2),re=e=>{var t=ya();u(e,t)},ie=e=>{var t=ba(),i=N(A(t));r(t),z(()=>c(i,` ${b(n).reply_count??``} ${b(n).reply_count===1?`reply`:`replies`}`)),u(e,t)};f(ne,e=>{b(n).parent_message_id?e(re):b(n).reply_count>0&&e(ie,1)}),r(I),r(g),r(s),r(o),z(e=>{l=i(s,1,`search-result`,null,l,{"is-active":t.session.activeResultID===b(n).id}),j(s,`data-result-id`,b(n).id),c(w,b(n).author.display_name||`Local User`),j(ee,`datetime`,b(n).created_at),c(M,e)},[()=>x(b(n).created_at)]),_(`click`,s,()=>t.onOpenResult(b(n))),u(e,o)}),r(a);var o=N(a,2),s=e=>{var n=Sa(),i=A(n),a=R(i,!0),o=N(i,2);r(n),z(()=>c(a,t.session.moreError)),_(`click`,o,function(...e){t.onLoadMore?.apply(this,e)}),u(e,n)},l=e=>{var n=Ca(),r=R(n,!0);z(()=>{n.disabled=t.session.loadingMore,c(r,t.session.loadingMore?`Loading more…`:`Load more results`)}),_(`click`,n,function(...e){t.onLoadMore?.apply(this,e)}),u(e,n)},h=e=>{var t=wa();u(e,t)};f(o,e=>{t.session.moreError?e(s):t.session.nextCursor?e(l,1):e(h,-1)}),u(e,n)};f(ie,e=>{t.session.state===`loading`?e(ae):t.session.state===`error`?e(se,1):t.session.results.length===0?e(ce,2):e(le,-1)}),r(re),r(S),z(()=>{w=i(S,1,`search-results`,null,w,{covered:n()}),S.inert=a(),j(S,`aria-hidden`,n()?`true`:void 0),c(O,`Search${t.session.scope.label?` in ${t.session.scope.label}`:``}`),c(ee,`Results for “${t.session.query??``}”`)}),_(`click`,M,function(...e){t.onClose?.apply(this,e)}),u(e,S),g()}s([`click`]);var Oa=W(``),ka=W(`
            `),Aa=W(`

            `,1),ja=W(`
            `),Ma=W(`
            Delete channel

            Permanently erase this channel with its messages, threads, files, and pins.

            `),Na=W(``);function Pa(e,t){o(t,!0);let n=C(t,`saving`,3,!1),i=C(t,`error`,3,``),a=C(t,`canDelete`,3,!1),s=U(!1),l=m(()=>!!t.channel.archived_at),d=m(()=>`#${bt(t.channel)}`);function p(){n()||t.onClose()}var h=Na(),v=A(h),y=N(v,2),x=A(y),S=N(A(x),2);r(x);var w=N(x,2),T=A(w),E=A(T),D=R(E,!0);te(2),r(T);var O=N(T,2),k=e=>{var t=Oa(),n=R(t,!0);z(()=>c(n,i())),u(e,t)};f(O,e=>{i()&&e(k)});var j=N(O,2),ee=e=>{var i=ka(),a=A(i),o=N(a,2),s=R(o,!0);r(i),z(()=>{a.disabled=n(),o.disabled=n(),c(s,n()?`Restoring...`:`Restore channel`)}),_(`click`,a,p),_(`click`,o,()=>t.onArchivedChange(!1)),u(e,i)},M=e=>{var i=Aa(),a=oe(i),o=R(a),l=N(a,2),f=A(l),p=N(f,2),m=R(p,!0);r(l),z(()=>{c(o,`Archive ${b(d)??``}? The channel will remain available to workspace members under Archived.`),f.disabled=n(),p.disabled=n(),c(m,n()?`Archiving...`:`Archive channel`)}),_(`click`,f,()=>V(s,!1)),_(`click`,p,()=>t.onArchivedChange(!0)),u(e,i)},P=e=>{var t=ja(),i=A(t),a=N(i,2);r(t),z(()=>{i.disabled=n(),a.disabled=n()}),_(`click`,i,p),_(`click`,a,()=>V(s,!0)),u(e,t)};f(j,e=>{b(l)?e(ee):b(s)?e(M,1):e(P,-1)});var F=N(j,2),I=e=>{var i=Ma(),a=N(A(i),2),o=R(a);r(i),z(()=>o.disabled=n()),_(`click`,o,function(...e){t.onDelete?.apply(this,e)}),u(e,i)};f(F,e=>{a()&&t.onDelete&&e(I)}),r(w),r(y),r(h),z(()=>{v.disabled=n(),S.disabled=n(),c(D,b(d))}),_(`click`,v,p),_(`click`,S,p),u(e,h),g()}s([`click`]);function Fa(e,t){return e.trim()===t.name}function Ia(e){switch(e.blocker){case`last_channel`:return`A workspace must keep at least one channel. Create another channel first, or delete the workspace instead.`;case`provisioned_channel`:return`Guest sign-in recreates this channel, so it can't be deleted.`;default:return``}}function La(e,t,n=!1){return n?`Deleted #${e}.`:t?`#${e} was deleted by ${t}.`:`#${e} was deleted.`}var Ra=W(`

            Checking what will be deleted...

            `),za=W(`
          • An external application manages this channel and may create it again.
          • `),Ba=W(``),Va=W(``),Ha=W(`
            Messages
            Thread replies
            Files
            Storage
            • Pins, reactions, channel topics, and everyone's read state are removed too.
            • People viewing the channel are moved out, and links to it stop working.
            `,1),Ua=W(``),Wa=W(``);function Ga(e,t){o(t,!0);let n=C(t,`loading`,3,!1),i=C(t,`deleting`,3,!1),a=C(t,`error`,3,``),s=U(``),l=m(()=>`#${bt(t.channel)}`),d=m(()=>t.preview?Ia(t.preview):``),p=m(()=>!!t.preview&&!b(d)&&!n()&&!i()&&Fa(b(s),t.channel)),h=new Intl.NumberFormat;function v(){i()||t.onClose()}function x(e){e.preventDefault(),b(p)&&t.onConfirm()}var S=Wa(),w=A(S),T=N(w,2),E=A(T),D=A(E),O=N(A(D),2),k=R(O);r(D);var j=N(D,2);r(E);var ee=N(E,2),P=N(A(ee),2),F=e=>{var t=Ra();u(e,t)},I=e=>{var n=Ha(),a=oe(n),o=A(a),l=N(A(o)),p=R(l,!0);r(o);var m=N(o,2),g=N(A(m)),_=R(g,!0);r(m);var v=N(m,2),y=N(A(v)),x=R(y,!0);r(v);var S=N(v,2),C=N(A(S)),w=R(C,!0);r(S),r(a);var T=N(a,2),E=N(A(T),4),D=e=>{var t=za();u(e,t)};f(E,e=>{t.channel.external_managed&&e(D)}),r(T);var O=N(T,2),k=e=>{var t=Ba(),n=R(t,!0);z(()=>c(n,b(d))),u(e,t)},j=e=>{var n=Va(),a=A(n),o=N(A(a)),l=R(o,!0);te(),r(a);var d=N(a,2);M(d),r(n),z(()=>{c(l,t.channel.name),d.disabled=i()}),ae(d,()=>b(s),e=>V(s,e)),u(e,n)};f(O,e=>{b(d)?e(k):e(j,-1)}),z((e,t,n,r)=>{c(p,e),c(_,t),c(x,n),c(w,r)},[()=>h.format(t.preview.counts.messages),()=>h.format(t.preview.counts.thread_replies),()=>h.format(t.preview.counts.files),()=>qe(t.preview.counts.file_bytes)]),u(e,n)};f(P,e=>{n()?e(F):t.preview&&e(I,1)});var L=N(P,2),ne=e=>{var t=Ba(),n=R(t,!0);z(()=>c(n,a())),u(e,t)};f(L,e=>{a()&&e(ne)});var re=N(L,2),ie=A(re),se=e=>{var n=Ua();z(()=>n.disabled=i()),_(`click`,n,function(...e){t.onArchive?.apply(this,e)}),u(e,n)};f(ie,e=>{t.channel.archived_at||e(se)});var ce=N(ie,2),le=N(ce,2),B=R(le,!0);r(re),r(ee),r(T),r(S),z(()=>{w.disabled=i(),c(k,`Delete ${b(l)??``}?`),j.disabled=i(),ce.disabled=i(),le.disabled=!b(p),c(B,i()?`Deleting...`:`Delete channel`)}),_(`click`,w,v),_(`click`,j,v),y(`submit`,ee,x),_(`click`,ce,v),u(e,S),g()}s([`click`]);var Ka=W(`

            `),qa=W(``),Ja=W(`
            `);function Ya(e,t){o(t,!0);let n=U(!1),a=U(``),s=U(!1),l=new AbortController;re(()=>l.abort());async function d(){if(!b(n)){V(n,!0),V(a,``),V(s,!1);try{let e=await Ce({method:`PATCH`,body:JSON.stringify(t.payload()),signal:l.signal});l.signal.throwIfAborted(),t.onUserUpdated(e.user),V(a,`Saved`),t.onSaved?.()}catch(e){if(l.signal.aborted)return;V(a,xe(e,`Could not save ${t.section}`),!0),V(s,!0)}finally{V(n,!1)}}}var p=Ja(),m=A(p),h=A(m);L(h,()=>t.children),r(m);var _=N(m,2),v=A(_),x=e=>{var t=Ka();let n;var r=R(t,!0);z(()=>{n=i(t,1,`settings-status`,null,n,{"is-error":b(s)}),c(r,b(a))}),u(e,t)},S=e=>{var t=qa();u(e,t)};f(v,e=>{b(a)?e(x):e(S,-1)});var C=N(v,2),w=R(C,!0);r(_),r(p),z(()=>{m.disabled=b(n),C.disabled=b(n),c(w,b(n)?`Saving...`:`Save ${t.section}`)}),y(`submit`,p,e=>{e.preventDefault(),d()}),u(e,p),g()}var Xa=W(`

            Browser notifications are not supported on this device.

            `),Za=W(`

            Browser notifications are blocked by this browser.

            `),Qa=W(`

            `),$=W(`

            Show alerts when ClickClack is in the background.

            `);function $a(e,t){o(t,!0);let n=C(t,`isDesktop`,3,!1),a=U(!1),s=U(!1),l=U(`default`),d=U(``),p=U(!1);E(()=>{m(t.user.id,n())});function m(e,n){if(n){V(a,!0),V(l,`granted`),V(s,It(e),!0),t.onChanged?.(b(s));return}V(a,typeof Notification<`u`),V(l,b(a)?Notification.permission:`unsupported`,!0);let r=It(e);V(s,b(l)===`granted`&&r,!0),r&&b(l)!==`granted`&&Lt(e,!1),t.onChanged?.(b(s))}async function h(e){if(V(d,``),V(p,!1),!e){Lt(t.user.id,!1),V(s,!1),t.onChanged?.(!1),V(d,n()?`Desktop notifications disabled`:`Browser notifications disabled`,!0);return}if(n()){V(s,Lt(t.user.id,!0),!0),t.onChanged?.(b(s)),V(d,b(s)?`Desktop notifications enabled`:`Desktop notification preference could not be saved`,!0),V(p,!b(s));return}if(typeof Notification>`u`){V(a,!1),V(l,`unsupported`),V(s,!1),t.onChanged?.(!1),V(d,`Browser notifications are not supported`),V(p,!0);return}if(V(l,Notification.permission==="default"?await Notification.requestPermission():Notification.permission,!0),V(a,!0),b(l)===`granted`){V(s,Lt(t.user.id,!0),!0),t.onChanged?.(b(s)),V(d,b(s)?`Browser notifications enabled`:`Browser notification preference could not be saved`,!0),V(p,!b(s));return}Lt(t.user.id,!1),V(s,!1),t.onChanged?.(!1),V(d,b(l)===`denied`?`Browser notifications are blocked by this browser`:`Browser notifications were not enabled`,!0),V(p,!0)}var v=$(),y=A(v),S=A(y),w=R(S,!0),T=N(S,4),D=e=>{var t=Xa();u(e,t)},O=e=>{var t=Za();u(e,t)};f(T,e=>{!n()&&!b(a)?e(D):!n()&&b(l)===`denied`&&e(O,1)});var k=N(T,2),ee=e=>{var t=Qa();let n;var r=R(t,!0);z(()=>{n=i(t,1,`settings-row2__hint`,null,n,{"is-error":b(p)}),c(r,b(d))}),u(e,t)};f(k,e=>{b(d)&&e(ee)}),r(y);var P=N(y,2),F=A(P);M(F),r(P),r(v),z(()=>{c(w,n()?`Desktop notifications`:`Browser notifications`),j(F,`aria-label`,n()?`Desktop notifications`:`Browser notifications`),F.disabled=!b(a)||b(l)===`denied`,x(F,b(s))}),_(`change`,F,e=>void h(e.currentTarget.checked)),u(e,v),g()}s([`change`]);var eo=W(``),to=W(`
            Preview

            Shown in messages, mentions, and your profile card.

            Used in mentions and the quick switcher. Must be unique.

            Paste a public image URL. Your initials show when empty.

            Conversation display

            Keep agent reasoning summaries out of the message timeline.

            Hide tool execution details while keeping ordinary messages visible.

            Choose which side of the timeline shows your messages.

            Choose which side of the timeline shows messages from other people and agents.

            Notifications

            `,1);function no(e,t){o(t,!0);let n=C(t,`isDesktop`,3,!1),i=U(``),a=U(``),s=U(``),l=m(()=>b(i).trim()||t.user.display_name||`Your name`),d=m(()=>b(a).trim().replace(/^@+/,``)||t.user.handle||``);E(()=>{V(i,t.user.display_name,!0),V(a,t.user.handle??``,!0),V(s,t.user.avatar_url,!0)});function p(){V(s,``)}Ya(e,{section:`profile`,get onUserUpdated(){return t.onUserUpdated},get onSaved(){return t.onSaved},payload:()=>({display_name:b(i),handle:b(a).trim().replace(/^@+/,``),avatar_url:b(s)}),children:(e,o)=>{var m=to(),h=oe(m),g=A(h);pt(g,{get id(){return t.user.id},get name(){return b(l)},get src(){return b(s)},size:52,loading:`eager`,fetchPriority:`auto`});var v=N(g,2),y=A(v),S=R(y,!0),C=N(y,2),w=R(C,!0);r(v),te(2),r(h);var E=N(h,2),D=A(E),O=N(A(D),2),k=A(O);M(k),r(O),r(D);var j=N(D,2),ee=N(A(j),2),P=A(ee),F=N(A(P),2);M(F),r(P),r(ee),r(j);var I=N(j,2),L=N(A(I),2),ne=A(L);M(ne);var re=N(ne,2),ie=e=>{var t=eo();_(`click`,t,p),u(e,t)};f(re,e=>{b(s)&&e(ie)}),r(L),r(I);var se=N(I,4),ce=N(A(se),2),le=A(ce);M(le),r(ce),r(se);var B=N(se,2),H=N(A(B),2),U=A(H);M(U),r(H),r(B);var W=N(B,2),de=N(A(W),2),fe=A(de),pe=A(fe);pe.value=pe.__value=`left`;var me=N(pe);me.value=me.__value=`right`,r(fe);var he;T(fe),r(de),r(W);var ge=N(W,2),_e=N(A(ge),2),ve=A(_e),G=A(ve);G.value=G.__value=`left`;var ye=N(G);ye.value=ye.__value=`right`,r(ve);var be;T(ve),r(_e),r(ge),$a(N(ge,4),{get user(){return t.user},get isDesktop(){return n()},get onChanged(){return t.onBrowserNotificationsChanged}}),r(E),z(()=>{c(S,b(l)),c(w,b(d)?`@${b(d)}`:`No handle set`),x(le,t.hideCommentary),x(U,t.hideToolCalls),he!==(he=t.userAlign)&&(fe.value=(fe.__value=he)??``,ue(fe,he)),be!==(be=t.otherAlign)&&(ve.value=(ve.__value=be)??``,ue(ve,be))}),ae(k,()=>b(i),e=>V(i,e)),ae(F,()=>b(a),e=>V(a,e)),ae(ne,()=>b(s),e=>V(s,e)),_(`change`,le,e=>t.onHideCommentary(e.currentTarget.checked)),_(`change`,U,e=>t.onHideToolCalls(e.currentTarget.checked)),_(`change`,fe,e=>t.onUserAlign(e.currentTarget.value===`right`?`right`:`left`)),_(`change`,ve,e=>t.onOtherAlign(e.currentTarget.value===`right`?`right`:`left`)),u(e,m)},$$slots:{default:!0}}),g()}s([`click`,`change`]);var ro=W(`

            Add ClickClack to your Home Screen from the Share menu, then open it from there to turn this on.

            `),io=W(`

            This browser does not support push notifications.

            `),ao=W(`

            `),oo=W(`

            `),so=W(`

            Receive alerts when the app is closed.

            `);function co(e,t){o(t,!0);let n=C(t,`isDesktop`,3,!1),a=`This browser is now signed in to a different account. Reload to continue.`,s=U(!1),l=U(!1),d=U(!1),h=U(!1),v=U(``),y=U(!1);E(()=>{S(t.user.id,n())});async function S(e,t){if(t){V(s,!1);return}V(l,zt(),!0);try{let t=b(l)?await an():null,n=await tn(t),r=n.enabled&&await on()!==e;if(V(s,n.enabled,!0),!n.enabled)return;if(r){V(d,!1),V(v,a),V(y,!0);return}V(d,!!t&&Zt(e)&&n.this_device,!0),!t&&Zt(e)&&Qt(e,!1)}catch{V(s,!1)}}async function w(e){let t=e.checked;V(v,``),V(y,!1),V(h,!0);try{t?await T():await D()}catch(e){t&&V(d,!1),V(v,xe(e,t?`Push notifications could not be turned on`:`Push notifications could not be turned off`),!0),V(y,!0)}finally{V(h,!1),e.checked=b(d)}}async function T(){let e=Notification.permission==="default"?await Notification.requestPermission():Notification.permission;if(e!==`granted`){V(d,!1),V(v,e===`denied`?`Notifications are blocked for this site. Allow them in your browser settings, then try again.`:`Notifications were not enabled.`,!0),V(y,!0);return}let[n,r]=await Promise.all([an().then(tn),on()]);if(!n.enabled){V(s,!1);return}if(r!==t.user.id){V(d,!1),V(v,a),V(y,!0);return}await sn(await rn(await nn(),n,t.user.id),t.user.id),Qt(t.user.id,!0),V(d,!0),V(v,`On for this device`)}async function D(){if(await on()!==t.user.id){V(v,a),V(y,!0);return}let e=await an();e&&await cn(e.endpoint,t.user.id),Qt(t.user.id,!1),en(t.user.id,``),V(d,!1),e&&(await e.unsubscribe(),V(v,`Off for this device`))}let O=m(()=>!b(l)&&Vt()&&!Bt());var k=p(),j=oe(k),ee=e=>{var t=so(),n=A(t),a=N(A(n),4),o=e=>{var t=ro();u(e,t)},s=e=>{var t=io();u(e,t)},p=e=>{var t=ao(),n=R(t);z(e=>c(n,`On for ${e??``}`),[()=>Ht()]),u(e,t)};f(a,e=>{b(O)?e(o):b(l)?b(d)&&e(p,2):e(s,1)});var m=N(a,2),g=e=>{var t=oo();let n;var r=R(t,!0);z(()=>{n=i(t,1,`settings-row2__hint`,null,n,{"is-error":b(y)}),c(r,b(v))}),u(e,t)};f(m,e=>{b(v)&&e(g)}),r(n);var S=N(n,2),C=A(S);M(C),r(S),r(t),z(()=>{C.disabled=!b(l)||b(h),x(C,b(d))}),_(`change`,C,e=>void w(e.currentTarget)),u(e,t)};f(j,e=>{b(s)&&e(ee)}),u(e,k),g()}s([`change`]);var lo=W(`

            Desktop

            Mobile push

            Send push notifications to your phone via Pushover.

            Find this in your Pushover dashboard under "Your User Key".

            `);function uo(e,t){o(t,!0);let n=C(t,`isDesktop`,3,!1),i=U(!1),a=U(``);E(()=>{V(i,t.user.notification_settings?.pushover_enabled??!1,!0),V(a,t.user.notification_settings?.pushover_user_key??``,!0)}),Ya(e,{section:`notifications`,get onUserUpdated(){return t.onUserUpdated},payload:()=>({notification_settings:{pushover_enabled:b(i),pushover_user_key:b(a)}}),children:(e,o)=>{var s=lo(),c=N(A(s),2);$a(c,{get user(){return t.user},get isDesktop(){return n()},get onChanged(){return t.onBrowserNotificationsChanged}});var l=N(c,4);co(l,{get user(){return t.user},get isDesktop(){return n()}});var d=N(l,2),f=N(A(d),2),p=A(f);M(p),r(f),r(d);var m=N(d,2),h=N(A(m),2),g=A(h);M(g),r(h),r(m),r(s),D(p,()=>b(i),e=>V(i,e)),ae(g,()=>b(a),e=>V(a,e)),u(e,s)},$$slots:{default:!0}}),g()}var fo=W(`

            Loading…

            `),po=W(`

            `),mo=W(`
            You don't own any bots yet. Open a workspace's Bots & agents page to mint one.
            `),ho=W(``),go=W(`
          • `),_o=W(`

              `),vo=W(`
              `),yo=W(`

              Account

              My bots

              Bots you own across your workspaces. Tokens live with the workspace where the bot was created.

              `,1);function bo(e,t){o(t,!0);let n=U(ee([])),i=U(`loading`),a=U(``);se(()=>{s()});async function s(){V(i,`loading`);try{V(n,await wt(),!0),V(i,`ready`)}catch(e){V(i,`error`),V(a,Tt(e),!0)}}function l(e){t.onClose(),fe(Re(e.workspace.route_id||e.workspace.id,`bots`))}function d(e){return e.startsWith(`@`)?e:`@${e}`}function p(e){let t=e.trim().split(/\s+/).filter(Boolean);return t.length>=2?(t[0][0]+t[1][0]).toUpperCase():e.slice(0,2).toUpperCase()}let h=m(()=>{let e=new Map;for(let t of b(n)){let n=t.workspace.id,r=e.get(n);r?r.entries.push(t):e.set(n,{workspace:t.workspace,entries:[t]})}return[...e.values()].sort((e,t)=>e.workspace.name.localeCompare(t.workspace.name))});var y=yo(),x=N(oe(y),2),S=e=>{var t=fo();u(e,t)},C=e=>{var t=po(),n=R(t,!0);z(()=>c(n,b(a))),u(e,t)},w=e=>{var t=mo();u(e,t)},T=e=>{var t=vo();F(t,21,()=>b(h),e=>e.workspace.id,(e,t)=>{var n=_o(),i=A(n),a=A(i),o=R(a,!0),s=N(a,2);r(i);var m=N(i,2);F(m,21,()=>b(t).entries,e=>e.bot.id,(e,t)=>{var n=go(),i=A(n),a=A(i),o=e=>{var n=ho();z(()=>j(n,`src`,b(t).bot.avatar_url)),u(e,n)},s=e=>{var n=v();z(e=>c(n,e),[()=>p(b(t).bot.display_name||b(t).bot.handle||`?`)]),u(e,n)};f(a,e=>{b(t).bot.avatar_url?e(o):e(s,-1)}),r(i);var m=N(i,2),h=A(m),g=R(h,!0),y=N(h,2),x=A(y),S=R(x,!0),C=N(x,4),w=R(C);r(y),r(m);var T=N(m,2);r(n),z(e=>{c(g,b(t).bot.display_name||b(t).bot.handle),c(S,e),c(w,`${b(t).active_token_count??``} + active ${b(t).active_token_count===1?`token`:`tokens`}`)},[()=>d(b(t).bot.handle)]),_(`click`,T,()=>l(b(t))),u(e,n)}),r(m),r(n),z(()=>c(o,b(t).workspace.name)),_(`click`,s,()=>l(b(t).entries[0])),u(e,n)}),r(t),u(e,t)};f(x,e=>{b(i)===`loading`?e(S):b(i)===`error`?e(C,1):b(n).length===0?e(w,2):e(T,-1)}),u(e,y),g()}s([`click`]);function xo(e,t){return t.includes(`password`)&&e.password_enrolled===!0}function So(e,t,n){return e?t?[...t].length<8?`New password must be at least 8 characters.`:t===n?``:`New passwords do not match.`:`Enter a new password.`:`Enter your current password.`}var Co=W(`

              `),wo=W(``),To=W(`
              Change password

              Pick a new password for signing in. Your other devices are signed out.

              The password you signed in with.

              At least 8 characters. Longer is better than clever.

              Type it once more so a typo cannot lock you out.

              `);function Eo(e,t){o(t,!0);let n=U(``),a=U(``),s=U(``),l=U(``),d=U(!1),p=U(!1);async function m(){if(b(p))return;let e=So(b(n),b(a),b(s));if(e){V(l,e,!0),V(d,!0);return}V(p,!0),V(l,``),V(d,!1);try{await G(`/api/auth/password/change`,{method:`POST`,body:JSON.stringify({current_password:b(n),new_password:b(a)})}),V(n,``),V(a,``),V(s,``),V(l,`Password updated. Your other devices were signed out.`)}catch(e){V(l,xe(e,`Could not change your password`),!0),V(d,!0)}finally{V(p,!1)}}var h=To(),_=N(A(h),2),v=A(_),x=N(A(v),2),S=A(x);M(S),r(x),r(v);var C=N(v,2),w=N(A(C),2),T=A(w);M(T),r(w),r(C);var E=N(C,2),D=N(A(E),2),O=A(D);M(O),r(D),r(E),r(_);var k=N(_,2),j=A(k),ee=e=>{var t=Co();let n;var r=R(t,!0);z(()=>{n=i(t,1,`settings-status`,null,n,{"is-error":b(d)}),c(r,b(l))}),u(e,t)},P=e=>{var t=wo();u(e,t)};f(j,e=>{b(l)?e(ee):e(P,-1)});var F=N(j,2),I=R(F,!0);r(k),r(h),z(()=>{F.disabled=b(p),c(I,b(p)?`Updating...`:`Update password`)}),y(`submit`,h,e=>{e.preventDefault(),m()}),ae(S,()=>b(n),e=>V(n,e)),ae(T,()=>b(a),e=>V(a,e)),ae(O,()=>b(s),e=>V(s,e)),u(e,h),g()}var Do=W(``),Oo=W(``),ko=W(`

              Account

              Appearance

              Changes apply instantly and follow your account on every device.

              Live preview — updates as you pick

              Color mode System follows your OS setting
              Board theme Palette for boards, accents, and highlights
              Message layout How agent activity attaches to replies
              Density Compact fits more messages on screen
              `,1);function Ao(e,t){o(t,!0);let n=m(()=>t.user.display_name||t.user.handle||`You`),a=m(()=>(b(n)[0]??`Y`).toUpperCase()),s=U(ee(Se())),l=U(ee(Me())),d=U(ee(Pe())),f=U(ee(De()));E(()=>{t.user.appearance_preferences,V(s,Se(),!0),V(l,Me(),!0),V(d,Pe(),!0),V(f,De(),!0)});function p(e){V(s,e,!0),Ae(e)}function h(e){V(l,e,!0),we(e)}function v(e){V(d,e,!0),Te(e)}function y(e){V(f,e,!0),Oe(e)}function x(e,t,n,r){let i;switch(e.key){case`ArrowRight`:case`ArrowDown`:i=(n+1)%t;break;case`ArrowLeft`:case`ArrowUp`:i=(n-1+t)%t;break;case`Home`:i=0;break;case`End`:i=t-1;break;default:return}e.preventDefault(),r(i),(e.currentTarget.parentElement?.querySelectorAll(`[role="radio"]`))?.item(i).focus()}var S=ko(),C=N(oe(S),2),w=A(C),T=N(A(w),2),D=A(T),O=A(D),k=R(O,!0),M=N(O,2),P=A(M),I=A(P),L=R(I,!0);te(2),r(P),te(2),r(M),r(D);var ne=N(D,4),re=A(ne),ie=R(re,!0),ae=N(re,2),se=A(ae),ce=A(se),le=R(ce,!0);te(2),r(se),te(2),r(ae),r(ne),r(T),r(w);var B=N(w,4),ue=A(B),H=N(A(ue),2);F(H,23,()=>ke,e=>e.id,(e,t,n)=>{var r=Do();let a;var o=R(r,!0);z(()=>{a=i(r,1,`appearance-seg__btn`,null,a,{"is-active":b(s)===b(t).id}),j(r,`aria-checked`,b(s)===b(t).id),j(r,`tabindex`,b(s)===b(t).id?0:-1),c(o,b(t).label)}),_(`click`,r,()=>p(b(t).id)),_(`keydown`,r,e=>x(e,ke.length,b(n),e=>p(ke[e].id))),u(e,r)}),r(H),r(ue);var W=N(ue,2),de=N(A(W),2),fe=A(de),pe=R(fe,!0),me=N(fe,2);F(me,23,()=>Ne,e=>e.id,(e,t,n)=>{var r=Oo();let a;z(()=>{a=i(r,1,`board-chip`,null,a,{"is-active":b(l)===b(t).id}),j(r,`aria-checked`,b(l)===b(t).id),j(r,`tabindex`,b(l)===b(t).id?0:-1),j(r,`data-board`,b(t).id),j(r,`aria-label`,`${b(t).label} — ${b(t).blurb}`),j(r,`title`,`${b(t).label} — ${b(t).blurb}`)}),_(`click`,r,()=>h(b(t).id)),_(`keydown`,r,e=>x(e,Ne.length,b(n),e=>h(Ne[e].id))),u(e,r)}),r(me),r(de),r(W);var he=N(W,2),ge=N(A(he),2);F(ge,23,()=>Ee,e=>e.id,(e,t,n)=>{var r=Do();let a;var o=R(r,!0);z(()=>{a=i(r,1,`appearance-seg__btn`,null,a,{"is-active":b(d)===b(t).id}),j(r,`aria-checked`,b(d)===b(t).id),j(r,`tabindex`,b(d)===b(t).id?0:-1),j(r,`title`,b(t).blurb),c(o,b(t).label)}),_(`click`,r,()=>v(b(t).id)),_(`keydown`,r,e=>x(e,Ee.length,b(n),e=>v(Ee[e].id))),u(e,r)}),r(ge),r(he);var _e=N(he,2),ve=N(A(_e),2);F(ve,23,()=>je,e=>e.id,(e,t,n)=>{var r=Do();let a;var o=R(r,!0);z(()=>{a=i(r,1,`appearance-seg__btn`,null,a,{"is-active":b(f)===b(t).id}),j(r,`aria-checked`,b(f)===b(t).id),j(r,`tabindex`,b(f)===b(t).id?0:-1),j(r,`title`,b(t).blurb),c(o,b(t).label)}),_(`click`,r,()=>y(b(t).id)),_(`keydown`,r,e=>x(e,je.length,b(n),e=>y(je[e].id))),u(e,r)}),r(ve),r(_e),r(B),r(C),z(e=>{j(w,`data-layout`,b(d)),j(w,`data-density`,b(f)),c(k,b(a)),c(L,b(n)),c(ie,b(a)),c(le,b(n)),c(pe,e)},[()=>Ne.find(e=>e.id===b(l))?.label]),u(e,S),g()}s([`click`,`keydown`]);var jo=W(` `,1),Mo=W(` `,1),No=W(` `,1),Po=W(` `,1),Fo=W(`
            • `),Io=W(``),Lo=W(`

              Workspace

              `,1),Ro=W(`

              `),zo=W(`
            • `),Bo=W(`
                `),Vo=W(`

                Loading...

                `),Ho=W(`

                `),Uo=W(`

                `),Wo=W(`

                Account

                Profile settings

                How you appear across ClickClack.

                Sign out

                End this session on this device.

                `,1),Go=W(`

                Account

                Notifications

                Decide when and how ClickClack should reach you.

                `,1),Ko=W(``);function qo(e,t){o(t,!0);let n=C(t,`workspaces`,19,()=>[]),a=C(t,`currentWorkspaceID`,3,``),s=C(t,`initialSection`,3,Ie),l=C(t,`isDesktop`,3,!1),d=U(``),h=m(()=>n().find(e=>e.id===b(d))??Fe(n(),a())),v=U(!1),x=U(``),S=U(ee(Ie)),w=m(()=>xo(t.user,ge())),D=U(`loading`),k=U(``);E(()=>{V(S,s(),!0)}),E(()=>{b(S);let e=new AbortController;return P(e.signal),()=>e.abort()});async function M(){if(!b(v)){V(v,!0),V(x,``);try{await G(`/api/auth/logout`,{method:`POST`,body:JSON.stringify({})}),window.location.reload()}catch(e){V(x,xe(e,`Could not sign out. Try again.`),!0),V(v,!1)}}}async function P(e){V(D,`loading`),V(k,``);try{let n=await Ce({signal:e});e.throwIfAborted(),t.onUserUpdated(n.user),V(D,`ready`)}catch(t){if(e.aborted)return;if(t instanceof be&&(t.status===401||t.status===403)){V(D,`error`),V(k,`Sign in to manage your account`);return}V(D,`error`),V(k,t instanceof Error?t.message:`Could not load your account`,!0)}}function I(e){e.target===e.currentTarget&&t.onClose()}function L(e){if(e.key!==`Escape`)return;let n=e.target;(!n||n.tagName!==`INPUT`&&n.tagName!==`TEXTAREA`&&!n.isContentEditable)&&(e.preventDefault(),t.onClose())}function te(e,n){t.onClose(),fe(Re(e.route_id||e.id,n))}var ne=Ko();y(`keydown`,O,L);var re=A(ne),ie=A(re),ae=N(ie,2),se=A(ae),ce=N(A(se),2);F(ce,21,()=>ze,e=>e.id,(e,n)=>{var a=Fo(),o=A(a);let s;var l=A(o),d=e=>{var r=jo(),i=oe(r);pt(i,{class:`settings-modal__rail-avatar`,get id(){return t.user.id},get name(){return t.user.display_name},get src(){return t.user.avatar_url},size:18});var a=N(i,2),o=R(a,!0);z(()=>c(o,t.user.display_name||b(n).label)),u(e,r)},p=e=>{var t=Mo(),r=N(oe(t),2),i=R(r,!0);z(()=>c(i,b(n).label)),u(e,t)},m=e=>{var t=No(),r=N(oe(t),2),i=R(r,!0);z(()=>c(i,b(n).label)),u(e,t)},h=e=>{var t=Po(),r=N(oe(t),2),i=R(r,!0);z(()=>c(i,b(n).label)),u(e,t)};f(l,e=>{b(n).id===`profile`?e(d):b(n).id===`appearance`?e(p,1):b(n).id===`notifications`?e(m,2):b(n).id===`bots`&&e(h,3)}),r(o),r(a),z(()=>{s=i(o,1,`settings-modal__rail-item`,null,s,{"is-active":b(S)===b(n).id}),j(o,`aria-current`,b(S)===b(n).id?`page`:void 0)}),_(`click`,o,()=>V(S,b(n).id,!0)),u(e,a)}),r(ce),r(se);var le=N(se,2),B=e=>{var t=Bo(),i=A(t),o=e=>{var t=Lo(),i=N(oe(t),4);F(i,21,n,e=>e.id,(e,t)=>{var n=Io(),r=R(n,!0),i={};z(e=>{c(r,e),i!==(i=b(t).id)&&(n.value=(n.__value=i)??``)},[()=>Le(b(t),a())?`${b(t).name} (current)`:b(t).name]),u(e,n)}),r(i);var o;T(i),z(()=>{o!==(o=b(h).id)&&(i.value=(i.__value=o)??``,ue(i,o))}),_(`change`,i,e=>V(d,e.currentTarget.value,!0)),u(e,t)},s=e=>{var t=Ro(),n=R(t);z(()=>{j(t,`title`,b(h).name),c(n,`Workspace · ${b(h).name??``}`)}),u(e,t)};f(i,e=>{n().length>1?e(o):e(s,-1)});var l=N(i,2);F(l,21,()=>K,e=>e.id,(e,t)=>{var n=p(),i=oe(n),a=e=>{var n=zo(),i=A(n),a=N(A(i),2),o=R(a,!0);r(i),r(n),z(()=>c(o,b(t).label)),_(`click`,i,()=>te(b(h),b(t).slug)),u(e,n)},o=m(()=>!b(t).managersOnly||q(b(h).role));f(i,e=>{b(o)&&e(a)}),u(e,n)}),r(l),r(t),u(e,t)};f(le,e=>{b(h)&&e(B)}),r(ae);var H=N(ae,2),W=A(H),de=e=>{var t=Vo();u(e,t)},pe=e=>{var t=Ho(),n=R(t,!0);z(()=>c(n,b(k))),u(e,t)},me=e=>{var n=Wo(),i=N(oe(n),2);no(i,{get user(){return t.user},get hideCommentary(){return t.hideCommentary},get hideToolCalls(){return t.hideToolCalls},get userAlign(){return t.userAlign},get otherAlign(){return t.otherAlign},get isDesktop(){return l()},get onUserUpdated(){return t.onUserUpdated},get onSaved(){return t.onClose},get onHideCommentary(){return t.onHideCommentary},get onHideToolCalls(){return t.onHideToolCalls},get onUserAlign(){return t.onUserAlign},get onOtherAlign(){return t.onOtherAlign},get onBrowserNotificationsChanged(){return t.onBrowserNotificationsChanged}});var a=N(i,2),o=e=>{Eo(e,{})};f(a,e=>{b(w)&&e(o)});var s=N(a,2),d=A(s),p=N(A(d),4),m=e=>{var t=Uo(),n=R(t,!0);z(()=>c(n,b(x))),u(e,t)};f(p,e=>{b(x)&&e(m)}),r(d);var h=N(d,2),g=A(h),y=R(g,!0);r(h),r(s),z(()=>{g.disabled=b(v),c(y,b(v)?`Signing out...`:`Sign out`)}),_(`click`,g,M),u(e,n)},he=e=>{Ao(e,{get user(){return t.user}})},_e=e=>{var n=Go();uo(N(oe(n),2),{get user(){return t.user},get isDesktop(){return l()},get onUserUpdated(){return t.onUserUpdated},get onBrowserNotificationsChanged(){return t.onBrowserNotificationsChanged}}),u(e,n)},ve=e=>{bo(e,{get onClose(){return t.onClose}})};f(W,e=>{b(D)===`loading`?e(de):b(D)===`error`?e(pe,1):b(S)===`profile`?e(me,2):b(S)===`appearance`?e(he,3):b(S)===`notifications`?e(_e,4):b(S)===`bots`&&e(ve,5)}),r(H),r(re),r(ne),_(`click`,ne,I),_(`click`,ie,function(...e){t.onClose?.apply(this,e)}),u(e,ne),g()}s([`click`,`change`]);var Jo=W(`
                No thread open Hover any message and tap the bubble to keep side conversations tidy.
                `);function Yo(e){var t=Jo();u(e,t)}var Xo=W(``),Zo=W(`

                `,1),Qo=W(``),$o=W(``),es=W(``),ts=W(``),ns=W(``),rs=W(``),is=W(``),as=W(`
                `),os=W(`Connecting…`),ss=W(`
                `);function cs(e,t){o(t,!0);function n(e){return e===`muted`?`Channel muted - click to change`:e===`mentions`?`Notifications for @mentions only - click to change`:`All notifications enabled - click to change`}let a=C(t,`channelNotifPreference`,3,void 0),s=C(t,`channelNotifSaving`,3,!1),l=C(t,`channelSettingsAvailable`,3,!1),d=C(t,`pinsAvailable`,3,!1),p=C(t,`pinnedOpen`,3,!1),h=C(t,`onOpenChannelSettings`,3,()=>{}),v=C(t,`onToggleChannelNotifications`,3,()=>{}),x=m(()=>yt(t.externalURL));var S=ss(),w=A(S),T=A(w),E=A(T),D=A(E),O=N(A(D),2);r(D),r(E);var k=N(E,2),ee=R(k,!0),P=N(k,2),F=e=>{var n=Zo(),r=N(oe(n),2),i=R(r,!0),a=N(r,2),o=e=>{var t=Xo();z(()=>j(t,`href`,b(x))),u(e,t)};f(a,e=>{b(x)&&e(o)}),z(()=>{j(r,`title`,t.channelTitle),c(i,t.channelTitle)}),u(e,n)};f(P,e=>{t.channelTitle&&e(F)}),r(T);var I=N(T,2),L=N(A(I),2);M(L);var ne=N(L,2),re=e=>{var n=Qo();_(`click`,n,function(...e){t.onResetSearch?.apply(this,e)}),u(e,n)};f(ne,e=>{t.searchQuery&&e(re)}),te(2),r(I);var ie=N(I,2),ae=e=>{var o=as(),c=A(o),m=e=>{var t=ns(),i=A(t),o=e=>{var t=$o();u(e,t)},c=e=>{var t=es();u(e,t)},l=e=>{var t=ts();u(e,t)};f(i,e=>{a()===`muted`?e(o):a()===`mentions`?e(c,1):e(l,-1)}),r(t),z((e,n)=>{j(t,`title`,e),j(t,`aria-label`,n),j(t,`aria-busy`,s()),t.disabled=s()},[()=>n(a()),()=>n(a())]),_(`click`,t,function(...e){v()?.apply(this,e)}),u(e,t)};f(c,e=>{a()&&e(m)});var g=N(c,2),y=e=>{var n=rs();let r;z(()=>{j(n,`title`,p()?`Close pinned items`:`Pinned items`),j(n,`aria-label`,p()?`Close pinned items`:`Pinned items`),r=i(n,1,``,null,r,{active:p()})}),_(`click`,n,function(...e){t.onPinnedItems?.apply(this,e)}),u(e,n)};f(g,e=>{d()&&e(y)});var b=N(g,2),x=e=>{var t=is();_(`click`,t,function(...e){h()?.apply(this,e)}),u(e,t)};f(b,e=>{l()&&e(x)}),r(o),u(e,o)};f(ie,e=>{(a()||d()||l())&&e(ae)});var se=N(ie,2),ce=e=>{var t=os();u(e,t)};f(se,e=>{t.connected||e(ce)}),r(w),r(S),z(()=>{j(S,`data-platform`,t.platform),j(E,`aria-label`,t.mobileNavigation?t.mobileNavOpen?`Close navigation`:`Open navigation`:t.sidebarCollapsed?`Expand sidebar`:`Collapse sidebar`),j(E,`title`,t.mobileNavigation?t.mobileNavOpen?`Close navigation`:`Open navigation`:t.sidebarCollapsed?`Expand sidebar`:`Collapse sidebar`),j(O,`d`,t.mobileNavigation?t.mobileNavOpen?`m15 9-3 3 3 3`:`m9 9 3 3-3 3`:t.sidebarCollapsed?`m13 9 3 3-3 3`:`m16 9-3 3 3 3`),c(ee,t.workspaceName||`ClickClack`),B(L,t.searchQuery)}),_(`click`,E,function(...e){t.onToggleSidebar?.apply(this,e)}),_(`click`,k,function(...e){t.onOpenWorkspaceSettings?.apply(this,e)}),y(`submit`,I,e=>{e.preventDefault(),t.onSearch()}),_(`input`,L,e=>t.onSearchQuery(e.currentTarget.value)),u(e,S),g()}s([`click`,`input`]);var ls=W(`

                `),us=W(``),ds=W(``),fs=W(``),ps=W(``),ms=W(`

                `,1),hs=W(`

                ClickClack

                `),gs=W(``),_s=W(``),vs=W(``),ys=W(``),bs=W(`

                `);function xs(e,t){o(t,!0);function n(e){return e===`muted`?`Channel muted - click to change`:e===`mentions`?`Notifications for @mentions only - click to change`:`All notifications enabled - click to change`}let a=C(t,`pinnedOpen`,3,!1),s=C(t,`channelNotifPreference`,3,void 0),l=C(t,`channelNotifSaving`,3,!1),d=C(t,`channelSettingsAvailable`,3,!1),p=C(t,`onOpenChannelSettings`,3,()=>{}),h=C(t,`onToggleChannelNotifications`,3,()=>{}),v=m(()=>t.selectedDirect?void 0:yt(t.selectedChannel?.external_url));var x=bs(),S=A(x),w=A(S),T=e=>{var n=ls(),r=R(n,!0);z(e=>c(r,e),[()=>`@${ot(t.selectedDirect,t.currentUserID)}`]),u(e,n)},E=e=>{var i=ms(),a=oe(i),o=R(a,!0),d=N(a,2),p=e=>{var t=ps(),i=A(t),a=e=>{var t=us();u(e,t)},o=e=>{var t=ds();u(e,t)},c=e=>{var t=fs();u(e,t)};f(i,e=>{s()===`muted`?e(a):s()===`mentions`?e(o,1):e(c,-1)}),r(t),z((e,n)=>{j(t,`title`,e),j(t,`aria-label`,n),j(t,`aria-busy`,l()),t.disabled=l()},[()=>n(s()),()=>n(s())]),_(`click`,t,function(...e){h()?.apply(this,e)}),u(e,t)};f(d,e=>{s()&&e(p)}),z(e=>c(o,e),[()=>`#${bt(t.selectedChannel)}`]),u(e,i)},D=e=>{var t=hs();u(e,t)};f(w,e=>{t.selectedDirect?e(T):t.selectedChannel?e(E,1):e(D,-1)});var O=N(w,4),k=R(O,!0);r(S);var ee=N(S,2),P=N(A(ee),2);M(P);var F=N(P,2),I=e=>{var n=gs();_(`click`,n,function(...e){t.onResetSearch?.apply(this,e)}),u(e,n)};f(F,e=>{t.searchQuery&&e(I)}),te(2),r(ee);var L=N(ee,2),ne=A(L),re=e=>{var t=_s();z(()=>j(t,`href`,b(v))),u(e,t)};f(ne,e=>{b(v)&&e(re)});var ie=N(ne,2);let ae;var se=N(ie,2),ce=e=>{var n=vs();let r;z(()=>{j(n,`title`,a()?`Close pinned items`:`Pinned items`),j(n,`aria-label`,a()?`Close pinned items`:`Pinned items`),r=i(n,1,``,null,r,{active:a()})}),_(`click`,n,function(...e){t.onPinnedItems?.apply(this,e)}),u(e,n)};f(se,e=>{t.selectedChannel&&e(ce)});var le=N(se,2),V=e=>{var t=ys();_(`click`,t,function(...e){p()?.apply(this,e)}),u(e,t)};f(le,e=>{t.selectedChannel&&d()&&e(V)}),r(L),r(x),z(()=>{c(k,t.workspaceName||`no workspace`),B(P,t.searchQuery),j(ie,`title`,t.threadOpen?`Close thread`:`Open a message thread`),j(ie,`aria-label`,t.threadOpen?`Close thread`:`Open a message thread`),ae=i(ie,1,``,null,ae,{active:t.threadOpen})}),y(`submit`,ee,e=>{e.preventDefault(),t.onSearch()}),_(`input`,P,e=>t.onSearchQuery(e.currentTarget.value)),_(`click`,ie,function(...e){t.onToggleThread?.apply(this,e)}),u(e,x),g()}s([`click`,`input`]);function Ss(e,t,n){let r=t.find(t=>t.bot.id===e)?.bot??n(e);return r?.display_name?.trim()||(r?.handle?`@${r.handle}`:``)}function Cs(e,t,n){let r=new Set,i=[];for(let a of e){if(!a.lines.some(e=>!e.finalized)||a.userId&&r.has(a.userId))continue;a.userId&&r.add(a.userId);let e=Ss(a.userId,t,n);e&&i.push(e)}return i}async function ws(e){return(await G(`/api/workspaces/${e}/bot-commands`)).bot_commands??[]}function Ts(e){let t=e.trim().toLowerCase();return t?t.startsWith(`/`)?t:`/${t}`:``}function Es(e){let t=/^(\/\S+)\s*([\s\S]*)$/.exec(e);return t?{command:Ts(t[1]),text:t[2].trim()}:null}function Ds(e,t){return e.find(e=>!e.revoked_at&&Ts(e.command)===t)}async function Os(e,t,n){let r=new URLSearchParams;r.set(`command`,t),r.set(`text`,n);let i=await fetch(he(`/api/hooks/slash/${e}`),ye({method:`POST`,credentials:`include`,headers:{Accept:`application/json`,"Content-Type":`application/x-www-form-urlencoded`,"X-ClickClack-CSRF":`1`},body:r.toString()})),a=await i.text();if(!i.ok)throw new be(i.status,a);let o=a?JSON.parse(a):{};return{response_type:o.response_type||`in_channel`,text:(o.text||``).trim()}}var ks=e({default:()=>Ws}),As=W(``),js=W(``),Ms=W(``),Ns=W(`
                Showing topic
                `),Ps=W(`

                `),Fs=W(`
                `),Is=W(``),Ls=W(``),Rs=W(``),zs=W(` `,1),Bs=W(`

                Loading thread…

                `),Vs=W(`
                Thread
                `,1),Hs=W(``),Us=W(`
                `,1);function Ws(e,n){o(n,!1);let s=()=>ce(tt,`$threadView`,d),[d,m]=ie(),h=S(),x=S(),E=S(),D=S(),ee=S(),M=S(),I=S(),L=S(),te=S(),ae=S(),B=S(),U=S(),W=S(),me=S(),he=S(),ge=S(),ye=S(),Se=S(),we=S(),Te=S(),Ee=S(),De=S(),Oe=S(),ke=S(),Ae=S(),je=Date.now(),Me=Rt?.integratedTitleBar===!0,Ne=S(Ot),Pe=C(n,`routeWorkspaceID`,8,``),Fe=C(n,`routeTargetID`,8,``),K=S(null),Ie=new nt(()=>b(K)?.id||``),Le=new He(Jo),ze=S([]),q=S([]),Ve=S([]),Ge=S(null),qe=new Map,Ye=new Map,Xe=S(!1),J=S([]),Ze=S([]),Y=S(``),X=S(``),Z=S(``),Q=new St(()=>`${b(Y)}:${$()}`,ts),tt=de(()=>({root:Q.root,selection:Q.selection,replies:Q.replies,state:Q.state,draft:Q.draft,error:Q.error})),it=S(``),st=S(``),lt=0,ut=``,dt=new Map,ft=S(null),pt=S(!1),mt=S([]),_t=S(!1),yt=S(``),wt=S(new Set),Tt=0,kt=S([]),At=S([]),jt=S([]),Pt=S([]),Ft=S(null),zt=S([]),Bt=S(``),Vt=S(null),Ht=S(null),Ut=S(``),Wt=S(null),Gt=S(null),Kt=S(null),qt=new Set,Jt=S(``),Yt=S(``),Xt=S(``),Zt=S(``),Qt=S(null),$t=S(``),en=S(``),tn=S(``),nn=0,rn=S(``),an=S(null),on=S(!1),sn=0,cn=0,un=S(null),dn=S(``),mn=null,hn=S(!1),gn=S(`profile`),_n=S(!1),vn=S(!1),yn=S(``),bn=S(null),xn=S(null),Sn=S(!1),Cn=S(!1),Tn=S(``),En=0,Dn=null,On=S(!1),kn=S(!1),An=S(!1),jn=S(!1),Fn=S(!1),In=S(`left`),Ln=S(`left`),zn=S(!1),Bn=S(!1),Vn=S(!1),Hn=S(``),Un=``,Gn=``,Kn=null,qn=S(null),Jn=new Map,Yn=S(new Map),Xn=new ht(()=>[b(K)?.id,b(Y),$()].join(`:`)),Qn=new Set,er=S(`idle`),tr=`idle`,nr=!1,rr=!1,ir=S(!1),ar=S(!1),or=S(!1),sr=S(!1),cr=new Map,lr=0,ur=S(``),dr=S(void 0),fr=S(``),pr=S(!0),mr=S(!1),hr=S(!1),gr=S(!1),_r=S(!1),vr=S(null),yr=S(null),br=S(null),xr=S(null),Sr=S(`message`),Cr=S([]),wr,Tr=S([]),Er,Dr=S(Date.now()),Or,kr=``,Ar=0,jr=Promise.resolve(),Mr=0,Nr=0,Fr=0,Ir=new Set,Lr=0,Rr=0,zr=0,Br=0,Vr=null,Hr=S(``),Wr=0,Gr=0,Jr=0,Xr=0,Zr=0,Qr=S(null),ei,ti=S(new Set),ri=S(null),ii=S(``);function oi(e){e!==ut&&(ut=e,V(it,``),si(``))}function si(e){e!==b(st)&&(V(st,e),lt+=1)}function ci(){return`${b(Y)}:${$()}:${b(st)}:${lt}:${Mr}`}function li(e,t){return t?e.filter(e=>!e.archived_at&&(!e.channel_id||e.channel_id===t)):[]}pe(()=>{Rt?.setActiveRoute(`${window.location.pathname}${window.location.search}${window.location.hash}`)}),se(()=>{mi(),Nt(e=>G(e)).then(e=>{V(Ne,e)}),Or=window.setInterval(()=>{V(Dr,Date.now())},3e4),Ni(),bi(fn(window.location.href));let e=window.matchMedia(`(max-width: 820px)`),t=()=>{V(gr,!1),V(_r,e.matches)};t();let n=Rt?.onNavigate(e=>{fe(e,{keepFocus:!0,noScroll:!0})}),r=Rt?.onQuickCompose(()=>pi());e.addEventListener(`change`,t);let i=e=>{let t=e.data;if(t?.type===`clickclack:push-renew`){b(K)&&!Rt&&ln(b(K).id);return}t?.type===`clickclack:notification-click`&&typeof t.url==`string`&&t.url.startsWith(`/app`)&&ui(t.url)};return navigator.serviceWorker?.addEventListener(`message`,i),()=>{e.removeEventListener(`change`,t),navigator.serviceWorker?.removeEventListener(`message`,i),n?.(),r?.()}});async function ui(e){await fe(e,{keepFocus:!0,noScroll:!0}),await fi()}async function fi(){await t();let e=Ar;await jr,e===Ar&&await Lo()}function pi(){t().then(()=>{(b(Sr)===`thread`?b(xr):b(br))?.focus()})}function mi(){(e=>{V(jn,e.hideCommentary),V(Fn,e.hideToolCalls),V(In,e.userAlign),V(Ln,e.otherAlign)})(Mn()),Pn(b(In),b(Ln))}function hi(e){V(In,e),Pn(b(In),b(Ln)),Nn(`userAlign`,e)}function gi(e){V(Ln,e),Pn(b(In),b(Ln)),Nn(`otherAlign`,e)}function _i(e){V(jn,e),Nn(`hideCommentary`,e)}function vi(e){V(Fn,e),Nn(`hideToolCalls`,e)}re(()=>{Ws(),Q.close(),Ar+=1,Mr+=1,Xn.clear(),Br+=1,Vr?.abort(),Kn?.close(),Kn=null,V(Vn,!1),$n(),wr&&window.clearInterval(wr),Er&&window.clearInterval(Er),Or&&window.clearInterval(Or),ei&&clearTimeout(ei),yc(!1,null)});async function bi(e=null){try{let t=await Ce();V(K,t.user),Ni(),Rt||ln(b(K).id),await Pi(),e!==null&&await fe(e,{replaceState:!0,keepFocus:!0,noScroll:!0}),V(zn,!0),e!==null&&fi()}catch(e){xi(e)}}function xi(e){if(e instanceof be&&(e.status===401||e.status===403)){Kn?.close(),Kn=null,V(hn,!1),V(Bn,!0),V(zn,!1);return}V(Ft,{kind:`error`,text:xe(e,`Could not load ClickClack`)})}function Si(){b(K)&&(V(gr,!1),V(gn,`profile`),V(hn,!0))}function Ci(){let e=b(x)?.route_id||b(Y)||Pe();e&&fe(Re(e))}function wi(){b(L)&&(V(yn,``),V(_n,!0))}async function Ti(e){let t=b(M);if(t&&b(L)&&!b(vn)){V(vn,!0),V(yn,``);try{let n=await G(`/api/channels/${t.id}`,{method:`PATCH`,body:JSON.stringify({archived:e})});V(q,b(q).map(e=>e.id===n.channel.id?n.channel:e)),V(_n,!1)}catch(t){V(yn,xe(t,e?`Could not archive channel`:`Could not restore channel`))}finally{V(vn,!1)}}}async function Ei(){let e=b(M);if(!e||!b(I))return;let t=++En;V(_n,!1),V(yn,``),V(bn,e),V(xn,null),V(Tn,``),V(Sn,!0);try{let n=await G(`/api/channels/${e.id}/deletion-preview`);t===En&&V(xn,n)}catch(e){t===En&&V(Tn,xe(e,`Could not check what this channel contains`))}finally{t===En&&V(Sn,!1)}}function Di(){b(Cn)||(En+=1,V(bn,null),V(xn,null),V(Sn,!1),V(Tn,``))}function Oi(){let e=b(bn)?.id;Di(),e&&e===b(X)&&wi()}async function ki(){let e=b(bn);if(e&&!b(Cn)){V(Cn,!0),V(Tn,``);try{await G(`/api/channels/${e.id}`,{method:`DELETE`})}catch(e){V(Tn,xe(e,`Could not delete channel`)),V(Cn,!1);return}V(Cn,!1),Di(),b(q).some(t=>t.id===e.id)&&await ji(e.id,La(bt(e),``,!0))}}async function Ai(e){let t=e.payload.channel_id;if(!t||Ir.has(t))return;let n=b(q).find(e=>e.id===t),r=e.payload.deleted_by||``,i=b(zt).find(e=>e.id===r)?.display_name||``;await ji(t,La(n?bt(n):e.payload.channel_name||`channel`,i,r===b(K)?.id))}async function ji(e,t){let n=b(X)===e;Ir.add(e),V(q,b(q).filter(t=>t.id!==e)),Jn.delete(e),b(Yn).delete(e),Q.root?.channel_id===e&&Q.close(),b(an)&&V(an,{...b(an),results:b(an).results.filter(t=>t.channel_id!==e),activeResultID:b(an).results.some(t=>t.id===b(an)?.activeResultID&&t.channel_id===e)?``:b(an).activeResultID}),b(bn)?.id===e&&(V(Cn,!1),Di()),n&&(V(_n,!1),V(yn,``),Dn={fromConversation:e,text:t},Wi(),await Vi(b(Y),Gi(),!0))}function Mi(e){V(K,e),jo(e),Q.updateAuthor(e)}function Ni(){if(Rt){V(An,It(b(K)?.id||``));return}let e=It(b(K)?.id||``);V(An,typeof Notification<`u`&&Notification.permission===`granted`&&e),e&&!b(An)&&Lt(b(K)?.id||``,!1)}async function Pi(){let e=++Nr,t=await G(`/api/workspaces`);e===Nr&&V(ze,t.workspaces)}function Fi(e=``,t=``){return`${e||``}/${t||``}`}function Ii(e=b(Y),t=``){let n=zi(e);if(!n)return`/app`;let r=`/app/${encodeURIComponent(n)}`,i=Bi(t);return i?`${r}/${encodeURIComponent(i)}`:r}async function Li(e){if(!e.channel_id||e.parent_message_id)throw Error(`Only channel roots have links`);let t=await G(`/api/messages/${e.id}/route`,{method:`POST`});if(!t.message.route_id)throw Error(`Message route was not allocated`);Ao({id:t.message.id,route_id:t.message.route_id});let n=zi(t.message.workspace_id);if(!n)throw Error(`Workspace route is unavailable`);let r=`/app/${encodeURIComponent(n)}/${encodeURIComponent(t.message.route_id)}`;return new URL(r,`${ve()}/`).toString()}function Ri(e){let t=b(q).find(t=>t.id===e)?.route_id||b(J).find(t=>t.id===e)?.route_id;return t?Ii(b(Y),t):!b(Y)||!e?`/app`:`/app/${encodeURIComponent(b(Y))}/${encodeURIComponent(e)}`}function zi(e=b(Y)){return e?b(ze).find(t=>t.id===e||t.route_id===e)?.route_id||e:``}function Bi(e=``){return e?b(q).find(t=>t.id===e||t.route_id===e)?.route_id||b(J).find(t=>t.id===e||t.route_id===e)?.route_id||Q.root?.id===e&&Q.root.route_id||b(Ze).find(t=>t.id===e)?.route_id||e:``}async function Vi(e=b(Y),t=``,n=!1){let r=Ii(e,t);window.location.pathname!==r&&await fe(r,{replaceState:n,noScroll:!0,keepFocus:!0})}function Hi(e,t){Fi(e,t)!==kr&&(jr=Qi(e,t))}function Ui(){Ar++,kr=Fi(zi(),Bi($())),Vi(b(Y),$())}function Wi(){b(on)&&vs(),Q.close(),V(ft,null),V(pt,!1),V(Sr,`message`),V(gr,!1)}function Gi(e=b(Y)){return Yi(e)||b(q).find(e=>e.name.toLowerCase()===`guest`)?.id||b(q)[0]?.id||b(J)[0]?.id||``}function Ki(e=b(Y)){return b(ze).find(t=>t.id===e||t.route_id===e)}function qi(e=b(Y)){let t=Ki(e),n=t?.route_id||t?.id||e;return n?`clickclack:last-channel:v1:${n}`:``}function Ji(e){try{let t=JSON.parse(e);return{id:typeof t.id==`string`?t.id:``,routeID:typeof t.routeID==`string`?t.routeID:``}}catch{return{id:e}}}function Yi(e=b(Y)){let t=qi(e);if(!t)return``;let n;try{let e=window.localStorage.getItem(t);if(!e)return``;n=Ji(e)}catch{return``}let r=b(q).find(e=>e.id===n.id||e.route_id===n.routeID);if(r)return r.id;try{window.localStorage.removeItem(t)}catch{}return``}function Xi(e,t){if(!e||!t)return;let n=b(q).find(e=>e.id===t);if(!n)return;let r=qi(e);if(r)try{window.localStorage.setItem(r,JSON.stringify({id:n.id,routeID:n.route_id}))}catch{}}function Zi(e){Gn===e&&(Gn=``,ec())}async function Qi(e=``,t=``){let n=++Ar;kr=Fi(e,t),t!==Q.selection?.messageID&&t!==Q.root?.route_id&&Q.close();try{Ie.clear();let r=t.trim()?await ta(e,t):null;if(n!==Ar)return;let i=r?b(ze).find(e=>e.id===r.workspace_id):b(ze).find(t=>t.id===e||t.route_id===e)||b(ze)[0];if(!i){Ma(``,{messages:[],oldest_seq:0,newest_seq:0,has_older:!1,has_newer:!1},`replace`);return}let a=b(Y)!==i.id;if(a&&(Oo(),Le.clear(),Xn.clear(),ra(),V(Y,i.id),Lr+=1,Wr+=1,Gr+=1,Br+=1,Vr?.abort(),V(Hr,``),V(jt,[]),V(Pt,[]),V(Ve,[]),V(At,[]),V(X,``),V(Z,``),Q.close(),V(ft,null),V(Sr,`message`),vs(),Va(),V(pr,!0),Gn=i.id),(a||b(q).length===0)&&await la(!1,!1),n!==Ar||((a||b(J).length===0)&&await Ks(),a&&(await Promise.all([pa(),ha(i.id),ga(i.id),da(i.id)]),ma(i.id)),n!==Ar))return;if(r){let e=await $i(r,n);if(n!==Ar)return;if(!e){Wi(),await Vi(i.id,Gi(),!0);return}}if(r?.canonical_path&&window.location.pathname!==r.canonical_path&&(kr=Fi(r.workspace_route_id,r.target_route_id),await fe(r.canonical_path,{replaceState:!0,noScroll:!0,keepFocus:!0}),n!==Ar))return;if(r?.target_type===`channel`&&b(q).some(e=>e.id===r.target_id)){let e=r.target_id,t=!a&&b(X)===e&&!b(Z)&&b(ur)===e;if(V(X,e),V(Z,``),Xi(i.id,e),Wi(),t){Ra(e),Zi(i.id);return}if(oi(e),await Promise.all([Ta(),wc()]),n!==Ar)return;Zi(i.id);return}if(r?.target_type===`direct`&&b(J).some(e=>e.id===r.target_id)){let e=r.target_id,t=!a&&b(Z)===e&&!b(X)&&b(ur)===e;if(V(Z,e),V(X,``),Wi(),t){Ra(e),Zi(i.id);return}if(oi(e),await Ta(),n!==Ar)return;Zi(i.id);return}if(r?.target_type===`thread`){let e=await na(r,n);if(n!==Ar)return;e&&Zi(i.id);return}let o=Gi();if(Wi(),!o){V(X,``),V(Z,``),oi(``),await Ta(),(e!==i.route_id||t)&&await Vi(i.id,``,!0),Zi(i.id);return}await Vi(i.id,o,!0)}catch(e){n===Ar&&xi(e)}}async function $i(e,t){return e.target_type===`channel`?(b(q).some(t=>t.id===e.target_id)||await la(!1,!1,!1),t===Ar&&b(q).some(t=>t.id===e.target_id)):e.target_type===`direct`?(b(J).some(t=>t.id===e.target_id)||(await Ks(),b(J).some(t=>t.id===e.target_id)||qs((await G(`/api/dms/${e.target_id}`)).conversation)),t===Ar&&b(J).some(t=>t.id===e.target_id)):e.parent_type===`channel`&&e.parent_id?(b(q).some(t=>t.id===e.parent_id)||await la(!1,!1,!1),t===Ar&&b(q).some(t=>t.id===e.parent_id)):e.parent_type===`direct`&&e.parent_id?(b(J).some(t=>t.id===e.parent_id)||(await Ks(),b(J).some(t=>t.id===e.parent_id)||qs((await G(`/api/dms/${e.parent_id}`)).conversation)),t===Ar&&b(J).some(t=>t.id===e.parent_id)):!0}async function ta(e,t){try{return(await G(`/api/routes/${encodeURIComponent(e)}/${encodeURIComponent(t)}`)).route}catch(e){if(e instanceof be&&(e.status===403||e.status===404))return null;throw e}}async function na(e,t){if(e.workspace_id!==b(Y))return!1;let n=e.parent_type===`channel`&&e.parent_id||``,r=e.parent_type===`direct`&&e.parent_id||``;if(n){if(!b(q).some(e=>e.id===n))return!1;V(X,n),V(Z,``),Xi(e.workspace_id,n)}else if(r){if(!b(J).some(e=>e.id===r))return!1;V(Z,r),V(X,``)}else return!1;Xn.prune();let i=Q.root?.id===e.target_id&&b(ur)===$();if(V(ft,null),V(pt,!1),V(Sr,`thread`),V(gr,!1),!await es(e.target_id,void 0,()=>t===Ar))return!1;let a=Q.selection;if(n&&await wc(),!Q.isCurrent(a)||t!==Ar)return!1;if(!i&&n&&Q.root&&(Q.root.thread_state?.reply_count??0)===0){let e=Q.root;return Q.close(),V(Sr,`message`),await Ts(e),!0}return!i&&Q.root&&await Ts(Q.root),!0}function ra(){nn++,V(Qt,null),V($t,``),V(en,``),V(tn,``),V(mr,!1),V(On,!1),V(kn,!1)}function ia(){let e=!b(mr);ra(),V(mr,e)}function aa(){ra(),V(On,!0)}function oa(){ra(),V(kn,!0),ma()}async function sa(){if(b(Qt)===`workspace`||!b(Yt).trim())return;let e=b(Y),t=Ar,n=++nn,r=()=>n===nn&&t===Ar&&e===b(Y);V(Qt,`workspace`),V($t,``);try{let e=await G(`/api/workspaces`,{method:`POST`,body:JSON.stringify({name:b(Yt)})});if(b(ze).some(t=>t.id===e.workspace.id)||V(ze,[...b(ze),e.workspace]),!r())return;V(Yt,``),V(mr,!1),V(gr,!1),await Vi(e.workspace.id)}catch(e){r()&&V($t,xe(e,`Could not create workspace`))}finally{n===nn&&V(Qt,null)}}async function ca(e){V(gr,!1),await Vi(e)}async function la(e=!0,t=!0,n=!0){let r=b(Y);if(!r)return;let i=++Fr,a=await G(`/api/workspaces/${r}/channels`);i===Fr&&r===b(Y)&&(V(q,a.channels.filter(e=>!Ir.has(e.id))),t?V(X,b(q).find(e=>e.id===b(X))?.id||b(q).find(e=>!e.archived_at)?.id||b(q)[0]?.id||``):b(X)&&!b(q).some(e=>e.id===b(X))&&V(X,``),n&&(b(on)&&vs(),Q.close(),V(ft,null),V(Sr,`message`)),e&&await Ta())}async function da(e=b(Y)){let t=++Lr,n=$(),r=b(X),i=!1;if(!e){V(Ve,[]);return}try{let a=await G(`/api/workspaces/${e}/topics`);if(t!==Lr||e!==b(Y)||(V(Ve,a.topics),$()!==n||b(X)!==r))return;let o=new Set(li(a.topics,r).map(e=>e.id));b(it)&&!o.has(b(it))&&V(it,``),b(st)&&!o.has(b(st))&&(si(``),Jn.delete($()),b(Yn).delete($()),i=!0)}catch{return}if(i&&$()===n)try{await Ea()}catch(e){if($()!==n||b(st))return;Mo(),V(Ft,{kind:`error`,text:e instanceof Error?`Topic changed, but messages could not reload: ${e.message}`:`Topic changed, but messages could not reload`})}}function fa(){V(Sr,`message`),b(X)&&da()}async function pa(e=b(Y)){let t=++zr;if(!e||e!==b(Y)||b(E)!==`owner`&&b(E)!==`moderator`){t===zr&&V(kt,[]);return}try{let n=await G(`/api/workspaces/${e}/moderation/members`);if(t!==zr||e!==b(Y))return;V(kt,n.members)}catch{t===zr&&e===b(Y)&&V(kt,[])}}async function ma(e=b(Y)){let t=++Br;Vr?.abort();let n=new AbortController;if(Vr=n,V(Hr,``),!e){V(At,[]);return}try{let r=await Dt({workspaceID:e,limit:100,signal:n.signal});if(t!==Br||e!==b(Y))return;V(At,r.map(e=>e.user))}catch(r){!n.signal.aborted&&t===Br&&e===b(Y)&&(V(At,[]),V(Hr,Et(r)))}}async function ha(e=b(Y)){let t=++Wr;if(!e){V(jt,[]);return}try{let n=await G(`/api/workspaces/${e}/slash-commands`);if(t!==Wr||e!==b(Y))return;V(jt,n.slash_commands)}catch{t===Wr&&e===b(Y)&&V(jt,[])}}async function ga(e=b(Y),t=!1){let n=++Gr;if(!e){V(Pt,[]);return}try{let t=await ws(e);if(n!==Gr||e!==b(Y))return;V(Pt,t)}catch(r){let i=n===Gr&&e===b(Y);if(i&&V(Pt,[]),t&&i)throw r}}function _a(e){Zr+=1,V(Ft,null),Dn&&e!==Dn.fromConversation&&(V(Ft,{kind:`ephemeral`,text:Dn.text}),Dn=null)}async function va(e,t){if(!b(Y))return;let n=await G(`/api/workspaces/${b(Y)}/moderation/members/${e}`,{method:`PATCH`,body:JSON.stringify(t)});V(kt,[...b(kt).filter(t=>t.user.id!==e),n.member]),await la(!1,!1,!1)}async function ya(){if(b(Qt)===`channel`||!b(Y)||!b(Xt).trim())return;let e=b(Y),t=Ar,n=++nn,r=()=>n===nn&&t===Ar&&e===b(Y);V(Qt,`channel`),V(en,``);try{let t=await G(`/api/workspaces/${e}/channels`,{method:`POST`,body:JSON.stringify({name:b(Xt),kind:`public`})});if(e===b(Y)&&!b(q).some(e=>e.id===t.channel.id)&&V(q,[...b(q),t.channel]),!r())return;V(Xt,``),V(On,!1),await Vi(e,t.channel.id)}catch(e){r()&&V(en,xe(e,`Could not create channel`))}finally{n===nn&&V(Qt,null)}}async function ba(e){V(gr,!1),Xi(b(Y),e);let t=Ii(b(Y),e);(e!==b(X)||b(Z)||window.location.pathname!==t)&&await Vi(b(Y),e)}async function xa(e,t){let n=++Jr;if(V(Ge,null),e&&!t)try{let t=await G(`/api/channels/${e}/notification-settings`);if(n!==Jr||e!==b(X)||b(Z))return;bo(e,t.preference),V(Ge,t.preference)}catch{if(n===Jr&&e===b(X)&&!b(Z)){let t=yo(e)||`all`;bo(e,t),V(Ge,t)}}}async function Sa(){let e=b(X);if(!e||b(Z)||b(Xe)||!b(Ge))return;let t=++Jr,n=[`all`,`mentions`,`muted`],r=b(Ge),i=n[(n.indexOf(r)+1)%n.length];V(Ge,i),bo(e,i),V(Xe,!0);try{await G(`/api/channels/${e}/notification-settings`,{method:`PATCH`,body:JSON.stringify({preference:i})})}catch{qe.get(e)===i&&bo(e,r),t===Jr&&e===b(X)&&!b(Z)&&V(Ge,r)}finally{V(Xe,!1)}}function Ca(e=!1){Va(),V(pr,e),Mr+=1,Xn.prune();let t=ci();return()=>ci()===t}async function wa(e,t=`replace`,n=Ca()){let r=$();r!==b(ur)&&V(pr,!0);try{if(!r){n()&&Ma(``,{messages:[],oldest_seq:0,newest_seq:0,has_older:!1,has_newer:!1},t);return}await Xn.run(()=>G(Aa(e)),e=>{let n=e,i=b(Yn).get(r);!n.has_newer&&i&&i.newest_seq>n.newest_seq&&(n=i.oldest_seq>n.newest_seq?i:{...n,messages:Ha(n.messages,i.messages.filter(e=>No(e)>n.newest_seq)),newest_seq:i.newest_seq,has_newer:i.has_newer}),Ma(r,n,t)},n)}catch(e){if(n())throw e}finally{n()&&V(pr,!1)}}async function Ta(e=!0){return e&&Oo(),wa(Oa())}async function Ea(e=Ca()){let t=$();if(t)return V(pr,!0),Jn.set(t,{atBottom:!0}),wa(`limit=100`,`replace`,e)}function Oa(){let e=ka(),t=e.unread_count||0,n=e.last_read_seq||0;return t>0?`around_seq=${encodeURIComponent(String(n+1))}&limit=100`:`limit=100`}function ka(){return b(Z)?b(J).find(e=>e.id===b(Z))||{}:b(X)&&b(q).find(e=>e.id===b(X))||{}}function Aa(e){let t=b(Z)?`/api/dms/${b(Z)}/messages`:`/api/channels/${b(X)}/messages`,n=new URLSearchParams(e);!b(Z)&&b(st)&&n.set(`topic_id`,b(st));let r=n.toString();return r?`${t}?${r}`:t}async function ja(e){if(!b(X)||e===b(st))return;let t=$(),n=b(st),r=b(it),i=b(Yn).get(t),a=Jn.get(t);si(e);let o=lt;e&&V(it,e),Jn.delete(t),b(Yn).delete(t);try{await Ea()}catch(s){if($()!==t||lt!==o)return;si(n),b(it)===e&&V(it,r),b(Yn).delete(t);let c=lt;try{if(await Ea(),$()!==t||lt!==c)return;a&&(Jn.set(t,a),V(dr,a))}catch{if($()!==t||lt!==c)return;i?(Na(t,i),ko(t,i.messages),Ra(t,i)):Mo(),a&&(Jn.set(t,a),V(dr,a))}V(Ft,{kind:`error`,text:s instanceof Error?`Topic could not change: ${s.message}`:`Topic could not change`})}}function Ma(e,t,n){let r=Ho(e).flatMap(e=>e.receipt?[e.receipt]:[]).sort((e,t)=>No(e)-No(t)),i=No(t.messages.at(-1));if(!t.has_newer)for(let e of r)No(e)===i+1&&(t={...t,messages:[...t.messages,e]},i=No(e));r.some(e=>No(e)>i)&&(t={...t,has_newer:!0});let a=Wa(e,t.messages,n),o=a[0]?.channel_seq||0,s=a[a.length-1]?.channel_seq||0,c=o>(t.messages[0]?.channel_seq||o),l=s<(t.messages[t.messages.length-1]?.channel_seq||s),u={messages:a,oldest_seq:o,newest_seq:s,has_older:t.has_older||c,has_newer:t.has_newer||l};Na(e,u),Ra(e,u),(n!==`append`||e!==b(ur))&&V(dr,Jn.get(e)),ko(e,a)}function Na(e,t){e&&(b(Yn).delete(e),b(Yn).set(e,t),Fa(e),Ia(e),V(Yn,new Map(b(Yn))))}function Fa(e){let t=b(Yn).size+1;for(;b(Yn).size>8&&t>0;){t--;let n=b(Yn).keys().next().value;if(!n)return;if(n===e){let e=b(Yn).get(n);b(Yn).delete(n),e&&b(Yn).set(n,e);continue}b(Yn).delete(n)}}function Ia(e){let t=Jn.size+1;for(;Jn.size>16&&t>0;){t--;let n=Jn.keys().next().value;if(!n)return;if(n===e){let e=Jn.get(n);Jn.delete(n),e&&Jn.set(n,e);continue}Jn.delete(n)}}function Ra(e,t=b(Yn).get(e)){e===$()&&(V(ir,t?.has_older||!1),V(ar,t?.has_newer||!1))}function za(e){let t=b(Yn).get(e);e&&t&&(Na(e,{...t,has_newer:!0}),Ra(e))}function Ba(e,t){e===`older`?(V(er,t),V(or,t===`loading`)):(tr=t,V(sr,t===`loading`))}function Va(){Qn=new Set,V(er,`idle`),tr=`idle`,nr=!1,rr=!1,V(or,!1),V(sr,!1)}function Ha(e,t){let n=new Map;for(let r of[...e,...t])n.set(r.id,r);return[...n.values()].sort((e,t)=>(e.channel_seq||0)-(t.channel_seq||0))}function Ua(e){let t=new Set,n=lo(e);if(n>=0){let r=uo(e,b(Ze),n);r&&t.add(r.id)}let r=Jn.get(e)?.anchorMessageID;r&&t.add(r);let i=Le.session(e);i&&t.add(i.messageID),Q.root&&Po(Q.root,e)&&t.add(Q.root.id),b(vr)&&Po(b(vr),e)&&t.add(b(vr).id);for(let n of b(Ze))(n.status===`pending`||n.status===`failed`)&&Po(n,e)&&t.add(n.id);return t}function Wa(e,t,n){return We(t,n,Ua(e))}function Ka(){if(b(er)!==`idle`){nr=!0;return}Ja()}function qa(e=!1){if(tr!==`idle`){e&&(rr=!0);return}Ya()}async function Ja(){let e=$(),t=ci(),n=b(Yn).get(e),r=`${t}:older`;if(b(er)!==`idle`){nr=!0;return}if(!e||!n?.has_older||n.oldest_seq<=0||Qn.has(r))return;Qn.add(r),nr=!1,Ba(`older`,`loading`),Oo();let i=!1;try{await Xn.run(()=>G(Aa(`before_seq=${encodeURIComponent(String(n.oldest_seq))}&limit=50`)),t=>{let n=b(Yn).get(e);n&&(Ma(e,{...n,messages:Ha(t.messages,n.messages),has_older:t.has_older},`prepend`),i=!0,Ba(`older`,`settling`))},()=>ci()===t)}catch(e){ci()===t&&V(Ft,{kind:`error`,text:xe(e,`Could not load older messages`)})}finally{Qn.delete(r),ci()===t&&!i&&Ba(`older`,`idle`)}}async function Ya(){let e=$(),t=ci(),n=b(Yn).get(e),r=`${t}:newer`;if(tr!==`idle`){rr=!0;return}if(!e||Qn.has(r))return;if(!n||n.newest_seq<=0){await Ta();return}Qn.add(r),rr=!1,Ba(`newer`,`loading`);let i=!1;try{await Xn.run(()=>G(Aa(`after_seq=${encodeURIComponent(String(n.newest_seq))}&limit=50`)),t=>{i=Za(e,t,n.newest_seq),i&&Ba(`newer`,`settling`)},()=>ci()===t)}catch(e){ci()===t&&V(Ft,{kind:`error`,text:xe(e,`Could not load newer messages`)})}finally{Qn.delete(r),ci()===t&&!i&&Ba(`newer`,`idle`)}}async function Xa(e){let t=$(),n=ci();if(!b(Y)||!t)return;let r=b(Yn).get(t);if(!r||r.newest_seq<=0){await Ta();return}await Xn.run(()=>G(Aa(`after_seq=${encodeURIComponent(String(r.newest_seq))}&limit=50`)),e=>{Za(t,e,r.newest_seq)},()=>e()&&ci()===n)}function Za(e,t,n){let r=b(Yn).get(e);if(!r)return!1;let i=t.newest_seq||n,a=i>r.newest_seq?t.has_newer:in&&(n=r.channel_seq));return n}function eo(e,t=b(Ze)){let n=0;for(let r of t)r.direct_conversation_id===e&&typeof r.channel_seq==`number`&&r.channel_seq>n&&(n=r.channel_seq);return n}function to(e,t){return e&&t.unread_count||0}async function no(e,t){let n=b(q).find(t=>t.id===e);if(n&&!(t<=0||t<=(n.last_read_seq||0))){V(q,b(q).map(n=>n.id===e?(()=>{let e=Math.max(n.last_seq||0,t);return{...n,last_seq:e,unread_count:t>=e?0:n.unread_count||0,last_read_seq:t}})():n));try{await G(`/api/channels/${e}/read`,{method:`POST`,body:JSON.stringify({seq:t})})}catch{}}}async function ro(e,t){let n=b(J).find(t=>t.id===e);if(n&&!(t<=0||t<=(n.last_read_seq||0))){V(J,b(J).map(n=>n.id===e?(()=>{let e=Math.max(n.last_seq||0,t);return{...n,last_seq:e,unread_count:t>=e?0:n.unread_count||0,last_read_seq:t}})():n));try{await G(`/api/dms/${e}/read`,{method:`POST`,body:JSON.stringify({seq:t})})}catch{}}}function io(e){let t=b(Yn).get(e)?.newest_seq||0,n=b(q).find(t=>t.id===e);if(n)return Math.max(n.last_seq||0,(n.last_read_seq||0)+(n.unread_count||0),$a(e),t);let r=b(J).find(t=>t.id===e);return r?Math.max(r.last_seq||0,(r.last_read_seq||0)+(r.unread_count||0),eo(e),t):0}function ao(e){let t=b(Yn).get(e);return!t||t.has_newer?0:b(q).find(t=>t.id===e)?$a(e):b(J).find(t=>t.id===e)?eo(e):0}function oo(e={}){if(!e.all&&Date.now()e.id===t))return;if(!e.all&&!e.seq){let e=lo(t);if(e>=0&&!To(t,e))return}let n=e.all?Math.max(e.seq||0,io(t)):e.seq||ao(t);if(!(n<=0)){if(b(J).some(e=>e.id===t)){ro(t,n),e.all&&so(t,n);return}b(q).some(e=>e.id===t)&&(no(t,n),e.all&&so(t,n))}}function so(e,t){cr.delete(e),cr=new Map(cr),V(q,b(q).map(n=>n.id===e?{...n,last_seq:Math.max(n.last_seq||0,t),last_read_seq:Math.max(n.last_read_seq||0,t),unread_count:0}:n)),V(J,b(J).map(n=>n.id===e?{...n,last_seq:Math.max(n.last_seq||0,t),last_read_seq:Math.max(n.last_read_seq||0,t),unread_count:0}:n))}function co(e){let t=b(q).find(t=>t.id===e);return t?t.last_read_seq||0:b(J).find(t=>t.id===e)?.last_read_seq||0}function lo(e){let t=b(q).find(t=>t.id===e);if(t)return to(e,t)>0?t.last_read_seq||0:-1;let n=b(J).find(t=>t.id===e);return n&&to(e,n)>0?n.last_read_seq||0:-1}function uo(e,t,n){for(let r of t){if(!Po(r,e)||r.parent_message_id||r.author?.id===b(K)?.id||r.author_id===b(K)?.id)continue;let t=r.channel_seq;if(typeof t==`number`&&t>n)return r}return null}function fo(e,t){if(!e)return;let n=wo(e);if(to(e,n)<=0){cr.delete(e),cr=new Map(cr);return}let r=n.last_read_seq||0,i=cr.get(e);if(i?.boundarySeq===r&&i.since||!To(e,r))return;let a=uo(e,t,r);a&&(cr=new Map(cr).set(e,{boundarySeq:r,since:Do(a.created_at)}))}function po(e,t,n){if(!e||!n)return;let r=cr.get(e);r?.boundarySeq===t&&r.since||(cr=new Map(cr).set(e,{boundarySeq:t,since:Do(n)}))}function mo(e){let t=e.payload,n=t.channel_seq??e.seq??t.seq;return typeof n==`number`?n:Number(n)||0}function ho(e){let t=e.payload;return{channelID:e.channel_id||(typeof t.channel_id==`string`?t.channel_id:``),dmID:typeof t.direct_conversation_id==`string`?t.direct_conversation_id:``}}async function go(e){try{let t=await G(`/api/channels/${e}/notification-settings`);return bo(e,t.preference),e===b(X)&&!b(Z)&&!b(Xe)&&V(Ge,t.preference),t.preference}catch{return yo(e)||`all`}}function _o(e){return b(K)?.id&&e?`clickclack:channel-notification:v1:${b(K).id}:${e}`:``}function vo(e){let t=_o(e);if(!t)return null;try{let e=window.localStorage.getItem(t);return e===`all`||e===`mentions`||e===`muted`?e:null}catch{return null}}function yo(e){return qe.get(e)||vo(e)}function bo(e,t){qe=new Map(qe).set(e,t);let n=_o(e);if(n)try{window.localStorage.setItem(n,t)}catch{}}async function xo(e,t){if(e.type!==`message.created`&&e.type!==`thread.reply_created`)return;let{channelID:n,dmID:r}=ho(e),i=mo(e);if(e.type===`message.created`&&i>0){let e=n||r;if(i<=(Ye.get(e)||0))return;Ye.set(e,i)}let a=e.payload,o=typeof a.kind==`string`?a.kind:``;if(o===`agent_commentary`||o===`agent_tool`||!b(An)||document.visibilityState===`visible`&&t)return;if(n){let t=await go(n);if(!t||!b(An))return;let r=n===b(X)&&!b(Z);if(document.visibilityState===`visible`&&r||t===`muted`||t===`mentions`&&!e.mentioned_user_ids?.includes(b(K)?.id||``))return}let s=typeof a.message_id==`string`?a.message_id:`${e.channel_id||``}:${e.seq||Date.now()}`,c=typeof a.author_id==`string`?a.author_id:``,l=typeof a.body==`string`?a.body:`New message`;if(e.type===`thread.reply_created`&&typeof a.message_id==`string`)try{let e=await G(`/api/messages/${a.message_id}`);c=e.message.author_id,l=e.message.body}catch{}if(c&&c===b(K)?.id||!b(An)||document.visibilityState===`visible`&&(n&&n===b(X)||r&&r===b(Z)))return;let u=b(q).find(e=>e.id===n),d=uc(c)?.display_name||`ClickClack`,f=u?`#${bt(u)}`:`Direct message`;if(Rt){Rt.notify({body:So(l),route:Ri(n||r),tag:`clickclack:${s}`,title:`${d} in ${f}`});return}if(typeof Notification<`u`&&Notification.permission===`granted`)try{let e=new Notification(`${d} in ${f}`,{body:So(l),tag:`clickclack:${s}`,icon:`/favicon.svg`});e.onclick=()=>{window.focus(),e.close(),n?ba(n):r&&Js(r)}}catch{}}function So(e){let t=e.replace(/!\[[^\]]*]\([^)]+\)/g,`[image]`).replace(/\[[^\]]+]\(([^)]+)\)/g,`$1`).replace(/[`*_>#|]/g,``).replace(/\s+/g,` `).trim();return t?t.length>180?`${t.slice(0,177)}...`:t:`New message`}async function Co(e){let t=e.payload,n=typeof t.direct_conversation_id==`string`?t.direct_conversation_id:``;return!n||b(J).some(e=>e.id===n)?!1:(await Ks(),b(J).some(e=>e.id===n))}function wo(e){return b(q).find(t=>t.id===e)||b(J).find(t=>t.id===e)||{}}function To(e,t,n=b(Yn)){if(!e||t<0)return!1;let r=n.get(e);if(!r||r.messages.length===0)return!1;let i=t+1;return r.oldest_seq<=i&&r.newest_seq>=i}function Eo(e,t,n=b(Yn)){let r=cr.get(e);if(r?.boundarySeq===t)return r.since;if(!To(e,t,n))return``;let i=uo(e,b(Ze),t);return i?Do(i.created_at):``}function Do(e){let t=new Date(e);return Number.isNaN(t.getTime())?``:new Intl.DateTimeFormat(void 0,{hour:`numeric`,minute:`2-digit`}).format(t)}function Oo(){if(!b(ur)||!b(qn))return;let e=b(qn).captureState();e&&Jn.set(b(ur),e)}function ko(e,t){let n=e!==b(ur);for(let[t,n]of dt)!n.message.status&&(n.draft.viewKey!==e||b(st)&&n.draft.topicID!==b(st))&&dt.delete(t);let r=Ho(e).map(e=>e.message),i=new Map(r.map(e=>[e.id,e])),a=new Map(r.filter(e=>e.nonce).map(e=>[e.nonce,e]));Ie.seedMessages(t);let o=t.map(e=>{let t=i.get(e.id)||(e.nonce?a.get(e.nonce):void 0);return t?(!t.status&&(t.attachments||[]).every(t=>e.attachments?.some(e=>e.id===t.id))&&dt.delete(t.nonce),{...e,nonce:t.nonce,status:t.status,attachments:t.attachments?.length?t.attachments:e.attachments}):e}),s=new Set(o.map(e=>e.id)),c=new Set(o.map(e=>e.nonce).filter(Boolean)),l=r.filter(e=>!s.has(e.id)&&!(e.nonce&&c.has(e.nonce)));V(Ze,[...o,...l].sort((e,t)=>(e.channel_seq||1/0)-(t.channel_seq||1/0))),Le.reconcile(e,b(Ze)),V(ur,e),fo(e,b(Ze)),n&&(V(Cr,[]),V(Tr,[]),$n())}function Ao(e){Mo(Xn.updateMessage(e))}function jo(e){Mo(Xn.updateAuthor(e))}function Mo(e){let t=$(),n=t?b(Yn).get(t):void 0;if(e)for(let t of dt.values()){let n=t.message;t.message={...e(n),status:n.status,attachments:n.attachments},t.receipt&&=e(t.receipt)}let r=e?n?.messages.map(e)||[]:n?.messages||[];n?Ma(t,{...n,messages:r},`append`):ko(t,r)}function No(e){return e?.channel_seq||0}function Po(e,t){return t?e.channel_id===t||e.direct_conversation_id===t:!1}async function Fo(e=()=>!0){await t(),e()&&await b(qn)?.scrollToBottom()}function Io(){return b(qn)?.isFollowing()||b(qn)?.isNearBottom(96)!==!1}async function Lo(e=!1){let t=b(pr)||b(ar)||b(he)>0,n=Ca();try{if(t&&await Ea(n),await Fo(n),!n())return;b(ar)||oo({all:!0}),await Fo(n)}catch(t){n()&&(V(Ft,{kind:`error`,text:xe(t,`Could not jump to latest messages`)}),e&&await Fo(n))}}function Ro(e,t,n=`tmp_${e}`){let r=new Date().toISOString();return{id:n,workspace_id:t.workspaceID,channel_id:t.channelID,direct_conversation_id:t.directConversationID,topic_id:t.topicID,author_id:b(K)?.id||``,thread_root_id:n,body:t.body,body_format:`markdown`,created_at:r,author:b(K)||void 0,attachments:t.upload?[t.upload]:[],quoted_message_id:t.quotedMessageID,nonce:e,status:`pending`}}async function zo(){let e=b(Jt).trim();if(!e)return;if(b(B)&&!b(U)){V(Ft,{kind:`error`,text:`This conversation has no active recipient`});return}if(!b(X)&&!b(Z)){V(Ft,{kind:`ephemeral`,text:`Pick or create a channel to send a message.`});return}$n(),V(Ft,null);let t=++Zr,n=$(),r=b(Z)?`dm`:`channel`,i=b(vr)&&b(yr)===r?b(vr):null;if(b(X)&&!b(Z)&&!b(un)&&!i){let r=Es(e),i=r?Ds(b(jt),r.command):void 0;if(r&&i){V(Jt,``),Ws(),await Bo(b(X),r.command,r.text,e,n,t);return}}let a={body:e,quotedMessageID:i?.id,upload:b(un)||void 0,workspaceID:b(Y),channelID:b(X)||void 0,directConversationID:b(Z)||void 0,topicID:b(X)&&b(it)||void 0,topicFilterID:b(st),topicFilterGeneration:lt,viewKey:$()};V(Jt,``),i&&us(),Ws(),await Wo(a)}async function Bo(e,t,n,r,i,a){try{let r=await Os(e,t,n);if(a!==Zr||$()!==i)return;r.text&&r.response_type!==`in_channel`&&V(Ft,{kind:`ephemeral`,text:r.text})}catch(e){if(console.warn(`slash dispatch failed`,e),a!==Zr||$()!==i)return;V(Ft,{kind:`error`,text:e instanceof be&&e.message?Vo(e):`${t} failed`}),b(Jt).trim()||V(Jt,r)}}function Vo(e){try{let t=JSON.parse(e.message);if(t&&typeof t.error==`string`&&t.error)return t.error}catch{}return e.message}function Ho(e){return[...dt.values()].filter(({draft:t})=>t.viewKey===e&&(!b(st)||t.topicID===b(st)))}async function Uo(e,t,n,r){let{draft:i}=e;if(e.message=t,$()!==i.viewKey)return;let a=!1,o=b(st)===i.topicFilterID&<===i.topicFilterGeneration;if(r()&&o&&b(st)&&i.topicID!==b(st)){si(``),Jn.delete(i.viewKey),b(Yn).delete(i.viewKey),r=Ca();try{await Ea(r)}catch{a=!0}}if($()===i.viewKey){if(b(st)&&i.topicID!==b(st)){b(Jt).trim()||V(Jt,i.body),V(Ft,{kind:`error`,text:`${n} Clear the active topic filter to recover the draft.`});return}Mo(),V(Ft,{kind:`error`,text:a?`${n} The unfiltered timeline could not reload.`:n}),await Fo(r)}}async function Wo(e,t,n){let r=Mr,i=()=>Mr===r&&$()===e.viewKey,a=t??Qe(),o=`tmp_${a}`,s=n??o,c=!b(st)||e.topicID===b(st),l=!t&&$()===e.viewKey&&c,u=Ro(a,e,s),d={draft:e,message:u,receipt:dt.get(a)?.receipt};dt.set(a,d),$()===e.viewKey&&c&&(Mo(),t||Fo());let f=e.directConversationID?`/api/dms/${e.directConversationID}/messages`:`/api/channels/${e.channelID}/messages`,p={body:e.body,nonce:a};e.quotedMessageID&&(p.quoted_message_id=e.quotedMessageID),e.topicID&&(p.topic_id=e.topicID),e.upload&&(p.upload_id=e.upload.id);try{let t=d.receipt||(await G(f,{method:`POST`,body:JSON.stringify(p)})).message;if(d.receipt=t,e.upload&&!t.attachments?.some(t=>t.id===e.upload?.id))try{await G(`/api/messages/${t.id}/attachments`,{method:`POST`,body:JSON.stringify({upload_id:e.upload.id})}),t={...t,attachments:[...t.attachments||[],e.upload]}}catch(n){console.warn(`attachment fallback failed`,n),await Uo(d,{...t,nonce:a,status:`failed`,attachments:[...t.attachments||[],e.upload]},`The message was sent, but its attachment failed. Retry or discard it below.`,i);return}d.receipt=t,d.message={...t,nonce:a},$()===e.viewKey?Mo():dt.delete(a)}catch(t){console.warn(`send failed`,t),await Uo(d,{...u,status:`failed`},e.upload?`The attachment failed, so the message was not sent. Retry or discard it below.`:`The message failed to send. Retry or discard it below.`,i);return}i()&&l&&await Lo(!0)}function Go(e){if(!e.nonce)return;let t=dt.get(e.nonce)?.draft;t&&Wo(t,e.nonce,e.id)}function Ko(e){if(!e.nonce)return;let t=dt.get(e.nonce);t?.receipt?t.message={...t.receipt,nonce:e.nonce}:dt.delete(e.nonce),Mo()}async function Jo(e,n){let r=Q.selection,i=()=>e===b(fr)&&Le.session(e)?.generation===n.generation&&(n.surface!==`thread`||Q.selection===r);if(i()){if(Ar++,n.surface===`thread`){if(n.threadRootID&&r?.messageID!==n.threadRootID&&(V(pt,!1),Q.select(n.threadRootID),r=Q.selection,!await es(n.threadRootID,void 0,i))||!await Q.target({messageID:n.messageID,threadSeq:n.threadSeq},i)||!i())return;Q.root?.route_id&&await Vi(b(Y),Q.root.id)}else b(qn)?.scrollToMessage(n.messageID),await Vi(b(Y),Q.root?.id||$());for(let e=0;e<16;e+=1){if(await t(),await new Promise(e=>requestAnimationFrame(()=>e())),!i())return;let e=document.querySelector(n.surface===`timeline`?`main.timeline`:`[aria-label="Thread pane"]`)?.querySelector(`[data-message-id="${CSS.escape(n.messageID)}"]`)?.querySelector(`textarea[aria-label="Edit message"]`);if(e){e.focus({preventScroll:!0});return}}}}function Xo(e){Ao(e),Q.updateMessage(e),V(mt,b(mt).map(t=>t.id===e.id?$e(t,e):t))}function Zo(e){!e.id||e.deleted_at||b(ti).has(e.id)||(V(ri,e),V(ii,``))}async function Qo(){let e=b(ri);if(e&&!b(ti).has(e.id)){V(ti,new Set([...b(ti),e.id])),V(ii,``);try{let t=(await G(`/api/messages/${e.id}`,{method:`DELETE`})).message;Le.cancelMessage($(),t.id),Ao(t),Q.updateMessage(t),V(mt,b(mt).filter(e=>e.id!==t.id)),b(vr)?.id===t.id&&us(),V(ri,null)}catch(e){V(ii,e instanceof Error?e.message:`Could not delete message`)}finally{let t=new Set(b(ti));t.delete(e.id),V(ti,t)}}}async function $o(e){Ar++,vs(),V(pt,!1),await es(e.id,e)&&b(Y)&&Q.root?.route_id&&await Vi(b(Y),Q.root.id)}async function es(e,t,n=()=>!0){V(Ht,null),V(Ut,``),V(ft,null),V(Sr,`thread`),Q.select(e,t);try{return await Q.open(n)}catch{return!1}}function ts(e=[]){let t=Q.root;t&&(Ie.seedMessages(e),Le.reconcile($(),[t,...Q.replies]),Ao({id:t.id,thread_state:t.thread_state}))}async function ns(e){await Xn.run(()=>G(`/api/messages/${e}/thread?latest=true&limit=1`),e=>{let t={...e.root,thread_state:e.thread_state};Ie.seedMessages([t]),Ao(t)})}async function rs(e,t){(b(Ze).some(t=>t.id===e)||Xn.pending)&&await Xn.run(()=>G(`/api/messages/${e}`),e=>Ao(e.message),t)}function is(e,t){let n=b(Ze).find(t=>t.id===e);if(!n)return!1;let r=new Date(t.created_at).getTime();if(Number.isFinite(r)&&ra}async function as(){(!b(B)||b(U))&&await Q.send()}function os(e,t){t===`thread`?Q.setQuote(e):(V(vr,e),V(yr,t)),V(Sr,t===`thread`?`thread`:`message`)}function ss(){return b(ri)!==null||b(Vt)!==null||b(hn)||b(_n)||b(bn)!==null||b(On)||b(kn)}function ls(){return b(Sr)===`thread`&&Q.root&&b(xr)?b(xr):b(br)}function us(){V(vr,null),V(yr,null)}async function ds(e){let t=e.quoted_message_id;if(!t)return;if(e.parent_message_id&&e.thread_root_id===Q.selection?.messageID){await Q.target({messageID:t});return}let n=Ca();if(b(qn)?.scrollToMessage(t)??!1){await ms(t,n);return}let r=await G(`/api/messages/${t}`);n()&&Po(r.message,$())&&await Ts(r.message)}async function fs(){Ca(),lr=Date.now()+1200,!(b(Se)&&b(qn)?.scrollToDivider(!1))&&await ps()}async function ps(){let e=$();if(!e)return;lr=Date.now()+1200;let t=co(e),n=cr.get(e),r=(n?.boundarySeq===t?n.boundarySeq:t)+1;r<=0||await ks(r)}async function ms(e,n){for(let r=0;r<16;r+=1){if(await t(),await new Promise(e=>requestAnimationFrame(()=>e())),!n())return;let r=document.querySelector(`[data-message-id="${CSS.escape(e)}"]`);if(r){r.classList.add(`highlight`),window.setTimeout(()=>r.classList.remove(`highlight`),1500);return}}}async function hs(){if(!b(Y)||!b(rn).trim()){vs();return}let e=b(rn).trim();b(Ht)&&vc(),(Q.root||b(ft))&&Sc();let t=++cn,n=b(Z)&&b(B)?{workspaceID:b(Y),channelID:``,directConversationID:b(Z),label:`@${ot(b(B),b(K)?.id)}`}:b(X)&&b(M)?{workspaceID:b(Y),channelID:b(X),directConversationID:``,label:`#${bt(b(M))}`}:{workspaceID:b(Y),channelID:``,directConversationID:``,label:``};V(on,!1),sn=0;let r={query:e,scope:n,results:[],nextCursor:null,state:`loading`,error:``,loadingMore:!1,moreError:``,activeResultID:``};V(an,r);try{let e=await G(`/api/search?${gs(r).toString()}`);if(t!==cn)return;V(an,{...r,results:e.results.filter(e=>!Ir.has(e.channel_id||``)),nextCursor:e.next_cursor,state:`ready`})}catch(e){if(t!==cn)return;V(an,{...r,state:`error`,error:e instanceof be?e.message:`Search is unavailable right now.`})}}function gs(e,t=``){let n=new URLSearchParams({workspace_id:e.scope.workspaceID,q:e.query});return e.scope.directConversationID?n.set(`direct_conversation_id`,e.scope.directConversationID):e.scope.channelID&&n.set(`channel_id`,e.scope.channelID),t&&n.set(`cursor`,t),n}async function _s(){let e=b(an);if(!e||e.state!==`ready`||!e.nextCursor||e.loadingMore)return;let t=cn;V(an,{...e,loadingMore:!0,moreError:``});try{let n=await G(`/api/search?${gs(e,e.nextCursor).toString()}`);if(t!==cn||!b(an))return;let r=new Set(b(an).results.map(e=>e.id));V(an,{...b(an),results:[...b(an).results,...n.results.filter(e=>!r.has(e.id)&&!Ir.has(e.channel_id||``))],nextCursor:n.next_cursor,loadingMore:!1})}catch(e){if(t!==cn||!b(an))return;V(an,{...b(an),loadingMore:!1,moreError:e instanceof be?e.message:`Couldn’t load more results.`})}}function vs(){cn+=1,V(rn,``),V(an,null),V(on,!1),sn=0}function ys(e){if(e.channel_name)return`#${e.channel_name}`;if(e.direct_conversation_id){let t=b(J).find(t=>t.id===e.direct_conversation_id);return t?`@${ot(t,b(K)?.id)}`:`Direct message`}return``}async function bs(e){let n=b(an),r=e.channel_id||e.direct_conversation_id||``;if(n&&b(Y)&&r&&(Ar++,V(an,{...n,activeResultID:e.id}),$()!==r&&(await Vi(b(Y),r),await Qi(zi(b(Y)),Bi(r))),$()===r)){if(e.parent_message_id){sn=document.querySelector(`.search-results-scroll`)?.scrollTop??0;let n=cn;if(V(on,!0),!await es(e.thread_root_id,void 0,()=>n===cn&&b(on)&&b(an)?.activeResultID===e.id))return;let r=()=>n===cn&&b(on)&&b(an)?.activeResultID===e.id;if(!await Q.target({messageID:e.id,threadSeq:e.thread_seq},r)||!r())return;Q.root?.route_id&&await Vi(b(Y),Q.root.id),await t(),r()&&document.querySelector(`.thread .thread-back`)?.focus({preventScroll:!0});return}if(await Vi(b(Y),r),e.channel_seq&&e.channel_seq>0){await ks(e.channel_seq,e.id);return}await Ta()}}async function Ss(){if(Ar++,!b(an)||!b(on))return;let e=$();Q.close(),V(ft,null),V(Sr,`message`),V(on,!1),b(Y)&&e&&await Vi(b(Y),e),await t();let n=document.querySelector(`.search-results-scroll`);n&&(n.scrollTop=sn),(b(an).activeResultID?document.querySelector(`.search-result[data-result-id="${CSS.escape(b(an).activeResultID)}"]`):null)?.focus({preventScroll:!0})}async function Ts(e){let t=e.channel_seq||0;if(t<=0){await Ta();return}await ks(t,e.id)}async function ks(e,n=``){let r=$();if(!r)return;let i=!!b(st);i&&(si(``),b(Yn).delete(r));let a=Ca(i);n&&Jn.set(r,{atBottom:!1,anchorMessageID:n,anchorPixelOffset:0}),await wa(`around_seq=${encodeURIComponent(String(e))}&limit=100`,`around`,a),await t(),a()&&(n?(b(qn)?.scrollToMessage(n),await ms(n,a)):b(qn)?.scrollToDivider(!1))}function Ws(){mn?.abort(),mn=null,V(dn,``),V(un,null)}async function Gs(e){let t=e.currentTarget,n=t.files?.[0],r=b(Y);if(!n||!r)return;t.value=``,mn?.abort();let i=new AbortController;mn=i,V(dn,r),V(Ft,null);let a=()=>mn===i&&!i.signal.aborted&&b(Y)===r;try{let e=await pn(n,i.signal);if(!a())return;let t=new FormData;t.set(`workspace_id`,r),t.set(`file`,n),e.width>0&&t.set(`width`,String(e.width)),e.height>0&&t.set(`height`,String(e.height)),e.durationMS>0&&t.set(`duration_ms`,String(e.durationMS));let o=await G(`/api/uploads`,{method:`POST`,body:t,signal:i.signal});a()&&V(un,o.upload)}catch(e){a()&&V(Ft,{kind:`error`,text:xe(e,`Could not upload file`)})}finally{mn===i&&(mn=null)}}async function Ks(e=b(Y)){let t=++Rr;if(!e){V(J,[]);return}let n=await G(`/api/dms?workspace_id=${e}`);t===Rr&&e===b(Y)&&(V(J,n.conversations),b(Z)&&!b(J).some(e=>e.id===b(Z))&&V(Z,``))}function qs(e){V(J,b(J).some(t=>t.id===e.id)?b(J).map(t=>t.id===e.id?e:t):[...b(J),e])}async function Js(e){V(gr,!1);let t=Ii(b(Y),e);(e!==b(Z)||b(X)||window.location.pathname!==t)&&await Vi(b(Y),e)}async function Ys(e){let t=e.trim();if(b(Qt)===`direct`||!b(Y)||!t)return;let n=b(Y),r=Ar,i=++nn,a=()=>i===nn&&r===Ar&&n===b(Y);V(Qt,`direct`),V(tn,``);try{let e=await G(`/api/dms`,{method:`POST`,body:JSON.stringify({workspace_id:n,member_ids:[t]})});if(n===b(Y)&&!b(J).some(t=>t.id===e.conversation.id)&&qs(e.conversation),!a())return;V(Zt,``),V(kn,!1),Wi(),await Vi(n,e.conversation.id)}catch(e){a()&&V(tn,xe(e,`Could not start direct message`))}finally{i===nn&&V(Qt,null)}}function Xs(){ei&&clearTimeout(ei),ei=void 0,V(Qr,null)}function Zs(e,t){Xs(),V(Qr,{conversation:e,restoreRoute:t,title:ot(e,b(K)?.id)}),ei=setTimeout(()=>{V(Qr,null),ei=void 0},8e3)}async function Qs(){let e=b(Qr);if(e){Xs();try{let t=await G(`/api/dms/${e.conversation.id}/open`,{method:`POST`});qs(t.conversation),e.restoreRoute&&await Vi(e.conversation.workspace_id,t.conversation.id)}catch(e){V(Ft,{kind:`error`,text:xe(e,`Could not restore direct message`)})}}}async function $s(e){if(!e)return;let t=b(J).find(t=>t.id===e),n=b(Z)===e;if(await G(`/api/dms/${e}`,{method:`DELETE`}),V(J,b(J).filter(t=>t.id!==e)),t&&Zs(t,n),n){Wi();let e=b(q)[0]?.id||``;V(Z,``),V(X,e),e&&Xi(b(Y),e),await Vi(b(Y),e),await Ta()}}function ec(){if(Xr+=1,Kn?.close(),Kn=null,V(Vn,!1),!b(Y))return;let e=b(Y);Kn=Ue({workspaceID:e,onEvent:nc,onOpen:async(t,n)=>{let r=Un===e;await tc(e,t,r,n),t()&&((!r||n)&&(Ye=new Map([...b(q),...b(J)].map(e=>[e.id,e.last_seq||0]))),Un=e,V(Hn,``))},onError:t=>{if(e===b(Y)){if(t instanceof Je){if(Pe()&&Pe()!==e&&Pe()!==zi(e))return;Kn?.close(),fe(`/app`,{invalidateAll:!0,replaceState:!0}).catch(xi);return}if(t instanceof be&&t.status===401){xi(t);return}V(Hn,xe(t,`Could not process realtime event`))}},onStatusChange:e=>{V(Vn,e)}})}async function tc(e,t=()=>!0,n=!0,r=!0){let i=++Xr;if(!e||e!==b(Y)||!t())return;let a=Q.root?.id||``,o=b(ft)?.kind===`bot`?b(ft).id:``;if(V(Cr,[]),V(Tr,[]),!r){await Promise.all([ha(e),ga(e,!0)]);return}if(Ie.clear(),await Promise.all([Pi(),la(!1,!1,!1),Ks(e),pa(e),ha(e),ga(e,!0),da(e)]),i===Xr&&e===b(Y)&&t()){if(b(X)&&!b(q).some(e=>e.id===b(X))&&V(X,``),b(Z)&&!b(J).some(e=>e.id===b(Z))&&V(Z,``),!b(X)&&!b(Z)){let t=Gi(e);if(t){let n=b(J).some(e=>e.id===t);V(Z,n?t:``),V(X,n?``:t),n||Xi(e,t),await Vi(e,t,!0)}}if(i===Xr&&e===b(Y)&&t()&&(await Ta(n),i===Xr&&e===b(Y)&&t()&&(await wc(),i===Xr&&e===b(Y)&&t()&&(a&&Q.root?.id===a&&await Q.refresh(t),o&&b(ft)?.id===o)))){let e=uc(o);V(ft,e&&!e.deleted_at?e:null)}}}async function nc(e,t){if((e.type===`pin.added`||e.type===`pin.removed`)&&e.channel_id===b(X)&&!b(Z)){await wc();return}if(e.type===`typing.started`||e.type===`typing.stopped`){sc(e);return}if(e.type===`agent.progress`){cc(e);return}if(e.type===`channel.read`||e.type===`dm.read`){ac(e);return}if(e.type===`bot_command.updated`){e.workspace_id===b(Y)&&ga(e.workspace_id,!0).catch(t=>{e.workspace_id===b(Y)&&(V(Hn,xe(t,`Could not refresh bot commands`)),ec())});return}if(e.type===`bot.deleted`){e.workspace_id===b(Y)&&await rc(e);return}if(e.type===`bot.membership_removed`){e.workspace_id===b(Y)&&await ic(e);return}if(e.type===`channel.deleted`&&e.workspace_id===b(Y)){await Ai(e);return}if((e.type===`channel.created`||e.type===`channel.updated`)&&e.workspace_id===b(Y)){await la(!1,!1,!1);return}if(e.type===`member.moderation_updated`&&e.workspace_id===b(Y)){let t=b(Z),n=e.payload.user_id===b(K)?.id;if(await Pi(),await pa(),await la(!1,n,n),n){if(await Ks(),t&&(b(J).some(e=>e.id===t)?(V(Z,t),V(X,``)):V(Z,``)),!b(X)&&!b(Z)){Ma(``,{messages:[],oldest_seq:0,newest_seq:0,has_older:!1,has_newer:!1},`replace`);return}await Ta()}return}e.workspace_id===b(Y)&&e.payload.topic_id&&!b(Ve).some(t=>t.id===e.payload.topic_id)&&await da(e.workspace_id),(e.type===`message.updated`||e.type===`message.deleted`)&&b(wt).has(e.payload.message_id||``)&&await wc();let n=(e.channel_id===b(X)||e.payload.direct_conversation_id===b(Z))&&!(e.type===`message.created`&&b(st)&&e.payload.topic_id!==b(st));if(n&&(e.type===`reaction.added`||e.type===`reaction.removed`)){Ie.applyEvent(e);return}if(xo(e,n),e.type===`message.created`&&!n&&(await Co(e)||oc(e)),n&&(e.type===`message.created`||e.type===`message.updated`||e.type===`message.deleted`)){let n=e.payload.nonce;if(e.type===`message.created`&&n&&dt.has(n))return;let r=Io(),i=mo(e),a=e.type===`message.created`&&(i<=0||i>(b(Yn).get($())?.newest_seq||0));if(a&&!r?(lr=Date.now()+1200,za($())):a?await Xa(t):e.type!==`message.created`&&await rs(e.payload.message_id||``,t),!t())return;e.type===`message.created`&&oc(e,r,a)}if(await Q.handleEvent(e,t))return;let r=e.payload.root_message_id||e.payload.message_id;r&&e.type===`thread.state_updated`&&is(r,e)&&await ns(r)}async function rc(e){let t=e.payload.bot_user_id||``;if(!t)return;let n=e.payload.deleted_at||e.created_at,r=e.payload.former_handle||``,i=e=>e.id===t?{...e,handle:``,former_handle:r,deleted_at:n}:e;V(J,b(J).map(e=>({...e,members:e.members.map(i)}))),V(kt,b(kt).filter(e=>e.user.id!==t)),V(jt,b(jt).filter(e=>e.bot_user_id!==t)),V(Pt,b(Pt).filter(e=>e.bot.id!==t)),V(Cr,b(Cr).filter(e=>e.userID!==t)),b(an)&&V(an,{...b(an),results:b(an).results.map(e=>({...e,author:i(e.author)}))}),b(ft)?.id===t&&V(ft,null);let a=Q.selection;await Promise.all([Ks(),pa(),ha(),ga()]),ma(),jo({id:t,handle:``,former_handle:r,deleted_at:n}),Q.isCurrent(a)&&await Q.refresh()}async function ic(e){let t=e.payload.bot_user_id||``;t&&(V(kt,b(kt).filter(e=>e.user.id!==t)),V(jt,b(jt).filter(e=>e.bot_user_id!==t)),V(Pt,b(Pt).filter(e=>e.bot.id!==t)),b(ft)?.id===t&&V(ft,null),await Promise.all([Ks(e.workspace_id),pa(e.workspace_id),ha(e.workspace_id),ga(e.workspace_id)]),ma(e.workspace_id))}function ac(e){let t=e.payload,n=typeof t.user_id==`string`?t.user_id:``;if(!n||n!==b(K)?.id)return;let r=e.seq??t.last_read_seq??t.seq,i=typeof r==`number`?r:Number(r)||0;if(e.type===`channel.read`){let n=typeof t.channel_id==`string`?t.channel_id:e.channel_id||``;if(!n)return;V(q,b(q).map(e=>{if(e.id!==n)return e;let t=Math.max(e.last_read_seq||0,i);return{...e,last_read_seq:t,unread_count:t>=(e.last_seq||0)?0:e.unread_count||0}}))}else{let e=typeof t.direct_conversation_id==`string`?t.direct_conversation_id:``;if(!e)return;V(J,b(J).map(t=>{if(t.id!==e)return t;let n=Math.max(t.last_read_seq||0,i);return{...t,last_read_seq:n,unread_count:n>=(t.last_seq||0)?0:t.unread_count||0}}))}}function oc(e,t,n=!1){let r=e.payload,i=typeof r.kind==`string`?r.kind:``;if(i===`agent_commentary`||i===`agent_tool`)return;let a=typeof r.author_id==`string`?r.author_id:``;if(a&&a===b(K)?.id||r.parent_message_id)return;let o=mo(e),{channelID:s,dmID:c}=ho(e),l=s||c;if(!l)return;let u=wo(l),d=s?s===b(X)&&!b(Z):c===b(Z),f=d&&(!s||!b(st))&&(t??Io());if(o>0&&o<=(u.last_seq||0)&&!(n&&f))return;let p=o>0?o:(u.last_seq||0)+1,m=d&&!f&&(u.unread_count||0)===0;m&&po(l,u.last_read_seq||0,e.created_at);let h={last_seq:Math.max(u.last_seq||0,p),last_read_seq:m?Math.max(u.last_read_seq||0,p-1):u.last_read_seq||0,unread_count:f?0:(u.unread_count||0)+1};s?V(q,b(q).map(e=>e.id===l?{...e,...h}:e)):V(J,b(J).map(e=>e.id===l?{...e,...h}:e))}function sc(e){let t=e.payload,n=typeof t.user_id==`string`?t.user_id:``;if(!n||n===b(K)?.id)return;let{channelID:r,dmID:i}=ho(e);if(!(b(X)&&r===b(X)||b(Z)&&i===b(Z)))return;if(e.type===`typing.stopped`){V(Cr,b(Cr).filter(e=>e.userID!==n));return}let a=uc(n),o=b(Cr).filter(e=>e.userID!==n);o.push({userID:n,user:a,expiresAt:Date.now()+qr}),V(Cr,o),dc()}function cc(e){let t=e.payload,{channelID:n,dmID:r}=ho(e);if(!(b(X)&&n===b(X)||b(Z)&&r===b(Z)))return;let i=b(Tr);V(Tr,ni(i,t,Date.now())),t.op!==`clear`&&b(Tr)!==i&&lc()}function lc(){Er||=window.setInterval(()=>{let e=Date.now(),t=b(Tr).filter(t=>t.expiresAt>e);t.length!==b(Tr).length&&V(Tr,t),t.length===0&&Er&&(window.clearInterval(Er),Er=void 0)},1e3)}function uc(e){if(b(K)?.id===e)return b(K);let t=b(At).find(t=>t.id===e);if(t)return t;let n=b(Ze).find(t=>t.author?.id===e)?.author;if(n)return n;let r=b(h).find(t=>t.author?.id===e)?.author;if(r)return r;if(Q.root?.author?.id===e)return Q.root.author;let i=b(kt).find(t=>t.user.id===e)?.user;if(i)return i;for(let t of b(J)){let n=t.members.find(t=>t.id===e);if(n)return n}}function dc(){wr||=window.setInterval(()=>{let e=Date.now(),t=b(Cr).filter(t=>t.expiresAt>e);t.length!==b(Cr).length&&V(Cr,t),t.length===0&&wr&&(window.clearInterval(wr),wr=void 0)},1e3)}function fc(){b(Y)&&(b(X)||b(Z))&&Zn({workspaceID:b(Y),channelID:b(X)||void 0,directConversationID:b(Z)||void 0})}function pc(e){e&&!e.deleted_at&&(ra(),vs(),V(Ht,null),V(Ut,``),Wi(),V(ft,e),Ui(),(b(E)===`owner`||b(E)===`moderator`)&&!b(kt).some(t=>t.user.id===e.id)&&pa())}function mc(e){e.key===`Enter`&&!e.shiftKey&&(e.preventDefault(),zo())}function hc(e){e.key===`Enter`&&!e.shiftKey&&(e.preventDefault(),as())}function gc(e,t){ss()||V(Vt,{url:e,title:t})}function _c(e){V(Wt,document.activeElement instanceof HTMLElement?document.activeElement:null),V(Ut,b(fr)),V(Ht,e),t().then(()=>{document.querySelector(`.artifact-viewer__actions > button:last-child`)?.focus()})}function vc(){let e=b(Wt),n=b(Ht)?.id||``;V(Ht,null),V(Ut,``),V(Wt,null),t().then(()=>{if(e?.isConnected){e.focus({preventScroll:!0});return}(Q.root?document.querySelector(`.thread`):document)?.querySelector(`[data-artifact-upload-id="${CSS.escape(n)}"]`)?.focus({preventScroll:!0})})}function yc(e,t){for(let e of qt)e.inert=!1;if(qt.clear(),e&&b(Kt)&&t)for(let e of b(Kt).children)e instanceof HTMLElement&&e!==t&&!e.inert&&(e.inert=!0,qt.add(e))}function bc(e){if(!b(Ht)||!b(_r)||e.key!==`Tab`||!b(Gt))return;let t=Array.from(b(Gt).querySelectorAll(`a[href], button:not([disabled]), [tabindex]:not([tabindex="-1"])`)).filter(e=>!e.inert&&e.getClientRects().length>0);if(t.length===0){e.preventDefault(),b(Gt).focus();return}let n=t[0],r=t[t.length-1];e.shiftKey&&(document.activeElement===n||!b(Gt).contains(document.activeElement))?(e.preventDefault(),r.focus()):!e.shiftKey&&(document.activeElement===r||!b(Gt).contains(document.activeElement))&&(e.preventDefault(),n.focus())}function xc(e){let t=e.target;t instanceof HTMLImageElement&&t.closest(`.markdown`)&&(e.preventDefault(),gc(Ke(t),t.alt||`Image`))}function Sc(){if(b(Ht)){vc();return}if(b(pt)){V(pt,!1),Ui();return}ra(),Le.cancel($(),`thread`),Wi(),Ui()}function Cc(){if(Q.root){Sc();return}b(Oe)&&Sc(),V(Ft,{kind:`ephemeral`,text:`Pick a message to open its thread.`})}async function wc(){let e=b(X),t=++Tt,n=()=>t===Tt&&e===b(X)&&!b(Z);if(!e||b(Z)){V(mt,[]),V(yt,``),V(_t,!1);return}V(_t,!0),V(yt,``);try{await Xn.run(()=>G(`/api/channels/${e}/pins?limit=100`),e=>{V(mt,e.messages.filter(e=>!e.deleted_at))},n)}catch(e){if(!n())return;V(yt,e instanceof Error?e.message:`Could not load pinned messages`)}finally{n()&&V(_t,!1)}}async function Tc(e,t){let n=b(X);if(!n||b(Z))throw Error(`Pins are available in channels only`);t?await G(`/api/channels/${n}/pins/${e.id}`,{method:`DELETE`}):await G(`/api/channels/${n}/pins`,{method:`POST`,body:JSON.stringify({message_id:e.id})}),n===b(X)&&!b(Z)&&await wc()}function Ec(){if(!b(X)||b(Z))return;let e=!b(pt);vs(),Wi(),V(pt,e),Ui(),e&&wc()}async function Dc(e){Ar++,V(pt,!1),await es(e.thread_root_id,e.parent_message_id?void 0:e)&&b(Y)&&Q.root?.route_id&&window.location.pathname!==Ii(b(Y),Q.root.id)&&await Vi(b(Y),Q.root.id)}function Oc(e){if(!(e.isComposing||e.keyCode===229)&&(bc(e),!e.defaultPrevented)){if(e.key===`Escape`){if(e.target instanceof Element&&e.target.closest(`[data-handles-escape]`)||b(Vt))return;if(ss())kc();else if(b(gr)){e.preventDefault(),Ac();return}else if(b(Ht)){e.preventDefault(),Sc();return}else if(b(on)){e.preventDefault(),Sc();return}else if(b(ke)){e.preventDefault(),vs();return}else if(b(vr)||Q.draft?.quote){e.preventDefault(),Q.draft?.quote&&(b(Sr)===`thread`||!b(vr))?Q.setQuote(null):us();return}else{e.preventDefault(),Lo();return}}if(b(gr)&&e.key.length===1&&!e.ctrlKey&&!e.metaKey&&!e.altKey){let t=document.activeElement;if(!(t instanceof HTMLInputElement)&&!(t instanceof HTMLTextAreaElement)&&!(t instanceof HTMLSelectElement)&&!(t instanceof HTMLElement&&t.isContentEditable)){e.preventDefault();return}}Wn(e,{authRequired:b(Bn),isModalOpen:()=>ss()||b(gr),messageInput:b(br),replyInput:b(xr),target:ls})}}function kc(){b(ri)&&b(ti).has(b(ri).id)||b(vn)||b(Cn)||(ra(),V(ri,null),V(ii,``),V(Vt,null),V(hn,!1),V(_n,!1),V(yn,``),Di())}function Ac(){V(gr,!1)}function jc(){if(b(_r)){V(gr,!b(gr));return}V(hr,!b(hr))}P(()=>s(),()=>{V(h,s().replies)}),P(()=>(b(dn),b(Y)),()=>{b(dn)&&b(dn)!==b(Y)&&Ws()}),P(()=>(b(ze),b(Y)),()=>{V(x,b(ze).find(e=>e.id===b(Y)))}),P(()=>b(x),()=>{V(E,b(x)?.role||``)}),P(()=>b(E),()=>{V(D,b(E)===`owner`)}),P(()=>(b(ft),b(kt)),()=>{V(ee,b(ft)?b(kt).find(e=>e.user.id===b(ft)?.id):void 0)}),P(()=>(b(q),b(X)),()=>{V(M,b(q).find(e=>e.id===b(X)))}),P(()=>(b(M),b(x)),()=>{V(I,!!b(M)&&b(x)?.role===`owner`)}),P(()=>(b(M),b(x)),()=>{V(L,!!b(M)&&Be(b(x)?.role))}),P(()=>(b(Ve),b(X)),()=>{V(te,li(b(Ve),b(X)))}),P(()=>(b(te),b(st)),()=>{V(ae,b(te).find(e=>e.id===b(st)))}),P(()=>(b(X),b(Z)),()=>{xa(b(X),b(Z))}),P(()=>(b(J),b(Z)),()=>{V(B,b(J).find(e=>e.id===b(Z)))}),P(()=>b(B),()=>{V(U,b(B)?.can_send??!0)}),P(()=>(b(Z),b(X)),()=>{V(fr,b(Z)||b(X)||``)}),P(()=>b(fr),()=>{oi(b(fr))}),P(()=>b(fr),()=>{_a(b(fr))}),P(()=>(b(X),b(Pt),b(B)),()=>{V(W,b(X)?b(Pt):b(B)?b(Pt).filter(e=>b(B)?.members?.some(t=>t.id===e.bot.id)):[])}),P(()=>(b(Z),b(J),b(X),b(q)),()=>{V(me,b(Z)?b(J).find(e=>e.id===b(Z))||{}:b(X)&&b(q).find(e=>e.id===b(X))||{})}),P(()=>(b(fr),b(me)),()=>{V(he,to(b(fr),b(me)))}),P(()=>(b(zn),b(q),b(J)),()=>{V(ge,b(zn)?b(q).reduce((e,t)=>e+(t.unread_count||0),0)+b(J).reduce((e,t)=>e+(t.unread_count||0),0):0)}),P(()=>b(ge),()=>{Rt?.setUnreadCount(b(ge))}),P(()=>(b(he),b(me)),()=>{V(ye,b(he)>0&&b(me).last_read_seq||0)}),P(()=>(b(he),b(fr),b(ye),b(Yn)),()=>{V(Se,b(he)>0&&To(b(fr),b(ye),b(Yn)))}),P(()=>(b(he),b(fr),b(ye),b(Yn)),()=>{V(we,b(he)>0?Eo(b(fr),b(ye),b(Yn)):``)}),P(()=>(b(Ze),b(jn),b(Fn),b(Dr)),()=>{V(Te,wn(b(Ze),{hideCommentary:b(jn),hideToolCalls:b(Fn)},b(Dr)))}),P(()=>b(Tr),()=>{V(Ee,b(Tr).some(e=>e.lines.some(e=>!e.finalized)))}),P(()=>b(mt),()=>{V(wt,new Set(b(mt).map(e=>e.id)))}),P(()=>(b(Tr),b(Pt)),()=>{V(De,Cs(b(Tr),b(Pt),uc))}),P(()=>(b(Ht),b(Ut),b(fr)),()=>{b(Ht)&&b(Ut)&&b(Ut)!==b(fr)&&(V(Ht,null),V(Ut,``),V(Wt,null))}),P(()=>(b(pt),s(),b(ft),b(Ht)),()=>{V(Oe,b(pt)||s().selection!==null||b(ft)!==null||b(Ht)!==null)}),P(()=>(b(an),b(on)),()=>{V(ke,b(an)!==null&&!b(on))}),P(()=>(b(_r),b(Ht),b(Gt)),()=>{yc(b(_r)&&b(Ht)!==null,b(Gt))}),P(()=>(b(Ze),b(J),b(K)),()=>{V(Ae,at(b(Ze),b(J),b(K)?.id||``))}),P(()=>(b(K),b(Ae),b(At),b(B)),()=>{V(zt,ct(b(K),b(Ae),b(At),b(B)))}),P(()=>(b(K),b(Z),b(X),b(Ge)),()=>{V(Bt,b(K)?.id&&(b(Z)||b(X)&&b(Ge)!==null&&b(Ge)!==`muted`)?b(K).id:``)}),P(()=>(b(yr),b(vr),b(Ze)),()=>{b(yr)===`channel`&&b(vr)&&!b(Ze).some(e=>e.id===b(vr)?.id)&&us()}),P(()=>(b(yr),b(vr),b(Ze)),()=>{b(yr)===`dm`&&b(vr)&&!b(Ze).some(e=>e.id===b(vr)?.id)&&us()}),P(()=>(b(zn),l(Pe()),l(Fe())),()=>{b(zn)&&Hi(Pe(),Fe())}),w(),ne();var Mc=p();a(`1oa2eo8`,e=>{var t=As();u(e,t)}),y(`keydown`,O,Oc,!0),y(`pointerdown`,O,function(...e){Rn?.apply(this,e)},!0);var Nc=oe(Mc),Pc=e=>{Ur(e,{})},Fc=e=>{var t=Us(),n=oe(t);let a;var o=A(n),d=e=>{{let t=H(()=>b(M)?b(Ge):null),n=H(()=>(b(B),l(ot),b(K),b(M),l(bt),k(()=>b(B)?`@${ot(b(B),b(K)?.id)}`:b(M)?`#${bt(b(M))}`:void 0))),r=H(()=>(b(B),b(M),k(()=>b(B)?void 0:b(M)?.external_url))),i=H(()=>(b(M),k(()=>!!b(M)))),a=H(()=>(b(x),k(()=>b(x)?.name)));cs(e,{get channelNotifPreference(){return b(t)},get channelNotifSaving(){return b(Xe)},get pinnedOpen(){return b(pt)},get channelTitle(){return b(n)},get externalURL(){return b(r)},get pinsAvailable(){return b(i)},get channelSettingsAvailable(){return b(L)},get connected(){return b(Vn)},get platform(){return l(Rt),k(()=>Rt.platform)},get searchQuery(){return b(rn)},get sidebarCollapsed(){return b(hr)},get mobileNavOpen(){return b(gr)},get mobileNavigation(){return b(_r)},get workspaceName(){return b(a)},onOpenChannelSettings:wi,onOpenWorkspaceSettings:Ci,onResetSearch:vs,onSearch:()=>void hs(),onSearchQuery:e=>V(rn,e),onToggleSidebar:jc,onToggleChannelNotifications:()=>void Sa(),onPinnedItems:Ec})}};f(o,e=>{Me&&Rt&&e(d)});var p=N(o,2),m=A(p),g=e=>{var t=v(`×`);u(e,t)},y=e=>{var t=js();u(e,t)};f(m,e=>{b(gr)?e(g):e(y,-1)}),r(p);var S=N(p,2),C=e=>{var t=Ms();_(`click`,t,Ac),u(e,t)};f(S,e=>{b(gr)&&e(C)});var w=N(S,2);{let e=H(()=>(b(Ne),k(()=>Me&&b(Ne).url===`/`?`/app`:b(Ne).url))),t=H(()=>(l(Mt),b(Ne),k(()=>Mt(b(Ne))))),n=H(()=>b(Qt)===`workspace`);yi(w,{get workspaces(){return b(ze)},get homeHref(){return b(e)},get homeLabel(){return b(Ne),k(()=>b(Ne).label)},get homeTitle(){return b(t)},get selectedWorkspaceID(){return b(Y)},get workspaceName(){return b(Yt)},get showWorkspaceCreate(){return b(mr)},get createPending(){return b(n)},get createError(){return b($t)},hrefForWorkspace:e=>Ii(e),onSelectWorkspace:e=>void ca(e),onToggleWorkspaceCreate:ia,onWorkspaceName:e=>V(Yt,e),onCreateWorkspace:()=>void sa()})}var O=N(w,2);{let e=H(()=>(b(x),k(()=>b(x)?.name))),t=H(()=>(b(x),l(_e),k(()=>b(x)?.icon_url?_e(b(x).icon_url):``))),n=H(()=>!Me),r=H(()=>(b(Qr),k(()=>b(Qr)?.title)));ea(O,{get workspaceID(){return b(Y)},get workspaceName(){return b(e)},get workspaceIconURL(){return b(t)},get connected(){return b(Vn)},get sidebarCollapsed(){return b(hr)},get showHeader(){return b(n)},get channels(){return b(q)},get directConversations(){return b(J)},get recentPeople(){return b(Ae)},get currentUser(){return b(K)},get selectedChannelID(){return b(X)},get selectedDirectID(){return b(Z)},get selectedProfile(){return b(ft)},onToggleCollapse:jc,hrefForChannel:e=>Ii(b(Y),e),hrefForDirect:e=>Ii(b(Y),e),onSelectChannel:e=>void ba(e),onCreateChannel:aa,onSelectDirect:e=>void Js(e),onCreateDirect:oa,onHideDirect:e=>void $s(e),get hiddenDirectTitle(){return b(r)},onUndoHideDirect:()=>void Qs(),onOpenProfile:pc,onOpenSettings:Si,onOpenWorkspaceSettings:Ci})}var P=N(O,2),ne=A(P),re=e=>{{let t=H(()=>(b(x),k(()=>b(x)?.name))),n=H(()=>(b(K),k(()=>b(K)?.id))),r=H(()=>(s(),k(()=>s().root!==null)));xs(e,{get selectedDirect(){return b(B)},get selectedChannel(){return b(M)},get workspaceName(){return b(t)},get currentUserID(){return b(n)},get searchQuery(){return b(rn)},get threadOpen(){return b(r)},get pinnedOpen(){return b(pt)},get channelNotifPreference(){return b(Ge)},get channelNotifSaving(){return b(Xe)},get channelSettingsAvailable(){return b(L)},onSearchQuery:e=>V(rn,e),onSearch:()=>void hs(),onResetSearch:vs,onToggleThread:Cc,onToggleChannelNotifications:()=>void Sa(),onPinnedItems:Ec,onOpenChannelSettings:wi})}};f(ne,e=>{Me||e(re)});var ie=N(ne,2),se=e=>{var t=Ns(),n=A(t),i=N(A(n)),a=R(i,!0);r(n);var o=N(n,2);r(t),z(()=>c(a,(b(ae),k(()=>b(ae).name)))),_(`click`,o,()=>void ja(``)),u(e,t)};f(ie,e=>{b(ae)&&e(se)});var ce=N(ie,2);{let e=H(()=>b(er)!==`idle`),t=H(()=>(s(),k(()=>s().root?.id))),n=H(()=>(b(K),k(()=>b(K)?.id))),r=H(()=>(b(B),b(U),k(()=>!(!b(B)||b(U))))),i=H(()=>b(D)&&!b(Z));gt(ce,{get channelID(){return b(X)},get pinnedMessageIDs(){return b(wt)},onTogglePin:Tc,onCopyLink:Li,get messages(){return b(Te)},get selectedDirect(){return b(B)},get selectedChannel(){return b(M)},get mentionPeople(){return b(zt)},get mentionAttentionUserID(){return b(Bt)},get restoreState(){return b(dr)},get viewKey(){return b(ur)},get loading(){return b(pr)},get unreadCount(){return b(he)},get unreadBoundarySeq(){return b(ye)},get unreadBoundaryLoaded(){return b(Se)},get unreadSince(){return b(we)},get hasOlder(){return b(ir)},get hasNewer(){return b(ar)},get loadingOlder(){return b(or)},get loadingNewer(){return b(sr)},get prepending(){return b(e)},get selectedThreadID(){return b(t)},get currentUserID(){return b(n)},get reactionController(){return Ie},get reactionsDisabled(){return b(r)},get canDeleteAnyMessage(){return b(i)},get deletingMessageIDs(){return b(ti)},onListRef:e=>V(qn,e),onActivateMessageComposer:fa,onInlineImagePointerUp:xc,onOpenProfile:pc,onReply:os,onOpenThread:$o,onJumpToQuote:e=>void ds(e),onOpenImage:gc,onOpenArtifact:_c,onLoadOlder:Ka,onLoadNewer:e=>qa(e===`wheel`),onJumpToUnread:()=>void fs(),onHistorySettled:Qa,onReachedBottom:oo,onMarkRead:e=>{oo({all:!0,seq:e})},onRetry:Go,onDiscard:Ko,onDeleteMessage:Zo,get editController(){return Le},get editScope(){return b(fr)},onMessageEdited:Xo,get topics(){return b(Ve)},onSelectTopic:e=>void ja(e)})}var de=N(ce,2);$r(de,{get turns(){return b(Tr)}});var fe=N(de,2),pe=A(fe);{let e=H(()=>(b(K),k(()=>b(K)?.id)));Yr(pe,{get entries(){return b(Cr)},get currentUserID(){return b(e)}})}var me=N(pe,2);{let e=H(()=>(b(Ee),s(),k(()=>b(Ee)&&s().root===null)));xt(me,{get active(){return b(e)},get agentNames(){return b(De)}})}var ge=N(me,2),ve=e=>{var t=Ps(),n=R(t);z(()=>c(n,`Live updates: ${b(Hn)??``}`)),u(e,t)};f(ge,e=>{b(Hn)&&e(ve)});var G=N(ge,2),be=e=>{var t=Ps(),n=R(t);z(()=>c(n,`Mentions unavailable: ${b(Hr)??``}`)),u(e,t)};f(G,e=>{b(Hr)&&e(be)});var xe=N(G,2),Ce=e=>{var t=Fs();let n;var a=A(t),o=R(a,!0),s=N(a,2),l=R(s,!0),d=N(s,2);r(t),z(()=>{n=i(t,1,`composer-notice`,null,n,{"composer-notice--error":b(Ft).kind===`error`}),c(o,(b(Ft),k(()=>b(Ft).kind===`ephemeral`?`Only visible to you`:`Action failed`))),c(l,(b(Ft),k(()=>b(Ft).text)))}),_(`click`,d,()=>V(Ft,null)),u(e,t)};f(xe,e=>{b(Ft)&&e(Ce)});var je=N(xe,2),Pe=e=>{var t=Ls(),n=N(A(t),2),i=A(n);i.value=i.__value=``;var a=N(i);F(a,1,()=>b(te),e=>e.id,(e,t)=>{var n=Is(),r=R(n,!0),i={};z(()=>{c(r,(b(t),k(()=>b(t).name))),i!==(i=(b(t),k(()=>b(t).id)))&&(n.value=(n.__value=i)??``)}),u(e,n)}),r(n);var o;T(n),r(t),z(()=>{o!==(o=b(it))&&(n.value=(n.__value=o)??``,ue(n,o))}),_(`change`,n,e=>V(it,e.currentTarget.value)),u(e,t)};f(je,e=>{b(X),b(te),k(()=>b(X)&&b(te).length>0)&&e(Pe)});var Fe=N(je,2);{let e=H(()=>(b(B),b(U),l(ot),b(K),b(M),l(bt),k(()=>b(B)&&!b(U)?`No active recipient`:b(B)?`Message ${ot(b(B),b(K)?.id)}`:b(M)?`Message #${bt(b(M))}`:`Pick a channel to start`))),t=H(()=>!!b(B)&&!b(U)),n=H(()=>b(vr)&&b(yr)===(b(Z)?`dm`:`channel`)?b(vr):null),r=H(()=>b(X)?b(jt):[]);rt(Fe,{get value(){return b(Jt)},get placeholder(){return b(e)},ariaLabel:`Message body`,submitLabel:`Send`,get disabled(){return b(t)},get pendingUpload(){return b(un)},get replyTarget(){return b(n)},showUpload:!0,showToolbar:!0,get slashCommands(){return b(r)},get botCommands(){return b(W)},get mentionPeople(){return b(zt)},onValue:e=>{let t=b(Jt);V(Jt,e),e.trim()&&e!==t?fc():e.trim()||$n()},onSubmit:()=>void zo(),onKeydown:mc,onFocus:fa,onInputRef:e=>V(br,e),onUploadFile:Gs,onRemoveUpload:Ws,onClearReply:us})}r(fe),r(P);var Re=N(P,2),Be=e=>{var t=Rs();Pr(A(t),{get upload(){return b(Ht)},onClose:vc}),r(t),le(t,e=>V(Gt,e),()=>b(Gt)),z(()=>{t.inert=b(gr),j(t,`role`,b(_r)?`dialog`:`complementary`),j(t,`aria-modal`,b(_r)?`true`:void 0)}),u(e,t)};f(Re,e=>{b(Ht)&&e(Be)});var He=N(Re,2),Ue=e=>{{let t=H(()=>b(Ht)!==null),n=H(()=>b(gr)||b(Ht)!==null);Da(e,{get session(){return b(an)},get covered(){return b(t)},get inert(){return b(n)},contextFor:ys,onClose:vs,onOpenResult:e=>void bs(e),onLoadMore:()=>void _s()})}},We=e=>{var t=Hs();let n;var a=A(t),o=e=>{ua(e,{get messages(){return b(mt)},get loading(){return b(_t)},get error(){return b(yt)},get topics(){return b(Ve)},get mentionPeople(){return b(zt)},get mentionAttentionUserID(){return b(Bt)},onClose:Sc,onOpenThread:e=>void Dc(e),onOpenImage:gc,onOpenArtifact:_c,onUnpin:e=>Tc(e,!0),onSelectTopic:e=>{V(pt,!1),ja(e)}})},l=e=>{{let t=H(()=>(s(),k(()=>s().draft?.body??``))),n=H(()=>(s(),k(()=>s().draft?.quote??null))),r=H(()=>(s(),k(()=>s().draft?.error||s().error))),i=H(()=>(s(),k(()=>s().draft?.sending??!1))),a=H(()=>(b(B),b(U),k(()=>!(!b(B)||b(U))))),o=H(()=>b(on)&&b(an)?()=>void Ss():void 0),c=H(()=>(b(K),k(()=>b(K)?.id))),l=H(()=>(b(B),b(U),k(()=>!(!b(B)||b(U))))),u=H(()=>b(D)&&!b(Z));Ct(e,{get history(){return Q},get root(){return s(),k(()=>s().root)},get replies(){return b(h)},get threadState(){return s(),k(()=>s().state)},get replyBody(){return b(t)},get replyTarget(){return b(n)},get replyError(){return b(r)},get replySending(){return b(i)},get mentionPeople(){return b(zt)},get mentionAttentionUserID(){return b(Bt)},get agentResponding(){return b(Ee)},get respondingAgentNames(){return b(De)},get replyDisabled(){return b(a)},onClose:Sc,get onBack(){return b(o)},onReplyBody:e=>Q.updateDraft(e),onSubmitReply:()=>void as(),onReplyKeydown:hc,onReplyFocus:()=>V(Sr,`thread`),onReplyInputRef:e=>V(xr,e),get currentUserID(){return b(c)},get reactionController(){return Ie},get reactionsDisabled(){return b(l)},onSetReplyTarget:os,onClearReply:()=>Q.setQuote(null),get canDeleteAnyMessage(){return b(u)},get deletingMessageIDs(){return b(ti)},onDeleteMessage:Zo,get channelID(){return b(X)},get pinnedMessageIDs(){return b(wt)},onTogglePin:Tc,onCopyLink:Li,get editController(){return Le},get editScope(){return b(fr)},onMessageEdited:Xo,onActivateThreadComposer:()=>V(Sr,`thread`),onInlineImagePointerUp:xc,onJumpToQuote:e=>void ds(e),onOpenImage:gc,onOpenArtifact:_c})}},d=e=>{var t=Vs(),n=oe(t),i=N(A(n),2);r(n);var a=N(n,2),o=e=>{var t=zs(),n=oe(t),r=R(n,!0),i=N(n,2);z(()=>c(r,(s(),k(()=>s().error)))),_(`click`,i,()=>s().selection&&void es(s().selection.messageID)),u(e,t)},l=e=>{var t=Bs();u(e,t)};f(a,e=>{s(),k(()=>s().error)?e(o):e(l,-1)}),_(`click`,i,Sc),u(e,t)},p=e=>{{let t=H(()=>(b(x),k(()=>b(x)?.name))),n=H(()=>b(Qt)===`direct`);vt(e,{get profile(){return b(ft)},get currentUser(){return b(K)},get workspaceName(){return b(t)},get currentUserRole(){return b(E)},get moderation(){return b(ee)},onClose:Sc,onEdit:Si,get messagePending(){return b(n)},get messageError(){return b(tn)},onMessage:e=>void Ys(e),onApprove:e=>void va(e,{role:`member`,clear_timeout:!0,blocked:!1}),onTimeout:e=>void va(e,{timeout_minutes:60}),onBlock:e=>void va(e,{blocked:!0}),onUnblock:e=>void va(e,{blocked:!1,clear_timeout:!0})})}},m=e=>{Yo(e,{})};f(a,e=>{b(pt)?e(o):(s(),k(()=>s().root)?e(l,1):(s(),k(()=>s().selection)?e(d,2):b(ft)?e(p,3):e(m,-1)))}),r(t),z(()=>{n=i(t,1,`thread`,null,n,{open:b(Oe),covered:b(Ht)!==null}),t.inert=b(gr)||b(Ht)!==null,j(t,`aria-hidden`,b(Ht)?`true`:void 0),j(t,`aria-label`,b(pt)?`Pinned messages pane`:b(ft)?`Profile pane`:`Thread pane`)}),u(e,t)};f(He,e=>{b(ke)&&b(an)?e(Ue):e(We,-1)}),r(n),le(n,e=>V(Kt,e),()=>b(Kt));var Ke=N(n,2),qe=e=>{{let t=H(()=>Rt!=null);qo(e,{get user(){return b(K)},get workspaces(){return b(ze)},get currentWorkspaceID(){return b(Y)},get initialSection(){return b(gn)},get hideCommentary(){return b(jn)},get hideToolCalls(){return b(Fn)},get userAlign(){return b(In)},get otherAlign(){return b(Ln)},get isDesktop(){return b(t)},onUserUpdated:Mi,onHideCommentary:_i,onHideToolCalls:vi,onUserAlign:hi,onOtherAlign:gi,onBrowserNotificationsChanged:e=>V(An,e),onClose:kc})}};f(Ke,e=>{b(hn)&&b(K)&&e(qe)});var Je=N(Ke,2),Ye=e=>{Pa(e,{get channel(){return b(M)},get saving(){return b(vn)},get error(){return b(yn)},get canDelete(){return b(I)},onClose:kc,onArchivedChange:e=>void Ti(e),onDelete:()=>void Ei()})};f(Je,e=>{b(_n)&&b(M)&&e(Ye)});var Ze=N(Je,2),Qe=e=>{Ga(e,{get channel(){return b(bn)},get preview(){return b(xn)},get loading(){return b(Sn)},get deleting(){return b(Cn)},get error(){return b(Tn)},onClose:Di,onArchive:Oi,onConfirm:()=>void ki()})};f(Ze,e=>{b(bn)&&e(Qe)});var $e=N(Ze,2),tt=e=>{{let t=H(()=>b(Qt)===`channel`);ai(e,{get channelName(){return b(Xt)},get pending(){return b(t)},get error(){return b(en)},onChannelName:e=>V(Xt,e),onClose:kc,onCreate:()=>void ya()})}};f($e,e=>{b(On)&&e(tt)});var nt=N($e,2),at=e=>{{let t=H(()=>(b(K),k(()=>b(K)?.id))),n=H(()=>b(Qt)===`direct`),r=H(()=>b(tn)||b(Hr));di(e,{get people(){return b(zt)},get currentUserID(){return b(t)},get memberID(){return b(Zt)},get pending(){return b(n)},get error(){return b(r)},onMemberID:e=>V(Zt,e),onClose:kc,onStart:e=>void Ys(e)})}};f(nt,e=>{b(kn)&&e(at)});var st=N(nt,2),ct=e=>{{let t=H(()=>(b(ti),b(ri),k(()=>b(ti).has(b(ri).id))));Kr(e,{get message(){return b(ri)},get deleting(){return b(t)},get error(){return b(ii)},onClose:kc,onConfirm:()=>void Qo()})}};f(st,e=>{b(ri)&&e(ct)});var lt=N(st,2),ut=e=>{et(e,{get url(){return b(Vt),k(()=>b(Vt).url)},get title(){return b(Vt),k(()=>b(Vt).title)},onClose:kc})};f(lt,e=>{b(Vt)&&e(ut)}),z(()=>{a=i(n,1,`shell`,null,a,{"desktop-shell":Me,"nav-open":b(gr),"sidebar-collapsed":b(hr),"thread-open":b(Oe)&&!b(ke),"search-open":b(ke),"artifact-open":b(Ht)!==null}),j(n,`data-connected`,b(Vn)),j(n,`data-app-ready`,b(Vn)&&b(zn)),j(p,`aria-expanded`,b(gr)),P.inert=b(gr)}),_(`click`,p,()=>V(gr,!b(gr))),u(e,t)};f(Nc,e=>{b(Bn)?e(Pc):e(Fc,-1)}),u(e,Mc),g(),m()}s([`click`,`change`]);export{ks as n,Ws as t}; \ No newline at end of file diff --git a/apps/api/internal/webassets/dist/_app/immutable/chunks/DfsrRaIf.js b/apps/api/internal/webassets/dist/_app/immutable/chunks/DuhkHvCz.js similarity index 99% rename from apps/api/internal/webassets/dist/_app/immutable/chunks/DfsrRaIf.js rename to apps/api/internal/webassets/dist/_app/immutable/chunks/DuhkHvCz.js index 36d5be57f..e11e93db6 100644 --- a/apps/api/internal/webassets/dist/_app/immutable/chunks/DfsrRaIf.js +++ b/apps/api/internal/webassets/dist/_app/immutable/chunks/DuhkHvCz.js @@ -1 +1 @@ -import{$ as e,A as t,At as n,C as r,Et as i,H as a,I as o,L as s,P as c,R as l,St as u,T as d,Tt as f,U as p,W as m,Y as h,a as g,ct as _,et as v,ft as y,g as b,gt as x,ht as S,j as C,mt as w,n as ee,pt as T,st as E,u as te,vt as D,w as O,yt as k,z as A}from"./BTIB_WQZ.js";import"./xihTtKlq.js";import{n as j,u as M}from"./DEPNME54.js";import{C as ne,L as re,O as ie,a as ae,c as N,d as oe,h as se,i as ce,j as P,k as F,m as le,n as ue,o as de,r as fe,s as pe,t as me,u as he,x as ge}from"./T0GVabNa.js";import{f as _e,l as ve,t as ye,u as be}from"./ByQ3bZN5.js";var I=300,xe=200,L=100,R=50,z=e=>e.thread_seq??0,B=class{context;committed;#e=k(null);get root(){return h(this.#e)}set root(e){D(this.#e,e,!0)}#t=k(x([]));get replies(){return h(this.#t)}set replies(e){D(this.#t,e,!0)}#n=k(null);get state(){return h(this.#n)}set state(e){D(this.#n,e,!0)}#r=k(``);get error(){return h(this.#r)}set error(e){D(this.#r,e,!0)}#i=k(null);get selection(){return h(this.#i)}set selection(e){D(this.#i,e)}#a=k(!1);get hasOlder(){return h(this.#a)}set hasOlder(e){D(this.#a,e,!0)}#o=k(!1);get hasNewer(){return h(this.#o)}set hasNewer(e){D(this.#o,e,!0)}#s=k(x({older:!1,newer:!1}));get loading(){return h(this.#s)}set loading(e){D(this.#s,e,!0)}#c=k(x({older:``,newer:``}));get edgeError(){return h(this.#c)}set edgeError(e){D(this.#c,e,!0)}#l=k(!0);get following(){return h(this.#l)}set following(e){D(this.#l,e,!0)}anchor=null;editingID=``;beforeChange;#u=k(x(new Map));get drafts(){return h(this.#u)}set drafts(e){D(this.#u,e,!0)}window=0;revision=0;rowRevisions=new Map;pageMutations=new Set;edgeOwners={};knownTail=0;initialized=!1;coveredStateEvent=!1;constructor(e,t){this.context=e,this.committed=t}get draft(){return this.selection?this.drafts.get(this.selection.messageID):void 0}select(e,t){return this.selection?.messageID===e&&this.isCurrent(this.selection)?this.selection:(this.close(),this.selection={messageID:e,context:this.context()},this.root=t??null,this.state=t?.thread_state??null,this.selection)}isCurrent(e){return e!==null&&this.selection===e&&e.context===this.context()}close(){this.selection=null,this.window++,this.rowRevisions.clear(),this.pageMutations.clear(),this.edgeOwners={},this.knownTail=0,this.root=null,this.replies=[],this.state=null,this.error=``,this.hasOlder=this.hasNewer=!1,this.loading={older:!1,newer:!1},this.edgeError={older:``,newer:``},this.initialized=this.coveredStateEvent=!1,this.following=!0,this.anchor=null,this.editingID=``}owner(e=()=>!0){let t=this.selection,n=this.window;return{selection:t,current:()=>this.isCurrent(t)&&this.window===n&&e()}}async request(e,t){let n=new URLSearchParams(Object.entries(t).map(([e,t])=>[e,String(t)])),r=new Map;this.pageMutations.add(r);try{let t=await j(`/api/messages/${e.messageID}/thread?${n}`);if(r.size>I)throw Error(`Too many replies changed while loading. Please try again.`);let i=e=>{let t=r.get(e.id);return t?F(e,t):e};return t.root=i(t.root),t.replies=t.replies.map(i),t}finally{this.pageMutations.delete(r)}}mergeSnapshot(e,t,n){return t?(this.rowRevisions.get(e.id)??0)>n?F(e,t):F(t,e):e}metadata(e,t){this.root=this.mergeSnapshot(e.root,this.root,t),this.rowRevisions.set(e.root.id,++this.revision),this.knownTail=Math.max(this.knownTail,e.newest_seq),this.reconcileState(e.thread_state),this.error=``,this.committed([e.root,...e.replies])}reconcileState(e){this.state=ie(this.state,e),this.root&&={...this.root,thread_state:this.state}}merge(e,t,n,r=`preserve`){this.beforeChange?.(r);let i=new Map(this.replies.map(e=>[e.id,e]));for(let n of e)i.set(n.id,this.mergeSnapshot(n,i.get(n.id),t)),this.rowRevisions.set(n.id,++this.revision);let a=[...i.values()].sort((e,t)=>z(e)-z(t));if(a.length>I){let e=n===`older`?0:a.length-xe,t=Math.min(a.length,e+xe),r=[this.following?``:this.anchor?.messageID,this.editingID].map(e=>a.findIndex(t=>t.id===e)).filter(e=>e>=0);r.length&&(e=Math.min(e,...r),t=Math.max(t,...r.map(e=>e+1)),t-e>I&&(n===`newer`?t=e+I:e=t-I)),e>0&&(this.hasOlder=!0),te.id)]);for(let t of this.rowRevisions.keys())e.has(t)||this.rowRevisions.delete(t)}selectWindow(){this.window++,this.pageMutations.clear(),this.edgeOwners={},this.loading={older:!1,newer:!1},this.edgeError={older:``,newer:``}}async open(e=()=>!0){return this.initialized&&this.isCurrent(this.selection)?e():this.latest(e)}async latest(e=()=>!0){return this.selectWindow(),this.replace({latest:!0,limit:L},`latest`,e)}async replace(e,t,n){let{selection:r,current:i}=this.owner(n),a=this.revision;if(!r||!i())return!1;try{let n=await this.request(r,e);if(!i())return!1;this.beforeChange?.(t);let o=new Map(this.replies.map(e=>[e.id,e])),s=n.replies.map(e=>this.mergeSnapshot(e,o.get(e.id),a));t===`latest`&&n.replies.some(e=>o.has(e.id))&&(s=[...s,...this.replies.filter(e=>z(e)>n.newest_seq)]),this.replies=s.slice(-300);for(let e of this.replies)this.rowRevisions.set(e.id,++this.revision);return this.pruneRevisions(),this.hasOlder=n.has_older||s.length>this.replies.length,this.hasNewer=n.has_newer||z(this.replies.at(-1)??{})!0){this.selectWindow();let n=this.owner(t);if(!n.selection||!n.current())return!1;try{let t=this.root?.id===e.messageID?this.root:this.replies.find(t=>t.id===e.messageID);if(t){if(t.deleted_at)throw Error(`This message was deleted.`);return this.following=!1,this.beforeChange?.(e),!0}let r=e.threadSeq;if(!r){let t=(await j(`/api/messages/${e.messageID}`)).message;if(!n.current())return!1;if(t.thread_root_id!==n.selection.messageID||!t.thread_seq||t.deleted_at)throw Error(`This reply is no longer available in this thread.`);r=t.thread_seq}if(!n.current()||!await this.replace({around_seq:r,limit:L},e,n.current))return!1;if(!this.replies.some(t=>t.id===e.messageID&&!t.deleted_at))throw Error(`This reply is no longer available.`);return this.following=!1,!0}catch(e){return n.current()&&(this.error=M(e,`Could not open this reply.`)),!1}}async loadEdge(e,t=()=>!0,n=R){if(this.loading[e])return!1;let{selection:r,current:i}=this.owner(t),a=this.revision;if(!r||!i())return!1;let o=z(e===`older`?this.replies[0]??{}:this.replies.at(-1)??{}),s={};this.edgeOwners[e]=s,this.loading[e]=!0,this.edgeError[e]=``;try{let t=await this.request(r,{[e===`older`?`before_seq`:`after_seq`]:o,limit:n});return!i()||(this.metadata(t,a),o&&!this.replies.some(e=>z(e)===o))?!1:(e===`older`?this.hasOlder=t.has_older:this.hasNewer=t.has_newer,this.merge(t.replies,a,e),!0)}catch(t){if(!i())return!1;throw this.edgeError[e]=M(t,`Could not load ${e} replies.`),t}finally{this.edgeOwners[e]===s&&(delete this.edgeOwners[e],this.loading[e]=!1)}}async refresh(e=()=>!0){if(!this.initialized)return this.open(e);let{selection:t,current:n}=this.owner(e),r=this.revision;if(!t||!n())return!1;if(!this.replies.length)return this.latest(e);let i=z(this.replies.at(-1)),a=z(this.replies[0])-1;try{for(;az(e)<=i),r,`newer`),e.newest_seq<=a)break;a=e.newest_seq,this.hasNewer=e.has_newer||e.newest_seq>i}return this.following&&await this.catchUp(e),n()}catch(e){if(!n())return!1;throw this.error=M(e,`Could not refresh the thread.`),e}}async catchUp(e){let{selection:t,current:n}=this.owner(e),r=this.revision;if(!t||!n())return;let i=await this.request(t,{latest:!0,limit:1});if(n()){if(this.metadata(i,r),z(this.replies.at(-1)??{})>=i.newest_seq){this.hasNewer=!1;return}if(!this.hasNewer||this.following){for(let e=0;n()&&z(this.replies.at(-1)??{})=I);e+=R);n()&&z(this.replies.at(-1)??{})e.id===n))||!this.isCurrent(this.selection))return!1;let r=this.owner(t);try{if(e.type===`thread.reply_created`)await this.catchUp(t),r.current()&&(this.coveredStateEvent=!0);else if(e.type===`thread.state_updated`)this.coveredStateEvent?this.coveredStateEvent=!1:await this.catchUp(t);else if((e.type===`message.updated`||e.type===`message.deleted`)&&n){let{current:e}=this.owner(t),r=this.revision,i=await j(`/api/messages/${n}`);if(e()){let e=this.root?.id===n?this.root:this.replies.find(e=>e.id===n);this.updateMessage(this.mergeSnapshot(i.message,e,r))}}else return!1;return!0}catch(e){if(r.current())throw e;return!1}}updateDraft(e){let t=this.selection?.messageID;t&&!this.draft?.sending&&this.patchDraft(t,{body:e,error:``})}setQuote(e){let t=this.selection?.messageID;t&&!this.draft?.sending&&this.patchDraft(t,{quote:e})}patchDraft(e,t){let n={body:``,quote:null,sending:!1,error:``,...this.drafts.get(e),...t},r=new Map(this.drafts);!n.body&&!n.quote&&!n.sending&&!n.error?r.delete(e):r.set(e,n),this.drafts=r}updateAuthor(e){for(let t of this.root?[this.root,...this.replies]:this.replies)t.author?.id===e.id&&this.updateMessage({id:t.id,thread_root_id:t.thread_root_id,author:e})}updateMessage(e){if(e.deleted_at&&this.draft?.quote?.id===e.id&&this.setQuote(null),e.thread_root_id===this.selection?.messageID){for(let t of this.pageMutations)if(t.size<=I){let n=t.get(e.id);t.set(e.id,n?F(n,e):e)}this.beforeChange?.(`preserve`),this.rowRevisions.set(e.id,++this.revision),this.replies=this.replies.map(t=>t.id===e.id?F(t,e):t),this.root?.id===e.id&&(this.root=F(this.root,e)),this.pruneRevisions(),this.committed()}}async send(e){let{selection:t,current:n}=this.owner(),r=this.draft,i=r?.body.trim();if(!this.isCurrent(t)||!this.root||!r||!i||r.sending)return;let a=r.quote?.id,o=r.submission?.body===i&&r.submission.quotedMessageID===a?r.submission:{body:i,quotedMessageID:a,nonce:P()};this.patchDraft(t.messageID,{sending:!0,error:``,submission:o});try{let e=await j(`/api/messages/${t.messageID}/thread/replies`,{method:`POST`,body:JSON.stringify({body:i,nonce:o.nonce,quoted_message_id:a})});if(this.patchDraft(t.messageID,{body:``,quote:null,submission:void 0}),this.selection?.messageID!==t.messageID||!this.isCurrent(this.selection)||(this.revision++,this.reconcileState(e.thread_state),this.committed(),!n()))return;!this.hasNewer&&!this.replies.some(t=>t.id===e.message.id)&&z(e.message)===z(this.replies.at(-1)??{})+1&&this.merge([e.message],this.revision,`newer`,`latest`);try{await this.latest()}catch{}}catch(n){this.patchDraft(t.messageID,{error:M(n,`Could not post the reply.`)}),this.isCurrent(t)&&e?.(n)}finally{this.patchDraft(t.messageID,{sending:!1})}}},V=A(`
                `);function Se(e,t){i(t,!0);let r=g(t,`agentNames`,19,()=>[]),a=u(()=>r().length===1?`${r()[0]} is responding…`:r().length===2?`${r()[0]} and ${r()[1]} are responding…`:r().length>2?`Several agents are responding…`:`Agent is responding…`);var d=l(),p=T(d),m=e=>{var t=V(),r=S(y(t),2),i=w(r,!0);n(t),E(()=>o(i,h(a))),s(e,t)};c(p,e=>{t.active&&e(m)}),s(e,d),f()}var Ce=A(`
                `);function we(e,t){i(t,!0);let a=g(t,`disabled`,3,!1),o=g(t,`pending`,3,!1),l=g(t,`buttonClass`,3,``),d=k(!1),m=k(!1),v=k(void 0),x=k(void 0),C=u(()=>`add-reaction-picker-${t.messageId}`);function w(){a()||o()||(h(d)||D(m,ce(h(v),130),!0),D(d,!h(d)))}function ee(e){a()||o()||(t.onToggle(e),D(d,!1))}function T(){D(d,!1),h(x)?.focus()}function A(e){h(v)&&!h(v).contains(e.target)&&D(d,!1)}_(()=>{if(h(d))return document.addEventListener(`click`,A),()=>document.removeEventListener(`click`,A)}),_(()=>{(a()||o())&&D(d,!1)});var j=Ce(),M=y(j);te(M,e=>D(x,e),()=>h(x));var ne=S(M,2),re=e=>{{let t=u(()=>h(m)?`above-right`:`below`),n=u(()=>a()||o());N(e,{get id(){return h(C)},get placement(){return h(t)},get disabled(){return h(n)},onPick:ee,onEscape:T})}};c(ne,e=>{h(d)&&e(re)}),n(j),te(j,e=>D(v,e),()=>h(v)),E(()=>{r(M,1,O(l()),`svelte-sk6gxl`),b(M,`aria-controls`,h(C)),b(M,`aria-expanded`,h(d)),M.disabled=a()||o()}),p(`click`,M,w),s(e,j),f()}a([`click`]);var Te=A(``),Ee=A(` `),De=A(`Couldn't create link`),Oe=A(`Open in ClickClack`),ke=A(``),Ae=A(`deleted bot`),je=A(` `),Me=A(``),Ne=A(``),Pe=A(``),Fe=A(``),Ie=A(` `,1),Le=A(`
                This message was deleted.
                `),Re=A(`(edited)`),ze=A(`
                `,1),Be=A(`
                `),Ve=A(`

                `),He=A(`
                `),Ue=A(` `,1),We=A(`
                `,1),Ge=A(`
                `),Ke=A(`
                `),qe=A(``),Je=A(`

                `,1);function Ye(a,l){i(l,!0);let x=g(l,`history`,7),O=g(l,`reactionsDisabled`,3,!1),A=g(l,`mentionPeople`,19,()=>[]),j=g(l,`agentResponding`,3,!1),ie=g(l,`respondingAgentNames`,19,()=>[]),N=g(l,`replyDisabled`,3,!1),ce=g(l,`replySending`,3,!1),P=g(l,`replyError`,3,``),F=g(l,`headerLabel`,3,`Thread`),I=g(l,`canDeleteAnyMessage`,3,!1),xe=g(l,`deletingMessageIDs`,19,()=>new Set),L=g(l,`channelID`,3,``),R=g(l,`pinnedMessageIDs`,19,()=>new Set),z=g(l,`editScope`,3,``),B=k(void 0),V=0,Ce=-1,Ye=0,H=null,Xe=u(()=>l.root.id),Ze=k(``);function Qe(){if(!h(B))return;let e=h(B).getBoundingClientRect().top,t=[...h(B).querySelectorAll(`[data-message-id]`)].find(t=>t.getBoundingClientRect().bottom>e);t&&(x().anchor={messageID:t.dataset.messageId,offset:t.getBoundingClientRect().top-e})}function $e(e){if(h(B)&&h(B).getClientRects().length){if(e===`latest`||e===`preserve`&&x().following)h(B).scrollTop=h(B).scrollHeight;else{let t=e===`preserve`?x().anchor?.messageID:e.messageID,n=t?h(B).querySelector(`[data-message-id="${CSS.escape(t)}"]`):null;if(n){let r=n.getBoundingClientRect().top-h(B).getBoundingClientRect().top,i=e===`preserve`?x().anchor?.offset??0:(h(B).clientHeight-n.offsetHeight)/2;h(B).scrollTop+=r-i,e!==`preserve`&&D(Ze,t,!0)}}Ce=h(B).scrollTop,Qe()}}function et(t,n=!0){if(t===`preserve`&&H&&H!==`preserve`)return;H=t,n&&Qe();let r=++V;e().then(()=>{r!==V||X||(cancelAnimationFrame(Ye),Ye=requestAnimationFrame(()=>{r===V&&!X&&($e(t),H=null)}))})}function tt(){h(B)&&!H&&(Math.abs(h(B).scrollTop-Ce)>1&&(V++,H=null,x().following=!x().hasNewer&&h(B).scrollHeight-h(B).clientHeight-h(B).scrollTop<48),Ce=-1,Qe())}function nt(){V++,H=null,D(Ze,``)}async function rt(e){try{await x().loadEdge(e)}catch{}}async function it(){try{await x().latest()}catch{}}_(()=>{let e=h(B),t=h(Xe);if(!e||!t)return;x().beforeChange=e=>et(e),v(()=>et(x().anchor?`preserve`:`latest`,!1));let n=new ResizeObserver(()=>et(`preserve`,!1));n.observe(e);for(let t of e.querySelectorAll(`.reply-list, .thread-root`))n.observe(t);let r=()=>{document.visibilityState===`visible`&&et(`preserve`,!1)};return document.addEventListener(`visibilitychange`,r),()=>{x().beforeChange=void 0,n.disconnect(),document.removeEventListener(`visibilitychange`,r),V++,cancelAnimationFrame(Ye)}});let U=u(()=>l.editController?.session(z()));_(()=>{x().editingID=h(U)?.surface===`thread`?h(U).messageID:``});let W=new Map,at=e=>I()||!!l.currentUserID&&(e.author?.id||e.author_id)===l.currentUserID,ot=e=>!!l.currentUserID&&(e.author?.id||e.author_id)===l.currentUserID,st=e=>h(U)?.surface===`thread`&&h(U).messageID===e.id;async function ct(t){await e();let n=h(B)?.querySelector(`[data-message-id="${CSS.escape(t)}"]`),r=W.get(t)??n?.querySelector(`.thread-more-actions`);if(W.delete(t),r?.isConnected&&r.getClientRects().length>0){r.focus();return}n?.querySelector(`button[aria-label="Edit message"]`)?.focus()}function lt(e,t){t?W.set(e.id,t):W.delete(e.id),l.editController?.start(z(),e,`thread`)===`cancelled`&&ct(e.id)}function ut(e){l.editController?.cancel(z(),`thread`)&&ct(e.id)}async function dt(e){if(!l.editController)return;let t=await l.editController.save(z(),e,e=>l.onMessageEdited?.(e));(t===`saved`||t===`cancelled`)&&await ct(e.id)}let G=k(void 0),ft=k(void 0),pt=k(``),K=k(``),mt=k(``),ht=k(void 0),q=k(!1),J=k(``),Y,gt,_t,vt=0,X=!1;function yt(e){return`thread-message-action-sheet-${e.id}`}function bt(){Y!==void 0&&(window.clearTimeout(Y),Y=void 0)}function xt(){gt?.(),gt=void 0}function St(){_t!==void 0&&(window.clearTimeout(_t),_t=void 0)}function Ct(e,t){St(),vt+=1,D(G,e,!0),D(ft,t,!0),D(pt,``)}function Z(){St(),vt+=1,D(G,void 0)}function wt(e,t){if(e.pointerType!==`touch`||!e.isPrimary||e.button!==0||t.deleted_at||t.status===`pending`||t.status===`failed`||st(t)||e.target?.closest(`a, button, input, textarea, select, .attachment-grid, .media-tile, .markdown img, .gif-player, .markdown-table-scroll`))return;xt();let n=e.pointerId,r=e.clientX,i=e.clientY;Y=window.setTimeout(()=>{Y=void 0,Ct(t)},450);let a=e=>{e.pointerId===n&&(Math.abs(e.clientX-r)>10||Math.abs(e.clientY-i)>10)&&s()},o=e=>{e.pointerId===n&&s()},s=()=>{bt(),window.removeEventListener(`pointermove`,a),window.removeEventListener(`pointerup`,o),window.removeEventListener(`pointercancel`,o),gt===s&&(gt=void 0)};gt=s,window.addEventListener(`pointermove`,a),window.addEventListener(`pointerup`,o),window.addEventListener(`pointercancel`,o)}function Tt(e){(h(G)||Y!==void 0)&&e.preventDefault()}function Et(e){let t=h(G);Z(),t&&!O()&&l.currentUserID&&!l.reactionController.pending(t.id)&&l.reactionController.toggle(t,e)}function Dt(){let e=h(G);Z(),e&&l.onSetReplyTarget(e,`thread`)}async function Ot(){let e=h(G);if(!e)return;St();let t=vt;try{if(!navigator.clipboard)throw Error(`Clipboard unavailable`);if(await navigator.clipboard.writeText(e.body??``),X||h(G)?.id!==e.id)return;D(pt,`copied`),_t=window.setTimeout(()=>{_t=void 0,!X&&t===vt&&Z()},900)}catch{!X&&h(G)?.id===e.id&&D(pt,`failed`)}}async function kt(){if(!l.onCopyLink||h(K)===`pending`)return{copied:!1};D(K,`pending`);let e;try{e=await l.onCopyLink(l.root)}catch{return D(K,`failed`),{copied:!1}}try{if(!navigator.clipboard)throw Error(`Clipboard unavailable`);return await navigator.clipboard.writeText(e),D(K,``),{copied:!0}}catch{return D(K,``),{copied:!1,fallback:e}}}async function At(e){let t=await kt();(t.copied||t.fallback)&&(t.fallback?(D(ht,e,!0),D(mt,t.fallback,!0)):e?.focus({preventScroll:!0}))}async function jt(){let t=await kt();if(!t.copied&&!t.fallback)return;let n=h(ft);Z(),t.fallback&&(await e(),D(ht,n,!0),D(mt,t.fallback,!0))}function Mt(){let e=h(G),t=h(ft);Z(),e&<(e,t)}function Nt(){let e=h(G);Z(),e&&l.onDeleteMessage?.(e)}async function Pt(e){if(L()&&l.onTogglePin&&!h(q)){D(q,!0),D(J,``);try{await l.onTogglePin(e,R().has(e.id))}catch(e){D(J,M(e,`Could not update pin`),!0)}finally{D(q,!1)}}}async function Ft(){let e=h(G);e&&(await Pt(e),h(J)||Z())}ee(()=>{X=!0,St(),xt(),W.clear()});var It=Je(),Lt=T(It),Rt=y(Lt),zt=e=>{var t=Te();p(`click`,t,function(...e){l.onBack?.apply(this,e)}),s(e,t)};c(Rt,e=>{l.onBack&&e(zt)});var Bt=S(Rt,2),Vt=y(Bt),Ht=w(Vt,!0),Ut=S(Vt,2),Wt=w(Ut,!0),Gt=S(Ut,2),Kt=e=>{var t=Ee(),n=w(t,!0);E(()=>o(n,h(J))),s(e,t)};c(Gt,e=>{h(J)&&e(Kt)});var qt=S(Gt,2),Jt=e=>{var t=De();s(e,t)};c(qt,e=>{h(K)===`failed`&&e(Jt)}),n(Bt);var Yt=S(Bt,2),Xt=e=>{var t=Oe();E(()=>b(t,`href`,l.openHref)),s(e,t)};c(Yt,e=>{l.openHref&&e(Xt)});var Zt=S(Yt,2),Qt=e=>{var t=ke();p(`click`,t,function(...e){l.onClose?.apply(this,e)}),s(e,t)};c(Zt,e=>{l.onClose&&e(Qt)}),n(Lt);var Q=S(Lt,2),$=y(Q),$t=y($);{let e=u(()=>l.root.author?.id||l.root.author_id),t=u(()=>l.root.author?.display_name),n=u(()=>be(l.root.author)?void 0:l.root.author?.avatar_url);ye($t,{class:`avatar`,get id(){return h(e)},get name(){return h(t)},get src(){return h(n)},size:38})}var en=S($t,2),tn=y(en),nn=y(tn),rn=w(nn,!0),an=S(nn,2),on=e=>{var t=Ae();s(e,t)},sn=u(()=>be(l.root.author));c(an,e=>{h(sn)&&e(on)});var cn=S(an,2),ln=e=>{var t=je(),n=w(t,!0);E(e=>o(n,e),[()=>ve(_e(l.root.author))]),s(e,t)},un=u(()=>_e(l.root.author));c(cn,e=>{h(un)&&e(ln)});var dn=S(cn,2),fn=w(dn,!0),pn=S(dn,2),mn=e=>{var t=Ie(),n=T(t);{let e=u(()=>O()||!l.currentUserID),t=u(()=>l.reactionController.pending(l.root.id));we(n,{get messageId(){return l.root.id},get disabled(){return h(e)},get pending(){return h(t)},buttonClass:`thread-action-btn`,onToggle:e=>void l.reactionController.toggle(l.root,e)})}var r=S(n,2),i=S(r,2),a=e=>{var t=Me();E(()=>{b(t,`data-tooltip`,h(K)===`pending`?`Creating link…`:`Copy link`),t.disabled=h(K)===`pending`}),p(`click`,t,e=>void At(e.currentTarget)),s(e,t)};c(i,e=>{L()&&l.onCopyLink&&e(a)});var o=S(i,2),d=e=>{var t=Ne();E((e,n)=>{b(t,`aria-label`,e),b(t,`data-tooltip`,n),t.disabled=h(q)},[()=>R().has(l.root.id)?`Unpin message`:`Pin message`,()=>R().has(l.root.id)?`Unpin message`:`Pin message`]),p(`click`,t,()=>void Pt(l.root)),s(e,t)};c(o,e=>{L()&&l.onTogglePin&&e(d)});var f=S(o,2),m=e=>{var t=Pe();p(`click`,t,()=>lt(l.root)),s(e,t)},g=u(()=>ot(l.root)&&l.editController&&z());c(f,e=>{h(g)&&e(m)});var _=S(f,2),v=e=>{var t=Fe();E(e=>t.disabled=e,[()=>xe().has(l.root.id)]),p(`click`,t,()=>l.onDeleteMessage?.(l.root)),s(e,t)},y=u(()=>at(l.root)&&l.onDeleteMessage);c(_,e=>{h(y)&&e(v)});var x=S(_,2);E(e=>{b(x,`aria-controls`,e),b(x,`aria-expanded`,h(G)?.id===l.root.id)},[()=>yt(l.root)]),p(`click`,r,()=>l.onSetReplyTarget(l.root,`thread`)),p(`click`,x,e=>Ct(l.root,e.currentTarget)),s(e,t)},hn=u(()=>!l.root.deleted_at&&!st(l.root));c(pn,e=>{h(hn)&&e(mn)}),n(tn);var gn=S(tn,2),_n=e=>{var t=Le();s(e,t)},vn=e=>{ue(e,{get body(){return h(U).draft},get errorMessage(){return h(U).error},get saving(){return h(U).saving},onBody:e=>l.editController?.updateDraft(z(),e),onCancel:()=>ut(l.root),onSave:()=>dt(l.root)})},yn=u(()=>st(l.root)&&h(U)),bn=e=>{var r=ze(),i=T(r);t(i,()=>le(l.root.body),!0),n(i),d(i,e=>re?.(e)),d(i,(e,t)=>he?.(e,t),()=>({people:A(),attentionUserID:l.mentionAttentionUserID}));var a=S(i,2),o=e=>{var t=Re();E(e=>b(t,`title`,`Edited ${e??``}`),[()=>se(l.root.edited_at)]),s(e,t)};c(a,e=>{l.root.edited_at&&e(o)});var f=S(a,2);{let e=u(()=>l.reactionController.reactionsFor(l.root)),t=u(()=>l.reactionController.pending(l.root.id)),n=u(()=>l.reactionController.error(l.root.id)),r=u(()=>O()||!l.currentUserID);pe(f,{get messageId(){return l.root.id},get reactions(){return h(e)},get pending(){return h(t)},get error(){return h(n)},get disabled(){return h(r)},onToggle:e=>void l.reactionController.toggle(l.root,e)})}s(e,r)};c(gn,e=>{l.root.deleted_at?e(_n):h(yn)?e(vn,1):e(bn,-1)});var xn=S(gn,2),Sn=e=>{var t=Be();C(t,21,()=>l.root.attachments,e=>e.id,(e,t)=>{{let n=u(()=>ne(h(t)));fe(e,{get upload(){return h(t)},get url(){return h(n)},get onOpenImage(){return l.onOpenImage},get onOpenArtifact(){return l.onOpenArtifact}})}}),n(t),s(e,t)};c(xn,e=>{!l.root.deleted_at&&l.root.attachments?.length&&e(Sn)}),n(en),n($);var Cn=S($,2),wn=y(Cn),Tn=w(wn);n(Cn);var En=S(Cn,2),Dn=e=>{var t=He(),r=y(t),i=e=>{oe(e,{direction:`older`,rows:1})};c(r,e=>{x().loading.older&&e(i)});var a=S(r,2),l=e=>{var t=Ve(),n=w(t,!0);E(()=>o(n,x().edgeError.older)),s(e,t)};c(a,e=>{x().edgeError.older&&e(l)});var u=S(a,2),d=w(u,!0);n(t),E(()=>{u.disabled=x().loading.older,o(d,x().edgeError.older?`Retry older replies`:`Load older replies`)}),p(`click`,u,()=>void rt(`older`)),s(e,t)};c(En,e=>{(x().hasOlder||x().loading.older||x().edgeError.older)&&e(Dn)});var On=S(En,2);C(On,21,()=>l.replies,e=>e.id,(e,i)=>{var a=Ge();let f;var m=y(a);{let e=u(()=>h(i).author?.id||h(i).author_id),t=u(()=>h(i).author?.display_name),n=u(()=>be(h(i).author)?void 0:h(i).author?.avatar_url);ye(m,{class:`avatar small`,get id(){return h(e)},get name(){return h(t)},get src(){return h(n)},size:30})}var g=S(m,2),_=y(g),v=y(_),x=w(v,!0),ee=S(v,2),te=e=>{var t=Ae();s(e,t)},D=u(()=>be(h(i).author));c(ee,e=>{h(D)&&e(te)});var k=S(ee,2),j=e=>{var t=je(),n=w(t,!0);E(e=>o(n,e),[()=>ve(_e(h(i).author))]),s(e,t)},M=u(()=>_e(h(i).author));c(k,e=>{h(M)&&e(j)});var ie=S(k,2),ae=w(ie,!0),N=S(ie,2),oe=e=>{var t=Ue(),n=T(t);{let e=u(()=>O()||!l.currentUserID),t=u(()=>l.reactionController.pending(h(i).id));we(n,{get messageId(){return h(i).id},get disabled(){return h(e)},get pending(){return h(t)},buttonClass:`thread-action-btn`,onToggle:e=>void l.reactionController.toggle(h(i),e)})}var r=S(n,2),a=S(r,2),o=e=>{var t=Ne();E((e,n)=>{b(t,`aria-label`,e),b(t,`data-tooltip`,n),t.disabled=h(q)},[()=>R().has(h(i).id)?`Unpin message`:`Pin message`,()=>R().has(h(i).id)?`Unpin message`:`Pin message`]),p(`click`,t,()=>void Pt(h(i))),s(e,t)};c(a,e=>{L()&&l.onTogglePin&&e(o)});var d=S(a,2),f=e=>{var t=Pe();E(()=>t.disabled=h(i).status===`pending`||h(i).status===`failed`),p(`click`,t,()=>lt(h(i))),s(e,t)},m=u(()=>ot(h(i))&&l.editController&&z());c(d,e=>{h(m)&&e(f)});var g=S(d,2),_=e=>{var t=Fe();E(e=>t.disabled=e,[()=>xe().has(h(i).id)]),p(`click`,t,()=>l.onDeleteMessage?.(h(i))),s(e,t)},v=u(()=>at(h(i))&&l.onDeleteMessage);c(g,e=>{h(v)&&e(_)});var y=S(g,2);E(e=>{b(y,`aria-controls`,e),b(y,`aria-expanded`,h(G)?.id===h(i).id),y.disabled=h(i).status===`pending`||h(i).status===`failed`},[()=>yt(h(i))]),p(`click`,r,()=>l.onSetReplyTarget(h(i),`thread`)),p(`click`,y,e=>Ct(h(i),e.currentTarget)),s(e,t)},ce=u(()=>!h(i).deleted_at&&!st(h(i)));c(N,e=>{h(ce)&&e(oe)}),n(_);var P=S(_,2),F=e=>{var t=Le();s(e,t)},de=e=>{ue(e,{get body(){return h(U).draft},get errorMessage(){return h(U).error},get saving(){return h(U).saving},onBody:e=>l.editController?.updateDraft(z(),e),onCancel:()=>ut(h(i)),onSave:()=>dt(h(i))})},ge=u(()=>st(h(i))&&h(U)),I=e=>{var r=We(),a=T(r);me(a,{get message(){return h(i)},get onJump(){return l.onJumpToQuote}});var o=S(a,2);t(o,()=>le(h(i).body),!0),n(o),d(o,e=>re?.(e)),d(o,(e,t)=>he?.(e,t),()=>({people:A(),attentionUserID:l.mentionAttentionUserID}));var f=S(o,2),p=e=>{var t=Re();E(e=>b(t,`title`,`Edited ${e??``}`),[()=>se(h(i).edited_at)]),s(e,t)};c(f,e=>{h(i).edited_at&&e(p)});var m=S(f,2);{let e=u(()=>l.reactionController.reactionsFor(h(i))),t=u(()=>l.reactionController.pending(h(i).id)),n=u(()=>l.reactionController.error(h(i).id)),r=u(()=>O()||!l.currentUserID);pe(m,{get messageId(){return h(i).id},get reactions(){return h(e)},get pending(){return h(t)},get error(){return h(n)},get disabled(){return h(r)},onToggle:e=>void l.reactionController.toggle(h(i),e)})}s(e,r)};c(P,e=>{h(i).deleted_at?e(F):h(ge)?e(de,1):e(I,-1)});var B=S(P,2),V=e=>{var t=Be();C(t,21,()=>h(i).attachments,e=>e.id,(e,t)=>{{let n=u(()=>ne(h(t)));fe(e,{get upload(){return h(t)},get url(){return h(n)},get onOpenImage(){return l.onOpenImage},get onOpenArtifact(){return l.onOpenArtifact}})}}),n(t),s(e,t)};c(B,e=>{!h(i).deleted_at&&h(i).attachments?.length&&e(V)}),n(g),n(a),E(e=>{f=r(a,1,`reply`,null,f,{"thread-target":h(Ze)===h(i).id}),b(a,`data-message-id`,h(i).id),o(x,h(i).author?.display_name||`Local User`),o(ae,e)},[()=>se(h(i).created_at)]),p(`pointerdown`,a,e=>wt(e,h(i))),p(`contextmenu`,a,Tt),s(e,a)}),n(On);var kn=S(On,2),An=e=>{var t=He(),r=y(t),i=e=>{oe(e,{direction:`newer`,rows:1})};c(r,e=>{x().loading.newer&&e(i)});var a=S(r,2),l=e=>{var t=Ve(),n=w(t,!0);E(()=>o(n,x().edgeError.newer)),s(e,t)};c(a,e=>{x().edgeError.newer&&e(l)});var u=S(a,2),d=w(u,!0);n(t),E(()=>{u.disabled=x().loading.newer,o(d,x().edgeError.newer?`Retry newer replies`:`Load newer replies`)}),p(`click`,u,()=>void rt(`newer`)),s(e,t)};c(kn,e=>{(x().hasNewer||x().loading.newer||x().edgeError.newer)&&e(An)}),n(Q),te(Q,e=>D(B,e),()=>h(B));var jn=S(Q,2),Mn=e=>{var t=Ke(),n=w(t);p(`click`,n,()=>void it()),s(e,t)};c(jn,e=>{(x().hasNewer||!x().following||x().error)&&e(Mn)});var Nn=S(jn,2),Pn=e=>{{let t=u(()=>yt(h(G))),n=u(()=>!!l.currentUserID&&!O()&&!l.reactionController.pending(h(G).id)),r=u(()=>!N()),i=u(()=>ot(h(G))&&!!l.editController&&!!z()),a=u(()=>!!(L()&&l.onTogglePin)),o=u(()=>R().has(h(G).id)),s=u(()=>at(h(G))&&!!l.onDeleteMessage),c=u(()=>xe().has(h(G).id)),d=u(()=>h(G).id===l.root.id&&!!(L()&&l.onCopyLink));de(e,{get id(){return h(t)},get canReact(){return h(n)},get canReply(){return h(r)},showOpenThread:!1,get canEdit(){return h(i)},get canPin(){return h(a)},get pinned(){return h(o)},get pinning(){return h(q)},get pinError(){return h(J)},get canDelete(){return h(s)},get deleting(){return h(c)},get copyStatus(){return h(pt)},get canCopyLink(){return h(d)},get copyLinkStatus(){return h(K)},onReact:Et,onOpenThread:()=>{},onReply:Dt,onCopy:Ot,onCopyLink:jt,onEdit:Mt,onTogglePin:Ft,onDelete:Nt,onClose:Z,get returnFocus(){return h(ft)}})}};c(Nn,e=>{h(G)&&e(Pn)});var Fn=S(Nn,2),In=e=>{ae(e,{get url(){return h(mt)},onClose:()=>D(mt,``),get returnFocus(){return h(ht)}})};c(Fn,e=>{h(mt)&&e(In)});var Ln=S(Fn,2),Rn=y(Ln);Se(Rn,{get active(){return j()},get agentNames(){return ie()}});var zn=S(Rn,2),Bn=e=>{var t=qe(),n=w(t,!0);E(()=>o(n,P())),s(e,t)};c(zn,e=>{P()&&e(Bn)});var Vn=S(zn,2);{let e=u(()=>N()?`No active recipient`:`Reply in thread`),t=u(()=>N()||ce());ge(Vn,{get value(){return l.replyBody},get placeholder(){return h(e)},ariaLabel:`Reply body`,submitLabel:`Reply`,formClass:`composer reply-composer`,get disabled(){return h(t)},get replyTarget(){return l.replyTarget},get mentionPeople(){return A()},get onValue(){return l.onReplyBody},get onSubmit(){return l.onSubmitReply},get onKeydown(){return l.onReplyKeydown},get onFocus(){return l.onReplyFocus},get onInputRef(){return l.onReplyInputRef},get onClearReply(){return l.onClearReply}})}n(Ln),E(e=>{o(Ht,F()),o(Wt,l.headerDetail??`${l.threadState?.reply_count??l.replies.length} ${(l.threadState?.reply_count??l.replies.length)===1?`reply`:`replies`}`),b($,`data-message-id`,l.root.id),o(rn,l.root.author?.display_name||`Local User`),o(fn,e),o(Tn,`${l.replies.length??``} of ${l.threadState?.reply_count??l.replies.length??``} replies loaded`)},[()=>se(l.root.created_at)]),m(`scroll`,Q,tt),m(`wheel`,Q,nt),p(`touchstart`,Q,nt,void 0,!0),p(`keydown`,Q,nt),p(`pointerdown`,Q,()=>{nt(),l.onActivateThreadComposer()}),p(`pointerup`,Q,function(...e){l.onInlineImagePointerUp?.apply(this,e)}),p(`pointerdown`,$,e=>wt(e,l.root)),p(`contextmenu`,$,Tt),s(a,It),f()}a([`click`,`touchstart`,`keydown`,`pointerdown`,`pointerup`,`contextmenu`]);export{Se as n,B as r,Ye as t}; \ No newline at end of file +import{$ as e,A as t,At as n,C as r,Et as i,H as a,I as o,L as s,P as c,R as l,St as u,T as d,Tt as f,U as p,W as m,Y as h,a as g,ct as _,et as v,ft as y,g as b,gt as x,ht as S,j as C,mt as w,n as ee,pt as T,st as E,u as te,vt as D,w as O,yt as k,z as A}from"./BTIB_WQZ.js";import"./xihTtKlq.js";import{n as j,u as M}from"./DEPNME54.js";import{C as ne,L as re,O as ie,a as ae,c as N,d as oe,h as se,i as ce,j as P,k as F,m as le,n as ue,o as de,r as fe,s as pe,t as me,u as he,x as ge}from"./BNjDjM6i.js";import{f as _e,l as ve,t as ye,u as be}from"./ByQ3bZN5.js";var I=300,xe=200,L=100,R=50,z=e=>e.thread_seq??0,B=class{context;committed;#e=k(null);get root(){return h(this.#e)}set root(e){D(this.#e,e,!0)}#t=k(x([]));get replies(){return h(this.#t)}set replies(e){D(this.#t,e,!0)}#n=k(null);get state(){return h(this.#n)}set state(e){D(this.#n,e,!0)}#r=k(``);get error(){return h(this.#r)}set error(e){D(this.#r,e,!0)}#i=k(null);get selection(){return h(this.#i)}set selection(e){D(this.#i,e)}#a=k(!1);get hasOlder(){return h(this.#a)}set hasOlder(e){D(this.#a,e,!0)}#o=k(!1);get hasNewer(){return h(this.#o)}set hasNewer(e){D(this.#o,e,!0)}#s=k(x({older:!1,newer:!1}));get loading(){return h(this.#s)}set loading(e){D(this.#s,e,!0)}#c=k(x({older:``,newer:``}));get edgeError(){return h(this.#c)}set edgeError(e){D(this.#c,e,!0)}#l=k(!0);get following(){return h(this.#l)}set following(e){D(this.#l,e,!0)}anchor=null;editingID=``;beforeChange;#u=k(x(new Map));get drafts(){return h(this.#u)}set drafts(e){D(this.#u,e,!0)}window=0;revision=0;rowRevisions=new Map;pageMutations=new Set;edgeOwners={};knownTail=0;initialized=!1;coveredStateEvent=!1;constructor(e,t){this.context=e,this.committed=t}get draft(){return this.selection?this.drafts.get(this.selection.messageID):void 0}select(e,t){return this.selection?.messageID===e&&this.isCurrent(this.selection)?this.selection:(this.close(),this.selection={messageID:e,context:this.context()},this.root=t??null,this.state=t?.thread_state??null,this.selection)}isCurrent(e){return e!==null&&this.selection===e&&e.context===this.context()}close(){this.selection=null,this.window++,this.rowRevisions.clear(),this.pageMutations.clear(),this.edgeOwners={},this.knownTail=0,this.root=null,this.replies=[],this.state=null,this.error=``,this.hasOlder=this.hasNewer=!1,this.loading={older:!1,newer:!1},this.edgeError={older:``,newer:``},this.initialized=this.coveredStateEvent=!1,this.following=!0,this.anchor=null,this.editingID=``}owner(e=()=>!0){let t=this.selection,n=this.window;return{selection:t,current:()=>this.isCurrent(t)&&this.window===n&&e()}}async request(e,t){let n=new URLSearchParams(Object.entries(t).map(([e,t])=>[e,String(t)])),r=new Map;this.pageMutations.add(r);try{let t=await j(`/api/messages/${e.messageID}/thread?${n}`);if(r.size>I)throw Error(`Too many replies changed while loading. Please try again.`);let i=e=>{let t=r.get(e.id);return t?F(e,t):e};return t.root=i(t.root),t.replies=t.replies.map(i),t}finally{this.pageMutations.delete(r)}}mergeSnapshot(e,t,n){return t?(this.rowRevisions.get(e.id)??0)>n?F(e,t):F(t,e):e}metadata(e,t){this.root=this.mergeSnapshot(e.root,this.root,t),this.rowRevisions.set(e.root.id,++this.revision),this.knownTail=Math.max(this.knownTail,e.newest_seq),this.reconcileState(e.thread_state),this.error=``,this.committed([e.root,...e.replies])}reconcileState(e){this.state=ie(this.state,e),this.root&&={...this.root,thread_state:this.state}}merge(e,t,n,r=`preserve`){this.beforeChange?.(r);let i=new Map(this.replies.map(e=>[e.id,e]));for(let n of e)i.set(n.id,this.mergeSnapshot(n,i.get(n.id),t)),this.rowRevisions.set(n.id,++this.revision);let a=[...i.values()].sort((e,t)=>z(e)-z(t));if(a.length>I){let e=n===`older`?0:a.length-xe,t=Math.min(a.length,e+xe),r=[this.following?``:this.anchor?.messageID,this.editingID].map(e=>a.findIndex(t=>t.id===e)).filter(e=>e>=0);r.length&&(e=Math.min(e,...r),t=Math.max(t,...r.map(e=>e+1)),t-e>I&&(n===`newer`?t=e+I:e=t-I)),e>0&&(this.hasOlder=!0),te.id)]);for(let t of this.rowRevisions.keys())e.has(t)||this.rowRevisions.delete(t)}selectWindow(){this.window++,this.pageMutations.clear(),this.edgeOwners={},this.loading={older:!1,newer:!1},this.edgeError={older:``,newer:``}}async open(e=()=>!0){return this.initialized&&this.isCurrent(this.selection)?e():this.latest(e)}async latest(e=()=>!0){return this.selectWindow(),this.replace({latest:!0,limit:L},`latest`,e)}async replace(e,t,n){let{selection:r,current:i}=this.owner(n),a=this.revision;if(!r||!i())return!1;try{let n=await this.request(r,e);if(!i())return!1;this.beforeChange?.(t);let o=new Map(this.replies.map(e=>[e.id,e])),s=n.replies.map(e=>this.mergeSnapshot(e,o.get(e.id),a));t===`latest`&&n.replies.some(e=>o.has(e.id))&&(s=[...s,...this.replies.filter(e=>z(e)>n.newest_seq)]),this.replies=s.slice(-300);for(let e of this.replies)this.rowRevisions.set(e.id,++this.revision);return this.pruneRevisions(),this.hasOlder=n.has_older||s.length>this.replies.length,this.hasNewer=n.has_newer||z(this.replies.at(-1)??{})!0){this.selectWindow();let n=this.owner(t);if(!n.selection||!n.current())return!1;try{let t=this.root?.id===e.messageID?this.root:this.replies.find(t=>t.id===e.messageID);if(t){if(t.deleted_at)throw Error(`This message was deleted.`);return this.following=!1,this.beforeChange?.(e),!0}let r=e.threadSeq;if(!r){let t=(await j(`/api/messages/${e.messageID}`)).message;if(!n.current())return!1;if(t.thread_root_id!==n.selection.messageID||!t.thread_seq||t.deleted_at)throw Error(`This reply is no longer available in this thread.`);r=t.thread_seq}if(!n.current()||!await this.replace({around_seq:r,limit:L},e,n.current))return!1;if(!this.replies.some(t=>t.id===e.messageID&&!t.deleted_at))throw Error(`This reply is no longer available.`);return this.following=!1,!0}catch(e){return n.current()&&(this.error=M(e,`Could not open this reply.`)),!1}}async loadEdge(e,t=()=>!0,n=R){if(this.loading[e])return!1;let{selection:r,current:i}=this.owner(t),a=this.revision;if(!r||!i())return!1;let o=z(e===`older`?this.replies[0]??{}:this.replies.at(-1)??{}),s={};this.edgeOwners[e]=s,this.loading[e]=!0,this.edgeError[e]=``;try{let t=await this.request(r,{[e===`older`?`before_seq`:`after_seq`]:o,limit:n});return!i()||(this.metadata(t,a),o&&!this.replies.some(e=>z(e)===o))?!1:(e===`older`?this.hasOlder=t.has_older:this.hasNewer=t.has_newer,this.merge(t.replies,a,e),!0)}catch(t){if(!i())return!1;throw this.edgeError[e]=M(t,`Could not load ${e} replies.`),t}finally{this.edgeOwners[e]===s&&(delete this.edgeOwners[e],this.loading[e]=!1)}}async refresh(e=()=>!0){if(!this.initialized)return this.open(e);let{selection:t,current:n}=this.owner(e),r=this.revision;if(!t||!n())return!1;if(!this.replies.length)return this.latest(e);let i=z(this.replies.at(-1)),a=z(this.replies[0])-1;try{for(;az(e)<=i),r,`newer`),e.newest_seq<=a)break;a=e.newest_seq,this.hasNewer=e.has_newer||e.newest_seq>i}return this.following&&await this.catchUp(e),n()}catch(e){if(!n())return!1;throw this.error=M(e,`Could not refresh the thread.`),e}}async catchUp(e){let{selection:t,current:n}=this.owner(e),r=this.revision;if(!t||!n())return;let i=await this.request(t,{latest:!0,limit:1});if(n()){if(this.metadata(i,r),z(this.replies.at(-1)??{})>=i.newest_seq){this.hasNewer=!1;return}if(!this.hasNewer||this.following){for(let e=0;n()&&z(this.replies.at(-1)??{})=I);e+=R);n()&&z(this.replies.at(-1)??{})e.id===n))||!this.isCurrent(this.selection))return!1;let r=this.owner(t);try{if(e.type===`thread.reply_created`)await this.catchUp(t),r.current()&&(this.coveredStateEvent=!0);else if(e.type===`thread.state_updated`)this.coveredStateEvent?this.coveredStateEvent=!1:await this.catchUp(t);else if((e.type===`message.updated`||e.type===`message.deleted`)&&n){let{current:e}=this.owner(t),r=this.revision,i=await j(`/api/messages/${n}`);if(e()){let e=this.root?.id===n?this.root:this.replies.find(e=>e.id===n);this.updateMessage(this.mergeSnapshot(i.message,e,r))}}else return!1;return!0}catch(e){if(r.current())throw e;return!1}}updateDraft(e){let t=this.selection?.messageID;t&&!this.draft?.sending&&this.patchDraft(t,{body:e,error:``})}setQuote(e){let t=this.selection?.messageID;t&&!this.draft?.sending&&this.patchDraft(t,{quote:e})}patchDraft(e,t){let n={body:``,quote:null,sending:!1,error:``,...this.drafts.get(e),...t},r=new Map(this.drafts);!n.body&&!n.quote&&!n.sending&&!n.error?r.delete(e):r.set(e,n),this.drafts=r}updateAuthor(e){for(let t of this.root?[this.root,...this.replies]:this.replies)t.author?.id===e.id&&this.updateMessage({id:t.id,thread_root_id:t.thread_root_id,author:e})}updateMessage(e){if(e.deleted_at&&this.draft?.quote?.id===e.id&&this.setQuote(null),e.thread_root_id===this.selection?.messageID){for(let t of this.pageMutations)if(t.size<=I){let n=t.get(e.id);t.set(e.id,n?F(n,e):e)}this.beforeChange?.(`preserve`),this.rowRevisions.set(e.id,++this.revision),this.replies=this.replies.map(t=>t.id===e.id?F(t,e):t),this.root?.id===e.id&&(this.root=F(this.root,e)),this.pruneRevisions(),this.committed()}}async send(e){let{selection:t,current:n}=this.owner(),r=this.draft,i=r?.body.trim();if(!this.isCurrent(t)||!this.root||!r||!i||r.sending)return;let a=r.quote?.id,o=r.submission?.body===i&&r.submission.quotedMessageID===a?r.submission:{body:i,quotedMessageID:a,nonce:P()};this.patchDraft(t.messageID,{sending:!0,error:``,submission:o});try{let e=await j(`/api/messages/${t.messageID}/thread/replies`,{method:`POST`,body:JSON.stringify({body:i,nonce:o.nonce,quoted_message_id:a})});if(this.patchDraft(t.messageID,{body:``,quote:null,submission:void 0}),this.selection?.messageID!==t.messageID||!this.isCurrent(this.selection)||(this.revision++,this.reconcileState(e.thread_state),this.committed(),!n()))return;!this.hasNewer&&!this.replies.some(t=>t.id===e.message.id)&&z(e.message)===z(this.replies.at(-1)??{})+1&&this.merge([e.message],this.revision,`newer`,`latest`);try{await this.latest()}catch{}}catch(n){this.patchDraft(t.messageID,{error:M(n,`Could not post the reply.`)}),this.isCurrent(t)&&e?.(n)}finally{this.patchDraft(t.messageID,{sending:!1})}}},V=A(`
                `);function Se(e,t){i(t,!0);let r=g(t,`agentNames`,19,()=>[]),a=u(()=>r().length===1?`${r()[0]} is responding…`:r().length===2?`${r()[0]} and ${r()[1]} are responding…`:r().length>2?`Several agents are responding…`:`Agent is responding…`);var d=l(),p=T(d),m=e=>{var t=V(),r=S(y(t),2),i=w(r,!0);n(t),E(()=>o(i,h(a))),s(e,t)};c(p,e=>{t.active&&e(m)}),s(e,d),f()}var Ce=A(`
                `);function we(e,t){i(t,!0);let a=g(t,`disabled`,3,!1),o=g(t,`pending`,3,!1),l=g(t,`buttonClass`,3,``),d=k(!1),m=k(!1),v=k(void 0),x=k(void 0),C=u(()=>`add-reaction-picker-${t.messageId}`);function w(){a()||o()||(h(d)||D(m,ce(h(v),130),!0),D(d,!h(d)))}function ee(e){a()||o()||(t.onToggle(e),D(d,!1))}function T(){D(d,!1),h(x)?.focus()}function A(e){h(v)&&!h(v).contains(e.target)&&D(d,!1)}_(()=>{if(h(d))return document.addEventListener(`click`,A),()=>document.removeEventListener(`click`,A)}),_(()=>{(a()||o())&&D(d,!1)});var j=Ce(),M=y(j);te(M,e=>D(x,e),()=>h(x));var ne=S(M,2),re=e=>{{let t=u(()=>h(m)?`above-right`:`below`),n=u(()=>a()||o());N(e,{get id(){return h(C)},get placement(){return h(t)},get disabled(){return h(n)},onPick:ee,onEscape:T})}};c(ne,e=>{h(d)&&e(re)}),n(j),te(j,e=>D(v,e),()=>h(v)),E(()=>{r(M,1,O(l()),`svelte-sk6gxl`),b(M,`aria-controls`,h(C)),b(M,`aria-expanded`,h(d)),M.disabled=a()||o()}),p(`click`,M,w),s(e,j),f()}a([`click`]);var Te=A(``),Ee=A(` `),De=A(`Couldn't create link`),Oe=A(`Open in ClickClack`),ke=A(``),Ae=A(`deleted bot`),je=A(` `),Me=A(``),Ne=A(``),Pe=A(``),Fe=A(``),Ie=A(` `,1),Le=A(`
                This message was deleted.
                `),Re=A(`(edited)`),ze=A(`
                `,1),Be=A(`
                `),Ve=A(`

                `),He=A(`
                `),Ue=A(` `,1),We=A(`
                `,1),Ge=A(`
                `),Ke=A(`
                `),qe=A(``),Je=A(`

                `,1);function Ye(a,l){i(l,!0);let x=g(l,`history`,7),O=g(l,`reactionsDisabled`,3,!1),A=g(l,`mentionPeople`,19,()=>[]),j=g(l,`agentResponding`,3,!1),ie=g(l,`respondingAgentNames`,19,()=>[]),N=g(l,`replyDisabled`,3,!1),ce=g(l,`replySending`,3,!1),P=g(l,`replyError`,3,``),F=g(l,`headerLabel`,3,`Thread`),I=g(l,`canDeleteAnyMessage`,3,!1),xe=g(l,`deletingMessageIDs`,19,()=>new Set),L=g(l,`channelID`,3,``),R=g(l,`pinnedMessageIDs`,19,()=>new Set),z=g(l,`editScope`,3,``),B=k(void 0),V=0,Ce=-1,Ye=0,H=null,Xe=u(()=>l.root.id),Ze=k(``);function Qe(){if(!h(B))return;let e=h(B).getBoundingClientRect().top,t=[...h(B).querySelectorAll(`[data-message-id]`)].find(t=>t.getBoundingClientRect().bottom>e);t&&(x().anchor={messageID:t.dataset.messageId,offset:t.getBoundingClientRect().top-e})}function $e(e){if(h(B)&&h(B).getClientRects().length){if(e===`latest`||e===`preserve`&&x().following)h(B).scrollTop=h(B).scrollHeight;else{let t=e===`preserve`?x().anchor?.messageID:e.messageID,n=t?h(B).querySelector(`[data-message-id="${CSS.escape(t)}"]`):null;if(n){let r=n.getBoundingClientRect().top-h(B).getBoundingClientRect().top,i=e===`preserve`?x().anchor?.offset??0:(h(B).clientHeight-n.offsetHeight)/2;h(B).scrollTop+=r-i,e!==`preserve`&&D(Ze,t,!0)}}Ce=h(B).scrollTop,Qe()}}function et(t,n=!0){if(t===`preserve`&&H&&H!==`preserve`)return;H=t,n&&Qe();let r=++V;e().then(()=>{r!==V||X||(cancelAnimationFrame(Ye),Ye=requestAnimationFrame(()=>{r===V&&!X&&($e(t),H=null)}))})}function tt(){h(B)&&!H&&(Math.abs(h(B).scrollTop-Ce)>1&&(V++,H=null,x().following=!x().hasNewer&&h(B).scrollHeight-h(B).clientHeight-h(B).scrollTop<48),Ce=-1,Qe())}function nt(){V++,H=null,D(Ze,``)}async function rt(e){try{await x().loadEdge(e)}catch{}}async function it(){try{await x().latest()}catch{}}_(()=>{let e=h(B),t=h(Xe);if(!e||!t)return;x().beforeChange=e=>et(e),v(()=>et(x().anchor?`preserve`:`latest`,!1));let n=new ResizeObserver(()=>et(`preserve`,!1));n.observe(e);for(let t of e.querySelectorAll(`.reply-list, .thread-root`))n.observe(t);let r=()=>{document.visibilityState===`visible`&&et(`preserve`,!1)};return document.addEventListener(`visibilitychange`,r),()=>{x().beforeChange=void 0,n.disconnect(),document.removeEventListener(`visibilitychange`,r),V++,cancelAnimationFrame(Ye)}});let U=u(()=>l.editController?.session(z()));_(()=>{x().editingID=h(U)?.surface===`thread`?h(U).messageID:``});let W=new Map,at=e=>I()||!!l.currentUserID&&(e.author?.id||e.author_id)===l.currentUserID,ot=e=>!!l.currentUserID&&(e.author?.id||e.author_id)===l.currentUserID,st=e=>h(U)?.surface===`thread`&&h(U).messageID===e.id;async function ct(t){await e();let n=h(B)?.querySelector(`[data-message-id="${CSS.escape(t)}"]`),r=W.get(t)??n?.querySelector(`.thread-more-actions`);if(W.delete(t),r?.isConnected&&r.getClientRects().length>0){r.focus();return}n?.querySelector(`button[aria-label="Edit message"]`)?.focus()}function lt(e,t){t?W.set(e.id,t):W.delete(e.id),l.editController?.start(z(),e,`thread`)===`cancelled`&&ct(e.id)}function ut(e){l.editController?.cancel(z(),`thread`)&&ct(e.id)}async function dt(e){if(!l.editController)return;let t=await l.editController.save(z(),e,e=>l.onMessageEdited?.(e));(t===`saved`||t===`cancelled`)&&await ct(e.id)}let G=k(void 0),ft=k(void 0),pt=k(``),K=k(``),mt=k(``),ht=k(void 0),q=k(!1),J=k(``),Y,gt,_t,vt=0,X=!1;function yt(e){return`thread-message-action-sheet-${e.id}`}function bt(){Y!==void 0&&(window.clearTimeout(Y),Y=void 0)}function xt(){gt?.(),gt=void 0}function St(){_t!==void 0&&(window.clearTimeout(_t),_t=void 0)}function Ct(e,t){St(),vt+=1,D(G,e,!0),D(ft,t,!0),D(pt,``)}function Z(){St(),vt+=1,D(G,void 0)}function wt(e,t){if(e.pointerType!==`touch`||!e.isPrimary||e.button!==0||t.deleted_at||t.status===`pending`||t.status===`failed`||st(t)||e.target?.closest(`a, button, input, textarea, select, .attachment-grid, .media-tile, .markdown img, .gif-player, .markdown-table-scroll`))return;xt();let n=e.pointerId,r=e.clientX,i=e.clientY;Y=window.setTimeout(()=>{Y=void 0,Ct(t)},450);let a=e=>{e.pointerId===n&&(Math.abs(e.clientX-r)>10||Math.abs(e.clientY-i)>10)&&s()},o=e=>{e.pointerId===n&&s()},s=()=>{bt(),window.removeEventListener(`pointermove`,a),window.removeEventListener(`pointerup`,o),window.removeEventListener(`pointercancel`,o),gt===s&&(gt=void 0)};gt=s,window.addEventListener(`pointermove`,a),window.addEventListener(`pointerup`,o),window.addEventListener(`pointercancel`,o)}function Tt(e){(h(G)||Y!==void 0)&&e.preventDefault()}function Et(e){let t=h(G);Z(),t&&!O()&&l.currentUserID&&!l.reactionController.pending(t.id)&&l.reactionController.toggle(t,e)}function Dt(){let e=h(G);Z(),e&&l.onSetReplyTarget(e,`thread`)}async function Ot(){let e=h(G);if(!e)return;St();let t=vt;try{if(!navigator.clipboard)throw Error(`Clipboard unavailable`);if(await navigator.clipboard.writeText(e.body??``),X||h(G)?.id!==e.id)return;D(pt,`copied`),_t=window.setTimeout(()=>{_t=void 0,!X&&t===vt&&Z()},900)}catch{!X&&h(G)?.id===e.id&&D(pt,`failed`)}}async function kt(){if(!l.onCopyLink||h(K)===`pending`)return{copied:!1};D(K,`pending`);let e;try{e=await l.onCopyLink(l.root)}catch{return D(K,`failed`),{copied:!1}}try{if(!navigator.clipboard)throw Error(`Clipboard unavailable`);return await navigator.clipboard.writeText(e),D(K,``),{copied:!0}}catch{return D(K,``),{copied:!1,fallback:e}}}async function At(e){let t=await kt();(t.copied||t.fallback)&&(t.fallback?(D(ht,e,!0),D(mt,t.fallback,!0)):e?.focus({preventScroll:!0}))}async function jt(){let t=await kt();if(!t.copied&&!t.fallback)return;let n=h(ft);Z(),t.fallback&&(await e(),D(ht,n,!0),D(mt,t.fallback,!0))}function Mt(){let e=h(G),t=h(ft);Z(),e&<(e,t)}function Nt(){let e=h(G);Z(),e&&l.onDeleteMessage?.(e)}async function Pt(e){if(L()&&l.onTogglePin&&!h(q)){D(q,!0),D(J,``);try{await l.onTogglePin(e,R().has(e.id))}catch(e){D(J,M(e,`Could not update pin`),!0)}finally{D(q,!1)}}}async function Ft(){let e=h(G);e&&(await Pt(e),h(J)||Z())}ee(()=>{X=!0,St(),xt(),W.clear()});var It=Je(),Lt=T(It),Rt=y(Lt),zt=e=>{var t=Te();p(`click`,t,function(...e){l.onBack?.apply(this,e)}),s(e,t)};c(Rt,e=>{l.onBack&&e(zt)});var Bt=S(Rt,2),Vt=y(Bt),Ht=w(Vt,!0),Ut=S(Vt,2),Wt=w(Ut,!0),Gt=S(Ut,2),Kt=e=>{var t=Ee(),n=w(t,!0);E(()=>o(n,h(J))),s(e,t)};c(Gt,e=>{h(J)&&e(Kt)});var qt=S(Gt,2),Jt=e=>{var t=De();s(e,t)};c(qt,e=>{h(K)===`failed`&&e(Jt)}),n(Bt);var Yt=S(Bt,2),Xt=e=>{var t=Oe();E(()=>b(t,`href`,l.openHref)),s(e,t)};c(Yt,e=>{l.openHref&&e(Xt)});var Zt=S(Yt,2),Qt=e=>{var t=ke();p(`click`,t,function(...e){l.onClose?.apply(this,e)}),s(e,t)};c(Zt,e=>{l.onClose&&e(Qt)}),n(Lt);var Q=S(Lt,2),$=y(Q),$t=y($);{let e=u(()=>l.root.author?.id||l.root.author_id),t=u(()=>l.root.author?.display_name),n=u(()=>be(l.root.author)?void 0:l.root.author?.avatar_url);ye($t,{class:`avatar`,get id(){return h(e)},get name(){return h(t)},get src(){return h(n)},size:38})}var en=S($t,2),tn=y(en),nn=y(tn),rn=w(nn,!0),an=S(nn,2),on=e=>{var t=Ae();s(e,t)},sn=u(()=>be(l.root.author));c(an,e=>{h(sn)&&e(on)});var cn=S(an,2),ln=e=>{var t=je(),n=w(t,!0);E(e=>o(n,e),[()=>ve(_e(l.root.author))]),s(e,t)},un=u(()=>_e(l.root.author));c(cn,e=>{h(un)&&e(ln)});var dn=S(cn,2),fn=w(dn,!0),pn=S(dn,2),mn=e=>{var t=Ie(),n=T(t);{let e=u(()=>O()||!l.currentUserID),t=u(()=>l.reactionController.pending(l.root.id));we(n,{get messageId(){return l.root.id},get disabled(){return h(e)},get pending(){return h(t)},buttonClass:`thread-action-btn`,onToggle:e=>void l.reactionController.toggle(l.root,e)})}var r=S(n,2),i=S(r,2),a=e=>{var t=Me();E(()=>{b(t,`data-tooltip`,h(K)===`pending`?`Creating link…`:`Copy link`),t.disabled=h(K)===`pending`}),p(`click`,t,e=>void At(e.currentTarget)),s(e,t)};c(i,e=>{L()&&l.onCopyLink&&e(a)});var o=S(i,2),d=e=>{var t=Ne();E((e,n)=>{b(t,`aria-label`,e),b(t,`data-tooltip`,n),t.disabled=h(q)},[()=>R().has(l.root.id)?`Unpin message`:`Pin message`,()=>R().has(l.root.id)?`Unpin message`:`Pin message`]),p(`click`,t,()=>void Pt(l.root)),s(e,t)};c(o,e=>{L()&&l.onTogglePin&&e(d)});var f=S(o,2),m=e=>{var t=Pe();p(`click`,t,()=>lt(l.root)),s(e,t)},g=u(()=>ot(l.root)&&l.editController&&z());c(f,e=>{h(g)&&e(m)});var _=S(f,2),v=e=>{var t=Fe();E(e=>t.disabled=e,[()=>xe().has(l.root.id)]),p(`click`,t,()=>l.onDeleteMessage?.(l.root)),s(e,t)},y=u(()=>at(l.root)&&l.onDeleteMessage);c(_,e=>{h(y)&&e(v)});var x=S(_,2);E(e=>{b(x,`aria-controls`,e),b(x,`aria-expanded`,h(G)?.id===l.root.id)},[()=>yt(l.root)]),p(`click`,r,()=>l.onSetReplyTarget(l.root,`thread`)),p(`click`,x,e=>Ct(l.root,e.currentTarget)),s(e,t)},hn=u(()=>!l.root.deleted_at&&!st(l.root));c(pn,e=>{h(hn)&&e(mn)}),n(tn);var gn=S(tn,2),_n=e=>{var t=Le();s(e,t)},vn=e=>{ue(e,{get body(){return h(U).draft},get errorMessage(){return h(U).error},get saving(){return h(U).saving},onBody:e=>l.editController?.updateDraft(z(),e),onCancel:()=>ut(l.root),onSave:()=>dt(l.root)})},yn=u(()=>st(l.root)&&h(U)),bn=e=>{var r=ze(),i=T(r);t(i,()=>le(l.root.body),!0),n(i),d(i,e=>re?.(e)),d(i,(e,t)=>he?.(e,t),()=>({people:A(),attentionUserID:l.mentionAttentionUserID}));var a=S(i,2),o=e=>{var t=Re();E(e=>b(t,`title`,`Edited ${e??``}`),[()=>se(l.root.edited_at)]),s(e,t)};c(a,e=>{l.root.edited_at&&e(o)});var f=S(a,2);{let e=u(()=>l.reactionController.reactionsFor(l.root)),t=u(()=>l.reactionController.pending(l.root.id)),n=u(()=>l.reactionController.error(l.root.id)),r=u(()=>O()||!l.currentUserID);pe(f,{get messageId(){return l.root.id},get reactions(){return h(e)},get pending(){return h(t)},get error(){return h(n)},get disabled(){return h(r)},onToggle:e=>void l.reactionController.toggle(l.root,e)})}s(e,r)};c(gn,e=>{l.root.deleted_at?e(_n):h(yn)?e(vn,1):e(bn,-1)});var xn=S(gn,2),Sn=e=>{var t=Be();C(t,21,()=>l.root.attachments,e=>e.id,(e,t)=>{{let n=u(()=>ne(h(t)));fe(e,{get upload(){return h(t)},get url(){return h(n)},get onOpenImage(){return l.onOpenImage},get onOpenArtifact(){return l.onOpenArtifact}})}}),n(t),s(e,t)};c(xn,e=>{!l.root.deleted_at&&l.root.attachments?.length&&e(Sn)}),n(en),n($);var Cn=S($,2),wn=y(Cn),Tn=w(wn);n(Cn);var En=S(Cn,2),Dn=e=>{var t=He(),r=y(t),i=e=>{oe(e,{direction:`older`,rows:1})};c(r,e=>{x().loading.older&&e(i)});var a=S(r,2),l=e=>{var t=Ve(),n=w(t,!0);E(()=>o(n,x().edgeError.older)),s(e,t)};c(a,e=>{x().edgeError.older&&e(l)});var u=S(a,2),d=w(u,!0);n(t),E(()=>{u.disabled=x().loading.older,o(d,x().edgeError.older?`Retry older replies`:`Load older replies`)}),p(`click`,u,()=>void rt(`older`)),s(e,t)};c(En,e=>{(x().hasOlder||x().loading.older||x().edgeError.older)&&e(Dn)});var On=S(En,2);C(On,21,()=>l.replies,e=>e.id,(e,i)=>{var a=Ge();let f;var m=y(a);{let e=u(()=>h(i).author?.id||h(i).author_id),t=u(()=>h(i).author?.display_name),n=u(()=>be(h(i).author)?void 0:h(i).author?.avatar_url);ye(m,{class:`avatar small`,get id(){return h(e)},get name(){return h(t)},get src(){return h(n)},size:30})}var g=S(m,2),_=y(g),v=y(_),x=w(v,!0),ee=S(v,2),te=e=>{var t=Ae();s(e,t)},D=u(()=>be(h(i).author));c(ee,e=>{h(D)&&e(te)});var k=S(ee,2),j=e=>{var t=je(),n=w(t,!0);E(e=>o(n,e),[()=>ve(_e(h(i).author))]),s(e,t)},M=u(()=>_e(h(i).author));c(k,e=>{h(M)&&e(j)});var ie=S(k,2),ae=w(ie,!0),N=S(ie,2),oe=e=>{var t=Ue(),n=T(t);{let e=u(()=>O()||!l.currentUserID),t=u(()=>l.reactionController.pending(h(i).id));we(n,{get messageId(){return h(i).id},get disabled(){return h(e)},get pending(){return h(t)},buttonClass:`thread-action-btn`,onToggle:e=>void l.reactionController.toggle(h(i),e)})}var r=S(n,2),a=S(r,2),o=e=>{var t=Ne();E((e,n)=>{b(t,`aria-label`,e),b(t,`data-tooltip`,n),t.disabled=h(q)},[()=>R().has(h(i).id)?`Unpin message`:`Pin message`,()=>R().has(h(i).id)?`Unpin message`:`Pin message`]),p(`click`,t,()=>void Pt(h(i))),s(e,t)};c(a,e=>{L()&&l.onTogglePin&&e(o)});var d=S(a,2),f=e=>{var t=Pe();E(()=>t.disabled=h(i).status===`pending`||h(i).status===`failed`),p(`click`,t,()=>lt(h(i))),s(e,t)},m=u(()=>ot(h(i))&&l.editController&&z());c(d,e=>{h(m)&&e(f)});var g=S(d,2),_=e=>{var t=Fe();E(e=>t.disabled=e,[()=>xe().has(h(i).id)]),p(`click`,t,()=>l.onDeleteMessage?.(h(i))),s(e,t)},v=u(()=>at(h(i))&&l.onDeleteMessage);c(g,e=>{h(v)&&e(_)});var y=S(g,2);E(e=>{b(y,`aria-controls`,e),b(y,`aria-expanded`,h(G)?.id===h(i).id),y.disabled=h(i).status===`pending`||h(i).status===`failed`},[()=>yt(h(i))]),p(`click`,r,()=>l.onSetReplyTarget(h(i),`thread`)),p(`click`,y,e=>Ct(h(i),e.currentTarget)),s(e,t)},ce=u(()=>!h(i).deleted_at&&!st(h(i)));c(N,e=>{h(ce)&&e(oe)}),n(_);var P=S(_,2),F=e=>{var t=Le();s(e,t)},de=e=>{ue(e,{get body(){return h(U).draft},get errorMessage(){return h(U).error},get saving(){return h(U).saving},onBody:e=>l.editController?.updateDraft(z(),e),onCancel:()=>ut(h(i)),onSave:()=>dt(h(i))})},ge=u(()=>st(h(i))&&h(U)),I=e=>{var r=We(),a=T(r);me(a,{get message(){return h(i)},get onJump(){return l.onJumpToQuote}});var o=S(a,2);t(o,()=>le(h(i).body),!0),n(o),d(o,e=>re?.(e)),d(o,(e,t)=>he?.(e,t),()=>({people:A(),attentionUserID:l.mentionAttentionUserID}));var f=S(o,2),p=e=>{var t=Re();E(e=>b(t,`title`,`Edited ${e??``}`),[()=>se(h(i).edited_at)]),s(e,t)};c(f,e=>{h(i).edited_at&&e(p)});var m=S(f,2);{let e=u(()=>l.reactionController.reactionsFor(h(i))),t=u(()=>l.reactionController.pending(h(i).id)),n=u(()=>l.reactionController.error(h(i).id)),r=u(()=>O()||!l.currentUserID);pe(m,{get messageId(){return h(i).id},get reactions(){return h(e)},get pending(){return h(t)},get error(){return h(n)},get disabled(){return h(r)},onToggle:e=>void l.reactionController.toggle(h(i),e)})}s(e,r)};c(P,e=>{h(i).deleted_at?e(F):h(ge)?e(de,1):e(I,-1)});var B=S(P,2),V=e=>{var t=Be();C(t,21,()=>h(i).attachments,e=>e.id,(e,t)=>{{let n=u(()=>ne(h(t)));fe(e,{get upload(){return h(t)},get url(){return h(n)},get onOpenImage(){return l.onOpenImage},get onOpenArtifact(){return l.onOpenArtifact}})}}),n(t),s(e,t)};c(B,e=>{!h(i).deleted_at&&h(i).attachments?.length&&e(V)}),n(g),n(a),E(e=>{f=r(a,1,`reply`,null,f,{"thread-target":h(Ze)===h(i).id}),b(a,`data-message-id`,h(i).id),o(x,h(i).author?.display_name||`Local User`),o(ae,e)},[()=>se(h(i).created_at)]),p(`pointerdown`,a,e=>wt(e,h(i))),p(`contextmenu`,a,Tt),s(e,a)}),n(On);var kn=S(On,2),An=e=>{var t=He(),r=y(t),i=e=>{oe(e,{direction:`newer`,rows:1})};c(r,e=>{x().loading.newer&&e(i)});var a=S(r,2),l=e=>{var t=Ve(),n=w(t,!0);E(()=>o(n,x().edgeError.newer)),s(e,t)};c(a,e=>{x().edgeError.newer&&e(l)});var u=S(a,2),d=w(u,!0);n(t),E(()=>{u.disabled=x().loading.newer,o(d,x().edgeError.newer?`Retry newer replies`:`Load newer replies`)}),p(`click`,u,()=>void rt(`newer`)),s(e,t)};c(kn,e=>{(x().hasNewer||x().loading.newer||x().edgeError.newer)&&e(An)}),n(Q),te(Q,e=>D(B,e),()=>h(B));var jn=S(Q,2),Mn=e=>{var t=Ke(),n=w(t);p(`click`,n,()=>void it()),s(e,t)};c(jn,e=>{(x().hasNewer||!x().following||x().error)&&e(Mn)});var Nn=S(jn,2),Pn=e=>{{let t=u(()=>yt(h(G))),n=u(()=>!!l.currentUserID&&!O()&&!l.reactionController.pending(h(G).id)),r=u(()=>!N()),i=u(()=>ot(h(G))&&!!l.editController&&!!z()),a=u(()=>!!(L()&&l.onTogglePin)),o=u(()=>R().has(h(G).id)),s=u(()=>at(h(G))&&!!l.onDeleteMessage),c=u(()=>xe().has(h(G).id)),d=u(()=>h(G).id===l.root.id&&!!(L()&&l.onCopyLink));de(e,{get id(){return h(t)},get canReact(){return h(n)},get canReply(){return h(r)},showOpenThread:!1,get canEdit(){return h(i)},get canPin(){return h(a)},get pinned(){return h(o)},get pinning(){return h(q)},get pinError(){return h(J)},get canDelete(){return h(s)},get deleting(){return h(c)},get copyStatus(){return h(pt)},get canCopyLink(){return h(d)},get copyLinkStatus(){return h(K)},onReact:Et,onOpenThread:()=>{},onReply:Dt,onCopy:Ot,onCopyLink:jt,onEdit:Mt,onTogglePin:Ft,onDelete:Nt,onClose:Z,get returnFocus(){return h(ft)}})}};c(Nn,e=>{h(G)&&e(Pn)});var Fn=S(Nn,2),In=e=>{ae(e,{get url(){return h(mt)},onClose:()=>D(mt,``),get returnFocus(){return h(ht)}})};c(Fn,e=>{h(mt)&&e(In)});var Ln=S(Fn,2),Rn=y(Ln);Se(Rn,{get active(){return j()},get agentNames(){return ie()}});var zn=S(Rn,2),Bn=e=>{var t=qe(),n=w(t,!0);E(()=>o(n,P())),s(e,t)};c(zn,e=>{P()&&e(Bn)});var Vn=S(zn,2);{let e=u(()=>N()?`No active recipient`:`Reply in thread`),t=u(()=>N()||ce());ge(Vn,{get value(){return l.replyBody},get placeholder(){return h(e)},ariaLabel:`Reply body`,submitLabel:`Reply`,formClass:`composer reply-composer`,get disabled(){return h(t)},get replyTarget(){return l.replyTarget},get mentionPeople(){return A()},get onValue(){return l.onReplyBody},get onSubmit(){return l.onSubmitReply},get onKeydown(){return l.onReplyKeydown},get onFocus(){return l.onReplyFocus},get onInputRef(){return l.onReplyInputRef},get onClearReply(){return l.onClearReply}})}n(Ln),E(e=>{o(Ht,F()),o(Wt,l.headerDetail??`${l.threadState?.reply_count??l.replies.length} ${(l.threadState?.reply_count??l.replies.length)===1?`reply`:`replies`}`),b($,`data-message-id`,l.root.id),o(rn,l.root.author?.display_name||`Local User`),o(fn,e),o(Tn,`${l.replies.length??``} of ${l.threadState?.reply_count??l.replies.length??``} replies loaded`)},[()=>se(l.root.created_at)]),m(`scroll`,Q,tt),m(`wheel`,Q,nt),p(`touchstart`,Q,nt,void 0,!0),p(`keydown`,Q,nt),p(`pointerdown`,Q,()=>{nt(),l.onActivateThreadComposer()}),p(`pointerup`,Q,function(...e){l.onInlineImagePointerUp?.apply(this,e)}),p(`pointerdown`,$,e=>wt(e,l.root)),p(`contextmenu`,$,Tt),s(a,It),f()}a([`click`,`touchstart`,`keydown`,`pointerdown`,`pointerup`,`contextmenu`]);export{Se as n,B as r,Ye as t}; \ No newline at end of file diff --git a/apps/api/internal/webassets/dist/_app/immutable/entry/app.B8HOrAvW.js b/apps/api/internal/webassets/dist/_app/immutable/entry/app.mmJ26YUq.js similarity index 82% rename from apps/api/internal/webassets/dist/_app/immutable/entry/app.B8HOrAvW.js rename to apps/api/internal/webassets/dist/_app/immutable/entry/app.mmJ26YUq.js index 50c5840f5..f61b4742e 100644 --- a/apps/api/internal/webassets/dist/_app/immutable/entry/app.B8HOrAvW.js +++ b/apps/api/internal/webassets/dist/_app/immutable/entry/app.mmJ26YUq.js @@ -1,2 +1,2 @@ -const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["../nodes/0.ByQannvM.js","../chunks/DK3Fl9T5.js","../chunks/BTIB_WQZ.js","../chunks/CRok6MwI.js","../chunks/Dt-HX3Vu.js","../chunks/xihTtKlq.js","../chunks/DFzK05fS.js","../chunks/DLuhiCle.js","../chunks/Dqjw8vaP.js","../chunks/DEPNME54.js","../assets/0.BbpWhj-s.css","../nodes/1.Cb0U0XYQ.js","../chunks/DlMq4Pta.js","../nodes/2.B_8pZXrq.js","../chunks/B4px22Nd.js","../chunks/DBpO2iwN.js","../nodes/3.DL068NCn.js","../chunks/BaNbYf_w.js","../chunks/j4GI4VLW.js","../nodes/4.CIr3xalv.js","../chunks/CmseFvlq.js","../chunks/T0GVabNa.js","../chunks/ByQ3bZN5.js","../assets/QuoteBlock.Bmfc9wvU.css","../chunks/C16fMXIp.js","../chunks/DlGnnCJo.js","../chunks/CmtSSHF9.js","../chunks/DfsrRaIf.js","../assets/ThreadPanel.DFXp9CyT.css","../chunks/CVdgRPye.js","../chunks/BIhzYFGW.js","../assets/ChatApp.BrxGlI__.css","../nodes/5.CNg4Lt1d.js","../nodes/6.wekSS-ZX.js","../nodes/7.99dtKcEw.js","../chunks/CcwoL1Kr.js","../nodes/8.BO6p1T8e.js","../nodes/9.B_43Zg12.js","../nodes/10.ZprqyIMx.js","../nodes/11.JW5N0h7U.js","../nodes/12.CJ0rSSBz.js","../assets/12.CzRaoRZI.css","../nodes/13.BEYBWebA.js","../assets/13.CMVv15Ug.css"])))=>i.map(i=>d[i]); -import{$ as e,At as t,Et as n,I as r,L as i,O as a,P as o,R as s,St as c,Tt as l,V as u,Y as d,a as f,ct as p,ft as m,ht as h,i as g,lt as _,pt as v,r as y,st as b,u as x,vt as S,yt as C,z as w}from"../chunks/BTIB_WQZ.js";import{t as T}from"../chunks/BaNbYf_w.js";import"../chunks/xihTtKlq.js";var E={},D=w(`
                `),O=w(` `,1);function k(g,w){n(w,!0);let T=f(w,`components`,23,()=>[]),E=f(w,`data_0`,3,null),k=f(w,`data_1`,3,null),A=f(w,`data_2`,3,null);_(()=>w.stores.page.set(w.page)),p(()=>{w.stores,w.page,w.constructors,T(),w.form,E(),k(),A(),w.stores.page.notify()});let j=C(!1),M=C(!1),N=C(null);y(()=>{let t=w.stores.page.subscribe(()=>{d(j)&&(S(M,!0),e().then(()=>{S(N,document.title||`untitled page`,!0)}))});return S(j,!0),t});let P=c(()=>w.constructors[2]);var F=O(),I=v(F),L=e=>{let t=c(()=>w.constructors[0]);var n=s(),r=v(n);a(r,()=>d(t),(e,t)=>{x(t(e,{get data(){return E()},get form(){return w.form},get params(){return w.page.params},children:(e,t)=>{var n=s(),r=v(n),l=e=>{let t=c(()=>w.constructors[1]);var n=s(),r=v(n);a(r,()=>d(t),(e,t)=>{x(t(e,{get data(){return k()},get form(){return w.form},get params(){return w.page.params},children:(e,t)=>{var n=s(),r=v(n);a(r,()=>d(P),(e,t)=>{x(t(e,{get data(){return A()},get form(){return w.form},get params(){return w.page.params}}),e=>T()[2]=e,()=>T()?.[2])}),i(e,n)},$$slots:{default:!0}}),e=>T()[1]=e,()=>T()?.[1])}),i(e,n)},u=e=>{let t=c(()=>w.constructors[1]);var n=s(),r=v(n);a(r,()=>d(t),(e,t)=>{x(t(e,{get data(){return k()},get form(){return w.form},get params(){return w.page.params}}),e=>T()[1]=e,()=>T()?.[1])}),i(e,n)};o(r,e=>{w.constructors[2]?e(l):e(u,-1)}),i(e,n)},$$slots:{default:!0}}),e=>T()[0]=e,()=>T()?.[0])}),i(e,n)},R=e=>{let t=c(()=>w.constructors[0]);var n=s(),r=v(n);a(r,()=>d(t),(e,t)=>{x(t(e,{get data(){return E()},get form(){return w.form},get params(){return w.page.params}}),e=>T()[0]=e,()=>T()?.[0])}),i(e,n)};o(I,e=>{w.constructors[1]?e(L):e(R,-1)});var z=h(I,2),B=e=>{var n=D(),a=m(n),s=e=>{var t=u();b(()=>r(t,d(N))),i(e,t)};o(a,e=>{d(M)&&e(s)}),t(n),i(e,n)};o(z,e=>{d(j)&&e(B)}),i(g,F),l()}var A=g(k),j=[()=>T(()=>import(`../nodes/0.ByQannvM.js`),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10]),import.meta.url),()=>T(()=>import(`../nodes/1.Cb0U0XYQ.js`),__vite__mapDeps([11,2,1,5,12,3,4]),import.meta.url),()=>T(()=>import(`../nodes/2.B_8pZXrq.js`),__vite__mapDeps([13,1,2,3,4,5,6,9,12,14,15]),import.meta.url),()=>T(()=>import(`../nodes/3.DL068NCn.js`),__vite__mapDeps([16,1,2,17,5,18]),import.meta.url),()=>T(()=>import(`../nodes/4.CIr3xalv.js`),__vite__mapDeps([19,2,1,5,18,20,3,4,17,6,9,8,14,15,21,22,23,24,7,25,26,27,28,29,30,31]),import.meta.url),()=>T(()=>import(`../nodes/5.CNg4Lt1d.js`),__vite__mapDeps([32,2,1,5,20,3,4,17,6,9,8,14,15,18,21,22,23,24,7,25,26,27,28,29,30,31]),import.meta.url),()=>T(()=>import(`../nodes/6.wekSS-ZX.js`),__vite__mapDeps([33,1,4,14]),import.meta.url),()=>T(()=>import(`../nodes/7.99dtKcEw.js`),__vite__mapDeps([34,1,2,5,9,8,15,29,35]),import.meta.url),()=>T(()=>import(`../nodes/8.BO6p1T8e.js`),__vite__mapDeps([36,1,2,5,9,8,15,25,26,29,30,35]),import.meta.url),()=>T(()=>import(`../nodes/9.B_43Zg12.js`),__vite__mapDeps([37,1,2,5,22,9,26,30]),import.meta.url),()=>T(()=>import(`../nodes/10.ZprqyIMx.js`),__vite__mapDeps([38,1,2,3,4,5,6,9,15,30]),import.meta.url),()=>T(()=>import(`../nodes/11.JW5N0h7U.js`),__vite__mapDeps([39,2,1,5,20,3,4,17,6,9,8,14,15,18,21,22,23,24,7,25,26,27,28,29,30,31]),import.meta.url),()=>T(()=>import(`../nodes/12.CJ0rSSBz.js`),__vite__mapDeps([40,1,2,5,9,8,21,22,23,24,7,25,26,30,41]),import.meta.url),()=>T(()=>import(`../nodes/13.BEYBWebA.js`),__vite__mapDeps([42,1,2,5,9,8,21,22,23,25,27,28,30,43]),import.meta.url)],M=[],N={"/":[3],"/app":[4],"/app/[workspaceID]":[5],"/app/[workspaceID]/(settings)/settings":[6,[2]],"/app/[workspaceID]/(settings)/settings/bots":[7,[2]],"/app/[workspaceID]/(settings)/settings/integrations":[8,[2]],"/app/[workspaceID]/(settings)/settings/members":[9,[2]],"/app/[workspaceID]/(settings)/settings/overview":[10,[2]],"/app/[workspaceID]/[targetID]":[11],"/embed/channel/[workspaceID]/[channelID]":[12],"/embed/thread/[workspaceID]/[messageID]":[13]},P={handleError:(({error:e})=>{console.error(e)}),reroute:(()=>{}),transport:{}},F=Object.fromEntries(Object.entries(P.transport).map(([e,t])=>[e,t.decode])),I=Object.fromEntries(Object.entries(P.transport).map(([e,t])=>[e,t.encode])),L=!1,R=(e,t)=>F[e](t),z=()=>T(()=>import(`../chunks/Bjy-W4x2.js`).then(e=>e.default),[],import.meta.url);export{R as decode,F as decoders,N as dictionary,I as encoders,z as get_error_template,L as hash,P as hooks,E as matchers,j as nodes,A as root,M as server_loads}; \ No newline at end of file +const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["../nodes/0.Dz3CkAQI.js","../chunks/DK3Fl9T5.js","../chunks/BTIB_WQZ.js","../chunks/CRok6MwI.js","../chunks/Dt-HX3Vu.js","../chunks/xihTtKlq.js","../chunks/DFzK05fS.js","../chunks/DLuhiCle.js","../chunks/Dqjw8vaP.js","../chunks/DEPNME54.js","../assets/0.C7lK6Biz.css","../nodes/1.Cb0U0XYQ.js","../chunks/DlMq4Pta.js","../nodes/2.B_8pZXrq.js","../chunks/B4px22Nd.js","../chunks/DBpO2iwN.js","../nodes/3.yc9nZP6z.js","../chunks/BaNbYf_w.js","../chunks/j4GI4VLW.js","../nodes/4.Qb9rB3O4.js","../chunks/DACoBCa_.js","../chunks/BNjDjM6i.js","../chunks/ByQ3bZN5.js","../assets/QuoteBlock.Bmfc9wvU.css","../chunks/CSysFL2J.js","../chunks/DlGnnCJo.js","../chunks/CmtSSHF9.js","../chunks/DuhkHvCz.js","../assets/ThreadPanel.DFXp9CyT.css","../chunks/CVdgRPye.js","../chunks/BIhzYFGW.js","../assets/ChatApp.BrxGlI__.css","../nodes/5.C2ZYaQZQ.js","../nodes/6.wekSS-ZX.js","../nodes/7.99dtKcEw.js","../chunks/CcwoL1Kr.js","../nodes/8.BO6p1T8e.js","../nodes/9.B_43Zg12.js","../nodes/10.ZprqyIMx.js","../nodes/11.ZoW-LJ6O.js","../nodes/12.DmphxqJF.js","../assets/12.CzRaoRZI.css","../nodes/13.DL55_vZx.js","../assets/13.CMVv15Ug.css"])))=>i.map(i=>d[i]); +import{$ as e,At as t,Et as n,I as r,L as i,O as a,P as o,R as s,St as c,Tt as l,V as u,Y as d,a as f,ct as p,ft as m,ht as h,i as g,lt as _,pt as v,r as y,st as b,u as x,vt as S,yt as C,z as w}from"../chunks/BTIB_WQZ.js";import{t as T}from"../chunks/BaNbYf_w.js";import"../chunks/xihTtKlq.js";var E={},D=w(`
                `),O=w(` `,1);function k(g,w){n(w,!0);let T=f(w,`components`,23,()=>[]),E=f(w,`data_0`,3,null),k=f(w,`data_1`,3,null),A=f(w,`data_2`,3,null);_(()=>w.stores.page.set(w.page)),p(()=>{w.stores,w.page,w.constructors,T(),w.form,E(),k(),A(),w.stores.page.notify()});let j=C(!1),M=C(!1),N=C(null);y(()=>{let t=w.stores.page.subscribe(()=>{d(j)&&(S(M,!0),e().then(()=>{S(N,document.title||`untitled page`,!0)}))});return S(j,!0),t});let P=c(()=>w.constructors[2]);var F=O(),I=v(F),L=e=>{let t=c(()=>w.constructors[0]);var n=s(),r=v(n);a(r,()=>d(t),(e,t)=>{x(t(e,{get data(){return E()},get form(){return w.form},get params(){return w.page.params},children:(e,t)=>{var n=s(),r=v(n),l=e=>{let t=c(()=>w.constructors[1]);var n=s(),r=v(n);a(r,()=>d(t),(e,t)=>{x(t(e,{get data(){return k()},get form(){return w.form},get params(){return w.page.params},children:(e,t)=>{var n=s(),r=v(n);a(r,()=>d(P),(e,t)=>{x(t(e,{get data(){return A()},get form(){return w.form},get params(){return w.page.params}}),e=>T()[2]=e,()=>T()?.[2])}),i(e,n)},$$slots:{default:!0}}),e=>T()[1]=e,()=>T()?.[1])}),i(e,n)},u=e=>{let t=c(()=>w.constructors[1]);var n=s(),r=v(n);a(r,()=>d(t),(e,t)=>{x(t(e,{get data(){return k()},get form(){return w.form},get params(){return w.page.params}}),e=>T()[1]=e,()=>T()?.[1])}),i(e,n)};o(r,e=>{w.constructors[2]?e(l):e(u,-1)}),i(e,n)},$$slots:{default:!0}}),e=>T()[0]=e,()=>T()?.[0])}),i(e,n)},R=e=>{let t=c(()=>w.constructors[0]);var n=s(),r=v(n);a(r,()=>d(t),(e,t)=>{x(t(e,{get data(){return E()},get form(){return w.form},get params(){return w.page.params}}),e=>T()[0]=e,()=>T()?.[0])}),i(e,n)};o(I,e=>{w.constructors[1]?e(L):e(R,-1)});var z=h(I,2),B=e=>{var n=D(),a=m(n),s=e=>{var t=u();b(()=>r(t,d(N))),i(e,t)};o(a,e=>{d(M)&&e(s)}),t(n),i(e,n)};o(z,e=>{d(j)&&e(B)}),i(g,F),l()}var A=g(k),j=[()=>T(()=>import(`../nodes/0.Dz3CkAQI.js`),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10]),import.meta.url),()=>T(()=>import(`../nodes/1.Cb0U0XYQ.js`),__vite__mapDeps([11,2,1,5,12,3,4]),import.meta.url),()=>T(()=>import(`../nodes/2.B_8pZXrq.js`),__vite__mapDeps([13,1,2,3,4,5,6,9,12,14,15]),import.meta.url),()=>T(()=>import(`../nodes/3.yc9nZP6z.js`),__vite__mapDeps([16,1,2,17,5,18]),import.meta.url),()=>T(()=>import(`../nodes/4.Qb9rB3O4.js`),__vite__mapDeps([19,2,1,5,18,20,3,4,17,6,9,8,14,15,21,22,23,24,7,25,26,27,28,29,30,31]),import.meta.url),()=>T(()=>import(`../nodes/5.C2ZYaQZQ.js`),__vite__mapDeps([32,2,1,5,20,3,4,17,6,9,8,14,15,18,21,22,23,24,7,25,26,27,28,29,30,31]),import.meta.url),()=>T(()=>import(`../nodes/6.wekSS-ZX.js`),__vite__mapDeps([33,1,4,14]),import.meta.url),()=>T(()=>import(`../nodes/7.99dtKcEw.js`),__vite__mapDeps([34,1,2,5,9,8,15,29,35]),import.meta.url),()=>T(()=>import(`../nodes/8.BO6p1T8e.js`),__vite__mapDeps([36,1,2,5,9,8,15,25,26,29,30,35]),import.meta.url),()=>T(()=>import(`../nodes/9.B_43Zg12.js`),__vite__mapDeps([37,1,2,5,22,9,26,30]),import.meta.url),()=>T(()=>import(`../nodes/10.ZprqyIMx.js`),__vite__mapDeps([38,1,2,3,4,5,6,9,15,30]),import.meta.url),()=>T(()=>import(`../nodes/11.ZoW-LJ6O.js`),__vite__mapDeps([39,2,1,5,20,3,4,17,6,9,8,14,15,18,21,22,23,24,7,25,26,27,28,29,30,31]),import.meta.url),()=>T(()=>import(`../nodes/12.DmphxqJF.js`),__vite__mapDeps([40,1,2,5,9,8,21,22,23,24,7,25,26,30,41]),import.meta.url),()=>T(()=>import(`../nodes/13.DL55_vZx.js`),__vite__mapDeps([42,1,2,5,9,8,21,22,23,25,27,28,30,43]),import.meta.url)],M=[],N={"/":[3],"/app":[4],"/app/[workspaceID]":[5],"/app/[workspaceID]/(settings)/settings":[6,[2]],"/app/[workspaceID]/(settings)/settings/bots":[7,[2]],"/app/[workspaceID]/(settings)/settings/integrations":[8,[2]],"/app/[workspaceID]/(settings)/settings/members":[9,[2]],"/app/[workspaceID]/(settings)/settings/overview":[10,[2]],"/app/[workspaceID]/[targetID]":[11],"/embed/channel/[workspaceID]/[channelID]":[12],"/embed/thread/[workspaceID]/[messageID]":[13]},P={handleError:(({error:e})=>{console.error(e)}),reroute:(()=>{}),transport:{}},F=Object.fromEntries(Object.entries(P.transport).map(([e,t])=>[e,t.decode])),I=Object.fromEntries(Object.entries(P.transport).map(([e,t])=>[e,t.encode])),L=!1,R=(e,t)=>F[e](t),z=()=>T(()=>import(`../chunks/Bjy-W4x2.js`).then(e=>e.default),[],import.meta.url);export{R as decode,F as decoders,N as dictionary,I as encoders,z as get_error_template,L as hash,P as hooks,E as matchers,j as nodes,A as root,M as server_loads}; \ No newline at end of file diff --git a/apps/api/internal/webassets/dist/_app/immutable/nodes/0.ByQannvM.js b/apps/api/internal/webassets/dist/_app/immutable/nodes/0.Dz3CkAQI.js similarity index 100% rename from apps/api/internal/webassets/dist/_app/immutable/nodes/0.ByQannvM.js rename to apps/api/internal/webassets/dist/_app/immutable/nodes/0.Dz3CkAQI.js diff --git a/apps/api/internal/webassets/dist/_app/immutable/nodes/11.JW5N0h7U.js b/apps/api/internal/webassets/dist/_app/immutable/nodes/11.ZoW-LJ6O.js similarity index 77% rename from apps/api/internal/webassets/dist/_app/immutable/nodes/11.JW5N0h7U.js rename to apps/api/internal/webassets/dist/_app/immutable/nodes/11.ZoW-LJ6O.js index b031eef82..85b304ed0 100644 --- a/apps/api/internal/webassets/dist/_app/immutable/nodes/11.JW5N0h7U.js +++ b/apps/api/internal/webassets/dist/_app/immutable/nodes/11.ZoW-LJ6O.js @@ -1 +1 @@ -import{Et as e,Tt as t}from"../chunks/BTIB_WQZ.js";import"../chunks/xihTtKlq.js";import{t as n}from"../chunks/CmseFvlq.js";function r(r,i){e(i,!0),n(r,{get routeWorkspaceID(){return i.params.workspaceID},get routeTargetID(){return i.params.targetID}}),t()}export{r as component}; \ No newline at end of file +import{Et as e,Tt as t}from"../chunks/BTIB_WQZ.js";import"../chunks/xihTtKlq.js";import{t as n}from"../chunks/DACoBCa_.js";function r(r,i){e(i,!0),n(r,{get routeWorkspaceID(){return i.params.workspaceID},get routeTargetID(){return i.params.targetID}}),t()}export{r as component}; \ No newline at end of file diff --git a/apps/api/internal/webassets/dist/_app/immutable/nodes/12.CJ0rSSBz.js b/apps/api/internal/webassets/dist/_app/immutable/nodes/12.CJ0rSSBz.js deleted file mode 100644 index 4b6cb7948..000000000 --- a/apps/api/internal/webassets/dist/_app/immutable/nodes/12.CJ0rSSBz.js +++ /dev/null @@ -1 +0,0 @@ -import{t as e}from"../chunks/DK3Fl9T5.js";import{$ as t,At as n,E as r,Et as i,H as a,I as o,L as s,N as c,P as l,R as u,St as ee,T as te,Tt as d,U as ne,W as f,Y as p,ft as m,gt as re,ht as h,kt as ie,mt as g,n as ae,pt as oe,r as se,st as _,tt as ce,ut as le,vt as v,yt as y,z as b}from"../chunks/BTIB_WQZ.js";import"../chunks/xihTtKlq.js";import{i as ue,n as x,t as S,u as C}from"../chunks/DEPNME54.js";import{d as de}from"../chunks/Dqjw8vaP.js";import{D as fe,E as pe,R as me,T as he,f as ge,j as _e,p as ve,w as ye,x as be}from"../chunks/T0GVabNa.js";import{i as xe,n as Se,t as Ce}from"../chunks/C16fMXIp.js";import{t as we}from"../chunks/DlGnnCJo.js";import{r as Te,t as Ee}from"../chunks/BIhzYFGW.js";var w=e({prerender:()=>!1,ssr:()=>!1}),De=b(``),Oe=b(`Archived`),ke=b(`

                `),Ae=b(`

                `),je=b(`

                Sign in to ClickClack

                Open ClickClack in a new tab, sign in, then return here. This panel will reconnect automatically.

                Open ClickClack
                `),Me=b(`
                `),Ne=b(`
                `),Pe=b(`
                `),Fe=b(`
                `),Ie=b(``),Le=b(` `,1);function T(e,a){i(a,!0);let c=y(`loading`),u=y(``),b=y(null),w=new ye(()=>p(b)?.id||``),T=new fe(He),E=y(null),D=y(null),O=y(re([])),k=y(0),A=y(0),j=y(!1),M=y(!1),N=y(!1),P=y(``),F=y(null),Re=y(null),I=y(null),L=y(void 0),R=y(``),z=y(``),B=y(!1),V=y(null),H=y(null),U=null,W=0,ze=!1,G=null,K=y(re([])),q=0,J=null,Y=y(``),X=null,Z=new xe(()=>[p(b)?.id,p(D)?.id].join(`:`)),Be=ee(()=>{let e=new Map;for(let t of p(K))t.id&&!t.deleted_at&&e.set(t.id,t);for(let t of p(O))t.author?.id&&t.author.handle?.trim()&&!t.author.deleted_at&&e.set(t.author.id,t.author);return p(b)?.id&&e.set(p(b).id,p(b)),[...e.values()]});async function Ve(e){let t=++q;J?.abort();let n=new AbortController;J=n,v(Y,``),v(K,[],!0);try{let r=await Ee({workspaceID:e,limit:100,signal:n.signal});t===q&&v(K,r.map(e=>e.user),!0)}catch(e){!n.signal.aborted&&t===q&&(v(K,[],!0),v(Y,Te(e),!0))}}async function He(e,n){if(e===p(D)?.id){p(I)?.scrollToMessage(n.messageID);for(let e=0;e<16;e+=1){await t(),await new Promise(e=>requestAnimationFrame(()=>e()));let e=document.querySelector(`.embed-channel-shell`)?.querySelector(`[data-message-id="${CSS.escape(n.messageID)}"]`)?.querySelector(`textarea[aria-label="Edit message"]`);if(e){e.focus();return}}}}function Ue(e){v(O,p(O).map(Z.updateMessage(e)),!0)}function We(...e){let t=new Map;for(let n of e)for(let e of n)t.set(e.id,e);return[...t.values()].sort((e,t)=>(e.channel_seq||0)-(t.channel_seq||0))}function Q(e,t){t===`replace`&&v(L,void 0),w.seedMessages(e.messages),v(O,t===`replace`?e.messages:t===`prepend`?We(e.messages,p(O)):We(p(O),e.messages),!0),T.reconcile(p(D)?.id||``,p(O)),t===`replace`?(v(k,e.oldest_seq,!0),v(A,e.newest_seq,!0),v(j,e.has_older,!0),v(M,e.has_newer,!0)):(v(k,Math.min(p(k)||e.oldest_seq,e.oldest_seq||p(k)),!0),t===`prepend`&&v(j,e.has_older,!0),t===`append`&&(e.newest_seq>p(A)?v(M,e.has_newer,!0):e.newest_seq===p(A)&&v(M,p(M)||e.has_newer,!0)),v(A,Math.max(p(A),e.newest_seq),!0))}function Ge(){Z.clear(),G=null,v(B,!1),v(R,``),q+=1,J?.abort(),U?.close(),U=null,v(E,null),v(D,null),w.clear(),T.clear(),v(O,[],!0),v(L,void 0),v(k,0),v(A,0),v(j,!1),v(M,!1),v(N,!1),X=null,v(F,null),v(H,null),v(V,null)}function Ke(e){if(Ge(),e instanceof he){v(c,`forbidden`);return}if(e instanceof S){if(e.status===401){v(c,`auth`);return}if(e.status===403){v(c,`forbidden`);return}if(e.status===404){v(c,`not-found`);return}}v(u,C(e,`Could not load this channel.`),!0),v(c,`error`)}async function qe(){if(ze)return;ze=!0;let e=++W;p(c)!==`auth`&&v(c,`loading`),v(u,``);try{let t=await de(),n=await x(`/api/routes/${encodeURIComponent(a.workspaceRouteID)}/${encodeURIComponent(a.channelRouteID)}`);if(n.route.target_type!==`channel`)throw new S(404,`Channel route not found`);await Xe(n.route.workspace_id,n.route.target_id,e=>{p(b)&&p(b).id!==t.user.id&&v(P,``),v(b,t.user,!0),v(E,n.route,!0),Ve(n.route.workspace_id),v(D,e.channel,!0),Q(e,`replace`),v(c,`ready`),at(n.route.workspace_id)},()=>e===W)}catch(t){e===W&&Ke(t)}finally{e===W&&(ze=!1)}}async function Je(){if(!p(D)||p(N)||!p(j)||p(k)<=0)return;let e=p(D).id,t=W;v(N,!0);try{await Z.run(()=>x(`/api/channels/${encodeURIComponent(e)}/messages?before_seq=${encodeURIComponent(String(p(k)))}&limit=100`),e=>{v(L,p(I)?.captureState()??void 0,!0),Q(e,`prepend`)},()=>t===W&&p(D)?.id===e&&p(c)===`ready`)}catch(e){t===W&&v(R,C(e,`Could not load older messages.`),!0)}finally{t===W&&v(N,!1)}}async function Ye(){let e=W;if(X!==e&&p(M)){X=e;try{await Qe(()=>e===W)}catch(t){e===W&&rt(t)}finally{X===e&&(X=null)}}}function Xe(e,t,n,r){return Z.run(async()=>{let[n,r]=await Promise.all([x(`/api/workspaces/${encodeURIComponent(e)}/channels`),x(`/api/channels/${encodeURIComponent(t)}/messages?limit=100`)]),i=n.channels.find(e=>e.id===t);if(!i)throw new S(404,`Channel not found`);return{...r,channel:i}},n,r)}async function Ze(e=()=>!0){if(!p(E)||!p(D)||p(c)!==`ready`)return;let t=p(E).workspace_id,n=p(D).id,r=W;await Xe(t,n,e=>{W++,Z.prune(),v(N,!1),X=null,v(D,e.channel,!0),Q(e,`replace`)},()=>e()&&r===W&&p(D)?.id===n&&p(c)===`ready`)}async function Qe(e=()=>!0){if(!p(D)||p(c)!==`ready`)return;let t=p(D).id,n=W,r=()=>e()&&n===W&&p(D)?.id===t&&p(c)===`ready`;try{let e=p(A);for(let n=0;n<20;n++){let n=await Z.run(()=>x(`/api/channels/${encodeURIComponent(t)}/messages?after_seq=${encodeURIComponent(String(e))}&limit=100`),e=>Q(e,`append`),r);if(!n||!r())return;let i=n.newest_seq||e;if(!n.has_newer||i<=e){it();return}e=i}throw Error(`Realtime message recovery exceeded its page limit`)}catch(e){if(!r())return;throw e}}async function $e(e,t=()=>!0){(p(O).some(t=>t.id===e)||Z.pending)&&await Z.run(()=>x(`/api/messages/${encodeURIComponent(e)}`),e=>{Ue(e.message),T.reconcile(p(D)?.id||``,p(O))},t)}async function et(e=()=>!0){if(!p(E)||!p(D))return;let t=await x(`/api/workspaces/${encodeURIComponent(p(E).workspace_id)}/channels`);if(!e())return;let n=t.channels.find(e=>e.id===p(D)?.id);if(!n)throw new S(404,`Channel not found`);v(D,n,!0)}function tt(e){return e.channel_id||e.payload.channel_id||``}async function nt(e,t){if(p(D)&&tt(e)===p(D).id){if(e.type===`message.created`){let n=e.seq||e.payload.seq||0;if(n>0&&n<=p(A))return;await Qe(t);return}if(e.type===`message.updated`||e.type===`message.deleted`){e.payload.message_id&&await $e(e.payload.message_id,t);return}if(e.type===`reaction.added`||e.type===`reaction.removed`){w.applyEvent(e);return}e.type===`channel.updated`&&await et(t)}}function rt(e){if(p(c)===`ready`){if(e instanceof he||e instanceof S&&[401,403,404].includes(e.status)){Ke(e);return}v(z,C(e,`Could not process a realtime update.`),!0),v(R,p(z),!0)}}function it(){p(R)===p(z)&&v(R,``),v(z,``)}function at(e){U?.close(),U=pe({workspaceID:e,onEvent:nt,onOpen:async(e,t)=>{t&&(w.clear(),await Ze(e)),e()&&it()},onError:rt})}async function ot(){let e=p(P).trim();if(!e||!p(D)||p(B))return;let n=p(D).id,r=p(F)?.id,i=G?.body===e&&G.quotedMessageID===r?G:{body:e,nonce:_e(),quotedMessageID:r};G=i,v(R,``),v(B,!0);let a;try{({message:a}=await x(`/api/channels/${encodeURIComponent(n)}/messages`,{method:`POST`,body:JSON.stringify({body:e,nonce:i.nonce,quoted_message_id:r})}))}catch(e){if(G!==i)return;if(e instanceof S&&e.status===401){Ke(e);return}v(R,C(e,`Could not send this message.`),!0);return}finally{G===i&&v(B,!1)}if(G!==i||p(D)?.id!==n||p(c)!==`ready`)return;G=null,v(O,We([a],p(O)),!0),p(P).trim()===e&&v(P,``),r&&p(F)?.id===r&&v(F,null);let o=W;Qe(()=>o===W).catch(e=>{o===W&&rt(e)}),await t(),o===W&&p(D)?.id===n&&p(c)===`ready`&&await p(I)?.scrollToBottom()}function st(e){if(e.key===`Escape`&&p(F)){e.preventDefault(),v(F,null);return}e.key===`Enter`&&!e.shiftKey&&(e.preventDefault(),ot())}function ct(e){p(B)||(v(F,e,!0),t().then(()=>p(Re)?.focus()))}function lt(e){e.quoted_message_id&&p(I)?.scrollToMessage(e.quoted_message_id)}function ut(e){if(!e.route_id)return;let t=window.open(`/app/${encodeURIComponent(a.workspaceRouteID)}/${encodeURIComponent(e.route_id)}`,`_blank`,`noopener,noreferrer`);t&&(t.opener=null)}function dt(e){let t=e.target;t instanceof HTMLImageElement&&t.closest(`.markdown`)&&(e.preventDefault(),v(V,{url:me(t),title:t.alt||`Image`},!0))}function ft(e){let t=window.open(ue(`/api/uploads/${e.id}`),`_blank`,`noopener,noreferrer`);t&&(t.opener=null)}function $(){p(c)===`auth`&&document.visibilityState===`visible`&&qe()}function pt(e){return e.showModal(),{destroy:()=>e.close()}}se(()=>{qe(),window.addEventListener(`focus`,$),document.addEventListener(`visibilitychange`,$)}),ae(()=>{W+=1,Ge(),window.removeEventListener(`focus`,$),document.removeEventListener(`visibilitychange`,$)});var mt=Le();r(`6awrv5`,e=>{var t=De();ce(e=>{le.title=e??``},[()=>p(D)?`#${we(p(D))} · ClickClack`:`ClickClack channel`]),s(e,t)});var ht=oe(mt),gt=e=>{var t=Ae(),r=m(t),i=m(r),a=h(m(i),2),c=g(a,!0),u=h(a,2),te=e=>{var t=Oe();s(e,t)};l(u,e=>{p(D).archived_at&&e(te)}),n(i),n(r);var d=h(r,2);{let e=ee(()=>p(b)?.id);Se(d,{get messages(){return p(O)},get selectedChannel(){return p(D)},get mentionPeople(){return p(Be)},get viewKey(){return p(D).id},get hasOlder(){return p(j)},get hasNewer(){return p(M)},get loadingOlder(){return p(N)},get restoreState(){return p(L)},get currentUserID(){return p(e)},get reactionController(){return w},get editController(){return T},get editScope(){return p(D).id},onMessageEdited:Ue,onListRef:e=>v(I,e,!0),onActivateMessageComposer:()=>{},onInlineImagePointerUp:dt,onOpenProfile:e=>v(H,e||null,!0),onReply:e=>ct(e),onOpenThread:ut,onJumpToQuote:lt,onOpenImage:(e,t)=>v(V,{url:e,title:t},!0),onOpenArtifact:ft,onLoadOlder:()=>void Je(),onLoadNewer:()=>void Ye()})}var ne=h(d,2),f=m(ne),re=e=>{var t=ke(),n=g(t);_(()=>o(n,`Mentions unavailable: ${p(Y)??``}`)),s(e,t)};l(f,e=>{p(Y)&&e(re)});var ie=h(f,2),ae=e=>{var t=ke(),n=g(t,!0);_(()=>o(n,p(R))),s(e,t)};l(ie,e=>{p(R)&&e(ae)});var oe=h(ie,2);{let e=ee(()=>`Message #${we(p(D))}`);be(oe,{get value(){return p(P)},get placeholder(){return p(e)},ariaLabel:`Message body`,submitLabel:`Send`,formClass:`composer embed-channel-composer`,get disabled(){return p(B)},get replyTarget(){return p(F)},showToolbar:!0,get mentionPeople(){return p(Be)},onValue:e=>v(P,e,!0),onSubmit:()=>void ot(),onKeydown:st,onFocus:()=>v(R,``),onInputRef:e=>v(Re,e,!0),onClearReply:()=>v(F,null)})}n(ne),n(t),_(e=>o(c,e),[()=>we(p(D))]),s(e,t)},_t=e=>{var t=je(),r=m(t),i=m(r);ge(i,{class:`embed-mark`,size:42}),ie(6),n(r),n(t),s(e,t)},vt=e=>{var t=Me();s(e,t)},yt=e=>{var t=Ne();s(e,t)},bt=e=>{var t=Pe(),r=m(t),i=h(m(r),2),a=g(i,!0),c=h(i,2);n(r),n(t),_(()=>o(a,p(u))),ne(`click`,c,()=>void qe()),s(e,t)},xt=e=>{var t=Fe();s(e,t)};l(ht,e=>{p(c)===`ready`&&p(D)&&p(E)?e(gt):p(c)===`auth`?e(_t,1):p(c)===`forbidden`?e(vt,2):p(c)===`not-found`?e(yt,3):p(c)===`error`?e(bt,4):e(xt,-1)});var St=h(ht,2),Ct=e=>{ve(e,{get url(){return p(V).url},get title(){return p(V).title},onClose:()=>v(V,null)})};l(St,e=>{p(V)&&e(Ct)});var wt=h(St,2),Tt=e=>{var t=Ie(),r=m(t);Ce(r,{get profile(){return p(H)},get currentUser(){return p(b)},onClose:()=>v(H,null)}),n(t),te(t,e=>pt?.(e)),f(`close`,t,()=>v(H,null)),s(e,t)};l(wt,e=>{p(H)&&e(Tt)}),s(e,mt),d()}a([`click`]);function E(e,t){i(t,!0);var n=u(),r=oe(n);c(r,()=>`${t.params.workspaceID}:${t.params.channelID}`,e=>{T(e,{get workspaceRouteID(){return t.params.workspaceID},get channelRouteID(){return t.params.channelID}})}),s(e,n),d()}export{E as component,w as universal}; \ No newline at end of file diff --git a/apps/api/internal/webassets/dist/_app/immutable/nodes/12.DmphxqJF.js b/apps/api/internal/webassets/dist/_app/immutable/nodes/12.DmphxqJF.js new file mode 100644 index 000000000..4a70198b6 --- /dev/null +++ b/apps/api/internal/webassets/dist/_app/immutable/nodes/12.DmphxqJF.js @@ -0,0 +1 @@ +import{t as e}from"../chunks/DK3Fl9T5.js";import{$ as t,At as n,E as r,Et as i,H as a,I as o,L as s,N as c,P as l,R as u,St as ee,T as te,Tt as d,U as ne,W as f,Y as p,ft as m,gt as re,ht as h,kt as ie,mt as g,n as ae,pt as oe,r as se,st as _,tt as ce,ut as le,vt as v,yt as y,z as b}from"../chunks/BTIB_WQZ.js";import"../chunks/xihTtKlq.js";import{i as ue,n as x,t as S,u as C}from"../chunks/DEPNME54.js";import{d as de}from"../chunks/Dqjw8vaP.js";import{D as fe,E as pe,R as me,T as he,f as ge,j as _e,p as ve,w as ye,x as be}from"../chunks/BNjDjM6i.js";import{i as xe,n as Se,t as Ce}from"../chunks/CSysFL2J.js";import{t as we}from"../chunks/DlGnnCJo.js";import{r as Te,t as Ee}from"../chunks/BIhzYFGW.js";var w=e({prerender:()=>!1,ssr:()=>!1}),De=b(``),Oe=b(`Archived`),ke=b(`

                `),Ae=b(`

                `),je=b(`

                Sign in to ClickClack

                Open ClickClack in a new tab, sign in, then return here. This panel will reconnect automatically.

                Open ClickClack
                `),Me=b(`
                `),Ne=b(`

                Channel deleted

                This channel and its history have been permanently removed.

                `),Pe=b(`
                `),Fe=b(`
                `),Ie=b(`
                `),Le=b(``),Re=b(` `,1);function T(e,a){i(a,!0);let c=y(`loading`),u=y(``),b=y(null),w=new ye(()=>p(b)?.id||``),T=new fe(Ue),E=y(null),D=y(null),O=y(re([])),k=y(0),A=y(0),j=y(!1),M=y(!1),N=y(!1),P=y(``),F=y(null),ze=y(null),I=y(null),L=y(void 0),R=y(``),z=y(``),B=y(!1),V=y(null),H=y(null),U=null,W=0,G=!1,K=null,q=y(re([])),J=0,Be=null,Y=y(``),X=null,Z=new xe(()=>[p(b)?.id,p(D)?.id].join(`:`)),Ve=ee(()=>{let e=new Map;for(let t of p(q))t.id&&!t.deleted_at&&e.set(t.id,t);for(let t of p(O))t.author?.id&&t.author.handle?.trim()&&!t.author.deleted_at&&e.set(t.author.id,t.author);return p(b)?.id&&e.set(p(b).id,p(b)),[...e.values()]});async function He(e){let t=++J;Be?.abort();let n=new AbortController;Be=n,v(Y,``),v(q,[],!0);try{let r=await Ee({workspaceID:e,limit:100,signal:n.signal});t===J&&v(q,r.map(e=>e.user),!0)}catch(e){!n.signal.aborted&&t===J&&(v(q,[],!0),v(Y,Te(e),!0))}}async function Ue(e,n){if(e===p(D)?.id){p(I)?.scrollToMessage(n.messageID);for(let e=0;e<16;e+=1){await t(),await new Promise(e=>requestAnimationFrame(()=>e()));let e=document.querySelector(`.embed-channel-shell`)?.querySelector(`[data-message-id="${CSS.escape(n.messageID)}"]`)?.querySelector(`textarea[aria-label="Edit message"]`);if(e){e.focus();return}}}}function We(e){v(O,p(O).map(Z.updateMessage(e)),!0)}function Ge(...e){let t=new Map;for(let n of e)for(let e of n)t.set(e.id,e);return[...t.values()].sort((e,t)=>(e.channel_seq||0)-(t.channel_seq||0))}function Q(e,t){t===`replace`&&v(L,void 0),w.seedMessages(e.messages),v(O,t===`replace`?e.messages:t===`prepend`?Ge(e.messages,p(O)):Ge(p(O),e.messages),!0),T.reconcile(p(D)?.id||``,p(O)),t===`replace`?(v(k,e.oldest_seq,!0),v(A,e.newest_seq,!0),v(j,e.has_older,!0),v(M,e.has_newer,!0)):(v(k,Math.min(p(k)||e.oldest_seq,e.oldest_seq||p(k)),!0),t===`prepend`&&v(j,e.has_older,!0),t===`append`&&(e.newest_seq>p(A)?v(M,e.has_newer,!0):e.newest_seq===p(A)&&v(M,p(M)||e.has_newer,!0)),v(A,Math.max(p(A),e.newest_seq),!0))}function Ke(){Z.clear(),K=null,v(B,!1),v(R,``),J+=1,Be?.abort(),U?.close(),U=null,v(E,null),v(D,null),w.clear(),T.clear(),v(O,[],!0),v(L,void 0),v(k,0),v(A,0),v(j,!1),v(M,!1),v(N,!1),X=null,v(F,null),v(H,null),v(V,null)}function qe(e){if(Ke(),e instanceof he){v(c,`forbidden`);return}if(e instanceof S){if(e.status===401){v(c,`auth`);return}if(e.status===403){v(c,`forbidden`);return}if(e.status===404){v(c,`not-found`);return}}v(u,C(e,`Could not load this channel.`),!0),v(c,`error`)}async function Je(){if(G)return;G=!0;let e=++W;p(c)!==`auth`&&v(c,`loading`),v(u,``);try{let t=await de(),n=await x(`/api/routes/${encodeURIComponent(a.workspaceRouteID)}/${encodeURIComponent(a.channelRouteID)}`);if(n.route.target_type!==`channel`)throw new S(404,`Channel route not found`);await Ze(n.route.workspace_id,n.route.target_id,e=>{p(b)&&p(b).id!==t.user.id&&v(P,``),v(b,t.user,!0),v(E,n.route,!0),He(n.route.workspace_id),v(D,e.channel,!0),Q(e,`replace`),v(c,`ready`),ot(n.route.workspace_id)},()=>e===W)}catch(t){e===W&&qe(t)}finally{e===W&&(G=!1)}}async function Ye(){if(!p(D)||p(N)||!p(j)||p(k)<=0)return;let e=p(D).id,t=W;v(N,!0);try{await Z.run(()=>x(`/api/channels/${encodeURIComponent(e)}/messages?before_seq=${encodeURIComponent(String(p(k)))}&limit=100`),e=>{v(L,p(I)?.captureState()??void 0,!0),Q(e,`prepend`)},()=>t===W&&p(D)?.id===e&&p(c)===`ready`)}catch(e){t===W&&v(R,C(e,`Could not load older messages.`),!0)}finally{t===W&&v(N,!1)}}async function Xe(){let e=W;if(X!==e&&p(M)){X=e;try{await $e(()=>e===W)}catch(t){e===W&&it(t)}finally{X===e&&(X=null)}}}function Ze(e,t,n,r){return Z.run(async()=>{let[n,r]=await Promise.all([x(`/api/workspaces/${encodeURIComponent(e)}/channels`),x(`/api/channels/${encodeURIComponent(t)}/messages?limit=100`)]),i=n.channels.find(e=>e.id===t);if(!i)throw new S(404,`Channel not found`);return{...r,channel:i}},n,r)}async function Qe(e=()=>!0){if(!p(E)||!p(D)||p(c)!==`ready`)return;let t=p(E).workspace_id,n=p(D).id,r=W;await Ze(t,n,e=>{W++,Z.prune(),v(N,!1),X=null,v(D,e.channel,!0),Q(e,`replace`)},()=>e()&&r===W&&p(D)?.id===n&&p(c)===`ready`)}async function $e(e=()=>!0){if(!p(D)||p(c)!==`ready`)return;let t=p(D).id,n=W,r=()=>e()&&n===W&&p(D)?.id===t&&p(c)===`ready`;try{let e=p(A);for(let n=0;n<20;n++){let n=await Z.run(()=>x(`/api/channels/${encodeURIComponent(t)}/messages?after_seq=${encodeURIComponent(String(e))}&limit=100`),e=>Q(e,`append`),r);if(!n||!r())return;let i=n.newest_seq||e;if(!n.has_newer||i<=e){at();return}e=i}throw Error(`Realtime message recovery exceeded its page limit`)}catch(e){if(!r())return;throw e}}async function et(e,t=()=>!0){(p(O).some(t=>t.id===e)||Z.pending)&&await Z.run(()=>x(`/api/messages/${encodeURIComponent(e)}`),e=>{We(e.message),T.reconcile(p(D)?.id||``,p(O))},t)}async function tt(e=()=>!0){if(!p(E)||!p(D))return;let t=await x(`/api/workspaces/${encodeURIComponent(p(E).workspace_id)}/channels`);if(!e())return;let n=t.channels.find(e=>e.id===p(D)?.id);if(!n)throw new S(404,`Channel not found`);v(D,n,!0)}function nt(e){return e.channel_id||e.payload.channel_id||``}async function rt(e,t){if(p(D)&&nt(e)===p(D).id){if(e.type===`channel.deleted`){W+=1,G=!1,Ke(),v(P,``),v(c,`deleted`);return}if(e.type===`message.created`){let n=e.seq||e.payload.seq||0;if(n>0&&n<=p(A))return;await $e(t);return}if(e.type===`message.updated`||e.type===`message.deleted`){e.payload.message_id&&await et(e.payload.message_id,t);return}if(e.type===`reaction.added`||e.type===`reaction.removed`){w.applyEvent(e);return}e.type===`channel.updated`&&await tt(t)}}function it(e){if(p(c)===`ready`){if(e instanceof he||e instanceof S&&[401,403,404].includes(e.status)){qe(e);return}v(z,C(e,`Could not process a realtime update.`),!0),v(R,p(z),!0)}}function at(){p(R)===p(z)&&v(R,``),v(z,``)}function ot(e){U?.close(),U=pe({workspaceID:e,onEvent:rt,onOpen:async(e,t)=>{t&&(w.clear(),await Qe(e)),e()&&at()},onError:it})}async function st(){let e=p(P).trim();if(!e||!p(D)||p(B))return;let n=p(D).id,r=p(F)?.id,i=K?.body===e&&K.quotedMessageID===r?K:{body:e,nonce:_e(),quotedMessageID:r};K=i,v(R,``),v(B,!0);let a;try{({message:a}=await x(`/api/channels/${encodeURIComponent(n)}/messages`,{method:`POST`,body:JSON.stringify({body:e,nonce:i.nonce,quoted_message_id:r})}))}catch(e){if(K!==i)return;if(e instanceof S&&e.status===401){qe(e);return}v(R,C(e,`Could not send this message.`),!0);return}finally{K===i&&v(B,!1)}if(K!==i||p(D)?.id!==n||p(c)!==`ready`)return;K=null,v(O,Ge([a],p(O)),!0),p(P).trim()===e&&v(P,``),r&&p(F)?.id===r&&v(F,null);let o=W;$e(()=>o===W).catch(e=>{o===W&&it(e)}),await t(),o===W&&p(D)?.id===n&&p(c)===`ready`&&await p(I)?.scrollToBottom()}function ct(e){if(e.key===`Escape`&&p(F)){e.preventDefault(),v(F,null);return}e.key===`Enter`&&!e.shiftKey&&(e.preventDefault(),st())}function lt(e){p(B)||(v(F,e,!0),t().then(()=>p(ze)?.focus()))}function ut(e){e.quoted_message_id&&p(I)?.scrollToMessage(e.quoted_message_id)}function dt(e){if(!e.route_id)return;let t=window.open(`/app/${encodeURIComponent(a.workspaceRouteID)}/${encodeURIComponent(e.route_id)}`,`_blank`,`noopener,noreferrer`);t&&(t.opener=null)}function ft(e){let t=e.target;t instanceof HTMLImageElement&&t.closest(`.markdown`)&&(e.preventDefault(),v(V,{url:me(t),title:t.alt||`Image`},!0))}function pt(e){let t=window.open(ue(`/api/uploads/${e.id}`),`_blank`,`noopener,noreferrer`);t&&(t.opener=null)}function $(){p(c)===`auth`&&document.visibilityState===`visible`&&Je()}function mt(e){return e.showModal(),{destroy:()=>e.close()}}se(()=>{Je(),window.addEventListener(`focus`,$),document.addEventListener(`visibilitychange`,$)}),ae(()=>{W+=1,Ke(),window.removeEventListener(`focus`,$),document.removeEventListener(`visibilitychange`,$)});var ht=Re();r(`6awrv5`,e=>{var t=De();ce(e=>{le.title=e??``},[()=>p(D)?`#${we(p(D))} · ClickClack`:`ClickClack channel`]),s(e,t)});var gt=oe(ht),_t=e=>{var t=Ae(),r=m(t),i=m(r),a=h(m(i),2),c=g(a,!0),u=h(a,2),te=e=>{var t=Oe();s(e,t)};l(u,e=>{p(D).archived_at&&e(te)}),n(i),n(r);var d=h(r,2);{let e=ee(()=>p(b)?.id);Se(d,{get messages(){return p(O)},get selectedChannel(){return p(D)},get mentionPeople(){return p(Ve)},get viewKey(){return p(D).id},get hasOlder(){return p(j)},get hasNewer(){return p(M)},get loadingOlder(){return p(N)},get restoreState(){return p(L)},get currentUserID(){return p(e)},get reactionController(){return w},get editController(){return T},get editScope(){return p(D).id},onMessageEdited:We,onListRef:e=>v(I,e,!0),onActivateMessageComposer:()=>{},onInlineImagePointerUp:ft,onOpenProfile:e=>v(H,e||null,!0),onReply:e=>lt(e),onOpenThread:dt,onJumpToQuote:ut,onOpenImage:(e,t)=>v(V,{url:e,title:t},!0),onOpenArtifact:pt,onLoadOlder:()=>void Ye(),onLoadNewer:()=>void Xe()})}var ne=h(d,2),f=m(ne),re=e=>{var t=ke(),n=g(t);_(()=>o(n,`Mentions unavailable: ${p(Y)??``}`)),s(e,t)};l(f,e=>{p(Y)&&e(re)});var ie=h(f,2),ae=e=>{var t=ke(),n=g(t,!0);_(()=>o(n,p(R))),s(e,t)};l(ie,e=>{p(R)&&e(ae)});var oe=h(ie,2);{let e=ee(()=>`Message #${we(p(D))}`);be(oe,{get value(){return p(P)},get placeholder(){return p(e)},ariaLabel:`Message body`,submitLabel:`Send`,formClass:`composer embed-channel-composer`,get disabled(){return p(B)},get replyTarget(){return p(F)},showToolbar:!0,get mentionPeople(){return p(Ve)},onValue:e=>v(P,e,!0),onSubmit:()=>void st(),onKeydown:ct,onFocus:()=>v(R,``),onInputRef:e=>v(ze,e,!0),onClearReply:()=>v(F,null)})}n(ne),n(t),_(e=>o(c,e),[()=>we(p(D))]),s(e,t)},vt=e=>{var t=je(),r=m(t),i=m(r);ge(i,{class:`embed-mark`,size:42}),ie(6),n(r),n(t),s(e,t)},yt=e=>{var t=Me();s(e,t)},bt=e=>{var t=Ne();s(e,t)},xt=e=>{var t=Pe();s(e,t)},St=e=>{var t=Fe(),r=m(t),i=h(m(r),2),a=g(i,!0),c=h(i,2);n(r),n(t),_(()=>o(a,p(u))),ne(`click`,c,()=>void Je()),s(e,t)},Ct=e=>{var t=Ie();s(e,t)};l(gt,e=>{p(c)===`ready`&&p(D)&&p(E)?e(_t):p(c)===`auth`?e(vt,1):p(c)===`forbidden`?e(yt,2):p(c)===`deleted`?e(bt,3):p(c)===`not-found`?e(xt,4):p(c)===`error`?e(St,5):e(Ct,-1)});var wt=h(gt,2),Tt=e=>{ve(e,{get url(){return p(V).url},get title(){return p(V).title},onClose:()=>v(V,null)})};l(wt,e=>{p(V)&&e(Tt)});var Et=h(wt,2),Dt=e=>{var t=Le(),r=m(t);Ce(r,{get profile(){return p(H)},get currentUser(){return p(b)},onClose:()=>v(H,null)}),n(t),te(t,e=>mt?.(e)),f(`close`,t,()=>v(H,null)),s(e,t)};l(Et,e=>{p(H)&&e(Dt)}),s(e,ht),d()}a([`click`]);function E(e,t){i(t,!0);var n=u(),r=oe(n);c(r,()=>`${t.params.workspaceID}:${t.params.channelID}`,e=>{T(e,{get workspaceRouteID(){return t.params.workspaceID},get channelRouteID(){return t.params.channelID}})}),s(e,n),d()}export{E as component,w as universal}; \ No newline at end of file diff --git a/apps/api/internal/webassets/dist/_app/immutable/nodes/13.BEYBWebA.js b/apps/api/internal/webassets/dist/_app/immutable/nodes/13.BEYBWebA.js deleted file mode 100644 index 17cba6a8d..000000000 --- a/apps/api/internal/webassets/dist/_app/immutable/nodes/13.BEYBWebA.js +++ /dev/null @@ -1 +0,0 @@ -import{t as e}from"../chunks/DK3Fl9T5.js";import{$ as t,At as n,E as r,Et as i,H as a,I as o,L as s,N as c,P as l,R as u,St as d,Tt as f,U as ee,Y as p,ft as m,gt as te,ht as h,kt as ne,mt as g,n as re,nt as ie,pt as _,r as ae,st as v,ut as oe,vt as y,yt as b,z as x}from"../chunks/BTIB_WQZ.js";import"../chunks/xihTtKlq.js";import{i as se,n as S,t as C,u as w}from"../chunks/DEPNME54.js";import{d as ce}from"../chunks/Dqjw8vaP.js";import{D as le,E as ue,R as de,T,f as fe,p as pe,w as me}from"../chunks/T0GVabNa.js";import{c as he}from"../chunks/ByQ3bZN5.js";import{t as ge}from"../chunks/DlGnnCJo.js";import{r as _e,t as ve}from"../chunks/DfsrRaIf.js";import{r as ye,t as be}from"../chunks/BIhzYFGW.js";var E=e({prerender:()=>!1,ssr:()=>!1}),xe=x(``),D=x(`

                `),Se=x(`
                `),Ce=x(`

                Sign in to ClickClack

                Open ClickClack in a new tab, sign in, then return here. This panel will reconnect automatically.

                Open ClickClack
                `),we=x(`
                `),Te=x(`
                `),Ee=x(`
                `),De=x(`
                `),Oe=x(` `,1);function O(e,a){i(a,!0);let c=b(`loading`),u=b(``),x=b(null),E=new me(()=>p(x)?.id||``),O=new le(Me),k=b(null),A=new _e(()=>`${a.workspaceRouteID}:${a.messageRouteID}`,Ie),j=d(()=>A.root),M=d(()=>A.replies),N=d(()=>A.state),P=b(null),F=b(`Thread`),ke=d(()=>A.draft?.body??``),I=d(()=>A.draft?.quote??null),L=b(null),R=d(()=>A.draft?.error||A.error||p(z)),z=b(``),B=d(()=>A.draft?.sending??!1),V=b(null),H=null,U=0,W=!1,G=b(te([])),K=0,q=null,J=b(``),Y=d(()=>p(B)||!(!p(P)||p(P).can_send)),Ae=d(()=>{let e=new Map;for(let t of p(G))t.id&&!t.deleted_at&&e.set(t.id,t);for(let t of p(P)?.members??[])t.id&&t.handle?.trim()&&!t.deleted_at&&e.set(t.id,t);for(let t of p(j)?[p(j),...p(M)]:p(M))t.author?.id&&t.author.handle?.trim()&&!t.author.deleted_at&&e.set(t.author.id,t.author);return p(x)?.id&&e.set(p(x).id,p(x)),[...e.values()]});async function je(e){let t=++K;q?.abort();let n=new AbortController;q=n,y(J,``),y(G,[],!0);try{let r=await be({workspaceID:e,limit:100,signal:n.signal});t===K&&y(G,r.map(e=>e.user),!0)}catch(e){!n.signal.aborted&&t===K&&(y(G,[],!0),y(J,ye(e),!0))}}async function Me(e,n){let r=A.selection,i=()=>e===p(k)?.target_id&&A.isCurrent(r)&&O.session(e)?.generation===n.generation;if(i()&&await A.target({messageID:n.messageID,threadSeq:n.threadSeq},i))for(let e=0;e<4;e+=1){if(await t(),!i())return;let e=document.querySelector(`[aria-label="Embedded thread"]`)?.querySelector(`[data-message-id="${CSS.escape(n.messageID)}"]`)?.querySelector(`textarea[aria-label="Edit message"]`);if(e){e.focus({preventScroll:!0});return}}}function Ne(e){A.updateMessage(e)}function Pe(){K+=1,q?.abort(),H?.close(),H=null,y(k,null),A.close(),E.clear(),O.clear(),y(P,null),y(V,null)}function X(e){if(Pe(),e instanceof T){y(c,`forbidden`);return}if(e instanceof C){if(e.status===401){y(c,`auth`);return}if(e.status===403){y(c,`forbidden`);return}if(e.status===404){y(c,`not-found`);return}}y(u,w(e,`Could not load this thread.`),!0),y(c,`error`)}async function Fe(e,t){if(e.parent_type===`direct`){let n=(await S(`/api/dms?workspace_id=${encodeURIComponent(e.workspace_id)}`)).conversations.find(t=>t.id===e.parent_id);n||=(await S(`/api/dms/${encodeURIComponent(e.parent_id)}`)).conversation,y(P,n,!0),y(F,he(n,t.id)||`Direct message`,!0);return}let n=(await S(`/api/workspaces/${encodeURIComponent(e.workspace_id)}/channels`)).channels.find(t=>t.id===e.parent_id);if(!n)throw new C(404,`Thread channel not found`);y(P,null),y(F,`#${ge(n)}`)}async function Z(){if(W)return;W=!0;let e=++U;p(c)!==`auth`&&y(c,`loading`),y(u,``);try{let t=await ce(),n=await S(`/api/routes/${encodeURIComponent(a.workspaceRouteID)}/${encodeURIComponent(a.messageRouteID)}`);if(n.route.target_type!==`thread`)throw new C(404,`Thread route not found`);if(e!==U)return;A.select(n.route.target_id);let[r]=await Promise.all([A.open(()=>e===U),Fe(n.route,t.user)]);if(!r||e!==U||!A.root)return;y(x,t.user,!0),y(k,n.route,!0),je(n.route.workspace_id),y(c,`ready`),Be(n.route.workspace_id)}catch(t){e===U&&X(t)}finally{e===U&&(W=!1)}}function Ie(e=[]){p(j)&&(E.seedMessages(e),O.reconcile(p(k)?.target_id||p(j).id,[p(j),...p(M)]))}function Le(e){if(!p(j))return!1;if(e.payload.root_message_id)return e.payload.root_message_id===p(j).id;let t=e.payload.message_id;return t===p(j).id||p(M).some(e=>e.id===t)}async function Re(e,t){if(Le(e)&&(e.type===`reaction.added`||e.type===`reaction.removed`)){E.applyEvent(e);return}await A.handleEvent(e,t)}function ze(e){if(p(c)===`ready`){if(e instanceof T||e instanceof C&&[401,403,404].includes(e.status)){X(e);return}y(z,w(e,`Could not process a realtime update.`),!0)}}function Be(e){H?.close(),H=ue({workspaceID:e,onEvent:Re,onOpen:async(e,t)=>{t&&(E.clear(),await A.refresh(e)),e()&&y(z,``)},onError:ze})}async function Q(){p(Y)||await A.send(e=>{e instanceof C&&e.status===401&&X(e)})}function Ve(e){if(e.key===`Escape`&&p(I)){e.preventDefault(),A.setQuote(null);return}e.key===`Enter`&&!e.shiftKey&&(e.preventDefault(),Q())}function He(e){p(B)||(A.setQuote(e),t().then(()=>p(L)?.focus()))}function Ue(){p(B)||A.setQuote(null)}function We(e){e.quoted_message_id&&A.target({messageID:e.quoted_message_id})}function Ge(e){let t=e.target;t instanceof HTMLImageElement&&t.closest(`.markdown`)&&(e.preventDefault(),y(V,{url:de(t),title:t.alt||`Image`},!0))}function Ke(e){let t=window.open(se(`/api/uploads/${e.id}`),`_blank`,`noopener,noreferrer`);t&&(t.opener=null)}function $(){p(c)===`auth`&&document.visibilityState===`visible`&&Z()}ae(()=>{Z(),window.addEventListener(`focus`,$),document.addEventListener(`visibilitychange`,$)}),re(()=>{U+=1,K+=1,q?.abort(),H?.close(),window.removeEventListener(`focus`,$),document.removeEventListener(`visibilitychange`,$)});var qe=Oe();r(`b3w79y`,e=>{var t=xe();ie(()=>{oe.title=`ClickClack thread`}),s(e,t)});var Je=_(qe),Ye=e=>{var t=Se(),r=m(t),i=m(r);{let e=d(()=>`Thread · ${p(N)?.reply_count??p(M).length} ${(p(N)?.reply_count??p(M).length)===1?`reply`:`replies`}`),t=d(()=>p(x)?.id),n=d(()=>!(!p(P)||p(P).can_send));ve(i,{get history(){return A},get root(){return p(j)},get replies(){return p(M)},get threadState(){return p(N)},get replyBody(){return p(ke)},get replyTarget(){return p(I)},get mentionPeople(){return p(Ae)},get replyDisabled(){return p(Y)},get headerLabel(){return p(F)},get headerDetail(){return p(e)},get openHref(){return p(k).canonical_path},get currentUserID(){return p(t)},get reactionController(){return E},get editController(){return O},get editScope(){return p(k).target_id},onMessageEdited:Ne,get reactionsDisabled(){return p(n)},onReplyBody:e=>A.updateDraft(e),onSubmitReply:()=>void Q(),onReplyKeydown:Ve,onReplyFocus:()=>{},onReplyInputRef:e=>y(L,e,!0),onSetReplyTarget:e=>He(e),onClearReply:Ue,onActivateThreadComposer:()=>{},onInlineImagePointerUp:Ge,onJumpToQuote:We,onOpenImage:(e,t)=>y(V,{url:e,title:t},!0),onOpenArtifact:Ke})}n(r);var a=h(r,2),c=e=>{var t=D(),n=g(t);v(()=>o(n,`Mentions unavailable: ${p(J)??``}`)),s(e,t)};l(a,e=>{p(J)&&e(c)});var u=h(a,2),f=e=>{var t=D(),n=g(t,!0);v(()=>o(n,p(R))),s(e,t)};l(u,e=>{p(R)&&e(f)}),n(t),s(e,t)},Xe=e=>{var t=Ce(),r=m(t),i=m(r);fe(i,{class:`embed-mark`,size:42}),ne(6),n(r),n(t),s(e,t)},Ze=e=>{var t=we();s(e,t)},Qe=e=>{var t=Te();s(e,t)},$e=e=>{var t=Ee(),r=m(t),i=h(m(r),2),a=g(i,!0),c=h(i,2);n(r),n(t),v(()=>o(a,p(u))),ee(`click`,c,()=>void Z()),s(e,t)},et=e=>{var t=De();s(e,t)};l(Je,e=>{p(c)===`ready`&&p(j)&&p(k)?e(Ye):p(c)===`auth`?e(Xe,1):p(c)===`forbidden`?e(Ze,2):p(c)===`not-found`?e(Qe,3):p(c)===`error`?e($e,4):e(et,-1)});var tt=h(Je,2),nt=e=>{pe(e,{get url(){return p(V).url},get title(){return p(V).title},onClose:()=>y(V,null)})};l(tt,e=>{p(V)&&e(nt)}),s(e,qe),f()}a([`click`]);function k(e,t){i(t,!0);var n=u(),r=_(n);c(r,()=>`${t.params.workspaceID}:${t.params.messageID}`,e=>{O(e,{get workspaceRouteID(){return t.params.workspaceID},get messageRouteID(){return t.params.messageID}})}),s(e,n),f()}export{k as component,E as universal}; \ No newline at end of file diff --git a/apps/api/internal/webassets/dist/_app/immutable/nodes/13.DL55_vZx.js b/apps/api/internal/webassets/dist/_app/immutable/nodes/13.DL55_vZx.js new file mode 100644 index 000000000..09d3cbe43 --- /dev/null +++ b/apps/api/internal/webassets/dist/_app/immutable/nodes/13.DL55_vZx.js @@ -0,0 +1 @@ +import{t as e}from"../chunks/DK3Fl9T5.js";import{$ as t,At as n,E as r,Et as i,H as a,I as o,L as s,N as c,P as l,R as u,St as d,Tt as f,U as ee,Y as p,ft as m,gt as te,ht as h,kt as ne,mt as g,n as re,nt as ie,pt as _,r as ae,st as v,ut as oe,vt as y,yt as b,z as x}from"../chunks/BTIB_WQZ.js";import"../chunks/xihTtKlq.js";import{i as se,n as S,t as C,u as w}from"../chunks/DEPNME54.js";import{d as ce}from"../chunks/Dqjw8vaP.js";import{D as le,E as ue,R as de,T,f as fe,p as pe,w as me}from"../chunks/BNjDjM6i.js";import{c as he}from"../chunks/ByQ3bZN5.js";import{t as ge}from"../chunks/DlGnnCJo.js";import{r as _e,t as ve}from"../chunks/DuhkHvCz.js";import{r as ye,t as be}from"../chunks/BIhzYFGW.js";var E=e({prerender:()=>!1,ssr:()=>!1}),xe=x(``),D=x(`

                `),Se=x(`
                `),Ce=x(`

                Sign in to ClickClack

                Open ClickClack in a new tab, sign in, then return here. This panel will reconnect automatically.

                Open ClickClack
                `),we=x(`
                `),Te=x(`

                Channel deleted

                This thread and its channel have been permanently removed.

                `),Ee=x(`
                `),De=x(`
                `),Oe=x(`
                `),ke=x(` `,1);function O(e,a){i(a,!0);let c=b(`loading`),u=b(``),x=b(null),E=new me(()=>p(x)?.id||``),O=new le(Ne),k=b(null),A=new _e(()=>`${a.workspaceRouteID}:${a.messageRouteID}`,Ie),j=d(()=>A.root),M=d(()=>A.replies),N=d(()=>A.state),P=b(null),F=b(`Thread`),Ae=d(()=>A.draft?.body??``),I=d(()=>A.draft?.quote??null),L=b(null),R=d(()=>A.draft?.error||A.error||p(z)),z=b(``),B=d(()=>A.draft?.sending??!1),V=b(null),H=null,U=0,W=!1,G=b(te([])),K=0,q=null,J=b(``),Y=d(()=>p(B)||!(!p(P)||p(P).can_send)),je=d(()=>{let e=new Map;for(let t of p(G))t.id&&!t.deleted_at&&e.set(t.id,t);for(let t of p(P)?.members??[])t.id&&t.handle?.trim()&&!t.deleted_at&&e.set(t.id,t);for(let t of p(j)?[p(j),...p(M)]:p(M))t.author?.id&&t.author.handle?.trim()&&!t.author.deleted_at&&e.set(t.author.id,t.author);return p(x)?.id&&e.set(p(x).id,p(x)),[...e.values()]});async function Me(e){let t=++K;q?.abort();let n=new AbortController;q=n,y(J,``),y(G,[],!0);try{let r=await be({workspaceID:e,limit:100,signal:n.signal});t===K&&y(G,r.map(e=>e.user),!0)}catch(e){!n.signal.aborted&&t===K&&(y(G,[],!0),y(J,ye(e),!0))}}async function Ne(e,n){let r=A.selection,i=()=>e===p(k)?.target_id&&A.isCurrent(r)&&O.session(e)?.generation===n.generation;if(i()&&await A.target({messageID:n.messageID,threadSeq:n.threadSeq},i))for(let e=0;e<4;e+=1){if(await t(),!i())return;let e=document.querySelector(`[aria-label="Embedded thread"]`)?.querySelector(`[data-message-id="${CSS.escape(n.messageID)}"]`)?.querySelector(`textarea[aria-label="Edit message"]`);if(e){e.focus({preventScroll:!0});return}}}function Pe(e){A.updateMessage(e)}function X(){K+=1,q?.abort(),H?.close(),H=null,y(k,null),A.close(),E.clear(),O.clear(),y(P,null),y(V,null)}function Z(e){if(X(),e instanceof T){y(c,`forbidden`);return}if(e instanceof C){if(e.status===401){y(c,`auth`);return}if(e.status===403){y(c,`forbidden`);return}if(e.status===404){y(c,`not-found`);return}}y(u,w(e,`Could not load this thread.`),!0),y(c,`error`)}async function Fe(e,t){if(e.parent_type===`direct`){let n=(await S(`/api/dms?workspace_id=${encodeURIComponent(e.workspace_id)}`)).conversations.find(t=>t.id===e.parent_id);n||=(await S(`/api/dms/${encodeURIComponent(e.parent_id)}`)).conversation,y(P,n,!0),y(F,he(n,t.id)||`Direct message`,!0);return}let n=(await S(`/api/workspaces/${encodeURIComponent(e.workspace_id)}/channels`)).channels.find(t=>t.id===e.parent_id);if(!n)throw new C(404,`Thread channel not found`);y(P,null),y(F,`#${ge(n)}`)}async function Q(){if(W)return;W=!0;let e=++U;p(c)!==`auth`&&y(c,`loading`),y(u,``);try{let t=await ce(),n=await S(`/api/routes/${encodeURIComponent(a.workspaceRouteID)}/${encodeURIComponent(a.messageRouteID)}`);if(n.route.target_type!==`thread`)throw new C(404,`Thread route not found`);if(e!==U)return;A.select(n.route.target_id);let[r]=await Promise.all([A.open(()=>e===U),Fe(n.route,t.user)]);if(!r||e!==U||!A.root)return;y(x,t.user,!0),y(k,n.route,!0),Me(n.route.workspace_id),y(c,`ready`),Be(n.route.workspace_id)}catch(t){e===U&&Z(t)}finally{e===U&&(W=!1)}}function Ie(e=[]){p(j)&&(E.seedMessages(e),O.reconcile(p(k)?.target_id||p(j).id,[p(j),...p(M)]))}function Le(e){if(!p(j))return!1;if(e.payload.root_message_id)return e.payload.root_message_id===p(j).id;let t=e.payload.message_id;return t===p(j).id||p(M).some(e=>e.id===t)}async function Re(e,t){if(e.type===`channel.deleted`&&p(j)?.channel_id&&e.payload.channel_id===p(j).channel_id){U+=1,W=!1,X(),y(c,`deleted`);return}if(Le(e)&&(e.type===`reaction.added`||e.type===`reaction.removed`)){E.applyEvent(e);return}await A.handleEvent(e,t)}function ze(e){if(p(c)===`ready`){if(e instanceof T||e instanceof C&&[401,403,404].includes(e.status)){Z(e);return}y(z,w(e,`Could not process a realtime update.`),!0)}}function Be(e){H?.close(),H=ue({workspaceID:e,onEvent:Re,onOpen:async(e,t)=>{t&&(E.clear(),await A.refresh(e)),e()&&y(z,``)},onError:ze})}async function Ve(){p(Y)||await A.send(e=>{e instanceof C&&e.status===401&&Z(e)})}function He(e){if(e.key===`Escape`&&p(I)){e.preventDefault(),A.setQuote(null);return}e.key===`Enter`&&!e.shiftKey&&(e.preventDefault(),Ve())}function Ue(e){p(B)||(A.setQuote(e),t().then(()=>p(L)?.focus()))}function We(){p(B)||A.setQuote(null)}function Ge(e){e.quoted_message_id&&A.target({messageID:e.quoted_message_id})}function Ke(e){let t=e.target;t instanceof HTMLImageElement&&t.closest(`.markdown`)&&(e.preventDefault(),y(V,{url:de(t),title:t.alt||`Image`},!0))}function qe(e){let t=window.open(se(`/api/uploads/${e.id}`),`_blank`,`noopener,noreferrer`);t&&(t.opener=null)}function $(){p(c)===`auth`&&document.visibilityState===`visible`&&Q()}ae(()=>{Q(),window.addEventListener(`focus`,$),document.addEventListener(`visibilitychange`,$)}),re(()=>{U+=1,K+=1,q?.abort(),H?.close(),window.removeEventListener(`focus`,$),document.removeEventListener(`visibilitychange`,$)});var Je=ke();r(`b3w79y`,e=>{var t=xe();ie(()=>{oe.title=`ClickClack thread`}),s(e,t)});var Ye=_(Je),Xe=e=>{var t=Se(),r=m(t),i=m(r);{let e=d(()=>`Thread · ${p(N)?.reply_count??p(M).length} ${(p(N)?.reply_count??p(M).length)===1?`reply`:`replies`}`),t=d(()=>p(x)?.id),n=d(()=>!(!p(P)||p(P).can_send));ve(i,{get history(){return A},get root(){return p(j)},get replies(){return p(M)},get threadState(){return p(N)},get replyBody(){return p(Ae)},get replyTarget(){return p(I)},get mentionPeople(){return p(je)},get replyDisabled(){return p(Y)},get headerLabel(){return p(F)},get headerDetail(){return p(e)},get openHref(){return p(k).canonical_path},get currentUserID(){return p(t)},get reactionController(){return E},get editController(){return O},get editScope(){return p(k).target_id},onMessageEdited:Pe,get reactionsDisabled(){return p(n)},onReplyBody:e=>A.updateDraft(e),onSubmitReply:()=>void Ve(),onReplyKeydown:He,onReplyFocus:()=>{},onReplyInputRef:e=>y(L,e,!0),onSetReplyTarget:e=>Ue(e),onClearReply:We,onActivateThreadComposer:()=>{},onInlineImagePointerUp:Ke,onJumpToQuote:Ge,onOpenImage:(e,t)=>y(V,{url:e,title:t},!0),onOpenArtifact:qe})}n(r);var a=h(r,2),c=e=>{var t=D(),n=g(t);v(()=>o(n,`Mentions unavailable: ${p(J)??``}`)),s(e,t)};l(a,e=>{p(J)&&e(c)});var u=h(a,2),f=e=>{var t=D(),n=g(t,!0);v(()=>o(n,p(R))),s(e,t)};l(u,e=>{p(R)&&e(f)}),n(t),s(e,t)},Ze=e=>{var t=Ce(),r=m(t),i=m(r);fe(i,{class:`embed-mark`,size:42}),ne(6),n(r),n(t),s(e,t)},Qe=e=>{var t=we();s(e,t)},$e=e=>{var t=Te();s(e,t)},et=e=>{var t=Ee();s(e,t)},tt=e=>{var t=De(),r=m(t),i=h(m(r),2),a=g(i,!0),c=h(i,2);n(r),n(t),v(()=>o(a,p(u))),ee(`click`,c,()=>void Q()),s(e,t)},nt=e=>{var t=Oe();s(e,t)};l(Ye,e=>{p(c)===`ready`&&p(j)&&p(k)?e(Xe):p(c)===`auth`?e(Ze,1):p(c)===`forbidden`?e(Qe,2):p(c)===`deleted`?e($e,3):p(c)===`not-found`?e(et,4):p(c)===`error`?e(tt,5):e(nt,-1)});var rt=h(Ye,2),it=e=>{pe(e,{get url(){return p(V).url},get title(){return p(V).title},onClose:()=>y(V,null)})};l(rt,e=>{p(V)&&e(it)}),s(e,Je),f()}a([`click`]);function k(e,t){i(t,!0);var n=u(),r=_(n);c(r,()=>`${t.params.workspaceID}:${t.params.messageID}`,e=>{O(e,{get workspaceRouteID(){return t.params.workspaceID},get messageRouteID(){return t.params.messageID}})}),s(e,n),f()}export{k as component,E as universal}; \ No newline at end of file diff --git a/apps/api/internal/webassets/dist/_app/immutable/nodes/3.DL068NCn.js b/apps/api/internal/webassets/dist/_app/immutable/nodes/3.yc9nZP6z.js similarity index 73% rename from apps/api/internal/webassets/dist/_app/immutable/nodes/3.DL068NCn.js rename to apps/api/internal/webassets/dist/_app/immutable/nodes/3.yc9nZP6z.js index 39ac35821..41b2bb294 100644 --- a/apps/api/internal/webassets/dist/_app/immutable/nodes/3.DL068NCn.js +++ b/apps/api/internal/webassets/dist/_app/immutable/nodes/3.yc9nZP6z.js @@ -1,2 +1,2 @@ -const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["../chunks/CmseFvlq.js","../chunks/DK3Fl9T5.js","../chunks/BTIB_WQZ.js","../chunks/CRok6MwI.js","../chunks/Dt-HX3Vu.js","../chunks/BaNbYf_w.js","../chunks/xihTtKlq.js","../chunks/DFzK05fS.js","../chunks/DEPNME54.js","../chunks/Dqjw8vaP.js","../chunks/B4px22Nd.js","../chunks/DBpO2iwN.js","../chunks/j4GI4VLW.js","../chunks/T0GVabNa.js","../chunks/ByQ3bZN5.js","../assets/QuoteBlock.Bmfc9wvU.css","../chunks/C16fMXIp.js","../chunks/DLuhiCle.js","../chunks/DlGnnCJo.js","../chunks/CmtSSHF9.js","../chunks/DfsrRaIf.js","../assets/ThreadPanel.DFXp9CyT.css","../chunks/CVdgRPye.js","../chunks/BIhzYFGW.js","../assets/ChatApp.BrxGlI__.css","../chunks/BRaTlnvd.js","../assets/ProductSite.BGg6Zt1K.css"])))=>i.map(i=>d[i]); -import{t as e}from"../chunks/DK3Fl9T5.js";import{F as t,L as n,R as r,Y as i,pt as a,xt as o}from"../chunks/BTIB_WQZ.js";import{t as s}from"../chunks/BaNbYf_w.js";import"../chunks/xihTtKlq.js";import"../chunks/j4GI4VLW.js";var c=e({prerender:()=>!0});function l(e){let c=window.location.hostname.startsWith(`app.`)?s(()=>import(`../chunks/CmseFvlq.js`).then(e=>e.n),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24]),import.meta.url):s(()=>import(`../chunks/BRaTlnvd.js`),__vite__mapDeps([25,2,1,6,12,26]),import.meta.url);var l=r(),u=a(l);t(u,()=>c,null,(e,t)=>{let n=o(()=>i(t).default);i(n)(e,{})}),n(e,l)}export{l as component,c as universal}; \ No newline at end of file +const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["../chunks/DACoBCa_.js","../chunks/DK3Fl9T5.js","../chunks/BTIB_WQZ.js","../chunks/CRok6MwI.js","../chunks/Dt-HX3Vu.js","../chunks/BaNbYf_w.js","../chunks/xihTtKlq.js","../chunks/DFzK05fS.js","../chunks/DEPNME54.js","../chunks/Dqjw8vaP.js","../chunks/B4px22Nd.js","../chunks/DBpO2iwN.js","../chunks/j4GI4VLW.js","../chunks/BNjDjM6i.js","../chunks/ByQ3bZN5.js","../assets/QuoteBlock.Bmfc9wvU.css","../chunks/CSysFL2J.js","../chunks/DLuhiCle.js","../chunks/DlGnnCJo.js","../chunks/CmtSSHF9.js","../chunks/DuhkHvCz.js","../assets/ThreadPanel.DFXp9CyT.css","../chunks/CVdgRPye.js","../chunks/BIhzYFGW.js","../assets/ChatApp.BrxGlI__.css","../chunks/BRaTlnvd.js","../assets/ProductSite.BGg6Zt1K.css"])))=>i.map(i=>d[i]); +import{t as e}from"../chunks/DK3Fl9T5.js";import{F as t,L as n,R as r,Y as i,pt as a,xt as o}from"../chunks/BTIB_WQZ.js";import{t as s}from"../chunks/BaNbYf_w.js";import"../chunks/xihTtKlq.js";import"../chunks/j4GI4VLW.js";var c=e({prerender:()=>!0});function l(e){let c=window.location.hostname.startsWith(`app.`)?s(()=>import(`../chunks/DACoBCa_.js`).then(e=>e.n),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24]),import.meta.url):s(()=>import(`../chunks/BRaTlnvd.js`),__vite__mapDeps([25,2,1,6,12,26]),import.meta.url);var l=r(),u=a(l);t(u,()=>c,null,(e,t)=>{let n=o(()=>i(t).default);i(n)(e,{})}),n(e,l)}export{l as component,c as universal}; \ No newline at end of file diff --git a/apps/api/internal/webassets/dist/_app/immutable/nodes/4.CIr3xalv.js b/apps/api/internal/webassets/dist/_app/immutable/nodes/4.Qb9rB3O4.js similarity index 63% rename from apps/api/internal/webassets/dist/_app/immutable/nodes/4.CIr3xalv.js rename to apps/api/internal/webassets/dist/_app/immutable/nodes/4.Qb9rB3O4.js index 42cdff062..b4d174631 100644 --- a/apps/api/internal/webassets/dist/_app/immutable/nodes/4.CIr3xalv.js +++ b/apps/api/internal/webassets/dist/_app/immutable/nodes/4.Qb9rB3O4.js @@ -1 +1 @@ -import"../chunks/BTIB_WQZ.js";import"../chunks/xihTtKlq.js";import"../chunks/j4GI4VLW.js";import{t as e}from"../chunks/CmseFvlq.js";function t(t){e(t,{})}export{t as component}; \ No newline at end of file +import"../chunks/BTIB_WQZ.js";import"../chunks/xihTtKlq.js";import"../chunks/j4GI4VLW.js";import{t as e}from"../chunks/DACoBCa_.js";function t(t){e(t,{})}export{t as component}; \ No newline at end of file diff --git a/apps/api/internal/webassets/dist/_app/immutable/nodes/5.CNg4Lt1d.js b/apps/api/internal/webassets/dist/_app/immutable/nodes/5.C2ZYaQZQ.js similarity index 72% rename from apps/api/internal/webassets/dist/_app/immutable/nodes/5.CNg4Lt1d.js rename to apps/api/internal/webassets/dist/_app/immutable/nodes/5.C2ZYaQZQ.js index e5f7e0a42..af49459f3 100644 --- a/apps/api/internal/webassets/dist/_app/immutable/nodes/5.CNg4Lt1d.js +++ b/apps/api/internal/webassets/dist/_app/immutable/nodes/5.C2ZYaQZQ.js @@ -1 +1 @@ -import{Et as e,Tt as t}from"../chunks/BTIB_WQZ.js";import"../chunks/xihTtKlq.js";import{t as n}from"../chunks/CmseFvlq.js";function r(r,i){e(i,!0),n(r,{get routeWorkspaceID(){return i.params.workspaceID}}),t()}export{r as component}; \ No newline at end of file +import{Et as e,Tt as t}from"../chunks/BTIB_WQZ.js";import"../chunks/xihTtKlq.js";import{t as n}from"../chunks/DACoBCa_.js";function r(r,i){e(i,!0),n(r,{get routeWorkspaceID(){return i.params.workspaceID}}),t()}export{r as component}; \ No newline at end of file diff --git a/apps/api/internal/webassets/dist/index.html b/apps/api/internal/webassets/dist/index.html index 759e8da72..ca33d8d97 100644 --- a/apps/api/internal/webassets/dist/index.html +++ b/apps/api/internal/webassets/dist/index.html @@ -110,18 +110,18 @@ - + - + - + - + @@ -136,7 +136,7 @@ Promise.all([ import("./_app/immutable/entry/start.CJgF5gsQ.js"), - import("./_app/immutable/entry/app.B8HOrAvW.js") + import("./_app/immutable/entry/app.mmJ26YUq.js") ]).then(([kit, app]) => { kit.start(app, element); }); diff --git a/apps/web/src/ChatApp.svelte b/apps/web/src/ChatApp.svelte index 3e7b0e849..edc40241b 100644 --- a/apps/web/src/ChatApp.svelte +++ b/apps/web/src/ChatApp.svelte @@ -63,6 +63,8 @@ import PinnedPanel from "./components/pins/PinnedPanel.svelte"; import SearchResults from "./components/search/SearchResults.svelte"; import ChannelSettingsModal from "./components/settings/ChannelSettingsModal.svelte"; + import DeleteChannelModal from "./components/settings/DeleteChannelModal.svelte"; + import { channelDeletedNotice } from "./lib/channel-deletion"; import SettingsModal from "./components/settings/SettingsModal.svelte"; import ThreadEmptyState from "./components/thread/ThreadEmptyState.svelte"; import ThreadPanel from "./components/thread/ThreadPanel.svelte"; @@ -72,7 +74,7 @@ import { workspaceSettingsPath, type AccountSettingsSectionId } from "./lib/settings"; import { respondingAgentNames } from "./lib/agent-responding"; import { listAllWorkspaceMembers, memberLoadErrorMessage } from "./lib/workspace-members"; - import type { Channel, ChannelNotificationPreference, DirectConversation, MemberModeration, Message, MessagePage, RealtimeEvent, RouteTarget, SearchResult, SearchScope, SearchSession, SlashCommand, ThreadPage, Topic, Upload, User, Workspace, WorkspaceBotCommand } from "./lib/types"; + import type { Channel, ChannelDeletionPreview, ChannelNotificationPreference, DirectConversation, MemberModeration, Message, MessagePage, RealtimeEvent, RouteTarget, SearchResult, SearchScope, SearchSession, SlashCommand, ThreadPage, Topic, Upload, User, Workspace, WorkspaceBotCommand } from "./lib/types"; import { dispatchSlashCommand, findRegisteredCommand, listBotCommands, splitSlashDraft } from "./lib/commands"; const LIVE_EDGE_TOLERANCE_PX = 96; @@ -168,6 +170,14 @@ let channelSettingsOpen = false; let channelSettingsSaving = false; let channelSettingsError = ""; + let deleteChannelTarget: Channel | null = null; + let deleteChannelPreview: ChannelDeletionPreview | null = null; + let deleteChannelLoading = false; + let deleteChannelDeleting = false; + let deleteChannelError = ""; + let deleteChannelSerial = 0; + // A notice that must survive leaving the conversation it describes. + let carriedComposerNotice: { fromConversation: string; text: string } | null = null; let showCreateChannel = false; let showCreateDirect = false; let browserNotificationsEnabled = false; @@ -224,6 +234,7 @@ let messageLoadGeneration = 0; let workspacesLoadSerial = 0; let channelsLoadSerial = 0; + const deletedChannelIDs = new Set(); let topicsLoadSerial = 0; let directConversationsLoadSerial = 0; let moderationMembersLoadSerial = 0; @@ -263,6 +274,7 @@ ? moderationMembers.find((member) => member.user.id === selectedProfile?.id) : undefined; $: selectedChannel = channels.find((channel) => channel.id === selectedChannelID); + $: canDeleteSelectedChannel = Boolean(selectedChannel) && selectedWorkspace?.role === "owner"; $: canManageSelectedChannel = Boolean(selectedChannel) && canAdministerChannels(selectedWorkspace?.role); $: eligibleTopics = topicsForChannel(topics, selectedChannelID); $: activeTopic = eligibleTopics.find((topic) => topic.id === activeTopicFilterID); @@ -564,6 +576,102 @@ } } + async function openDeleteChannel() { + const channel = selectedChannel; + if (!channel || !canDeleteSelectedChannel) return; + const serial = ++deleteChannelSerial; + channelSettingsOpen = false; + channelSettingsError = ""; + deleteChannelTarget = channel; + deleteChannelPreview = null; + deleteChannelError = ""; + deleteChannelLoading = true; + try { + const preview = await api(`/api/channels/${channel.id}/deletion-preview`); + if (serial === deleteChannelSerial) deleteChannelPreview = preview; + } catch (error) { + if (serial === deleteChannelSerial) deleteChannelError = readableAPIError(error, "Could not check what this channel contains"); + } finally { + if (serial === deleteChannelSerial) deleteChannelLoading = false; + } + } + + function closeDeleteChannel() { + if (deleteChannelDeleting) return; + deleteChannelSerial += 1; + deleteChannelTarget = null; + deleteChannelPreview = null; + deleteChannelLoading = false; + deleteChannelError = ""; + } + + function archiveInsteadOfDeleting() { + const channelID = deleteChannelTarget?.id; + closeDeleteChannel(); + // Archiving keeps its own confirmation in channel settings. + if (channelID && channelID === selectedChannelID) openChannelSettings(); + } + + async function confirmDeleteChannel() { + const channel = deleteChannelTarget; + if (!channel || deleteChannelDeleting) return; + deleteChannelDeleting = true; + deleteChannelError = ""; + try { + await api(`/api/channels/${channel.id}`, { method: "DELETE" }); + } catch (error) { + deleteChannelError = readableAPIError(error, "Could not delete channel"); + deleteChannelDeleting = false; + return; + } + deleteChannelDeleting = false; + closeDeleteChannel(); + // The realtime event can arrive before this response and remove it first. + if (channels.some((candidate) => candidate.id === channel.id)) { + await removeDeletedChannel(channel.id, channelDeletedNotice(channelDisplayTitle(channel), "", true)); + } + } + + async function handleChannelDeletedEvent(event: RealtimeEvent) { + const channelID = event.payload.channel_id; + // The DELETE response and its realtime echo share the same terminal fact. + // Keep the original notice while reconciling previously unknown IDs once. + if (!channelID || deletedChannelIDs.has(channelID)) return; + const channel = channels.find((candidate) => candidate.id === channelID); + const deletedBy = event.payload.deleted_by || ""; + const actor = mentionPeople.find((person) => person.id === deletedBy)?.display_name || ""; + const notice = channelDeletedNotice(channel ? channelDisplayTitle(channel) : event.payload.channel_name || "channel", actor, deletedBy === user?.id); + await removeDeletedChannel(channelID, notice); + } + + async function removeDeletedChannel(channelID: string, notice: string) { + const wasSelected = selectedChannelID === channelID; + // Reconcile every later read, including requests that captured data before + // the deletion event. Channel IDs are never reused. + deletedChannelIDs.add(channelID); + channels = channels.filter((candidate) => candidate.id !== channelID); + scrollMemory.delete(channelID); + messageWindows.delete(channelID); + if (thread.root?.channel_id === channelID) thread.close(); + if (searchSession) { + searchSession = { + ...searchSession, + results: searchSession.results.filter((result) => result.channel_id !== channelID), + activeResultID: searchSession.results.some((result) => result.id === searchSession?.activeResultID && result.channel_id === channelID) ? "" : searchSession.activeResultID, + }; + } + if (deleteChannelTarget?.id === channelID) { + deleteChannelDeleting = false; + closeDeleteChannel(); + } + if (!wasSelected) return; + channelSettingsOpen = false; + channelSettingsError = ""; + carriedComposerNotice = { fromConversation: channelID, text: notice }; + clearRoutePanelState(); + await navigateToApp(selectedWorkspaceID, defaultTargetID(), true); + } + function handleSettingsUserUpdated(updated: User) { user = updated; updateActiveAuthor(updated); @@ -1034,7 +1142,7 @@ const serial = ++channelsLoadSerial; const data = await api<{ channels: Channel[] }>(`/api/workspaces/${workspaceID}/channels`); if (serial !== channelsLoadSerial || workspaceID !== selectedWorkspaceID) return; - channels = data.channels; + channels = data.channels.filter((channel) => !deletedChannelIDs.has(channel.id)); if (selectFallback) { selectedChannelID = channels.find((channel) => channel.id === selectedChannelID)?.id || @@ -1181,9 +1289,13 @@ } } - function clearComposerNoticeFor(_conversationKey: string) { + function clearComposerNoticeFor(conversationKey: string) { slashDispatchGeneration += 1; composerNotice = null; + if (carriedComposerNotice && conversationKey !== carriedComposerNotice.fromConversation) { + composerNotice = { kind: "ephemeral", text: carriedComposerNotice.text }; + carriedComposerNotice = null; + } } async function updateMemberModeration(userID: string, body: Record) { @@ -2689,7 +2801,7 @@ } function isModalOpen(): boolean { - return pendingDeleteMessage !== null || selectedImage !== null || settingsModalOpen || channelSettingsOpen || showCreateChannel || showCreateDirect; + return pendingDeleteMessage !== null || selectedImage !== null || settingsModalOpen || channelSettingsOpen || deleteChannelTarget !== null || showCreateChannel || showCreateDirect; } function activeComposerTarget(): HTMLTextAreaElement | null { @@ -2799,7 +2911,7 @@ `/api/search?${searchPageParams(session).toString()}`, ); if (requestID !== searchRequestID) return; - searchSession = { ...session, results: data.results, nextCursor: data.next_cursor, state: "ready" }; + searchSession = { ...session, results: data.results.filter((result) => !deletedChannelIDs.has(result.channel_id || "")), nextCursor: data.next_cursor, state: "ready" }; } catch (error) { if (requestID !== searchRequestID) return; searchSession = { @@ -2831,7 +2943,7 @@ const seen = new Set(searchSession.results.map((result) => result.id)); searchSession = { ...searchSession, - results: [...searchSession.results, ...data.results.filter((result) => !seen.has(result.id))], + results: [...searchSession.results, ...data.results.filter((result) => !seen.has(result.id) && !deletedChannelIDs.has(result.channel_id || ""))], nextCursor: data.next_cursor, loadingMore: false, }; @@ -3269,6 +3381,10 @@ if (event.workspace_id === selectedWorkspaceID) await handleBotMembershipRemovedEvent(event); return; } + if (event.type === "channel.deleted" && event.workspace_id === selectedWorkspaceID) { + await handleChannelDeletedEvent(event); + return; + } if ((event.type === "channel.created" || event.type === "channel.updated") && event.workspace_id === selectedWorkspaceID) { await loadChannels(false, false, false); return; @@ -3845,7 +3961,7 @@ function closeModal() { if (pendingDeleteMessage && deletingMessageIDs.has(pendingDeleteMessage.id)) return; - if (channelSettingsSaving) return; + if (channelSettingsSaving || deleteChannelDeleting) return; resetCreateActions(); pendingDeleteMessage = null; deleteMessageError = ""; @@ -3853,6 +3969,7 @@ settingsModalOpen = false; channelSettingsOpen = false; channelSettingsError = ""; + closeDeleteChannel(); } function closeMobileNav() { @@ -4308,8 +4425,22 @@ channel={selectedChannel} saving={channelSettingsSaving} error={channelSettingsError} + canDelete={canDeleteSelectedChannel} onClose={closeModal} onArchivedChange={(archived) => void setSelectedChannelArchived(archived)} + onDelete={() => void openDeleteChannel()} + /> +{/if} +{#if deleteChannelTarget} + void confirmDeleteChannel()} /> {/if} {#if showCreateChannel} diff --git a/apps/web/src/components/embed/EmbedChannelView.svelte b/apps/web/src/components/embed/EmbedChannelView.svelte index 3ab496171..a7ceec470 100644 --- a/apps/web/src/components/embed/EmbedChannelView.svelte +++ b/apps/web/src/components/embed/EmbedChannelView.svelte @@ -43,7 +43,7 @@ quotedMessageID?: string; }; - type ViewState = "loading" | "ready" | "auth" | "forbidden" | "not-found" | "error"; + type ViewState = "loading" | "ready" | "auth" | "forbidden" | "not-found" | "deleted" | "error"; let { workspaceRouteID, channelRouteID }: Props = $props(); @@ -371,6 +371,14 @@ async function handleRealtimeEvent(event: RealtimeEvent, isCurrent: () => boolean) { if (!channel || eventChannelID(event) !== channel.id) return; + if (event.type === "channel.deleted") { + loadSerial += 1; + loadPending = false; + clearChannel(); + messageBody = ""; + viewState = "deleted"; + return; + } if (event.type === "message.created") { const eventSeq = event.seq || event.payload.seq || 0; if (eventSeq > 0 && eventSeq <= newestSeq) return; @@ -615,6 +623,13 @@

                You are not a member of this workspace or do not have permission to view this channel.

                +{:else if viewState === "deleted"} +
                +
                +

                Channel deleted

                +

                This channel and its history have been permanently removed.

                +
                +
                {:else if viewState === "not-found"}
                +{:else if viewState === "deleted"} +
                +
                +

                Channel deleted

                +

                This thread and its channel have been permanently removed.

                +
                +
                {:else if viewState === "not-found"}
                {/if} + + {#if canDelete && onDelete} +
                +
                + Delete channel +

                Permanently erase this channel with its messages, threads, files, and pins.

                +
                +
                + +
                +
                + {/if} diff --git a/apps/web/src/components/settings/DeleteChannelModal.svelte b/apps/web/src/components/settings/DeleteChannelModal.svelte new file mode 100644 index 000000000..df5a68fe9 --- /dev/null +++ b/apps/web/src/components/settings/DeleteChannelModal.svelte @@ -0,0 +1,129 @@ + + + diff --git a/apps/web/src/lib/channel-deletion.ts b/apps/web/src/lib/channel-deletion.ts new file mode 100644 index 000000000..a7a3af89a --- /dev/null +++ b/apps/web/src/lib/channel-deletion.ts @@ -0,0 +1,30 @@ +import type { Channel, ChannelDeletionPreview } from "./types"; + +// Deletion is confirmed by typing the channel's routing name, not its display title. +export function channelDeletionConfirmed(typed: string, channel: Pick): boolean { + return typed.trim() === channel.name; +} + +export function channelDeletionBlockerMessage( + preview: Pick, +): string { + switch (preview.blocker) { + case "last_channel": + return "A workspace must keep at least one channel. Create another channel first, or delete the workspace instead."; + case "provisioned_channel": + return "Guest sign-in recreates this channel, so it can't be deleted."; + default: + return ""; + } +} + +export function channelDeletedNotice( + channelTitle: string, + deletedBy: string, + byCurrentUser = false, +): string { + if (byCurrentUser) return `Deleted #${channelTitle}.`; + return deletedBy + ? `#${channelTitle} was deleted by ${deletedBy}.` + : `#${channelTitle} was deleted.`; +} diff --git a/apps/web/src/lib/types.ts b/apps/web/src/lib/types.ts index 3d9c7aedc..810d068ca 100644 --- a/apps/web/src/lib/types.ts +++ b/apps/web/src/lib/types.ts @@ -73,6 +73,21 @@ export type Channel = { unread_count?: number; }; +export type ChannelDeletionCounts = { + messages: number; + thread_replies: number; + pins: number; + topics: number; + files: number; + file_bytes: number; +}; + +export type ChannelDeletionPreview = { + channel: Channel; + counts: ChannelDeletionCounts; + blocker?: "last_channel" | "provisioned_channel"; +}; + export type Topic = { id: string; workspace_id: string; @@ -330,6 +345,7 @@ export type EventPayload = { display_name?: string; former_handle?: string; deleted_at?: string; + deleted_by?: string; }; export type RealtimeEvent = { diff --git a/apps/web/src/lib/uploads.ts b/apps/web/src/lib/uploads.ts index bf47b3b72..cc602ed44 100644 --- a/apps/web/src/lib/uploads.ts +++ b/apps/web/src/lib/uploads.ts @@ -16,5 +16,6 @@ export function isVideoUpload(upload: Upload): boolean { export function formatBytes(size: number): string { if (size < 1024) return `${size} B`; if (size < 1024 * 1024) return `${Math.round(size / 1024)} KB`; - return `${(size / (1024 * 1024)).toFixed(1)} MB`; + if (size < 1024 * 1024 * 1024) return `${(size / (1024 * 1024)).toFixed(1)} MB`; + return `${(size / (1024 * 1024 * 1024)).toFixed(1)} GB`; } diff --git a/apps/web/src/styles/modals.css b/apps/web/src/styles/modals.css index 18609415c..99feb30b6 100644 --- a/apps/web/src/styles/modals.css +++ b/apps/web/src/styles/modals.css @@ -421,11 +421,185 @@ width: 100%; } +.channel-settings-danger { + display: grid; + grid-template-columns: minmax(0, 1fr) auto; + align-items: center; + gap: 12px; + padding: 12px; + border: 1px solid color-mix(in srgb, var(--danger) 40%, var(--line-strong)); + border-radius: var(--radius); + background: color-mix(in srgb, var(--danger) 6%, var(--panel-2)); +} + +.channel-settings-danger strong { + color: var(--text-strong); + font-size: 14px; +} + +.channel-settings-content .channel-settings-danger p { + margin-top: 4px; +} + +.channel-settings-danger__actions { + padding-top: 0; +} + @media (max-width: 520px) { .channel-settings-content, .channel-settings-modal > header { padding-inline: 16px; } + + .channel-settings-danger { + grid-template-columns: minmax(0, 1fr); + } +} + +/* ---------- DELETE CHANNEL ---------- */ + +.delete-channel-scrim { + padding: 20px; +} + +.delete-channel-modal { + width: min(540px, 100%); +} + +.delete-channel-modal > header p.delete-channel-eyebrow { + color: var(--danger); +} + +.delete-channel-content { + display: grid; + gap: 16px; + padding: 14px 20px 20px; +} + +.delete-channel-content p { + margin: 0; + font-size: 14px; + line-height: 1.5; +} + +.delete-channel-warning { + padding: 12px; + border: 1px solid color-mix(in srgb, var(--danger) 45%, var(--line-strong)); + border-radius: var(--radius); + background: color-mix(in srgb, var(--danger) 9%, var(--panel-2)); + color: var(--text-strong); +} + +.delete-channel-counts { + display: grid; + grid-template-columns: repeat(4, minmax(0, 1fr)); + margin: 0; + overflow: hidden; + border: 1px solid var(--line-strong); + border-radius: var(--radius); +} + +.delete-channel-counts > div { + display: grid; + gap: 2px; + padding: 10px 12px; + border-left: 1px solid var(--line); + background: var(--panel-2); +} + +.delete-channel-counts > div:first-child { + border-left: 0; +} + +.delete-channel-counts dt { + order: 2; + color: var(--muted); + font-family: var(--font-mono); + font-size: 10px; + letter-spacing: 0.08em; + text-transform: uppercase; +} + +.delete-channel-counts dd { + margin: 0; + color: var(--text-strong); + font-family: var(--font-display); + font-size: 19px; + font-weight: 700; +} + +.delete-channel-consequences { + display: grid; + gap: 6px; + margin: 0; + padding-left: 18px; + color: var(--text); + font-size: 13px; + line-height: 1.45; +} + +.delete-channel-consequences .is-warning { + color: var(--text-strong); +} + +.delete-channel-consequences .is-warning::marker { + color: var(--warn); +} + +.delete-channel-confirm { + display: grid; + gap: 6px; + color: var(--text); + font-size: 13px; +} + +.delete-channel-confirm code { + padding: 1px 6px; + border-radius: var(--radius-sm); + background: var(--panel-3); + color: var(--text-strong); + font-family: var(--font-mono); +} + +.delete-channel-confirm input { + min-height: 40px; + padding: 0 12px; + border: 1px solid var(--line-strong); + border-radius: var(--radius); + background: var(--bg); + color: var(--text-strong); + font-family: var(--font-mono); + font-size: 14px; +} + +.delete-channel-confirm input:focus-visible { + outline: none; + border-color: var(--danger); + box-shadow: 0 0 0 3px color-mix(in srgb, var(--danger) 18%, transparent); +} + +.delete-channel-actions { + flex-wrap: wrap; + padding-top: 0; +} + +.delete-channel-actions > :first-child { + margin-right: auto; +} + +@media (max-width: 520px) { + .delete-channel-content, + .delete-channel-modal > header { + padding-inline: 16px; + } + + .delete-channel-counts { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + + .delete-channel-counts > div:nth-child(3) { + border-left: 0; + } } /* ---------- IMAGE VIEWER ---------- */ diff --git a/docs/cli.md b/docs/cli.md index 096d29cf4..97bbe2010 100644 --- a/docs/cli.md +++ b/docs/cli.md @@ -355,6 +355,19 @@ Human output confirms the action without echoing the reaction value. `--json` prints the API's `{event,reactions}` response. `--plain` is unsupported and fails before making a request. +Workspace owners can delete a channel with its full history: + +```sh +clickclack channels delete --channel old-launch --yes +``` + +The command needs `--channel` on its command line; `CLICKCLACK_CHANNEL` and the +saved default channel are ignored. It fetches the deletion preview first. +Without `--yes` it prints what would be removed and exits with an error; +a blocked deletion (the workspace's last channel or a provisioned Guests +channel) fails before any delete request. `--plain` prints the deleted channel +ID and `--json` prints `{deleted_channel,counts}`. + ## `canary` ```sh diff --git a/docs/data-model.md b/docs/data-model.md index b1b285e4d..a5fedf658 100644 --- a/docs/data-model.md +++ b/docs/data-model.md @@ -99,12 +99,18 @@ rows cascade when old events are pruned. ## Soft-deletes Messages set `deleted_at` instead of removing the row. This keeps -`channel_seq`/`thread_seq` stable for cursors and reconnect. +`channel_seq`/`thread_seq` stable for cursors and reconnect. Channel and workspace +deletion are the exceptions: they remove rows through foreign-key cascades. The +child keys those cascades look up (`messages.parent_message_id` and +`messages.quoted_message_id`) are indexed so each deleted row does not scan the +messages table. ## FTS SQLite `messages_fts` mirrors `messages.body` with `porter unicode61`. Three -triggers keep it in sync on insert/delete/update-of-body. Postgres search uses +triggers keep it in sync on insert/delete/update-of-body. `message_search_rows` +records each message's FTS rowid, so the triggers replace or remove a row by +rowid instead of scanning the index for its unindexed `message_id`. Postgres search uses `to_tsvector` / `websearch_to_tsquery` against `messages.body`. See [features/search.md](features/search.md). diff --git a/docs/features/messages.md b/docs/features/messages.md index 2101e4833..6f080df30 100644 --- a/docs/features/messages.md +++ b/docs/features/messages.md @@ -244,7 +244,10 @@ clients don't need a second round-trip. Avatar URLs are passed through as-is. ## What is intentionally missing -- Hard delete. The soft-delete row stays for cursor stability. +- Hard delete of individual messages. The soft-delete row stays for cursor + stability. Deleting a whole channel removes its message rows, because the + channel's sequence space disappears with it (see + [workspaces.md](workspaces.md#deleting-channels)). - Per-user message bookmarks. Channel pins are shared workspace state. - Per-message permissions beyond author edit/delete and workspace-owner channel deletion. diff --git a/docs/features/realtime.md b/docs/features/realtime.md index bf26aab46..cbcb03a7c 100644 --- a/docs/features/realtime.md +++ b/docs/features/realtime.md @@ -82,7 +82,7 @@ POST /api/realtime/ephemeral Inserted in the same transaction as the underlying mutation: -- `channel.created`, `channel.updated` +- `channel.created`, `channel.updated`, `channel.deleted` - `message.created`, `message.updated`, `message.deleted` - `channel.read`, `dm.read` - `thread.reply_created`, `thread.state_updated` @@ -127,6 +127,10 @@ top-level `seq` and include `user_id` plus the channel or DM conversation ID in `payload`; they are delivered only to that user. Moderation events carry the target `user_id` and current `role`; they are private to the target user and current owners/moderators. +`channel.deleted` is workspace-scoped: its top-level `channel_id` is empty and +its payload carries the deleted `channel_id` and `deleted_by`. Events recorded +earlier for that channel keep their cursors, so replay from any of them still +reaches the deletion; delivery skips them because the channel no longer exists. ## Ephemeral events diff --git a/docs/features/search.md b/docs/features/search.md index f1d0bef47..0a4d7131b 100644 --- a/docs/features/search.md +++ b/docs/features/search.md @@ -58,7 +58,9 @@ limited to the guest channel. SQLite uses the `messages_fts` FTS5 table with the `porter unicode61` tokenizer. Workspace and body terms are intersected inside FTS so one workspace does not scan matches from another. Triggers keep ordinary message rows synchronized -when bodies are inserted, updated, or deleted. +when bodies are inserted, updated, or deleted. They find a message's search row +through `message_search_rows`, which records its FTS rowid, so deleting a large +channel or workspace does not scan the index once per message. Postgres uses `to_tsvector('simple', body)` with partial GIN indexes for channel messages and direct messages. A separate direct-conversation scope index keeps diff --git a/docs/features/workspaces.md b/docs/features/workspaces.md index c4ef2e34a..aaeed98bc 100644 --- a/docs/features/workspaces.md +++ b/docs/features/workspaces.md @@ -70,6 +70,8 @@ pickers still support manual paging. GET /api/workspaces/{workspace_id}/channels # list, ordered by name POST /api/workspaces/{workspace_id}/channels # create PATCH /api/channels/{channel_id} # rename, change kind, archive +GET /api/channels/{channel_id}/deletion-preview # owner: what deletion removes +DELETE /api/channels/{channel_id} # owner: permanently delete ``` Create body: `{name, display_title?, kind?, external_managed?, external_ref?, @@ -112,14 +114,43 @@ placement. Section and Archived disclosure state is browser-local and persisted per workspace. `external_managed` adds a small row marker, while a safe HTTP(S) `external_url` adds an external-open action to the channel header. +### Deleting channels + +Channel deletion is owner-only, requires a human session, and is permanent. +Archive remains the reversible way to hide a channel. `DELETE` removes the +channel with its messages, thread replies, reactions, pins, channel-scoped +topics, read pointers, notification settings, and the uploads attached only to +that channel. Uploads still attached in another channel or a direct message, +and the workspace icon, are kept. Removed upload objects use the same durable +cleanup queue as workspace deletion. The workspace audit log records the +channel name and the removed counts. + +`GET /deletion-preview` returns `{channel, counts, blocker?}`. `counts` holds +visible `messages`, `thread_replies`, `pins`, `topics`, `files`, and +`file_bytes`. The server refuses (`409`) to delete a workspace's last channel +(`blocker: last_channel`) and the Guests workspace's `#guest` and `#general`, +which guest sign-in recreates (`blocker: provisioned_channel`). Bot tokens, +moderators, and members receive `403`; an unknown channel returns `404`. + +Deletion appends a workspace-scoped `channel.deleted` event whose payload holds +`channel_id` and `deleted_by`. Earlier durable events for the channel carry +only identifiers and stay in the log, so every client's replay cursor remains +valid; live delivery skips them once the channel is gone. They age out through +normal event retention. + +In the web app, owners find **Delete channel** in the channel settings danger +zone. The dialog shows the preview, offers to archive instead, and enables +deletion only after the channel name is typed. Members viewing a deleted +channel return to their fallback conversation with a notice. + Guest workspace members are waiting-room users. They can only see `#guest`, can post three messages per day, and cannot create rooms or DMs. Moderators and owners can promote them to `member`, time them out, or block them. See [moderation.md](moderation.md). -Channel write endpoints emit a durable `channel.created` or `channel.updated` -event into the workspace event stream so connected clients see the change -without polling. `channel.updated` includes the resulting `archived` boolean in +Channel write endpoints emit a durable `channel.created`, `channel.updated`, or +`channel.deleted` event into the workspace event stream so connected clients see +the change without polling. `channel.updated` includes the resulting `archived` boolean in its payload so consumers can update visibility without refetching the channel. ## Web routes diff --git a/packages/protocol/openapi.yaml b/packages/protocol/openapi.yaml index 42c091046..d44e441bf 100644 --- a/packages/protocol/openapi.yaml +++ b/packages/protocol/openapi.yaml @@ -1231,6 +1231,41 @@ paths: responses: "200": description: Updated channel + delete: + operationId: deleteChannel + description: > + Permanently deletes a channel with its messages, thread replies, reactions, + pins, channel topics, read state, notification settings, and the uploads + attached only to it. Requires a workspace owner's human session. Emits the + workspace-scoped `channel.deleted` event. + parameters: + - $ref: "#/components/parameters/channel_id" + responses: + "204": + description: Channel deleted; queued upload-object cleanup may continue asynchronously + "403": + description: Workspace owner session required + "404": + description: Channel not found + "409": + description: The workspace's last channel or a provisioned Guests channel cannot be deleted + /api/channels/{channel_id}/deletion-preview: + get: + operationId: getChannelDeletionPreview + description: Describes what deleting the channel removes and whether a rule blocks it. Owner-only. + parameters: + - $ref: "#/components/parameters/channel_id" + responses: + "200": + description: Channel deletion preview + content: + application/json: + schema: + $ref: "#/components/schemas/ChannelDeletionPreview" + "403": + description: Workspace owner session required + "404": + description: Channel not found /api/channels/{channel_id}/messages: get: operationId: listMessages @@ -3250,6 +3285,41 @@ components: moderation_at: type: string format: date-time + ChannelDeletionPreview: + type: object + required: [channel, counts] + properties: + channel: + $ref: "#/components/schemas/Channel" + counts: + $ref: "#/components/schemas/ChannelDeletionCounts" + blocker: + type: string + enum: [last_channel, provisioned_channel] + description: Rule that prevents deleting this channel, when one applies. + ChannelDeletionCounts: + type: object + description: Visible content removed with the channel. Files are uploads attached only to this channel. + required: [messages, thread_replies, pins, topics, files, file_bytes] + properties: + messages: + type: integer + format: int64 + thread_replies: + type: integer + format: int64 + pins: + type: integer + format: int64 + topics: + type: integer + format: int64 + files: + type: integer + format: int64 + file_bytes: + type: integer + format: int64 Channel: type: object required: [id, route_id, workspace_id, name, kind, created_at, external_managed] diff --git a/packages/sdk-ts/src/generated/openapi.d.ts b/packages/sdk-ts/src/generated/openapi.d.ts index 8b27fd480..f40d6a9df 100644 --- a/packages/sdk-ts/src/generated/openapi.d.ts +++ b/packages/sdk-ts/src/generated/openapi.d.ts @@ -845,12 +845,30 @@ export interface paths { get?: never; put?: never; post?: never; - delete?: never; + /** @description Permanently deletes a channel with its messages, thread replies, reactions, pins, channel topics, read state, notification settings, and the uploads attached only to it. Requires a workspace owner's human session. Emits the workspace-scoped `channel.deleted` event. */ + delete: operations["deleteChannel"]; options?: never; head?: never; patch: operations["updateChannel"]; trace?: never; }; + "/api/channels/{channel_id}/deletion-preview": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** @description Describes what deleting the channel removes and whether a rule blocks it. Owner-only. */ + get: operations["getChannelDeletionPreview"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; "/api/channels/{channel_id}/messages": { parameters: { query?: never; @@ -2001,6 +2019,30 @@ export interface components { /** Format: date-time */ moderation_at?: string; }; + ChannelDeletionPreview: { + channel: components["schemas"]["Channel"]; + counts: components["schemas"]["ChannelDeletionCounts"]; + /** + * @description Rule that prevents deleting this channel, when one applies. + * @enum {string} + */ + blocker?: "last_channel" | "provisioned_channel"; + }; + /** @description Visible content removed with the channel. Files are uploads attached only to this channel. */ + ChannelDeletionCounts: { + /** Format: int64 */ + messages: number; + /** Format: int64 */ + thread_replies: number; + /** Format: int64 */ + pins: number; + /** Format: int64 */ + topics: number; + /** Format: int64 */ + files: number; + /** Format: int64 */ + file_bytes: number; + }; Channel: { id: string; /** @description Immutable public route ID used in app URLs. */ @@ -4432,6 +4474,47 @@ export interface operations { }; }; }; + deleteChannel: { + parameters: { + query?: never; + header?: never; + path: { + channel_id: components["parameters"]["channel_id"]; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Channel deleted; queued upload-object cleanup may continue asynchronously */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Workspace owner session required */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Channel not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description The workspace's last channel or a provisioned Guests channel cannot be deleted */ + 409: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; updateChannel: { parameters: { query?: never; @@ -4456,6 +4539,42 @@ export interface operations { }; }; }; + getChannelDeletionPreview: { + parameters: { + query?: never; + header?: never; + path: { + channel_id: components["parameters"]["channel_id"]; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Channel deletion preview */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ChannelDeletionPreview"]; + }; + }; + /** @description Workspace owner session required */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Channel not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; listMessages: { parameters: { query?: { diff --git a/packages/sdk-ts/src/index.ts b/packages/sdk-ts/src/index.ts index 24409163c..2203e9f85 100644 --- a/packages/sdk-ts/src/index.ts +++ b/packages/sdk-ts/src/index.ts @@ -71,6 +71,8 @@ export type Workspace = components["schemas"]["Workspace"]; export type Channel = components["schemas"]["Channel"]; +export type ChannelDeletionPreview = components["schemas"]["ChannelDeletionPreview"]; + export type Topic = components["schemas"]["Topic"]; export type MessageKind = "message" | "agent_commentary" | "agent_tool"; @@ -700,6 +702,11 @@ export class ClickClackClient { }); return data.channel; }, + deletionPreview: async (channelId: string): Promise => + this.request(`/api/channels/${channelId}/deletion-preview`), + delete: async (channelId: string): Promise => { + await this.request(`/api/channels/${channelId}`, { method: "DELETE" }); + }, messages: async ( channelId: string, afterSeqOrOptions: number | MessagePageOptions = 0, diff --git a/tests/e2e/channel-deletion.spec.ts b/tests/e2e/channel-deletion.spec.ts new file mode 100644 index 000000000..fb6c1f388 --- /dev/null +++ b/tests/e2e/channel-deletion.spec.ts @@ -0,0 +1,282 @@ +import { expect, test, type APIRequestContext } from "@playwright/test"; +import { execFileSync } from "node:child_process"; +import { randomUUID } from "node:crypto"; +import { waitForAppReady } from "./app-ready"; +import { deferred } from "./thread-fixture"; + +type Channel = { id: string; name: string; route_id: string }; + +async function workspaceWithChannels(request: APIRequestContext, label: string, names: string[]) { + const suffix = randomUUID().replaceAll("-", "").slice(0, 12); + const workspaceResponse = await request.post("/api/workspaces", { + data: { name: `${label} ${suffix}` }, + }); + expect(workspaceResponse.ok()).toBe(true); + const { workspace } = (await workspaceResponse.json()) as { + workspace: { id: string; route_id: string }; + }; + const channels: Record = {}; + for (const name of names) { + const response = await request.post(`/api/workspaces/${workspace.id}/channels`, { + data: { name, kind: "public" }, + }); + expect(response.ok()).toBe(true); + channels[name] = ((await response.json()) as { channel: Channel }).channel; + } + const route = (name: string) => `/app/${workspace.route_id}/${channels[name].route_id}`; + return { workspace, channels, route }; +} + +async function channelNames(request: APIRequestContext, workspaceID: string) { + const response = await request.get(`/api/workspaces/${workspaceID}/channels`); + expect(response.ok()).toBe(true); + const { channels } = (await response.json()) as { channels: Channel[] }; + return channels.map((channel) => channel.name).sort(); +} + +test("owners delete a channel after reviewing what is lost", async ({ page }, testInfo) => { + const { workspace, channels, route } = await workspaceWithChannels(page.request, "Delete proof", [ + "general", + "doomed", + ]); + const posted = await page.request.post(`/api/channels/${channels.doomed.id}/messages`, { + data: { body: "Synthetic history that goes with the channel" }, + }); + expect(posted.ok()).toBe(true); + await page.goto(route("doomed")); + await waitForAppReady(page); + + await page.getByRole("button", { name: "Channel settings", exact: true }).click(); + await page.getByRole("button", { name: "Delete channel..." }).click(); + const dialog = page.getByRole("dialog", { name: "Delete #doomed?" }); + await expect(dialog.getByLabel("What will be deleted")).toContainText(/Messages\s*1/); + const confirm = dialog.getByRole("button", { name: "Delete channel" }); + await expect(confirm).toBeDisabled(); + const input = dialog.getByLabel("Type doomed to confirm"); + await input.fill("doome"); + await expect(confirm).toBeDisabled(); + await input.fill("doomed"); + await expect(confirm).toBeEnabled(); + await page.screenshot({ path: testInfo.outputPath("delete-confirmation-before.png") }); + await confirm.click(); + + await expect(dialog).toBeHidden(); + await expect(page.getByRole("status").filter({ hasText: "Deleted #doomed." })).toBeVisible(); + await expect(page).not.toHaveURL(new RegExp(channels.doomed.route_id)); + expect(await channelNames(page.request, workspace.id)).toEqual(["general"]); + await page.screenshot({ path: testInfo.outputPath("delete-owner-after.png") }); +}); + +test("people in a deleted channel are moved out with a notice", async ({ page, browser }) => { + const { workspace, channels, route } = await workspaceWithChannels( + page.request, + "Watcher proof", + ["general", "doomed"], + ); + const suffix = randomUUID().replaceAll("-", "").slice(0, 12); + const memberID = execFileSync( + "go", + [ + "run", + "./apps/api/cmd/clickclack", + "admin", + "user", + "create", + "--data", + "./data/e2e", + "--workspace", + workspace.id, + "--name", + "Deletion Watcher", + "--email", + `deletion-watcher-${suffix}@example.com`, + ], + { cwd: process.cwd(), encoding: "utf8" }, + ).trim(); + const context = await browser.newContext({ extraHTTPHeaders: { "X-ClickClack-User": memberID } }); + try { + const watcher = await context.newPage(); + await watcher.goto(route("doomed")); + await waitForAppReady(watcher); + await expect( + watcher.getByRole("button", { name: "Channel settings", exact: true }), + ).toHaveCount(0); + + const deleted = await page.request.delete(`/api/channels/${channels.doomed.id}`); + expect(deleted.status()).toBe(204); + + await expect( + watcher.getByRole("status").filter({ hasText: /#doomed was deleted/ }), + ).toBeVisible(); + await expect(watcher).not.toHaveURL(new RegExp(channels.doomed.route_id)); + } finally { + await context.close(); + } +}); + +test("the last channel cannot be deleted", async ({ page }) => { + const { route } = await workspaceWithChannels(page.request, "Last channel proof", ["only"]); + await page.goto(route("only")); + await waitForAppReady(page); + + await page.getByRole("button", { name: "Channel settings", exact: true }).click(); + await page.getByRole("button", { name: "Delete channel..." }).click(); + const dialog = page.getByRole("dialog", { name: "Delete #only?" }); + await expect(dialog.getByRole("alert")).toContainText("at least one channel"); + await expect(dialog.getByLabel("Type only to confirm")).toHaveCount(0); + await expect(dialog.getByRole("button", { name: "Delete channel" })).toBeDisabled(); + + await dialog.getByRole("button", { name: "Archive instead" }).click(); + await expect(page.getByRole("dialog", { name: "Channel settings" })).toBeVisible(); +}); + +test("a channel list captured before deletion cannot restore the sidebar entry", async ({ + page, +}) => { + const { channels, workspace, route } = await workspaceWithChannels(page.request, "Delayed list", [ + "general", + "doomed", + ]); + await page.goto(route("doomed")); + await waitForAppReady(page); + const entered = deferred(), + release = deferred(), + delivered = deferred(); + let held = false; + await page.route(`**/api/workspaces/${workspace.id}/channels`, async (request) => { + if (held || request.request().method() !== "GET") return request.continue(); + held = true; + const response = await request.fetch(); + expect( + (await response.json()).channels.some( + (channel: Channel) => channel.id === channels.doomed.id, + ), + ).toBe(true); + entered.resolve(); + await release.promise; + await request.fulfill({ response }); + delivered.resolve(); + }); + try { + // Metadata refresh awaits its read in the realtime queue. The owner's + // deletion response removes the channel independently of that queue. + expect( + ( + await page.request.patch(`/api/channels/${channels.general.id}`, { + data: { archived: true }, + }) + ).ok(), + ).toBe(true); + await entered.promise; + await page.getByRole("button", { name: "Channel settings", exact: true }).click(); + await page.getByRole("button", { name: "Delete channel..." }).click(); + const dialog = page.getByRole("dialog", { name: "Delete #doomed?" }); + await dialog.getByLabel("Type doomed to confirm").fill("doomed"); + await dialog.getByRole("button", { name: "Delete channel" }).click(); + await expect(dialog).toBeHidden(); + release.resolve(); + await delivered.promise; + await expect(page.locator(`.sidebar [href$="/${channels.doomed.route_id}"]`)).toHaveCount(0); + await expect(page).not.toHaveURL(new RegExp(channels.doomed.route_id)); + } finally { + release.resolve(); + } +}); + +for (const phase of ["first page", "next page"] as const) { + test(`a delayed search ${phase} cannot restore deleted snippets`, async ({ page }) => { + const { channels, workspace, route } = await workspaceWithChannels( + page.request, + "Delayed search", + ["general", "doomed"], + ); + for (let index = 0; index < (phase === "next page" ? 51 : 1); index += 1) { + const posted = await page.request.post(`/api/channels/${channels.doomed.id}/messages`, { + data: { body: `zebraproof deleted snippet ${index}` }, + }); + expect(posted.ok()).toBe(true); + } + await page.goto(route("doomed")); + await waitForAppReady(page); + const entered = deferred(), + release = deferred(), + delivered = deferred(); + await page.route("**/api/search?*", async (request) => { + const response = await request.fetch(); + const snapshot = await response.json(); + const next = new URL(request.request().url()).searchParams.has("cursor"); + expect(snapshot.results).toHaveLength(phase === "next page" && !next ? 50 : 1); + if (phase === "next page" && !next) { + await request.fulfill({ response }); + return; + } + entered.resolve(); + await release.promise; + await request.fulfill({ json: { ...snapshot, next_cursor: null } }); + delivered.resolve(); + }); + try { + await page.getByLabel("Search messages").fill("zebraproof"); + await page.getByRole("button", { name: "Search", exact: true }).click(); + if (phase === "next page") + await page.getByRole("button", { name: "Load more results" }).click(); + await entered.promise; + await page.locator(`.sidebar [href$="/${channels.general.route_id}"]`).click(); + await expect(page).toHaveURL(new RegExp(channels.general.route_id)); + const deleted = await page.request.delete(`/api/channels/${channels.doomed.id}`); + expect(deleted.status()).toBe(204); + await expect + .poll(() => + page.evaluate((id) => localStorage.getItem(`clickclack:${id}:cursor`), workspace.id), + ) + .not.toBeNull(); + await expect(page.locator(`.sidebar [href$="/${channels.doomed.route_id}"]`)).toHaveCount(0); + release.resolve(); + await delivered.promise; + const results = page.getByLabel("Search results"); + await expect(results.locator(".search-result")).toHaveCount(0); + await expect(results.getByRole("status", { name: "Searching" })).toHaveCount(0); + } finally { + release.resolve(); + } + }); +} + +test("open channel and thread embeds retire deleted history and composers", async ({ + page, + context, +}, testInfo) => { + const { channels, workspace } = await workspaceWithChannels(page.request, "Deleted embeds", [ + "general", + "doomed", + ]); + const posted = await page.request.post(`/api/channels/${channels.doomed.id}/messages`, { + data: { body: "zebraproof embedded root" }, + }); + const { message } = await posted.json(); + expect( + ( + await page.request.post(`/api/messages/${message.id}/thread/replies`, { + data: { body: "embedded reply" }, + }) + ).ok(), + ).toBe(true); + const routed = await page.request.post(`/api/messages/${message.id}/route`); + const root = (await routed.json()).message; + const threadPage = await context.newPage(); + await page.goto(`/embed/channel/${workspace.route_id}/${channels.doomed.route_id}`); + await threadPage.goto(`/embed/thread/${workspace.route_id}/${root.route_id}`); + await expect(page.getByLabel("Embedded channel")).toBeVisible(); + await expect(threadPage.getByLabel("Embedded thread")).toBeVisible(); + await page.screenshot({ path: testInfo.outputPath("channel-embed-before.png") }); + await threadPage.screenshot({ path: testInfo.outputPath("thread-embed-before.png") }); + expect((await page.request.delete(`/api/channels/${channels.doomed.id}`)).status()).toBe(204); + for (const embed of [page, threadPage]) { + await expect( + embed.getByRole("heading", { name: "Channel deleted", exact: true }), + ).toBeVisible(); + await expect(embed.locator("[data-message-id], textarea")).toHaveCount(0); + } + await page.screenshot({ path: testInfo.outputPath("channel-embed-after.png") }); + await threadPage.screenshot({ path: testInfo.outputPath("thread-embed-after.png") }); +});