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 00000000..b5b36724 --- /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 4bd2dc80..f7c6a4ac 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 8f2033b5..14706f98 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 00000000..b2f37309 --- /dev/null +++ b/apps/api/internal/httpapi/channel_deletion_test.go @@ -0,0 +1,143 @@ +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) + + 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, owner.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"] != owner.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, owner.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 46b2ef63..17b17d1d 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 6f1ac2f8..a4af6a8f 100644 --- a/apps/api/internal/httpapi/server.go +++ b/apps/api/internal/httpapi/server.go @@ -232,6 +232,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 00000000..ef201fc8 --- /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 00000000..b4292d1e --- /dev/null +++ b/apps/api/internal/store/channeldeletiontest/deletion.go @@ -0,0 +1,292 @@ +// 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 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 4cc33835..1248fddf 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 00000000..bd095efc --- /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 00000000..98ffb1f6 --- /dev/null +++ b/apps/api/internal/store/postgres/channel_deletion_test.go @@ -0,0 +1,270 @@ +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 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 00000000..fd27f6bd --- /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 4a2567c3..c6c50b61 100644 --- a/apps/api/internal/store/postgres/sqlc/queries.sql +++ b/apps/api/internal/store/postgres/sqlc/queries.sql @@ -548,6 +548,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 a55588f6..5cfc08aa 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 714bf358..7bdd933c 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 @@ -624,6 +698,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 @@ -2112,6 +2196,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) @@ -3380,6 +3477,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, @@ -5158,6 +5315,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 ` @@ -5230,6 +5401,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 lockWorkspaceEventLog = `-- name: LockWorkspaceEventLog :exec SELECT pg_advisory_xact_lock(hashtext('clickclack.events'), hashtext($1::text)) ` @@ -5239,6 +5441,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 00000000..6654d61e --- /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 00000000..c7d1b998 --- /dev/null +++ b/apps/api/internal/store/sqlite/channel_deletion_test.go @@ -0,0 +1,88 @@ +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 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 00000000..13f90e39 --- /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 00000000..3354d2cd --- /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 00000000..241020c3 --- /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 5f3131b5..2a83fd5f 100644 --- a/apps/api/internal/store/sqlite/sqlc/queries.sql +++ b/apps/api/internal/store/sqlite/sqlc/queries.sql @@ -528,6 +528,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 f517a403..249fcf13 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 ef692347..f166590c 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 @@ -620,6 +694,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 @@ -2100,6 +2184,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) @@ -3364,6 +3461,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 982b618f..641c5dbf 100644 --- a/apps/api/internal/store/types.go +++ b/apps/api/internal/store/types.go @@ -1281,6 +1281,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 c005b693..dbb21482 100644 --- a/apps/api/internal/webassets/dist/200.html +++ b/apps/api/internal/webassets/dist/200.html @@ -103,15 +103,15 @@ - + - + - +
@@ -125,7 +125,7 @@ Promise.all([ import("/_app/immutable/entry/start.W_KKVBz4.js"), - import("/_app/immutable/entry/app.CqYZBsX3.js") + import("/_app/immutable/entry/app.DLOeY-00.js") ]).then(([kit, app]) => { kit.start(app, element); }); diff --git a/apps/api/internal/webassets/dist/_app/immutable/assets/0.C7M1Y4Cy.css b/apps/api/internal/webassets/dist/_app/immutable/assets/0.o7-W2NK8.css similarity index 68% rename from apps/api/internal/webassets/dist/_app/immutable/assets/0.C7M1Y4Cy.css rename to apps/api/internal/webassets/dist/_app/immutable/assets/0.o7-W2NK8.css index 31e36af3..fbc8c5e7 100644 --- a/apps/api/internal/webassets/dist/_app/immutable/assets/0.C7M1Y4Cy.css +++ b/apps/api/internal/webassets/dist/_app/immutable/assets/0.o7-W2NK8.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;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 infinite 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 .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 .agent-responding.visible{opacity:1;height:20px;margin:0;transform:none}.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__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){.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}.message-actions>:not(.message-more){display:none}.message-row.actions-flip .message-actions{top:1px;bottom:auto}.message-actions .message-more{position:static}.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}.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}.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-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){.thread .group-body>header{min-height:28px;padding-right:32px;position:relative}.thread .reply-quote-btn,.thread .thread-action-btn:not(.thread-more-actions){display:none}.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}.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 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;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 infinite 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 .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 .agent-responding.visible{opacity:1;height:20px;margin:0;transform:none}.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__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){.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}.message-actions>:not(.message-more){display:none}.message-row.actions-flip .message-actions{top:1px;bottom:auto}.message-actions .message-more{position:static}.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}.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}.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-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){.thread .group-body>header{min-height:28px;padding-right:32px;position:relative}.thread .reply-quote-btn,.thread .thread-action-btn:not(.thread-more-actions){display:none}.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}.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 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/Cht-DoaS.js b/apps/api/internal/webassets/dist/_app/immutable/chunks/8xW7lXBK.js similarity index 99% rename from apps/api/internal/webassets/dist/_app/immutable/chunks/Cht-DoaS.js rename to apps/api/internal/webassets/dist/_app/immutable/chunks/8xW7lXBK.js index 939d3fac..3b22054e 100644 --- a/apps/api/internal/webassets/dist/_app/immutable/chunks/Cht-DoaS.js +++ b/apps/api/internal/webassets/dist/_app/immutable/chunks/8xW7lXBK.js @@ -1 +1 @@ -import{At as e,B as t,D as n,Et as r,F as i,I as a,K as o,N as s,O as c,P as l,S as u,Tt as d,V as f,X as p,Z as m,a as h,at as g,b as _,dt as v,ft as y,gt as b,ht as x,it as S,j as C,lt as w,n as ee,p as T,pt as E,s as D,ut as O,x as k,yt as A,z as j}from"./CxKeDCcw.js";import"./xihTtKlq.js";import{n as M,u as N}from"./DEPNME54.js";import{C as te,L as ne,O as re,a as ie,c as ae,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"./BqBbEnKW.js";import{f as _e,l as ve,t as ye,u as be}from"./C7NZ0SeM.js";var I=300,L=200,R=100,z=50,B=e=>e.thread_seq??0,V=class{context;committed;#e=b(null);get root(){return o(this.#e)}set root(e){x(this.#e,e,!0)}#t=b(E([]));get replies(){return o(this.#t)}set replies(e){x(this.#t,e,!0)}#n=b(null);get state(){return o(this.#n)}set state(e){x(this.#n,e,!0)}#r=b(``);get error(){return o(this.#r)}set error(e){x(this.#r,e,!0)}#i=b(null);get selection(){return o(this.#i)}set selection(e){x(this.#i,e)}#a=b(!1);get hasOlder(){return o(this.#a)}set hasOlder(e){x(this.#a,e,!0)}#o=b(!1);get hasNewer(){return o(this.#o)}set hasNewer(e){x(this.#o,e,!0)}#s=b(E({older:!1,newer:!1}));get loading(){return o(this.#s)}set loading(e){x(this.#s,e,!0)}#c=b(E({older:``,newer:``}));get edgeError(){return o(this.#c)}set edgeError(e){x(this.#c,e,!0)}#l=b(!0);get following(){return o(this.#l)}set following(e){x(this.#l,e,!0)}anchor=null;editingID=``;beforeChange;#u=b(E(new Map));get drafts(){return o(this.#u)}set drafts(e){x(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 M(`/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=re(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)=>B(e)-B(t));if(a.length>I){let e=n===`older`?0:a.length-L,t=Math.min(a.length,e+L),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:R},`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=>B(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||B(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 M(`/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:R},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=N(e,`Could not open this reply.`)),!1}}async loadEdge(e,t=()=>!0,n=z){if(this.loading[e])return!1;let{selection:r,current:i}=this.owner(t),a=this.revision;if(!r||!i())return!1;let o=B(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=>B(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]=N(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=B(this.replies.at(-1)),a=B(this.replies[0])-1;try{for(;aB(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=N(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),B(this.replies.at(-1)??{})>=i.newest_seq){this.hasNewer=!1;return}if(!(this.hasNewer&&!this.following)){for(let e=0;n()&&B(this.replies.at(-1)??{})=I);e+=z);n()&&B(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 M(`/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 M(`/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)&&B(e.message)===B(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:N(n,`Could not post the reply.`)}),this.isCurrent(t)&&e?.(n)}finally{this.patchDraft(t.messageID,{sending:!1})}}},H=a(`
`);function xe(t,n){r(n,!0);let a=h(n,`agentNames`,19,()=>[]),c=A(()=>a().length===1?`${a()[0]} is respondingโ€ฆ`:a().length===2?`${a()[0]} and ${a()[1]} are respondingโ€ฆ`:a().length>2?`Several agents are respondingโ€ฆ`:`Agent is respondingโ€ฆ`);var u=i(),f=O(u),p=t=>{var n=H(),r=y(w(n),2),i=v(r,!0);e(n),S(()=>s(i,o(c))),l(t,n)};C(f,e=>{n.active&&e(p)}),l(t,u),d()}var Se=a(`
`);function Ce(n,i){r(i,!0);let a=h(i,`disabled`,3,!1),s=h(i,`pending`,3,!1),c=h(i,`buttonClass`,3,``),u=b(!1),f=b(!1),p=b(void 0),m=b(void 0),v=A(()=>`add-reaction-picker-${i.messageId}`);function ee(){a()||s()||(o(u)||x(f,ce(o(p),130),!0),x(u,!o(u)))}function E(e){a()||s()||(i.onToggle(e),x(u,!1))}function O(){x(u,!1),o(m)?.focus()}function j(e){o(p)&&!o(p).contains(e.target)&&x(u,!1)}g(()=>{if(o(u))return document.addEventListener(`click`,j),()=>document.removeEventListener(`click`,j)}),g(()=>{(a()||s())&&x(u,!1)});var M=Se(),N=w(M);D(N,e=>x(m,e),()=>o(m));var te=y(N,2),ne=e=>{{let t=A(()=>o(f)?`above-right`:`below`),n=A(()=>a()||s());ae(e,{get id(){return o(v)},get placement(){return o(t)},get disabled(){return o(n)},onPick:E,onEscape:O})}};C(te,e=>{o(u)&&e(ne)}),e(M),D(M,e=>x(p,e),()=>o(p)),S(()=>{_(N,1,k(c()),`svelte-sk6gxl`),T(N,`aria-controls`,o(v)),T(N,`aria-expanded`,o(u)),N.disabled=a()||s()}),t(`click`,N,ee),l(n,M),d()}j([`click`]);var we=a(``),Te=a(` `),Ee=a(`Couldn't create link`),De=a(`Open in ClickClack`),Oe=a(``),ke=a(`deleted bot`),Ae=a(` `),je=a(``),Me=a(``),Ne=a(``),Pe=a(``),Fe=a(` `,1),Ie=a(`
This message was deleted.
`),Le=a(`(edited)`),Re=a(`
`,1),ze=a(`
`),Be=a(`

`),Ve=a(`
`),He=a(` `,1),Ue=a(`
`,1),We=a(`
`),Ge=a(`
`),Ke=a(``),qe=a(`

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

`),Ve=a(`
`),He=a(` `,1),Ue=a(`
`,1),We=a(`
`),Ge=a(`
`),Ke=a(``),qe=a(`

`,1);function Je(i,a){r(a,!0);let E=h(a,`history`,7),k=h(a,`reactionsDisabled`,3,!1),j=h(a,`mentionPeople`,19,()=>[]),M=h(a,`agentResponding`,3,!1),re=h(a,`respondingAgentNames`,19,()=>[]),ae=h(a,`replyDisabled`,3,!1),ce=h(a,`replySending`,3,!1),P=h(a,`replyError`,3,``),F=h(a,`headerLabel`,3,`Thread`),I=h(a,`canDeleteAnyMessage`,3,!1),L=h(a,`deletingMessageIDs`,19,()=>new Set),R=h(a,`channelID`,3,``),z=h(a,`pinnedMessageIDs`,19,()=>new Set),B=h(a,`editScope`,3,``),V=b(void 0),H=0,Se=-1,Je=0,U=null,Ye=A(()=>a.root.id),Xe=b(``);function Ze(){if(!o(V))return;let e=o(V).getBoundingClientRect().top,t=[...o(V).querySelectorAll(`[data-message-id]`)].find(t=>t.getBoundingClientRect().bottom>e);t&&(E().anchor={messageID:t.dataset.messageId,offset:t.getBoundingClientRect().top-e})}function Qe(e){if(!(!o(V)||!o(V).getClientRects().length)){if(e===`latest`||e===`preserve`&&E().following)o(V).scrollTop=o(V).scrollHeight;else{let t=e===`preserve`?E().anchor?.messageID:e.messageID,n=t?o(V).querySelector(`[data-message-id="${CSS.escape(t)}"]`):null;if(n){let r=n.getBoundingClientRect().top-o(V).getBoundingClientRect().top,i=e===`preserve`?E().anchor?.offset??0:(o(V).clientHeight-n.offsetHeight)/2;o(V).scrollTop+=r-i,e!==`preserve`&&x(Xe,t,!0)}}Se=o(V).scrollTop,Ze()}}function $e(e,t=!0){if(e===`preserve`&&U&&U!==`preserve`)return;U=e,t&&Ze();let n=++H;p().then(()=>{n!==H||X||(cancelAnimationFrame(Je),Je=requestAnimationFrame(()=>{n===H&&!X&&(Qe(e),U=null)}))})}function et(){!o(V)||U||(Math.abs(o(V).scrollTop-Se)>1&&(H++,U=null,E().following=!E().hasNewer&&o(V).scrollHeight-o(V).clientHeight-o(V).scrollTop<48),Se=-1,Ze())}function tt(){H++,U=null,x(Xe,``)}async function nt(e){try{await E().loadEdge(e)}catch{}}async function rt(){try{await E().latest()}catch{}}g(()=>{let e=o(V),t=o(Ye);if(!e||!t)return;E().beforeChange=e=>$e(e),m(()=>$e(E().anchor?`preserve`:`latest`,!1));let n=new ResizeObserver(()=>$e(`preserve`,!1));n.observe(e);for(let t of e.querySelectorAll(`.reply-list, .thread-root`))n.observe(t);let r=()=>{document.visibilityState===`visible`&&$e(`preserve`,!1)};return document.addEventListener(`visibilitychange`,r),()=>{E().beforeChange=void 0,n.disconnect(),document.removeEventListener(`visibilitychange`,r),H++,cancelAnimationFrame(Je)}});let W=A(()=>a.editController?.session(B()));g(()=>{E().editingID=o(W)?.surface===`thread`?o(W).messageID:``});let it=new Map,at=e=>I()||!!a.currentUserID&&(e.author?.id||e.author_id)===a.currentUserID,ot=e=>!!a.currentUserID&&(e.author?.id||e.author_id)===a.currentUserID,st=e=>o(W)?.surface===`thread`&&o(W).messageID===e.id;async function ct(e){await p();let t=o(V)?.querySelector(`[data-message-id="${CSS.escape(e)}"]`),n=it.get(e)??t?.querySelector(`.thread-more-actions`);if(it.delete(e),n?.isConnected&&n.getClientRects().length>0){n.focus();return}t?.querySelector(`button[aria-label="Edit message"]`)?.focus()}function lt(e,t){t?it.set(e.id,t):it.delete(e.id),a.editController?.start(B(),e,`thread`)===`cancelled`&&ct(e.id)}function ut(e){a.editController?.cancel(B(),`thread`)&&ct(e.id)}async function dt(e){if(!a.editController)return;let t=await a.editController.save(B(),e,e=>a.onMessageEdited?.(e));(t===`saved`||t===`cancelled`)&&await ct(e.id)}let G=b(void 0),ft=b(void 0),pt=b(``),K=b(``),mt=b(``),ht=b(void 0),q=b(!1),J=b(``),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,x(G,e,!0),x(ft,t,!0),x(pt,``)}function Z(){St(),vt+=1,x(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){(o(G)||Y!==void 0)&&e.preventDefault()}function Et(e){let t=o(G);Z(),!(!t||k()||!a.currentUserID||a.reactionController.pending(t.id))&&a.reactionController.toggle(t,e)}function Dt(){let e=o(G);Z(),e&&a.onSetReplyTarget(e,`thread`)}async function Ot(){let e=o(G);if(!e)return;St();let t=vt;try{if(!navigator.clipboard)throw Error(`Clipboard unavailable`);if(await navigator.clipboard.writeText(e.body??``),X||o(G)?.id!==e.id)return;x(pt,`copied`),_t=window.setTimeout(()=>{_t=void 0,!X&&t===vt&&Z()},900)}catch{!X&&o(G)?.id===e.id&&x(pt,`failed`)}}async function kt(){if(!a.onCopyLink||o(K)===`pending`)return{copied:!1};x(K,`pending`);let e;try{e=await a.onCopyLink(a.root)}catch{return x(K,`failed`),{copied:!1}}try{if(!navigator.clipboard)throw Error(`Clipboard unavailable`);return await navigator.clipboard.writeText(e),x(K,``),{copied:!0}}catch{return x(K,``),{copied:!1,fallback:e}}}async function At(e){let t=await kt();!t.copied&&!t.fallback||(t.fallback?(x(ht,e,!0),x(mt,t.fallback,!0)):e?.focus({preventScroll:!0}))}async function jt(){let e=await kt();if(!e.copied&&!e.fallback)return;let t=o(ft);Z(),e.fallback&&(await p(),x(ht,t,!0),x(mt,e.fallback,!0))}function Mt(){let e=o(G),t=o(ft);Z(),e&<(e,t)}function Nt(){let e=o(G);Z(),e&&a.onDeleteMessage?.(e)}async function Pt(e){if(!(!R()||!a.onTogglePin||o(q))){x(q,!0),x(J,``);try{await a.onTogglePin(e,z().has(e.id))}catch(e){x(J,N(e,`Could not update pin`),!0)}finally{x(q,!1)}}}async function Ft(){let e=o(G);e&&(await Pt(e),o(J)||Z())}ee(()=>{X=!0,St(),xt(),it.clear()});var It=qe(),Lt=O(It),Rt=w(Lt),zt=e=>{var n=we();t(`click`,n,function(...e){a.onBack?.apply(this,e)}),l(e,n)};C(Rt,e=>{a.onBack&&e(zt)});var Bt=y(Rt,2),Vt=w(Bt),Ht=v(Vt,!0),Ut=y(Vt,2),Wt=v(Ut,!0),Gt=y(Ut,2),Kt=e=>{var t=Te(),n=v(t,!0);S(()=>s(n,o(J))),l(e,t)};C(Gt,e=>{o(J)&&e(Kt)});var qt=y(Gt,2),Jt=e=>{var t=Ee();l(e,t)};C(qt,e=>{o(K)===`failed`&&e(Jt)}),e(Bt);var Yt=y(Bt,2),Xt=e=>{var t=De();S(()=>T(t,`href`,a.openHref)),l(e,t)};C(Yt,e=>{a.openHref&&e(Xt)});var Zt=y(Yt,2),Qt=e=>{var n=Oe();t(`click`,n,function(...e){a.onClose?.apply(this,e)}),l(e,n)};C(Zt,e=>{a.onClose&&e(Qt)}),e(Lt);var Q=y(Lt,2),$=w(Q),$t=w($);{let e=A(()=>a.root.author?.id||a.root.author_id),t=A(()=>a.root.author?.display_name),n=A(()=>be(a.root.author)?void 0:a.root.author?.avatar_url);ye($t,{class:`avatar`,get id(){return o(e)},get name(){return o(t)},get src(){return o(n)},size:38})}var en=y($t,2),tn=w(en),nn=w(tn),rn=v(nn,!0),an=y(nn,2),on=e=>{var t=ke();l(e,t)},sn=A(()=>be(a.root.author));C(an,e=>{o(sn)&&e(on)});var cn=y(an,2),ln=e=>{var t=Ae(),n=v(t,!0);S(e=>s(n,e),[()=>ve(_e(a.root.author))]),l(e,t)},un=A(()=>_e(a.root.author));C(cn,e=>{o(un)&&e(ln)});var dn=y(cn,2),fn=v(dn,!0),pn=y(dn,2),mn=e=>{var n=Fe(),r=O(n);{let e=A(()=>k()||!a.currentUserID),t=A(()=>a.reactionController.pending(a.root.id));Ce(r,{get messageId(){return a.root.id},get disabled(){return o(e)},get pending(){return o(t)},buttonClass:`thread-action-btn`,onToggle:e=>void a.reactionController.toggle(a.root,e)})}var i=y(r,2),s=y(i,2),c=e=>{var n=je();S(()=>{T(n,`data-tooltip`,o(K)===`pending`?`Creating linkโ€ฆ`:`Copy link`),n.disabled=o(K)===`pending`}),t(`click`,n,e=>void At(e.currentTarget)),l(e,n)};C(s,e=>{R()&&a.onCopyLink&&e(c)});var u=y(s,2),d=e=>{var n=Me();S((e,t)=>{T(n,`aria-label`,e),T(n,`data-tooltip`,t),n.disabled=o(q)},[()=>z().has(a.root.id)?`Unpin message`:`Pin message`,()=>z().has(a.root.id)?`Unpin message`:`Pin message`]),t(`click`,n,()=>void Pt(a.root)),l(e,n)};C(u,e=>{R()&&a.onTogglePin&&e(d)});var f=y(u,2),p=e=>{var n=Ne();t(`click`,n,()=>lt(a.root)),l(e,n)},m=A(()=>ot(a.root)&&a.editController&&B());C(f,e=>{o(m)&&e(p)});var h=y(f,2),g=e=>{var n=Pe();S(e=>n.disabled=e,[()=>L().has(a.root.id)]),t(`click`,n,()=>a.onDeleteMessage?.(a.root)),l(e,n)},_=A(()=>at(a.root)&&a.onDeleteMessage);C(h,e=>{o(_)&&e(g)});var v=y(h,2);S(e=>{T(v,`aria-controls`,e),T(v,`aria-expanded`,o(G)?.id===a.root.id)},[()=>yt(a.root)]),t(`click`,i,()=>a.onSetReplyTarget(a.root,`thread`)),t(`click`,v,e=>Ct(a.root,e.currentTarget)),l(e,n)},hn=A(()=>!a.root.deleted_at&&!st(a.root));C(pn,e=>{o(hn)&&e(mn)}),e(tn);var gn=y(tn,2),_n=e=>{var t=Ie();l(e,t)},vn=e=>{ue(e,{get body(){return o(W).draft},get errorMessage(){return o(W).error},get saving(){return o(W).saving},onBody:e=>a.editController?.updateDraft(B(),e),onCancel:()=>ut(a.root),onSave:()=>dt(a.root)})},yn=A(()=>st(a.root)&&o(W)),bn=t=>{var r=Re(),i=O(r);n(i,()=>le(a.root.body),!0),e(i),u(i,e=>ne?.(e)),u(i,(e,t)=>he?.(e,t),()=>({people:j(),attentionUserID:a.mentionAttentionUserID}));var s=y(i,2),c=e=>{var t=Le();S(e=>T(t,`title`,`Edited ${e??``}`),[()=>se(a.root.edited_at)]),l(e,t)};C(s,e=>{a.root.edited_at&&e(c)});var d=y(s,2);{let e=A(()=>a.reactionController.reactionsFor(a.root)),t=A(()=>a.reactionController.pending(a.root.id)),n=A(()=>a.reactionController.error(a.root.id)),r=A(()=>k()||!a.currentUserID);pe(d,{get messageId(){return a.root.id},get reactions(){return o(e)},get pending(){return o(t)},get error(){return o(n)},get disabled(){return o(r)},onToggle:e=>void a.reactionController.toggle(a.root,e)})}l(t,r)};C(gn,e=>{a.root.deleted_at?e(_n):o(yn)?e(vn,1):e(bn,-1)});var xn=y(gn,2),Sn=t=>{var n=ze();c(n,21,()=>a.root.attachments,e=>e.id,(e,t)=>{{let n=A(()=>te(o(t)));fe(e,{get upload(){return o(t)},get url(){return o(n)},get onOpenImage(){return a.onOpenImage},get onOpenArtifact(){return a.onOpenArtifact}})}}),e(n),l(t,n)};C(xn,e=>{!a.root.deleted_at&&a.root.attachments?.length&&e(Sn)}),e(en),e($);var Cn=y($,2),wn=w(Cn),Tn=v(wn);e(Cn);var En=y(Cn,2),Dn=n=>{var r=Ve(),i=w(r),a=e=>{oe(e,{direction:`older`,rows:1})};C(i,e=>{E().loading.older&&e(a)});var o=y(i,2),c=e=>{var t=Be(),n=v(t,!0);S(()=>s(n,E().edgeError.older)),l(e,t)};C(o,e=>{E().edgeError.older&&e(c)});var u=y(o,2),d=v(u,!0);e(r),S(()=>{u.disabled=E().loading.older,s(d,E().edgeError.older?`Retry older replies`:`Load older replies`)}),t(`click`,u,()=>void nt(`older`)),l(n,r)};C(En,e=>{(E().hasOlder||E().loading.older||E().edgeError.older)&&e(Dn)});var On=y(En,2);c(On,21,()=>a.replies,e=>e.id,(r,i)=>{var d=We();let f;var p=w(d);{let e=A(()=>o(i).author?.id||o(i).author_id),t=A(()=>o(i).author?.display_name),n=A(()=>be(o(i).author)?void 0:o(i).author?.avatar_url);ye(p,{class:`avatar small`,get id(){return o(e)},get name(){return o(t)},get src(){return o(n)},size:30})}var m=y(p,2),h=w(m),g=w(h),b=v(g,!0),x=y(g,2),ee=e=>{var t=ke();l(e,t)},E=A(()=>be(o(i).author));C(x,e=>{o(E)&&e(ee)});var D=y(x,2),M=e=>{var t=Ae(),n=v(t,!0);S(e=>s(n,e),[()=>ve(_e(o(i).author))]),l(e,t)},N=A(()=>_e(o(i).author));C(D,e=>{o(N)&&e(M)});var re=y(D,2),ie=v(re,!0),ae=y(re,2),oe=e=>{var n=He(),r=O(n);{let e=A(()=>k()||!a.currentUserID),t=A(()=>a.reactionController.pending(o(i).id));Ce(r,{get messageId(){return o(i).id},get disabled(){return o(e)},get pending(){return o(t)},buttonClass:`thread-action-btn`,onToggle:e=>void a.reactionController.toggle(o(i),e)})}var s=y(r,2),c=y(s,2),u=e=>{var n=Me();S((e,t)=>{T(n,`aria-label`,e),T(n,`data-tooltip`,t),n.disabled=o(q)},[()=>z().has(o(i).id)?`Unpin message`:`Pin message`,()=>z().has(o(i).id)?`Unpin message`:`Pin message`]),t(`click`,n,()=>void Pt(o(i))),l(e,n)};C(c,e=>{R()&&a.onTogglePin&&e(u)});var d=y(c,2),f=e=>{var n=Ne();S(()=>n.disabled=o(i).status===`pending`||o(i).status===`failed`),t(`click`,n,()=>lt(o(i))),l(e,n)},p=A(()=>ot(o(i))&&a.editController&&B());C(d,e=>{o(p)&&e(f)});var m=y(d,2),h=e=>{var n=Pe();S(e=>n.disabled=e,[()=>L().has(o(i).id)]),t(`click`,n,()=>a.onDeleteMessage?.(o(i))),l(e,n)},g=A(()=>at(o(i))&&a.onDeleteMessage);C(m,e=>{o(g)&&e(h)});var _=y(m,2);S(e=>{T(_,`aria-controls`,e),T(_,`aria-expanded`,o(G)?.id===o(i).id),_.disabled=o(i).status===`pending`||o(i).status===`failed`},[()=>yt(o(i))]),t(`click`,s,()=>a.onSetReplyTarget(o(i),`thread`)),t(`click`,_,e=>Ct(o(i),e.currentTarget)),l(e,n)},ce=A(()=>!o(i).deleted_at&&!st(o(i)));C(ae,e=>{o(ce)&&e(oe)}),e(h);var P=y(h,2),F=e=>{var t=Ie();l(e,t)},de=e=>{ue(e,{get body(){return o(W).draft},get errorMessage(){return o(W).error},get saving(){return o(W).saving},onBody:e=>a.editController?.updateDraft(B(),e),onCancel:()=>ut(o(i)),onSave:()=>dt(o(i))})},ge=A(()=>st(o(i))&&o(W)),I=t=>{var r=Ue(),s=O(r);me(s,{get message(){return o(i)},get onJump(){return a.onJumpToQuote}});var c=y(s,2);n(c,()=>le(o(i).body),!0),e(c),u(c,e=>ne?.(e)),u(c,(e,t)=>he?.(e,t),()=>({people:j(),attentionUserID:a.mentionAttentionUserID}));var d=y(c,2),f=e=>{var t=Le();S(e=>T(t,`title`,`Edited ${e??``}`),[()=>se(o(i).edited_at)]),l(e,t)};C(d,e=>{o(i).edited_at&&e(f)});var p=y(d,2);{let e=A(()=>a.reactionController.reactionsFor(o(i))),t=A(()=>a.reactionController.pending(o(i).id)),n=A(()=>a.reactionController.error(o(i).id)),r=A(()=>k()||!a.currentUserID);pe(p,{get messageId(){return o(i).id},get reactions(){return o(e)},get pending(){return o(t)},get error(){return o(n)},get disabled(){return o(r)},onToggle:e=>void a.reactionController.toggle(o(i),e)})}l(t,r)};C(P,e=>{o(i).deleted_at?e(F):o(ge)?e(de,1):e(I,-1)});var V=y(P,2),H=t=>{var n=ze();c(n,21,()=>o(i).attachments,e=>e.id,(e,t)=>{{let n=A(()=>te(o(t)));fe(e,{get upload(){return o(t)},get url(){return o(n)},get onOpenImage(){return a.onOpenImage},get onOpenArtifact(){return a.onOpenArtifact}})}}),e(n),l(t,n)};C(V,e=>{!o(i).deleted_at&&o(i).attachments?.length&&e(H)}),e(m),e(d),S(e=>{f=_(d,1,`reply`,null,f,{"thread-target":o(Xe)===o(i).id}),T(d,`data-message-id`,o(i).id),s(b,o(i).author?.display_name||`Local User`),s(ie,e)},[()=>se(o(i).created_at)]),t(`pointerdown`,d,e=>wt(e,o(i))),t(`contextmenu`,d,Tt),l(r,d)}),e(On);var kn=y(On,2),An=n=>{var r=Ve(),i=w(r),a=e=>{oe(e,{direction:`newer`,rows:1})};C(i,e=>{E().loading.newer&&e(a)});var o=y(i,2),c=e=>{var t=Be(),n=v(t,!0);S(()=>s(n,E().edgeError.newer)),l(e,t)};C(o,e=>{E().edgeError.newer&&e(c)});var u=y(o,2),d=v(u,!0);e(r),S(()=>{u.disabled=E().loading.newer,s(d,E().edgeError.newer?`Retry newer replies`:`Load newer replies`)}),t(`click`,u,()=>void nt(`newer`)),l(n,r)};C(kn,e=>{(E().hasNewer||E().loading.newer||E().edgeError.newer)&&e(An)}),e(Q),D(Q,e=>x(V,e),()=>o(V));var jn=y(Q,2),Mn=e=>{var n=Ge(),r=v(n);t(`click`,r,()=>void rt()),l(e,n)};C(jn,e=>{(E().hasNewer||!E().following||E().error)&&e(Mn)});var Nn=y(jn,2),Pn=e=>{{let t=A(()=>yt(o(G))),n=A(()=>!!a.currentUserID&&!k()&&!a.reactionController.pending(o(G).id)),r=A(()=>!ae()),i=A(()=>ot(o(G))&&!!a.editController&&!!B()),s=A(()=>!!(R()&&a.onTogglePin)),c=A(()=>z().has(o(G).id)),l=A(()=>at(o(G))&&!!a.onDeleteMessage),u=A(()=>L().has(o(G).id)),d=A(()=>o(G).id===a.root.id&&!!(R()&&a.onCopyLink));de(e,{get id(){return o(t)},get canReact(){return o(n)},get canReply(){return o(r)},showOpenThread:!1,get canEdit(){return o(i)},get canPin(){return o(s)},get pinned(){return o(c)},get pinning(){return o(q)},get pinError(){return o(J)},get canDelete(){return o(l)},get deleting(){return o(u)},get copyStatus(){return o(pt)},get canCopyLink(){return o(d)},get copyLinkStatus(){return o(K)},onReact:Et,onOpenThread:()=>{},onReply:Dt,onCopy:Ot,onCopyLink:jt,onEdit:Mt,onTogglePin:Ft,onDelete:Nt,onClose:Z,get returnFocus(){return o(ft)}})}};C(Nn,e=>{o(G)&&e(Pn)});var Fn=y(Nn,2),In=e=>{ie(e,{get url(){return o(mt)},onClose:()=>x(mt,``),get returnFocus(){return o(ht)}})};C(Fn,e=>{o(mt)&&e(In)});var Ln=y(Fn,2);xe(Ln,{get active(){return M()},get agentNames(){return re()}});var Rn=y(Ln,2),zn=e=>{var t=Ke(),n=v(t,!0);S(()=>s(n,P())),l(e,t)};C(Rn,e=>{P()&&e(zn)});var Bn=y(Rn,2);{let e=A(()=>ae()?`No active recipient`:`Reply in thread`),t=A(()=>ae()||ce());ge(Bn,{get value(){return a.replyBody},get placeholder(){return o(e)},ariaLabel:`Reply body`,submitLabel:`Reply`,formClass:`composer reply-composer`,get disabled(){return o(t)},get replyTarget(){return a.replyTarget},get mentionPeople(){return j()},get onValue(){return a.onReplyBody},get onSubmit(){return a.onSubmitReply},get onKeydown(){return a.onReplyKeydown},get onFocus(){return a.onReplyFocus},get onInputRef(){return a.onReplyInputRef},get onClearReply(){return a.onClearReply}})}S(e=>{s(Ht,F()),s(Wt,a.headerDetail??`${a.threadState?.reply_count??a.replies.length} ${(a.threadState?.reply_count??a.replies.length)===1?`reply`:`replies`}`),T($,`data-message-id`,a.root.id),s(rn,a.root.author?.display_name||`Local User`),s(fn,e),s(Tn,`${a.replies.length??``} of ${a.threadState?.reply_count??a.replies.length??``} replies loaded`)},[()=>se(a.root.created_at)]),f(`scroll`,Q,et),f(`wheel`,Q,tt),t(`touchstart`,Q,tt,void 0,!0),t(`keydown`,Q,tt),t(`pointerdown`,Q,()=>{tt(),a.onActivateThreadComposer()}),t(`pointerup`,Q,function(...e){a.onInlineImagePointerUp?.apply(this,e)}),t(`pointerdown`,$,e=>wt(e,a.root)),t(`contextmenu`,$,Tt),l(i,It),d()}j([`click`,`touchstart`,`keydown`,`pointerdown`,`pointerup`,`contextmenu`]);export{xe as n,V as r,Je as t}; \ No newline at end of file diff --git a/apps/api/internal/webassets/dist/_app/immutable/chunks/By-MUCdv.js b/apps/api/internal/webassets/dist/_app/immutable/chunks/By-MUCdv.js new file mode 100644 index 00000000..59886b63 --- /dev/null +++ b/apps/api/internal/webassets/dist/_app/immutable/chunks/By-MUCdv.js @@ -0,0 +1,4 @@ +const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./DhPY4Pzy.js","./uBIymjUX.js"])))=>i.map(i=>d[i]); +import{t as e}from"./DK3Fl9T5.js";import{At as t,B as n,C as r,D as i,E as a,Et as o,F as s,G as c,I as l,K as u,N as d,O as f,P as p,R as m,S as h,St as g,Tt as _,V as v,X as y,Z as b,_ as x,a as S,at as C,b as w,c as T,ct as E,dt as D,f as O,ft as k,gt as A,h as j,ht as M,it as N,j as P,jt as F,k as ee,kt as I,lt as L,m as R,mt as z,n as te,nt as ne,o as re,p as B,pt as ie,r as ae,s as oe,tt as V,u as H,ut as se,v as ce,vt as U,xt as le,yt as W,z as ue}from"./CxKeDCcw.js";import{c as de,n as fe,t as pe}from"./ChC1oWd7.js";import{t as me}from"./uBIymjUX.js";import"./xihTtKlq.js";import"./qQG-ipvL.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 Ie,n as K,t as Le}from"./Qo16U5GS.js";import{t as Re}from"./OQjxVT6U.js";import"./CYM1xkwL.js";import{C as ze,D as Be,E as Ve,I as He,L as q,R as Ue,S as We,T as Ge,_ as Ke,b as qe,f as Je,g as Ye,h as J,j as Xe,k as Ze,m as Qe,p as $e,r as Y,u as X,v as Z,w as et,x as tt,y as Q}from"./DOE07Vt_.js";import{a as nt,c as rt,f as it,i as at,l as ot,o as st,p as ct,s as lt,t as ut,u as dt}from"./C7NZ0SeM.js";import{i as ft,n as pt,r as mt,t as ht}from"./KlawdwO_.js";import{n as gt,t as _t}from"./DlGnnCJo.js";import{n as vt,r as yt,t as bt}from"./8xW7lXBK.js";import{p as xt,r as St}from"./CVdgRPye.js";import{r as Ct,t as wt}from"./BIhzYFGW.js";var Tt={url:`/`,label:`cc`};function Et(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 Dt(e){if(!e||typeof e!=`object`)return Tt;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&&Et(r)?r:Tt.url,label:i&&Array.from(i).length<=32?i:Tt.label}}function Ot(e){return e===Tt.label}function kt(e){return Ot(e.label)?`ClickClack home`:`${e.label} home`}async function At(e){try{return Dt(await e(`/api/home-link`))}catch{return Tt}}var jt=`clickclack:browser-notifications-enabled:v1:`;function Mt(e){return`${jt}${e}`}function Nt(e){if(!e)return!1;try{return window.localStorage.getItem(Mt(e))===`enabled`}catch{return!1}}function Pt(e,t){if(!e)return!1;try{return t?window.localStorage.setItem(Mt(e),`enabled`):window.localStorage.removeItem(Mt(e)),!0}catch{return!1}}var Ft=typeof window>`u`?void 0:window.clickclackDesktop;function It(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 Lt=new Set([`agent_commentary`,`agent_tool`]),Rt=18e4;function zt(e){return e.kind!==void 0&&Lt.has(e.kind)}function Bt(e){return e.kind===void 0||e.kind===`message`}function Vt(e){return e.author?.id||e.author_id||``}function Ht(e){return`${e.channel_id?`channel:${e.channel_id}`:`direct:${e.direct_conversation_id||``}`}\u0000${Vt(e)}\u0000${e.turn_id||e.id}`}function Ut(e){let t=e.trim(),n=``,r=``,i=t.match(/^\*\*([^*]+)\*\*\s*\n+([\s\S]+)$/),a=t.match(/^\*\*([^*]+)\*\*$/);if(i)n=i[1].trim(),r=Gt(i[2]);else if(a)n=a[1].trim();else return Wt(t.replace(/\*\*/g,``).trim(),``);return Wt(n,r)}function Wt(e,t){let n=Gt(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 Gt(e){return e.replace(/\s+/g,` `).trim()}function Kt(e,t,n,r){let i=[];for(let e of t)if(e.kind===`agent_tool`){if(r.hideToolCalls)continue;let t=Ut(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 qt(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>Rt&&(r=!0)}a.set(t,r)}let o=[];for(let n=0;n=gn)&&(_n.active=!0,_n.lastPingAt=t,bn(e,`typing.started`)),_n.idleTimer&&window.clearTimeout(_n.idleTimer),_n.idleTimer=window.setTimeout(()=>{_n&&=(Sn(_n),null)},hn)}async function Sn(e){e.idleTimer&&window.clearTimeout(e.idleTimer),e.active&&await bn(e.scope,`typing.stopped`)}function Cn(){_n&&=(Sn(_n),null)}var wn=2e3,Tn=2097152;function En(e){let t=document.createElement(`span`);return t.textContent=e,t.innerHTML}function Dn(e,t,n){return!t||e.length>262144?Promise.resolve(En(e)):new Promise((r,i)=>{let a=new Worker(new URL(new URL(`../workers/highlight.worker-B65U9hWZ.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(En(e))),wn);if(a.onmessage=t=>{let n=t.data;`error`in n?s(()=>r(En(e))):s(()=>r(n.html))},a.onerror=()=>s(()=>r(En(e))),n.addEventListener(`abort`,c,{once:!0}),n.aborted){c();return}a.postMessage({source:e,language:t,outputLimit:Tn})})}var On=5e3;function kn(e,t,n){return new Promise((r,i)=>{let a=new Worker(new URL(new URL(`../workers/office.worker-BdyMEpKK.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.`))),On);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 An=16777216,jn=1e4,Mn=1e4,Nn=`This PDF page is too large to preview safely. Download the original to open it locally.`;function Pn(e,t){if(!Number.isSafeInteger(e)||!Number.isSafeInteger(t)||e<1||t<1||e>8192||t>8192||e*t>16777216)throw Error(Nn)}var Fn=new URL(`../assets/pdf.worker.TGcf_-kp.mjs`,import.meta.url).href,In=l(`
`),Ln=l(`

Preparing a safe preview.

`),Rn=l(``),zn=l(`
No preview for this file type

You can still download the original file.

Download original
`),Bn=l(`
`,1),Vn=l(` `),Hn=l(` `),Un=l(` `),Wn=l(` `),Gn=l(`

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

`),Kn=l(``),qn=l(`
Raw cached values; number and date formatting omitted
`,1),Jn=l(`

`),Yn=l(`

`),Xn=l(`

`),Zn=l(`

Some slide content was omitted by preview limits.

`),Qn=l(`

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

`,1),$n=l(`
`),er=l(`
`),tr=l(`
`),nr=l(`
 
`),rr=l(`
`,1);function ir(e,r){o(r,!0);let a=A(null),c=W(()=>Q(r.upload)),l=A(`preview`),m=A(`idle`),h=A(``),g=A(``),v=A(``),y=A(!1),b=A(``),x=A(null),S=A(1),T=A(1),E=A(!1),O=A(``),j=null,F=!1,R=A(null),z=A(0),ne=A(null),re=A(0),ie=1e4,ae=65536,V=5e3;class H extends Error{}let ce=W(()=>Ye(u(c))),U=W(()=>ze(r.upload)),le=W(()=>(u(c)===`markdown`||u(c)===`html`)&&u(m)===`ready`&&u(y));function ue(e){return`This ${u(ce).toLowerCase()} is ${We(r.upload.byte_size)}. Preview is limited to ${We(e)}.`}function de(e){pe(e);let t=document.createElement(`template`);t.innerHTML=e;let n=qe.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=Qe(e);return he(t),qe.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 H(`Structured preview exceeded the safe source limit.`);let t=0;for(let n of e)if("<[]>*_`-+.!#>|~".includes(n)&&(t+=1,t>ie))throw new H(`Structured preview exceeded the safe complexity limit.`)}function he(e){if(e.length>4194304)throw new H(`Rendered preview exceeded the safe output limit.`);let t=0;for(let n of e)if(n===`<`&&++t>ie*2)throw new H(`Rendered preview exceeded the safe element limit.`)}function ge(e){return`Preview data exceeded the ${We(e)} safety limit.`}async function _e(e,t){let n=await fetch(u(U),{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){j?.(),j=null,M(x,null),M(g,``),M(v,``),M(y,!1),M(b,``),M(S,1),M(T,1),M(O,``),F=!1,M(R,null),M(z,0),M(ne,null),M(re,0),M(l,`preview`),M(h,``);let t=Z(u(c));if(t!==void 0&&r.upload.byte_size>t){M(m,`error`),M(h,ue(t),!0);return}if(u(c)===`unsupported`){M(m,`ready`);return}M(m,`loading`);try{if(u(c)===`pdf`){let n=await me(()=>import(`./DhPY4Pzy.js`),__vite__mapDeps([0,1]),import.meta.url);if(e.aborted)return;n.GlobalWorkerOptions.workerSrc=Fn;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.`))},jn)}),c;try{if(c=await Promise.race([_e(r.signal,t),s]),e.aborted)throw new DOMException(`Aborted`,`AbortError`);a=new n.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.`&&(F=!0,j?.(),M(m,`error`),M(h,`PDF page content could not be rendered completely within safety limits.`))};l.addEventListener(`message`,u);let d=null,f=!1;j=()=>{f||(f=!0,l.removeEventListener(`message`,u),d&&d.destroy(),a.destroy(),M(x,null))};let p=n.getDocument({data:c,maxImageSize:An,canvasMaxAreaInBytes:An*4,stopAtErrors:!0,worker:a});d=p;try{M(x,await Promise.race([p.promise,s]),!0)}finally{clearTimeout(o),e.removeEventListener(`abort`,i)}}else if(u(c)===`spreadsheet`||u(c)===`presentation`){let n=await _e(e,t);if(e.aborted)return;if(u(c)===`spreadsheet`){let t=await kn(u(c),n,e);if(e.aborted)return;M(R,t,!0)}else{let t=await kn(u(c),n,e);if(e.aborted)return;M(ne,t,!0)}}else{if(M(g,await ve(e,t),!0),e.aborted)return;u(c)===`code`&&M(b,await Dn(u(g),Ke(r.upload),e),!0);try{u(c)===`markdown`&&(M(v,fe(u(g)),!0),M(y,!0)),u(c)===`html`&&(M(v,de(u(g)),!0),M(y,!0))}catch(e){if(!(e instanceof H))throw e;M(v,``),M(l,`source`)}}e.aborted||M(m,`ready`)}catch(t){if(e.aborted||t instanceof Error&&t.name===`AbortError`)return;j?.(),j=null,M(m,`error`),M(h,t instanceof Error?t.message:`Could not preview this artifact.`,!0)}}C(()=>{let e=new AbortController;return G(e.signal),()=>e.abort()}),C(()=>{if(u(c)!==`pdf`||!u(x)||!u(a)||u(m)!==`ready`)return;let e=u(x),t=u(S),n=u(T),r=!1,i=null,o=null,s=null,l=0;return M(E,!0),M(O,``),(async()=>{try{if(l=window.setTimeout(()=>{r||(i?.cancel(),s?.cancel(),j?.(),M(m,`error`),M(h,`PDF page rendering took too long and was stopped.`))},Mn),o=await e.getPage(t),r||!u(a))return;let c=``,d=0;s=o.streamTextContent().getReader();try{for(;!r;){let{done:e,value:t}=await s.read();if(e)break;for(let e of t.items){if(d+=1,d>V){await s.cancel(),c=`${c}โ€ฆ`;break}if(!(`str`in e)||!e.str)continue;let t=`${c}${c?` `:``}${e.str}`;if(t.length>ae){await s.cancel(),c=`${t.slice(0,ae)}โ€ฆ`;break}c=t}if(d>V||c.endsWith(`โ€ฆ`))break}}finally{s.releaseLock(),s=null}if(r)return;M(O,c||`This page has no extractable text.`,!0);let f=o.getViewport({scale:n}),p=Math.min(window.devicePixelRatio||1,2),g=Math.max(1,Math.floor(f.width*p)),_=Math.max(1,Math.floor(f.height*p));Pn(g,_);let v=u(a).getContext(`2d`);if(!v)throw Error(`PDF canvas is unavailable.`);if(u(a).width=g,u(a).height=_,u(a).style.width=`${f.width}px`,u(a).style.height=`${f.height}px`,v.setTransform(p,0,0,p,0,0),i=o.render({canvasContext:v,viewport:f}),await i.promise,F)throw Error(`PDF page content could not be rendered completely within safety limits.`)}catch(e){!r&&!(e instanceof Error&&e.name===`RenderingCancelledException`)&&(j?.(),M(m,`error`),M(h,e instanceof Error?e.message:`Could not render this PDF page.`,!0))}finally{clearTimeout(l),o?.cleanup(),o=null,r||M(E,!1)}})(),()=>{r=!0,clearTimeout(l),i?.cancel(),s?.cancel()}}),te(()=>j?.());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=W(()=>{let e=u(R)?.sheets[u(z)];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=rr(),we=se(Ce),Te=L(we),Ee=L(Te),De=D(Ee,!0),Oe=k(Ee,2),ke=D(Oe,!0),Ae=k(Oe,2),je=D(Ae,!0);t(Te);var Me=k(Te,2),Ne=L(Me),Pe=e=>{var r=In(),i=L(r);let a;var o=k(i,2);let s;t(r),N(()=>{B(r,`aria-label`,`${u(ce)} view`),B(i,`aria-pressed`,u(l)===`preview`),a=w(i,1,``,null,a,{active:u(l)===`preview`}),B(o,`aria-pressed`,u(l)===`source`),s=w(o,1,``,null,s,{active:u(l)===`source`})}),n(`click`,i,()=>M(l,`preview`)),n(`click`,o,()=>M(l,`source`)),p(e,r)};P(Ne,e=>{u(le)&&e(Pe)});var Fe=k(Ne,2),Ie=k(Fe,2);t(Me),t(we);var K=k(we,2);let Le;var Re=L(K),Be=e=>{var n=Ln(),r=k(L(n),2),i=D(r);I(2),t(n),N(e=>d(i,`Opening ${e??``}`),[()=>u(ce).toLowerCase()]),p(e,n)},Ve=e=>{var n=Rn(),i=k(L(n),4),a=D(i,!0),o=k(i,2);t(n),N(()=>{d(a,u(h)),B(o,`href`,u(U)),B(o,`download`,r.upload.filename)}),p(e,n)},He=e=>{var n=zn(),i=k(L(n),6);t(n),N(()=>{B(i,`href`,u(U)),B(i,`download`,r.upload.filename)}),p(e,n)},q=e=>{var r=Bn(),i=se(r),o=L(i),s=k(o,2),c=D(s),l=k(s,2),f=k(l,4),m=k(f,2),h=D(m),g=k(m,2);t(i);var _=k(i,2);let v;var y=L(_);oe(y,e=>M(a,e),()=>u(a));var b=k(y,2),C=D(b,!0);t(_),N(e=>{o.disabled=u(S)<=1||u(E),d(c,`Page ${u(S)??``} of ${u(x).numPages??``}`),l.disabled=u(S)>=u(x).numPages||u(E),f.disabled=u(T)<=.6||u(E),d(h,`${e??``}%`),g.disabled=u(T)>=2||u(E),v=w(_,1,`artifact-viewer__pdf-stage`,null,v,{"is-rendering":u(E)}),B(_,`aria-label`,`PDF page ${u(S)} visual preview`),B(b,`aria-label`,`PDF page ${u(S)} text`),d(C,u(O))},[()=>Math.round(u(T)*100)]),n(`click`,o,()=>M(S,u(S)-1)),n(`click`,l,()=>M(S,u(S)+1)),n(`click`,f,()=>M(T,Math.max(.6,u(T)-.2),!0)),n(`click`,g,()=>M(T,Math.min(2,u(T)+.2),!0)),p(e,r)},Ue=e=>{var r=qn(),i=se(r),a=L(i),o=D(a),s=k(a,4),c=e=>{var t=Vn(),n=D(t);N(()=>d(n,`${u(R).hiddenSheets??``} hidden ${u(R).hiddenSheets===1?`sheet`:`sheets`} omitted`)),p(e,t)};P(s,e=>{u(R).hiddenSheets>0&&e(c)});var l=k(s,2),m=e=>{var t=Vn(),n=D(t);N(()=>d(n,`${u(R).unsupportedSheets??``} non-worksheet ${u(R).unsupportedSheets===1?`sheet`:`sheets`} omitted`)),p(e,t)};P(l,e=>{u(R).unsupportedSheets>0&&e(m)}),t(i);var h=k(i,2),g=L(h),_=L(g),v=L(_),y=k(L(v));f(y,17,()=>u(Se).columns,ee,(e,t)=>{var n=Hn(),r=D(n,!0);N(()=>d(r,u(t))),p(e,n)}),t(v),t(_);var b=k(_);f(b,21,()=>u(Se).rows,ee,(e,n)=>{var r=Wn(),i=L(r),a=D(i,!0),o=k(i);f(o,17,()=>u(n).values,ee,(e,t)=>{var n=Un(),r=D(n,!0);N(()=>d(r,u(t))),p(e,n)}),t(r),N(()=>d(a,u(n).number)),p(e,r)}),t(b),t(g);var x=k(g,2),S=e=>{var t=Gn();p(e,t)};P(x,e=>{(u(Se).clipped||u(R).sheets[u(z)].truncated)&&e(S)}),t(h);var C=k(h,2);f(C,21,()=>u(R).sheets,ee,(e,t,r)=>{var i=Kn();let a;var o=D(i,!0);N(()=>{B(i,`aria-selected`,u(z)===r),a=w(i,1,``,null,a,{active:u(z)===r}),d(o,u(t).name)}),n(`click`,i,()=>M(z,r,!0)),p(e,i)}),t(C),N(()=>{d(o,`${u(R).sheets.length??``} ${u(R).sheets.length===1?`sheet`:`sheets`}`),B(h,`aria-label`,`${u(R).sheets[u(z)].name} worksheet`)}),p(e,r)},Ge=e=>{var r=Qn(),i=se(r),a=L(i),o=k(a,2),c=D(o),l=k(o,2);t(i);var m=k(i,2),h=L(m);f(h,21,()=>u(ne).slides[u(re)].paragraphs,ee,(e,t,n)=>{var r=s(),i=se(r),a=e=>{var n=Jn(),r=D(n,!0);N(()=>d(r,u(t))),p(e,n)},o=e=>{var n=Yn(),r=D(n,!0);N(()=>d(r,u(t))),p(e,n)};P(i,e=>{n===0?e(a):e(o,-1)}),p(e,r)}),t(h);var g=k(h,4),_=e=>{var t=Xn(),n=D(t);N(()=>d(n,`${u(ne).hiddenSlides??``} hidden ${u(ne).hiddenSlides===1?`slide`:`slides`} omitted.`)),p(e,t)};P(g,e=>{u(ne).hiddenSlides>0&&e(_)});var v=k(g,2),y=e=>{var t=Zn();p(e,t)};P(v,e=>{u(ne).truncated&&e(y)}),t(m),N(()=>{a.disabled=u(re)===0,d(c,`Slide ${u(re)+1} of ${u(ne).slides.length??``}`),l.disabled=u(re)>=u(ne).slides.length-1,B(h,`aria-label`,`Slide ${u(re)+1}: ${u(ne).slides[u(re)].title}`)}),n(`click`,a,()=>M(re,u(re)-1)),n(`click`,l,()=>M(re,u(re)+1)),p(e,r)},Je=e=>{var n=$n();i(n,()=>u(v),!0),t(n),p(e,n)},J=e=>{var n=er();i(n,()=>u(v),!0),t(n),p(e,n)},Xe=e=>{var n=tr(),r=L(n);i(r,()=>u(b),!0),t(r),t(n),p(e,n)},Ze=e=>{var n=nr(),r=L(n),i=D(r,!0);t(n),N(()=>d(i,u(g))),p(e,n)};P(Re,e=>{u(m)===`loading`?e(Be):u(m)===`error`?e(Ve,1):u(c)===`unsupported`?e(He,2):u(c)===`pdf`&&u(x)?e(q,3):u(c)===`spreadsheet`&&u(R)?e(Ue,4):u(c)===`presentation`&&u(ne)?e(Ge,5):u(c)===`html`&&u(l)===`preview`&&u(v)?e(Je,6):u(c)===`markdown`&&u(l)===`preview`?e(J,7):u(c)===`code`?e(Xe,8):e(Ze,-1)}),t(K),N(e=>{d(De,u(ce)),B(Oe,`title`,r.upload.filename),d(ke,r.upload.filename),d(je,e),B(Fe,`href`,u(U)),B(Fe,`download`,r.upload.filename),B(Fe,`aria-label`,`Download ${r.upload.filename}`),Le=w(K,1,`artifact-viewer__body`,null,Le,{"is-pdf":u(c)===`pdf`,"is-office":u(c)===`spreadsheet`||u(c)===`presentation`})},[()=>We(r.upload.byte_size)]),n(`click`,Ie,function(...e){r.onClose?.apply(this,e)}),p(e,Ce),_()}ue([`click`]);var ar=l(``),or=l(`
`),sr=l(`

or

`),cr=l(` `,1),lr=l(``),ur=l(``),dr=l(`

`),fr=l(`
ClickClack OpenClaw workspace chat

Welcome.

Have a sign-in token?
`,1);function pr(e,r){o(r,!0);let i=Ft?.integratedTitleBar===!0,a=A(``),s=ge(),c=s.includes(`github`),l=s.includes(`password`),f=!Ft&&s.includes(`openclaw`),m=A(``),h=A(``),g=A(``),y=A(!1),b=A(``),x=l?c?`Sign in with your ClickClack account, or continue with GitHub.`:`Sign in with your ClickClack account.`:c?`Sign in with GitHub to join the guest room.`:f?`Sign in with OpenClaw ID to join the guest room.`:`Sign in with a token from your ClickClack administrator.`,S=c&&!l?`Any GitHub account can join.`:``;async function C(e){if(Ft){e.preventDefault(),M(a,`Opening GitHub in your browserโ€ฆ`);try{await Ft.signInWithGitHub(),M(a,`Finish signing in in your browser. ClickClack will complete here automatically.`)}catch{M(a,`Could not open your browser. Try again.`)}}}async function w(e,t){if(!u(y)){M(y,!0),M(b,``);try{await G(e,{method:`POST`,body:JSON.stringify(t)}),window.location.reload()}catch(e){M(b,xe(e,`Could not sign in.`),!0),M(y,!1)}}}function T(e){e.preventDefault(),w(`/api/auth/password/login`,{identifier:u(m),password:u(h)})}function E(e){e.preventDefault(),w(`/api/auth/magic/consume`,{token:u(g)})}var j=fr(),F=se(j),ee=e=>{var t=ar();N(()=>B(t,`data-platform`,Ft.platform)),p(e,t)};P(F,e=>{i&&Ft&&e(ee)});var R=k(F,2),z=L(R),te=L(z),ne=L(te);Je(ne,{class:`mark`,size:44}),I(2),t(te);var re=k(te,2),ie=k(L(re),2),ae=D(ie,!0);t(re);var oe=k(re,2),V=e=>{var n=or(),r=L(n),i=k(L(r),2);O(i),t(r);var a=k(r,2),o=k(L(a),2);O(o),t(a);var s=k(a,2),c=D(s,!0);t(n),N(()=>{s.disabled=u(y),d(c,u(y)?`Signing in...`:`Sign in`)}),v(`submit`,n,T),H(i,()=>u(m),e=>M(m,e)),H(o,()=>u(h),e=>M(h,e)),p(e,n)};P(oe,e=>{l&&e(V)});var ce=k(oe,2),U=e=>{var t=cr(),r=se(t),i=e=>{var t=sr();p(e,t)};P(r,e=>{l&&e(i)});var a=k(r,2);N(e=>B(a,`href`,e),[()=>he(`/api/auth/github/start`)]),n(`click`,a,C),p(e,t)};P(ce,e=>{c&&e(U)});var le=k(ce,2),W=e=>{var t=lr();N(e=>B(t,`href`,e),[()=>he(`/api/auth/openclaw/start`)]),p(e,t)};P(le,e=>{f&&e(W)});var ue=k(le,2),de=e=>{var t=ur(),n=D(t,!0);N(()=>d(n,u(b))),p(e,t)};P(ue,e=>{u(b)&&e(de)});var fe=k(ue,2),pe=k(L(fe),2),me=L(pe),_e=k(L(me),2);O(_e),t(me);var ve=k(me,2);t(pe),t(fe);var ye=k(fe,2),be=e=>{var t=dr(),n=D(t,!0);N(()=>d(n,u(a)||S)),p(e,t)};P(ye,e=>{(u(a)||S)&&e(be)}),t(z),t(R),N(()=>{d(ae,x),fe.open=!c&&!l&&!f,ve.disabled=u(y)}),v(`submit`,pe,E),H(_e,()=>u(g),e=>M(g,e)),p(e,j),_()}ue([`click`]);var mr=l(``),hr=l(``);function gr(e,r){o(r,!0);let i=S(r,`deleting`,3,!1),a=S(r,`error`,3,``),s=W(()=>r.message.author?.display_name||`Local User`);function c(){i()||r.onClose()}var l=hr(),f=L(l),m=k(f,2),h=L(m),g=k(L(h),2);t(h);var v=k(h,2),y=k(L(v),2),b=L(y);{let e=W(()=>r.message.author?.id||r.message.author_id),t=W(()=>r.message.author?.avatar_url);ut(b,{class:`avatar`,get id(){return u(e)},get name(){return u(s)},get src(){return u(t)},size:36,loading:`eager`,fetchPriority:`auto`})}var x=k(b,2),C=L(x),w=L(C),T=D(w,!0),E=k(w,2),O=D(E,!0);t(C);var A=k(C,2),j=D(A,!0);t(x),t(y);var M=k(y,2),F=e=>{var t=mr(),n=D(t,!0);N(()=>d(n,a())),p(e,t)};P(M,e=>{a()&&e(F)});var ee=k(M,2),I=L(ee),R=k(I,2),z=D(R,!0);t(ee),t(v),t(m),t(l),N(e=>{f.disabled=i(),g.disabled=i(),d(T,u(s)),B(E,`datetime`,r.message.created_at),d(O,e),d(j,r.message.body),I.disabled=i(),R.disabled=i(),d(z,i()?`Deleting...`:`Delete`)},[()=>J(r.message.created_at)]),n(`click`,f,c),n(`click`,g,c),n(`click`,I,c),n(`click`,R,function(...e){r.onConfirm?.apply(this,e)}),p(e,l),_()}ue([`click`]);var _r=6500,vr=l(`
`);function yr(e,n){o(n,!0);let r=W(()=>n.entries.filter(e=>e.userID!==n.currentUserID));function i(e,t=`Someone`){return e?.display_name?.trim()||(e?.handle?`@${e.handle}`:t)}let a=W(()=>u(r).length===0?``:u(r).length===1?`${i(u(r)[0].user)} is typingโ€ฆ`:u(r).length===2?`${i(u(r)[0].user)} and ${i(u(r)[1].user)} are typingโ€ฆ`:u(r).length===3?`${i(u(r)[0].user)}, ${i(u(r)[1].user)}, and ${i(u(r)[2].user)} are typingโ€ฆ`:`Several people are typingโ€ฆ`);var s=vr();let c;var l=k(L(s),2),f=D(l,!0);t(s),N(()=>{c=w(s,1,`typing-indicator`,null,c,{visible:u(r).length>0}),d(f,u(a))}),p(e,s),_()}var br=l(`
`),xr=l(`
`),Sr=l(`
`);function Cr(e,n){o(n,!0);function r(e){return e.kind===`tool`&&e.toolName?!e.text||e.text===e.toolName?e.toolName:`${e.toolName}: ${e.text}`:e.text}function i(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 a=s(),c=se(a),l=e=>{var a=Sr();f(a,21,()=>n.turns,e=>e.key,(e,n)=>{var a=xr();f(a,21,()=>u(n).lines,e=>e.id,(e,n)=>{var a=br();let o;var s=L(a),c=D(s,!0),l=k(s,2),f=D(l,!0);t(a),N((e,t)=>{o=w(a,1,`agent-progress__line svelte-6vwkyv`,null,o,{"agent-progress__line--done":u(n).finalized}),B(a,`data-kind`,u(n).kind),d(c,e),d(f,t)},[()=>i(u(n).kind),()=>r(u(n))]),p(e,a)}),t(a),p(e,a)}),t(a),p(e,a)};P(c,e=>{n.turns.length>0&&e(l)}),p(e,a),_()}function wr(e,t){return`${e}\u0000${t}`}var Tr=45e3;function Er(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=wr(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+Tr;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 Dr=l(``),Or=l(``);function kr(e,r){o(r,!0);var i=Or(),a=L(i),s=k(a,2),c=L(s),l=k(L(c),2);t(c);var u=k(c,2),f=L(u),m=k(L(f),2);O(m),t(f);var h=k(f,2),g=e=>{var t=Dr(),n=D(t,!0);N(()=>d(n,r.error)),p(e,t)};P(h,e=>{r.error&&e(g)});var y=k(h,2),b=L(y),x=k(b,2),S=D(x,!0);t(y),t(u),t(s),t(i),N(e=>{j(m,r.channelName),m.disabled=r.pending,x.disabled=e,d(S,r.pending?`Creatingโ€ฆ`:`Create channel`)},[()=>r.pending||!r.channelName.trim()]),n(`click`,a,function(...e){r.onClose?.apply(this,e)}),n(`click`,l,function(...e){r.onClose?.apply(this,e)}),v(`submit`,u,e=>{e.preventDefault(),r.onCreate()}),n(`input`,m,e=>r.onChannelName(e.currentTarget.value)),n(`click`,b,function(...e){r.onClose?.apply(this,e)}),p(e,i),_()}ue([`click`,`input`]);var Ar=l(``),jr=l(`
No matching people yet
`),Mr=l(`

`),Nr=l(``),Pr=l(``);function Fr(e,r){o(r,!0);let i=W(()=>r.memberID.trim().toLowerCase().replace(/^@/,``)),a=W(()=>r.people.filter(e=>e.id!==r.currentUserID).filter(e=>!u(i)||e.display_name.toLowerCase().includes(u(i))||e.handle?.toLowerCase().includes(u(i))||e.id.toLowerCase().includes(u(i)))),s=W(()=>r.memberID.trim().startsWith(`usr_`)?r.memberID.trim():u(i)&&u(a).length===1?u(a)[0].id:``);function c(e){r.pending||!e||(r.onMemberID(e),r.onStart(e))}var l=Pr(),m=L(l),h=k(m,2),g=L(h),y=k(L(g),2);t(g);var b=k(g,2),x=L(b),S=k(L(x),2);O(S),t(x);var C=k(x,2),w=L(C);f(w,17,()=>u(a),e=>e.id,(e,i)=>{var a=Ar(),o=L(a);ut(o,{class:`dm-avatar`,get id(){return u(i).id},get name(){return u(i).display_name},get src(){return u(i).avatar_url},size:32});var s=k(o,2),l=L(s),f=D(l,!0),m=k(l,2),h=D(m,!0);t(s),t(a),N(e=>{a.disabled=r.pending,d(f,u(i).display_name),d(h,e)},[()=>ot(u(i).handle)||u(i).id]),n(`click`,a,()=>c(u(i).id)),p(e,a)});var T=k(w,2),E=e=>{var t=jr();p(e,t)};P(T,e=>{u(a).length===0&&e(E)}),t(C);var A=k(C,2),M=e=>{var t=Mr(),n=D(t,!0);N(()=>d(n,u(a).length>1?`Choose a person from the results.`:`Choose a person or enter a user ID.`)),p(e,t)};P(A,e=>{u(i)&&!u(s)&&e(M)});var F=k(A,2),ee=e=>{var t=Nr(),n=D(t,!0);N(()=>d(n,r.error)),p(e,t)};P(F,e=>{r.error&&e(ee)});var I=k(F,2),R=L(I),z=k(R,2),te=D(z,!0);t(I),t(b),t(h),t(l),N(()=>{j(S,r.memberID),S.disabled=r.pending,z.disabled=r.pending||!u(s),d(te,r.pending?`Startingโ€ฆ`:`Start DM`)}),n(`click`,m,function(...e){r.onClose?.apply(this,e)}),n(`click`,y,function(...e){r.onClose?.apply(this,e)}),v(`submit`,b,e=>{e.preventDefault(),c(u(s))}),n(`input`,S,e=>r.onMemberID(e.currentTarget.value)),n(`click`,R,function(...e){r.onClose?.apply(this,e)}),p(e,l),_()}ue([`click`,`input`]);var Ir=l(` `),Lr=l(``),Rr=l(`
`),zr=l(``),Br=l(`

Creating workspaceโ€ฆ

`),Vr=l(`
`),Hr=l(``);function Ur(e,r){o(r,!0);let i=S(r,`homeHref`,3,`/`),a=S(r,`homeLabel`,3,`cc`),s=S(r,`homeTitle`,3,`ClickClack home`);function c(e){return e.button===0&&!e.metaKey&&!e.ctrlKey&&!e.shiftKey&&!e.altKey}var l=Hr(),m=L(l);let h;var g=L(m),y=e=>{Je(e,{size:48})},b=W(()=>Ot(a())),x=e=>{var t=Ir(),n=D(t,!0);N(()=>d(n,a())),p(e,t)};P(g,e=>{u(b)?e(y):e(x,-1)}),t(m);var C=k(m,4),T=L(C);f(T,17,()=>r.workspaces,e=>e.id,(e,i)=>{var a=Rr();let o;var s=L(a),l=L(s),f=e=>{var t=Lr();N(e=>B(t,`src`,e),[()=>_e(u(i).icon_url)]),p(e,t)},m=e=>{var t=Ir(),n=D(t,!0);N(e=>d(n,e),[()=>ct(u(i).name)]),p(e,t)};P(l,e=>{u(i).icon_url?e(f):e(m,-1)}),t(s),t(a),N(e=>{o=w(a,1,`guild-wrap`,null,o,{active:u(i).id===r.selectedWorkspaceID}),B(s,`title`,u(i).name),B(s,`aria-label`,u(i).name),B(s,`href`,e)},[()=>r.hrefForWorkspace(u(i).id)]),n(`click`,s,e=>{c(e)&&(e.preventDefault(),r.onSelectWorkspace(u(i).id))}),p(e,a)});var E=k(T,2);t(C);var A=k(C,2),M=e=>{var i=Vr(),a=L(i);O(a);var o=k(a,2),s=e=>{var t=zr(),n=D(t,!0);N(()=>d(n,r.createError)),p(e,t)};P(o,e=>{r.createError&&e(s)});var c=k(o,2),l=e=>{var t=Br();p(e,t)};P(c,e=>{r.createPending&&e(l)}),t(i),N(()=>{j(a,r.workspaceName),a.disabled=r.createPending}),v(`submit`,i,e=>{e.preventDefault(),r.onCreateWorkspace()}),n(`input`,a,e=>r.onWorkspaceName(e.currentTarget.value)),p(e,i)};P(A,e=>{r.showWorkspaceCreate&&e(M)}),t(l),N(e=>{h=w(m,1,`guild home`,null,h,{"home--mark":e}),B(m,`title`,s()),B(m,`aria-label`,s()),B(m,`href`,i())},[()=>Ot(a())]),n(`click`,E,function(...e){r.onToggleWorkspaceCreate?.apply(this,e)}),p(e,l),_()}ue([`click`,`input`]);var Wr=l(``),Gr=l(` `,1),Kr=l(``),qr=l(` `),Jr=l(``),Yr=l(`
`),Xr=l(``),Zr=l(`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),Qr=l(`
`);function $r(e,r){o(r,!0);let i=(e,i=F,a=F,o=F,s=F,c=F)=>{let f=W(()=>i().unread_count||0),_=W(()=>a().findIndex(e=>e.id===i().id));var y=Jr();let b;var C=L(y),T=e=>{var r=Gr(),s=se(r),c=k(s,2),l=e=>{var r=Wr(),o=L(r),s=k(o,2);t(r),oe(r,e=>M(S,e),()=>u(S)),N(e=>{B(r,`aria-label`,e),o.disabled=u(_)<=0,s.disabled=u(_)<0||u(_)>=a().length-1},[()=>`Move #${_t(i())}`]),n(`keydown`,r,e=>{e.key===`Escape`&&(e.preventDefault(),_e(!0))}),n(`click`,o,()=>ve(i().id,-1,a())),n(`click`,s,()=>ve(i().id,1,a())),p(e,r)};P(c,e=>{u(x)===i().id&&e(l)}),N(e=>{B(s,`aria-label`,e),B(s,`aria-expanded`,u(x)===i().id)},[()=>`Move #${_t(i())}`]),n(`click`,s,e=>void ge(i().id,e.currentTarget)),v(`dragstart`,s,e=>fe(e,i().id,o())),v(`dragend`,s,he),n(`keydown`,s,e=>{e.key===`ArrowUp`||e.key===`ArrowDown`?(e.preventDefault(),M(x,``),de(i().id,e.key===`ArrowUp`?-1:1,a())):e.key===`Escape`&&M(x,``)}),p(e,r)};P(C,e=>{c()&&e(T)});var E=k(C,2);let O;var A=k(L(E),2),j=D(A,!0),ee=k(A,2),I=e=>{var t=Kr();p(e,t)};P(ee,e=>{i().external_managed&&e(I)});var R=k(ee,2),z=e=>{var t=qr(),n=D(t,!0);N(()=>{B(t,`aria-label`,`${u(f)} unread`),d(n,u(f)>99?`99+`:u(f))}),p(e,t)};P(R,e=>{u(f)>0&&!(i().id===r.selectedChannelID&&!r.selectedDirectID)&&e(z)}),t(E),t(y),N((e,t)=>{b=w(y,1,`channel-row`,null,b,{reorderable:c(),subdued:s(),dragging:u(l)===i().id,"drop-before":u(h)===i().id&&u(g),"drop-after":u(h)===i().id&&!u(g)}),B(E,`href`,e),O=w(E,1,`nav-item channel`,null,O,{active:i().id===r.selectedChannelID&&!r.selectedDirectID,"has-unread":u(f)>0&&!(i().id===r.selectedChannelID&&!r.selectedDirectID)}),d(j,t)},[()=>r.hrefForChannel(i().id),()=>_t(i())]),v(`dragover`,y,e=>{c()&&pe(e,i().id,o())}),v(`drop`,y,e=>{e.preventDefault(),!(!c()||u(m)!==o())&&(ue(u(l),i().id,u(g),a()),he())}),n(`focusout`,y,e=>{e.currentTarget.contains(e.relatedTarget)||M(x,``)}),n(`click`,E,e=>{G(e)&&(e.preventDefault(),r.onSelectChannel(i().id))}),p(e,y)},a=(e,r=F,a=F,o=F)=>{let s=W(()=>V(r().key)),c=W(()=>U(r()));var l=Yr();let m;var h=L(l),g=k(L(h),2),_=D(g,!0),v=k(g,2),y=D(v,!0);t(h);var b=k(h,2);f(b,21,()=>u(c),e=>e.id,(e,t)=>{i(e,()=>u(t),()=>r().channels,()=>r().key,o,()=>u(s))}),t(b),t(l),N(()=>{m=w(l,1,`channel-subgroup`,null,m,{"archived-channel-group":o()}),B(h,`aria-expanded`,u(s)),B(h,`aria-controls`,a()),d(_,r().label),d(y,r().channels.length),B(b,`id`,a()),B(b,`hidden`,!u(s)&&u(c).length===0)}),n(`click`,h,()=>H(r().key)),p(e,l)},c=`archived`,l=A(``),m=A(``),h=A(``),g=A(!0),b=A(!1),x=A(``),S=A(void 0),T,O=A(``),j=A(ie({})),ee=W(()=>r.channels.filter(e=>!e.archived_at)),I=W(()=>r.channels.filter(e=>!!e.archived_at)),R=W(()=>u(ee).filter(e=>!e.sidebar_section?.trim())),z=W(()=>{let e=new Map;for(let t of u(ee)){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`}))}),te=W(()=>r.channels.filter(e=>e.id===r.selectedChannelID&&!r.selectedDirectID||(e.unread_count||0)>0));function ne(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 re(e){return`clickclack:sidebar-channel-groups:v1:${e}`}function ae(e){if(!e)return{};try{return ne(window.localStorage.getItem(re(e)))}catch{return{}}}function V(e){let t=u(j)[e];return typeof t==`boolean`?t:e!==c}function H(e){if(M(j,{...u(j),[e]:!V(e)},!0),r.workspaceID)try{window.localStorage.setItem(re(r.workspaceID),JSON.stringify(u(j)))}catch{}}function ce(e){e.key===re(r.workspaceID)&&M(j,ne(e.newValue),!0)}function U(e){return V(e.key)?e.channels:e.channels.filter(e=>e.id===r.selectedChannelID&&!r.selectedDirectID||(e.unread_count||0)>0)}function le(e){M(O,``),queueMicrotask(()=>{M(O,e,!0)})}function ue(e,t,n,i){if(!e||!t||e===t)return;let a=r.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+ +!n,0,e),r.onReorder(a);let c=r.channels.find(t=>t.id===e),l=i.map(e=>e.id).filter(t=>t!==e),u=l.indexOf(t);l.splice(u+ +!n,0,e),c&&le(`Moved #${_t(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||ue(e,n[i].id,t<0,n)}function fe(e,t,n){M(b,!0),M(x,``),M(l,t,!0),M(m,n,!0),e.dataTransfer?.setData(`text/plain`,t),e.dataTransfer&&(e.dataTransfer.effectAllowed=`move`)}function pe(e,t,n){if(!u(l)||u(l)===t||u(m)!==n)return;e.preventDefault();let r=e.currentTarget;M(h,t,!0),M(g,e.clientY{M(b,!1)},0)}async function ge(e,t){if(!u(b)){if(u(x)===e){M(x,``);return}T=t,M(x,e,!0),await y(),u(S)?.querySelector(`button:not(:disabled)`)?.focus()}}async function _e(e=!1){M(x,``),e&&(await y(),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}C(()=>{M(j,ae(r.workspaceID),!0)}),C(()=>{r.expanded||(M(x,``),me(),M(b,!1))});var ye=Qr();v(`storage`,E,ce);let be;var xe=L(ye),Se=L(xe),Ce=k(Se,2);t(xe);var we=k(xe,2),Te=L(we),Ee=e=>{var t=Zr(),n=k(se(t),2);f(n,17,()=>u(R),e=>e.id,(e,t)=>{i(e,()=>u(t),()=>u(R),()=>`unsectioned`,()=>!1,()=>!0)});var o=k(n,2);f(o,19,()=>u(z),e=>e.key,(e,t,n)=>{a(e,()=>u(t),()=>`sidebar-channel-section-${u(n)}`,()=>!1)});var s=k(o,2),l=e=>{a(e,()=>({key:c,label:`Archived`,channels:u(I)}),()=>`sidebar-archived-channels`,()=>!0)};P(s,e=>{u(I).length>0&&e(l)});var d=k(s,2),m=e=>{var t=Xr();p(e,t)};P(d,e=>{r.channels.length===0&&e(m)}),p(e,t)},De=e=>{var t=s(),n=se(t);f(n,17,()=>u(te),e=>e.id,(e,t)=>{{let n=W(()=>!!u(t).archived_at);i(e,()=>u(t),()=>u(te),()=>`priority`,()=>u(n),()=>!1)}}),p(e,t)};P(Te,e=>{r.expanded?e(Ee):e(De,-1)}),t(we);var Oe=k(we,2),ke=D(Oe,!0);t(ye),N(()=>{be=w(ye,1,`nav-section`,null,be,{collapsed:!r.expanded}),B(Se,`aria-expanded`,r.expanded),B(we,`hidden`,!r.expanded&&u(te).length===0),d(ke,u(O))}),n(`click`,Se,function(...e){r.onToggle?.apply(this,e)}),n(`click`,Ce,function(...e){r.onCreateChannel?.apply(this,e)}),p(e,ye),_()}ue([`focusout`,`click`,`keydown`]);var ei=l(` `),ti=l(``),ni=l(``),ri=l(`
`),ii=l(``),ai=l(`
`),oi=l(`
`);function si(e,r){o(r,!0);let i=A(``),a=W(()=>r.expanded?r.conversations:r.conversations.filter(e=>e.id===r.selectedDirectID||(e.unread_count||0)>0));function s(e){return e.button===0&&!e.metaKey&&!e.ctrlKey&&!e.shiftKey&&!e.altKey}function c(e){M(i,u(i)===e?``:e,!0)}function l(){M(i,``)}var m=oi();let h;var g=L(m),v=L(g),y=k(v,2);t(g);var b=k(g,2),x=L(b);f(x,17,()=>u(a),e=>e.id,(e,a)=>{let o=W(()=>lt(u(a),r.currentUserID)),f=W(()=>u(a).unread_count||0),m=W(()=>u(a).id===r.selectedDirectID);var h=ri();let g;var _=L(h);let v;var y=L(_);{let e=W(()=>u(o)?.id||u(a).id),t=W(()=>u(o)?.display_name),n=W(()=>dt(u(o))?void 0:u(o)?.avatar_url);ut(y,{class:`dm-avatar`,get id(){return u(e)},get name(){return u(t)},get src(){return u(n)},size:22})}var b=k(y,2),x=D(b,!0),S=k(b,2),C=e=>{var t=ei(),n=D(t,!0);N(()=>{B(t,`aria-label`,`${u(f)} unread`),d(n,u(f)>99?`99+`:u(f))}),p(e,t)},T=e=>{var t=ti();p(e,t)};P(S,e=>{u(f)>0&&!u(m)?e(C):e(T,-1)}),t(_);var E=k(_,2),O=k(E,2),A=e=>{var t=ni(),i=D(t);n(`click`,i,e=>{e.preventDefault(),e.stopPropagation(),l(),r.onHideDirect(u(a).id)}),p(e,t)};P(O,e=>{u(i)===u(a).id&&e(A)}),t(h),N((e,t,n)=>{g=w(h,1,`dm-row`,null,g,{active:u(m)}),B(_,`href`,e),v=w(_,1,`nav-item dm`,null,v,{active:u(m),"has-unread":u(f)>0&&!u(m)}),d(x,t),B(E,`aria-label`,n),B(E,`aria-expanded`,u(i)===u(a).id)},[()=>r.hrefForDirect(u(a).id),()=>rt(u(a),r.currentUserID),()=>`Direct message actions for ${rt(u(a),r.currentUserID)}`]),n(`click`,_,e=>{s(e)&&(e.preventDefault(),r.onSelectDirect(u(a).id))}),n(`click`,E,e=>{e.preventDefault(),e.stopPropagation(),c(u(a).id)}),n(`keydown`,E,e=>{e.key===`Escape`&&l()}),p(e,h)});var S=k(x,2),C=e=>{var t=ii();p(e,t)};P(S,e=>{r.expanded&&r.conversations.length===0&&e(C)});var T=k(S,2),E=e=>{var i=ai(),a=L(i),o=D(a),s=k(a,2);t(i),N(()=>d(o,`Closed ${r.hiddenDirectTitle??``}`)),n(`click`,s,function(...e){r.onUndoHideDirect?.apply(this,e)}),p(e,i)};P(T,e=>{r.expanded&&r.hiddenDirectTitle&&e(E)}),t(b),t(m),N(()=>{h=w(m,1,`nav-section`,null,h,{collapsed:!r.expanded}),B(v,`aria-expanded`,r.expanded),B(b,`hidden`,!r.expanded&&u(a).length===0)}),n(`click`,v,function(...e){r.onToggle?.apply(this,e)}),n(`click`,y,function(...e){r.onCreateDirect?.apply(this,e)}),p(e,m),_()}ue([`click`,`keydown`]);var ci=l(``),li=l(`Connectingโ€ฆ`),ui=l(`
`),di=l(` `),fi=l(``),pi=l(``),mi=l(``);function hi(e,r){o(r,!0);let i=S(r,`showHeader`,3,!0),a=`clickclack:sidebar-sections:v1:`,s={channels:!0,directMessages:!0,people:!0},c=A(ie({...s}));function l(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 m(e){if(!e)return{...s};try{let t=window.localStorage.getItem(`${a}${e}`);if(!t)return{...s};let n=JSON.parse(t);return l(n)?n:{...s}}catch{return{...s}}}function h(e){if(M(c,{...u(c),[e]:!u(c)[e]},!0),r.workspaceID)try{window.localStorage.setItem(`${a}${r.workspaceID}`,JSON.stringify(u(c)))}catch{}}C(()=>{M(c,m(r.workspaceID),!0)});let g=1e6,y=A(ie([]));function b(e,t){return`clickclack:sidebar-channel-order:v1:${t}:${e}`}function x(e){if(!e||e.length>g)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 T(e,t){if(!e||!t)return[];try{return x(window.localStorage.getItem(b(e,t)))}catch{return[]}}function O(e){if(M(y,e,!0),!(!r.workspaceID||!r.currentUser?.id))try{let t=b(r.workspaceID,r.currentUser.id),n=JSON.stringify(e);if(n.length>g){window.localStorage.removeItem(t);return}window.localStorage.setItem(t,n)}catch{}}function j(e){!r.workspaceID||!r.currentUser?.id||e.key===b(r.workspaceID,r.currentUser.id)&&M(y,x(e.newValue),!0)}let F=W(()=>{let e=new Map(r.channels.map(e=>[e.id,e]));return[...u(y).flatMap(t=>{let n=e.get(t);return n?(e.delete(t),[n]):[]}),...e.values()]});C(()=>{M(y,T(r.workspaceID,r.currentUser?.id||``),!0)});function ee(e){return e.button===0&&!e.metaKey&&!e.ctrlKey&&!e.shiftKey&&!e.altKey}var R=mi();v(`storage`,E,j);var z=L(R),te=e=>{var i=ui(),a=L(i),o=L(a),s=e=>{var t=ci();N(e=>B(t,`src`,e),[()=>_e(r.workspaceIconURL)]),p(e,t)};P(o,e=>{r.workspaceIconURL&&e(s)});var c=k(o,2),l=L(c),u=L(l),f=D(u,!0);I(2),t(l);var m=k(l,2),h=e=>{var t=li();p(e,t)};P(m,e=>{r.connected||e(h)}),t(c),t(a);var g=k(a,2),_=L(g),v=L(_),y=D(v);t(_),t(g),t(i),N(()=>{d(f,r.workspaceName||`Pick a workspace`),B(_,`aria-label`,r.sidebarCollapsed?`Expand sidebar`:`Collapse sidebar`),B(_,`title`,r.sidebarCollapsed?`Expand sidebar`:`Collapse sidebar`),B(y,`d`,r.sidebarCollapsed?`m9 6 6 6-6 6`:`m15 6-6 6 6 6`)}),n(`click`,a,function(...e){r.onOpenWorkspaceSettings?.apply(this,e)}),n(`click`,_,function(...e){r.onToggleCollapse?.apply(this,e)}),p(e,i)};P(z,e=>{i()&&e(te)});var ne=k(z,2),re=L(ne);$r(re,{get workspaceID(){return r.workspaceID},get expanded(){return u(c).channels},get channels(){return u(F)},get selectedChannelID(){return r.selectedChannelID},get selectedDirectID(){return r.selectedDirectID},get hrefForChannel(){return r.hrefForChannel},get onSelectChannel(){return r.onSelectChannel},get onCreateChannel(){return r.onCreateChannel},onToggle:()=>h(`channels`),onReorder:O});var ae=k(re,2);{let e=W(()=>r.currentUser?.id);si(ae,{get expanded(){return u(c).directMessages},get conversations(){return r.directConversations},get currentUserID(){return u(e)},get selectedDirectID(){return r.selectedDirectID},get hrefForDirect(){return r.hrefForDirect},get onSelectDirect(){return r.onSelectDirect},get onCreateDirect(){return r.onCreateDirect},get onHideDirect(){return r.onHideDirect},get hiddenDirectTitle(){return r.hiddenDirectTitle},get onUndoHideDirect(){return r.onUndoHideDirect},onToggle:()=>h(`directMessages`)})}var oe=k(ae,2);let V;var H=L(oe),se=D(H),ce=k(H,2),U=L(ce);f(U,17,()=>r.recentPeople,e=>e.id,(e,i)=>{let a=W(()=>st(r.directConversations,u(i).id,r.currentUser?.id));var o=di();let s;var c=L(o);ut(c,{class:`dm-avatar`,get id(){return u(i).id},get name(){return u(i).display_name},get src(){return u(i).avatar_url},size:22});var l=k(c,2),f=D(l,!0);I(2),t(o),N(e=>{B(o,`href`,e),s=w(o,1,`nav-item dm`,null,s,{active:u(a)?.id===r.selectedDirectID||r.selectedProfile?.id===u(i).id}),d(f,u(i).display_name)},[()=>u(a)?r.hrefForDirect(u(a).id):`#`]),n(`click`,o,e=>{if(u(a)){if(!ee(e))return;e.preventDefault(),r.onSelectDirect(u(a).id)}else e.preventDefault(),r.onOpenProfile(u(i))}),p(e,o)});var le=k(U,2),ue=e=>{var t=fi();p(e,t)};P(le,e=>{r.recentPeople.length===0&&e(ue)}),t(ce),t(oe),t(ne);var de=k(ne,2),fe=e=>{var i=pi(),a=L(i);ut(a,{class:`dm-avatar`,get id(){return r.currentUser.id},get name(){return r.currentUser.display_name},get src(){return r.currentUser.avatar_url},size:28,loading:`eager`,fetchPriority:`auto`});var o=k(a,2),s=L(o),c=D(s,!0),l=k(s,2),u=D(l,!0);t(o),I(2),t(i),N((e,t)=>{B(i,`aria-label`,e),d(c,r.currentUser.display_name),d(u,t)},[()=>`Account settings for ${r.currentUser.display_name} ${ot(r.currentUser.handle)}`,()=>r.currentUser.handle?ot(r.currentUser.handle):r.connected?`Active`:`Reconnectingโ€ฆ`]),n(`click`,i,function(...e){r.onOpenSettings?.apply(this,e)}),n(`contextmenu`,i,e=>{e.preventDefault(),r.onOpenSettings()}),p(e,i)};P(de,e=>{r.currentUser&&e(fe)}),t(R),N(()=>{V=w(oe,1,`nav-section`,null,V,{collapsed:!u(c).people}),B(se,`aria-expanded`,u(c).people),B(ce,`hidden`,!u(c).people)}),n(`click`,se,()=>h(`people`)),p(e,R),_()}ue([`click`,`contextmenu`]);var gi=l(`
Loading...
`),_i=l(`
`),vi=l(`
`),yi=l(`

No pinned messages

Pin important messages to keep them easily accessible.

`),bi=l(`
`),xi=l(`
`),Si=l(`
`),Ci=l(` `,1),wi=l(`

Pinned Messages

`);function Ti(e,r){o(r,!0);let a=S(r,`loading`,3,!1),s=S(r,`error`,3,``),c=S(r,`topics`,19,()=>[]),l=S(r,`mentionPeople`,19,()=>[]),m=S(r,`maxPins`,3,100),g=A(ie(new Set)),v=A(``);async function y(e){if(!u(g).has(e.id)){M(g,new Set(u(g)).add(e.id),!0),M(v,``);try{await r.onUnpin(e)}catch(e){M(v,e instanceof Error?e.message:`Could not unpin message`,!0)}finally{let t=new Set(u(g));t.delete(e.id),M(g,t,!0)}}}var b=wi(),x=L(b),C=L(x),w=L(C),T=k(L(w),2),E=D(T);t(w);var O=k(w,2),j=D(O);t(C);var F=k(C,2);t(x);var ee=k(x,2),I=L(ee),R=e=>{var t=gi();p(e,t)},z=e=>{var t=_i(),n=D(t,!0);N(()=>d(n,s())),p(e,t)},te=e=>{var a=Ci(),o=se(a),s=e=>{var t=vi(),n=D(t,!0);N(()=>d(n,u(v))),p(e,t)};P(o,e=>{u(v)&&e(s)});var m=k(o,2),_=e=>{var t=yi();p(e,t)},b=e=>{var a=Si();f(a,21,()=>r.messages,e=>e.id,(e,a)=>{let o=W(()=>c().find(e=>e.id===u(a).topic_id));var s=xi(),m=L(s),_=L(m),v=D(_,!0),b=k(_,2),x=D(b,!0);t(m);var S=k(m,2);mt(S,{get topic(){return u(o)},get onSelect(){return r.onSelectTopic}});var C=k(S,2);i(C,()=>Qe(u(a).body),!0),t(C),h(C,e=>q?.(e)),h(C,(e,t)=>X?.(e,t),()=>({people:l(),attentionUserID:r.mentionAttentionUserID}));var w=k(C,2),T=e=>{var n=bi();f(n,21,()=>u(a).attachments,e=>e.id,(e,t)=>{{let n=W(()=>ze(u(t)));Y(e,{get upload(){return u(t)},get url(){return u(n)},get onOpenImage(){return r.onOpenImage},get onOpenArtifact(){return r.onOpenArtifact}})}}),t(n),p(e,n)};P(w,e=>{u(a).attachments?.length&&e(T)});var E=k(w,2),O=L(E),A=k(O,2);t(E),t(s),N((e,t)=>{B(s,`data-message-id`,u(a).id),d(v,u(a).author?.display_name||`Unknown`),d(x,e),A.disabled=t},[()=>J(u(a).created_at),()=>u(g).has(u(a).id)]),n(`click`,O,()=>r.onOpenThread(u(a))),n(`click`,A,()=>y(u(a))),p(e,s)}),t(a),p(e,a)};P(m,e=>{r.messages.length===0?e(_):e(b,-1)}),p(e,a)};P(I,e=>{a()?e(R):s()?e(z,1):e(te,-1)}),t(ee),t(b),N(()=>{d(E,`${r.messages.length??``} / ${m()??``} pinned`),d(j,`Shared across this channel, with a maximum of ${m()??``} messages.`)}),n(`click`,F,function(...e){r.onClose?.apply(this,e)}),p(e,b),_()}ue([`click`]);var Ei=l(` `,1),Di=l(`
`),Oi=l(`
We couldnโ€™t search messages

`),ki=l(`
No messages found

Try another word or phrase.

`),Ai=l(`deleted bot`),ji=l(` `),Mi=l(` `),Ni=l(` `),Pi=l(` Reply in thread`),Fi=l(` `),Ii=l(`
  • `),Li=l(``),Ri=l(``),zi=l(``),Bi=l(`
      `,1),Vi=l(``);function Hi(e,r){o(r,!0);let i=S(r,`covered`,3,!1),a=S(r,`inert`,3,!1),c=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 g(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=m(`Searching messagesโ€ฆ`);p(e,t)},R=e=>{var t=Ei(),n=se(t),i=k(n),a=e=>{var t=m();N(()=>d(t,`in ${r.session.scope.label??``}`)),p(e,t)};P(i,e=>{r.session.scope.label&&e(a)}),N(()=>d(n,`${r.session.results.length??``}${r.session.nextCursor?`+`:``} + ${r.session.results.length===1&&!r.session.nextCursor?`result`:`results`}`)),p(e,t)},z=e=>{var t=m(`Search unavailable`);p(e,t)};P(F,e=>{r.session.state===`loading`?e(I):r.session.state===`ready`?e(R,1):r.session.state===`error`&&e(z,2)}),t(M);var te=k(M,2),ne=L(te),re=e=>{var t=Di();p(e,t)},ie=e=>{var n=Oi(),i=k(L(n),4),a=D(i,!0);t(n),N(()=>d(a,r.session.error)),p(e,n)},ae=e=>{var t=ki();p(e,t)},oe=e=>{var i=Bi(),a=se(i);f(a,21,()=>r.session.results,e=>e.id,(e,i)=>{let a=W(()=>r.contextFor(u(i)));var o=Ii(),c=L(o);let l;var h=L(c);{let e=W(()=>dt(u(i).author)?void 0:u(i).author.avatar_url);ut(h,{class:`dm-avatar`,get id(){return u(i).author.id},get name(){return u(i).author.display_name},get src(){return u(e)},size:30})}var _=k(h,2),y=L(_),b=L(y),x=D(b,!0),S=k(b,2),C=e=>{var t=Ai();p(e,t)},T=W(()=>dt(u(i).author)),E=e=>{var t=ji(),n=D(t,!0);N(e=>d(n,e),[()=>ot(it(u(i).author))]),p(e,t)},O=W(()=>it(u(i).author));P(S,e=>{u(T)?e(C):u(O)&&e(E,1)});var A=k(S,2),j=D(A,!0);t(y);var M=k(y,2);f(M,21,()=>g(u(i).snippet,u(i).highlights),ee,(e,t)=>{var n=s(),r=se(n),i=e=>{var n=Mi(),r=D(n,!0);N(()=>d(r,u(t).text)),p(e,n)},a=e=>{var n=m();N(()=>d(n,u(t).text)),p(e,n)};P(r,e=>{u(t).highlighted?e(i):e(a,-1)}),p(e,n)}),t(M);var F=k(M,2),I=L(F),R=e=>{var t=Ni(),n=D(t,!0);N(()=>d(n,u(a))),p(e,t)};P(I,e=>{u(a)&&e(R)});var z=k(I,2),te=e=>{var t=Pi();p(e,t)},ne=e=>{var n=Fi(),r=k(L(n));t(n),N(()=>d(r,` ${u(i).reply_count??``} ${u(i).reply_count===1?`reply`:`replies`}`)),p(e,n)};P(z,e=>{u(i).parent_message_id?e(te):u(i).reply_count>0&&e(ne,1)}),t(F),t(_),t(c),t(o),N(e=>{l=w(c,1,`search-result`,null,l,{"is-active":r.session.activeResultID===u(i).id}),B(c,`data-result-id`,u(i).id),d(x,u(i).author.display_name||`Local User`),B(A,`datetime`,u(i).created_at),d(j,e)},[()=>v(u(i).created_at)]),n(`click`,c,()=>r.onOpenResult(u(i))),p(e,o)}),t(a);var o=k(a,2),c=e=>{var i=Li(),a=L(i),o=D(a,!0),s=k(a,2);t(i),N(()=>d(o,r.session.moreError)),n(`click`,s,function(...e){r.onLoadMore?.apply(this,e)}),p(e,i)},l=e=>{var t=Ri(),i=D(t,!0);N(()=>{t.disabled=r.session.loadingMore,d(i,r.session.loadingMore?`Loading moreโ€ฆ`:`Load more results`)}),n(`click`,t,function(...e){r.onLoadMore?.apply(this,e)}),p(e,t)},h=e=>{var t=zi();p(e,t)};P(o,e=>{r.session.moreError?e(c):r.session.nextCursor?e(l,1):e(h,-1)}),p(e,i)};P(ne,e=>{r.session.state===`loading`?e(re):r.session.state===`error`?e(ie,1):r.session.results.length===0?e(ae,2):e(oe,-1)}),t(te),t(y),N(()=>{b=w(y,1,`search-results`,null,b,{covered:i()}),y.inert=a(),B(y,`aria-hidden`,i()?`true`:void 0),d(E,`Search${r.session.scope.label?` in ${r.session.scope.label}`:``}`),d(A,`Results for โ€œ${r.session.query??``}โ€`)}),n(`click`,j,function(...e){r.onClose?.apply(this,e)}),p(e,y),_()}ue([`click`]);var Ui=l(``),Wi=l(`
      `),Gi=l(`

      `,1),Ki=l(`
      `),qi=l(`
      Delete channel

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

      `),Ji=l(``);function Yi(e,r){o(r,!0);let i=S(r,`saving`,3,!1),a=S(r,`error`,3,``),s=S(r,`canDelete`,3,!1),c=A(!1),l=W(()=>!!r.channel.archived_at),f=W(()=>`#${_t(r.channel)}`);function m(){i()||r.onClose()}var h=Ji(),g=L(h),v=k(g,2),y=L(v),b=k(L(y),2);t(y);var x=k(y,2),C=L(x),w=L(C),T=D(w,!0);I(2),t(C);var E=k(C,2),O=e=>{var t=Ui(),n=D(t,!0);N(()=>d(n,a())),p(e,t)};P(E,e=>{a()&&e(O)});var j=k(E,2),F=e=>{var a=Wi(),o=L(a),s=k(o,2),c=D(s,!0);t(a),N(()=>{o.disabled=i(),s.disabled=i(),d(c,i()?`Restoring...`:`Restore channel`)}),n(`click`,o,m),n(`click`,s,()=>r.onArchivedChange(!1)),p(e,a)},ee=e=>{var a=Gi(),o=se(a),s=D(o),l=k(o,2),m=L(l),h=k(m,2),g=D(h,!0);t(l),N(()=>{d(s,`Archive ${u(f)??``}? The channel will remain available to workspace members under Archived.`),m.disabled=i(),h.disabled=i(),d(g,i()?`Archiving...`:`Archive channel`)}),n(`click`,m,()=>M(c,!1)),n(`click`,h,()=>r.onArchivedChange(!0)),p(e,a)},R=e=>{var r=Ki(),a=L(r),o=k(a,2);t(r),N(()=>{a.disabled=i(),o.disabled=i()}),n(`click`,a,m),n(`click`,o,()=>M(c,!0)),p(e,r)};P(j,e=>{u(l)?e(F):u(c)?e(ee,1):e(R,-1)});var z=k(j,2),te=e=>{var a=qi(),o=k(L(a),2),s=D(o);t(a),N(()=>s.disabled=i()),n(`click`,s,function(...e){r.onDelete?.apply(this,e)}),p(e,a)};P(z,e=>{s()&&r.onDelete&&e(te)}),t(x),t(v),t(h),N(()=>{g.disabled=i(),b.disabled=i(),d(T,u(f))}),n(`click`,g,m),n(`click`,b,m),p(e,h),_()}ue([`click`]);function Xi(e,t){return e.trim()===t.name}function Zi(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 Qi(e,t,n=!1){return n?`Deleted #${e}.`:t?`#${e} was deleted by ${t}.`:`#${e} was deleted.`}var $i=l(`

      Checking what will be deleted...

      `),ea=l(`
    • An external application manages this channel and may create it again.
    • `),ta=l(``),na=l(``),ra=l(`
      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),ia=l(``),aa=l(``);function oa(e,r){o(r,!0);let i=S(r,`loading`,3,!1),a=S(r,`deleting`,3,!1),s=S(r,`error`,3,``),c=A(``),l=W(()=>`#${_t(r.channel)}`),f=W(()=>r.preview?Zi(r.preview):``),m=W(()=>!!r.preview&&!u(f)&&!i()&&!a()&&Xi(u(c),r.channel)),h=new Intl.NumberFormat;function g(){a()||r.onClose()}function y(e){e.preventDefault(),u(m)&&r.onConfirm()}var b=aa(),x=L(b),C=k(x,2),w=L(C),T=L(w),E=k(L(T),2),j=D(E);t(T);var F=k(T,2);t(w);var ee=k(w,2),R=k(L(ee),2),z=e=>{var t=$i();p(e,t)},te=e=>{var n=ra(),i=se(n),o=L(i),s=k(L(o)),l=D(s,!0);t(o);var m=k(o,2),g=k(L(m)),_=D(g,!0);t(m);var v=k(m,2),y=k(L(v)),b=D(y,!0);t(v);var x=k(v,2),S=k(L(x)),C=D(S,!0);t(x),t(i);var w=k(i,2),T=k(L(w),4),E=e=>{var t=ea();p(e,t)};P(T,e=>{r.channel.external_managed&&e(E)}),t(w);var A=k(w,2),j=e=>{var t=ta(),n=D(t,!0);N(()=>d(n,u(f))),p(e,t)},F=e=>{var n=na(),i=L(n),o=k(L(i)),s=D(o,!0);I(),t(i);var l=k(i,2);O(l),t(n),N(()=>{d(s,r.channel.name),l.disabled=a()}),H(l,()=>u(c),e=>M(c,e)),p(e,n)};P(A,e=>{u(f)?e(j):e(F,-1)}),N((e,t,n,r)=>{d(l,e),d(_,t),d(b,n),d(C,r)},[()=>h.format(r.preview.counts.messages),()=>h.format(r.preview.counts.thread_replies),()=>h.format(r.preview.counts.files),()=>We(r.preview.counts.file_bytes)]),p(e,n)};P(R,e=>{i()?e(z):r.preview&&e(te,1)});var ne=k(R,2),re=e=>{var t=ta(),n=D(t,!0);N(()=>d(n,s())),p(e,t)};P(ne,e=>{s()&&e(re)});var B=k(ne,2),ie=L(B),ae=e=>{var t=ia();N(()=>t.disabled=a()),n(`click`,t,function(...e){r.onArchive?.apply(this,e)}),p(e,t)};P(ie,e=>{r.channel.archived_at||e(ae)});var oe=k(ie,2),V=k(oe,2),ce=D(V,!0);t(B),t(ee),t(C),t(b),N(()=>{x.disabled=a(),d(j,`Delete ${u(l)??``}?`),F.disabled=a(),oe.disabled=a(),V.disabled=!u(m),d(ce,a()?`Deleting...`:`Delete channel`)}),n(`click`,x,g),n(`click`,F,g),v(`submit`,ee,y),n(`click`,oe,g),p(e,b),_()}ue([`click`]);var sa=l(`

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

      Browser notifications are not supported on this device.

      `),fa=l(`

      Browser notifications are blocked by this browser.

      `),pa=l(`

      `),ma=l(`

      Show alerts when ClickClack is in the background.

      `);function ha(e,r){o(r,!0);let i=S(r,`isDesktop`,3,!1),a=A(!1),s=A(!1),c=A(`default`),l=A(``),f=A(!1);C(()=>{m(r.user.id,i())});function m(e,t){if(t){M(a,!0),M(c,`granted`),M(s,Nt(e),!0),r.onChanged?.(u(s));return}M(a,typeof Notification<`u`),M(c,u(a)?Notification.permission:`unsupported`,!0);let n=Nt(e);M(s,u(c)===`granted`&&n,!0),n&&u(c)!==`granted`&&Pt(e,!1),r.onChanged?.(u(s))}async function h(e){if(M(l,``),M(f,!1),!e){Pt(r.user.id,!1),M(s,!1),r.onChanged?.(!1),M(l,i()?`Desktop notifications disabled`:`Browser notifications disabled`,!0);return}if(i()){M(s,Pt(r.user.id,!0),!0),r.onChanged?.(u(s)),M(l,u(s)?`Desktop notifications enabled`:`Desktop notification preference could not be saved`,!0),M(f,!u(s));return}if(typeof Notification>`u`){M(a,!1),M(c,`unsupported`),M(s,!1),r.onChanged?.(!1),M(l,`Browser notifications are not supported`),M(f,!0);return}if(M(c,Notification.permission==="default"?await Notification.requestPermission():Notification.permission,!0),M(a,!0),u(c)===`granted`){M(s,Pt(r.user.id,!0),!0),r.onChanged?.(u(s)),M(l,u(s)?`Browser notifications enabled`:`Browser notification preference could not be saved`,!0),M(f,!u(s));return}Pt(r.user.id,!1),M(s,!1),r.onChanged?.(!1),M(l,u(c)===`denied`?`Browser notifications are blocked by this browser`:`Browser notifications were not enabled`,!0),M(f,!0)}var g=ma(),v=L(g),y=L(v),b=D(y,!0),x=k(y,4),T=e=>{var t=da();p(e,t)},E=e=>{var t=fa();p(e,t)};P(x,e=>{!i()&&!u(a)?e(T):!i()&&u(c)===`denied`&&e(E,1)});var j=k(x,2),F=e=>{var t=pa();let n;var r=D(t,!0);N(()=>{n=w(t,1,`settings-row2__hint`,null,n,{"is-error":u(f)}),d(r,u(l))}),p(e,t)};P(j,e=>{u(l)&&e(F)}),t(v);var ee=k(v,2),I=L(ee);O(I),t(ee),t(g),N(()=>{d(b,i()?`Desktop notifications`:`Browser notifications`),B(I,`aria-label`,i()?`Desktop notifications`:`Browser notifications`),I.disabled=!u(a)||u(c)===`denied`,R(I,u(s))}),n(`change`,I,e=>void h(e.currentTarget.checked)),p(e,g),_()}ue([`change`]);var ga=l(``),_a=l(`
      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 va(e,r){o(r,!0);let i=S(r,`isDesktop`,3,!1),a=A(``),s=A(``),c=A(``),l=W(()=>u(a).trim()||r.user.display_name||`Your name`),f=W(()=>u(s).trim().replace(/^@+/,``)||r.user.handle||``);C(()=>{M(a,r.user.display_name,!0),M(s,r.user.handle??``,!0),M(c,r.user.avatar_url,!0)});function m(){M(c,``)}ua(e,{section:`profile`,get onUserUpdated(){return r.onUserUpdated},get onSaved(){return r.onSaved},payload:()=>({display_name:u(a),handle:u(s).trim().replace(/^@+/,``),avatar_url:u(c)}),children:(e,o)=>{var h=_a(),g=se(h),_=L(g);ut(_,{get id(){return r.user.id},get name(){return u(l)},get src(){return u(c)},size:52,loading:`eager`,fetchPriority:`auto`});var v=k(_,2),y=L(v),b=D(y,!0),S=k(y,2),C=D(S,!0);t(v),I(2),t(g);var w=k(g,2),T=L(w),E=k(L(T),2),A=L(E);O(A),t(E),t(T);var j=k(T,2),F=k(L(j),2),ee=L(F),z=k(L(ee),2);O(z),t(ee),t(F),t(j);var te=k(j,2),ne=k(L(te),2),re=L(ne);O(re);var B=k(re,2),ie=e=>{var t=ga();n(`click`,t,m),p(e,t)};P(B,e=>{u(c)&&e(ie)}),t(ne),t(te);var ae=k(te,4),oe=k(L(ae),2),V=L(oe);O(V),t(oe),t(ae);var U=k(ae,2),le=k(L(U),2),W=L(le);O(W),t(le),t(U);var ue=k(U,2),de=k(L(ue),2),fe=L(de),pe=L(fe);pe.value=pe.__value=`left`;var me=k(pe);me.value=me.__value=`right`,t(fe);var he;x(fe),t(de),t(ue);var ge=k(ue,2),_e=k(L(ge),2),ve=L(_e),G=L(ve);G.value=G.__value=`left`;var ye=k(G);ye.value=ye.__value=`right`,t(ve);var be;x(ve),t(_e),t(ge),ha(k(ge,4),{get user(){return r.user},get isDesktop(){return i()},get onChanged(){return r.onBrowserNotificationsChanged}}),t(w),N(()=>{d(b,u(l)),d(C,u(f)?`@${u(f)}`:`No handle set`),R(V,r.hideCommentary),R(W,r.hideToolCalls),he!==(he=r.userAlign)&&(fe.value=(fe.__value=he)??``,ce(fe,he)),be!==(be=r.otherAlign)&&(ve.value=(ve.__value=be)??``,ce(ve,be))}),H(A,()=>u(a),e=>M(a,e)),H(z,()=>u(s),e=>M(s,e)),H(re,()=>u(c),e=>M(c,e)),n(`change`,V,e=>r.onHideCommentary(e.currentTarget.checked)),n(`change`,W,e=>r.onHideToolCalls(e.currentTarget.checked)),n(`change`,fe,e=>r.onUserAlign(e.currentTarget.value===`right`?`right`:`left`)),n(`change`,ve,e=>r.onOtherAlign(e.currentTarget.value===`right`?`right`:`left`)),p(e,h)},$$slots:{default:!0}}),_()}ue([`click`,`change`]);var ya=l(`

      Desktop

      Mobile push

      Send push notifications to your phone via Pushover.

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

      `);function ba(e,n){o(n,!0);let r=S(n,`isDesktop`,3,!1),i=A(!1),a=A(``);C(()=>{M(i,n.user.notification_settings?.pushover_enabled??!1,!0),M(a,n.user.notification_settings?.pushover_user_key??``,!0)}),ua(e,{section:`notifications`,get onUserUpdated(){return n.onUserUpdated},payload:()=>({notification_settings:{pushover_enabled:u(i),pushover_user_key:u(a)}}),children:(e,o)=>{var s=ya(),c=k(L(s),2);ha(c,{get user(){return n.user},get isDesktop(){return r()},get onChanged(){return n.onBrowserNotificationsChanged}});var l=k(c,4),d=k(L(l),2),f=L(d);O(f),t(d),t(l);var m=k(l,2),h=k(L(m),2),g=L(h);O(g),t(h),t(m),t(s),T(f,()=>u(i),e=>M(i,e)),H(g,()=>u(a),e=>M(a,e)),p(e,s)},$$slots:{default:!0}}),_()}var xa=l(`

      Loadingโ€ฆ

      `),Sa=l(`

      `),Ca=l(`
      You don't own any bots yet. Open a workspace's Bots & agents page to mint one.
      `),wa=l(``),Ta=l(`
    • `),Ea=l(`

        `),Da=l(`
        `),Oa=l(`

        Account

        My bots

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

        `,1);function ka(e,r){o(r,!0);let i=A(ie([])),a=A(`loading`),s=A(``);ae(()=>{c()});async function c(){M(a,`loading`);try{M(i,await xt(),!0),M(a,`ready`)}catch(e){M(a,`error`),M(s,St(e),!0)}}function l(e){r.onClose(),fe(Fe(e.workspace.route_id||e.workspace.id,`bots`))}function h(e){return e.startsWith(`@`)?e:`@${e}`}function g(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 v=W(()=>{let e=new Map;for(let t of u(i)){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=Oa(),b=k(se(y),2),x=e=>{var t=xa();p(e,t)},S=e=>{var t=Sa(),n=D(t,!0);N(()=>d(n,u(s))),p(e,t)},C=e=>{var t=Ca();p(e,t)},w=e=>{var r=Da();f(r,21,()=>u(v),e=>e.workspace.id,(e,r)=>{var i=Ea(),a=L(i),o=L(a),s=D(o,!0),c=k(o,2);t(a);var _=k(a,2);f(_,21,()=>u(r).entries,e=>e.bot.id,(e,r)=>{var i=Ta(),a=L(i),o=L(a),s=e=>{var t=wa();N(()=>B(t,`src`,u(r).bot.avatar_url)),p(e,t)},c=e=>{var t=m();N(e=>d(t,e),[()=>g(u(r).bot.display_name||u(r).bot.handle||`?`)]),p(e,t)};P(o,e=>{u(r).bot.avatar_url?e(s):e(c,-1)}),t(a);var f=k(a,2),_=L(f),v=D(_,!0),y=k(_,2),b=L(y),x=D(b,!0),S=k(b,4),C=D(S);t(y),t(f);var w=k(f,2);t(i),N(e=>{d(v,u(r).bot.display_name||u(r).bot.handle),d(x,e),d(C,`${u(r).active_token_count??``} + active ${u(r).active_token_count===1?`token`:`tokens`}`)},[()=>h(u(r).bot.handle)]),n(`click`,w,()=>l(u(r))),p(e,i)}),t(_),t(i),N(()=>d(s,u(r).workspace.name)),n(`click`,c,()=>l(u(r).entries[0])),p(e,i)}),t(r),p(e,r)};P(b,e=>{u(a)===`loading`?e(x):u(a)===`error`?e(S,1):u(i).length===0?e(C,2):e(w,-1)}),p(e,y),_()}ue([`click`]);function Aa(e,t){return t.includes(`password`)&&e.password_enrolled===!0}function ja(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 Ma=l(`

        `),Na=l(``),Pa=l(`
        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 Fa(e,n){o(n,!0);let r=A(``),i=A(``),a=A(``),s=A(``),c=A(!1),l=A(!1);async function f(){if(u(l))return;let e=ja(u(r),u(i),u(a));if(e){M(s,e,!0),M(c,!0);return}M(l,!0),M(s,``),M(c,!1);try{await G(`/api/auth/password/change`,{method:`POST`,body:JSON.stringify({current_password:u(r),new_password:u(i)})}),M(r,``),M(i,``),M(a,``),M(s,`Password updated. Your other devices were signed out.`)}catch(e){M(s,xe(e,`Could not change your password`),!0),M(c,!0)}finally{M(l,!1)}}var m=Pa(),h=k(L(m),2),g=L(h),y=k(L(g),2),b=L(y);O(b),t(y),t(g);var x=k(g,2),S=k(L(x),2),C=L(S);O(C),t(S),t(x);var T=k(x,2),E=k(L(T),2),j=L(E);O(j),t(E),t(T),t(h);var F=k(h,2),ee=L(F),I=e=>{var t=Ma();let n;var r=D(t,!0);N(()=>{n=w(t,1,`settings-status`,null,n,{"is-error":u(c)}),d(r,u(s))}),p(e,t)},R=e=>{var t=Na();p(e,t)};P(ee,e=>{u(s)?e(I):e(R,-1)});var z=k(ee,2),te=D(z,!0);t(F),t(m),N(()=>{z.disabled=u(l),d(te,u(l)?`Updating...`:`Update password`)}),v(`submit`,m,e=>{e.preventDefault(),f()}),H(b,()=>u(r),e=>M(r,e)),H(C,()=>u(i),e=>M(i,e)),H(j,()=>u(a),e=>M(a,e)),p(e,m),_()}var Ia=l(``),La=l(``),Ra=l(`

        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 za(e,r){o(r,!0);let i=W(()=>r.user.display_name||r.user.handle||`You`),a=W(()=>(u(i)[0]??`Y`).toUpperCase()),s=A(ie(Se())),c=A(ie(Me())),l=A(ie(Pe())),m=A(ie(De()));C(()=>{r.user.appearance_preferences,M(s,Se(),!0),M(c,Me(),!0),M(l,Pe(),!0),M(m,De(),!0)});function h(e){M(s,e,!0),Ae(e)}function g(e){M(c,e,!0),we(e)}function v(e){M(l,e,!0),Te(e)}function y(e){M(m,e,!0),Oe(e)}function b(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 x=Ra(),S=k(se(x),2),T=L(S),E=k(L(T),2),O=L(E),j=L(O),P=D(j,!0),F=k(j,2),ee=L(F),R=L(ee),z=D(R,!0);I(2),t(ee),I(2),t(F),t(O);var te=k(O,4),ne=L(te),re=D(ne,!0),ae=k(ne,2),oe=L(ae),V=L(oe),H=D(V,!0);I(2),t(oe),I(2),t(ae),t(te),t(E),t(T);var ce=k(T,4),U=L(ce),le=k(L(U),2);f(le,23,()=>ke,e=>e.id,(e,t,r)=>{var i=Ia();let a;var o=D(i,!0);N(()=>{a=w(i,1,`appearance-seg__btn`,null,a,{"is-active":u(s)===u(t).id}),B(i,`aria-checked`,u(s)===u(t).id),B(i,`tabindex`,u(s)===u(t).id?0:-1),d(o,u(t).label)}),n(`click`,i,()=>h(u(t).id)),n(`keydown`,i,e=>b(e,ke.length,u(r),e=>h(ke[e].id))),p(e,i)}),t(le),t(U);var ue=k(U,2),de=k(L(ue),2),fe=L(de),pe=D(fe,!0),me=k(fe,2);f(me,23,()=>Ne,e=>e.id,(e,t,r)=>{var i=La();let a;N(()=>{a=w(i,1,`board-chip`,null,a,{"is-active":u(c)===u(t).id}),B(i,`aria-checked`,u(c)===u(t).id),B(i,`tabindex`,u(c)===u(t).id?0:-1),B(i,`data-board`,u(t).id),B(i,`aria-label`,`${u(t).label} โ€” ${u(t).blurb}`),B(i,`title`,`${u(t).label} โ€” ${u(t).blurb}`)}),n(`click`,i,()=>g(u(t).id)),n(`keydown`,i,e=>b(e,Ne.length,u(r),e=>g(Ne[e].id))),p(e,i)}),t(me),t(de),t(ue);var he=k(ue,2),ge=k(L(he),2);f(ge,23,()=>Ee,e=>e.id,(e,t,r)=>{var i=Ia();let a;var o=D(i,!0);N(()=>{a=w(i,1,`appearance-seg__btn`,null,a,{"is-active":u(l)===u(t).id}),B(i,`aria-checked`,u(l)===u(t).id),B(i,`tabindex`,u(l)===u(t).id?0:-1),B(i,`title`,u(t).blurb),d(o,u(t).label)}),n(`click`,i,()=>v(u(t).id)),n(`keydown`,i,e=>b(e,Ee.length,u(r),e=>v(Ee[e].id))),p(e,i)}),t(ge),t(he);var _e=k(he,2),ve=k(L(_e),2);f(ve,23,()=>je,e=>e.id,(e,t,r)=>{var i=Ia();let a;var o=D(i,!0);N(()=>{a=w(i,1,`appearance-seg__btn`,null,a,{"is-active":u(m)===u(t).id}),B(i,`aria-checked`,u(m)===u(t).id),B(i,`tabindex`,u(m)===u(t).id?0:-1),B(i,`title`,u(t).blurb),d(o,u(t).label)}),n(`click`,i,()=>y(u(t).id)),n(`keydown`,i,e=>b(e,je.length,u(r),e=>y(je[e].id))),p(e,i)}),t(ve),t(_e),t(ce),t(S),N(e=>{B(T,`data-layout`,u(l)),B(T,`data-density`,u(m)),d(P,u(a)),d(z,u(i)),d(re,u(a)),d(H,u(i)),d(pe,e)},[()=>Ne.find(e=>e.id===u(c))?.label]),p(e,x),_()}ue([`click`,`keydown`]);var Ba=l(` `,1),Va=l(` `,1),Ha=l(` `,1),Ua=l(` `,1),Wa=l(`
      • `),Ga=l(`
      • `),$=l(`

          `),Ka=l(`

          Loading...

          `),qa=l(`

          `),Ja=l(`

          `),Ya=l(`

          Account

          Profile settings

          How you appear across ClickClack.

          Sign out

          End this session on this device.

          `,1),Xa=l(`

          Account

          Notifications

          Decide when and how ClickClack should reach you.

          `,1),Za=l(``);function Qa(e,r){o(r,!0);let i=S(r,`workspaces`,19,()=>[]),a=S(r,`initialSection`,3,K),c=S(r,`isDesktop`,3,!1),l=A(!1),m=A(``),h=A(ie(K)),g=W(()=>Aa(r.user,ge())),y=A(`loading`),b=A(``);C(()=>{M(h,a(),!0)}),C(()=>{u(h);let e=new AbortController;return T(e.signal),()=>e.abort()});async function x(){if(!u(l)){M(l,!0),M(m,``);try{await G(`/api/auth/logout`,{method:`POST`,body:JSON.stringify({})}),window.location.reload()}catch(e){M(m,xe(e,`Could not sign out. Try again.`),!0),M(l,!1)}}}async function T(e){M(y,`loading`),M(b,``);try{let t=await Ce({signal:e});e.throwIfAborted(),r.onUserUpdated(t.user),M(y,`ready`)}catch(t){if(e.aborted)return;if(t instanceof be&&(t.status===401||t.status===403)){M(y,`error`),M(b,`Sign in to manage your account`);return}M(y,`error`),M(b,t instanceof Error?t.message:`Could not load your account`,!0)}}function O(e){e.target===e.currentTarget&&r.onClose()}function j(e){if(e.key!==`Escape`)return;let t=e.target;t&&(t.tagName===`INPUT`||t.tagName===`TEXTAREA`||t.isContentEditable)||(e.preventDefault(),r.onClose())}function F(e,t){r.onClose(),fe(Fe(e.route_id||e.id,t))}var ee=Za();v(`keydown`,E,j);var I=L(ee),R=L(I),z=k(R,2),te=L(z),ne=k(L(te),2);f(ne,21,()=>Le,e=>e.id,(e,i)=>{var a=Wa(),o=L(a);let s;var c=L(o),l=e=>{var t=Ba(),n=se(t);ut(n,{class:`settings-modal__rail-avatar`,get id(){return r.user.id},get name(){return r.user.display_name},get src(){return r.user.avatar_url},size:18});var a=k(n,2),o=D(a,!0);N(()=>d(o,r.user.display_name||u(i).label)),p(e,t)},f=e=>{var t=Va(),n=k(se(t),2),r=D(n,!0);N(()=>d(r,u(i).label)),p(e,t)},m=e=>{var t=Ha(),n=k(se(t),2),r=D(n,!0);N(()=>d(r,u(i).label)),p(e,t)},g=e=>{var t=Ua(),n=k(se(t),2),r=D(n,!0);N(()=>d(r,u(i).label)),p(e,t)};P(c,e=>{u(i).id===`profile`?e(l):u(i).id===`appearance`?e(f,1):u(i).id===`notifications`?e(m,2):u(i).id===`bots`&&e(g,3)}),t(o),t(a),N(()=>{s=w(o,1,`settings-modal__rail-item`,null,s,{"is-active":u(h)===u(i).id}),B(o,`aria-current`,u(h)===u(i).id?`page`:void 0)}),n(`click`,o,()=>M(h,u(i).id,!0)),p(e,a)}),t(ne),t(te);var re=k(te,2);f(re,17,i,e=>e.id,(e,r)=>{var i=$(),a=L(i),o=D(a),c=k(a,2);f(c,21,()=>Ie,e=>e.id,(e,i)=>{var a=s(),o=se(a),c=e=>{var a=Ga(),o=L(a),s=k(L(o),2),c=D(s,!0);t(o),t(a),N(()=>d(c,u(i).label)),n(`click`,o,()=>F(u(r),u(i).slug)),p(e,a)},l=W(()=>!u(i).managersOnly||Re(u(r).role));P(o,e=>{u(l)&&e(c)}),p(e,a)}),t(c),t(i),N(()=>{B(a,`title`,u(r).name),d(o,`Workspace ยท ${u(r).name??``}`)}),p(e,i)}),t(z);var ae=k(z,2),oe=L(ae),V=e=>{var t=Ka();p(e,t)},H=e=>{var t=qa(),n=D(t,!0);N(()=>d(n,u(b))),p(e,t)},ce=e=>{var i=Ya(),a=k(se(i),2);va(a,{get user(){return r.user},get hideCommentary(){return r.hideCommentary},get hideToolCalls(){return r.hideToolCalls},get userAlign(){return r.userAlign},get otherAlign(){return r.otherAlign},get isDesktop(){return c()},get onUserUpdated(){return r.onUserUpdated},get onSaved(){return r.onClose},get onHideCommentary(){return r.onHideCommentary},get onHideToolCalls(){return r.onHideToolCalls},get onUserAlign(){return r.onUserAlign},get onOtherAlign(){return r.onOtherAlign},get onBrowserNotificationsChanged(){return r.onBrowserNotificationsChanged}});var o=k(a,2),s=e=>{Fa(e,{})};P(o,e=>{u(g)&&e(s)});var f=k(o,2),h=L(f),_=k(L(h),4),v=e=>{var t=Ja(),n=D(t,!0);N(()=>d(n,u(m))),p(e,t)};P(_,e=>{u(m)&&e(v)}),t(h);var y=k(h,2),b=L(y),S=D(b,!0);t(y),t(f),N(()=>{b.disabled=u(l),d(S,u(l)?`Signing out...`:`Sign out`)}),n(`click`,b,x),p(e,i)},U=e=>{za(e,{get user(){return r.user}})},le=e=>{var t=Xa();ba(k(se(t),2),{get user(){return r.user},get isDesktop(){return c()},get onUserUpdated(){return r.onUserUpdated},get onBrowserNotificationsChanged(){return r.onBrowserNotificationsChanged}}),p(e,t)},ue=e=>{ka(e,{get onClose(){return r.onClose}})};P(oe,e=>{u(y)===`loading`?e(V):u(y)===`error`?e(H,1):u(h)===`profile`?e(ce,2):u(h)===`appearance`?e(U,3):u(h)===`notifications`?e(le,4):u(h)===`bots`&&e(ue,5)}),t(ae),t(I),t(ee),n(`click`,ee,O),n(`click`,R,function(...e){r.onClose?.apply(this,e)}),p(e,ee),_()}ue([`click`]);var $a=l(`
          No thread open Hover any message and tap the bubble to keep side conversations tidy.
          `);function eo(e){var t=$a();p(e,t)}var to=l(``),no=l(`

          `,1),ro=l(``),io=l(``),ao=l(``),oo=l(``),so=l(``),co=l(``),lo=l(``),uo=l(`
          `),fo=l(`Connectingโ€ฆ`),po=l(`
          `);function mo(e,r){o(r,!0);function i(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=S(r,`channelNotifPreference`,3,void 0),s=S(r,`channelNotifSaving`,3,!1),c=S(r,`channelSettingsAvailable`,3,!1),l=S(r,`pinsAvailable`,3,!1),f=S(r,`pinnedOpen`,3,!1),m=S(r,`onOpenChannelSettings`,3,()=>{}),h=S(r,`onToggleChannelNotifications`,3,()=>{}),g=W(()=>gt(r.externalURL));var y=po(),b=L(y),x=L(b),C=L(x),T=L(C),E=k(L(T),2);t(T),t(C);var A=k(C,2),M=D(A,!0),F=k(A,2),ee=e=>{var t=no(),n=k(se(t),2),i=D(n,!0),a=k(n,2),o=e=>{var t=to();N(()=>B(t,`href`,u(g))),p(e,t)};P(a,e=>{u(g)&&e(o)}),N(()=>{B(n,`title`,r.channelTitle),d(i,r.channelTitle)}),p(e,t)};P(F,e=>{r.channelTitle&&e(ee)}),t(x);var R=k(x,2),z=k(L(R),2);O(z);var te=k(z,2),ne=e=>{var t=ro();n(`click`,t,function(...e){r.onResetSearch?.apply(this,e)}),p(e,t)};P(te,e=>{r.searchQuery&&e(ne)}),I(2),t(R);var re=k(R,2),ie=e=>{var o=uo(),u=L(o),d=e=>{var r=so(),o=L(r),c=e=>{var t=io();p(e,t)},l=e=>{var t=ao();p(e,t)},u=e=>{var t=oo();p(e,t)};P(o,e=>{a()===`muted`?e(c):a()===`mentions`?e(l,1):e(u,-1)}),t(r),N((e,t)=>{B(r,`title`,e),B(r,`aria-label`,t),B(r,`aria-busy`,s()),r.disabled=s()},[()=>i(a()),()=>i(a())]),n(`click`,r,function(...e){h()?.apply(this,e)}),p(e,r)};P(u,e=>{a()&&e(d)});var g=k(u,2),_=e=>{var t=co();let i;N(()=>{B(t,`title`,f()?`Close pinned items`:`Pinned items`),B(t,`aria-label`,f()?`Close pinned items`:`Pinned items`),i=w(t,1,``,null,i,{active:f()})}),n(`click`,t,function(...e){r.onPinnedItems?.apply(this,e)}),p(e,t)};P(g,e=>{l()&&e(_)});var v=k(g,2),y=e=>{var t=lo();n(`click`,t,function(...e){m()?.apply(this,e)}),p(e,t)};P(v,e=>{c()&&e(y)}),t(o),p(e,o)};P(re,e=>{(a()||l()||c())&&e(ie)});var ae=k(re,2),oe=e=>{var t=fo();p(e,t)};P(ae,e=>{r.connected||e(oe)}),t(b),t(y),N(()=>{B(y,`data-platform`,r.platform),B(C,`aria-label`,r.mobileNavigation?r.mobileNavOpen?`Close navigation`:`Open navigation`:r.sidebarCollapsed?`Expand sidebar`:`Collapse sidebar`),B(C,`title`,r.mobileNavigation?r.mobileNavOpen?`Close navigation`:`Open navigation`:r.sidebarCollapsed?`Expand sidebar`:`Collapse sidebar`),B(E,`d`,r.mobileNavigation?r.mobileNavOpen?`m15 9-3 3 3 3`:`m9 9 3 3-3 3`:r.sidebarCollapsed?`m13 9 3 3-3 3`:`m16 9-3 3 3 3`),d(M,r.workspaceName||`ClickClack`),j(z,r.searchQuery)}),n(`click`,C,function(...e){r.onToggleSidebar?.apply(this,e)}),n(`click`,A,function(...e){r.onOpenWorkspaceSettings?.apply(this,e)}),v(`submit`,R,e=>{e.preventDefault(),r.onSearch()}),n(`input`,z,e=>r.onSearchQuery(e.currentTarget.value)),p(e,y),_()}ue([`click`,`input`]);var ho=l(`

          `),go=l(``),_o=l(``),vo=l(``),yo=l(``),bo=l(`

          `,1),xo=l(`

          ClickClack

          `),So=l(``),Co=l(``),wo=l(``),To=l(``),Eo=l(`

          `);function Do(e,r){o(r,!0);function i(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=S(r,`pinnedOpen`,3,!1),s=S(r,`channelNotifPreference`,3,void 0),c=S(r,`channelNotifSaving`,3,!1),l=S(r,`channelSettingsAvailable`,3,!1),f=S(r,`onOpenChannelSettings`,3,()=>{}),m=S(r,`onToggleChannelNotifications`,3,()=>{}),h=W(()=>r.selectedDirect?void 0:gt(r.selectedChannel?.external_url));var g=Eo(),y=L(g),b=L(y),x=e=>{var t=ho(),n=D(t,!0);N(e=>d(n,e),[()=>`@${rt(r.selectedDirect,r.currentUserID)}`]),p(e,t)},C=e=>{var a=bo(),o=se(a),l=D(o,!0),u=k(o,2),f=e=>{var r=yo(),a=L(r),o=e=>{var t=go();p(e,t)},l=e=>{var t=_o();p(e,t)},u=e=>{var t=vo();p(e,t)};P(a,e=>{s()===`muted`?e(o):s()===`mentions`?e(l,1):e(u,-1)}),t(r),N((e,t)=>{B(r,`title`,e),B(r,`aria-label`,t),B(r,`aria-busy`,c()),r.disabled=c()},[()=>i(s()),()=>i(s())]),n(`click`,r,function(...e){m()?.apply(this,e)}),p(e,r)};P(u,e=>{s()&&e(f)}),N(e=>d(l,e),[()=>`#${_t(r.selectedChannel)}`]),p(e,a)},T=e=>{var t=xo();p(e,t)};P(b,e=>{r.selectedDirect?e(x):r.selectedChannel?e(C,1):e(T,-1)});var E=k(b,4),A=D(E,!0);t(y);var M=k(y,2),F=k(L(M),2);O(F);var ee=k(F,2),R=e=>{var t=So();n(`click`,t,function(...e){r.onResetSearch?.apply(this,e)}),p(e,t)};P(ee,e=>{r.searchQuery&&e(R)}),I(2),t(M);var z=k(M,2),te=L(z),ne=e=>{var t=Co();N(()=>B(t,`href`,u(h))),p(e,t)};P(te,e=>{u(h)&&e(ne)});var re=k(te,2);let ie;var ae=k(re,2),oe=e=>{var t=wo();let i;N(()=>{B(t,`title`,a()?`Close pinned items`:`Pinned items`),B(t,`aria-label`,a()?`Close pinned items`:`Pinned items`),i=w(t,1,``,null,i,{active:a()})}),n(`click`,t,function(...e){r.onPinnedItems?.apply(this,e)}),p(e,t)};P(ae,e=>{r.selectedChannel&&e(oe)});var V=k(ae,2),H=e=>{var t=To();n(`click`,t,function(...e){f()?.apply(this,e)}),p(e,t)};P(V,e=>{r.selectedChannel&&l()&&e(H)}),t(z),t(g),N(()=>{d(A,r.workspaceName||`no workspace`),j(F,r.searchQuery),B(re,`title`,r.threadOpen?`Close thread`:`Open a message thread`),B(re,`aria-label`,r.threadOpen?`Close thread`:`Open a message thread`),ie=w(re,1,``,null,ie,{active:r.threadOpen})}),v(`submit`,M,e=>{e.preventDefault(),r.onSearch()}),n(`input`,F,e=>r.onSearchQuery(e.currentTarget.value)),n(`click`,re,function(...e){r.onToggleThread?.apply(this,e)}),p(e,g),_()}ue([`click`,`input`]);function Oo(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 ko(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=Oo(a.userId,t,n);e&&i.push(e)}return i}async function Ao(e){return(await G(`/api/workspaces/${e}/bot-commands`)).bot_commands??[]}function jo(e){let t=e.trim().toLowerCase();return t?t.startsWith(`/`)?t:`/${t}`:``}function Mo(e){let t=/^(\/\S+)\s*([\s\S]*)$/.exec(e);return t?{command:jo(t[1]),text:t[2].trim()}:null}function No(e,t){return e.find(e=>!e.revoked_at&&jo(e.command)===t)}async function Po(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 Fo=e({default:()=>Xo}),Io=l(``),Lo=l(``),Ro=l(``),zo=l(`
          Showing topic
          `),Bo=l(`

          `),Vo=l(`
          `),Ho=l(``),Uo=l(``),Wo=l(``),Go=l(` `,1),Ko=l(`

          Loading threadโ€ฆ

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

          No GIFs found

          `),tt=i(``);function nt(r,i){n(i,!0);let l=x(void 0);ee(()=>a(l)?.focus());var u=tt(),f=O(u),p=b(O(f),2);y(p),te(p,e=>C(l,e),()=>a(l)),e(f);var m=b(f,2);s(m,21,()=>i.gifs,e=>e.url,(n,r)=>{var s=$e(),l=O(s),u=b(l,2),d=v(u,!0);e(s),w(()=>{A(l,`src`,a(r).url),A(l,`alt`,a(r).title),o(d,a(r).title)}),t(`click`,s,()=>i.onPick(a(r).url,a(r).title)),c(n,s)}),e(m);var h=b(m,2),g=e=>{var t=et();c(e,t)};T(h,e=>{i.gifs.length===0&&e(g)}),e(u),w(()=>S(p,i.query)),t(`keydown`,u,e=>{e.isComposing||e.keyCode===229||e.key===`Escape`&&(e.preventDefault(),i.onClose())}),t(`input`,p,e=>i.onQuery(e.currentTarget.value)),c(r,u),d()}N([`keydown`,`input`,`click`]);var rt=i(`
          Replying to
          `);function it(r,i){n(i,!0);var a=rt(),s=b(O(a),2),l=O(s),u=b(O(l)),f=v(u,!0);e(l);var p=b(l,2),m=v(p,!0);e(s);var h=b(s,2);e(a),w((e,t)=>{o(f,e),o(m,t)},[()=>se(i.target.author),()=>ge(i.target.body)]),t(`click`,h,function(...e){i.onClear?.apply(this,e)}),c(r,a),d()}N([`click`]);var at=i(` `),ot=i(``),st=i(`
          `),ct=i(``),lt=i(`
          `),ut=i(``),dt=i(`
          `);function ft(r,i){n(i,!0);let y=m(i,`formClass`,3,`composer`),E=m(i,`pendingUpload`,3,null),k=m(i,`replyTarget`,3,null),j=m(i,`showUpload`,3,!1),ee=m(i,`showToolbar`,3,!1),ne=m(i,`slashCommands`,19,()=>[]),ie=m(i,`botCommands`,19,()=>[]),N=m(i,`mentionPeople`,19,()=>[]),P=m(i,`disabled`,3,!1),F=m(i,`onUploadFile`,3,()=>{}),ae=m(i,`onRemoveUpload`,3,()=>{}),oe=m(i,`onClearReply`,3,()=>{}),I=x(null),se=x(0),ce=x(``),L=x(0),R=x(!1),z=x(``),de=M(()=>{let e=a(z).trim().toLowerCase();return Ze.filter(t=>!e||t.title.toLowerCase().includes(e)||t.tags.some(t=>t.includes(e)))}),B=M(()=>H(i.value,a(se))),V=M(()=>!a(B)||fe(a(B))===a(ce)?[]:a(B).kind===`slash`?he(a(B)):_e(a(B)));h(()=>(i.onInputRef(a(I)),()=>i.onInputRef(null))),h(()=>{if(a(V).length===0){C(L,0);return}a(L)>=a(V).length&&C(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=a(I)){C(se,e?.selectionStart??i.value.length,!0)}function me(e){return e.startsWith(`/`)?e:`/${e}`}function he(e){let t=e.query,n=ne().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=ie().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){a(B)&&ye(`${i.value.slice(0,a(B).start)}${e.insertText}${i.value.slice(a(B).end)}`,a(B).start+e.insertText.length)}async function ye(e,t=e.length,n=t){P()||(i.onValue(e),await p(),!P()&&(a(I)?.focus(),a(I)?.setSelectionRange(t,n),C(se,t,!0)))}function be(e,t=e,n=`text`){let r=a(I)?.selectionStart??i.value.length,o=a(I)?.selectionEnd??r,s=i.value.slice(r,o)||n;ye(`${i.value.slice(0,r)}${e}${s}${t}${i.value.slice(o)}`,r+e.length,r+e.length+s.length)}function xe(){a(R)&&(C(R,!1),C(z,``),a(I)?.focus())}function Se(e,t){let n=i.value&&!i.value.endsWith(` +import{At as e,B as t,Et as n,F as r,I as i,K as a,N as o,O as s,P as c,R as l,S as u,Tt as d,V as f,X as p,a as m,at as h,b as g,bt as _,dt as v,f as y,ft as b,gt as x,h as S,ht as C,it as w,j as T,k as E,kt as D,lt as O,n as k,p as A,pt as j,r as ee,s as te,ut as ne,x as re,y as ie,yt as M,z as N}from"./CxKeDCcw.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"./C7NZ0SeM.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=x(j(new Map));get sessions(){return a(this.#e)}set sessions(e){C(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=x(j(new Map));get entries(){return a(this.#e)}set entries(e){C(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=i(`
          `);function G(r,i){n(i,!0);let a=m(i,`disabled`,3,!1);var o=Qe(),s=O(o),l=b(s,2),u=b(l,2),f=O(u);f.textContent=`<>`,e(u);var p=b(u,2),h=O(p);h.textContent=`{}`,e(p);var _=b(p,2),v=b(_,2);let y;e(o),w(()=>{s.disabled=a(),l.disabled=a(),u.disabled=a(),p.disabled=a(),_.disabled=a(),A(v,`aria-expanded`,i.showGifPicker),v.disabled=a(),y=g(v,1,``,null,y,{active:i.showGifPicker})}),t(`click`,s,()=>i.onWrap(`**`)),t(`click`,l,()=>i.onWrap(`_`)),t(`click`,u,()=>i.onWrap("`")),t(`click`,p,()=>i.onWrap("\n```\n","\n```\n",`code`)),t(`click`,_,()=>i.onWrap(`[`,`](https://)`,`label`)),t(`click`,v,function(...e){i.onToggleGif?.apply(this,e)}),c(r,o),d()}N([`click`]);var $e=i(``),et=i(`

          No GIFs found

          `),tt=i(``);function nt(r,i){n(i,!0);let l=x(void 0);ee(()=>a(l)?.focus());var u=tt(),f=O(u),p=b(O(f),2);y(p),te(p,e=>C(l,e),()=>a(l)),e(f);var m=b(f,2);s(m,21,()=>i.gifs,e=>e.url,(n,r)=>{var s=$e(),l=O(s),u=b(l,2),d=v(u,!0);e(s),w(()=>{A(l,`src`,a(r).url),A(l,`alt`,a(r).title),o(d,a(r).title)}),t(`click`,s,()=>i.onPick(a(r).url,a(r).title)),c(n,s)}),e(m);var h=b(m,2),g=e=>{var t=et();c(e,t)};T(h,e=>{i.gifs.length===0&&e(g)}),e(u),w(()=>S(p,i.query)),t(`keydown`,u,e=>{e.isComposing||e.keyCode===229||e.key===`Escape`&&(e.preventDefault(),i.onClose())}),t(`input`,p,e=>i.onQuery(e.currentTarget.value)),c(r,u),d()}N([`keydown`,`input`,`click`]);var rt=i(`
          Replying to
          `);function it(r,i){n(i,!0);var a=rt(),s=b(O(a),2),l=O(s),u=b(O(l)),f=v(u,!0);e(l);var p=b(l,2),m=v(p,!0);e(s);var h=b(s,2);e(a),w((e,t)=>{o(f,e),o(m,t)},[()=>se(i.target.author),()=>ge(i.target.body)]),t(`click`,h,function(...e){i.onClear?.apply(this,e)}),c(r,a),d()}N([`click`]);var at=i(` `),ot=i(``),st=i(`
          `),ct=i(``),lt=i(`
          `),ut=i(``),dt=i(`
          `);function ft(r,i){n(i,!0);let y=m(i,`formClass`,3,`composer`),E=m(i,`pendingUpload`,3,null),k=m(i,`replyTarget`,3,null),j=m(i,`showUpload`,3,!1),ee=m(i,`showToolbar`,3,!1),ne=m(i,`slashCommands`,19,()=>[]),ie=m(i,`botCommands`,19,()=>[]),N=m(i,`mentionPeople`,19,()=>[]),P=m(i,`disabled`,3,!1),F=m(i,`onUploadFile`,3,()=>{}),ae=m(i,`onRemoveUpload`,3,()=>{}),oe=m(i,`onClearReply`,3,()=>{}),I=x(null),se=x(0),ce=x(``),L=x(0),R=x(!1),z=x(``),de=M(()=>{let e=a(z).trim().toLowerCase();return Ze.filter(t=>!e||t.title.toLowerCase().includes(e)||t.tags.some(t=>t.includes(e)))}),B=M(()=>H(i.value,a(se))),V=M(()=>!a(B)||fe(a(B))===a(ce)?[]:a(B).kind===`slash`?he(a(B)):_e(a(B)));h(()=>(i.onInputRef(a(I)),()=>i.onInputRef(null))),h(()=>{if(a(V).length===0){C(L,0);return}a(L)>=a(V).length&&C(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=a(I)){C(se,e?.selectionStart??i.value.length,!0)}function me(e){return e.startsWith(`/`)?e:`/${e}`}function he(e){let t=e.query,n=ne().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=ie().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){a(B)&&ye(`${i.value.slice(0,a(B).start)}${e.insertText}${i.value.slice(a(B).end)}`,a(B).start+e.insertText.length)}async function ye(e,t=e.length,n=t){P()||(i.onValue(e),await p(),!P()&&(a(I)?.focus(),a(I)?.setSelectionRange(t,n),C(se,t,!0)))}function be(e,t=e,n=`text`){let r=a(I)?.selectionStart??i.value.length,o=a(I)?.selectionEnd??r,s=i.value.slice(r,o)||n;ye(`${i.value.slice(0,r)}${e}${s}${t}${i.value.slice(o)}`,r+e.length,r+e.length+s.length)}function xe(){a(R)&&(C(R,!1),C(z,``),a(I)?.focus())}function Se(e,t){let n=i.value&&!i.value.endsWith(` `)?` `:``;ye(`${i.value}${n}![${t}](${e})`),xe()}function Ce(e){let t=e.currentTarget;i.onValue(t.value),pe(t)}function we(){pe(),i.onFocus()}function Te(e){if(!(e.defaultPrevented||e.isComposing||e.keyCode===229)){if(e.key===`Escape`&&a(V).length>0&&a(B)){e.preventDefault(),C(ce,fe(a(B)),!0),a(I)?.focus();return}if(e.target===a(I)){if(a(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;C(L,(a(L)+t+a(V).length)%a(V).length);return}if(e.key===`Enter`||e.key===`Tab`){e.preventDefault(),ve(a(V)[a(L)]);return}}i.onKeydown(e)}}}var Ee=dt(),De=O(Ee),Oe=e=>{nt(e,{get gifs(){return a(de)},get query(){return a(z)},onQuery:e=>C(z,e,!0),onPick:Se,onClose:xe})};T(De,e=>{ee()&&a(R)&&!P()&&e(Oe)});var ke=b(De,2),Ae=n=>{var r=st();s(r,23,()=>a(V),e=>e.id,(n,r,i)=>{var s=ot();let u;var d=O(s),f=O(d),p=e=>{var t=l(`/`);c(e,t)},m=e=>{var t=l();w(e=>o(t,e),[()=>ue(a(r).detail)]),c(e,t)};T(f,e=>{a(r).kind===`slash`?e(p):e(m,-1)}),e(d);var h=b(d,2),_=O(h),y=O(_,!0),x=b(y),S=e=>{var t=at(),n=v(t,!0);w(()=>o(n,a(r).hint)),c(e,t)};T(x,e=>{a(r).hint&&e(S)}),e(_);var C=b(_,2),E=v(C,!0);e(h);var D=b(h,2),k=v(D,!0);e(s),w(()=>{A(s,`aria-selected`,a(i)===a(L)),u=g(s,1,``,null,u,{active:a(i)===a(L)}),o(y,a(r).label),o(E,a(r).detail),o(k,a(r).source??(a(r).kind===`slash`?`command`:`mention`))}),t(`mousedown`,s,e=>e.preventDefault()),t(`click`,s,()=>ve(a(r))),c(n,s)}),e(r),w(()=>A(r,`aria-label`,a(B)?.kind===`slash`?`Slash command suggestions`:`Mention suggestions`)),c(n,r)};T(ke,e=>{a(V).length>0&&e(Ae)});var je=b(ke,2),Me=O(je),Ne=n=>{var r=lt(),i=b(O(r),2),s=e=>{var t=ct();w(e=>{A(t,`src`,e),A(t,`alt`,E().filename)},[()=>Je(E())]),c(e,t)},l=M(()=>Ye(E()));T(i,e=>{a(l)&&e(s)});var u=b(i,2),d=v(u),f=b(u,2);e(r),w(e=>o(d,`${E().filename??``} ยท ${e??``}`),[()=>Xe(E().byte_size)]),t(`click`,f,function(...e){ae()?.apply(this,e)}),c(n,r)};T(Me,e=>{E()&&e(Ne)});var Pe=b(Me,2),Fe=e=>{it(e,{get target(){return k()},get onClear(){return oe()}})};T(Pe,e=>{k()&&e(Fe)});var Ie=b(Pe,2),Le=O(Ie),Re=n=>{var r=ut(),i=O(r);D(2),e(r),w(()=>i.disabled=P()),t(`change`,i,function(...e){F()?.apply(this,e)}),c(n,r)};T(Le,e=>{j()&&e(Re)});var U=b(Le,2);_(U),te(U,e=>C(I,e),()=>a(I)),u(U,(e,t)=>qe?.(e,t),()=>i.value);var ze=b(U,2);e(Ie);var Be=b(Ie,2),Ve=e=>{G(e,{get showGifPicker(){return a(R)},get disabled(){return P()},onWrap:be,onToggleGif:()=>{a(R)?xe():C(R,!0)}})};T(Be,e=>{ee()&&e(Ve)}),e(je),e(Ee),w(e=>{g(Ee,1,re(y())),A(Ee,`data-handles-escape`,a(V).length>0?``:void 0),S(U,i.value),A(U,`placeholder`,i.placeholder),A(U,`aria-label`,i.ariaLabel),U.disabled=P(),A(ze,`aria-label`,i.submitLabel),ze.disabled=e},[()=>P()||!i.value.trim()]),t(`keydown`,Ee,Te),f(`submit`,je,e=>{e.preventDefault(),!P()&&(xe(),i.onSubmit())}),t(`input`,U,Ce),f(`focus`,U,we),t(`keyup`,U,()=>pe()),t(`mouseup`,U,()=>pe()),f(`select`,U,()=>pe()),c(r,Ee),d()}N([`keydown`,`mousedown`,`click`,`change`,`input`,`keyup`,`mouseup`]);function pt(e,t){(t==null||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n`u`?null:Y(BigInt.prototype.toString),Ut=typeof Symbol>`u`?null:Y(Symbol.prototype.toString),Wt=Y(Object.prototype.hasOwnProperty),Gt=Y(Object.prototype.toString),J=Y(RegExp.prototype.test),Kt=qt(TypeError);function Y(e){return function(t){t instanceof RegExp&&(t.lastIndex=0);var n=[...arguments].slice(1);return Et(e,t,n)}}function qt(e){return function(){return Dt(e,[...arguments])}}function X(e,t){let n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:Pt;if(bt&&bt(e,null),!Nt(t))return e;let r=t.length;for(;r--;){let i=t[r];if(typeof i==`string`){let e=n(i);e!==i&&(xt(t)||(t[r]=e),i=e)}e[i]=!0}return e}function Jt(e){for(let t=0;t/g),pn=q(/\${[\w\W]*/g),mn=q(/^data-[\-\w.\u00B7-\uFFFF]+$/),hn=q(/^aria-[\-\w]+$/),gn=q(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp|matrix):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i),_n=q(/^(?:\w+script|data):/i),vn=q(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g),yn=q(/^html$/i),bn=q(/^[a-z][.\w]*(-[.\w]+)+$/i),xn=q(/<[/\w!]/g),Sn=q(/<[/\w]/g),Cn=q(/<\/no(script|embed|frames)/i),wn=q(/\/>/i),Tn={element:1,attribute:2,text:3,cdataSection:4,entityReference:5,entityNode:6,processingInstruction:7,comment:8,document:9,documentType:10,documentFragment:11,notation:12},En=[`style`,`script`,`xmp`,`iframe`,`noembed`,`noframes`,`plaintext`,`noscript`],Dn=K(X({},En)),On=function(){let e={};return Ot(En,t=>{e[t]=q(RegExp(`])`,`i`))}),K(e)}(),kn=function(){return typeof window>`u`?null:window},An=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}},jn=function(){return{afterSanitizeAttributes:[],afterSanitizeElements:[],afterSanitizeShadowDOM:[],beforeSanitizeAttributes:[],beforeSanitizeElements:[],beforeSanitizeShadowDOM:[],uponSanitizeAttribute:[],uponSanitizeElement:[],uponSanitizeShadowNode:[]}},Mn=function(e,t,n,r){return Wt(e,t)&&Nt(e[t])?X(r.base?Yt(r.base):{},e[t],r.transform):n},Nn=function(e,t,n){let r=Wt(e,t)?e[t]:void 0;return r&&typeof r==`object`?Yt(r):n()};function Pn(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:kn(),t=e=>Pn(e);if(t.version=`3.4.15`,t.removed=[],!e||!e.document||e.document.nodeType!==Tn.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=Zt(d,`cloneNode`),p=Zt(d,`remove`),m=Zt(d,`removeAttributeNode`),h=Zt(d,`nextSibling`),g=Zt(d,`childNodes`),_=Zt(d,`parentNode`),v=Zt(d,`shadowRoot`),y=Zt(d,`attributes`),b=o&&o.prototype?Zt(o.prototype,`nodeType`):null,x=o&&o.prototype?Zt(o.prototype,`nodeName`):null,S=o&&o.prototype?Zt(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,k=0,A=function(){if(k>0)throw Kt(`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.`)},j=function(e){A(),k++;try{return T.createHTML(e)}finally{k--}},ee=function(e){A(),k++;try{return T.createScriptURL(e)}finally{k--}},te=function(){return O||=(D=An(u,i),!0),D},ne=n,re=ne.implementation,ie=ne.createNodeIterator,M=ne.createDocumentFragment,N=ne.getElementsByTagName,P=r.importNode,F=jn();t.isSupported=typeof yt==`function`&&typeof _==`function`&&re&&re.createHTMLDocument!==void 0;let ae=dn,oe=fn,I=pn,se=mn,ce=hn,le=_n,ue=vn,L=bn,R=gn,z=null,de=X({},[...$t,...en,...tn,...rn,...on]),B=null,V=X({},[...sn,...cn,...ln,...un]),H=Object.seal(wt(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(wt(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],Ft),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=Yt(e),Ze=Qe.indexOf(e.PARSER_MEDIA_TYPE)===-1?`text/html`:e.PARSER_MEDIA_TYPE,G=Ze===`application/xhtml+xml`?Ft:Pt,z=Mn(e,`ALLOWED_TAGS`,de,{transform:G}),B=Mn(e,`ALLOWED_ATTR`,V,{transform:G}),We=Mn(e,`ALLOWED_NAMESPACES`,Ge,{transform:Ft}),U=Mn(e,`ADD_URI_SAFE_ATTR`,ze,{transform:G,base:ze}),Le=Mn(e,`ADD_DATA_URI_TAGS`,Re,{transform:G,base:Re}),Fe=Mn(e,`FORBID_CONTENTS`,Ie,{transform:G}),fe=Mn(e,`FORBID_TAGS`,Yt({}),{transform:G}),pe=Mn(e,`FORBID_ATTR`,Yt({}),{transform:G}),Pe=Wt(e,`USE_PROFILES`)?e.USE_PROFILES&&typeof e.USE_PROFILES==`object`?Yt(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=Qt(e.ALLOWED_URI_REGEXP)?e.ALLOWED_URI_REGEXP:gn,He=typeof e.NAMESPACE==`string`?e.NAMESPACE:W,qe=Nn(e,`MATHML_TEXT_INTEGRATION_POINTS`,()=>X({},Ke)),Ye=Nn(e,`HTML_INTEGRATION_POINTS`,()=>X({},Je));let t=Nn(e,`CUSTOM_ELEMENT_HANDLING`,()=>wt(null));if(H=wt(null),Wt(t,`tagNameCheck`)&&tt(t.tagNameCheck)&&(H.tagNameCheck=t.tagNameCheck),Wt(t,`attributeNameCheck`)&&tt(t.attributeNameCheck)&&(H.attributeNameCheck=t.attributeNameCheck),Wt(t,`allowCustomizedBuiltInElements`)&&typeof t.allowCustomizedBuiltInElements==`boolean`&&(H.allowCustomizedBuiltInElements=t.allowCustomizedBuiltInElements),q(H),ye&&(ge=!1),De&&(Ee=!0),Pe&&(z=X({},on),B=wt(null),Pe.html===!0&&(X(z,$t),X(B,sn)),Pe.svg===!0&&(X(z,en),X(B,cn),X(B,un)),Pe.svgFilters===!0&&(X(z,tn),X(B,cn),X(B,un)),Pe.mathMl===!0&&(X(z,rn),X(B,ln),X(B,un))),me.tagCheck=null,me.attributeCheck=null,Wt(e,`ADD_TAGS`)&&(typeof e.ADD_TAGS==`function`?me.tagCheck=e.ADD_TAGS:Nt(e.ADD_TAGS)&&(z===de&&(z=Yt(z)),X(z,e.ADD_TAGS,G))),Wt(e,`ADD_ATTR`)&&(typeof e.ADD_ATTR==`function`?me.attributeCheck=e.ADD_ATTR:Nt(e.ADD_ATTR)&&(B===V&&(B=Yt(B)),X(B,e.ADD_ATTR,G))),Wt(e,`ADD_FORBID_CONTENTS`)&&Nt(e.ADD_FORBID_CONTENTS)&&(Fe===Ie&&(Fe=Yt(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 Kt(`TRUSTED_TYPES_POLICY configuration option must provide a "createHTML" hook.`);if(typeof e.TRUSTED_TYPES_POLICY.createScriptURL!=`function`)throw Kt(`TRUSTED_TYPES_POLICY configuration option must provide a "createScriptURL" hook.`);let t=T;T=e.TRUSTED_TYPES_POLICY;try{E=j(``)}catch(e){throw T=t,e}}else e.TRUSTED_TYPES_POLICY===null?(T=void 0,E=``):(T===void 0&&(T=te()),T&&typeof E==`string`&&(E=j(``)));K&&K(e),$e=e},rt=X({},[...en,...tn,...nn]),it=X({},[...rn,...an]),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=Pt(e.tagName),r=Pt(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){jt(t.removed,{element:e});try{_(e).removeChild(e)}catch{if(p(e),!_(e))throw Kt(`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=[];Ot(t,t=>{jt(e,t)}),Ot(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}jt(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)===Tn.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===Tn.processingInstruction||n===Tn.comment&&J(Sn,e.data)){try{p(e)}catch{}continue}if(n===Tn.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=It(e,/^[\r\n\t ]+/);r=t&&t[0]}Ze===`application/xhtml+xml`&&He===W&&(e=``+e+``);let i=T?j(e):e;if(He===W)try{t=new l().parseFromString(i,Ze)}catch{}if(!t||!t.documentElement){t=re.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)},bt=function(e){return e=Lt(e,ae,` `),e=Lt(e,oe,` `),e=Lt(e,I,` `),e},xt=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=bt(r.data),r=n.nextNode();let i=e.querySelectorAll?.call(e,`template`);i&&Ot(i,e=>{Ct(e.content)&&xt(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)===Tn.documentFragment}catch{return!1}},Tt=function(e){if(!b||typeof e!=`object`||!e)return!1;try{return typeof b(e)==`number`}catch{return!1}};function Et(e,n,r){e.length!==0&&Ot(e,e=>{e.call(t,n,r,$e)})}let Dt=function(e,t){return!!(be&&e.hasChildNodes()&&!Tt(e.firstElementChild)&&J(xn,e.textContent)&&J(xn,e.innerHTML)||be&&e.namespaceURI===W&&Dn[t]&&(Tt(e.firstElementChild)||typeof e.textContent==`string`&&J(On[t],e.textContent))||e.nodeType===Tn.processingInstruction||be&&e.nodeType===Tn.comment&&J(Sn,e.data))},Bt=function(e,t){return e instanceof RegExp?J(e,t):e instanceof Function&&!!e(t,...[...arguments].slice(2))},Vt=function(e,t,n){if(!fe[t]&&Jt(t)&&Bt(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?Yt(t):t},Ut=function(e,t){return e===t||_(e)!==null?!1:(Ne&&mt(e),!0)},Gt=function(e,n){if(Et(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),Et(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=Vt(e,r,n);return t===!1&&Et(F.afterSanitizeElements,e,null),t}if(C(e)===Tn.element&&!ct(e)||(r===`noscript`||r===`noembed`||r===`noframes`)&&J(Cn,e.innerHTML))return lt(e),!0;if(ye&&e.nodeType===Tn.text){let n=bt(e.textContent);e.textContent!==n&&(jt(t.removed,{element:e.cloneNode()}),e.textContent=n)}return Et(F.afterSanitizeElements,e,null),!1},Y=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,Lt(r,ue,``))||(t===`src`||t===`xlink:href`||t===`href`)&&e!==`script`&&Rt(r,`data:`)===0&&Le[e]||_e&&!J(le,Lt(r,ue,``))?!0:!r:Jt(e)&&Bt(H.tagNameCheck,e)&&Bt(H.attributeNameCheck,t,e)||t===`is`&&H.allowCustomizedBuiltInElements&&Bt(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`]),Jt=function(e){return!qt[Pt(e)]&&J(L,e)},En=function(e,t,n,r){if(T&&typeof u==`object`&&typeof u.getAttributeType==`function`&&!n)switch(u.getAttributeType(e,t)){case`TrustedHTML`:return j(r);case`TrustedScriptURL`:return ee(r)}return r},Fn=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}},In=function(e){Et(F.beforeSanitizeAttributes,e,null);let n=e.attributes;if(!n||St(e))return;B=Ht(F.uponSanitizeAttribute,B,V,we);let r={attrName:``,attrValue:``,keepAttr:!0,allowedAttributes:B,forceKeepAttr:void 0},i=n.length,a=G(e.nodeName);for(;i--;){let o=n[i],s=o.name,c=o.namespaceURI,l=o.value,u=G(s),d=l,f=s===`value`?d:zt(d),p=!1;if(r.attrName=u,r.attrValue=f,r.keepAttr=!0,r.forceKeepAttr=void 0,Et(F.uponSanitizeAttribute,e,r),f=r.attrValue,Ae&&(u===`id`||u===`name`)&&Rt(f,je)!==0&&(ft(s,e,o),f=je+f,p=!0),be&&J(/((--!?|])>)|<\/(style|script|title|xmp|textarea|noscript|iframe|noembed|noframes)/i,f)){ft(s,e,o);continue}if(u===`attributename`&&It(f,`href`)){ft(s,e,o);continue}if(!r.forceKeepAttr){if(!r.keepAttr){ft(s,e,o);continue}if(!ve&&J(wn,f)){ft(s,e,o);continue}if(ye&&(f=bt(f)),!Y(a,u,f)){ft(s,e,o);continue}f=En(a,u,c,f),f!==d&&Fn(e,s,c,f)&&p&&At(t.removed)}}Et(F.afterSanitizeAttributes,e,null)},Ln=function(e){let t=null,n=vt(e);for(Et(F.beforeSanitizeShadowDOM,e,null);t=n.nextNode();)if(Et(F.uponSanitizeShadowNode,t,null),Gt(t,e),In(t),Ct(t.content)&&Ln(t.content),C(t)===Tn.element){let e=v(t);Ct(e)&&(Rn(e),Ln(e))}Et(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)===Tn.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`&&!Tt(e)&&(e=Xt(e),typeof e!=`string`))throw Kt(`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=Yt(z)),F.uponSanitizeAttribute.length>0&&(B=Yt(B)),t.removed=[];let c=Ne&&typeof e!=`string`&&Tt(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),Kt(`root node is forbidden and cannot be sanitized in-place`)}if(St(e))throw dt(e),Kt(`root node is clobbered and cannot be sanitized in-place`);try{Rn(e)}catch(t){throw dt(e),t}}else if(Tt(e))i=_t(``),a=i.ownerDocument.importNode(e,!0),a.nodeType===Tn.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?j(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();)Gt(o,l),In(o),Ct(o.content)&&Ln(o.content)}catch(n){throw c&&(dt(e),Ot(t.removed,e=>{e.element&&mt(e.element)})),n}if(c)return Ot(t.removed,e=>{e.element&&mt(e.element)}),ye&&xt(e),e;if(Ee){if(ye&&xt(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(yn,i.ownerDocument.doctype.name)&&(u=` diff --git a/apps/api/internal/webassets/dist/_app/immutable/chunks/CyT438p0.js b/apps/api/internal/webassets/dist/_app/immutable/chunks/KlawdwO_.js similarity index 99% rename from apps/api/internal/webassets/dist/_app/immutable/chunks/CyT438p0.js rename to apps/api/internal/webassets/dist/_app/immutable/chunks/KlawdwO_.js index 82ddb5d9..fa70969b 100644 --- a/apps/api/internal/webassets/dist/_app/immutable/chunks/CyT438p0.js +++ b/apps/api/internal/webassets/dist/_app/immutable/chunks/KlawdwO_.js @@ -1 +1 @@ -import{At as e,B as t,D as n,Et as r,F as i,I as a,K as o,N as s,O as c,P as l,R as u,S as d,Tt as f,V as p,X as m,a as h,at as g,b as _,dt as v,ft as y,gt as b,ht as x,it as S,j as C,jt as w,k as ee,kt as T,lt as E,n as te,p as D,pt as O,s as k,ut as A,y as ne,yt as j,z as M}from"./CxKeDCcw.js";import"./xihTtKlq.js";import{u as N}from"./DEPNME54.js";import{A as P,C as F,L as re,M as ie,N as ae,O as oe,P as se,a as ce,c as le,d as ue,h as de,i as fe,k as pe,l as me,m as I,n as L,o as he,r as R,s as ge,t as _e,u as ve}from"./BqBbEnKW.js";import{c as ye,l as z,n as be,t as B}from"./C7NZ0SeM.js";import{t as xe}from"./DlGnnCJo.js";import{t as Se}from"./BVPazc3H.js";var Ce=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?pe(n,e):e)}return t=>t.id===e.id?pe(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=pe(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=oe(n.root.thread_state??null,n.thread_state)),t(n),n}catch(e){if(i.current())throw e}finally{this.reads.delete(i)}}},V={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`}},H=[{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 U(e,t){let n=String(e||``).trim(),r=n.toLowerCase().replace(/[^a-z0-9_]/g,``),i=String(t||``).trim()||void 0,a=V[r];if(a)return{name:n,glyph:a.glyph,action:a.action,detail:i};for(let e of H)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=a(`
          `),Te=a(` `),W=a(` `),Ee=a(`
          `),De=a(`
          `),G=a(`
          `),Oe=a(`
          `),ke=a(`
          `),K=a(`
          `);function Ae(a,u){r(u,!0);let p=h(u,`mentionPeople`,19,()=>[]),m=b(!0),w=b(void 0);g(()=>{(o(w)===void 0||u.block.final!==o(w))&&(x(w,u.block.final,!0),x(m,!u.block.final))});let ee=O({});function T(e){ee[e]=!ee[e]}function te(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 k=j(()=>u.block.items.map(e=>e.type===`tool`?{item:e,tool:U(e.name,e.detail)}:{item:e,tool:null})),ne=j(()=>u.block.final?o(m)?`expanded`:`collapsed`:`live`),M=j(()=>o(m)?`Hide preamble`:`Show preamble`);var N=K();let P;var F=E(N),ie=E(F);let ae;var oe=y(ie,2);let se;var ce=v(oe,!0),le=y(oe,2),ue=v(le,!0);e(F);var de=y(F,2),fe=r=>{var a=ke();c(a,21,()=>o(k),e=>e.item.id,(r,a)=>{var c=i(),f=A(c),m=t=>{var r=we();n(r,()=>I(o(a).item.body),!0),e(r),d(r,e=>re?.(e)),d(r,(e,t)=>ve?.(e,t),()=>({people:p(),attentionUserID:u.mentionAttentionUserID})),l(t,r)},h=r=>{let i=j(()=>ee[o(a).item.id]===!0);var c=Oe();let f;var m=E(c),h=E(m);let g;var b=y(h,2),x=v(b,!0),w=y(b,2),O=v(w,!0),k=y(w,2),A=e=>{var t=Te(),n=v(t,!0);S(()=>s(n,o(a).tool.name)),l(e,t)};C(k,e=>{o(a).tool.name&&o(a).tool.name!==`tool`&&e(A)});var ne=y(k,2),M=e=>{var t=W(),n=v(t,!0);S(()=>{D(t,`title`,o(a).tool.detail),s(n,o(a).tool.detail)}),l(e,t)};C(ne,e=>{!o(i)&&o(a).tool.detail&&e(M)}),e(m);var N=y(m,2),P=t=>{let r=j(()=>te(o(a).item.full));var i=G(),c=E(i),f=e=>{var t=Ee(),n=v(t,!0);S(()=>s(n,o(r).head)),l(e,t)};C(c,e=>{o(r).head&&e(f)});var m=y(c,2),h=t=>{var i=De();n(i,()=>I(o(r).text),!0),e(i),d(i,e=>re?.(e)),d(i,(e,t)=>ve?.(e,t),()=>({people:p(),attentionUserID:u.mentionAttentionUserID})),l(t,i)};C(m,e=>{o(r).text&&e(h)}),e(i),l(t,i)};C(N,e=>{o(i)&&e(P)}),e(c),S(()=>{f=_(c,1,`preamble-tool`,null,f,{expanded:o(i)}),D(m,`aria-expanded`,o(i)),g=_(h,1,`tool-line-chevron`,null,g,{open:o(i)}),s(x,o(a).tool.glyph),s(O,o(a).tool.action)}),t(`click`,m,()=>T(o(a).item.id)),l(r,c)};C(f,e=>{o(a).item.type===`commentary`?e(m):o(a).tool&&e(h,1)}),l(r,c)}),e(a),l(r,a)};C(de,e=>{o(m)&&e(fe)}),e(N),S(()=>{P=_(N,1,`preamble-contract`,null,P,{"is-final":u.block.final}),D(F,`aria-expanded`,o(m)),ae=_(ie,1,`preamble-chevron`,null,ae,{open:o(m)}),se=_(oe,1,`preamble-state`,null,se,{"is-live":!u.block.final}),s(ce,o(ne)),s(ue,o(M))}),t(`click`,F,()=>x(m,!o(m))),l(a,N),f()}M([`click`]);var je=a(``),Me=a(` `);function Ne(e,n){r(n,!0);var a=i(),o=A(a),c=e=>{var r=i(),a=A(r),o=e=>{var r=je(),i=v(r,!0);S(()=>{D(r,`aria-label`,`Filter by topic ${n.topic.name}`),s(i,n.topic.name)}),t(`click`,r,e=>{e.stopPropagation(),n.onSelect(n.topic.id)}),l(e,r)},c=e=>{var t=Me(),r=v(t,!0);S(()=>s(r,n.topic.name)),l(e,t)};C(a,e=>{n.onSelect?e(o):e(c,-1)}),l(e,r)};C(o,e=>{n.topic&&e(c)}),l(e,a),f()}M([`click`]);var Pe=a(`
          This message was deleted.
          `),Fe=a(`(edited)`),Ie=a(`
          `),Le=a(``),Re=a(``),ze=a(``),Be=a(`
          `,1),Ve=a(``),He=a(` `,1),Ue=a(``),q=a(` `),We=a(``),Ge=a(`Couldn't create link`),Ke=a(` `,1),qe=a(` `),Je=a(` `,1),Ye=a(` `,1),Xe=a(` `,1),Ze=a(`
          `),Qe=a(`
          `),$e=a(`
          `);function et(a,u){r(u,!0);let w=h(u,`mentionPeople`,19,()=>[]),T=h(u,`reactionsDisabled`,3,!1),ne=h(u,`canDeleteAnyMessage`,3,!1),M=h(u,`deleting`,3,!1),P=h(u,`editScope`,3,``),oe=h(u,`topics`,19,()=>[]),ue=h(u,`onSelectTopic`,3,()=>{}),pe=h(u,`channelID`,3,``),ye=h(u,`pinned`,3,!1),z=j(()=>u.editController?.session(P())),be=j(()=>o(z)?.surface===`timeline`&&o(z).messageID===u.message.id);async function B(){await m(),o(Z)?.focus()}function xe(){u.editController?.start(P(),u.message,`timeline`)===`cancelled`&&B()}function Se(){u.editController?.cancel(P(),`timeline`)&&B()}async function Ce(){if(!u.editController)return;let e=await u.editController.save(P(),u.message,e=>u.onMessageEdited?.(e));(e===`saved`||e===`cancelled`)&&await B()}let V=j(()=>u.message.status===`pending`),H=j(()=>u.message.status===`failed`),U=j(()=>!!u.message.deleted_at),we=j(()=>ne()||!!u.currentUserID&&(u.message.author?.id||u.message.author_id)===u.currentUserID),Te=j(()=>!!u.currentUserID&&(u.message.author?.id||u.message.author_id)===u.currentUserID),W=j(()=>u.message.preamble_block),Ee=j(()=>!!u.previousMessage?.preamble_block&&!o(W)),De=j(()=>!!o(W)&&!!u.nextMessage&&!u.nextMessage?.preamble_block),G=j(()=>u.message.thread_state?.reply_count||0),Oe=j(()=>o(G)>0),ke=j(()=>ae(u.message)),K=j(()=>u.selectedThreadID===u.message.id),je=j(()=>!o(W)&&!o(V)&&!o(H)&&(!o(U)||o(Oe)||o(K))),Me=j(()=>oe().find(e=>e.id===u.message.topic_id));function et(e){if(qt||o(Ht)){qt=!1,e.preventDefault(),e.stopPropagation();return}o(je)&&(window.getSelection()?.toString()||e.target?.closest(zt)||u.onOpenThread(u.message))}function tt(e){return e.addEventListener(`click`,et),{destroy(){e.removeEventListener(`click`,et)}}}let J=b(!1),Y=b(!1),nt=b(``),X=b(``),rt=b(``),it=b(void 0),at=b(!1),ot=b(``),st=b(!1),ct=b(!1),lt=b(void 0),ut=b(!1),dt=b(!1),ft=j(()=>o(ut)||o(dt)||u.selected),pt=b(!1);function mt(){let e=o(lt)?.closest(`.messages-scroll`);if(!o(lt)||!e){x(pt,!1);return}let t=o(lt).getBoundingClientRect().top-e.getBoundingClientRect().top;x(pt,t<26)}let ht=b(void 0),gt=b(void 0),_t=b(void 0),Z=b(void 0),vt,yt,bt=!1,xt=j(()=>`toolbar-reaction-picker-${u.message.id}`),St=j(()=>u.reactionController.pending(u.message.id)),Q=j(()=>T()||!u.currentUserID||o(V)||o(H)||o(St));function Ct(e){o(Q)||u.reactionController.toggle(u.message,e)}function wt(){o(Q)||(o(J)||x(st,fe(o(ht),130),!0),x(J,!o(J)))}function Tt(e){o(Q)||(u.reactionController.toggle(u.message,e),x(J,!1))}function Et(){x(J,!1),o(_t)?.focus()}async function Dt(){o(Y)||x(ct,fe(o(gt),160),!0),x(Y,!o(Y)),o(Y)&&(await m(),At()[0]?.focus())}function Ot(){if(o(Vt)){Qt(o(Z));return}Dt()}function kt(e=!0){x(Y,!1),e&&o(Z)?.focus()}function At(){return[...o(gt)?.querySelectorAll(`[role="menuitem"]:not(:disabled)`)??[]].filter(e=>e.getClientRects().length>0)}function jt(e){if(e.key===`Escape`){e.preventDefault(),kt();return}if(e.key===`Tab`){kt(!1);return}let t=At();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 Mt(e){bt||(x(nt,e,!0),vt&&window.clearTimeout(vt),vt=window.setTimeout(()=>{x(nt,``),vt=void 0},1800))}async function Nt(){kt(),await Pt()}async function Pt(){try{if(!navigator.clipboard)throw Error(`Clipboard unavailable`);return await navigator.clipboard.writeText(u.message.body??``),Mt(`copied`),!0}catch{return Mt(`failed`),!1}}async function Ft(){if(!u.onCopyLink||o(X)===`pending`)return{copied:!1};x(X,`pending`);let e;try{e=await u.onCopyLink(u.message)}catch{return x(X,`failed`),{copied:!1}}try{if(!navigator.clipboard)throw Error(`Clipboard unavailable`);return await navigator.clipboard.writeText(e),x(X,``),Mt(`copied`),{copied:!0}}catch{return x(X,``),{copied:!1,fallback:e}}}async function It(){let e=await Ft();!e.copied&&!e.fallback||(kt(!1),e.fallback?(x(it,o(Z),!0),x(rt,e.fallback,!0)):o(Z)?.focus())}function Lt(){kt(!1),xe()}function Rt(){kt(!1),u.onDeleteMessage?.(u.message)}let zt=`a, button, input, textarea, select, .attachment-grid, .media-tile, .markdown img, .gif-player, .markdown-table-scroll, .message-actions, .message-failed`,Bt=typeof window<`u`?window.matchMedia(`(hover: none), (pointer: coarse)`):null,Vt=b(O(Bt?.matches??!1)),Ht=b(!1),Ut,Wt,Gt=0,Kt=b(void 0),qt=!1,Jt=j(()=>`message-action-sheet-${u.message.id}`);g(()=>{if(!Bt)return;let e=()=>{x(Vt,Bt.matches,!0)};return Bt.addEventListener(`change`,e),()=>Bt.removeEventListener(`change`,e)});function Yt(){Ut!==void 0&&(window.clearTimeout(Ut),Ut=void 0)}function Xt(){Wt?.(),Wt=void 0}function Zt(){yt!==void 0&&(window.clearTimeout(yt),yt=void 0)}function Qt(e){Zt(),Gt+=1,x(Kt,e,!0),x(Y,!1),x(J,!1),x(Ht,!0)}function $t(e){if(e.pointerType!==`touch`||!e.isPrimary||e.button!==0||o(W)||o(U)||o(V)||o(H)||o(be)||e.target?.closest(zt))return;Xt();let t=e.pointerId,n=e.clientX,r=e.clientY;Ut=window.setTimeout(()=>{Ut=void 0,qt=!0,Qt()},450);let i=e=>{e.pointerId===t&&(Math.abs(e.clientX-n)>10||Math.abs(e.clientY-r)>10)&&s()},a=e=>{e.pointerId===t&&s()},s=()=>{Yt(),window.removeEventListener(`pointermove`,i),window.removeEventListener(`pointerup`,a),window.removeEventListener(`pointercancel`,a),Wt===s&&(Wt=void 0)};Wt=s,window.addEventListener(`pointermove`,i),window.addEventListener(`pointerup`,a),window.addEventListener(`pointercancel`,a)}function en(e){(o(Ht)||Ut!==void 0)&&e.preventDefault()}function tn(){Zt(),Gt+=1,x(Ht,!1),qt=!1}function nn(e){tn(),!o(Q)&&u.reactionController.toggle(u.message,e)}function rn(){tn(),u.onOpenThread(u.message)}function an(){tn(),u.onReply(u.message,u.replyContext)}async function on(){Zt();let e=Gt;!await Pt()||!o(Ht)||e!==Gt||(yt=window.setTimeout(()=>{yt=void 0,!bt&&e===Gt&&tn()},900))}async function sn(){let e=await Ft();if(!e.copied&&!e.fallback)return;let t=o(Kt);tn(),e.fallback&&(await m(),x(it,t,!0),x(rt,e.fallback,!0))}function cn(){tn(),xe()}function ln(){tn(),u.onDeleteMessage?.(u.message)}async function un(){if(!(!pe()||!u.onTogglePin||o(at))){x(at,!0),x(ot,``);try{await u.onTogglePin(u.message,ye()),kt()}catch(e){x(ot,N(e,`Could not update pin`),!0)}finally{x(at,!1)}}}async function dn(){await un(),o(ot)||tn()}g(()=>{if(!o(J)&&!o(Y))return;let e=e=>{let t=e.target;o(J)&&o(ht)&&!o(ht).contains(t)&&x(J,!1),o(Y)&&o(gt)&&!o(gt).contains(t)&&x(Y,!1)};return document.addEventListener(`click`,e),()=>document.removeEventListener(`click`,e)}),g(()=>{o(Q)&&x(J,!1)}),te(()=>{bt=!0,vt&&window.clearTimeout(vt),Zt(),Xt()}),g(()=>{if(!(o(Y)||o(J)||o(ft))||!o(lt))return;let e=o(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 $=$e();let fn;var pn=E($),mn=v(pn,!0),hn=y(pn,2),gn=E(hn),_n=e=>{Ae(e,{get block(){return o(W)},get mentionPeople(){return w()},get mentionAttentionUserID(){return u.mentionAttentionUserID}})},vn=e=>{var t=Pe();l(e,t)},yn=e=>{var t=i(),n=A(t),r=e=>{L(e,{get body(){return o(z).draft},get errorMessage(){return o(z).error},get saving(){return o(z).saving},onBody:e=>u.editController?.updateDraft(P(),e),onCancel:Se,onSave:Ce})};C(n,e=>{o(z)&&e(r)}),l(e,t)},bn=r=>{var i=Be(),a=A(i);Ne(a,{get topic(){return o(Me)},get onSelect(){return ue()}});var s=y(a,2);_e(s,{get message(){return u.message},get onJump(){return u.onJumpToQuote}});var f=y(s,2);n(f,()=>I(u.message.body),!0),e(f),d(f,e=>re?.(e)),d(f,(e,t)=>ve?.(e,t),()=>({people:w(),attentionUserID:u.mentionAttentionUserID}));var p=y(f,2),m=e=>{var t=Fe();S(e=>D(t,`title`,`Edited ${e??``}`),[()=>de(u.message.edited_at)]),l(e,t)};C(p,e=>{u.message.edited_at&&e(m)});var h=y(p,2),g=e=>{{let t=j(()=>u.reactionController.reactionsFor(u.message)),n=j(()=>u.reactionController.pending(u.message.id)),r=j(()=>u.reactionController.error(u.message.id)),i=j(()=>T()||!u.currentUserID);ge(e,{get messageId(){return u.message.id},get reactions(){return o(t)},get pending(){return o(n)},get error(){return o(r)},get disabled(){return o(i)},onToggle:e=>void u.reactionController.toggle(u.message,e)})}};C(h,e=>{!o(V)&&!o(H)&&e(g)});var _=y(h,2),v=t=>{var n=Ie();c(n,21,()=>u.message.attachments,e=>e.id,(e,t)=>{{let n=j(()=>F(o(t)));R(e,{get upload(){return o(t)},get url(){return o(n)},get onOpenImage(){return u.onOpenImage},get onOpenArtifact(){return u.onOpenArtifact}})}}),e(n),l(t,n)};C(_,e=>{u.message.attachments?.length&&e(v)});var b=y(_,2),x=n=>{var r=ze(),i=y(E(r),2),a=e=>{var n=Le();t(`click`,n,()=>u.onRetry?.(u.message)),l(e,n)};C(i,e=>{u.onRetry&&e(a)});var o=y(i,2),s=e=>{var n=Re();t(`click`,n,()=>u.onDiscard?.(u.message)),l(e,n)};C(o,e=>{u.onDiscard&&e(s)}),e(r),l(n,r)};C(b,e=>{o(H)&&e(x)}),l(r,i)};C(gn,e=>{o(W)?e(_n):o(U)?e(vn,1):o(be)?e(yn,2):e(bn,-1)});var xn=y(gn,2),Sn=n=>{var r=Ue();let i;var a=y(E(r),2),c=e=>{var t=He(),n=A(t),r=v(n,!0),i=y(n,2),a=e=>{var t=Ve(),n=v(t,!0);S(()=>{D(t,`datetime`,u.message.thread_state?.last_reply_at),s(n,o(ke))}),l(e,t)};C(i,e=>{o(ke)&&e(a)}),S(e=>s(r,e),[()=>ie(u.message)]),l(e,t)};C(a,e=>{(o(Oe)||o(K))&&e(c)}),e(r),S((e,t)=>{i=_(r,1,`thread-hint tooltip`,null,i,{"has-replies":o(Oe),"is-open":o(K)}),D(r,`data-tooltip`,e),D(r,`aria-label`,t)},[()=>se(u.message,u.selectedThreadID),()=>se(u.message,u.selectedThreadID)]),t(`click`,r,()=>u.onOpenThread(u.message)),l(n,r)};C(xn,e=>{o(je)&&e(Sn)}),e(hn);var Cn=y(hn,2),wn=n=>{var r=Qe(),i=E(r),a=e=>{var t=q();let n;var r=v(t,!0);S(()=>{n=_(t,1,`message-copy-status`,null,n,{"is-error":o(nt)===`failed`}),s(r,o(nt)===`copied`?`Copied`:`Couldn't copy`)}),l(e,t)};C(i,e=>{o(nt)&&e(a)});var d=y(i,2);c(d,17,()=>me,ee,(e,n)=>{var r=We(),i=v(r,!0);S(()=>{D(r,`aria-label`,`React with ${o(n)}`),D(r,`data-tooltip`,`React with ${o(n)}`),r.disabled=o(Q),s(i,o(n))}),t(`click`,r,()=>Ct(o(n))),l(e,r)});var f=y(d,2),p=E(f);k(p,e=>x(_t,e),()=>o(_t));var m=y(p,2),h=e=>{{let t=j(()=>o(st)?`above-right`:`below`);le(e,{get id(){return o(xt)},get placement(){return o(t)},get disabled(){return o(Q)},onPick:Tt,onEscape:Et})}};C(m,e=>{o(J)&&e(h)}),e(f),k(f,e=>x(ht,e),()=>o(ht));var g=y(f,4),b=y(g,2),w=y(b,4),T=E(w);let te;k(T,e=>x(Z,e),()=>o(Z));var O=y(T,2),ne=n=>{var r=Ze();let i;var a=E(r),c=y(a,2),d=n=>{var r=Ke(),i=A(r),a=y(E(i));e(i);var c=y(i,2),u=e=>{var t=Ge();l(e,t)};C(c,e=>{o(X)===`failed`&&e(u)}),S(()=>{i.disabled=o(X)===`pending`,s(a,` ${o(X)===`pending`?`Creating linkโ€ฆ`:`Copy link`}`)}),t(`click`,i,()=>void It()),l(n,r)};C(c,e=>{pe()&&u.onCopyLink&&e(d)});var f=y(c,2),p=n=>{var r=Je(),i=A(r),a=y(E(i));e(i);var c=y(i,2),u=e=>{var t=qe(),n=v(t,!0);S(()=>s(n,o(ot))),l(e,t)};C(c,e=>{o(ot)&&e(u)}),S(()=>{i.disabled=o(at),s(a,` ${ye()?`Unpin message`:`Pin message`}`)}),t(`click`,i,un),l(n,r)};C(f,e=>{pe()&&u.onTogglePin&&e(p)});var m=y(f,2),h=e=>{var n=Ye(),r=y(A(n),2);t(`click`,r,Lt),l(e,n)};C(m,e=>{o(Te)&&u.editController&&P()&&!o(be)&&e(h)});var g=y(m,2),b=e=>{var n=Xe(),r=y(A(n),2);S(()=>r.disabled=M()),t(`click`,r,Rt),l(e,n)};C(g,e=>{o(we)&&u.onDeleteMessage&&e(b)}),e(r),S(()=>i=_(r,1,`message-menu`,null,i,{above:o(ct)})),t(`keydown`,r,jt),t(`click`,a,Nt),l(n,r)};C(O,e=>{o(Y)&&e(ne)}),e(w),k(w,e=>x(gt,e),()=>o(gt)),e(r),S(e=>{D(p,`aria-controls`,o(xt)),D(p,`aria-expanded`,o(J)),p.disabled=o(Q),D(g,`data-tooltip`,e),g.disabled=o(V)||o(H),b.disabled=o(V)||o(H),te=_(T,1,`message-actions-trigger`,null,te,{tooltip:!o(Vt),"tooltip-align-end":!o(Vt)}),D(T,`data-tooltip`,o(Vt)?void 0:`More actions`),D(T,`aria-haspopup`,o(Vt)?`dialog`:`menu`),D(T,`aria-controls`,o(Vt)?o(Jt):void 0),D(T,`aria-expanded`,o(Vt)?o(Ht):o(Y)),T.disabled=o(V)||o(H)},[()=>se(u.message,u.selectedThreadID)]),t(`click`,p,wt),t(`click`,g,()=>u.onOpenThread(u.message)),t(`click`,b,()=>u.onReply(u.message,u.replyContext)),t(`click`,T,Ot),l(n,r)};C(Cn,e=>{!o(W)&&!o(U)&&e(wn)});var Tn=y(Cn,2),En=e=>{{let t=j(()=>!o(Q)),n=j(()=>!o(V)&&!o(H)),r=j(()=>o(Te)&&!!u.editController&&!!P()&&!o(be)),i=j(()=>!!(pe()&&u.onTogglePin)),a=j(()=>o(we)&&!!u.onDeleteMessage),s=j(()=>!!(pe()&&u.onCopyLink));he(e,{get id(){return o(Jt)},get canReact(){return o(t)},get canReply(){return o(n)},get canOpenThread(){return o(je)},get canEdit(){return o(r)},get canPin(){return o(i)},get pinned(){return ye()},get pinning(){return o(at)},get pinError(){return o(ot)},get canDelete(){return o(a)},get deleting(){return M()},get copyStatus(){return o(nt)},get canCopyLink(){return o(s)},get copyLinkStatus(){return o(X)},onReact:nn,onOpenThread:rn,onReply:an,onCopy:on,onCopyLink:sn,onEdit:cn,onTogglePin:dn,onDelete:ln,onClose:tn,get returnFocus(){return o(Kt)}})}};C(Tn,e=>{o(Ht)&&e(En)});var Dn=y(Tn,2),On=e=>{ce(e,{get url(){return o(rt)},onClose:()=>x(rt,``),get returnFocus(){return o(it)}})};C(Dn,e=>{o(rt)&&e(On)}),e($),k($,e=>x(lt,e),()=>o(lt)),d($,e=>tt?.(e)),S((e,t)=>{fn=_($,1,`message-row`,null,fn,{selected:u.selected,"is-pending":o(V),"is-failed":o(H),"is-deleted":o(U),"is-preamble":e,"is-preamble-collapsed":o(W)?.final===!0,"is-preamble-live":o(W)?.final===!1,"before-final-message":o(De),"after-preamble":o(Ee),"can-open-thread":o(je),editing:o(be),"menu-open":o(Y)||o(J),"actions-flip":o(pt)}),D($,`data-message-id`,u.message.id),s(mn,t)},[()=>!!o(W),()=>u.index===0?``:de(u.message.created_at)]),t(`pointerdown`,$,$t),t(`contextmenu`,$,en),p(`mouseenter`,$,()=>{!o(ut)&&!o(dt)&&mt(),x(ut,!0)}),p(`mouseleave`,$,()=>x(ut,!1)),t(`focusin`,$,()=>{!o(ut)&&!o(dt)&&mt(),x(dt,!0)}),t(`focusout`,$,e=>{o(lt)?.contains(e.relatedTarget)||x(dt,!1)}),l(a,$),f()}M([`pointerdown`,`contextmenu`,`focusin`,`focusout`,`click`,`keydown`]);var tt=a(` deleted bot`,1),J=a(`bot`),Y=a(` `,1),nt=a(` `),X=a(`
          `);function rt(n,i){r(i,!0);let a=h(i,`reactionsDisabled`,3,!1),u=h(i,`mentionPeople`,19,()=>[]),d=h(i,`canDeleteAnyMessage`,3,!1),p=h(i,`deletingMessageIDs`,19,()=>new Set),m=h(i,`channelID`,3,``),g=h(i,`pinnedMessageIDs`,19,()=>new Set),b=h(i,`editScope`,3,``),x=h(i,`topics`,19,()=>[]),w=h(i,`onSelectTopic`,3,()=>{}),ee=j(()=>i.group.messages[0]?.author),te=j(()=>o(ee)?.kind===`bot`),D=j(()=>!o(te)&&!!i.currentUserID&&i.group.authorID===i.currentUserID);var O=X();let k;var ne=E(O);{let e=j(()=>i.group.authorDeleted?`avatar`:`avatar avatar-button`),t=j(()=>i.group.authorDeleted?void 0:`View profile for ${i.group.authorName}`);B(ne,{get class(){return o(e)},get id(){return i.group.authorID},get name(){return i.group.authorName},get src(){return i.group.authorAvatarURL},size:38,get buttonLabel(){return o(t)},onclick:()=>i.onOpenProfile(i.group.messages[0]?.author)})}var M=y(ne,2),N=E(M),P=E(N),F=e=>{var t=tt(),n=A(t),r=v(n,!0);T(2),S(()=>s(r,i.group.authorName)),l(e,t)},re=e=>{var n=Y(),r=A(n),a=v(r,!0),c=y(r,2),u=e=>{var t=J();l(e,t)};C(c,e=>{o(te)&&e(u)}),S(()=>s(a,i.group.authorName)),t(`click`,r,()=>i.onOpenProfile(i.group.messages[0]?.author)),l(e,n)};C(P,e=>{i.group.authorDeleted?e(F):e(re,-1)});var ie=y(P,2),ae=e=>{var t=nt(),n=v(t,!0);S(e=>s(n,e),[()=>z(i.group.authorHandle)]),l(e,t)};C(ie,e=>{i.group.authorHandle&&e(ae)});var oe=y(ie,2),se=v(oe,!0);e(N);var ce=y(N,2);c(ce,19,()=>i.group.messages,e=>e.id,(e,t,n)=>{{let r=j(()=>i.selectedThreadID===o(t).id),s=j(()=>p().has(o(t).id)),c=j(()=>g().has(o(t).id));et(e,{get message(){return o(t)},get index(){return o(n)},get previousMessage(){return i.group.messages[o(n)-1]},get nextMessage(){return i.group.messages[o(n)+1]},get selected(){return o(r)},get replyContext(){return i.replyContext},get selectedThreadID(){return i.selectedThreadID},get mentionPeople(){return u()},get mentionAttentionUserID(){return i.mentionAttentionUserID},get currentUserID(){return i.currentUserID},get reactionController(){return i.reactionController},get reactionsDisabled(){return a()},get canDeleteAnyMessage(){return d()},get deleting(){return o(s)},get editController(){return i.editController},get editScope(){return b()},get onMessageEdited(){return i.onMessageEdited},get onReply(){return i.onReply},get onOpenThread(){return i.onOpenThread},get onJumpToQuote(){return i.onJumpToQuote},get onOpenImage(){return i.onOpenImage},get onOpenArtifact(){return i.onOpenArtifact},get onRetry(){return i.onRetry},get onDiscard(){return i.onDiscard},get onDeleteMessage(){return i.onDeleteMessage},get topics(){return x()},get onSelectTopic(){return w()},get channelID(){return m()},get pinned(){return o(c)},get onTogglePin(){return i.onTogglePin},get onCopyLink(){return i.onCopyLink}})}}),e(M),e(O),S(e=>{k=_(O,1,`message-group`,null,k,{"is-agent":o(te),"is-self":o(D)}),s(se,e)},[()=>de(i.group.timestamp)]),l(n,O),f()}M([`click`]);var it=a(`
          Send a message in Markdown โ€” code fences, lists, links all work. Threads open from any message.
          `),at=a(`
          `),ot=a(`
          `),st=a(`
          New
          `),ct=a(`
          `),lt=a(`
          `),ut=a(`
          `);function dt(n,a){r(a,!0);let c=h(a,`loading`,3,!1),d=h(a,`unreadCount`,3,0),p=h(a,`unreadBoundarySeq`,3,0),ee=h(a,`unreadBoundaryLoaded`,3,!1),O=h(a,`unreadSince`,3,``),ne=h(a,`hasOlder`,3,!1),M=h(a,`hasNewer`,3,!1),N=h(a,`loadingOlder`,3,!1),F=h(a,`loadingNewer`,3,!1),re=h(a,`prepending`,3,!1),ie=h(a,`mentionPeople`,19,()=>[]),ae=h(a,`reactionsDisabled`,3,!1),oe=h(a,`canDeleteAnyMessage`,3,!1),se=h(a,`deletingMessageIDs`,19,()=>new Set),ce=h(a,`channelID`,3,``),le=h(a,`pinnedMessageIDs`,19,()=>new Set),de=h(a,`editScope`,3,``),fe=h(a,`topics`,19,()=>[]),pe=h(a,`onSelectTopic`,3,()=>{}),me=1.5,I=b(void 0),L=b(void 0),he=b(void 0),R=b(0),ge=b(0),_e=j(()=>a.selectedDirect?`dm`:`channel`),ve=b(``),z=b(-1),be=b(0),B=j(()=>o(ve)===a.viewKey&&o(z)===p()&&d()<=o(be)?0:d()),Ce=b(``),V=b(0),H=b(!1),U,we=j(()=>o(B)>0?o(B):o(V));function Te(){U&&=(window.clearTimeout(U),void 0)}g(()=>{if(o(Ce)&&o(Ce)!==a.viewKey){Te(),x(V,0),x(Ce,``),x(H,!1);return}if(o(B)>0){Te(),x(Ce,a.viewKey,!0),x(V,o(B),!0),x(H,!1);return}o(V)>0&&!o(H)&&(x(H,!0),U=window.setTimeout(()=>{U=void 0,!(o(B)>0)&&(x(V,0),x(Ce,``),x(H,!1))},180))}),te(Te);let W=j(()=>{let e=p()+1;if(o(we)<=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}),Ee=j(()=>ee()&&o(W)),De=j(()=>{let e=[],t=!1,n=e=>!o(Ee)||e.parent_message_id||e.author?.id===a.currentUserID||e.author_id===a.currentUserID?!1:o(we)>0&&(e.channel_seq||0)>p();for(let r of P(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(``)),ke=b(!0),K=b(!1),Ae,je=0,Me=``,Ne=``,Pe,Fe=b(void 0),Ie=0,Le=!1,Re=!1,ze=!1,Be=!1,Ve=0,He=0;function Ue(e=!0){return e&&(Le=!1,x(K,!0)),He+=1,He}function q(e,t){return dt(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(!o(I))return 0;let e=o(I).getScrollSize()+o(R);return Math.max(0,e-o(I).getScrollOffset()-o(I).getViewportSize())}function Ke(){return!o(I)||Ge()<=me}function qe(e=me){return!o(I)||Ge()<=e}function Je(){if(!o(I))return{atBottom:!0,nearOlder:!1,nearNewer:!1};let e=Ge();return{atBottom:Ke(),nearOlder:o(I).getScrollOffset()-o(R)<=160,nearNewer:e<=260}}function Ye(){a.onHistorySettled?.(Je())}function Xe(e=!1){M()||!e&&o(B)>0||a.onReachedBottom?.()}g(()=>{if(F()){Be=!0;return}Be&&(Be=!1,ze=!1)});async function Ze(){!o(I)||o(De).length===0||(G=!M(),await Qe(Ue()))}async function Qe(e=Ue()){if(!o(I)||!o(L)||o(De).length===0)return;let t=a.viewKey;document.activeElement===o(L)&&o(L).blur();let n=-1;for(let r=0;r<6;r+=1){if(await m(),!o(I)||!o(L)||!q(t,e)||(G=!M(),We(2),o(L).scrollTop=o(L).scrollHeight,await X(),!o(I)||!q(t,e)))return;let r=o(I).getScrollSize(),i=n>=0&&Math.abs(r-n)<=me;if(n=r,i&&Ke())break}x(K,!0),G=!M(),Ke()&&(x(ke,!0),Xe(!0)),Ye()}g(()=>{if(!o(L))return;let e=o(L),t=()=>{let e=Ue();Re=!1,Z(a.viewKey,e)},n=e=>{e.defaultPrevented||e.ctrlKey||e.deltaY===0||(t(),e.deltaY>0&&M()&&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()},s=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`,s),()=>{e.removeEventListener(`wheel`,n),e.removeEventListener(`keydown`,r),e.removeEventListener(`touchmove`,i),e.removeEventListener(`pointerdown`,s)}});function $e(e){return o(De).findIndex(t=>t.kind===`group`&&t.group.messages.some(t=>t.id===e))}let et=j(()=>{if(!ne()||c()||!re())return 0;let e=Math.max(o(ge),480);return Math.max(4,Math.ceil(e/52))});g(()=>{if(!o(L))return;let e=()=>{o(L)&&x(ge,o(L).clientHeight,!0)};e();let t=new ResizeObserver(e);return t.observe(o(L)),()=>t.disconnect()});let tt=0;g(()=>{if(!o(he)||!o(L)){x(R,0),tt=0;return}let e=o(he),t=()=>{let t=e.offsetHeight,n=tt;if(x(R,t,!0),tt=t,n>0&&t!==n){let e=t-n;o(L)&&o(L).scrollTop>0&&(o(L).scrollTop+=e)}};t();let n=new ResizeObserver(t);return n.observe(e),()=>{n.disconnect(),x(R,0),tt=0}});function J(){return o(De).findIndex(e=>e.kind===`divider`)}function Y(){let e=0;for(let t of a.messages)e=Math.max(e,t.channel_seq||0);return e}function nt(){x(ve,a.viewKey,!0),x(z,p()),x(be,d()),a.onMarkRead?.(Y())}function X(){return new Promise(e=>requestAnimationFrame(()=>e()))}function dt(e){return e===a.viewKey&&e===Ae}async function ft(e,t,n,r,i=0){We(3);for(let a=0;a<24;a++){if(!q(e,t)||!o(I)||!o(L))return!1;let a=o(L).querySelector(r);if(a){let e=a.getBoundingClientRect().top-o(L).getBoundingClientRect().top-i;if(Math.abs(e)<=me)return!0;o(L).scrollTop+=e}else{let e=n();if(e<0)return!1;o(L).scrollTop=o(R)+o(I).getItemOffset(e)}await X()}return!1}function pt(e,t,n){if(!o(I)||e()<0)return!1;G=!1;let r=a.viewKey,i=Ue();return ft(r,i,e,t).then(async a=>{q(r,i)&&(Ye(),await m(),q(r,i)&&(a&&=await ft(r,i,e,t),!a&&q(r,i)&&n?.()))}),!0}function mt(e){return pt(()=>$e(e),`[data-message-id="${CSS.escape(e)}"]`)}function ht(e=!0){return pt(J,`[data-unread-divider='true']`,e?a.onJumpToUnread:void 0)}function gt(){if(!(o(Ee)&&ht(!1))&&a.onJumpToUnread){a.onJumpToUnread();return}}function _t(){if(!o(I)||!o(L))return null;if(x(Fe,{atBottom:Ke()},!0),Ie=He,!o(Fe).atBottom){let e=o(L).getBoundingClientRect().top;for(let t of o(L).querySelectorAll(`[data-message-id]`)){let n=t.getBoundingClientRect();if(!(n.bottom<=e)){o(Fe).anchorMessageID=t.dataset.messageId,o(Fe).anchorPixelOffset=n.top-e;break}}}return o(Fe)}g(()=>(a.onListRef({scrollToBottom:Ze,scrollToMessage:mt,scrollToDivider:ht,captureState:_t,isFollowing:()=>G,isNearBottom:e=>qe(e)}),()=>a.onListRef(null))),g(()=>{let e=a.viewKey,t=o(De).length,n=o(Oe),r=a.messages.at(-1)?.id||``,i=r!==Me;if(Me=r,e!==Ae){Ae=e,je=t,Ne=n,Pe=a.restoreState,x(Fe,void 0),G=!0,x(ke,!0),x(K,!1),ze=!1,Le=!0,vt(e,a.restoreState,!0);return}let s=a.restoreState,c=s&&s!==Pe;if(c){let r=s===o(Fe)&&Ie!==He;if(x(Fe,void 0),Pe=s,!r&&(s.atBottom||s.anchorMessageID)){je=t,Ne=n,Le=!0,vt(e,s,s.atBottom);return}r&&!G&&o(I)&&yt(o(I).getScrollOffset())}let l=c||t!==je||i||n!==Ne;l&&G&&!M()&&!Le?Qe():l&&!Le&&Z(e),je=t,Ne=n});async function Z(e,t=He){await m(),await X(),q(e,t)&&Ye()}async function vt(e,t,n){let r=Ue(!1),i=t&&!t.atBottom?t.anchorMessageID:void 0,a=i?()=>ft(e,r,()=>$e(i),`[data-message-id="${CSS.escape(i)}"]`,t?.anchorPixelOffset??0):void 0,s=!1;if(await m(),await X(),q(e,r)){if(a){let t=await a();if(!q(e,r))return;!t&&n?await Qe(r):G=!1}else o(De).findIndex(e=>e.kind===`divider`)>=0&&o(I)?(s=!0,await ft(e,r,()=>J(),`[data-unread-divider='true']`),G=!1):await Qe(r);await X(),q(e,r)&&(Le=!1,x(K,!0),x(ke,Ke(),!0),G=o(ke)&&!M(),s||(o(ke)&&Xe(),o(I)&&yt(o(I).getScrollOffset())),Ye(),a&&(await m(),q(e,r)&&await a()))}}function yt(e){if(!o(I)||Le&&!o(K))return;let t=Ge(),n=Ke(),r=n||t<=260;G=n&&!M(),x(ke,n,!0),M()||(ze=!1),!n&&ne()&&e-o(R)<=160&&a.onLoadOlder?.(),!Re&&M()&&r&&!ze&&(ze=!0,a.onLoadNewer?.(`scroll`)),n&&!Re&&Xe()}var bt=ut();let xt;var St=E(bt),Q=t=>{var n=it(),r=E(n),i=E(r),o=e=>{var t=u(`@`);l(e,t)},c=e=>{var t=u(`#`);l(e,t)};C(i,e=>{a.selectedDirect?e(o):e(c,-1)}),e(r);var d=y(r,2),f=E(d),p=e=>{var t=u();S(e=>s(t,`This is the start of your conversation with ${e??``}.`),[()=>ye(a.selectedDirect,a.currentUserID)]),l(e,t)},m=e=>{var t=u();S(e=>s(t,`Welcome to #${e??``}!`),[()=>xe(a.selectedChannel)]),l(e,t)},h=e=>{var t=u(`Pick a channel to get started.`);l(e,t)};C(f,e=>{a.selectedDirect?e(p):a.selectedChannel?e(m,1):e(h,-1)}),e(d),T(2),e(n),l(t,n)},Ct=t=>{var n=ct(),r=y(E(n),2),u=t=>{var n=at(),r=E(n);ue(r,{direction:`older`,get rows(){return o(et)}}),e(n),k(n,e=>x(he,e),()=>o(he)),S(()=>D(n,`aria-hidden`,N()?`false`:`true`)),l(t,n)};C(r,e=>{o(et)>0&&e(u)});var d=y(r,2);k(Se(d,{get data(){return o(De)},getKey:e=>e.id,itemProps:()=>c()||!o(K)?void 0:{style:{"pointer-events":`auto`}},get scrollRef(){return o(L)},get shift(){return re()},get startMargin(){return o(R)},onscroll:yt,children:(t,n=w,r=w)=>{var c=i(),u=A(c),d=e=>{ue(e,{get direction(){return n().direction},get rows(){return n().rows}})},f=t=>{var r=ot(),i=E(r),a=v(i,!0);e(r),S(()=>s(a,n().label)),l(t,r)},p=e=>{var t=st();let n;S(()=>n=_(t,1,`new-messages-divider`,null,n,{"is-clearing":o(H)})),l(e,t)},m=e=>{rt(e,{get group(){return n().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 o(_e)},get canDeleteAnyMessage(){return oe()},get deletingMessageIDs(){return se()},get editController(){return a.editController},get editScope(){return de()},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}})};C(u,e=>{n().kind===`loader`?e(d):n().kind===`day`?e(f,1):n().kind===`divider`?e(p,2):n().kind===`group`&&e(m,3)}),l(t,c)},$$slots:{default:!0}}),e=>x(I,e,!0),()=>o(I)),e(n),k(n,e=>x(L,e),()=>o(L)),l(t,n)};C(St,e=>{!c()&&a.messages.length===0?e(Q):a.messages.length>0&&e(Ct,1)});var wt=y(St,2),Tt=n=>{var r=lt();let i;var a=E(r),c=E(a),u=v(c);e(a);var d=y(a,2);e(r),S(e=>{i=_(r,1,`unread-bar`,null,i,{"is-clearing":o(H)}),D(r,`aria-hidden`,o(H)?`true`:void 0),a.disabled=o(H),D(a,`aria-label`,e),s(u,`${(o(V)>99?`99+`:o(V))??``} new message${o(V)===1?``:`s`}${O()?` since ${O()}`:``}`),d.disabled=o(H)},[()=>`Jump to ${o(V)>0?o(V):``} new message${o(V)===1?``:`s`}`.replace(/ +/g,` `)]),t(`click`,a,gt),t(`click`,d,nt),l(n,r)};C(wt,e=>{!c()&&a.messages.length>0&&o(V)>0&&e(Tt)}),e(bt),S(()=>xt=_(bt,1,`messages`,null,xt,{"is-revealing":c()||!o(K)&&a.messages.length>0})),t(`pointerdown`,bt,function(...e){a.onActivateMessageComposer?.apply(this,e)}),t(`pointerup`,bt,function(...e){a.onInlineImagePointerUp?.apply(this,e)}),l(n,bt),f()}M([`pointerdown`,`pointerup`,`click`]);var ft=a(` `),pt=a(` `),mt=a(``),ht=a(`
          `),gt=a(``),_t=a(`
          User kind
          `),Z=a(`

          `),vt=a(`

          Blocked.

          `),yt=a(``),bt=a(``),xt=a(``),St=a(``),Q=a(`
          Moderation
          `),Ct=a(`

          Profile

          Active
          Contact information
          Handle
          User ID
          About

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

          `),vt=a(`

          Blocked.

          `),yt=a(``),bt=a(``),xt=a(``),St=a(``),Q=a(`
          Moderation
          `),Ct=a(`

          Profile

          Active
          Contact information
          Handle
          User ID
          About

          `,1);function wt(n,i){r(i,!0);let a=h(i,`messagePending`,3,!1),c=h(i,`messageError`,3,``),u=j(()=>i.profile.kind===`bot`?i.profile.owner_user_id?`Bot of ${i.profile.owner_user_id}`:`Service bot`:``),d=j(()=>i.moderation?.role||`member`),p=j(()=>!!i.moderation&&o(d)!==`owner`&&(i.currentUserRole===`owner`||i.currentUserRole===`moderator`&&(o(d)===`member`||o(d)===`guest`))),m=j(()=>i.currentUser?.id!==i.profile.id&&o(p)),g=j(()=>!!i.moderation?.blocked_at),_=j(()=>o(d));var b=Ct(),x=A(b),w=E(x),ee=y(E(w),2),T=v(ee,!0);e(w);var te=y(w,2);e(x);var D=y(x,2),O=E(D),k=E(O);B(k,{class:`profile-avatar`,get id(){return i.profile.id},get name(){return i.profile.display_name},get src(){return i.profile.avatar_url},size:240,loading:`eager`,fetchPriority:`auto`}),e(O);var M=y(O,2),N=E(M),P=E(N),F=E(P),re=v(F,!0),ie=y(F,2),ae=e=>{var t=ft(),n=v(t,!0);S(()=>s(n,o(u))),l(e,t)};C(ie,e=>{o(u)&&e(ae)});var oe=y(ie,2),se=e=>{var t=pt(),n=v(t,!0);S(e=>s(n,e),[()=>z(i.profile.handle)]),l(e,t)};C(oe,e=>{i.profile.handle&&e(se)}),e(P);var ce=y(P,2),le=e=>{var n=mt();t(`click`,n,function(...e){i.onEdit?.apply(this,e)}),l(e,n)};C(ce,e=>{i.currentUser?.id===i.profile.id&&i.onEdit&&e(le)}),e(N);var ue=y(N,4),de=n=>{var r=ht(),o=E(r),c=v(o,!0);e(r),S(()=>{o.disabled=a(),s(c,a()?`Startingโ€ฆ`:`Message`)}),t(`click`,o,()=>i.onMessage?.(i.profile.id)),l(n,r)};C(ue,e=>{i.currentUser?.id!==i.profile.id&&i.onMessage&&e(de)});var fe=y(ue,2),pe=e=>{var t=gt(),n=v(t,!0);S(()=>s(n,c())),l(e,t)};C(fe,e=>{c()&&e(pe)});var me=y(fe,2),I=E(me),L=y(E(I),2),he=e=>{var n=mt();t(`click`,n,function(...e){i.onEdit?.apply(this,e)}),l(e,n)};C(L,e=>{i.currentUser?.id===i.profile.id&&i.onEdit&&e(he)}),e(I);var R=y(I,2),ge=y(E(R),2),_e=y(E(ge),2),ve=v(_e,!0);e(ge),e(R);var ye=y(R,2),xe=y(E(ye),2),Se=y(E(xe),2),Ce=v(Se,!0);e(xe),e(ye);var V=y(ye,2),H=t=>{var n=_t(),r=y(E(n),2),i=y(E(r),2),a=v(i,!0);e(r),e(n),S(()=>s(a,o(u))),l(t,n)};C(V,e=>{i.profile.kind===`bot`&&e(H)}),e(me);var U=y(me,2),we=y(E(U),2),Te=v(we);e(U);var W=y(U,2),Ee=n=>{var r=Q(),a=E(r),c=y(E(a),2),u=v(c,!0);e(a);var d=y(a,2),f=e=>{var t=Z(),n=v(t);S(()=>s(n,`${i.moderation.posts_remaining??``} of ${i.moderation.post_limit??``} waiting-room posts left today.`)),l(e,t)};C(d,e=>{i.moderation.role===`guest`&&i.moderation.post_limit>0&&e(f)});var p=y(d,2),m=e=>{var t=Z(),n=v(t);S(e=>s(n,`Timed out until ${e??``}.`),[()=>new Date(i.moderation.timeout_until).toLocaleString()]),l(e,t)};C(p,e=>{i.moderation.timeout_until&&e(m)});var h=y(p,2),b=e=>{var t=vt();l(e,t)};C(h,e=>{i.moderation.blocked_at&&e(b)});var x=y(h,2),w=E(x),ee=e=>{var n=yt();t(`click`,n,()=>i.onApprove?.(i.profile.id)),l(e,n)};C(w,e=>{i.moderation.role===`guest`&&i.onApprove&&e(ee)});var T=y(w,2),te=e=>{var n=bt();t(`click`,n,()=>i.onTimeout?.(i.profile.id)),l(e,n)};C(T,e=>{i.onTimeout&&e(te)});var D=y(T,2),O=e=>{var n=xt();t(`click`,n,()=>i.onUnblock?.(i.profile.id)),l(e,n)},k=e=>{var n=St();t(`click`,n,()=>i.onBlock?.(i.profile.id)),l(e,n)};C(D,e=>{o(g)&&i.onUnblock?e(O):!o(g)&&i.onBlock&&e(k,1)}),e(x),e(r),S(()=>s(u,o(_))),l(n,r)};C(W,e=>{o(m)&&i.moderation&&e(Ee)}),e(M),e(D),S((e,t)=>{s(T,i.profile.display_name),ne(O,`--hue: ${e??``}deg`),s(re,i.profile.display_name),s(ve,t),s(Ce,i.profile.id),s(Te,`Member of ${(i.workspaceName||`this workspace`)??``}.`)},[()=>be(i.profile.id),()=>i.profile.handle?z(i.profile.handle):`No handle set`]),t(`click`,te,function(...e){i.onClose?.apply(this,e)}),l(n,b),f()}M([`click`]);export{Ce as i,dt as n,Ne as r,wt as t}; \ No newline at end of file diff --git a/apps/api/internal/webassets/dist/_app/immutable/chunks/TM-oTWC2.js b/apps/api/internal/webassets/dist/_app/immutable/chunks/TM-oTWC2.js deleted file mode 100644 index f50c14fb..00000000 --- a/apps/api/internal/webassets/dist/_app/immutable/chunks/TM-oTWC2.js +++ /dev/null @@ -1,4 +0,0 @@ -const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./DhPY4Pzy.js","./uBIymjUX.js"])))=>i.map(i=>d[i]); -import{t as e}from"./DK3Fl9T5.js";import{At as t,B as n,C as r,D as i,E as a,Et as o,F as s,G as c,I as l,K as u,N as d,O as f,P as p,R as m,S as h,St as g,Tt as _,V as v,X as y,Z as b,_ as x,a as S,at as C,b as w,c as T,ct as E,dt as D,f as O,ft as k,gt as A,h as j,ht as M,it as N,j as P,jt as F,k as ee,kt as te,lt as I,m as L,mt as R,n as ne,nt as re,o as ie,p as z,pt as B,r as ae,s as oe,tt as V,u as se,ut as ce,v as le,vt as H,xt as ue,yt as U,z as W}from"./CxKeDCcw.js";import{c as de,n as fe,t as pe}from"./ChC1oWd7.js";import{t as me}from"./uBIymjUX.js";import"./xihTtKlq.js";import"./qQG-ipvL.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,t as Le}from"./Qo16U5GS.js";import{t as Re}from"./OQjxVT6U.js";import"./CYM1xkwL.js";import{C as q,D as ze,E as Be,I as Ve,L as He,R as Ue,S as We,T as Ge,_ as Ke,b as qe,f as Je,g as J,h as Ye,j as Xe,k as Ze,m as Y,p as Qe,r as X,u as Z,v as Q,w as $e,x as et,y as tt}from"./BqBbEnKW.js";import{a as nt,c as rt,f as it,i as at,l as ot,o as st,p as ct,s as lt,t as ut,u as dt}from"./C7NZ0SeM.js";import{i as ft,n as pt,r as mt,t as ht}from"./CyT438p0.js";import{n as gt,t as _t}from"./DlGnnCJo.js";import{n as vt,r as yt,t as bt}from"./Cht-DoaS.js";import{p as xt,r as St}from"./CVdgRPye.js";import{r as Ct,t as wt}from"./BIhzYFGW.js";var Tt={url:`/`,label:`cc`};function Et(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 Dt(e){if(!e||typeof e!=`object`)return Tt;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&&Et(r)?r:Tt.url,label:i&&Array.from(i).length<=32?i:Tt.label}}function Ot(e){return e===Tt.label}function kt(e){return Ot(e.label)?`ClickClack home`:`${e.label} home`}async function At(e){try{return Dt(await e(`/api/home-link`))}catch{return Tt}}var jt=`clickclack:browser-notifications-enabled:v1:`;function Mt(e){return`${jt}${e}`}function Nt(e){if(!e)return!1;try{return window.localStorage.getItem(Mt(e))===`enabled`}catch{return!1}}function Pt(e,t){if(!e)return!1;try{return t?window.localStorage.setItem(Mt(e),`enabled`):window.localStorage.removeItem(Mt(e)),!0}catch{return!1}}var Ft=typeof window>`u`?void 0:window.clickclackDesktop;function It(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 Lt=new Set([`agent_commentary`,`agent_tool`]),Rt=18e4;function zt(e){return e.kind!==void 0&&Lt.has(e.kind)}function Bt(e){return e.kind===void 0||e.kind===`message`}function Vt(e){return e.author?.id||e.author_id||``}function Ht(e){return`${e.channel_id?`channel:${e.channel_id}`:`direct:${e.direct_conversation_id||``}`}\u0000${Vt(e)}\u0000${e.turn_id||e.id}`}function Ut(e){let t=e.trim(),n=``,r=``,i=t.match(/^\*\*([^*]+)\*\*\s*\n+([\s\S]+)$/),a=t.match(/^\*\*([^*]+)\*\*$/);if(i)n=i[1].trim(),r=Gt(i[2]);else if(a)n=a[1].trim();else return Wt(t.replace(/\*\*/g,``).trim(),``);return Wt(n,r)}function Wt(e,t){let n=Gt(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 Gt(e){return e.replace(/\s+/g,` `).trim()}function Kt(e,t,n,r){let i=[];for(let e of t)if(e.kind===`agent_tool`){if(r.hideToolCalls)continue;let t=Ut(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 qt(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>Rt&&(r=!0)}a.set(t,r)}let o=[];for(let n=0;n=gn)&&(_n.active=!0,_n.lastPingAt=t,bn(e,`typing.started`)),_n.idleTimer&&window.clearTimeout(_n.idleTimer),_n.idleTimer=window.setTimeout(()=>{_n&&=(Sn(_n),null)},hn)}async function Sn(e){e.idleTimer&&window.clearTimeout(e.idleTimer),e.active&&await bn(e.scope,`typing.stopped`)}function Cn(){_n&&=(Sn(_n),null)}var wn=2e3,Tn=2097152;function En(e){let t=document.createElement(`span`);return t.textContent=e,t.innerHTML}function Dn(e,t,n){return!t||e.length>262144?Promise.resolve(En(e)):new Promise((r,i)=>{let a=new Worker(new URL(new URL(`../workers/highlight.worker-B65U9hWZ.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(En(e))),wn);if(a.onmessage=t=>{let n=t.data;`error`in n?s(()=>r(En(e))):s(()=>r(n.html))},a.onerror=()=>s(()=>r(En(e))),n.addEventListener(`abort`,c,{once:!0}),n.aborted){c();return}a.postMessage({source:e,language:t,outputLimit:Tn})})}var On=5e3;function kn(e,t,n){return new Promise((r,i)=>{let a=new Worker(new URL(new URL(`../workers/office.worker-BdyMEpKK.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.`))),On);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 An=16777216,jn=1e4,Mn=1e4,Nn=`This PDF page is too large to preview safely. Download the original to open it locally.`;function Pn(e,t){if(!Number.isSafeInteger(e)||!Number.isSafeInteger(t)||e<1||t<1||e>8192||t>8192||e*t>16777216)throw Error(Nn)}var Fn=new URL(`../assets/pdf.worker.TGcf_-kp.mjs`,import.meta.url).href,In=l(`
          `),Ln=l(`

          Preparing a safe preview.

          `),Rn=l(``),zn=l(`
          No preview for this file type

          You can still download the original file.

          Download original
          `),Bn=l(`
          `,1),Vn=l(` `),Hn=l(` `),Un=l(` `),Wn=l(` `),Gn=l(`

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

          `),Kn=l(``),qn=l(`
          Raw cached values; number and date formatting omitted
          `,1),Jn=l(`

          `),Yn=l(`

          `),Xn=l(`

          `),Zn=l(`

          Some slide content was omitted by preview limits.

          `),Qn=l(`

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

          `,1),$n=l(`
          `),er=l(`
          `),tr=l(`
          `),nr=l(`
           
          `),rr=l(`
          `,1);function ir(e,r){o(r,!0);let a=A(null),c=U(()=>tt(r.upload)),l=A(`preview`),m=A(`idle`),h=A(``),g=A(``),v=A(``),y=A(!1),b=A(``),x=A(null),S=A(1),T=A(1),E=A(!1),O=A(``),j=null,F=!1,L=A(null),R=A(0),re=A(null),ie=A(0),B=1e4,ae=65536,V=5e3;class se extends Error{}let le=U(()=>J(u(c))),H=U(()=>q(r.upload)),ue=U(()=>(u(c)===`markdown`||u(c)===`html`)&&u(m)===`ready`&&u(y));function W(e){return`This ${u(le).toLowerCase()} is ${We(r.upload.byte_size)}. Preview is limited to ${We(e)}.`}function de(e){pe(e);let t=document.createElement(`template`);t.innerHTML=e;let n=qe.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=Y(e);return he(t),qe.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>B))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>B*2)throw new se(`Rendered preview exceeded the safe element limit.`)}function ge(e){return`Preview data exceeded the ${We(e)} safety limit.`}async function _e(e,t){let n=await fetch(u(H),{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){j?.(),j=null,M(x,null),M(g,``),M(v,``),M(y,!1),M(b,``),M(S,1),M(T,1),M(O,``),F=!1,M(L,null),M(R,0),M(re,null),M(ie,0),M(l,`preview`),M(h,``);let t=Q(u(c));if(t!==void 0&&r.upload.byte_size>t){M(m,`error`),M(h,W(t),!0);return}if(u(c)===`unsupported`){M(m,`ready`);return}M(m,`loading`);try{if(u(c)===`pdf`){let n=await me(()=>import(`./DhPY4Pzy.js`),__vite__mapDeps([0,1]),import.meta.url);if(e.aborted)return;n.GlobalWorkerOptions.workerSrc=Fn;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.`))},jn)}),c;try{if(c=await Promise.race([_e(r.signal,t),s]),e.aborted)throw new DOMException(`Aborted`,`AbortError`);a=new n.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.`&&(F=!0,j?.(),M(m,`error`),M(h,`PDF page content could not be rendered completely within safety limits.`))};l.addEventListener(`message`,u);let d=null,f=!1;j=()=>{f||(f=!0,l.removeEventListener(`message`,u),d&&d.destroy(),a.destroy(),M(x,null))};let p=n.getDocument({data:c,maxImageSize:An,canvasMaxAreaInBytes:An*4,stopAtErrors:!0,worker:a});d=p;try{M(x,await Promise.race([p.promise,s]),!0)}finally{clearTimeout(o),e.removeEventListener(`abort`,i)}}else if(u(c)===`spreadsheet`||u(c)===`presentation`){let n=await _e(e,t);if(e.aborted)return;if(u(c)===`spreadsheet`){let t=await kn(u(c),n,e);if(e.aborted)return;M(L,t,!0)}else{let t=await kn(u(c),n,e);if(e.aborted)return;M(re,t,!0)}}else{if(M(g,await ve(e,t),!0),e.aborted)return;u(c)===`code`&&M(b,await Dn(u(g),Ke(r.upload),e),!0);try{u(c)===`markdown`&&(M(v,fe(u(g)),!0),M(y,!0)),u(c)===`html`&&(M(v,de(u(g)),!0),M(y,!0))}catch(e){if(!(e instanceof se))throw e;M(v,``),M(l,`source`)}}e.aborted||M(m,`ready`)}catch(t){if(e.aborted||t instanceof Error&&t.name===`AbortError`)return;j?.(),j=null,M(m,`error`),M(h,t instanceof Error?t.message:`Could not preview this artifact.`,!0)}}C(()=>{let e=new AbortController;return G(e.signal),()=>e.abort()}),C(()=>{if(u(c)!==`pdf`||!u(x)||!u(a)||u(m)!==`ready`)return;let e=u(x),t=u(S),n=u(T),r=!1,i=null,o=null,s=null,l=0;return M(E,!0),M(O,``),(async()=>{try{if(l=window.setTimeout(()=>{r||(i?.cancel(),s?.cancel(),j?.(),M(m,`error`),M(h,`PDF page rendering took too long and was stopped.`))},Mn),o=await e.getPage(t),r||!u(a))return;let c=``,d=0;s=o.streamTextContent().getReader();try{for(;!r;){let{done:e,value:t}=await s.read();if(e)break;for(let e of t.items){if(d+=1,d>V){await s.cancel(),c=`${c}โ€ฆ`;break}if(!(`str`in e)||!e.str)continue;let t=`${c}${c?` `:``}${e.str}`;if(t.length>ae){await s.cancel(),c=`${t.slice(0,ae)}โ€ฆ`;break}c=t}if(d>V||c.endsWith(`โ€ฆ`))break}}finally{s.releaseLock(),s=null}if(r)return;M(O,c||`This page has no extractable text.`,!0);let f=o.getViewport({scale:n}),p=Math.min(window.devicePixelRatio||1,2),g=Math.max(1,Math.floor(f.width*p)),_=Math.max(1,Math.floor(f.height*p));Pn(g,_);let v=u(a).getContext(`2d`);if(!v)throw Error(`PDF canvas is unavailable.`);if(u(a).width=g,u(a).height=_,u(a).style.width=`${f.width}px`,u(a).style.height=`${f.height}px`,v.setTransform(p,0,0,p,0,0),i=o.render({canvasContext:v,viewport:f}),await i.promise,F)throw Error(`PDF page content could not be rendered completely within safety limits.`)}catch(e){!r&&!(e instanceof Error&&e.name===`RenderingCancelledException`)&&(j?.(),M(m,`error`),M(h,e instanceof Error?e.message:`Could not render this PDF page.`,!0))}finally{clearTimeout(l),o?.cleanup(),o=null,r||M(E,!1)}})(),()=>{r=!0,clearTimeout(l),i?.cancel(),s?.cancel()}}),ne(()=>j?.());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=U(()=>{let e=u(L)?.sheets[u(R)];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=rr(),we=ce(Ce),Te=I(we),Ee=I(Te),De=D(Ee,!0),Oe=k(Ee,2),ke=D(Oe,!0),Ae=k(Oe,2),je=D(Ae,!0);t(Te);var Me=k(Te,2),Ne=I(Me),Pe=e=>{var r=In(),i=I(r);let a;var o=k(i,2);let s;t(r),N(()=>{z(r,`aria-label`,`${u(le)} view`),z(i,`aria-pressed`,u(l)===`preview`),a=w(i,1,``,null,a,{active:u(l)===`preview`}),z(o,`aria-pressed`,u(l)===`source`),s=w(o,1,``,null,s,{active:u(l)===`source`})}),n(`click`,i,()=>M(l,`preview`)),n(`click`,o,()=>M(l,`source`)),p(e,r)};P(Ne,e=>{u(ue)&&e(Pe)});var Fe=k(Ne,2),K=k(Fe,2);t(Me),t(we);var Ie=k(we,2);let Le;var Re=I(Ie),ze=e=>{var n=Ln(),r=k(I(n),2),i=D(r);te(2),t(n),N(e=>d(i,`Opening ${e??``}`),[()=>u(le).toLowerCase()]),p(e,n)},Be=e=>{var n=Rn(),i=k(I(n),4),a=D(i,!0),o=k(i,2);t(n),N(()=>{d(a,u(h)),z(o,`href`,u(H)),z(o,`download`,r.upload.filename)}),p(e,n)},Ve=e=>{var n=zn(),i=k(I(n),6);t(n),N(()=>{z(i,`href`,u(H)),z(i,`download`,r.upload.filename)}),p(e,n)},He=e=>{var r=Bn(),i=ce(r),o=I(i),s=k(o,2),c=D(s),l=k(s,2),f=k(l,4),m=k(f,2),h=D(m),g=k(m,2);t(i);var _=k(i,2);let v;var y=I(_);oe(y,e=>M(a,e),()=>u(a));var b=k(y,2),C=D(b,!0);t(_),N(e=>{o.disabled=u(S)<=1||u(E),d(c,`Page ${u(S)??``} of ${u(x).numPages??``}`),l.disabled=u(S)>=u(x).numPages||u(E),f.disabled=u(T)<=.6||u(E),d(h,`${e??``}%`),g.disabled=u(T)>=2||u(E),v=w(_,1,`artifact-viewer__pdf-stage`,null,v,{"is-rendering":u(E)}),z(_,`aria-label`,`PDF page ${u(S)} visual preview`),z(b,`aria-label`,`PDF page ${u(S)} text`),d(C,u(O))},[()=>Math.round(u(T)*100)]),n(`click`,o,()=>M(S,u(S)-1)),n(`click`,l,()=>M(S,u(S)+1)),n(`click`,f,()=>M(T,Math.max(.6,u(T)-.2),!0)),n(`click`,g,()=>M(T,Math.min(2,u(T)+.2),!0)),p(e,r)},Ue=e=>{var r=qn(),i=ce(r),a=I(i),o=D(a),s=k(a,4),c=e=>{var t=Vn(),n=D(t);N(()=>d(n,`${u(L).hiddenSheets??``} hidden ${u(L).hiddenSheets===1?`sheet`:`sheets`} omitted`)),p(e,t)};P(s,e=>{u(L).hiddenSheets>0&&e(c)});var l=k(s,2),m=e=>{var t=Vn(),n=D(t);N(()=>d(n,`${u(L).unsupportedSheets??``} non-worksheet ${u(L).unsupportedSheets===1?`sheet`:`sheets`} omitted`)),p(e,t)};P(l,e=>{u(L).unsupportedSheets>0&&e(m)}),t(i);var h=k(i,2),g=I(h),_=I(g),v=I(_),y=k(I(v));f(y,17,()=>u(Se).columns,ee,(e,t)=>{var n=Hn(),r=D(n,!0);N(()=>d(r,u(t))),p(e,n)}),t(v),t(_);var b=k(_);f(b,21,()=>u(Se).rows,ee,(e,n)=>{var r=Wn(),i=I(r),a=D(i,!0),o=k(i);f(o,17,()=>u(n).values,ee,(e,t)=>{var n=Un(),r=D(n,!0);N(()=>d(r,u(t))),p(e,n)}),t(r),N(()=>d(a,u(n).number)),p(e,r)}),t(b),t(g);var x=k(g,2),S=e=>{var t=Gn();p(e,t)};P(x,e=>{(u(Se).clipped||u(L).sheets[u(R)].truncated)&&e(S)}),t(h);var C=k(h,2);f(C,21,()=>u(L).sheets,ee,(e,t,r)=>{var i=Kn();let a;var o=D(i,!0);N(()=>{z(i,`aria-selected`,u(R)===r),a=w(i,1,``,null,a,{active:u(R)===r}),d(o,u(t).name)}),n(`click`,i,()=>M(R,r,!0)),p(e,i)}),t(C),N(()=>{d(o,`${u(L).sheets.length??``} ${u(L).sheets.length===1?`sheet`:`sheets`}`),z(h,`aria-label`,`${u(L).sheets[u(R)].name} worksheet`)}),p(e,r)},Ge=e=>{var r=Qn(),i=ce(r),a=I(i),o=k(a,2),c=D(o),l=k(o,2);t(i);var m=k(i,2),h=I(m);f(h,21,()=>u(re).slides[u(ie)].paragraphs,ee,(e,t,n)=>{var r=s(),i=ce(r),a=e=>{var n=Jn(),r=D(n,!0);N(()=>d(r,u(t))),p(e,n)},o=e=>{var n=Yn(),r=D(n,!0);N(()=>d(r,u(t))),p(e,n)};P(i,e=>{n===0?e(a):e(o,-1)}),p(e,r)}),t(h);var g=k(h,4),_=e=>{var t=Xn(),n=D(t);N(()=>d(n,`${u(re).hiddenSlides??``} hidden ${u(re).hiddenSlides===1?`slide`:`slides`} omitted.`)),p(e,t)};P(g,e=>{u(re).hiddenSlides>0&&e(_)});var v=k(g,2),y=e=>{var t=Zn();p(e,t)};P(v,e=>{u(re).truncated&&e(y)}),t(m),N(()=>{a.disabled=u(ie)===0,d(c,`Slide ${u(ie)+1} of ${u(re).slides.length??``}`),l.disabled=u(ie)>=u(re).slides.length-1,z(h,`aria-label`,`Slide ${u(ie)+1}: ${u(re).slides[u(ie)].title}`)}),n(`click`,a,()=>M(ie,u(ie)-1)),n(`click`,l,()=>M(ie,u(ie)+1)),p(e,r)},Je=e=>{var n=$n();i(n,()=>u(v),!0),t(n),p(e,n)},Ye=e=>{var n=er();i(n,()=>u(v),!0),t(n),p(e,n)},Xe=e=>{var n=tr(),r=I(n);i(r,()=>u(b),!0),t(r),t(n),p(e,n)},Ze=e=>{var n=nr(),r=I(n),i=D(r,!0);t(n),N(()=>d(i,u(g))),p(e,n)};P(Re,e=>{u(m)===`loading`?e(ze):u(m)===`error`?e(Be,1):u(c)===`unsupported`?e(Ve,2):u(c)===`pdf`&&u(x)?e(He,3):u(c)===`spreadsheet`&&u(L)?e(Ue,4):u(c)===`presentation`&&u(re)?e(Ge,5):u(c)===`html`&&u(l)===`preview`&&u(v)?e(Je,6):u(c)===`markdown`&&u(l)===`preview`?e(Ye,7):u(c)===`code`?e(Xe,8):e(Ze,-1)}),t(Ie),N(e=>{d(De,u(le)),z(Oe,`title`,r.upload.filename),d(ke,r.upload.filename),d(je,e),z(Fe,`href`,u(H)),z(Fe,`download`,r.upload.filename),z(Fe,`aria-label`,`Download ${r.upload.filename}`),Le=w(Ie,1,`artifact-viewer__body`,null,Le,{"is-pdf":u(c)===`pdf`,"is-office":u(c)===`spreadsheet`||u(c)===`presentation`})},[()=>We(r.upload.byte_size)]),n(`click`,K,function(...e){r.onClose?.apply(this,e)}),p(e,Ce),_()}W([`click`]);var ar=l(``),or=l(`
          `),sr=l(`

          or

          `),cr=l(` `,1),lr=l(``),ur=l(``),dr=l(`

          `),fr=l(`
          ClickClack OpenClaw workspace chat

          Welcome.

          Have a sign-in token?
          `,1);function pr(e,r){o(r,!0);let i=Ft?.integratedTitleBar===!0,a=A(``),s=ge(),c=s.includes(`github`),l=s.includes(`password`),f=!Ft&&s.includes(`openclaw`),m=A(``),h=A(``),g=A(``),y=A(!1),b=A(``),x=l?c?`Sign in with your ClickClack account, or continue with GitHub.`:`Sign in with your ClickClack account.`:c?`Sign in with GitHub to join the guest room.`:f?`Sign in with OpenClaw ID to join the guest room.`:`Sign in with a token from your ClickClack administrator.`,S=c&&!l?`Any GitHub account can join.`:``;async function C(e){if(Ft){e.preventDefault(),M(a,`Opening GitHub in your browserโ€ฆ`);try{await Ft.signInWithGitHub(),M(a,`Finish signing in in your browser. ClickClack will complete here automatically.`)}catch{M(a,`Could not open your browser. Try again.`)}}}async function w(e,t){if(!u(y)){M(y,!0),M(b,``);try{await G(e,{method:`POST`,body:JSON.stringify(t)}),window.location.reload()}catch(e){M(b,xe(e,`Could not sign in.`),!0),M(y,!1)}}}function T(e){e.preventDefault(),w(`/api/auth/password/login`,{identifier:u(m),password:u(h)})}function E(e){e.preventDefault(),w(`/api/auth/magic/consume`,{token:u(g)})}var j=fr(),F=ce(j),ee=e=>{var t=ar();N(()=>z(t,`data-platform`,Ft.platform)),p(e,t)};P(F,e=>{i&&Ft&&e(ee)});var L=k(F,2),R=I(L),ne=I(R),re=I(ne);Je(re,{class:`mark`,size:44}),te(2),t(ne);var ie=k(ne,2),B=k(I(ie),2),ae=D(B,!0);t(ie);var oe=k(ie,2),V=e=>{var n=or(),r=I(n),i=k(I(r),2);O(i),t(r);var a=k(r,2),o=k(I(a),2);O(o),t(a);var s=k(a,2),c=D(s,!0);t(n),N(()=>{s.disabled=u(y),d(c,u(y)?`Signing in...`:`Sign in`)}),v(`submit`,n,T),se(i,()=>u(m),e=>M(m,e)),se(o,()=>u(h),e=>M(h,e)),p(e,n)};P(oe,e=>{l&&e(V)});var le=k(oe,2),H=e=>{var t=cr(),r=ce(t),i=e=>{var t=sr();p(e,t)};P(r,e=>{l&&e(i)});var a=k(r,2);N(e=>z(a,`href`,e),[()=>he(`/api/auth/github/start`)]),n(`click`,a,C),p(e,t)};P(le,e=>{c&&e(H)});var ue=k(le,2),U=e=>{var t=lr();N(e=>z(t,`href`,e),[()=>he(`/api/auth/openclaw/start`)]),p(e,t)};P(ue,e=>{f&&e(U)});var W=k(ue,2),de=e=>{var t=ur(),n=D(t,!0);N(()=>d(n,u(b))),p(e,t)};P(W,e=>{u(b)&&e(de)});var fe=k(W,2),pe=k(I(fe),2),me=I(pe),_e=k(I(me),2);O(_e),t(me);var ve=k(me,2);t(pe),t(fe);var ye=k(fe,2),be=e=>{var t=dr(),n=D(t,!0);N(()=>d(n,u(a)||S)),p(e,t)};P(ye,e=>{(u(a)||S)&&e(be)}),t(R),t(L),N(()=>{d(ae,x),fe.open=!c&&!l&&!f,ve.disabled=u(y)}),v(`submit`,pe,E),se(_e,()=>u(g),e=>M(g,e)),p(e,j),_()}W([`click`]);var mr=l(``),hr=l(``);function gr(e,r){o(r,!0);let i=S(r,`deleting`,3,!1),a=S(r,`error`,3,``),s=U(()=>r.message.author?.display_name||`Local User`);function c(){i()||r.onClose()}var l=hr(),f=I(l),m=k(f,2),h=I(m),g=k(I(h),2);t(h);var v=k(h,2),y=k(I(v),2),b=I(y);{let e=U(()=>r.message.author?.id||r.message.author_id),t=U(()=>r.message.author?.avatar_url);ut(b,{class:`avatar`,get id(){return u(e)},get name(){return u(s)},get src(){return u(t)},size:36,loading:`eager`,fetchPriority:`auto`})}var x=k(b,2),C=I(x),w=I(C),T=D(w,!0),E=k(w,2),O=D(E,!0);t(C);var A=k(C,2),j=D(A,!0);t(x),t(y);var M=k(y,2),F=e=>{var t=mr(),n=D(t,!0);N(()=>d(n,a())),p(e,t)};P(M,e=>{a()&&e(F)});var ee=k(M,2),te=I(ee),L=k(te,2),R=D(L,!0);t(ee),t(v),t(m),t(l),N(e=>{f.disabled=i(),g.disabled=i(),d(T,u(s)),z(E,`datetime`,r.message.created_at),d(O,e),d(j,r.message.body),te.disabled=i(),L.disabled=i(),d(R,i()?`Deleting...`:`Delete`)},[()=>Ye(r.message.created_at)]),n(`click`,f,c),n(`click`,g,c),n(`click`,te,c),n(`click`,L,function(...e){r.onConfirm?.apply(this,e)}),p(e,l),_()}W([`click`]);var _r=6500,vr=l(`
          `);function yr(e,n){o(n,!0);let r=U(()=>n.entries.filter(e=>e.userID!==n.currentUserID));function i(e,t=`Someone`){return e?.display_name?.trim()||(e?.handle?`@${e.handle}`:t)}let a=U(()=>u(r).length===0?``:u(r).length===1?`${i(u(r)[0].user)} is typingโ€ฆ`:u(r).length===2?`${i(u(r)[0].user)} and ${i(u(r)[1].user)} are typingโ€ฆ`:u(r).length===3?`${i(u(r)[0].user)}, ${i(u(r)[1].user)}, and ${i(u(r)[2].user)} are typingโ€ฆ`:`Several people are typingโ€ฆ`);var s=vr();let c;var l=k(I(s),2),f=D(l,!0);t(s),N(()=>{c=w(s,1,`typing-indicator`,null,c,{visible:u(r).length>0}),d(f,u(a))}),p(e,s),_()}var br=l(`
          `),xr=l(`
          `),Sr=l(`
          `);function Cr(e,n){o(n,!0);function r(e){return e.kind===`tool`&&e.toolName?!e.text||e.text===e.toolName?e.toolName:`${e.toolName}: ${e.text}`:e.text}function i(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 a=s(),c=ce(a),l=e=>{var a=Sr();f(a,21,()=>n.turns,e=>e.key,(e,n)=>{var a=xr();f(a,21,()=>u(n).lines,e=>e.id,(e,n)=>{var a=br();let o;var s=I(a),c=D(s,!0),l=k(s,2),f=D(l,!0);t(a),N((e,t)=>{o=w(a,1,`agent-progress__line svelte-6vwkyv`,null,o,{"agent-progress__line--done":u(n).finalized}),z(a,`data-kind`,u(n).kind),d(c,e),d(f,t)},[()=>i(u(n).kind),()=>r(u(n))]),p(e,a)}),t(a),p(e,a)}),t(a),p(e,a)};P(c,e=>{n.turns.length>0&&e(l)}),p(e,a),_()}function wr(e,t){return`${e}\u0000${t}`}var Tr=45e3;function Er(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=wr(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+Tr;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 Dr=l(``),Or=l(``);function kr(e,r){o(r,!0);var i=Or(),a=I(i),s=k(a,2),c=I(s),l=k(I(c),2);t(c);var u=k(c,2),f=I(u),m=k(I(f),2);O(m),t(f);var h=k(f,2),g=e=>{var t=Dr(),n=D(t,!0);N(()=>d(n,r.error)),p(e,t)};P(h,e=>{r.error&&e(g)});var y=k(h,2),b=I(y),x=k(b,2),S=D(x,!0);t(y),t(u),t(s),t(i),N(e=>{j(m,r.channelName),m.disabled=r.pending,x.disabled=e,d(S,r.pending?`Creatingโ€ฆ`:`Create channel`)},[()=>r.pending||!r.channelName.trim()]),n(`click`,a,function(...e){r.onClose?.apply(this,e)}),n(`click`,l,function(...e){r.onClose?.apply(this,e)}),v(`submit`,u,e=>{e.preventDefault(),r.onCreate()}),n(`input`,m,e=>r.onChannelName(e.currentTarget.value)),n(`click`,b,function(...e){r.onClose?.apply(this,e)}),p(e,i),_()}W([`click`,`input`]);var Ar=l(``),jr=l(`
          No matching people yet
          `),Mr=l(`

          `),Nr=l(``),Pr=l(``);function Fr(e,r){o(r,!0);let i=U(()=>r.memberID.trim().toLowerCase().replace(/^@/,``)),a=U(()=>r.people.filter(e=>e.id!==r.currentUserID).filter(e=>!u(i)||e.display_name.toLowerCase().includes(u(i))||e.handle?.toLowerCase().includes(u(i))||e.id.toLowerCase().includes(u(i)))),s=U(()=>r.memberID.trim().startsWith(`usr_`)?r.memberID.trim():u(i)&&u(a).length===1?u(a)[0].id:``);function c(e){r.pending||!e||(r.onMemberID(e),r.onStart(e))}var l=Pr(),m=I(l),h=k(m,2),g=I(h),y=k(I(g),2);t(g);var b=k(g,2),x=I(b),S=k(I(x),2);O(S),t(x);var C=k(x,2),w=I(C);f(w,17,()=>u(a),e=>e.id,(e,i)=>{var a=Ar(),o=I(a);ut(o,{class:`dm-avatar`,get id(){return u(i).id},get name(){return u(i).display_name},get src(){return u(i).avatar_url},size:32});var s=k(o,2),l=I(s),f=D(l,!0),m=k(l,2),h=D(m,!0);t(s),t(a),N(e=>{a.disabled=r.pending,d(f,u(i).display_name),d(h,e)},[()=>ot(u(i).handle)||u(i).id]),n(`click`,a,()=>c(u(i).id)),p(e,a)});var T=k(w,2),E=e=>{var t=jr();p(e,t)};P(T,e=>{u(a).length===0&&e(E)}),t(C);var A=k(C,2),M=e=>{var t=Mr(),n=D(t,!0);N(()=>d(n,u(a).length>1?`Choose a person from the results.`:`Choose a person or enter a user ID.`)),p(e,t)};P(A,e=>{u(i)&&!u(s)&&e(M)});var F=k(A,2),ee=e=>{var t=Nr(),n=D(t,!0);N(()=>d(n,r.error)),p(e,t)};P(F,e=>{r.error&&e(ee)});var te=k(F,2),L=I(te),R=k(L,2),ne=D(R,!0);t(te),t(b),t(h),t(l),N(()=>{j(S,r.memberID),S.disabled=r.pending,R.disabled=r.pending||!u(s),d(ne,r.pending?`Startingโ€ฆ`:`Start DM`)}),n(`click`,m,function(...e){r.onClose?.apply(this,e)}),n(`click`,y,function(...e){r.onClose?.apply(this,e)}),v(`submit`,b,e=>{e.preventDefault(),c(u(s))}),n(`input`,S,e=>r.onMemberID(e.currentTarget.value)),n(`click`,L,function(...e){r.onClose?.apply(this,e)}),p(e,l),_()}W([`click`,`input`]);var Ir=l(` `),Lr=l(``),Rr=l(`
          `),zr=l(``),Br=l(`

          Creating workspaceโ€ฆ

          `),Vr=l(`
          `),Hr=l(``);function Ur(e,r){o(r,!0);let i=S(r,`homeHref`,3,`/`),a=S(r,`homeLabel`,3,`cc`),s=S(r,`homeTitle`,3,`ClickClack home`);function c(e){return e.button===0&&!e.metaKey&&!e.ctrlKey&&!e.shiftKey&&!e.altKey}var l=Hr(),m=I(l);let h;var g=I(m),y=e=>{Je(e,{size:48})},b=U(()=>Ot(a())),x=e=>{var t=Ir(),n=D(t,!0);N(()=>d(n,a())),p(e,t)};P(g,e=>{u(b)?e(y):e(x,-1)}),t(m);var C=k(m,4),T=I(C);f(T,17,()=>r.workspaces,e=>e.id,(e,i)=>{var a=Rr();let o;var s=I(a),l=I(s),f=e=>{var t=Lr();N(e=>z(t,`src`,e),[()=>_e(u(i).icon_url)]),p(e,t)},m=e=>{var t=Ir(),n=D(t,!0);N(e=>d(n,e),[()=>ct(u(i).name)]),p(e,t)};P(l,e=>{u(i).icon_url?e(f):e(m,-1)}),t(s),t(a),N(e=>{o=w(a,1,`guild-wrap`,null,o,{active:u(i).id===r.selectedWorkspaceID}),z(s,`title`,u(i).name),z(s,`aria-label`,u(i).name),z(s,`href`,e)},[()=>r.hrefForWorkspace(u(i).id)]),n(`click`,s,e=>{c(e)&&(e.preventDefault(),r.onSelectWorkspace(u(i).id))}),p(e,a)});var E=k(T,2);t(C);var A=k(C,2),M=e=>{var i=Vr(),a=I(i);O(a);var o=k(a,2),s=e=>{var t=zr(),n=D(t,!0);N(()=>d(n,r.createError)),p(e,t)};P(o,e=>{r.createError&&e(s)});var c=k(o,2),l=e=>{var t=Br();p(e,t)};P(c,e=>{r.createPending&&e(l)}),t(i),N(()=>{j(a,r.workspaceName),a.disabled=r.createPending}),v(`submit`,i,e=>{e.preventDefault(),r.onCreateWorkspace()}),n(`input`,a,e=>r.onWorkspaceName(e.currentTarget.value)),p(e,i)};P(A,e=>{r.showWorkspaceCreate&&e(M)}),t(l),N(e=>{h=w(m,1,`guild home`,null,h,{"home--mark":e}),z(m,`title`,s()),z(m,`aria-label`,s()),z(m,`href`,i())},[()=>Ot(a())]),n(`click`,E,function(...e){r.onToggleWorkspaceCreate?.apply(this,e)}),p(e,l),_()}W([`click`,`input`]);var Wr=l(``),Gr=l(` `,1),Kr=l(``),qr=l(` `),Jr=l(``),Yr=l(`
          `),Xr=l(``),Zr=l(`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),Qr=l(`
          `);function $r(e,r){o(r,!0);let i=(e,i=F,a=F,o=F,s=F,c=F)=>{let f=U(()=>i().unread_count||0),_=U(()=>a().findIndex(e=>e.id===i().id));var y=Jr();let b;var C=I(y),T=e=>{var r=Gr(),s=ce(r),c=k(s,2),l=e=>{var r=Wr(),o=I(r),s=k(o,2);t(r),oe(r,e=>M(S,e),()=>u(S)),N(e=>{z(r,`aria-label`,e),o.disabled=u(_)<=0,s.disabled=u(_)<0||u(_)>=a().length-1},[()=>`Move #${_t(i())}`]),n(`keydown`,r,e=>{e.key===`Escape`&&(e.preventDefault(),_e(!0))}),n(`click`,o,()=>ve(i().id,-1,a())),n(`click`,s,()=>ve(i().id,1,a())),p(e,r)};P(c,e=>{u(x)===i().id&&e(l)}),N(e=>{z(s,`aria-label`,e),z(s,`aria-expanded`,u(x)===i().id)},[()=>`Move #${_t(i())}`]),n(`click`,s,e=>void ge(i().id,e.currentTarget)),v(`dragstart`,s,e=>fe(e,i().id,o())),v(`dragend`,s,he),n(`keydown`,s,e=>{e.key===`ArrowUp`||e.key===`ArrowDown`?(e.preventDefault(),M(x,``),de(i().id,e.key===`ArrowUp`?-1:1,a())):e.key===`Escape`&&M(x,``)}),p(e,r)};P(C,e=>{c()&&e(T)});var E=k(C,2);let O;var A=k(I(E),2),j=D(A,!0),ee=k(A,2),te=e=>{var t=Kr();p(e,t)};P(ee,e=>{i().external_managed&&e(te)});var L=k(ee,2),R=e=>{var t=qr(),n=D(t,!0);N(()=>{z(t,`aria-label`,`${u(f)} unread`),d(n,u(f)>99?`99+`:u(f))}),p(e,t)};P(L,e=>{u(f)>0&&!(i().id===r.selectedChannelID&&!r.selectedDirectID)&&e(R)}),t(E),t(y),N((e,t)=>{b=w(y,1,`channel-row`,null,b,{reorderable:c(),subdued:s(),dragging:u(l)===i().id,"drop-before":u(h)===i().id&&u(g),"drop-after":u(h)===i().id&&!u(g)}),z(E,`href`,e),O=w(E,1,`nav-item channel`,null,O,{active:i().id===r.selectedChannelID&&!r.selectedDirectID,"has-unread":u(f)>0&&!(i().id===r.selectedChannelID&&!r.selectedDirectID)}),d(j,t)},[()=>r.hrefForChannel(i().id),()=>_t(i())]),v(`dragover`,y,e=>{c()&&pe(e,i().id,o())}),v(`drop`,y,e=>{e.preventDefault(),!(!c()||u(m)!==o())&&(W(u(l),i().id,u(g),a()),he())}),n(`focusout`,y,e=>{e.currentTarget.contains(e.relatedTarget)||M(x,``)}),n(`click`,E,e=>{G(e)&&(e.preventDefault(),r.onSelectChannel(i().id))}),p(e,y)},a=(e,r=F,a=F,o=F)=>{let s=U(()=>V(r().key)),c=U(()=>H(r()));var l=Yr();let m;var h=I(l),g=k(I(h),2),_=D(g,!0),v=k(g,2),y=D(v,!0);t(h);var b=k(h,2);f(b,21,()=>u(c),e=>e.id,(e,t)=>{i(e,()=>u(t),()=>r().channels,()=>r().key,o,()=>u(s))}),t(b),t(l),N(()=>{m=w(l,1,`channel-subgroup`,null,m,{"archived-channel-group":o()}),z(h,`aria-expanded`,u(s)),z(h,`aria-controls`,a()),d(_,r().label),d(y,r().channels.length),z(b,`id`,a()),z(b,`hidden`,!u(s)&&u(c).length===0)}),n(`click`,h,()=>se(r().key)),p(e,l)},c=`archived`,l=A(``),m=A(``),h=A(``),g=A(!0),b=A(!1),x=A(``),S=A(void 0),T,O=A(``),j=A(B({})),ee=U(()=>r.channels.filter(e=>!e.archived_at)),te=U(()=>r.channels.filter(e=>!!e.archived_at)),L=U(()=>u(ee).filter(e=>!e.sidebar_section?.trim())),R=U(()=>{let e=new Map;for(let t of u(ee)){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=U(()=>r.channels.filter(e=>e.id===r.selectedChannelID&&!r.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 V(e){let t=u(j)[e];return typeof t==`boolean`?t:e!==c}function se(e){if(M(j,{...u(j),[e]:!V(e)},!0),r.workspaceID)try{window.localStorage.setItem(ie(r.workspaceID),JSON.stringify(u(j)))}catch{}}function le(e){e.key===ie(r.workspaceID)&&M(j,re(e.newValue),!0)}function H(e){return V(e.key)?e.channels:e.channels.filter(e=>e.id===r.selectedChannelID&&!r.selectedDirectID||(e.unread_count||0)>0)}function ue(e){M(O,``),queueMicrotask(()=>{M(O,e,!0)})}function W(e,t,n,i){if(!e||!t||e===t)return;let a=r.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+ +!n,0,e),r.onReorder(a);let c=r.channels.find(t=>t.id===e),l=i.map(e=>e.id).filter(t=>t!==e),u=l.indexOf(t);l.splice(u+ +!n,0,e),c&&ue(`Moved #${_t(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){M(b,!0),M(x,``),M(l,t,!0),M(m,n,!0),e.dataTransfer?.setData(`text/plain`,t),e.dataTransfer&&(e.dataTransfer.effectAllowed=`move`)}function pe(e,t,n){if(!u(l)||u(l)===t||u(m)!==n)return;e.preventDefault();let r=e.currentTarget;M(h,t,!0),M(g,e.clientY{M(b,!1)},0)}async function ge(e,t){if(!u(b)){if(u(x)===e){M(x,``);return}T=t,M(x,e,!0),await y(),u(S)?.querySelector(`button:not(:disabled)`)?.focus()}}async function _e(e=!1){M(x,``),e&&(await y(),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}C(()=>{M(j,ae(r.workspaceID),!0)}),C(()=>{r.expanded||(M(x,``),me(),M(b,!1))});var ye=Qr();v(`storage`,E,le);let be;var xe=I(ye),Se=I(xe),Ce=k(Se,2);t(xe);var we=k(xe,2),Te=I(we),Ee=e=>{var t=Zr(),n=k(ce(t),2);f(n,17,()=>u(L),e=>e.id,(e,t)=>{i(e,()=>u(t),()=>u(L),()=>`unsectioned`,()=>!1,()=>!0)});var o=k(n,2);f(o,19,()=>u(R),e=>e.key,(e,t,n)=>{a(e,()=>u(t),()=>`sidebar-channel-section-${u(n)}`,()=>!1)});var s=k(o,2),l=e=>{a(e,()=>({key:c,label:`Archived`,channels:u(te)}),()=>`sidebar-archived-channels`,()=>!0)};P(s,e=>{u(te).length>0&&e(l)});var d=k(s,2),m=e=>{var t=Xr();p(e,t)};P(d,e=>{r.channels.length===0&&e(m)}),p(e,t)},De=e=>{var t=s(),n=ce(t);f(n,17,()=>u(ne),e=>e.id,(e,t)=>{{let n=U(()=>!!u(t).archived_at);i(e,()=>u(t),()=>u(ne),()=>`priority`,()=>u(n),()=>!1)}}),p(e,t)};P(Te,e=>{r.expanded?e(Ee):e(De,-1)}),t(we);var Oe=k(we,2),ke=D(Oe,!0);t(ye),N(()=>{be=w(ye,1,`nav-section`,null,be,{collapsed:!r.expanded}),z(Se,`aria-expanded`,r.expanded),z(we,`hidden`,!r.expanded&&u(ne).length===0),d(ke,u(O))}),n(`click`,Se,function(...e){r.onToggle?.apply(this,e)}),n(`click`,Ce,function(...e){r.onCreateChannel?.apply(this,e)}),p(e,ye),_()}W([`focusout`,`click`,`keydown`]);var ei=l(` `),ti=l(``),ni=l(``),ri=l(`
          `),ii=l(``),ai=l(`
          `),oi=l(`
          `);function si(e,r){o(r,!0);let i=A(``),a=U(()=>r.expanded?r.conversations:r.conversations.filter(e=>e.id===r.selectedDirectID||(e.unread_count||0)>0));function s(e){return e.button===0&&!e.metaKey&&!e.ctrlKey&&!e.shiftKey&&!e.altKey}function c(e){M(i,u(i)===e?``:e,!0)}function l(){M(i,``)}var m=oi();let h;var g=I(m),v=I(g),y=k(v,2);t(g);var b=k(g,2),x=I(b);f(x,17,()=>u(a),e=>e.id,(e,a)=>{let o=U(()=>lt(u(a),r.currentUserID)),f=U(()=>u(a).unread_count||0),m=U(()=>u(a).id===r.selectedDirectID);var h=ri();let g;var _=I(h);let v;var y=I(_);{let e=U(()=>u(o)?.id||u(a).id),t=U(()=>u(o)?.display_name),n=U(()=>dt(u(o))?void 0:u(o)?.avatar_url);ut(y,{class:`dm-avatar`,get id(){return u(e)},get name(){return u(t)},get src(){return u(n)},size:22})}var b=k(y,2),x=D(b,!0),S=k(b,2),C=e=>{var t=ei(),n=D(t,!0);N(()=>{z(t,`aria-label`,`${u(f)} unread`),d(n,u(f)>99?`99+`:u(f))}),p(e,t)},T=e=>{var t=ti();p(e,t)};P(S,e=>{u(f)>0&&!u(m)?e(C):e(T,-1)}),t(_);var E=k(_,2),O=k(E,2),A=e=>{var t=ni(),i=D(t);n(`click`,i,e=>{e.preventDefault(),e.stopPropagation(),l(),r.onHideDirect(u(a).id)}),p(e,t)};P(O,e=>{u(i)===u(a).id&&e(A)}),t(h),N((e,t,n)=>{g=w(h,1,`dm-row`,null,g,{active:u(m)}),z(_,`href`,e),v=w(_,1,`nav-item dm`,null,v,{active:u(m),"has-unread":u(f)>0&&!u(m)}),d(x,t),z(E,`aria-label`,n),z(E,`aria-expanded`,u(i)===u(a).id)},[()=>r.hrefForDirect(u(a).id),()=>rt(u(a),r.currentUserID),()=>`Direct message actions for ${rt(u(a),r.currentUserID)}`]),n(`click`,_,e=>{s(e)&&(e.preventDefault(),r.onSelectDirect(u(a).id))}),n(`click`,E,e=>{e.preventDefault(),e.stopPropagation(),c(u(a).id)}),n(`keydown`,E,e=>{e.key===`Escape`&&l()}),p(e,h)});var S=k(x,2),C=e=>{var t=ii();p(e,t)};P(S,e=>{r.expanded&&r.conversations.length===0&&e(C)});var T=k(S,2),E=e=>{var i=ai(),a=I(i),o=D(a),s=k(a,2);t(i),N(()=>d(o,`Closed ${r.hiddenDirectTitle??``}`)),n(`click`,s,function(...e){r.onUndoHideDirect?.apply(this,e)}),p(e,i)};P(T,e=>{r.expanded&&r.hiddenDirectTitle&&e(E)}),t(b),t(m),N(()=>{h=w(m,1,`nav-section`,null,h,{collapsed:!r.expanded}),z(v,`aria-expanded`,r.expanded),z(b,`hidden`,!r.expanded&&u(a).length===0)}),n(`click`,v,function(...e){r.onToggle?.apply(this,e)}),n(`click`,y,function(...e){r.onCreateDirect?.apply(this,e)}),p(e,m),_()}W([`click`,`keydown`]);var ci=l(``),li=l(`Connectingโ€ฆ`),ui=l(`
          `),di=l(` `),fi=l(``),pi=l(``),mi=l(``);function hi(e,r){o(r,!0);let i=S(r,`showHeader`,3,!0),a=`clickclack:sidebar-sections:v1:`,s={channels:!0,directMessages:!0,people:!0},c=A(B({...s}));function l(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 m(e){if(!e)return{...s};try{let t=window.localStorage.getItem(`${a}${e}`);if(!t)return{...s};let n=JSON.parse(t);return l(n)?n:{...s}}catch{return{...s}}}function h(e){if(M(c,{...u(c),[e]:!u(c)[e]},!0),r.workspaceID)try{window.localStorage.setItem(`${a}${r.workspaceID}`,JSON.stringify(u(c)))}catch{}}C(()=>{M(c,m(r.workspaceID),!0)});let g=1e6,y=A(B([]));function b(e,t){return`clickclack:sidebar-channel-order:v1:${t}:${e}`}function x(e){if(!e||e.length>g)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 T(e,t){if(!e||!t)return[];try{return x(window.localStorage.getItem(b(e,t)))}catch{return[]}}function O(e){if(M(y,e,!0),!(!r.workspaceID||!r.currentUser?.id))try{let t=b(r.workspaceID,r.currentUser.id),n=JSON.stringify(e);if(n.length>g){window.localStorage.removeItem(t);return}window.localStorage.setItem(t,n)}catch{}}function j(e){!r.workspaceID||!r.currentUser?.id||e.key===b(r.workspaceID,r.currentUser.id)&&M(y,x(e.newValue),!0)}let F=U(()=>{let e=new Map(r.channels.map(e=>[e.id,e]));return[...u(y).flatMap(t=>{let n=e.get(t);return n?(e.delete(t),[n]):[]}),...e.values()]});C(()=>{M(y,T(r.workspaceID,r.currentUser?.id||``),!0)});function ee(e){return e.button===0&&!e.metaKey&&!e.ctrlKey&&!e.shiftKey&&!e.altKey}var L=mi();v(`storage`,E,j);var R=I(L),ne=e=>{var i=ui(),a=I(i),o=I(a),s=e=>{var t=ci();N(e=>z(t,`src`,e),[()=>_e(r.workspaceIconURL)]),p(e,t)};P(o,e=>{r.workspaceIconURL&&e(s)});var c=k(o,2),l=I(c),u=I(l),f=D(u,!0);te(2),t(l);var m=k(l,2),h=e=>{var t=li();p(e,t)};P(m,e=>{r.connected||e(h)}),t(c),t(a);var g=k(a,2),_=I(g),v=I(_),y=D(v);t(_),t(g),t(i),N(()=>{d(f,r.workspaceName||`Pick a workspace`),z(_,`aria-label`,r.sidebarCollapsed?`Expand sidebar`:`Collapse sidebar`),z(_,`title`,r.sidebarCollapsed?`Expand sidebar`:`Collapse sidebar`),z(y,`d`,r.sidebarCollapsed?`m9 6 6 6-6 6`:`m15 6-6 6 6 6`)}),n(`click`,a,function(...e){r.onOpenWorkspaceSettings?.apply(this,e)}),n(`click`,_,function(...e){r.onToggleCollapse?.apply(this,e)}),p(e,i)};P(R,e=>{i()&&e(ne)});var re=k(R,2),ie=I(re);$r(ie,{get workspaceID(){return r.workspaceID},get expanded(){return u(c).channels},get channels(){return u(F)},get selectedChannelID(){return r.selectedChannelID},get selectedDirectID(){return r.selectedDirectID},get hrefForChannel(){return r.hrefForChannel},get onSelectChannel(){return r.onSelectChannel},get onCreateChannel(){return r.onCreateChannel},onToggle:()=>h(`channels`),onReorder:O});var ae=k(ie,2);{let e=U(()=>r.currentUser?.id);si(ae,{get expanded(){return u(c).directMessages},get conversations(){return r.directConversations},get currentUserID(){return u(e)},get selectedDirectID(){return r.selectedDirectID},get hrefForDirect(){return r.hrefForDirect},get onSelectDirect(){return r.onSelectDirect},get onCreateDirect(){return r.onCreateDirect},get onHideDirect(){return r.onHideDirect},get hiddenDirectTitle(){return r.hiddenDirectTitle},get onUndoHideDirect(){return r.onUndoHideDirect},onToggle:()=>h(`directMessages`)})}var oe=k(ae,2);let V;var se=I(oe),ce=D(se),le=k(se,2),H=I(le);f(H,17,()=>r.recentPeople,e=>e.id,(e,i)=>{let a=U(()=>st(r.directConversations,u(i).id,r.currentUser?.id));var o=di();let s;var c=I(o);ut(c,{class:`dm-avatar`,get id(){return u(i).id},get name(){return u(i).display_name},get src(){return u(i).avatar_url},size:22});var l=k(c,2),f=D(l,!0);te(2),t(o),N(e=>{z(o,`href`,e),s=w(o,1,`nav-item dm`,null,s,{active:u(a)?.id===r.selectedDirectID||r.selectedProfile?.id===u(i).id}),d(f,u(i).display_name)},[()=>u(a)?r.hrefForDirect(u(a).id):`#`]),n(`click`,o,e=>{if(u(a)){if(!ee(e))return;e.preventDefault(),r.onSelectDirect(u(a).id)}else e.preventDefault(),r.onOpenProfile(u(i))}),p(e,o)});var ue=k(H,2),W=e=>{var t=fi();p(e,t)};P(ue,e=>{r.recentPeople.length===0&&e(W)}),t(le),t(oe),t(re);var de=k(re,2),fe=e=>{var i=pi(),a=I(i);ut(a,{class:`dm-avatar`,get id(){return r.currentUser.id},get name(){return r.currentUser.display_name},get src(){return r.currentUser.avatar_url},size:28,loading:`eager`,fetchPriority:`auto`});var o=k(a,2),s=I(o),c=D(s,!0),l=k(s,2),u=D(l,!0);t(o),te(2),t(i),N((e,t)=>{z(i,`aria-label`,e),d(c,r.currentUser.display_name),d(u,t)},[()=>`Account settings for ${r.currentUser.display_name} ${ot(r.currentUser.handle)}`,()=>r.currentUser.handle?ot(r.currentUser.handle):r.connected?`Active`:`Reconnectingโ€ฆ`]),n(`click`,i,function(...e){r.onOpenSettings?.apply(this,e)}),n(`contextmenu`,i,e=>{e.preventDefault(),r.onOpenSettings()}),p(e,i)};P(de,e=>{r.currentUser&&e(fe)}),t(L),N(()=>{V=w(oe,1,`nav-section`,null,V,{collapsed:!u(c).people}),z(ce,`aria-expanded`,u(c).people),z(le,`hidden`,!u(c).people)}),n(`click`,ce,()=>h(`people`)),p(e,L),_()}W([`click`,`contextmenu`]);var gi=l(`
          Loading...
          `),_i=l(`
          `),vi=l(`
          `),yi=l(`

          No pinned messages

          Pin important messages to keep them easily accessible.

          `),bi=l(`
          `),xi=l(`
          `),Si=l(`
          `),Ci=l(` `,1),wi=l(`

          Pinned Messages

          `);function Ti(e,r){o(r,!0);let a=S(r,`loading`,3,!1),s=S(r,`error`,3,``),c=S(r,`topics`,19,()=>[]),l=S(r,`mentionPeople`,19,()=>[]),m=S(r,`maxPins`,3,100),g=A(B(new Set)),v=A(``);async function y(e){if(!u(g).has(e.id)){M(g,new Set(u(g)).add(e.id),!0),M(v,``);try{await r.onUnpin(e)}catch(e){M(v,e instanceof Error?e.message:`Could not unpin message`,!0)}finally{let t=new Set(u(g));t.delete(e.id),M(g,t,!0)}}}var b=wi(),x=I(b),C=I(x),w=I(C),T=k(I(w),2),E=D(T);t(w);var O=k(w,2),j=D(O);t(C);var F=k(C,2);t(x);var ee=k(x,2),te=I(ee),L=e=>{var t=gi();p(e,t)},R=e=>{var t=_i(),n=D(t,!0);N(()=>d(n,s())),p(e,t)},ne=e=>{var a=Ci(),o=ce(a),s=e=>{var t=vi(),n=D(t,!0);N(()=>d(n,u(v))),p(e,t)};P(o,e=>{u(v)&&e(s)});var m=k(o,2),_=e=>{var t=yi();p(e,t)},b=e=>{var a=Si();f(a,21,()=>r.messages,e=>e.id,(e,a)=>{let o=U(()=>c().find(e=>e.id===u(a).topic_id));var s=xi(),m=I(s),_=I(m),v=D(_,!0),b=k(_,2),x=D(b,!0);t(m);var S=k(m,2);mt(S,{get topic(){return u(o)},get onSelect(){return r.onSelectTopic}});var C=k(S,2);i(C,()=>Y(u(a).body),!0),t(C),h(C,e=>He?.(e)),h(C,(e,t)=>Z?.(e,t),()=>({people:l(),attentionUserID:r.mentionAttentionUserID}));var w=k(C,2),T=e=>{var n=bi();f(n,21,()=>u(a).attachments,e=>e.id,(e,t)=>{{let n=U(()=>q(u(t)));X(e,{get upload(){return u(t)},get url(){return u(n)},get onOpenImage(){return r.onOpenImage},get onOpenArtifact(){return r.onOpenArtifact}})}}),t(n),p(e,n)};P(w,e=>{u(a).attachments?.length&&e(T)});var E=k(w,2),O=I(E),A=k(O,2);t(E),t(s),N((e,t)=>{z(s,`data-message-id`,u(a).id),d(v,u(a).author?.display_name||`Unknown`),d(x,e),A.disabled=t},[()=>Ye(u(a).created_at),()=>u(g).has(u(a).id)]),n(`click`,O,()=>r.onOpenThread(u(a))),n(`click`,A,()=>y(u(a))),p(e,s)}),t(a),p(e,a)};P(m,e=>{r.messages.length===0?e(_):e(b,-1)}),p(e,a)};P(te,e=>{a()?e(L):s()?e(R,1):e(ne,-1)}),t(ee),t(b),N(()=>{d(E,`${r.messages.length??``} / ${m()??``} pinned`),d(j,`Shared across this channel, with a maximum of ${m()??``} messages.`)}),n(`click`,F,function(...e){r.onClose?.apply(this,e)}),p(e,b),_()}W([`click`]);var Ei=l(` `,1),Di=l(`
          `),Oi=l(`
          We couldnโ€™t search messages

          `),ki=l(`
          No messages found

          Try another word or phrase.

          `),Ai=l(`deleted bot`),ji=l(` `),Mi=l(` `),Ni=l(` `),Pi=l(` Reply in thread`),Fi=l(` `),Ii=l(`
        • `),Li=l(``),Ri=l(``),zi=l(``),Bi=l(`
            `,1),Vi=l(``);function Hi(e,r){o(r,!0);let i=S(r,`covered`,3,!1),a=S(r,`inert`,3,!1),c=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 g(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=m(`Searching messagesโ€ฆ`);p(e,t)},L=e=>{var t=Ei(),n=ce(t),i=k(n),a=e=>{var t=m();N(()=>d(t,`in ${r.session.scope.label??``}`)),p(e,t)};P(i,e=>{r.session.scope.label&&e(a)}),N(()=>d(n,`${r.session.results.length??``}${r.session.nextCursor?`+`:``} - ${r.session.results.length===1&&!r.session.nextCursor?`result`:`results`}`)),p(e,t)},R=e=>{var t=m(`Search unavailable`);p(e,t)};P(F,e=>{r.session.state===`loading`?e(te):r.session.state===`ready`?e(L,1):r.session.state===`error`&&e(R,2)}),t(M);var ne=k(M,2),re=I(ne),ie=e=>{var t=Di();p(e,t)},B=e=>{var n=Oi(),i=k(I(n),4),a=D(i,!0);t(n),N(()=>d(a,r.session.error)),p(e,n)},ae=e=>{var t=ki();p(e,t)},oe=e=>{var i=Bi(),a=ce(i);f(a,21,()=>r.session.results,e=>e.id,(e,i)=>{let a=U(()=>r.contextFor(u(i)));var o=Ii(),c=I(o);let l;var h=I(c);{let e=U(()=>dt(u(i).author)?void 0:u(i).author.avatar_url);ut(h,{class:`dm-avatar`,get id(){return u(i).author.id},get name(){return u(i).author.display_name},get src(){return u(e)},size:30})}var _=k(h,2),y=I(_),b=I(y),x=D(b,!0),S=k(b,2),C=e=>{var t=Ai();p(e,t)},T=U(()=>dt(u(i).author)),E=e=>{var t=ji(),n=D(t,!0);N(e=>d(n,e),[()=>ot(it(u(i).author))]),p(e,t)},O=U(()=>it(u(i).author));P(S,e=>{u(T)?e(C):u(O)&&e(E,1)});var A=k(S,2),j=D(A,!0);t(y);var M=k(y,2);f(M,21,()=>g(u(i).snippet,u(i).highlights),ee,(e,t)=>{var n=s(),r=ce(n),i=e=>{var n=Mi(),r=D(n,!0);N(()=>d(r,u(t).text)),p(e,n)},a=e=>{var n=m();N(()=>d(n,u(t).text)),p(e,n)};P(r,e=>{u(t).highlighted?e(i):e(a,-1)}),p(e,n)}),t(M);var F=k(M,2),te=I(F),L=e=>{var t=Ni(),n=D(t,!0);N(()=>d(n,u(a))),p(e,t)};P(te,e=>{u(a)&&e(L)});var R=k(te,2),ne=e=>{var t=Pi();p(e,t)},re=e=>{var n=Fi(),r=k(I(n));t(n),N(()=>d(r,` ${u(i).reply_count??``} ${u(i).reply_count===1?`reply`:`replies`}`)),p(e,n)};P(R,e=>{u(i).parent_message_id?e(ne):u(i).reply_count>0&&e(re,1)}),t(F),t(_),t(c),t(o),N(e=>{l=w(c,1,`search-result`,null,l,{"is-active":r.session.activeResultID===u(i).id}),z(c,`data-result-id`,u(i).id),d(x,u(i).author.display_name||`Local User`),z(A,`datetime`,u(i).created_at),d(j,e)},[()=>v(u(i).created_at)]),n(`click`,c,()=>r.onOpenResult(u(i))),p(e,o)}),t(a);var o=k(a,2),c=e=>{var i=Li(),a=I(i),o=D(a,!0),s=k(a,2);t(i),N(()=>d(o,r.session.moreError)),n(`click`,s,function(...e){r.onLoadMore?.apply(this,e)}),p(e,i)},l=e=>{var t=Ri(),i=D(t,!0);N(()=>{t.disabled=r.session.loadingMore,d(i,r.session.loadingMore?`Loading moreโ€ฆ`:`Load more results`)}),n(`click`,t,function(...e){r.onLoadMore?.apply(this,e)}),p(e,t)},h=e=>{var t=zi();p(e,t)};P(o,e=>{r.session.moreError?e(c):r.session.nextCursor?e(l,1):e(h,-1)}),p(e,i)};P(re,e=>{r.session.state===`loading`?e(ie):r.session.state===`error`?e(B,1):r.session.results.length===0?e(ae,2):e(oe,-1)}),t(ne),t(y),N(()=>{b=w(y,1,`search-results`,null,b,{covered:i()}),y.inert=a(),z(y,`aria-hidden`,i()?`true`:void 0),d(E,`Search${r.session.scope.label?` in ${r.session.scope.label}`:``}`),d(A,`Results for โ€œ${r.session.query??``}โ€`)}),n(`click`,j,function(...e){r.onClose?.apply(this,e)}),p(e,y),_()}W([`click`]);var Ui=l(``),Wi=l(`
            `),Gi=l(`

            `,1),Ki=l(`
            `),qi=l(``);function Ji(e,r){o(r,!0);let i=S(r,`saving`,3,!1),a=S(r,`error`,3,``),s=A(!1),c=U(()=>!!r.channel.archived_at),l=U(()=>`#${_t(r.channel)}`);function f(){i()||r.onClose()}var m=qi(),h=I(m),g=k(h,2),v=I(g),y=k(I(v),2);t(v);var b=k(v,2),x=I(b),C=I(x),w=D(C,!0);te(2),t(x);var T=k(x,2),E=e=>{var t=Ui(),n=D(t,!0);N(()=>d(n,a())),p(e,t)};P(T,e=>{a()&&e(E)});var O=k(T,2),j=e=>{var a=Wi(),o=I(a),s=k(o,2),c=D(s,!0);t(a),N(()=>{o.disabled=i(),s.disabled=i(),d(c,i()?`Restoring...`:`Restore channel`)}),n(`click`,o,f),n(`click`,s,()=>r.onArchivedChange(!1)),p(e,a)},F=e=>{var a=Gi(),o=ce(a),c=D(o),f=k(o,2),m=I(f),h=k(m,2),g=D(h,!0);t(f),N(()=>{d(c,`Archive ${u(l)??``}? The channel will remain available to workspace members under Archived.`),m.disabled=i(),h.disabled=i(),d(g,i()?`Archiving...`:`Archive channel`)}),n(`click`,m,()=>M(s,!1)),n(`click`,h,()=>r.onArchivedChange(!0)),p(e,a)},ee=e=>{var r=Ki(),a=I(r),o=k(a,2);t(r),N(()=>{a.disabled=i(),o.disabled=i()}),n(`click`,a,f),n(`click`,o,()=>M(s,!0)),p(e,r)};P(O,e=>{u(c)?e(j):u(s)?e(F,1):e(ee,-1)}),t(b),t(g),t(m),N(()=>{h.disabled=i(),y.disabled=i(),d(w,u(l))}),n(`click`,h,f),n(`click`,y,f),p(e,m),_()}W([`click`]);var Yi=l(`

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

            Browser notifications are not supported on this device.

            `),ea=l(`

            Browser notifications are blocked by this browser.

            `),ta=l(`

            `),na=l(`

            Show alerts when ClickClack is in the background.

            `);function ra(e,r){o(r,!0);let i=S(r,`isDesktop`,3,!1),a=A(!1),s=A(!1),c=A(`default`),l=A(``),f=A(!1);C(()=>{m(r.user.id,i())});function m(e,t){if(t){M(a,!0),M(c,`granted`),M(s,Nt(e),!0),r.onChanged?.(u(s));return}M(a,typeof Notification<`u`),M(c,u(a)?Notification.permission:`unsupported`,!0);let n=Nt(e);M(s,u(c)===`granted`&&n,!0),n&&u(c)!==`granted`&&Pt(e,!1),r.onChanged?.(u(s))}async function h(e){if(M(l,``),M(f,!1),!e){Pt(r.user.id,!1),M(s,!1),r.onChanged?.(!1),M(l,i()?`Desktop notifications disabled`:`Browser notifications disabled`,!0);return}if(i()){M(s,Pt(r.user.id,!0),!0),r.onChanged?.(u(s)),M(l,u(s)?`Desktop notifications enabled`:`Desktop notification preference could not be saved`,!0),M(f,!u(s));return}if(typeof Notification>`u`){M(a,!1),M(c,`unsupported`),M(s,!1),r.onChanged?.(!1),M(l,`Browser notifications are not supported`),M(f,!0);return}if(M(c,Notification.permission==="default"?await Notification.requestPermission():Notification.permission,!0),M(a,!0),u(c)===`granted`){M(s,Pt(r.user.id,!0),!0),r.onChanged?.(u(s)),M(l,u(s)?`Browser notifications enabled`:`Browser notification preference could not be saved`,!0),M(f,!u(s));return}Pt(r.user.id,!1),M(s,!1),r.onChanged?.(!1),M(l,u(c)===`denied`?`Browser notifications are blocked by this browser`:`Browser notifications were not enabled`,!0),M(f,!0)}var g=na(),v=I(g),y=I(v),b=D(y,!0),x=k(y,4),T=e=>{var t=$i();p(e,t)},E=e=>{var t=ea();p(e,t)};P(x,e=>{!i()&&!u(a)?e(T):!i()&&u(c)===`denied`&&e(E,1)});var j=k(x,2),F=e=>{var t=ta();let n;var r=D(t,!0);N(()=>{n=w(t,1,`settings-row2__hint`,null,n,{"is-error":u(f)}),d(r,u(l))}),p(e,t)};P(j,e=>{u(l)&&e(F)}),t(v);var ee=k(v,2),te=I(ee);O(te),t(ee),t(g),N(()=>{d(b,i()?`Desktop notifications`:`Browser notifications`),z(te,`aria-label`,i()?`Desktop notifications`:`Browser notifications`),te.disabled=!u(a)||u(c)===`denied`,L(te,u(s))}),n(`change`,te,e=>void h(e.currentTarget.checked)),p(e,g),_()}W([`change`]);var ia=l(``),aa=l(`
            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 oa(e,r){o(r,!0);let i=S(r,`isDesktop`,3,!1),a=A(``),s=A(``),c=A(``),l=U(()=>u(a).trim()||r.user.display_name||`Your name`),f=U(()=>u(s).trim().replace(/^@+/,``)||r.user.handle||``);C(()=>{M(a,r.user.display_name,!0),M(s,r.user.handle??``,!0),M(c,r.user.avatar_url,!0)});function m(){M(c,``)}Qi(e,{section:`profile`,get onUserUpdated(){return r.onUserUpdated},get onSaved(){return r.onSaved},payload:()=>({display_name:u(a),handle:u(s).trim().replace(/^@+/,``),avatar_url:u(c)}),children:(e,o)=>{var h=aa(),g=ce(h),_=I(g);ut(_,{get id(){return r.user.id},get name(){return u(l)},get src(){return u(c)},size:52,loading:`eager`,fetchPriority:`auto`});var v=k(_,2),y=I(v),b=D(y,!0),S=k(y,2),C=D(S,!0);t(v),te(2),t(g);var w=k(g,2),T=I(w),E=k(I(T),2),A=I(E);O(A),t(E),t(T);var j=k(T,2),F=k(I(j),2),ee=I(F),R=k(I(ee),2);O(R),t(ee),t(F),t(j);var ne=k(j,2),re=k(I(ne),2),ie=I(re);O(ie);var z=k(ie,2),B=e=>{var t=ia();n(`click`,t,m),p(e,t)};P(z,e=>{u(c)&&e(B)}),t(re),t(ne);var ae=k(ne,4),oe=k(I(ae),2),V=I(oe);O(V),t(oe),t(ae);var H=k(ae,2),ue=k(I(H),2),U=I(ue);O(U),t(ue),t(H);var W=k(H,2),de=k(I(W),2),fe=I(de),pe=I(fe);pe.value=pe.__value=`left`;var me=k(pe);me.value=me.__value=`right`,t(fe);var he;x(fe),t(de),t(W);var ge=k(W,2),_e=k(I(ge),2),ve=I(_e),G=I(ve);G.value=G.__value=`left`;var ye=k(G);ye.value=ye.__value=`right`,t(ve);var be;x(ve),t(_e),t(ge),ra(k(ge,4),{get user(){return r.user},get isDesktop(){return i()},get onChanged(){return r.onBrowserNotificationsChanged}}),t(w),N(()=>{d(b,u(l)),d(C,u(f)?`@${u(f)}`:`No handle set`),L(V,r.hideCommentary),L(U,r.hideToolCalls),he!==(he=r.userAlign)&&(fe.value=(fe.__value=he)??``,le(fe,he)),be!==(be=r.otherAlign)&&(ve.value=(ve.__value=be)??``,le(ve,be))}),se(A,()=>u(a),e=>M(a,e)),se(R,()=>u(s),e=>M(s,e)),se(ie,()=>u(c),e=>M(c,e)),n(`change`,V,e=>r.onHideCommentary(e.currentTarget.checked)),n(`change`,U,e=>r.onHideToolCalls(e.currentTarget.checked)),n(`change`,fe,e=>r.onUserAlign(e.currentTarget.value===`right`?`right`:`left`)),n(`change`,ve,e=>r.onOtherAlign(e.currentTarget.value===`right`?`right`:`left`)),p(e,h)},$$slots:{default:!0}}),_()}W([`click`,`change`]);var sa=l(`

            Desktop

            Mobile push

            Send push notifications to your phone via Pushover.

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

            `);function ca(e,n){o(n,!0);let r=S(n,`isDesktop`,3,!1),i=A(!1),a=A(``);C(()=>{M(i,n.user.notification_settings?.pushover_enabled??!1,!0),M(a,n.user.notification_settings?.pushover_user_key??``,!0)}),Qi(e,{section:`notifications`,get onUserUpdated(){return n.onUserUpdated},payload:()=>({notification_settings:{pushover_enabled:u(i),pushover_user_key:u(a)}}),children:(e,o)=>{var s=sa(),c=k(I(s),2);ra(c,{get user(){return n.user},get isDesktop(){return r()},get onChanged(){return n.onBrowserNotificationsChanged}});var l=k(c,4),d=k(I(l),2),f=I(d);O(f),t(d),t(l);var m=k(l,2),h=k(I(m),2),g=I(h);O(g),t(h),t(m),t(s),T(f,()=>u(i),e=>M(i,e)),se(g,()=>u(a),e=>M(a,e)),p(e,s)},$$slots:{default:!0}}),_()}var la=l(`

            Loadingโ€ฆ

            `),ua=l(`

            `),da=l(`
            You don't own any bots yet. Open a workspace's Bots & agents page to mint one.
            `),fa=l(``),pa=l(`
          • `),ma=l(`

              `),ha=l(`
              `),ga=l(`

              Account

              My bots

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

              `,1);function _a(e,r){o(r,!0);let i=A(B([])),a=A(`loading`),s=A(``);ae(()=>{c()});async function c(){M(a,`loading`);try{M(i,await xt(),!0),M(a,`ready`)}catch(e){M(a,`error`),M(s,St(e),!0)}}function l(e){r.onClose(),fe(Fe(e.workspace.route_id||e.workspace.id,`bots`))}function h(e){return e.startsWith(`@`)?e:`@${e}`}function g(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 v=U(()=>{let e=new Map;for(let t of u(i)){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=ga(),b=k(ce(y),2),x=e=>{var t=la();p(e,t)},S=e=>{var t=ua(),n=D(t,!0);N(()=>d(n,u(s))),p(e,t)},C=e=>{var t=da();p(e,t)},w=e=>{var r=ha();f(r,21,()=>u(v),e=>e.workspace.id,(e,r)=>{var i=ma(),a=I(i),o=I(a),s=D(o,!0),c=k(o,2);t(a);var _=k(a,2);f(_,21,()=>u(r).entries,e=>e.bot.id,(e,r)=>{var i=pa(),a=I(i),o=I(a),s=e=>{var t=fa();N(()=>z(t,`src`,u(r).bot.avatar_url)),p(e,t)},c=e=>{var t=m();N(e=>d(t,e),[()=>g(u(r).bot.display_name||u(r).bot.handle||`?`)]),p(e,t)};P(o,e=>{u(r).bot.avatar_url?e(s):e(c,-1)}),t(a);var f=k(a,2),_=I(f),v=D(_,!0),y=k(_,2),b=I(y),x=D(b,!0),S=k(b,4),C=D(S);t(y),t(f);var w=k(f,2);t(i),N(e=>{d(v,u(r).bot.display_name||u(r).bot.handle),d(x,e),d(C,`${u(r).active_token_count??``} - active ${u(r).active_token_count===1?`token`:`tokens`}`)},[()=>h(u(r).bot.handle)]),n(`click`,w,()=>l(u(r))),p(e,i)}),t(_),t(i),N(()=>d(s,u(r).workspace.name)),n(`click`,c,()=>l(u(r).entries[0])),p(e,i)}),t(r),p(e,r)};P(b,e=>{u(a)===`loading`?e(x):u(a)===`error`?e(S,1):u(i).length===0?e(C,2):e(w,-1)}),p(e,y),_()}W([`click`]);function va(e,t){return t.includes(`password`)&&e.password_enrolled===!0}function ya(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 ba=l(`

              `),xa=l(``),Sa=l(`
              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 Ca(e,n){o(n,!0);let r=A(``),i=A(``),a=A(``),s=A(``),c=A(!1),l=A(!1);async function f(){if(u(l))return;let e=ya(u(r),u(i),u(a));if(e){M(s,e,!0),M(c,!0);return}M(l,!0),M(s,``),M(c,!1);try{await G(`/api/auth/password/change`,{method:`POST`,body:JSON.stringify({current_password:u(r),new_password:u(i)})}),M(r,``),M(i,``),M(a,``),M(s,`Password updated. Your other devices were signed out.`)}catch(e){M(s,xe(e,`Could not change your password`),!0),M(c,!0)}finally{M(l,!1)}}var m=Sa(),h=k(I(m),2),g=I(h),y=k(I(g),2),b=I(y);O(b),t(y),t(g);var x=k(g,2),S=k(I(x),2),C=I(S);O(C),t(S),t(x);var T=k(x,2),E=k(I(T),2),j=I(E);O(j),t(E),t(T),t(h);var F=k(h,2),ee=I(F),te=e=>{var t=ba();let n;var r=D(t,!0);N(()=>{n=w(t,1,`settings-status`,null,n,{"is-error":u(c)}),d(r,u(s))}),p(e,t)},L=e=>{var t=xa();p(e,t)};P(ee,e=>{u(s)?e(te):e(L,-1)});var R=k(ee,2),ne=D(R,!0);t(F),t(m),N(()=>{R.disabled=u(l),d(ne,u(l)?`Updating...`:`Update password`)}),v(`submit`,m,e=>{e.preventDefault(),f()}),se(b,()=>u(r),e=>M(r,e)),se(C,()=>u(i),e=>M(i,e)),se(j,()=>u(a),e=>M(a,e)),p(e,m),_()}var wa=l(``),Ta=l(``),Ea=l(`

              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 Da(e,r){o(r,!0);let i=U(()=>r.user.display_name||r.user.handle||`You`),a=U(()=>(u(i)[0]??`Y`).toUpperCase()),s=A(B(Se())),c=A(B(Me())),l=A(B(Pe())),m=A(B(De()));C(()=>{r.user.appearance_preferences,M(s,Se(),!0),M(c,Me(),!0),M(l,Pe(),!0),M(m,De(),!0)});function h(e){M(s,e,!0),Ae(e)}function g(e){M(c,e,!0),we(e)}function v(e){M(l,e,!0),Te(e)}function y(e){M(m,e,!0),Oe(e)}function b(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 x=Ea(),S=k(ce(x),2),T=I(S),E=k(I(T),2),O=I(E),j=I(O),P=D(j,!0),F=k(j,2),ee=I(F),L=I(ee),R=D(L,!0);te(2),t(ee),te(2),t(F),t(O);var ne=k(O,4),re=I(ne),ie=D(re,!0),ae=k(re,2),oe=I(ae),V=I(oe),se=D(V,!0);te(2),t(oe),te(2),t(ae),t(ne),t(E),t(T);var le=k(T,4),H=I(le),ue=k(I(H),2);f(ue,23,()=>ke,e=>e.id,(e,t,r)=>{var i=wa();let a;var o=D(i,!0);N(()=>{a=w(i,1,`appearance-seg__btn`,null,a,{"is-active":u(s)===u(t).id}),z(i,`aria-checked`,u(s)===u(t).id),z(i,`tabindex`,u(s)===u(t).id?0:-1),d(o,u(t).label)}),n(`click`,i,()=>h(u(t).id)),n(`keydown`,i,e=>b(e,ke.length,u(r),e=>h(ke[e].id))),p(e,i)}),t(ue),t(H);var W=k(H,2),de=k(I(W),2),fe=I(de),pe=D(fe,!0),me=k(fe,2);f(me,23,()=>Ne,e=>e.id,(e,t,r)=>{var i=Ta();let a;N(()=>{a=w(i,1,`board-chip`,null,a,{"is-active":u(c)===u(t).id}),z(i,`aria-checked`,u(c)===u(t).id),z(i,`tabindex`,u(c)===u(t).id?0:-1),z(i,`data-board`,u(t).id),z(i,`aria-label`,`${u(t).label} โ€” ${u(t).blurb}`),z(i,`title`,`${u(t).label} โ€” ${u(t).blurb}`)}),n(`click`,i,()=>g(u(t).id)),n(`keydown`,i,e=>b(e,Ne.length,u(r),e=>g(Ne[e].id))),p(e,i)}),t(me),t(de),t(W);var he=k(W,2),ge=k(I(he),2);f(ge,23,()=>Ee,e=>e.id,(e,t,r)=>{var i=wa();let a;var o=D(i,!0);N(()=>{a=w(i,1,`appearance-seg__btn`,null,a,{"is-active":u(l)===u(t).id}),z(i,`aria-checked`,u(l)===u(t).id),z(i,`tabindex`,u(l)===u(t).id?0:-1),z(i,`title`,u(t).blurb),d(o,u(t).label)}),n(`click`,i,()=>v(u(t).id)),n(`keydown`,i,e=>b(e,Ee.length,u(r),e=>v(Ee[e].id))),p(e,i)}),t(ge),t(he);var _e=k(he,2),ve=k(I(_e),2);f(ve,23,()=>je,e=>e.id,(e,t,r)=>{var i=wa();let a;var o=D(i,!0);N(()=>{a=w(i,1,`appearance-seg__btn`,null,a,{"is-active":u(m)===u(t).id}),z(i,`aria-checked`,u(m)===u(t).id),z(i,`tabindex`,u(m)===u(t).id?0:-1),z(i,`title`,u(t).blurb),d(o,u(t).label)}),n(`click`,i,()=>y(u(t).id)),n(`keydown`,i,e=>b(e,je.length,u(r),e=>y(je[e].id))),p(e,i)}),t(ve),t(_e),t(le),t(S),N(e=>{z(T,`data-layout`,u(l)),z(T,`data-density`,u(m)),d(P,u(a)),d(R,u(i)),d(ie,u(a)),d(se,u(i)),d(pe,e)},[()=>Ne.find(e=>e.id===u(c))?.label]),p(e,x),_()}W([`click`,`keydown`]);var Oa=l(` `,1),ka=l(` `,1),$=l(` `,1),Aa=l(` `,1),ja=l(`
            • `),Ma=l(`
            • `),Na=l(`

                `),Pa=l(`

                Loading...

                `),Fa=l(`

                `),Ia=l(`

                `),La=l(`

                Account

                Profile settings

                How you appear across ClickClack.

                Sign out

                End this session on this device.

                `,1),Ra=l(`

                Account

                Notifications

                Decide when and how ClickClack should reach you.

                `,1),za=l(``);function Ba(e,r){o(r,!0);let i=S(r,`workspaces`,19,()=>[]),a=S(r,`initialSection`,3,Ie),c=S(r,`isDesktop`,3,!1),l=A(!1),m=A(``),h=A(B(Ie)),g=U(()=>va(r.user,ge())),y=A(`loading`),b=A(``);C(()=>{M(h,a(),!0)}),C(()=>{u(h);let e=new AbortController;return T(e.signal),()=>e.abort()});async function x(){if(!u(l)){M(l,!0),M(m,``);try{await G(`/api/auth/logout`,{method:`POST`,body:JSON.stringify({})}),window.location.reload()}catch(e){M(m,xe(e,`Could not sign out. Try again.`),!0),M(l,!1)}}}async function T(e){M(y,`loading`),M(b,``);try{let t=await Ce({signal:e});e.throwIfAborted(),r.onUserUpdated(t.user),M(y,`ready`)}catch(t){if(e.aborted)return;if(t instanceof be&&(t.status===401||t.status===403)){M(y,`error`),M(b,`Sign in to manage your account`);return}M(y,`error`),M(b,t instanceof Error?t.message:`Could not load your account`,!0)}}function O(e){e.target===e.currentTarget&&r.onClose()}function j(e){if(e.key!==`Escape`)return;let t=e.target;t&&(t.tagName===`INPUT`||t.tagName===`TEXTAREA`||t.isContentEditable)||(e.preventDefault(),r.onClose())}function F(e,t){r.onClose(),fe(Fe(e.route_id||e.id,t))}var ee=za();v(`keydown`,E,j);var te=I(ee),L=I(te),R=k(L,2),ne=I(R),re=k(I(ne),2);f(re,21,()=>Le,e=>e.id,(e,i)=>{var a=ja(),o=I(a);let s;var c=I(o),l=e=>{var t=Oa(),n=ce(t);ut(n,{class:`settings-modal__rail-avatar`,get id(){return r.user.id},get name(){return r.user.display_name},get src(){return r.user.avatar_url},size:18});var a=k(n,2),o=D(a,!0);N(()=>d(o,r.user.display_name||u(i).label)),p(e,t)},f=e=>{var t=ka(),n=k(ce(t),2),r=D(n,!0);N(()=>d(r,u(i).label)),p(e,t)},m=e=>{var t=$(),n=k(ce(t),2),r=D(n,!0);N(()=>d(r,u(i).label)),p(e,t)},g=e=>{var t=Aa(),n=k(ce(t),2),r=D(n,!0);N(()=>d(r,u(i).label)),p(e,t)};P(c,e=>{u(i).id===`profile`?e(l):u(i).id===`appearance`?e(f,1):u(i).id===`notifications`?e(m,2):u(i).id===`bots`&&e(g,3)}),t(o),t(a),N(()=>{s=w(o,1,`settings-modal__rail-item`,null,s,{"is-active":u(h)===u(i).id}),z(o,`aria-current`,u(h)===u(i).id?`page`:void 0)}),n(`click`,o,()=>M(h,u(i).id,!0)),p(e,a)}),t(re),t(ne);var ie=k(ne,2);f(ie,17,i,e=>e.id,(e,r)=>{var i=Na(),a=I(i),o=D(a),c=k(a,2);f(c,21,()=>K,e=>e.id,(e,i)=>{var a=s(),o=ce(a),c=e=>{var a=Ma(),o=I(a),s=k(I(o),2),c=D(s,!0);t(o),t(a),N(()=>d(c,u(i).label)),n(`click`,o,()=>F(u(r),u(i).slug)),p(e,a)},l=U(()=>!u(i).managersOnly||Re(u(r).role));P(o,e=>{u(l)&&e(c)}),p(e,a)}),t(c),t(i),N(()=>{z(a,`title`,u(r).name),d(o,`Workspace ยท ${u(r).name??``}`)}),p(e,i)}),t(R);var ae=k(R,2),oe=I(ae),V=e=>{var t=Pa();p(e,t)},se=e=>{var t=Fa(),n=D(t,!0);N(()=>d(n,u(b))),p(e,t)},le=e=>{var i=La(),a=k(ce(i),2);oa(a,{get user(){return r.user},get hideCommentary(){return r.hideCommentary},get hideToolCalls(){return r.hideToolCalls},get userAlign(){return r.userAlign},get otherAlign(){return r.otherAlign},get isDesktop(){return c()},get onUserUpdated(){return r.onUserUpdated},get onSaved(){return r.onClose},get onHideCommentary(){return r.onHideCommentary},get onHideToolCalls(){return r.onHideToolCalls},get onUserAlign(){return r.onUserAlign},get onOtherAlign(){return r.onOtherAlign},get onBrowserNotificationsChanged(){return r.onBrowserNotificationsChanged}});var o=k(a,2),s=e=>{Ca(e,{})};P(o,e=>{u(g)&&e(s)});var f=k(o,2),h=I(f),_=k(I(h),4),v=e=>{var t=Ia(),n=D(t,!0);N(()=>d(n,u(m))),p(e,t)};P(_,e=>{u(m)&&e(v)}),t(h);var y=k(h,2),b=I(y),S=D(b,!0);t(y),t(f),N(()=>{b.disabled=u(l),d(S,u(l)?`Signing out...`:`Sign out`)}),n(`click`,b,x),p(e,i)},H=e=>{Da(e,{get user(){return r.user}})},ue=e=>{var t=Ra();ca(k(ce(t),2),{get user(){return r.user},get isDesktop(){return c()},get onUserUpdated(){return r.onUserUpdated},get onBrowserNotificationsChanged(){return r.onBrowserNotificationsChanged}}),p(e,t)},W=e=>{_a(e,{get onClose(){return r.onClose}})};P(oe,e=>{u(y)===`loading`?e(V):u(y)===`error`?e(se,1):u(h)===`profile`?e(le,2):u(h)===`appearance`?e(H,3):u(h)===`notifications`?e(ue,4):u(h)===`bots`&&e(W,5)}),t(ae),t(te),t(ee),n(`click`,ee,O),n(`click`,L,function(...e){r.onClose?.apply(this,e)}),p(e,ee),_()}W([`click`]);var Va=l(`
                No thread open Hover any message and tap the bubble to keep side conversations tidy.
                `);function Ha(e){var t=Va();p(e,t)}var Ua=l(``),Wa=l(`

                `,1),Ga=l(``),Ka=l(``),qa=l(``),Ja=l(``),Ya=l(``),Xa=l(``),Za=l(``),Qa=l(`
                `),$a=l(`Connectingโ€ฆ`),eo=l(`
                `);function to(e,r){o(r,!0);function i(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=S(r,`channelNotifPreference`,3,void 0),s=S(r,`channelNotifSaving`,3,!1),c=S(r,`channelSettingsAvailable`,3,!1),l=S(r,`pinsAvailable`,3,!1),f=S(r,`pinnedOpen`,3,!1),m=S(r,`onOpenChannelSettings`,3,()=>{}),h=S(r,`onToggleChannelNotifications`,3,()=>{}),g=U(()=>gt(r.externalURL));var y=eo(),b=I(y),x=I(b),C=I(x),T=I(C),E=k(I(T),2);t(T),t(C);var A=k(C,2),M=D(A,!0),F=k(A,2),ee=e=>{var t=Wa(),n=k(ce(t),2),i=D(n,!0),a=k(n,2),o=e=>{var t=Ua();N(()=>z(t,`href`,u(g))),p(e,t)};P(a,e=>{u(g)&&e(o)}),N(()=>{z(n,`title`,r.channelTitle),d(i,r.channelTitle)}),p(e,t)};P(F,e=>{r.channelTitle&&e(ee)}),t(x);var L=k(x,2),R=k(I(L),2);O(R);var ne=k(R,2),re=e=>{var t=Ga();n(`click`,t,function(...e){r.onResetSearch?.apply(this,e)}),p(e,t)};P(ne,e=>{r.searchQuery&&e(re)}),te(2),t(L);var ie=k(L,2),B=e=>{var o=Qa(),u=I(o),d=e=>{var r=Ya(),o=I(r),c=e=>{var t=Ka();p(e,t)},l=e=>{var t=qa();p(e,t)},u=e=>{var t=Ja();p(e,t)};P(o,e=>{a()===`muted`?e(c):a()===`mentions`?e(l,1):e(u,-1)}),t(r),N((e,t)=>{z(r,`title`,e),z(r,`aria-label`,t),z(r,`aria-busy`,s()),r.disabled=s()},[()=>i(a()),()=>i(a())]),n(`click`,r,function(...e){h()?.apply(this,e)}),p(e,r)};P(u,e=>{a()&&e(d)});var g=k(u,2),_=e=>{var t=Xa();let i;N(()=>{z(t,`title`,f()?`Close pinned items`:`Pinned items`),z(t,`aria-label`,f()?`Close pinned items`:`Pinned items`),i=w(t,1,``,null,i,{active:f()})}),n(`click`,t,function(...e){r.onPinnedItems?.apply(this,e)}),p(e,t)};P(g,e=>{l()&&e(_)});var v=k(g,2),y=e=>{var t=Za();n(`click`,t,function(...e){m()?.apply(this,e)}),p(e,t)};P(v,e=>{c()&&e(y)}),t(o),p(e,o)};P(ie,e=>{(a()||l()||c())&&e(B)});var ae=k(ie,2),oe=e=>{var t=$a();p(e,t)};P(ae,e=>{r.connected||e(oe)}),t(b),t(y),N(()=>{z(y,`data-platform`,r.platform),z(C,`aria-label`,r.mobileNavigation?r.mobileNavOpen?`Close navigation`:`Open navigation`:r.sidebarCollapsed?`Expand sidebar`:`Collapse sidebar`),z(C,`title`,r.mobileNavigation?r.mobileNavOpen?`Close navigation`:`Open navigation`:r.sidebarCollapsed?`Expand sidebar`:`Collapse sidebar`),z(E,`d`,r.mobileNavigation?r.mobileNavOpen?`m15 9-3 3 3 3`:`m9 9 3 3-3 3`:r.sidebarCollapsed?`m13 9 3 3-3 3`:`m16 9-3 3 3 3`),d(M,r.workspaceName||`ClickClack`),j(R,r.searchQuery)}),n(`click`,C,function(...e){r.onToggleSidebar?.apply(this,e)}),n(`click`,A,function(...e){r.onOpenWorkspaceSettings?.apply(this,e)}),v(`submit`,L,e=>{e.preventDefault(),r.onSearch()}),n(`input`,R,e=>r.onSearchQuery(e.currentTarget.value)),p(e,y),_()}W([`click`,`input`]);var no=l(`

                `),ro=l(``),io=l(``),ao=l(``),oo=l(``),so=l(`

                `,1),co=l(`

                ClickClack

                `),lo=l(``),uo=l(``),fo=l(``),po=l(``),mo=l(`

                `);function ho(e,r){o(r,!0);function i(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=S(r,`pinnedOpen`,3,!1),s=S(r,`channelNotifPreference`,3,void 0),c=S(r,`channelNotifSaving`,3,!1),l=S(r,`channelSettingsAvailable`,3,!1),f=S(r,`onOpenChannelSettings`,3,()=>{}),m=S(r,`onToggleChannelNotifications`,3,()=>{}),h=U(()=>r.selectedDirect?void 0:gt(r.selectedChannel?.external_url));var g=mo(),y=I(g),b=I(y),x=e=>{var t=no(),n=D(t,!0);N(e=>d(n,e),[()=>`@${rt(r.selectedDirect,r.currentUserID)}`]),p(e,t)},C=e=>{var a=so(),o=ce(a),l=D(o,!0),u=k(o,2),f=e=>{var r=oo(),a=I(r),o=e=>{var t=ro();p(e,t)},l=e=>{var t=io();p(e,t)},u=e=>{var t=ao();p(e,t)};P(a,e=>{s()===`muted`?e(o):s()===`mentions`?e(l,1):e(u,-1)}),t(r),N((e,t)=>{z(r,`title`,e),z(r,`aria-label`,t),z(r,`aria-busy`,c()),r.disabled=c()},[()=>i(s()),()=>i(s())]),n(`click`,r,function(...e){m()?.apply(this,e)}),p(e,r)};P(u,e=>{s()&&e(f)}),N(e=>d(l,e),[()=>`#${_t(r.selectedChannel)}`]),p(e,a)},T=e=>{var t=co();p(e,t)};P(b,e=>{r.selectedDirect?e(x):r.selectedChannel?e(C,1):e(T,-1)});var E=k(b,4),A=D(E,!0);t(y);var M=k(y,2),F=k(I(M),2);O(F);var ee=k(F,2),L=e=>{var t=lo();n(`click`,t,function(...e){r.onResetSearch?.apply(this,e)}),p(e,t)};P(ee,e=>{r.searchQuery&&e(L)}),te(2),t(M);var R=k(M,2),ne=I(R),re=e=>{var t=uo();N(()=>z(t,`href`,u(h))),p(e,t)};P(ne,e=>{u(h)&&e(re)});var ie=k(ne,2);let B;var ae=k(ie,2),oe=e=>{var t=fo();let i;N(()=>{z(t,`title`,a()?`Close pinned items`:`Pinned items`),z(t,`aria-label`,a()?`Close pinned items`:`Pinned items`),i=w(t,1,``,null,i,{active:a()})}),n(`click`,t,function(...e){r.onPinnedItems?.apply(this,e)}),p(e,t)};P(ae,e=>{r.selectedChannel&&e(oe)});var V=k(ae,2),se=e=>{var t=po();n(`click`,t,function(...e){f()?.apply(this,e)}),p(e,t)};P(V,e=>{r.selectedChannel&&l()&&e(se)}),t(R),t(g),N(()=>{d(A,r.workspaceName||`no workspace`),j(F,r.searchQuery),z(ie,`title`,r.threadOpen?`Close thread`:`Open a message thread`),z(ie,`aria-label`,r.threadOpen?`Close thread`:`Open a message thread`),B=w(ie,1,``,null,B,{active:r.threadOpen})}),v(`submit`,M,e=>{e.preventDefault(),r.onSearch()}),n(`input`,F,e=>r.onSearchQuery(e.currentTarget.value)),n(`click`,ie,function(...e){r.onToggleThread?.apply(this,e)}),p(e,g),_()}W([`click`,`input`]);function go(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 _o(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=go(a.userId,t,n);e&&i.push(e)}return i}async function vo(e){return(await G(`/api/workspaces/${e}/bot-commands`)).bot_commands??[]}function yo(e){let t=e.trim().toLowerCase();return t?t.startsWith(`/`)?t:`/${t}`:``}function bo(e){let t=/^(\/\S+)\s*([\s\S]*)$/.exec(e);return t?{command:yo(t[1]),text:t[2].trim()}:null}function xo(e,t){return e.find(e=>!e.revoked_at&&yo(e.command)===t)}async function So(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 Co=e({default:()=>Ro}),wo=l(``),To=l(``),Eo=l(``),Do=l(`
                Showing topic
                `),Oo=l(`

                `),ko=l(`
                `),Ao=l(``),jo=l(``),Mo=l(``),No=l(` `,1),Po=l(`

                Loading threadโ€ฆ

                `),Fo=l(`
                Thread
                `,1),Io=l(``),Lo=l(`
                `,1);function Ro(e,i){o(i,!1);let a=()=>g(tt,`$threadView`,l),[l,h]=ue(),C=R(),T=R(),O=R(),A=R(),j=R(),F=R(),ee=R(),te=R(),L=R(),B=R(),se=R(),U=R(),W=R(),me=R(),he=R(),ge=R(),ye=R(),Se=R(),we=R(),Te=R(),Ee=R(),De=R(),Oe=R(),ke=R(),Ae=Date.now(),je=Ft?.integratedTitleBar===!0,Me=R(Tt),Ne=S(i,`routeWorkspaceID`,8,``),Pe=S(i,`routeTargetID`,8,``),K=R(null),Ie=new $e(()=>u(K)?.id||``),Le=new ze(qo),Re=R([]),q=R([]),He=R([]),We=R(null),Ke=new Map,qe=new Map,Je=R(!1),J=R([]),Ye=R([]),Y=R(``),X=R(``),Z=R(``),Q=new yt(()=>`${u(Y)}:${$()}`,$o),tt=de(()=>({root:Q.root,selection:Q.selection,replies:Q.replies,state:Q.state,draft:Q.draft,error:Q.error})),it=R(``),ot=R(``),st=0,ct=``,lt=new Map,ut=R(null),dt=R(!1),mt=R([]),gt=R(!1),xt=R(``),St=R(new Set),Et=0,Dt=R([]),Ot=R([]),jt=R([]),Mt=R([]),Lt=R(null),Rt=R([]),zt=R(``),Bt=R(null),Vt=R(null),Ht=R(``),Ut=R(null),Wt=R(null),Gt=R(null),Kt=new Set,Jt=R(``),Yt=R(``),Xt=R(``),Zt=R(``),Qt=R(null),$t=R(``),en=R(``),an=R(``),on=0,sn=R(``),ln=R(null),un=R(!1),dn=0,fn=0,pn=R(null),hn=R(``),gn=null,_n=R(!1),vn=R(`profile`),yn=R(!1),bn=R(!1),Sn=R(``),wn=R(!1),Tn=R(!1),En=R(!1),Dn=R(!1),On=R(!1),kn=R(`left`),An=R(`left`),jn=R(!1),Mn=R(!1),Nn=R(!1),Pn=R(``),Fn=``,In=``,Ln=null,Rn=R(null),zn=new Map,Bn=R(new Map),Vn=new ft(()=>[u(K)?.id,u(Y),$()].join(`:`)),Hn=new Set,Un=R(`idle`),Wn=`idle`,Gn=!1,Kn=!1,qn=R(!1),Jn=R(!1),Yn=R(!1),Xn=R(!1),Zn=new Map,Qn=0,$n=R(``),er=R(void 0),tr=R(``),nr=R(!0),rr=R(!1),ar=R(!1),or=R(!1),sr=R(!1),cr=R(null),lr=R(null),ur=R(null),dr=R(null),fr=R(`message`),mr=R([]),hr,vr=R([]),br,xr=R(Date.now()),Sr,wr=``,Tr=0,Dr=0,Or=0,Ar=0,jr=0,Mr=0,Nr=0,Pr=0,Ir=null,Lr=R(``),Rr=0,zr=0,Br=0,Vr=0,Hr=0,Wr=R(null),Gr,Kr=R(new Set),qr=R(null),Jr=R(``);function Yr(e){e!==ct&&(ct=e,M(it,``),Xr(``))}function Xr(e){e!==u(ot)&&(M(ot,e),st+=1)}function Zr(){return`${u(Y)}:${$()}:${u(ot)}:${st}:${Dr}`}function Qr(e,t){return t?e.filter(e=>!e.archived_at&&(!e.channel_id||e.channel_id===t)):[]}pe(()=>{Ft?.setActiveRoute(`${window.location.pathname}${window.location.search}${window.location.hash}`)}),ae(()=>{ei(),At(e=>G(e)).then(e=>{M(Me,e)}),Sr=window.setInterval(()=>{M(xr,Date.now())},3e4),fi(),ai();let e=window.matchMedia(`(max-width: 820px)`),t=()=>{M(or,!1),M(sr,e.matches)};t();let n=Ft?.onNavigate(e=>{fe(e,{keepFocus:!0,noScroll:!0})}),r=Ft?.onQuickCompose(()=>$r());return e.addEventListener(`change`,t),()=>{e.removeEventListener(`change`,t),n?.(),r?.()}});function $r(){y().then(()=>{(u(fr)===`thread`?u(dr):u(ur))?.focus()})}function ei(){(e=>{M(Dn,e.hideCommentary),M(On,e.hideToolCalls),M(kn,e.userAlign),M(An,e.otherAlign)})(tn()),rn(u(kn),u(An))}function ti(e){M(kn,e),rn(u(kn),u(An)),nn(`userAlign`,e)}function ni(e){M(An,e),rn(u(kn),u(An)),nn(`otherAlign`,e)}function ri(e){M(Dn,e),nn(`hideCommentary`,e)}function ii(e){M(On,e),nn(`hideToolCalls`,e)}ne(()=>{xs(),Q.close(),Tr+=1,Dr+=1,Vn.clear(),Pr+=1,Ir?.abort(),Ln?.close(),Ln=null,M(Nn,!1),Cn(),hr&&window.clearInterval(hr),br&&window.clearInterval(br),Sr&&window.clearInterval(Sr),Gr&&clearTimeout(Gr),Xs(!1,null)});async function ai(){try{let e=await Ce();M(K,e.user),fi(),await pi(),M(jn,!0)}catch(e){oi(e)}}function oi(e){if(e instanceof be&&(e.status===401||e.status===403)){Ln?.close(),Ln=null,M(_n,!1),M(Mn,!0),M(jn,!1);return}M(Lt,{kind:`error`,text:xe(e,`Could not load ClickClack`)})}function si(){u(K)&&(M(vn,`profile`),M(_n,!0))}function ci(){let e=u(T)?.route_id||u(Y)||Ne();e&&fe(Fe(e))}function li(){u(ee)&&(M(Sn,``),M(yn,!0))}async function ui(e){let t=u(F);if(!(!t||!u(ee)||u(bn))){M(bn,!0),M(Sn,``);try{let n=await G(`/api/channels/${t.id}`,{method:`PATCH`,body:JSON.stringify({archived:e})});M(q,u(q).map(e=>e.id===n.channel.id?n.channel:e)),M(yn,!1)}catch(t){M(Sn,xe(t,e?`Could not archive channel`:`Could not restore channel`))}finally{M(bn,!1)}}}function di(e){M(K,e),uo(e),Q.updateAuthor(e)}function fi(){if(Ft){M(En,Nt(u(K)?.id||``));return}let e=Nt(u(K)?.id||``);M(En,typeof Notification<`u`&&Notification.permission===`granted`&&e),e&&!u(En)&&Pt(u(K)?.id||``,!1)}async function pi(){let e=++Or,t=await G(`/api/workspaces`);e===Or&&M(Re,t.workspaces)}function mi(e=``,t=``){return`${e||``}/${t||``}`}function gi(e=u(Y),t=``){let n=yi(e);if(!n)return`/app`;let r=`/app/${encodeURIComponent(n)}`,i=bi(t);return i?`${r}/${encodeURIComponent(i)}`:r}async function _i(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`);lo({id:t.message.id,route_id:t.message.route_id});let n=yi(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 vi(e){let t=u(q).find(t=>t.id===e)?.route_id||u(J).find(t=>t.id===e)?.route_id;return t?gi(u(Y),t):!u(Y)||!e?`/app`:`/app/${encodeURIComponent(u(Y))}/${encodeURIComponent(e)}`}function yi(e=u(Y)){return e?u(Re).find(t=>t.id===e||t.route_id===e)?.route_id||e:``}function bi(e=``){return e?u(q).find(t=>t.id===e||t.route_id===e)?.route_id||u(J).find(t=>t.id===e||t.route_id===e)?.route_id||Q.root?.id===e&&Q.root.route_id||u(Ye).find(t=>t.id===e)?.route_id||e:``}async function xi(e=u(Y),t=``,n=!1){let r=gi(e,t);window.location.pathname!==r&&await fe(r,{replaceState:n,noScroll:!0,keepFocus:!0})}function Si(e,t){mi(e,t)!==wr&&Ni(e,t)}function Ci(){Tr++,wr=mi(yi(),bi($())),xi(u(Y),$())}function wi(){u(un)&&hs(),Q.close(),M(ut,null),M(dt,!1),M(fr,`message`),M(or,!1)}function Ei(e=u(Y)){return Ai(e)||u(q).find(e=>e.name.toLowerCase()===`guest`)?.id||u(q)[0]?.id||u(J)[0]?.id||``}function Di(e=u(Y)){return u(Re).find(t=>t.id===e||t.route_id===e)}function Oi(e=u(Y)){let t=Di(e),n=t?.route_id||t?.id||e;return n?`clickclack:last-channel:v1:${n}`:``}function ki(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 Ai(e=u(Y)){let t=Oi(e);if(!t)return``;let n;try{let e=window.localStorage.getItem(t);if(!e)return``;n=ki(e)}catch{return``}let r=u(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 ji(e,t){if(!e||!t)return;let n=u(q).find(e=>e.id===t);if(!n)return;let r=Oi(e);if(r)try{window.localStorage.setItem(r,JSON.stringify({id:n.id,routeID:n.route_id}))}catch{}}function Mi(e){In===e&&(In=``,js())}async function Ni(e=``,t=``){let n=++Tr;wr=mi(e,t),t!==Q.selection?.messageID&&t!==Q.root?.route_id&&Q.close();try{Ie.clear();let r=t.trim()?await Fi(e,t):null;if(n!==Tr)return;let i=r?u(Re).find(e=>e.id===r.workspace_id):u(Re).find(t=>t.id===e||t.route_id===e)||u(Re)[0];if(!i){fa(``,{messages:[],oldest_seq:0,newest_seq:0,has_older:!1,has_newer:!1},`replace`);return}let a=u(Y)!==i.id;if(a&&(so(),Le.clear(),Vn.clear(),Li(),M(Y,i.id),jr+=1,Rr+=1,zr+=1,Pr+=1,Ir?.abort(),M(Lr,``),M(jt,[]),M(Mt,[]),M(He,[]),M(Ot,[]),M(X,``),M(Z,``),Q.close(),M(ut,null),M(fr,`message`),hs(),ya(),M(nr,!0),In=i.id),(a||u(q).length===0)&&await Wi(!1,!1),n!==Tr||((a||u(J).length===0)&&await Cs(),a&&(await Promise.all([qi(),Xi(i.id),Zi(i.id),Gi(i.id)]),Yi(i.id)),n!==Tr))return;if(r){let e=await Pi(r,n);if(n!==Tr)return;if(!e){wi(),await xi(i.id,Ei(),!0);return}}if(r?.canonical_path&&window.location.pathname!==r.canonical_path&&(wr=mi(r.workspace_route_id,r.target_route_id),await fe(r.canonical_path,{replaceState:!0,noScroll:!0,keepFocus:!0}),n!==Tr))return;if(r?.target_type===`channel`&&u(q).some(e=>e.id===r.target_id)){let e=r.target_id,t=!a&&u(X)===e&&!u(Z)&&u($n)===e;if(M(X,e),M(Z,``),ji(i.id,e),wi(),t){ga(e),Mi(i.id);return}if(Yr(e),await Promise.all([oa(),tc()]),n!==Tr)return;Mi(i.id);return}if(r?.target_type===`direct`&&u(J).some(e=>e.id===r.target_id)){let e=r.target_id,t=!a&&u(Z)===e&&!u(X)&&u($n)===e;if(M(Z,e),M(X,``),wi(),t){ga(e),Mi(i.id);return}if(Yr(e),await oa(),n!==Tr)return;Mi(i.id);return}if(r?.target_type===`thread`){let e=await Ii(r,n);if(n!==Tr)return;e&&Mi(i.id);return}let o=Ei();if(wi(),!o){M(X,``),M(Z,``),Yr(``),await oa(),(e!==i.route_id||t)&&await xi(i.id,``,!0),Mi(i.id);return}await xi(i.id,o,!0)}catch(e){n===Tr&&oi(e)}}async function Pi(e,t){return e.target_type===`channel`?(u(q).some(t=>t.id===e.target_id)||await Wi(!1,!1,!1),t===Tr&&u(q).some(t=>t.id===e.target_id)):e.target_type===`direct`?(u(J).some(t=>t.id===e.target_id)||(await Cs(),u(J).some(t=>t.id===e.target_id)||ws((await G(`/api/dms/${e.target_id}`)).conversation)),t===Tr&&u(J).some(t=>t.id===e.target_id)):e.parent_type===`channel`&&e.parent_id?(u(q).some(t=>t.id===e.parent_id)||await Wi(!1,!1,!1),t===Tr&&u(q).some(t=>t.id===e.parent_id)):e.parent_type===`direct`&&e.parent_id?(u(J).some(t=>t.id===e.parent_id)||(await Cs(),u(J).some(t=>t.id===e.parent_id)||ws((await G(`/api/dms/${e.parent_id}`)).conversation)),t===Tr&&u(J).some(t=>t.id===e.parent_id)):!0}async function Fi(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 Ii(e,t){if(e.workspace_id!==u(Y))return!1;let n=e.parent_type===`channel`&&e.parent_id||``,r=e.parent_type===`direct`&&e.parent_id||``;if(n){if(!u(q).some(e=>e.id===n))return!1;M(X,n),M(Z,``),ji(e.workspace_id,n)}else if(r){if(!u(J).some(e=>e.id===r))return!1;M(Z,r),M(X,``)}else return!1;Vn.prune();let i=Q.root?.id===e.target_id&&u($n)===$();if(M(ut,null),M(dt,!1),M(fr,`thread`),M(or,!1),!await Qo(e.target_id,void 0,()=>t===Tr))return!1;let a=Q.selection;if(n&&await tc(),!Q.isCurrent(a)||t!==Tr)return!1;if(!i&&n&&Q.root&&(Q.root.thread_state?.reply_count??0)===0){let e=Q.root;return Q.close(),M(fr,`message`),await ys(e),!0}return!i&&Q.root&&await ys(Q.root),!0}function Li(){on++,M(Qt,null),M($t,``),M(en,``),M(an,``),M(rr,!1),M(wn,!1),M(Tn,!1)}function Ri(){let e=!u(rr);Li(),M(rr,e)}function zi(){Li(),M(wn,!0)}function Bi(){Li(),M(Tn,!0),Yi()}async function Vi(){if(u(Qt)===`workspace`||!u(Yt).trim())return;let e=u(Y),t=Tr,n=++on,r=()=>n===on&&t===Tr&&e===u(Y);M(Qt,`workspace`),M($t,``);try{let e=await G(`/api/workspaces`,{method:`POST`,body:JSON.stringify({name:u(Yt)})});if(u(Re).some(t=>t.id===e.workspace.id)||M(Re,[...u(Re),e.workspace]),!r())return;M(Yt,``),M(rr,!1),M(or,!1),await xi(e.workspace.id)}catch(e){r()&&M($t,xe(e,`Could not create workspace`))}finally{n===on&&M(Qt,null)}}async function Ui(e){M(or,!1),await xi(e)}async function Wi(e=!0,t=!0,n=!0){let r=u(Y);if(!r)return;let i=++Ar,a=await G(`/api/workspaces/${r}/channels`);i===Ar&&r===u(Y)&&(M(q,a.channels),t?M(X,u(q).find(e=>e.id===u(X))?.id||u(q).find(e=>!e.archived_at)?.id||u(q)[0]?.id||``):u(X)&&!u(q).some(e=>e.id===u(X))&&M(X,``),n&&(u(un)&&hs(),Q.close(),M(ut,null),M(fr,`message`)),e&&await oa())}async function Gi(e=u(Y)){let t=++jr,n=$(),r=u(X),i=!1;if(!e){M(He,[]);return}try{let a=await G(`/api/workspaces/${e}/topics`);if(t!==jr||e!==u(Y)||(M(He,a.topics),$()!==n||u(X)!==r))return;let o=new Set(Qr(a.topics,r).map(e=>e.id));u(it)&&!o.has(u(it))&&M(it,``),u(ot)&&!o.has(u(ot))&&(Xr(``),zn.delete($()),u(Bn).delete($()),i=!0)}catch{return}if(!(!i||$()!==n))try{await sa()}catch(e){if($()!==n||u(ot))return;fo(),M(Lt,{kind:`error`,text:e instanceof Error?`Topic changed, but messages could not reload: ${e.message}`:`Topic changed, but messages could not reload`})}}function Ki(){M(fr,`message`),u(X)&&Gi()}async function qi(e=u(Y)){let t=++Nr;if(!e||e!==u(Y)||u(O)!==`owner`&&u(O)!==`moderator`){t===Nr&&M(Dt,[]);return}try{let n=await G(`/api/workspaces/${e}/moderation/members`);if(t!==Nr||e!==u(Y))return;M(Dt,n.members)}catch{t===Nr&&e===u(Y)&&M(Dt,[])}}async function Yi(e=u(Y)){let t=++Pr;Ir?.abort();let n=new AbortController;if(Ir=n,M(Lr,``),!e){M(Ot,[]);return}try{let r=await wt({workspaceID:e,limit:100,signal:n.signal});if(t!==Pr||e!==u(Y))return;M(Ot,r.map(e=>e.user))}catch(r){!n.signal.aborted&&t===Pr&&e===u(Y)&&(M(Ot,[]),M(Lr,Ct(r)))}}async function Xi(e=u(Y)){let t=++Rr;if(!e){M(jt,[]);return}try{let n=await G(`/api/workspaces/${e}/slash-commands`);if(t!==Rr||e!==u(Y))return;M(jt,n.slash_commands)}catch{t===Rr&&e===u(Y)&&M(jt,[])}}async function Zi(e=u(Y),t=!1){let n=++zr;if(!e){M(Mt,[]);return}try{let t=await vo(e);if(n!==zr||e!==u(Y))return;M(Mt,t)}catch(r){let i=n===zr&&e===u(Y);if(i&&M(Mt,[]),t&&i)throw r}}function Qi(e){Hr+=1,M(Lt,null)}async function $i(e,t){if(!u(Y))return;let n=await G(`/api/workspaces/${u(Y)}/moderation/members/${e}`,{method:`PATCH`,body:JSON.stringify(t)});M(Dt,[...u(Dt).filter(t=>t.user.id!==e),n.member]),await Wi(!1,!1,!1)}async function ea(){if(u(Qt)===`channel`||!u(Y)||!u(Xt).trim())return;let e=u(Y),t=Tr,n=++on,r=()=>n===on&&t===Tr&&e===u(Y);M(Qt,`channel`),M(en,``);try{let t=await G(`/api/workspaces/${e}/channels`,{method:`POST`,body:JSON.stringify({name:u(Xt),kind:`public`})});if(e===u(Y)&&!u(q).some(e=>e.id===t.channel.id)&&M(q,[...u(q),t.channel]),!r())return;M(Xt,``),M(wn,!1),await xi(e,t.channel.id)}catch(e){r()&&M(en,xe(e,`Could not create channel`))}finally{n===on&&M(Qt,null)}}async function ta(e){M(or,!1),ji(u(Y),e);let t=gi(u(Y),e);e===u(X)&&!u(Z)&&window.location.pathname===t||await xi(u(Y),e)}async function na(e,t){let n=++Br;if(M(We,null),!(!e||t))try{let t=await G(`/api/channels/${e}/notification-settings`);if(n!==Br||e!==u(X)||u(Z))return;Qa(e,t.preference),M(We,t.preference)}catch{if(n===Br&&e===u(X)&&!u(Z)){let t=Za(e)||`all`;Qa(e,t),M(We,t)}}}async function ra(){let e=u(X);if(!e||u(Z)||u(Je)||!u(We))return;let t=++Br,n=[`all`,`mentions`,`muted`],r=u(We),i=n[(n.indexOf(r)+1)%n.length];M(We,i),Qa(e,i),M(Je,!0);try{await G(`/api/channels/${e}/notification-settings`,{method:`PATCH`,body:JSON.stringify({preference:i})})}catch{Ke.get(e)===i&&Qa(e,r),t===Br&&e===u(X)&&!u(Z)&&M(We,r)}finally{M(Je,!1)}}function ia(e=!1){ya(),M(nr,e),Dr+=1,Vn.prune();let t=Zr();return()=>Zr()===t}async function aa(e,t=`replace`,n=ia()){let r=$();r!==u($n)&&M(nr,!0);try{if(!r){n()&&fa(``,{messages:[],oldest_seq:0,newest_seq:0,has_older:!1,has_newer:!1},t);return}await Vn.run(()=>G(ua(e)),e=>{let n=e,i=u(Bn).get(r);!n.has_newer&&i&&i.newest_seq>n.newest_seq&&(n=i.oldest_seq>n.newest_seq?i:{...n,messages:ba(n.messages,i.messages.filter(e=>po(e)>n.newest_seq)),newest_seq:i.newest_seq,has_newer:i.has_newer}),fa(r,n,t)},n)}catch(e){if(n())throw e}finally{n()&&M(nr,!1)}}async function oa(e=!0){return e&&so(),aa(ca())}async function sa(e=ia()){let t=$();if(t)return M(nr,!0),zn.set(t,{atBottom:!0}),aa(`limit=100`,`replace`,e)}function ca(){let e=la(),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 la(){return u(Z)?u(J).find(e=>e.id===u(Z))||{}:u(X)&&u(q).find(e=>e.id===u(X))||{}}function ua(e){let t=u(Z)?`/api/dms/${u(Z)}/messages`:`/api/channels/${u(X)}/messages`,n=new URLSearchParams(e);!u(Z)&&u(ot)&&n.set(`topic_id`,u(ot));let r=n.toString();return r?`${t}?${r}`:t}async function da(e){if(!u(X)||e===u(ot))return;let t=$(),n=u(ot),r=u(it),i=u(Bn).get(t),a=zn.get(t);Xr(e);let o=st;e&&M(it,e),zn.delete(t),u(Bn).delete(t);try{await sa()}catch(s){if($()!==t||st!==o)return;Xr(n),u(it)===e&&M(it,r),u(Bn).delete(t);let c=st;try{if(await sa(),$()!==t||st!==c)return;a&&(zn.set(t,a),M(er,a))}catch{if($()!==t||st!==c)return;i?(pa(t,i),co(t,i.messages),ga(t,i)):fo(),a&&(zn.set(t,a),M(er,a))}M(Lt,{kind:`error`,text:s instanceof Error?`Topic could not change: ${s.message}`:`Topic could not change`})}}function fa(e,t,n){let r=Ho(e).flatMap(e=>e.receipt?[e.receipt]:[]).sort((e,t)=>po(e)-po(t)),i=po(t.messages.at(-1));if(!t.has_newer)for(let e of r)po(e)===i+1&&(t={...t,messages:[...t.messages,e]},i=po(e));r.some(e=>po(e)>i)&&(t={...t,has_newer:!0});let a=Sa(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),d={messages:a,oldest_seq:o,newest_seq:s,has_older:t.has_older||c,has_newer:t.has_newer||l};pa(e,d),ga(e,d),(n!==`append`||e!==u($n))&&M(er,zn.get(e)),co(e,a)}function pa(e,t){e&&(u(Bn).delete(e),u(Bn).set(e,t),ma(e),ha(e),M(Bn,new Map(u(Bn))))}function ma(e){let t=u(Bn).size+1;for(;u(Bn).size>8&&t>0;){t--;let n=u(Bn).keys().next().value;if(!n)return;if(n===e){let e=u(Bn).get(n);u(Bn).delete(n),e&&u(Bn).set(n,e);continue}u(Bn).delete(n)}}function ha(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 ga(e,t=u(Bn).get(e)){e===$()&&(M(qn,t?.has_older||!1),M(Jn,t?.has_newer||!1))}function _a(e){let t=u(Bn).get(e);!e||!t||(pa(e,{...t,has_newer:!0}),ga(e))}function va(e,t){e===`older`?(M(Un,t),M(Yn,t===`loading`)):(Wn=t,M(Xn,t===`loading`))}function ya(){Hn=new Set,M(Un,`idle`),Wn=`idle`,Gn=!1,Kn=!1,M(Yn,!1),M(Xn,!1)}function ba(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 xa(e){let t=new Set,n=Va(e);if(n>=0){let r=Ua(e,u(Ye),n);r&&t.add(r.id)}let r=zn.get(e)?.anchorMessageID;r&&t.add(r);let i=Le.session(e);i&&t.add(i.messageID),Q.root&&mo(Q.root,e)&&t.add(Q.root.id),u(cr)&&mo(u(cr),e)&&t.add(u(cr).id);for(let n of u(Ye))(n.status===`pending`||n.status===`failed`)&&mo(n,e)&&t.add(n.id);return t}function Sa(e,t,n){return Ve(t,n,xa(e))}function Ca(){if(u(Un)!==`idle`){Gn=!0;return}Ta()}function wa(e=!1){if(Wn!==`idle`){e&&(Kn=!0);return}Ea()}async function Ta(){let e=$(),t=Zr(),n=u(Bn).get(e),r=`${t}:older`;if(u(Un)!==`idle`){Gn=!0;return}if(!e||!n?.has_older||n.oldest_seq<=0||Hn.has(r))return;Hn.add(r),Gn=!1,va(`older`,`loading`),so();let i=!1;try{await Vn.run(()=>G(ua(`before_seq=${encodeURIComponent(String(n.oldest_seq))}&limit=50`)),t=>{let n=u(Bn).get(e);n&&(fa(e,{...n,messages:ba(t.messages,n.messages),has_older:t.has_older},`prepend`),i=!0,va(`older`,`settling`))},()=>Zr()===t)}catch(e){Zr()===t&&M(Lt,{kind:`error`,text:xe(e,`Could not load older messages`)})}finally{Hn.delete(r),Zr()===t&&!i&&va(`older`,`idle`)}}async function Ea(){let e=$(),t=Zr(),n=u(Bn).get(e),r=`${t}:newer`;if(Wn!==`idle`){Kn=!0;return}if(!e||Hn.has(r))return;if(!n||n.newest_seq<=0){await oa();return}Hn.add(r),Kn=!1,va(`newer`,`loading`);let i=!1;try{await Vn.run(()=>G(ua(`after_seq=${encodeURIComponent(String(n.newest_seq))}&limit=50`)),t=>{i=Oa(e,t,n.newest_seq),i&&va(`newer`,`settling`)},()=>Zr()===t)}catch(e){Zr()===t&&M(Lt,{kind:`error`,text:xe(e,`Could not load newer messages`)})}finally{Hn.delete(r),Zr()===t&&!i&&va(`newer`,`idle`)}}async function Da(e){let t=$(),n=Zr();if(!u(Y)||!t)return;let r=u(Bn).get(t);if(!r||r.newest_seq<=0){await oa();return}await Vn.run(()=>G(ua(`after_seq=${encodeURIComponent(String(r.newest_seq))}&limit=50`)),e=>{Oa(t,e,r.newest_seq)},()=>e()&&Zr()===n)}function Oa(e,t,n){let r=u(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 ja(e,t=u(Ye)){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 Ma(e,t){return e&&t.unread_count||0}async function Na(e,t){let n=u(q).find(t=>t.id===e);if(n&&!(t<=0||t<=(n.last_read_seq||0))){M(q,u(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 Pa(e,t){let n=u(J).find(t=>t.id===e);if(n&&!(t<=0||t<=(n.last_read_seq||0))){M(J,u(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 Fa(e){let t=u(Bn).get(e)?.newest_seq||0,n=u(q).find(t=>t.id===e);if(n)return Math.max(n.last_seq||0,(n.last_read_seq||0)+(n.unread_count||0),Aa(e),t);let r=u(J).find(t=>t.id===e);return r?Math.max(r.last_seq||0,(r.last_read_seq||0)+(r.unread_count||0),ja(e),t):0}function Ia(e){let t=u(Bn).get(e);return!t||t.has_newer?0:u(q).find(t=>t.id===e)?Aa(e):u(J).find(t=>t.id===e)?ja(e):0}function La(e={}){if(!e.all&&Date.now()e.id===t))return;if(!e.all&&!e.seq){let e=Va(t);if(e>=0&&!io(t,e))return}let n=e.all?Math.max(e.seq||0,Fa(t)):e.seq||Ia(t);if(!(n<=0)){if(u(J).some(e=>e.id===t)){Pa(t,n),e.all&&Ra(t,n);return}u(q).some(e=>e.id===t)&&(Na(t,n),e.all&&Ra(t,n))}}function Ra(e,t){Zn.delete(e),Zn=new Map(Zn),M(q,u(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)),M(J,u(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 za(e){let t=u(q).find(t=>t.id===e);return t?t.last_read_seq||0:u(J).find(t=>t.id===e)?.last_read_seq||0}function Va(e){let t=u(q).find(t=>t.id===e);if(t)return Ma(e,t)>0?t.last_read_seq||0:-1;let n=u(J).find(t=>t.id===e);return n&&Ma(e,n)>0?n.last_read_seq||0:-1}function Ua(e,t,n){for(let r of t){if(!mo(r,e)||r.parent_message_id||r.author?.id===u(K)?.id||r.author_id===u(K)?.id)continue;let t=r.channel_seq;if(typeof t==`number`&&t>n)return r}return null}function Wa(e,t){if(!e)return;let n=ro(e);if(Ma(e,n)<=0){Zn.delete(e),Zn=new Map(Zn);return}let r=n.last_read_seq||0,i=Zn.get(e);if(i?.boundarySeq===r&&i.since||!io(e,r))return;let a=Ua(e,t,r);a&&(Zn=new Map(Zn).set(e,{boundarySeq:r,since:oo(a.created_at)}))}function Ga(e,t,n){if(!e||!n)return;let r=Zn.get(e);r?.boundarySeq===t&&r.since||(Zn=new Map(Zn).set(e,{boundarySeq:t,since:oo(n)}))}function Ka(e){let t=e.payload,n=t.channel_seq??e.seq??t.seq;return typeof n==`number`?n:Number(n)||0}function qa(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 Ja(e){try{let t=await G(`/api/channels/${e}/notification-settings`);return Qa(e,t.preference),e===u(X)&&!u(Z)&&!u(Je)&&M(We,t.preference),t.preference}catch{return Za(e)||`all`}}function Ya(e){return u(K)?.id&&e?`clickclack:channel-notification:v1:${u(K).id}:${e}`:``}function Xa(e){let t=Ya(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 Za(e){return Ke.get(e)||Xa(e)}function Qa(e,t){Ke=new Map(Ke).set(e,t);let n=Ya(e);if(n)try{window.localStorage.setItem(n,t)}catch{}}async function $a(e,t){if(e.type!==`message.created`&&e.type!==`thread.reply_created`)return;let{channelID:n,dmID:r}=qa(e),i=Ka(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`||!u(En)||document.visibilityState===`visible`&&t)return;if(n){let t=await Ja(n);if(!t||!u(En))return;let r=n===u(X)&&!u(Z);if(document.visibilityState===`visible`&&r||t===`muted`||t===`mentions`&&!e.mentioned_user_ids?.includes(u(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===u(K)?.id||!u(En)||document.visibilityState===`visible`&&(n&&n===u(X)||r&&r===u(Z)))return;let d=u(q).find(e=>e.id===n),f=Vs(c)?.display_name||`ClickClack`,p=d?`#${_t(d)}`:`Direct message`;if(Ft){Ft.notify({body:eo(l),route:vi(n||r),tag:`clickclack:${s}`,title:`${f} in ${p}`});return}if(!(typeof Notification>`u`||Notification.permission!==`granted`))try{let e=new Notification(`${f} in ${p}`,{body:eo(l),tag:`clickclack:${s}`,icon:`/favicon.svg`});e.onclick=()=>{window.focus(),e.close(),n?ta(n):r&&Ts(r)}}catch{}}function eo(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 no(e){let t=e.payload,n=typeof t.direct_conversation_id==`string`?t.direct_conversation_id:``;return!n||u(J).some(e=>e.id===n)?!1:(await Cs(),u(J).some(e=>e.id===n))}function ro(e){return u(q).find(t=>t.id===e)||u(J).find(t=>t.id===e)||{}}function io(e,t,n=u(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 ao(e,t,n=u(Bn)){let r=Zn.get(e);if(r?.boundarySeq===t)return r.since;if(!io(e,t,n))return``;let i=Ua(e,u(Ye),t);return i?oo(i.created_at):``}function oo(e){let t=new Date(e);return Number.isNaN(t.getTime())?``:new Intl.DateTimeFormat(void 0,{hour:`numeric`,minute:`2-digit`}).format(t)}function so(){if(!u($n)||!u(Rn))return;let e=u(Rn).captureState();e&&zn.set(u($n),e)}function co(e,t){let n=e!==u($n);for(let[t,n]of lt)!n.message.status&&(n.draft.viewKey!==e||u(ot)&&n.draft.topicID!==u(ot))&<.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))&<.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)));M(Ye,[...o,...l].sort((e,t)=>(e.channel_seq||1/0)-(t.channel_seq||1/0))),Le.reconcile(e,u(Ye)),M($n,e),Wa(e,u(Ye)),n&&(M(mr,[]),M(vr,[]),Cn())}function lo(e){fo(Vn.updateMessage(e))}function uo(e){fo(Vn.updateAuthor(e))}function fo(e){let t=$(),n=t?u(Bn).get(t):void 0;if(e)for(let t of lt.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?fa(t,{...n,messages:r},`append`):co(t,r)}function po(e){return e?.channel_seq||0}function mo(e,t){return t?e.channel_id===t||e.direct_conversation_id===t:!1}async function go(e=()=>!0){await y(),e()&&await u(Rn)?.scrollToBottom()}function yo(){return u(Rn)?.isFollowing()||u(Rn)?.isNearBottom(96)!==!1}async function Co(e=!1){let t=u(nr)||u(Jn)||u(me)>0,n=ia();try{if(t&&await sa(n),await go(n),!n())return;u(Jn)||La({all:!0}),await go(n)}catch(t){n()&&(M(Lt,{kind:`error`,text:xe(t,`Could not jump to latest messages`)}),e&&await go(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:u(K)?.id||``,thread_root_id:n,body:t.body,body_format:`markdown`,created_at:r,author:u(K)||void 0,attachments:t.upload?[t.upload]:[],quoted_message_id:t.quotedMessageID,nonce:e,status:`pending`}}async function zo(){let e=u(Jt).trim();if(!e)return;if(u(B)&&!u(se)){M(Lt,{kind:`error`,text:`This conversation has no active recipient`});return}if(!u(X)&&!u(Z)){M(Lt,{kind:`ephemeral`,text:`Pick or create a channel to send a message.`});return}Cn(),M(Lt,null);let t=++Hr,n=$(),r=u(Z)?`dm`:`channel`,i=u(cr)&&u(lr)===r?u(cr):null;if(u(X)&&!u(Z)&&!u(pn)&&!i){let r=bo(e),i=r?xo(u(jt),r.command):void 0;if(r&&i){M(Jt,``),xs(),await Bo(u(X),r.command,r.text,e,n,t);return}}let a={body:e,quotedMessageID:i?.id,upload:u(pn)||void 0,workspaceID:u(Y),channelID:u(X)||void 0,directConversationID:u(Z)||void 0,topicID:u(X)&&u(it)||void 0,topicFilterID:u(ot),topicFilterGeneration:st,viewKey:$()};M(Jt,``),i&&ss(),xs(),await Wo(a)}async function Bo(e,t,n,r,i,a){try{let r=await So(e,t,n);if(a!==Hr||$()!==i)return;r.text&&r.response_type!==`in_channel`&&M(Lt,{kind:`ephemeral`,text:r.text})}catch(e){if(console.warn(`slash dispatch failed`,e),a!==Hr||$()!==i)return;M(Lt,{kind:`error`,text:e instanceof be&&e.message?Vo(e):`${t} failed`}),u(Jt).trim()||M(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[...lt.values()].filter(({draft:t})=>t.viewKey===e&&(!u(ot)||t.topicID===u(ot)))}async function Uo(e,t,n,r){let{draft:i}=e;if(e.message=t,$()!==i.viewKey)return;let a=!1,o=u(ot)===i.topicFilterID&&st===i.topicFilterGeneration;if(r()&&o&&u(ot)&&i.topicID!==u(ot)){Xr(``),zn.delete(i.viewKey),u(Bn).delete(i.viewKey),r=ia();try{await sa(r)}catch{a=!0}}if($()===i.viewKey){if(u(ot)&&i.topicID!==u(ot)){u(Jt).trim()||M(Jt,i.body),M(Lt,{kind:`error`,text:`${n} Clear the active topic filter to recover the draft.`});return}fo(),M(Lt,{kind:`error`,text:a?`${n} The unfiltered timeline could not reload.`:n}),await go(r)}}async function Wo(e,t,n){let r=Dr,i=()=>Dr===r&&$()===e.viewKey,a=t??Xe(),o=`tmp_${a}`,s=n??o,c=!u(ot)||e.topicID===u(ot),l=!t&&$()===e.viewKey&&c,d=Ro(a,e,s),f={draft:e,message:d,receipt:lt.get(a)?.receipt};lt.set(a,f),$()===e.viewKey&&c&&(fo(),t||go());let p=e.directConversationID?`/api/dms/${e.directConversationID}/messages`:`/api/channels/${e.channelID}/messages`,m={body:e.body,nonce:a};e.quotedMessageID&&(m.quoted_message_id=e.quotedMessageID),e.topicID&&(m.topic_id=e.topicID),e.upload&&(m.upload_id=e.upload.id);try{let t=f.receipt||(await G(p,{method:`POST`,body:JSON.stringify(m)})).message;if(f.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(f,{...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}f.receipt=t,f.message={...t,nonce:a},$()===e.viewKey?fo():lt.delete(a)}catch(t){console.warn(`send failed`,t),await Uo(f,{...d,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 Co(!0)}function Go(e){if(!e.nonce)return;let t=lt.get(e.nonce)?.draft;t&&Wo(t,e.nonce,e.id)}function Ko(e){if(!e.nonce)return;let t=lt.get(e.nonce);t?.receipt?t.message={...t.receipt,nonce:e.nonce}:lt.delete(e.nonce),fo()}async function qo(e,t){let n=Q.selection,r=()=>e===u(tr)&&Le.session(e)?.generation===t.generation&&(t.surface!==`thread`||Q.selection===n);if(r()){if(Tr++,t.surface===`thread`){if(t.threadRootID&&n?.messageID!==t.threadRootID&&(M(dt,!1),Q.select(t.threadRootID),n=Q.selection,!await Qo(t.threadRootID,void 0,r))||!await Q.target({messageID:t.messageID,threadSeq:t.threadSeq},r)||!r())return;Q.root?.route_id&&await xi(u(Y),Q.root.id)}else u(Rn)?.scrollToMessage(t.messageID),await xi(u(Y),Q.root?.id||$());for(let e=0;e<16;e+=1){if(await y(),await new Promise(e=>requestAnimationFrame(()=>e())),!r())return;let e=document.querySelector(t.surface===`timeline`?`main.timeline`:`[aria-label="Thread pane"]`)?.querySelector(`[data-message-id="${CSS.escape(t.messageID)}"]`)?.querySelector(`textarea[aria-label="Edit message"]`);if(e){e.focus({preventScroll:!0});return}}}}function Jo(e){lo(e),Q.updateMessage(e),M(mt,u(mt).map(t=>t.id===e.id?Ze(t,e):t))}function Yo(e){!e.id||e.deleted_at||u(Kr).has(e.id)||(M(qr,e),M(Jr,``))}async function Xo(){let e=u(qr);if(!(!e||u(Kr).has(e.id))){M(Kr,new Set([...u(Kr),e.id])),M(Jr,``);try{let t=(await G(`/api/messages/${e.id}`,{method:`DELETE`})).message;Le.cancelMessage($(),t.id),lo(t),Q.updateMessage(t),M(mt,u(mt).filter(e=>e.id!==t.id)),u(cr)?.id===t.id&&ss(),M(qr,null)}catch(e){M(Jr,e instanceof Error?e.message:`Could not delete message`)}finally{let t=new Set(u(Kr));t.delete(e.id),M(Kr,t)}}}async function Zo(e){Tr++,hs(),M(dt,!1),await Qo(e.id,e)&&u(Y)&&Q.root?.route_id&&await xi(u(Y),Q.root.id)}async function Qo(e,t,n=()=>!0){M(Vt,null),M(Ht,``),M(ut,null),M(fr,`thread`),Q.select(e,t);try{return await Q.open(n)}catch{return!1}}function $o(e=[]){let t=Q.root;t&&(Ie.seedMessages(e),Le.reconcile($(),[t,...Q.replies]),lo({id:t.id,thread_state:t.thread_state}))}async function es(e){await Vn.run(()=>G(`/api/messages/${e}/thread?latest=true&limit=1`),e=>{let t={...e.root,thread_state:e.thread_state};Ie.seedMessages([t]),lo(t)})}async function ts(e,t){!u(Ye).some(t=>t.id===e)&&!Vn.pending||await Vn.run(()=>G(`/api/messages/${e}`),e=>lo(e.message),t)}function ns(e,t){let n=u(Ye).find(t=>t.id===e);if(!n)return!1;let r=new Date(t.created_at).getTime();if(Number.isFinite(r)&&ra}async function rs(){u(B)&&!u(se)||await Q.send()}function is(e,t){t===`thread`?Q.setQuote(e):(M(cr,e),M(lr,t)),M(fr,t===`thread`?`thread`:`message`)}function as(){return u(qr)!==null||u(Bt)!==null||u(_n)||u(yn)||u(wn)||u(Tn)}function os(){return u(fr)===`thread`&&Q.root&&u(dr)?u(dr):u(ur)}function ss(){M(cr,null),M(lr,null)}async function cs(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=ia();if(u(Rn)?.scrollToMessage(t)??!1){await ds(t,n);return}let r=await G(`/api/messages/${t}`);!n()||!mo(r.message,$())||await ys(r.message)}async function ls(){ia(),Qn=Date.now()+1200,!(u(ye)&&u(Rn)?.scrollToDivider(!1))&&await us()}async function us(){let e=$();if(!e)return;Qn=Date.now()+1200;let t=za(e),n=Zn.get(e),r=(n?.boundarySeq===t?n.boundarySeq:t)+1;r<=0||await bs(r)}async function ds(e,t){for(let n=0;n<16;n+=1){if(await y(),await new Promise(e=>requestAnimationFrame(()=>e())),!t())return;let n=document.querySelector(`[data-message-id="${CSS.escape(e)}"]`);if(n){n.classList.add(`highlight`),window.setTimeout(()=>n.classList.remove(`highlight`),1500);return}}}async function fs(){if(!u(Y)||!u(sn).trim()){hs();return}let e=u(sn).trim();u(Vt)&&Ys(),(Q.root||u(ut))&&$s();let t=++fn,n=u(Z)&&u(B)?{workspaceID:u(Y),channelID:``,directConversationID:u(Z),label:`@${rt(u(B),u(K)?.id)}`}:u(X)&&u(F)?{workspaceID:u(Y),channelID:u(X),directConversationID:``,label:`#${_t(u(F))}`}:{workspaceID:u(Y),channelID:``,directConversationID:``,label:``};M(un,!1),dn=0;let r={query:e,scope:n,results:[],nextCursor:null,state:`loading`,error:``,loadingMore:!1,moreError:``,activeResultID:``};M(ln,r);try{let e=await G(`/api/search?${ps(r).toString()}`);if(t!==fn)return;M(ln,{...r,results:e.results,nextCursor:e.next_cursor,state:`ready`})}catch(e){if(t!==fn)return;M(ln,{...r,state:`error`,error:e instanceof be?e.message:`Search is unavailable right now.`})}}function ps(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 ms(){let e=u(ln);if(!e||e.state!==`ready`||!e.nextCursor||e.loadingMore)return;let t=fn;M(ln,{...e,loadingMore:!0,moreError:``});try{let n=await G(`/api/search?${ps(e,e.nextCursor).toString()}`);if(t!==fn||!u(ln))return;let r=new Set(u(ln).results.map(e=>e.id));M(ln,{...u(ln),results:[...u(ln).results,...n.results.filter(e=>!r.has(e.id))],nextCursor:n.next_cursor,loadingMore:!1})}catch(e){if(t!==fn||!u(ln))return;M(ln,{...u(ln),loadingMore:!1,moreError:e instanceof be?e.message:`Couldnโ€™t load more results.`})}}function hs(){fn+=1,M(sn,``),M(ln,null),M(un,!1),dn=0}function gs(e){if(e.channel_name)return`#${e.channel_name}`;if(e.direct_conversation_id){let t=u(J).find(t=>t.id===e.direct_conversation_id);return t?`@${rt(t,u(K)?.id)}`:`Direct message`}return``}async function _s(e){let t=u(ln),n=e.channel_id||e.direct_conversation_id||``;if(!(!t||!u(Y)||!n)&&(Tr++,M(ln,{...t,activeResultID:e.id}),$()!==n&&(await xi(u(Y),n),await Ni(yi(u(Y)),bi(n))),$()===n)){if(e.parent_message_id){dn=document.querySelector(`.search-results-scroll`)?.scrollTop??0;let t=fn;if(M(un,!0),!await Qo(e.thread_root_id,void 0,()=>t===fn&&u(un)&&u(ln)?.activeResultID===e.id))return;let n=()=>t===fn&&u(un)&&u(ln)?.activeResultID===e.id;if(!await Q.target({messageID:e.id,threadSeq:e.thread_seq},n)||!n())return;Q.root?.route_id&&await xi(u(Y),Q.root.id),await y(),n()&&document.querySelector(`.thread .thread-back`)?.focus({preventScroll:!0});return}if(await xi(u(Y),n),e.channel_seq&&e.channel_seq>0){await bs(e.channel_seq,e.id);return}await oa()}}async function vs(){if(Tr++,!u(ln)||!u(un))return;let e=$();Q.close(),M(ut,null),M(fr,`message`),M(un,!1),u(Y)&&e&&await xi(u(Y),e),await y();let t=document.querySelector(`.search-results-scroll`);t&&(t.scrollTop=dn),(u(ln).activeResultID?document.querySelector(`.search-result[data-result-id="${CSS.escape(u(ln).activeResultID)}"]`):null)?.focus({preventScroll:!0})}async function ys(e){let t=e.channel_seq||0;if(t<=0){await oa();return}await bs(t,e.id)}async function bs(e,t=``){let n=$();if(!n)return;let r=!!u(ot);r&&(Xr(``),u(Bn).delete(n));let i=ia(r);t&&zn.set(n,{atBottom:!1,anchorMessageID:t,anchorPixelOffset:0}),await aa(`around_seq=${encodeURIComponent(String(e))}&limit=100`,`around`,i),await y(),i()&&(t?(u(Rn)?.scrollToMessage(t),await ds(t,i)):u(Rn)?.scrollToDivider(!1))}function xs(){gn?.abort(),gn=null,M(hn,``),M(pn,null)}async function Ss(e){let t=e.currentTarget,n=t.files?.[0],r=u(Y);if(!n||!r)return;t.value=``,gn?.abort();let i=new AbortController;gn=i,M(hn,r),M(Lt,null);let a=()=>gn===i&&!i.signal.aborted&&u(Y)===r;try{let e=await It(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()&&M(pn,o.upload)}catch(e){a()&&M(Lt,{kind:`error`,text:xe(e,`Could not upload file`)})}finally{gn===i&&(gn=null)}}async function Cs(e=u(Y)){let t=++Mr;if(!e){M(J,[]);return}let n=await G(`/api/dms?workspace_id=${e}`);t===Mr&&e===u(Y)&&(M(J,n.conversations),u(Z)&&!u(J).some(e=>e.id===u(Z))&&M(Z,``))}function ws(e){M(J,u(J).some(t=>t.id===e.id)?u(J).map(t=>t.id===e.id?e:t):[...u(J),e])}async function Ts(e){M(or,!1);let t=gi(u(Y),e);e===u(Z)&&!u(X)&&window.location.pathname===t||await xi(u(Y),e)}async function Es(e){let t=e.trim();if(u(Qt)===`direct`||!u(Y)||!t)return;let n=u(Y),r=Tr,i=++on,a=()=>i===on&&r===Tr&&n===u(Y);M(Qt,`direct`),M(an,``);try{let e=await G(`/api/dms`,{method:`POST`,body:JSON.stringify({workspace_id:n,member_ids:[t]})});if(n===u(Y)&&!u(J).some(t=>t.id===e.conversation.id)&&ws(e.conversation),!a())return;M(Zt,``),M(Tn,!1),wi(),await xi(n,e.conversation.id)}catch(e){a()&&M(an,xe(e,`Could not start direct message`))}finally{i===on&&M(Qt,null)}}function Ds(){Gr&&clearTimeout(Gr),Gr=void 0,M(Wr,null)}function Os(e,t){Ds(),M(Wr,{conversation:e,restoreRoute:t,title:rt(e,u(K)?.id)}),Gr=setTimeout(()=>{M(Wr,null),Gr=void 0},8e3)}async function ks(){let e=u(Wr);if(e){Ds();try{let t=await G(`/api/dms/${e.conversation.id}/open`,{method:`POST`});ws(t.conversation),e.restoreRoute&&await xi(e.conversation.workspace_id,t.conversation.id)}catch(e){M(Lt,{kind:`error`,text:xe(e,`Could not restore direct message`)})}}}async function As(e){if(!e)return;let t=u(J).find(t=>t.id===e),n=u(Z)===e;if(await G(`/api/dms/${e}`,{method:`DELETE`}),M(J,u(J).filter(t=>t.id!==e)),t&&Os(t,n),n){wi();let e=u(q)[0]?.id||``;M(Z,``),M(X,e),e&&ji(u(Y),e),await xi(u(Y),e),await oa()}}function js(){if(Vr+=1,Ln?.close(),Ln=null,M(Nn,!1),!u(Y))return;let e=u(Y);Ln=Be({workspaceID:e,onEvent:Ns,onOpen:async(t,n)=>{let r=Fn===e;await Ms(e,t,r,n),t()&&((!r||n)&&(qe=new Map([...u(q),...u(J)].map(e=>[e.id,e.last_seq||0]))),Fn=e,M(Pn,``))},onError:t=>{if(e===u(Y)){if(t instanceof Ge){if(Ne()&&Ne()!==e&&Ne()!==yi(e))return;Ln?.close(),fe(`/app`,{invalidateAll:!0,replaceState:!0}).catch(oi);return}if(t instanceof be&&t.status===401){oi(t);return}M(Pn,xe(t,`Could not process realtime event`))}},onStatusChange:e=>{M(Nn,e)}})}async function Ms(e,t=()=>!0,n=!0,r=!0){let i=++Vr;if(!e||e!==u(Y)||!t())return;let a=Q.root?.id||``,o=u(ut)?.kind===`bot`?u(ut).id:``;if(M(mr,[]),M(vr,[]),!r){await Promise.all([Xi(e),Zi(e,!0)]);return}if(Ie.clear(),await Promise.all([pi(),Wi(!1,!1,!1),Cs(e),qi(e),Xi(e),Zi(e,!0),Gi(e)]),!(i!==Vr||e!==u(Y)||!t())){if(u(X)&&!u(q).some(e=>e.id===u(X))&&M(X,``),u(Z)&&!u(J).some(e=>e.id===u(Z))&&M(Z,``),!u(X)&&!u(Z)){let t=Ei(e);if(t){let n=u(J).some(e=>e.id===t);M(Z,n?t:``),M(X,n?``:t),n||ji(e,t),await xi(e,t,!0)}}if(!(i!==Vr||e!==u(Y)||!t())&&(await oa(n),!(i!==Vr||e!==u(Y)||!t())&&(await tc(),!(i!==Vr||e!==u(Y)||!t())&&(a&&Q.root?.id===a&&await Q.refresh(t),o&&u(ut)?.id===o)))){let e=Vs(o);M(ut,e&&!e.deleted_at?e:null)}}}async function Ns(e,t){if((e.type===`pin.added`||e.type===`pin.removed`)&&e.channel_id===u(X)&&!u(Z)){await tc();return}if(e.type===`typing.started`||e.type===`typing.stopped`){Rs(e);return}if(e.type===`agent.progress`){zs(e);return}if(e.type===`channel.read`||e.type===`dm.read`){Is(e);return}if(e.type===`bot_command.updated`){e.workspace_id===u(Y)&&Zi(e.workspace_id,!0).catch(t=>{e.workspace_id===u(Y)&&(M(Pn,xe(t,`Could not refresh bot commands`)),js())});return}if(e.type===`bot.deleted`){e.workspace_id===u(Y)&&await Ps(e);return}if(e.type===`bot.membership_removed`){e.workspace_id===u(Y)&&await Fs(e);return}if((e.type===`channel.created`||e.type===`channel.updated`)&&e.workspace_id===u(Y)){await Wi(!1,!1,!1);return}if(e.type===`member.moderation_updated`&&e.workspace_id===u(Y)){let t=u(Z),n=e.payload.user_id===u(K)?.id;if(await pi(),await qi(),await Wi(!1,n,n),n){if(await Cs(),t&&(u(J).some(e=>e.id===t)?(M(Z,t),M(X,``)):M(Z,``)),!u(X)&&!u(Z)){fa(``,{messages:[],oldest_seq:0,newest_seq:0,has_older:!1,has_newer:!1},`replace`);return}await oa()}return}e.workspace_id===u(Y)&&e.payload.topic_id&&!u(He).some(t=>t.id===e.payload.topic_id)&&await Gi(e.workspace_id),(e.type===`message.updated`||e.type===`message.deleted`)&&u(St).has(e.payload.message_id||``)&&await tc();let n=(e.channel_id===u(X)||e.payload.direct_conversation_id===u(Z))&&!(e.type===`message.created`&&u(ot)&&e.payload.topic_id!==u(ot));if(n&&(e.type===`reaction.added`||e.type===`reaction.removed`)){Ie.applyEvent(e);return}if($a(e,n),e.type===`message.created`&&!n&&(await no(e)||Ls(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&<.has(n))return;let r=yo(),i=Ka(e),a=e.type===`message.created`&&(i<=0||i>(u(Bn).get($())?.newest_seq||0));if(a&&!r?(Qn=Date.now()+1200,_a($())):a?await Da(t):e.type!==`message.created`&&await ts(e.payload.message_id||``,t),!t())return;e.type===`message.created`&&Ls(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`&&ns(r,e)&&await es(r)}async function Ps(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;M(J,u(J).map(e=>({...e,members:e.members.map(i)}))),M(Dt,u(Dt).filter(e=>e.user.id!==t)),M(jt,u(jt).filter(e=>e.bot_user_id!==t)),M(Mt,u(Mt).filter(e=>e.bot.id!==t)),M(mr,u(mr).filter(e=>e.userID!==t)),u(ln)&&M(ln,{...u(ln),results:u(ln).results.map(e=>({...e,author:i(e.author)}))}),u(ut)?.id===t&&M(ut,null);let a=Q.selection;await Promise.all([Cs(),qi(),Xi(),Zi()]),Yi(),uo({id:t,handle:``,former_handle:r,deleted_at:n}),Q.isCurrent(a)&&await Q.refresh()}async function Fs(e){let t=e.payload.bot_user_id||``;t&&(M(Dt,u(Dt).filter(e=>e.user.id!==t)),M(jt,u(jt).filter(e=>e.bot_user_id!==t)),M(Mt,u(Mt).filter(e=>e.bot.id!==t)),u(ut)?.id===t&&M(ut,null),await Promise.all([Cs(e.workspace_id),qi(e.workspace_id),Xi(e.workspace_id),Zi(e.workspace_id)]),Yi(e.workspace_id))}function Is(e){let t=e.payload,n=typeof t.user_id==`string`?t.user_id:``;if(!n||n!==u(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;M(q,u(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;M(J,u(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 Ls(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===u(K)?.id||r.parent_message_id)return;let o=Ka(e),{channelID:s,dmID:c}=qa(e),l=s||c;if(!l)return;let d=ro(l),f=s?s===u(X)&&!u(Z):c===u(Z),p=f&&(!s||!u(ot))&&(t??yo());if(o>0&&o<=(d.last_seq||0)&&!(n&&p))return;let m=o>0?o:(d.last_seq||0)+1,h=f&&!p&&(d.unread_count||0)===0;h&&Ga(l,d.last_read_seq||0,e.created_at);let g={last_seq:Math.max(d.last_seq||0,m),last_read_seq:h?Math.max(d.last_read_seq||0,m-1):d.last_read_seq||0,unread_count:p?0:(d.unread_count||0)+1};s?M(q,u(q).map(e=>e.id===l?{...e,...g}:e)):M(J,u(J).map(e=>e.id===l?{...e,...g}:e))}function Rs(e){let t=e.payload,n=typeof t.user_id==`string`?t.user_id:``;if(!n||n===u(K)?.id)return;let{channelID:r,dmID:i}=qa(e);if(!(u(X)&&r===u(X)||u(Z)&&i===u(Z)))return;if(e.type===`typing.stopped`){M(mr,u(mr).filter(e=>e.userID!==n));return}let a=Vs(n),o=u(mr).filter(e=>e.userID!==n);o.push({userID:n,user:a,expiresAt:Date.now()+_r}),M(mr,o),Hs()}function zs(e){let t=e.payload,{channelID:n,dmID:r}=qa(e);if(!(u(X)&&n===u(X)||u(Z)&&r===u(Z)))return;let i=u(vr);M(vr,Er(i,t,Date.now())),t.op!==`clear`&&u(vr)!==i&&Bs()}function Bs(){br||=window.setInterval(()=>{let e=Date.now(),t=u(vr).filter(t=>t.expiresAt>e);t.length!==u(vr).length&&M(vr,t),t.length===0&&br&&(window.clearInterval(br),br=void 0)},1e3)}function Vs(e){if(u(K)?.id===e)return u(K);let t=u(Ot).find(t=>t.id===e);if(t)return t;let n=u(Ye).find(t=>t.author?.id===e)?.author;if(n)return n;let r=u(C).find(t=>t.author?.id===e)?.author;if(r)return r;if(Q.root?.author?.id===e)return Q.root.author;let i=u(Dt).find(t=>t.user.id===e)?.user;if(i)return i;for(let t of u(J)){let n=t.members.find(t=>t.id===e);if(n)return n}}function Hs(){hr||=window.setInterval(()=>{let e=Date.now(),t=u(mr).filter(t=>t.expiresAt>e);t.length!==u(mr).length&&M(mr,t),t.length===0&&hr&&(window.clearInterval(hr),hr=void 0)},1e3)}function Us(){u(Y)&&(!u(X)&&!u(Z)||xn({workspaceID:u(Y),channelID:u(X)||void 0,directConversationID:u(Z)||void 0}))}function Ws(e){!e||e.deleted_at||(Li(),hs(),M(Vt,null),M(Ht,``),wi(),M(ut,e),Ci(),(u(O)===`owner`||u(O)===`moderator`)&&!u(Dt).some(t=>t.user.id===e.id)&&qi())}function Gs(e){e.key===`Enter`&&!e.shiftKey&&(e.preventDefault(),zo())}function Ks(e){e.key===`Enter`&&!e.shiftKey&&(e.preventDefault(),rs())}function qs(e,t){as()||M(Bt,{url:e,title:t})}function Js(e){M(Ut,document.activeElement instanceof HTMLElement?document.activeElement:null),M(Ht,u(tr)),M(Vt,e),y().then(()=>{document.querySelector(`.artifact-viewer__actions > button:last-child`)?.focus()})}function Ys(){let e=u(Ut),t=u(Vt)?.id||``;M(Vt,null),M(Ht,``),M(Ut,null),y().then(()=>{if(e?.isConnected){e.focus({preventScroll:!0});return}(Q.root?document.querySelector(`.thread`):document)?.querySelector(`[data-artifact-upload-id="${CSS.escape(t)}"]`)?.focus({preventScroll:!0})})}function Xs(e,t){for(let e of Kt)e.inert=!1;if(Kt.clear(),!(!e||!u(Gt)||!t))for(let e of u(Gt).children)!(e instanceof HTMLElement)||e===t||e.inert||(e.inert=!0,Kt.add(e))}function Zs(e){if(!u(Vt)||!u(sr)||e.key!==`Tab`||!u(Wt))return;let t=Array.from(u(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(),u(Wt).focus();return}let n=t[0],r=t[t.length-1];e.shiftKey&&(document.activeElement===n||!u(Wt).contains(document.activeElement))?(e.preventDefault(),r.focus()):!e.shiftKey&&(document.activeElement===r||!u(Wt).contains(document.activeElement))&&(e.preventDefault(),n.focus())}function Qs(e){let t=e.target;t instanceof HTMLImageElement&&t.closest(`.markdown`)&&(e.preventDefault(),qs(Ue(t),t.alt||`Image`))}function $s(){if(u(Vt)){Ys();return}if(u(dt)){M(dt,!1),Ci();return}Li(),Le.cancel($(),`thread`),wi(),Ci()}function ec(){if(Q.root){$s();return}u(De)&&$s(),M(Lt,{kind:`ephemeral`,text:`Pick a message to open its thread.`})}async function tc(){let e=u(X),t=++Et,n=()=>t===Et&&e===u(X)&&!u(Z);if(!e||u(Z)){M(mt,[]),M(xt,``),M(gt,!1);return}M(gt,!0),M(xt,``);try{await Vn.run(()=>G(`/api/channels/${e}/pins?limit=100`),e=>{M(mt,e.messages.filter(e=>!e.deleted_at))},n)}catch(e){if(!n())return;M(xt,e instanceof Error?e.message:`Could not load pinned messages`)}finally{n()&&M(gt,!1)}}async function nc(e,t){let n=u(X);if(!n||u(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===u(X)&&!u(Z)&&await tc()}function rc(){if(!u(X)||u(Z))return;let e=!u(dt);hs(),wi(),M(dt,e),Ci(),e&&tc()}async function ic(e){Tr++,M(dt,!1),await Qo(e.thread_root_id,e.parent_message_id?void 0:e)&&u(Y)&&Q.root?.route_id&&window.location.pathname!==gi(u(Y),Q.root.id)&&await xi(u(Y),Q.root.id)}function ac(e){if(!(e.isComposing||e.keyCode===229)&&(Zs(e),!e.defaultPrevented)){if(e.key===`Escape`){if(e.target instanceof Element&&e.target.closest(`[data-handles-escape]`)||u(Bt))return;if(as())oc();else if(u(or)){e.preventDefault(),sc();return}else if(u(Vt)){e.preventDefault(),$s();return}else if(u(un)){e.preventDefault(),$s();return}else if(u(Oe)){e.preventDefault(),hs();return}else if(u(cr)||Q.draft?.quote){e.preventDefault(),Q.draft?.quote&&(u(fr)===`thread`||!u(cr))?Q.setQuote(null):ss();return}else{e.preventDefault(),Co();return}}if(u(or)&&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}}mn(e,{authRequired:u(Mn),isModalOpen:()=>as()||u(or),messageInput:u(ur),replyInput:u(dr),target:os})}}function oc(){u(qr)&&u(Kr).has(u(qr).id)||u(bn)||(Li(),M(qr,null),M(Jr,``),M(Bt,null),M(_n,!1),M(yn,!1),M(Sn,``))}function sc(){M(or,!1)}function cc(){if(u(sr)){M(or,!u(or));return}M(ar,!u(ar))}V(()=>a(),()=>{M(C,a().replies)}),V(()=>(u(hn),u(Y)),()=>{u(hn)&&u(hn)!==u(Y)&&xs()}),V(()=>(u(Re),u(Y)),()=>{M(T,u(Re).find(e=>e.id===u(Y)))}),V(()=>u(T),()=>{M(O,u(T)?.role||``)}),V(()=>u(O),()=>{M(A,u(O)===`owner`)}),V(()=>(u(ut),u(Dt)),()=>{M(j,u(ut)?u(Dt).find(e=>e.user.id===u(ut)?.id):void 0)}),V(()=>(u(q),u(X)),()=>{M(F,u(q).find(e=>e.id===u(X)))}),V(()=>(u(F),u(O)),()=>{M(ee,!!u(F)&&(u(O)===`owner`||u(O)===`moderator`))}),V(()=>(u(He),u(X)),()=>{M(te,Qr(u(He),u(X)))}),V(()=>(u(te),u(ot)),()=>{M(L,u(te).find(e=>e.id===u(ot)))}),V(()=>(u(X),u(Z)),()=>{na(u(X),u(Z))}),V(()=>(u(J),u(Z)),()=>{M(B,u(J).find(e=>e.id===u(Z)))}),V(()=>u(B),()=>{M(se,u(B)?.can_send??!0)}),V(()=>(u(Z),u(X)),()=>{M(tr,u(Z)||u(X)||``)}),V(()=>u(tr),()=>{Yr(u(tr))}),V(()=>u(tr),()=>{Qi(u(tr))}),V(()=>(u(X),u(Mt),u(B)),()=>{M(U,u(X)?u(Mt):u(B)?u(Mt).filter(e=>u(B)?.members?.some(t=>t.id===e.bot.id)):[])}),V(()=>(u(Z),u(J),u(X),u(q)),()=>{M(W,u(Z)?u(J).find(e=>e.id===u(Z))||{}:u(X)&&u(q).find(e=>e.id===u(X))||{})}),V(()=>(u(tr),u(W)),()=>{M(me,Ma(u(tr),u(W)))}),V(()=>(u(jn),u(q),u(J)),()=>{M(he,u(jn)?u(q).reduce((e,t)=>e+(t.unread_count||0),0)+u(J).reduce((e,t)=>e+(t.unread_count||0),0):0)}),V(()=>u(he),()=>{Ft?.setUnreadCount(u(he))}),V(()=>(u(me),u(W)),()=>{M(ge,u(me)>0&&u(W).last_read_seq||0)}),V(()=>(u(me),u(tr),u(ge),u(Bn)),()=>{M(ye,u(me)>0&&io(u(tr),u(ge),u(Bn)))}),V(()=>(u(me),u(tr),u(ge),u(Bn)),()=>{M(Se,u(me)>0?ao(u(tr),u(ge),u(Bn)):``)}),V(()=>(u(Ye),u(Dn),u(On),u(xr)),()=>{M(we,qt(u(Ye),{hideCommentary:u(Dn),hideToolCalls:u(On)},u(xr)))}),V(()=>u(vr),()=>{M(Te,u(vr).some(e=>e.lines.some(e=>!e.finalized)))}),V(()=>u(mt),()=>{M(St,new Set(u(mt).map(e=>e.id)))}),V(()=>(u(vr),u(Mt)),()=>{M(Ee,_o(u(vr),u(Mt),Vs))}),V(()=>(u(Vt),u(Ht),u(tr)),()=>{u(Vt)&&u(Ht)&&u(Ht)!==u(tr)&&(M(Vt,null),M(Ht,``),M(Ut,null))}),V(()=>(u(dt),a(),u(ut),u(Vt)),()=>{M(De,u(dt)||a().selection!==null||u(ut)!==null||u(Vt)!==null)}),V(()=>(u(ln),u(un)),()=>{M(Oe,u(ln)!==null&&!u(un))}),V(()=>(u(sr),u(Vt),u(Wt)),()=>{Xs(u(sr)&&u(Vt)!==null,u(Wt))}),V(()=>(u(Ye),u(J),u(K)),()=>{M(ke,nt(u(Ye),u(J),u(K)?.id||``))}),V(()=>(u(K),u(ke),u(Ot),u(B)),()=>{M(Rt,at(u(K),u(ke),u(Ot),u(B)))}),V(()=>(u(K),u(Z),u(X),u(We)),()=>{M(zt,u(K)?.id&&(u(Z)||u(X)&&u(We)!==null&&u(We)!==`muted`)?u(K).id:``)}),V(()=>(u(lr),u(cr),u(Ye)),()=>{u(lr)===`channel`&&u(cr)&&!u(Ye).some(e=>e.id===u(cr)?.id)&&ss()}),V(()=>(u(lr),u(cr),u(Ye)),()=>{u(lr)===`dm`&&u(cr)&&!u(Ye).some(e=>e.id===u(cr)?.id)&&ss()}),V(()=>(u(jn),c(Ne()),c(Pe())),()=>{u(jn)&&Si(Ne(),Pe())}),re(),ie();var lc=s();r(`1oa2eo8`,e=>{var t=wo();p(e,t)}),v(`keydown`,E,ac,!0),v(`pointerdown`,E,function(...e){cn?.apply(this,e)},!0);var uc=ce(lc),dc=e=>{pr(e,{})},fc=e=>{var r=Lo(),i=ce(r);let o;var s=I(i),l=e=>{{let t=H(()=>u(F)?u(We):null),n=H(()=>(u(B),c(rt),u(K),u(F),c(_t),b(()=>u(B)?`@${rt(u(B),u(K)?.id)}`:u(F)?`#${_t(u(F))}`:void 0))),r=H(()=>(u(B),u(F),b(()=>u(B)?void 0:u(F)?.external_url))),i=H(()=>(u(F),b(()=>!!u(F)))),a=H(()=>(u(T),b(()=>u(T)?.name)));to(e,{get channelNotifPreference(){return u(t)},get channelNotifSaving(){return u(Je)},get pinnedOpen(){return u(dt)},get channelTitle(){return u(n)},get externalURL(){return u(r)},get pinsAvailable(){return u(i)},get channelSettingsAvailable(){return u(ee)},get connected(){return u(Nn)},get platform(){return c(Ft),b(()=>Ft.platform)},get searchQuery(){return u(sn)},get sidebarCollapsed(){return u(ar)},get mobileNavOpen(){return u(or)},get mobileNavigation(){return u(sr)},get workspaceName(){return u(a)},onOpenChannelSettings:li,onOpenWorkspaceSettings:ci,onResetSearch:hs,onSearch:()=>void fs(),onSearchQuery:e=>M(sn,e),onToggleSidebar:cc,onToggleChannelNotifications:()=>void ra(),onPinnedItems:rc})}};P(s,e=>{je&&Ft&&e(l)});var h=k(s,2),g=I(h),_=e=>{var t=m(`ร—`);p(e,t)},v=e=>{var t=To();p(e,t)};P(g,e=>{u(or)?e(_):e(v,-1)}),t(h);var y=k(h,2),S=e=>{var t=Eo();n(`click`,t,sc),p(e,t)};P(y,e=>{u(or)&&e(S)});var E=k(y,2);{let e=H(()=>(u(Me),b(()=>je&&u(Me).url===`/`?`/app`:u(Me).url))),t=H(()=>(c(kt),u(Me),b(()=>kt(u(Me))))),n=H(()=>u(Qt)===`workspace`);Ur(E,{get workspaces(){return u(Re)},get homeHref(){return u(e)},get homeLabel(){return u(Me),b(()=>u(Me).label)},get homeTitle(){return u(t)},get selectedWorkspaceID(){return u(Y)},get workspaceName(){return u(Yt)},get showWorkspaceCreate(){return u(rr)},get createPending(){return u(n)},get createError(){return u($t)},hrefForWorkspace:e=>gi(e),onSelectWorkspace:e=>void Ui(e),onToggleWorkspaceCreate:Ri,onWorkspaceName:e=>M(Yt,e),onCreateWorkspace:()=>void Vi()})}var R=k(E,2);{let e=H(()=>(u(T),b(()=>u(T)?.name))),t=H(()=>(u(T),c(_e),b(()=>u(T)?.icon_url?_e(u(T).icon_url):``))),n=H(()=>!je),r=H(()=>(u(Wr),b(()=>u(Wr)?.title)));hi(R,{get workspaceID(){return u(Y)},get workspaceName(){return u(e)},get workspaceIconURL(){return u(t)},get connected(){return u(Nn)},get sidebarCollapsed(){return u(ar)},get showHeader(){return u(n)},get channels(){return u(q)},get directConversations(){return u(J)},get recentPeople(){return u(ke)},get currentUser(){return u(K)},get selectedChannelID(){return u(X)},get selectedDirectID(){return u(Z)},get selectedProfile(){return u(ut)},onToggleCollapse:cc,hrefForChannel:e=>gi(u(Y),e),hrefForDirect:e=>gi(u(Y),e),onSelectChannel:e=>void ta(e),onCreateChannel:zi,onSelectDirect:e=>void Ts(e),onCreateDirect:Bi,onHideDirect:e=>void As(e),get hiddenDirectTitle(){return u(r)},onUndoHideDirect:()=>void ks(),onOpenProfile:Ws,onOpenSettings:si,onOpenWorkspaceSettings:ci})}var ne=k(R,2),re=I(ne),ie=e=>{{let t=H(()=>(u(T),b(()=>u(T)?.name))),n=H(()=>(u(K),b(()=>u(K)?.id))),r=H(()=>(a(),b(()=>a().root!==null)));ho(e,{get selectedDirect(){return u(B)},get selectedChannel(){return u(F)},get workspaceName(){return u(t)},get currentUserID(){return u(n)},get searchQuery(){return u(sn)},get threadOpen(){return u(r)},get pinnedOpen(){return u(dt)},get channelNotifPreference(){return u(We)},get channelNotifSaving(){return u(Je)},get channelSettingsAvailable(){return u(ee)},onSearchQuery:e=>M(sn,e),onSearch:()=>void fs(),onResetSearch:hs,onToggleThread:ec,onToggleChannelNotifications:()=>void ra(),onPinnedItems:rc,onOpenChannelSettings:li})}};P(re,e=>{je||e(ie)});var ae=k(re,2),V=e=>{var r=Do(),i=I(r),a=k(I(i)),o=D(a,!0);t(i);var s=k(i,2);t(r),N(()=>d(o,(u(L),b(()=>u(L).name)))),n(`click`,s,()=>void da(``)),p(e,r)};P(ae,e=>{u(L)&&e(V)});var ue=k(ae,2);{let e=H(()=>u(Un)!==`idle`),t=H(()=>(a(),b(()=>a().root?.id))),n=H(()=>(u(K),b(()=>u(K)?.id))),r=H(()=>(u(B),u(se),b(()=>!!(u(B)&&!u(se))))),i=H(()=>u(A)&&!u(Z));pt(ue,{get channelID(){return u(X)},get pinnedMessageIDs(){return u(St)},onTogglePin:nc,onCopyLink:_i,get messages(){return u(we)},get selectedDirect(){return u(B)},get selectedChannel(){return u(F)},get mentionPeople(){return u(Rt)},get mentionAttentionUserID(){return u(zt)},get restoreState(){return u(er)},get viewKey(){return u($n)},get loading(){return u(nr)},get unreadCount(){return u(me)},get unreadBoundarySeq(){return u(ge)},get unreadBoundaryLoaded(){return u(ye)},get unreadSince(){return u(Se)},get hasOlder(){return u(qn)},get hasNewer(){return u(Jn)},get loadingOlder(){return u(Yn)},get loadingNewer(){return u(Xn)},get prepending(){return u(e)},get selectedThreadID(){return u(t)},get currentUserID(){return u(n)},get reactionController(){return Ie},get reactionsDisabled(){return u(r)},get canDeleteAnyMessage(){return u(i)},get deletingMessageIDs(){return u(Kr)},onListRef:e=>M(Rn,e),onActivateMessageComposer:Ki,onInlineImagePointerUp:Qs,onOpenProfile:Ws,onReply:is,onOpenThread:Zo,onJumpToQuote:e=>void cs(e),onOpenImage:qs,onOpenArtifact:Js,onLoadOlder:Ca,onLoadNewer:e=>wa(e===`wheel`),onJumpToUnread:()=>void ls(),onHistorySettled:ka,onReachedBottom:La,onMarkRead:e=>{La({all:!0,seq:e})},onRetry:Go,onDiscard:Ko,onDeleteMessage:Yo,get editController(){return Le},get editScope(){return u(tr)},onMessageEdited:Jo,get topics(){return u(He)},onSelectTopic:e=>void da(e)})}var W=k(ue,2);Cr(W,{get turns(){return u(vr)}});var de=k(W,2);{let e=H(()=>(u(K),b(()=>u(K)?.id)));yr(de,{get entries(){return u(mr)},get currentUserID(){return u(e)}})}var fe=k(de,2),pe=I(fe);{let e=H(()=>(u(Te),a(),b(()=>u(Te)&&a().root===null)));vt(pe,{get active(){return u(e)},get agentNames(){return u(Ee)}})}var he=k(pe,2),ve=e=>{var t=Oo(),n=D(t);N(()=>d(n,`Live updates: ${u(Pn)??``}`)),p(e,t)};P(he,e=>{u(Pn)&&e(ve)});var G=k(he,2),be=e=>{var t=Oo(),n=D(t);N(()=>d(n,`Mentions unavailable: ${u(Lr)??``}`)),p(e,t)};P(G,e=>{u(Lr)&&e(be)});var xe=k(G,2),Ce=e=>{var r=ko();let i;var a=I(r),o=D(a,!0),s=k(a,2),c=D(s,!0),l=k(s,2);t(r),N(()=>{i=w(r,1,`composer-notice`,null,i,{"composer-notice--error":u(Lt).kind===`error`}),d(o,(u(Lt),b(()=>u(Lt).kind===`ephemeral`?`Only visible to you`:`Action failed`))),d(c,(u(Lt),b(()=>u(Lt).text)))}),n(`click`,l,()=>M(Lt,null)),p(e,r)};P(xe,e=>{u(Lt)&&e(Ce)});var Ae=k(xe,2),Ne=e=>{var r=jo(),i=k(I(r),2),a=I(i);a.value=a.__value=``;var o=k(a);f(o,1,()=>u(te),e=>e.id,(e,t)=>{var n=Ao(),r=D(n,!0),i={};N(()=>{d(r,(u(t),b(()=>u(t).name))),i!==(i=(u(t),b(()=>u(t).id)))&&(n.value=(n.__value=i)??``)}),p(e,n)}),t(i);var s;x(i),t(r),N(()=>{s!==(s=u(it))&&(i.value=(i.__value=s)??``,le(i,s))}),n(`change`,i,e=>M(it,e.currentTarget.value)),p(e,r)};P(Ae,e=>{u(X),u(te),b(()=>u(X)&&u(te).length>0)&&e(Ne)});var Pe=k(Ae,2);{let e=H(()=>(u(B),u(se),c(rt),u(K),u(F),c(_t),b(()=>u(B)&&!u(se)?`No active recipient`:u(B)?`Message ${rt(u(B),u(K)?.id)}`:u(F)?`Message #${_t(u(F))}`:`Pick a channel to start`))),t=H(()=>!!u(B)&&!u(se)),n=H(()=>u(cr)&&u(lr)===(u(Z)?`dm`:`channel`)?u(cr):null),r=H(()=>u(X)?u(jt):[]);et(Pe,{get value(){return u(Jt)},get placeholder(){return u(e)},ariaLabel:`Message body`,submitLabel:`Send`,get disabled(){return u(t)},get pendingUpload(){return u(pn)},get replyTarget(){return u(n)},showUpload:!0,showToolbar:!0,get slashCommands(){return u(r)},get botCommands(){return u(U)},get mentionPeople(){return u(Rt)},onValue:e=>{let t=u(Jt);M(Jt,e),e.trim()&&e!==t?Us():e.trim()||Cn()},onSubmit:()=>void zo(),onKeydown:Gs,onFocus:Ki,onInputRef:e=>M(ur,e),onUploadFile:Ss,onRemoveUpload:xs,onClearReply:ss})}t(fe),t(ne);var Fe=k(ne,2),ze=e=>{var n=Mo();ir(I(n),{get upload(){return u(Vt)},onClose:Ys}),t(n),oe(n,e=>M(Wt,e),()=>u(Wt)),N(()=>{n.inert=u(or),z(n,`role`,u(sr)?`dialog`:`complementary`),z(n,`aria-modal`,u(sr)?`true`:void 0)}),p(e,n)};P(Fe,e=>{u(Vt)&&e(ze)});var Be=k(Fe,2),Ve=e=>{{let t=H(()=>u(Vt)!==null),n=H(()=>u(or)||u(Vt)!==null);Hi(e,{get session(){return u(ln)},get covered(){return u(t)},get inert(){return u(n)},contextFor:gs,onClose:hs,onOpenResult:e=>void _s(e),onLoadMore:()=>void ms()})}},Ue=e=>{var r=Io();let i;var o=I(r),s=e=>{Ti(e,{get messages(){return u(mt)},get loading(){return u(gt)},get error(){return u(xt)},get topics(){return u(He)},get mentionPeople(){return u(Rt)},get mentionAttentionUserID(){return u(zt)},onClose:$s,onOpenThread:e=>void ic(e),onOpenImage:qs,onOpenArtifact:Js,onUnpin:e=>nc(e,!0),onSelectTopic:e=>{M(dt,!1),da(e)}})},c=e=>{{let t=H(()=>(a(),b(()=>a().draft?.body??``))),n=H(()=>(a(),b(()=>a().draft?.quote??null))),r=H(()=>(a(),b(()=>a().draft?.error||a().error))),i=H(()=>(a(),b(()=>a().draft?.sending??!1))),o=H(()=>(u(B),u(se),b(()=>!!(u(B)&&!u(se))))),s=H(()=>u(un)&&u(ln)?()=>void vs():void 0),c=H(()=>(u(K),b(()=>u(K)?.id))),l=H(()=>(u(B),u(se),b(()=>!!(u(B)&&!u(se))))),d=H(()=>u(A)&&!u(Z));bt(e,{get history(){return Q},get root(){return a(),b(()=>a().root)},get replies(){return u(C)},get threadState(){return a(),b(()=>a().state)},get replyBody(){return u(t)},get replyTarget(){return u(n)},get replyError(){return u(r)},get replySending(){return u(i)},get mentionPeople(){return u(Rt)},get mentionAttentionUserID(){return u(zt)},get agentResponding(){return u(Te)},get respondingAgentNames(){return u(Ee)},get replyDisabled(){return u(o)},onClose:$s,get onBack(){return u(s)},onReplyBody:e=>Q.updateDraft(e),onSubmitReply:()=>void rs(),onReplyKeydown:Ks,onReplyFocus:()=>M(fr,`thread`),onReplyInputRef:e=>M(dr,e),get currentUserID(){return u(c)},get reactionController(){return Ie},get reactionsDisabled(){return u(l)},onSetReplyTarget:is,onClearReply:()=>Q.setQuote(null),get canDeleteAnyMessage(){return u(d)},get deletingMessageIDs(){return u(Kr)},onDeleteMessage:Yo,get channelID(){return u(X)},get pinnedMessageIDs(){return u(St)},onTogglePin:nc,onCopyLink:_i,get editController(){return Le},get editScope(){return u(tr)},onMessageEdited:Jo,onActivateThreadComposer:()=>M(fr,`thread`),onInlineImagePointerUp:Qs,onJumpToQuote:e=>void cs(e),onOpenImage:qs,onOpenArtifact:Js})}},l=e=>{var r=Fo(),i=ce(r),o=k(I(i),2);t(i);var s=k(i,2),c=e=>{var t=No(),r=ce(t),i=D(r,!0),o=k(r,2);N(()=>d(i,(a(),b(()=>a().error)))),n(`click`,o,()=>a().selection&&void Qo(a().selection.messageID)),p(e,t)},l=e=>{var t=Po();p(e,t)};P(s,e=>{a(),b(()=>a().error)?e(c):e(l,-1)}),n(`click`,o,$s),p(e,r)},f=e=>{{let t=H(()=>(u(T),b(()=>u(T)?.name))),n=H(()=>u(Qt)===`direct`);ht(e,{get profile(){return u(ut)},get currentUser(){return u(K)},get workspaceName(){return u(t)},get currentUserRole(){return u(O)},get moderation(){return u(j)},onClose:$s,onEdit:si,get messagePending(){return u(n)},get messageError(){return u(an)},onMessage:e=>void Es(e),onApprove:e=>void $i(e,{role:`member`,clear_timeout:!0,blocked:!1}),onTimeout:e=>void $i(e,{timeout_minutes:60}),onBlock:e=>void $i(e,{blocked:!0}),onUnblock:e=>void $i(e,{blocked:!1,clear_timeout:!0})})}},m=e=>{Ha(e,{})};P(o,e=>{u(dt)?e(s):(a(),b(()=>a().root)?e(c,1):(a(),b(()=>a().selection)?e(l,2):u(ut)?e(f,3):e(m,-1)))}),t(r),N(()=>{i=w(r,1,`thread`,null,i,{open:u(De),covered:u(Vt)!==null}),r.inert=u(or)||u(Vt)!==null,z(r,`aria-hidden`,u(Vt)?`true`:void 0),z(r,`aria-label`,u(dt)?`Pinned messages pane`:u(ut)?`Profile pane`:`Thread pane`)}),p(e,r)};P(Be,e=>{u(Oe)&&u(ln)?e(Ve):e(Ue,-1)}),t(i),oe(i,e=>M(Gt,e),()=>u(Gt));var Ge=k(i,2),Ke=e=>{{let t=H(()=>Ft!=null);Ba(e,{get user(){return u(K)},get workspaces(){return u(Re)},get initialSection(){return u(vn)},get hideCommentary(){return u(Dn)},get hideToolCalls(){return u(On)},get userAlign(){return u(kn)},get otherAlign(){return u(An)},get isDesktop(){return u(t)},onUserUpdated:di,onHideCommentary:ri,onHideToolCalls:ii,onUserAlign:ti,onOtherAlign:ni,onBrowserNotificationsChanged:e=>M(En,e),onClose:oc})}};P(Ge,e=>{u(_n)&&u(K)&&e(Ke)});var qe=k(Ge,2),Ye=e=>{Ji(e,{get channel(){return u(F)},get saving(){return u(bn)},get error(){return u(Sn)},onClose:oc,onArchivedChange:e=>void ui(e)})};P(qe,e=>{u(yn)&&u(F)&&e(Ye)});var Xe=k(qe,2),Ze=e=>{{let t=H(()=>u(Qt)===`channel`);kr(e,{get channelName(){return u(Xt)},get pending(){return u(t)},get error(){return u(en)},onChannelName:e=>M(Xt,e),onClose:oc,onCreate:()=>void ea()})}};P(Xe,e=>{u(wn)&&e(Ze)});var $e=k(Xe,2),tt=e=>{{let t=H(()=>(u(K),b(()=>u(K)?.id))),n=H(()=>u(Qt)===`direct`),r=H(()=>u(an)||u(Lr));Fr(e,{get people(){return u(Rt)},get currentUserID(){return u(t)},get memberID(){return u(Zt)},get pending(){return u(n)},get error(){return u(r)},onMemberID:e=>M(Zt,e),onClose:oc,onStart:e=>void Es(e)})}};P($e,e=>{u(Tn)&&e(tt)});var nt=k($e,2),at=e=>{{let t=H(()=>(u(Kr),u(qr),b(()=>u(Kr).has(u(qr).id))));gr(e,{get message(){return u(qr)},get deleting(){return u(t)},get error(){return u(Jr)},onClose:oc,onConfirm:()=>void Xo()})}};P(nt,e=>{u(qr)&&e(at)});var ot=k(nt,2),st=e=>{Qe(e,{get url(){return u(Bt),b(()=>u(Bt).url)},get title(){return u(Bt),b(()=>u(Bt).title)},onClose:oc})};P(ot,e=>{u(Bt)&&e(st)}),N(()=>{o=w(i,1,`shell`,null,o,{"desktop-shell":je,"nav-open":u(or),"sidebar-collapsed":u(ar),"thread-open":u(De)&&!u(Oe),"search-open":u(Oe),"artifact-open":u(Vt)!==null}),z(i,`data-connected`,u(Nn)),z(i,`data-app-ready`,u(Nn)&&u(jn)),z(h,`aria-expanded`,u(or)),ne.inert=u(or)}),n(`click`,h,()=>M(or,!u(or))),p(e,r)};P(uc,e=>{u(Mn)?e(dc):e(fc,-1)}),p(e,lc),_(),h()}W([`click`,`change`]);export{Co as n,Ro as t}; \ No newline at end of file diff --git a/apps/api/internal/webassets/dist/_app/immutable/entry/app.CqYZBsX3.js b/apps/api/internal/webassets/dist/_app/immutable/entry/app.DLOeY-00.js similarity index 82% rename from apps/api/internal/webassets/dist/_app/immutable/entry/app.CqYZBsX3.js rename to apps/api/internal/webassets/dist/_app/immutable/entry/app.DLOeY-00.js index d07d6c51..4f2176b4 100644 --- a/apps/api/internal/webassets/dist/_app/immutable/entry/app.CqYZBsX3.js +++ b/apps/api/internal/webassets/dist/_app/immutable/entry/app.DLOeY-00.js @@ -1,2 +1,2 @@ -const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["../nodes/0.BFZe630_.js","../chunks/DK3Fl9T5.js","../chunks/CxKeDCcw.js","../chunks/ChC1oWd7.js","../chunks/Dt-HX3Vu.js","../chunks/xihTtKlq.js","../chunks/qQG-ipvL.js","../chunks/Dqjw8vaP.js","../chunks/DEPNME54.js","../assets/0.C7M1Y4Cy.css","../nodes/1.CvWNubFT.js","../chunks/Dr1oMBlb.js","../nodes/2.cjG1hDc1.js","../chunks/Qo16U5GS.js","../chunks/OQjxVT6U.js","../nodes/3.B10d8uq2.js","../chunks/uBIymjUX.js","../chunks/CYM1xkwL.js","../nodes/4.COOlYmhK.js","../chunks/TM-oTWC2.js","../chunks/BqBbEnKW.js","../chunks/C7NZ0SeM.js","../assets/QuoteBlock.Bmfc9wvU.css","../chunks/CyT438p0.js","../chunks/DlGnnCJo.js","../chunks/BVPazc3H.js","../chunks/Cht-DoaS.js","../assets/ThreadPanel.DFXp9CyT.css","../chunks/CVdgRPye.js","../chunks/BIhzYFGW.js","../assets/ChatApp.BrxGlI__.css","../nodes/5.BdROoItM.js","../nodes/6.D1H8DGKr.js","../nodes/7.DMByM9ti.js","../chunks/Wx71Z9jO.js","../nodes/8.BWm139W5.js","../nodes/9.BXnh5nE4.js","../nodes/10.C0wr3ez6.js","../nodes/11.DjDAoGTk.js","../nodes/12.B6Gmd9sk.js","../assets/12.CzRaoRZI.css","../nodes/13._k72L9rt.js","../assets/13.CMVv15Ug.css"])))=>i.map(i=>d[i]); -import{At as e,Et as t,F as n,I as r,K as i,N as a,P as o,R as s,T as c,Tt as l,X as u,a as d,at as f,ft as p,gt as m,ht as h,i as g,it as _,j as v,lt as y,ot as b,r as x,s as S,ut as C,yt as w}from"../chunks/CxKeDCcw.js";import{t as T}from"../chunks/uBIymjUX.js";import"../chunks/xihTtKlq.js";var E={},D=r(`
                `),O=r(` `,1);function k(r,g){t(g,!0);let T=d(g,`components`,23,()=>[]),E=d(g,`data_0`,3,null),k=d(g,`data_1`,3,null),A=d(g,`data_2`,3,null);b(()=>g.stores.page.set(g.page)),f(()=>{g.stores,g.page,g.constructors,T(),g.form,E(),k(),A(),g.stores.page.notify()});let j=m(!1),M=m(!1),N=m(null);x(()=>{let e=g.stores.page.subscribe(()=>{i(j)&&(h(M,!0),u().then(()=>{h(N,document.title||`untitled page`,!0)}))});return h(j,!0),e});let P=w(()=>g.constructors[2]);var F=O(),I=C(F),L=e=>{let t=w(()=>g.constructors[0]);var r=n(),a=C(r);c(a,()=>i(t),(e,t)=>{S(t(e,{get data(){return E()},get form(){return g.form},get params(){return g.page.params},children:(e,t)=>{var r=n(),a=C(r),s=e=>{let t=w(()=>g.constructors[1]);var r=n(),a=C(r);c(a,()=>i(t),(e,t)=>{S(t(e,{get data(){return k()},get form(){return g.form},get params(){return g.page.params},children:(e,t)=>{var r=n(),a=C(r);c(a,()=>i(P),(e,t)=>{S(t(e,{get data(){return A()},get form(){return g.form},get params(){return g.page.params}}),e=>T()[2]=e,()=>T()?.[2])}),o(e,r)},$$slots:{default:!0}}),e=>T()[1]=e,()=>T()?.[1])}),o(e,r)},l=e=>{let t=w(()=>g.constructors[1]);var r=n(),a=C(r);c(a,()=>i(t),(e,t)=>{S(t(e,{get data(){return k()},get form(){return g.form},get params(){return g.page.params}}),e=>T()[1]=e,()=>T()?.[1])}),o(e,r)};v(a,e=>{g.constructors[2]?e(s):e(l,-1)}),o(e,r)},$$slots:{default:!0}}),e=>T()[0]=e,()=>T()?.[0])}),o(e,r)},R=e=>{let t=w(()=>g.constructors[0]);var r=n(),a=C(r);c(a,()=>i(t),(e,t)=>{S(t(e,{get data(){return E()},get form(){return g.form},get params(){return g.page.params}}),e=>T()[0]=e,()=>T()?.[0])}),o(e,r)};v(I,e=>{g.constructors[1]?e(L):e(R,-1)});var z=p(I,2),B=t=>{var n=D(),r=y(n),c=e=>{var t=s();_(()=>a(t,i(N))),o(e,t)};v(r,e=>{i(M)&&e(c)}),e(n),o(t,n)};v(z,e=>{i(j)&&e(B)}),o(r,F),l()}var A=g(k),j=[()=>T(()=>import(`../nodes/0.BFZe630_.js`),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9]),import.meta.url),()=>T(()=>import(`../nodes/1.CvWNubFT.js`),__vite__mapDeps([10,2,1,5,11,3,4]),import.meta.url),()=>T(()=>import(`../nodes/2.cjG1hDc1.js`),__vite__mapDeps([12,1,2,3,4,5,6,8,11,13,14]),import.meta.url),()=>T(()=>import(`../nodes/3.B10d8uq2.js`),__vite__mapDeps([15,1,2,16,5,17]),import.meta.url),()=>T(()=>import(`../nodes/4.COOlYmhK.js`),__vite__mapDeps([18,2,1,5,17,19,3,4,16,6,8,7,13,14,20,21,22,23,24,25,26,27,28,29,30]),import.meta.url),()=>T(()=>import(`../nodes/5.BdROoItM.js`),__vite__mapDeps([31,2,1,5,19,3,4,16,6,8,7,13,14,17,20,21,22,23,24,25,26,27,28,29,30]),import.meta.url),()=>T(()=>import(`../nodes/6.D1H8DGKr.js`),__vite__mapDeps([32,1,4,13]),import.meta.url),()=>T(()=>import(`../nodes/7.DMByM9ti.js`),__vite__mapDeps([33,1,2,5,8,7,14,28,34]),import.meta.url),()=>T(()=>import(`../nodes/8.BWm139W5.js`),__vite__mapDeps([35,1,2,5,8,7,14,24,25,28,29,34]),import.meta.url),()=>T(()=>import(`../nodes/9.BXnh5nE4.js`),__vite__mapDeps([36,1,2,5,21,8,25,29]),import.meta.url),()=>T(()=>import(`../nodes/10.C0wr3ez6.js`),__vite__mapDeps([37,1,2,3,4,5,6,8,14,29]),import.meta.url),()=>T(()=>import(`../nodes/11.DjDAoGTk.js`),__vite__mapDeps([38,2,1,5,19,3,4,16,6,8,7,13,14,17,20,21,22,23,24,25,26,27,28,29,30]),import.meta.url),()=>T(()=>import(`../nodes/12.B6Gmd9sk.js`),__vite__mapDeps([39,1,2,5,8,7,20,21,22,23,24,25,29,40]),import.meta.url),()=>T(()=>import(`../nodes/13._k72L9rt.js`),__vite__mapDeps([41,1,2,5,8,7,20,21,22,24,26,27,29,42]),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.NTmLSr3P.js","../chunks/DK3Fl9T5.js","../chunks/CxKeDCcw.js","../chunks/ChC1oWd7.js","../chunks/Dt-HX3Vu.js","../chunks/xihTtKlq.js","../chunks/qQG-ipvL.js","../chunks/Dqjw8vaP.js","../chunks/DEPNME54.js","../assets/0.o7-W2NK8.css","../nodes/1.CvWNubFT.js","../chunks/Dr1oMBlb.js","../nodes/2.cjG1hDc1.js","../chunks/Qo16U5GS.js","../chunks/OQjxVT6U.js","../nodes/3.BEOdX5ZT.js","../chunks/uBIymjUX.js","../chunks/CYM1xkwL.js","../nodes/4.K5JTYH6J.js","../chunks/By-MUCdv.js","../chunks/DOE07Vt_.js","../chunks/C7NZ0SeM.js","../assets/QuoteBlock.Bmfc9wvU.css","../chunks/KlawdwO_.js","../chunks/DlGnnCJo.js","../chunks/BVPazc3H.js","../chunks/8xW7lXBK.js","../assets/ThreadPanel.DFXp9CyT.css","../chunks/CVdgRPye.js","../chunks/BIhzYFGW.js","../assets/ChatApp.BrxGlI__.css","../nodes/5.DKZdmaNg.js","../nodes/6.D1H8DGKr.js","../nodes/7.DMByM9ti.js","../chunks/Wx71Z9jO.js","../nodes/8.BWm139W5.js","../nodes/9.BXnh5nE4.js","../nodes/10.C0wr3ez6.js","../nodes/11.C20kHutl.js","../nodes/12.pqQxcg3H.js","../assets/12.CzRaoRZI.css","../nodes/13.DiNs8j78.js","../assets/13.CMVv15Ug.css"])))=>i.map(i=>d[i]); +import{At as e,Et as t,F as n,I as r,K as i,N as a,P as o,R as s,T as c,Tt as l,X as u,a as d,at as f,ft as p,gt as m,ht as h,i as g,it as _,j as v,lt as y,ot as b,r as x,s as S,ut as C,yt as w}from"../chunks/CxKeDCcw.js";import{t as T}from"../chunks/uBIymjUX.js";import"../chunks/xihTtKlq.js";var E={},D=r(`
                `),O=r(` `,1);function k(r,g){t(g,!0);let T=d(g,`components`,23,()=>[]),E=d(g,`data_0`,3,null),k=d(g,`data_1`,3,null),A=d(g,`data_2`,3,null);b(()=>g.stores.page.set(g.page)),f(()=>{g.stores,g.page,g.constructors,T(),g.form,E(),k(),A(),g.stores.page.notify()});let j=m(!1),M=m(!1),N=m(null);x(()=>{let e=g.stores.page.subscribe(()=>{i(j)&&(h(M,!0),u().then(()=>{h(N,document.title||`untitled page`,!0)}))});return h(j,!0),e});let P=w(()=>g.constructors[2]);var F=O(),I=C(F),L=e=>{let t=w(()=>g.constructors[0]);var r=n(),a=C(r);c(a,()=>i(t),(e,t)=>{S(t(e,{get data(){return E()},get form(){return g.form},get params(){return g.page.params},children:(e,t)=>{var r=n(),a=C(r),s=e=>{let t=w(()=>g.constructors[1]);var r=n(),a=C(r);c(a,()=>i(t),(e,t)=>{S(t(e,{get data(){return k()},get form(){return g.form},get params(){return g.page.params},children:(e,t)=>{var r=n(),a=C(r);c(a,()=>i(P),(e,t)=>{S(t(e,{get data(){return A()},get form(){return g.form},get params(){return g.page.params}}),e=>T()[2]=e,()=>T()?.[2])}),o(e,r)},$$slots:{default:!0}}),e=>T()[1]=e,()=>T()?.[1])}),o(e,r)},l=e=>{let t=w(()=>g.constructors[1]);var r=n(),a=C(r);c(a,()=>i(t),(e,t)=>{S(t(e,{get data(){return k()},get form(){return g.form},get params(){return g.page.params}}),e=>T()[1]=e,()=>T()?.[1])}),o(e,r)};v(a,e=>{g.constructors[2]?e(s):e(l,-1)}),o(e,r)},$$slots:{default:!0}}),e=>T()[0]=e,()=>T()?.[0])}),o(e,r)},R=e=>{let t=w(()=>g.constructors[0]);var r=n(),a=C(r);c(a,()=>i(t),(e,t)=>{S(t(e,{get data(){return E()},get form(){return g.form},get params(){return g.page.params}}),e=>T()[0]=e,()=>T()?.[0])}),o(e,r)};v(I,e=>{g.constructors[1]?e(L):e(R,-1)});var z=p(I,2),B=t=>{var n=D(),r=y(n),c=e=>{var t=s();_(()=>a(t,i(N))),o(e,t)};v(r,e=>{i(M)&&e(c)}),e(n),o(t,n)};v(z,e=>{i(j)&&e(B)}),o(r,F),l()}var A=g(k),j=[()=>T(()=>import(`../nodes/0.NTmLSr3P.js`),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9]),import.meta.url),()=>T(()=>import(`../nodes/1.CvWNubFT.js`),__vite__mapDeps([10,2,1,5,11,3,4]),import.meta.url),()=>T(()=>import(`../nodes/2.cjG1hDc1.js`),__vite__mapDeps([12,1,2,3,4,5,6,8,11,13,14]),import.meta.url),()=>T(()=>import(`../nodes/3.BEOdX5ZT.js`),__vite__mapDeps([15,1,2,16,5,17]),import.meta.url),()=>T(()=>import(`../nodes/4.K5JTYH6J.js`),__vite__mapDeps([18,2,1,5,17,19,3,4,16,6,8,7,13,14,20,21,22,23,24,25,26,27,28,29,30]),import.meta.url),()=>T(()=>import(`../nodes/5.DKZdmaNg.js`),__vite__mapDeps([31,2,1,5,19,3,4,16,6,8,7,13,14,17,20,21,22,23,24,25,26,27,28,29,30]),import.meta.url),()=>T(()=>import(`../nodes/6.D1H8DGKr.js`),__vite__mapDeps([32,1,4,13]),import.meta.url),()=>T(()=>import(`../nodes/7.DMByM9ti.js`),__vite__mapDeps([33,1,2,5,8,7,14,28,34]),import.meta.url),()=>T(()=>import(`../nodes/8.BWm139W5.js`),__vite__mapDeps([35,1,2,5,8,7,14,24,25,28,29,34]),import.meta.url),()=>T(()=>import(`../nodes/9.BXnh5nE4.js`),__vite__mapDeps([36,1,2,5,21,8,25,29]),import.meta.url),()=>T(()=>import(`../nodes/10.C0wr3ez6.js`),__vite__mapDeps([37,1,2,3,4,5,6,8,14,29]),import.meta.url),()=>T(()=>import(`../nodes/11.C20kHutl.js`),__vite__mapDeps([38,2,1,5,19,3,4,16,6,8,7,13,14,17,20,21,22,23,24,25,26,27,28,29,30]),import.meta.url),()=>T(()=>import(`../nodes/12.pqQxcg3H.js`),__vite__mapDeps([39,1,2,5,8,7,20,21,22,23,24,25,29,40]),import.meta.url),()=>T(()=>import(`../nodes/13.DiNs8j78.js`),__vite__mapDeps([41,1,2,5,8,7,20,21,22,24,26,27,29,42]),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.BFZe630_.js b/apps/api/internal/webassets/dist/_app/immutable/nodes/0.NTmLSr3P.js similarity index 100% rename from apps/api/internal/webassets/dist/_app/immutable/nodes/0.BFZe630_.js rename to apps/api/internal/webassets/dist/_app/immutable/nodes/0.NTmLSr3P.js diff --git a/apps/api/internal/webassets/dist/_app/immutable/nodes/11.DjDAoGTk.js b/apps/api/internal/webassets/dist/_app/immutable/nodes/11.C20kHutl.js similarity index 77% rename from apps/api/internal/webassets/dist/_app/immutable/nodes/11.DjDAoGTk.js rename to apps/api/internal/webassets/dist/_app/immutable/nodes/11.C20kHutl.js index 9566f550..6281da49 100644 --- a/apps/api/internal/webassets/dist/_app/immutable/nodes/11.DjDAoGTk.js +++ b/apps/api/internal/webassets/dist/_app/immutable/nodes/11.C20kHutl.js @@ -1 +1 @@ -import{Et as e,Tt as t}from"../chunks/CxKeDCcw.js";import"../chunks/xihTtKlq.js";import{t as n}from"../chunks/TM-oTWC2.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/CxKeDCcw.js";import"../chunks/xihTtKlq.js";import{t as n}from"../chunks/By-MUCdv.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.B6Gmd9sk.js b/apps/api/internal/webassets/dist/_app/immutable/nodes/12.pqQxcg3H.js similarity index 99% rename from apps/api/internal/webassets/dist/_app/immutable/nodes/12.B6Gmd9sk.js rename to apps/api/internal/webassets/dist/_app/immutable/nodes/12.pqQxcg3H.js index 3da37406..74ff666e 100644 --- a/apps/api/internal/webassets/dist/_app/immutable/nodes/12.B6Gmd9sk.js +++ b/apps/api/internal/webassets/dist/_app/immutable/nodes/12.pqQxcg3H.js @@ -1 +1 @@ -import{t as e}from"../chunks/DK3Fl9T5.js";import{A as t,At as n,B as r,C as i,Et as a,F as o,I as s,K as c,N as l,P as u,Q as ee,S as te,Tt as d,V as ne,X as f,dt as p,ft as m,gt as h,ht as g,it as _,j as v,kt as re,lt as y,n as ie,pt as ae,r as oe,st as se,ut as ce,yt as b,z as x}from"../chunks/CxKeDCcw.js";import"../chunks/xihTtKlq.js";import{i as le,n as S,t as C,u as w}from"../chunks/DEPNME54.js";import{d as ue}from"../chunks/Dqjw8vaP.js";import{D as de,E as fe,R as pe,T as me,f as he,j as ge,p as _e,w as ve,x as ye}from"../chunks/BqBbEnKW.js";import{i as be,n as xe,t as Se}from"../chunks/CyT438p0.js";import{t as Ce}from"../chunks/DlGnnCJo.js";import{r as we,t as Te}from"../chunks/BIhzYFGW.js";var T=e({prerender:()=>!1,ssr:()=>!1}),Ee=s(``),De=s(`Archived`),Oe=s(`

                `),ke=s(`

                `),Ae=s(`

                Sign in to ClickClack

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

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

                `),ke=s(`

                `),Ae=s(`

                Sign in to ClickClack

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

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

                `),xe=c(`
                `),Se=c(`

                Sign in to ClickClack

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

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

                `),xe=c(`
                `),Se=c(`

                Sign in to ClickClack

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

                Open ClickClack
                `),Ce=c(`
                `),we=c(`
                `),Te=c(`
                `),Ee=c(`
                `),De=c(` `,1);function k(e,n){o(n,!0);let s=g(`loading`),c=g(``),C=g(null),O=new fe(()=>l(C)?.id||``),k=new se(je),A=g(null),j=new he(()=>`${n.workspaceRouteID}:${n.messageRouteID}`,Fe),M=S(()=>j.root),N=S(()=>j.replies),P=S(()=>j.state),F=g(null),I=g(`Thread`),Oe=S(()=>j.draft?.body??``),L=S(()=>j.draft?.quote??null),R=g(null),z=S(()=>j.draft?.error||j.error||l(B)),B=g(``),V=S(()=>j.draft?.sending??!1),H=g(null),U=null,W=0,G=!1,K=g(ne([])),q=0,J=null,Y=g(``),X=S(()=>l(V)||!!(l(F)&&!l(F).can_send)),ke=S(()=>{let e=new Map;for(let t of l(K))t.id&&!t.deleted_at&&e.set(t.id,t);for(let t of l(F)?.members??[])t.id&&t.handle?.trim()&&!t.deleted_at&&e.set(t.id,t);for(let t of l(M)?[l(M),...l(N)]:l(N))t.author?.id&&t.author.handle?.trim()&&!t.author.deleted_at&&e.set(t.author.id,t.author);return l(C)?.id&&e.set(l(C).id,l(C)),[...e.values()]});async function Ae(e){let t=++q;J?.abort();let n=new AbortController;J=n,_(Y,``),_(K,[],!0);try{let r=await ve({workspaceID:e,limit:100,signal:n.signal});t===q&&_(K,r.map(e=>e.user),!0)}catch(e){!n.signal.aborted&&t===q&&(_(K,[],!0),_(Y,_e(e),!0))}}async function je(e,t){let n=j.selection,r=()=>e===l(A)?.target_id&&j.isCurrent(n)&&k.session(e)?.generation===t.generation;if(r()&&await j.target({messageID:t.messageID,threadSeq:t.threadSeq},r))for(let e=0;e<4;e+=1){if(await p(),!r())return;let e=document.querySelector(`[aria-label="Embedded thread"]`)?.querySelector(`[data-message-id="${CSS.escape(t.messageID)}"]`)?.querySelector(`textarea[aria-label="Edit message"]`);if(e){e.focus({preventScroll:!0});return}}}function Me(e){j.updateMessage(e)}function Ne(){q+=1,J?.abort(),U?.close(),U=null,_(A,null),j.close(),O.clear(),k.clear(),_(F,null),_(H,null)}function Z(e){if(Ne(),e instanceof D){_(s,`forbidden`);return}if(e instanceof T){if(e.status===401){_(s,`auth`);return}if(e.status===403){_(s,`forbidden`);return}if(e.status===404){_(s,`not-found`);return}}_(c,E(e,`Could not load this thread.`),!0),_(s,`error`)}async function Pe(e,t){if(e.parent_type===`direct`){let n=(await w(`/api/dms?workspace_id=${encodeURIComponent(e.workspace_id)}`)).conversations.find(t=>t.id===e.parent_id);n||=(await w(`/api/dms/${encodeURIComponent(e.parent_id)}`)).conversation,_(F,n,!0),_(I,pe(n,t.id)||`Direct message`,!0);return}let n=(await w(`/api/workspaces/${encodeURIComponent(e.workspace_id)}/channels`)).channels.find(t=>t.id===e.parent_id);if(!n)throw new T(404,`Thread channel not found`);_(F,null),_(I,`#${me(n)}`)}async function Q(){if(G)return;G=!0;let e=++W;l(s)!==`auth`&&_(s,`loading`),_(c,``);try{let t=await oe(),r=await w(`/api/routes/${encodeURIComponent(n.workspaceRouteID)}/${encodeURIComponent(n.messageRouteID)}`);if(r.route.target_type!==`thread`)throw new T(404,`Thread route not found`);if(e!==W)return;j.select(r.route.target_id);let[i]=await Promise.all([j.open(()=>e===W),Pe(r.route,t.user)]);if(!i||e!==W||!j.root)return;_(C,t.user,!0),_(A,r.route,!0),Ae(r.route.workspace_id),_(s,`ready`),ze(r.route.workspace_id)}catch(t){e===W&&Z(t)}finally{e===W&&(G=!1)}}function Fe(e=[]){l(M)&&(O.seedMessages(e),k.reconcile(l(A)?.target_id||l(M).id,[l(M),...l(N)]))}function Ie(e){if(!l(M))return!1;if(e.payload.root_message_id)return e.payload.root_message_id===l(M).id;let t=e.payload.message_id;return t===l(M).id||l(N).some(e=>e.id===t)}async function Le(e,t){if(Ie(e)&&(e.type===`reaction.added`||e.type===`reaction.removed`)){O.applyEvent(e);return}await j.handleEvent(e,t)}function Re(e){if(l(s)===`ready`){if(e instanceof D||e instanceof T&&[401,403,404].includes(e.status)){Z(e);return}_(B,E(e,`Could not process a realtime update.`),!0)}}function ze(e){U?.close(),U=ce({workspaceID:e,onEvent:Le,onOpen:async(e,t)=>{t&&(O.clear(),await j.refresh(e)),e()&&_(B,``)},onError:Re})}async function Be(){l(X)||await j.send(e=>{e instanceof T&&e.status===401&&Z(e)})}function Ve(e){if(e.key===`Escape`&&l(L)){e.preventDefault(),j.setQuote(null);return}e.key===`Enter`&&!e.shiftKey&&(e.preventDefault(),Be())}function He(e){l(V)||(j.setQuote(e),p().then(()=>l(R)?.focus()))}function Ue(){l(V)||j.setQuote(null)}function We(e){e.quoted_message_id&&j.target({messageID:e.quoted_message_id})}function Ge(e){let t=e.target;!(t instanceof HTMLImageElement)||!t.closest(`.markdown`)||(e.preventDefault(),_(H,{url:le(t),title:t.alt||`Image`},!0))}function Ke(e){let t=window.open(ae(`/api/uploads/${e.id}`),`_blank`,`noopener,noreferrer`);t&&(t.opener=null)}function $(){l(s)===`auth`&&document.visibilityState===`visible`&&Q()}re(()=>{Q(),window.addEventListener(`focus`,$),document.addEventListener(`visibilitychange`,$)}),te(()=>{W+=1,q+=1,J?.abort(),U?.close(),window.removeEventListener(`focus`,$),document.removeEventListener(`visibilitychange`,$)});var qe=De();a(`b3w79y`,e=>{var n=ye();t(()=>{ie.title=`ClickClack thread`}),d(e,n)});var Je=x(qe),Ye=e=>{var t=xe(),n=b(t),i=b(n);{let e=S(()=>`Thread ยท ${l(P)?.reply_count??l(N).length} ${(l(P)?.reply_count??l(N).length)===1?`reply`:`replies`}`),t=S(()=>l(C)?.id),n=S(()=>!!(l(F)&&!l(F).can_send));ge(i,{get history(){return j},get root(){return l(M)},get replies(){return l(N)},get threadState(){return l(P)},get replyBody(){return l(Oe)},get replyTarget(){return l(L)},get mentionPeople(){return l(ke)},get replyDisabled(){return l(X)},get headerLabel(){return l(I)},get headerDetail(){return l(e)},get openHref(){return l(A).canonical_path},get currentUserID(){return l(t)},get reactionController(){return O},get editController(){return k},get editScope(){return l(A).target_id},onMessageEdited:Me,get reactionsDisabled(){return l(n)},onReplyBody:e=>j.updateDraft(e),onSubmitReply:()=>void Be(),onReplyKeydown:Ve,onReplyFocus:()=>{},onReplyInputRef:e=>_(R,e,!0),onSetReplyTarget:e=>He(e),onClearReply:Ue,onActivateThreadComposer:()=>{},onInlineImagePointerUp:Ge,onJumpToQuote:We,onOpenImage:(e,t)=>_(H,{url:e,title:t},!0),onOpenArtifact:Ke})}r(n);var a=h(n,2),o=e=>{var t=be(),n=m(t);v(()=>u(n,`Mentions unavailable: ${l(Y)??``}`)),d(e,t)};y(a,e=>{l(Y)&&e(o)});var s=h(a,2),c=e=>{var t=be(),n=m(t,!0);v(()=>u(n,l(z))),d(e,t)};y(s,e=>{l(z)&&e(c)}),r(t),d(e,t)},Xe=e=>{var t=Se(),n=b(t),i=b(n);ue(i,{class:`embed-mark`,size:42}),ee(6),r(n),r(t),d(e,t)},Ze=e=>{var t=Ce();d(e,t)},Qe=e=>{var t=we();d(e,t)},$e=e=>{var t=Te(),n=b(t),a=h(b(n),2),o=m(a,!0),s=h(a,2);r(n),r(t),v(()=>u(o,l(c))),i(`click`,s,()=>void Q()),d(e,t)},et=e=>{var t=Ee();d(e,t)};y(Je,e=>{l(s)===`ready`&&l(M)&&l(A)?e(Ye):l(s)===`auth`?e(Xe,1):l(s)===`forbidden`?e(Ze,2):l(s)===`not-found`?e(Qe,3):l(s)===`error`?e($e,4):e(et,-1)});var tt=h(Je,2),nt=e=>{de(e,{get url(){return l(H).url},get title(){return l(H).title},onClose:()=>_(H,null)})};y(tt,e=>{l(H)&&e(nt)}),d(e,qe),f()}C([`click`]);function A(e,t){o(t,!0);var r=s(),i=x(r);n(i,()=>`${t.params.workspaceID}:${t.params.messageID}`,e=>{k(e,{get workspaceRouteID(){return t.params.workspaceID},get messageRouteID(){return t.params.messageID}})}),d(e,r),f()}export{A as component,O as universal}; \ No newline at end of file diff --git a/apps/api/internal/webassets/dist/_app/immutable/nodes/3.B10d8uq2.js b/apps/api/internal/webassets/dist/_app/immutable/nodes/3.BEOdX5ZT.js similarity index 73% rename from apps/api/internal/webassets/dist/_app/immutable/nodes/3.B10d8uq2.js rename to apps/api/internal/webassets/dist/_app/immutable/nodes/3.BEOdX5ZT.js index 8004fe61..f9949712 100644 --- a/apps/api/internal/webassets/dist/_app/immutable/nodes/3.B10d8uq2.js +++ b/apps/api/internal/webassets/dist/_app/immutable/nodes/3.BEOdX5ZT.js @@ -1,2 +1,2 @@ -const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["../chunks/TM-oTWC2.js","../chunks/DK3Fl9T5.js","../chunks/CxKeDCcw.js","../chunks/ChC1oWd7.js","../chunks/Dt-HX3Vu.js","../chunks/uBIymjUX.js","../chunks/xihTtKlq.js","../chunks/qQG-ipvL.js","../chunks/DEPNME54.js","../chunks/Dqjw8vaP.js","../chunks/Qo16U5GS.js","../chunks/OQjxVT6U.js","../chunks/CYM1xkwL.js","../chunks/BqBbEnKW.js","../chunks/C7NZ0SeM.js","../assets/QuoteBlock.Bmfc9wvU.css","../chunks/CyT438p0.js","../chunks/DlGnnCJo.js","../chunks/BVPazc3H.js","../chunks/Cht-DoaS.js","../assets/ThreadPanel.DFXp9CyT.css","../chunks/CVdgRPye.js","../chunks/BIhzYFGW.js","../assets/ChatApp.BrxGlI__.css","../chunks/D3xoa4tU.js","../assets/ProductSite.BGg6Zt1K.css"])))=>i.map(i=>d[i]); -import{t as e}from"../chunks/DK3Fl9T5.js";import{F as t,K as n,M as r,P as i,ut as a,vt as o}from"../chunks/CxKeDCcw.js";import{t as s}from"../chunks/uBIymjUX.js";import"../chunks/xihTtKlq.js";import"../chunks/CYM1xkwL.js";var c=e({prerender:()=>!0});function l(e){let c=window.location.hostname.startsWith(`app.`)?s(()=>import(`../chunks/TM-oTWC2.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]),import.meta.url):s(()=>import(`../chunks/D3xoa4tU.js`),__vite__mapDeps([24,2,1,6,12,25]),import.meta.url);var l=t(),u=a(l);r(u,()=>c,null,(e,t)=>{let r=o(()=>n(t).default);n(r)(e,{})}),i(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/By-MUCdv.js","../chunks/DK3Fl9T5.js","../chunks/CxKeDCcw.js","../chunks/ChC1oWd7.js","../chunks/Dt-HX3Vu.js","../chunks/uBIymjUX.js","../chunks/xihTtKlq.js","../chunks/qQG-ipvL.js","../chunks/DEPNME54.js","../chunks/Dqjw8vaP.js","../chunks/Qo16U5GS.js","../chunks/OQjxVT6U.js","../chunks/CYM1xkwL.js","../chunks/DOE07Vt_.js","../chunks/C7NZ0SeM.js","../assets/QuoteBlock.Bmfc9wvU.css","../chunks/KlawdwO_.js","../chunks/DlGnnCJo.js","../chunks/BVPazc3H.js","../chunks/8xW7lXBK.js","../assets/ThreadPanel.DFXp9CyT.css","../chunks/CVdgRPye.js","../chunks/BIhzYFGW.js","../assets/ChatApp.BrxGlI__.css","../chunks/D3xoa4tU.js","../assets/ProductSite.BGg6Zt1K.css"])))=>i.map(i=>d[i]); +import{t as e}from"../chunks/DK3Fl9T5.js";import{F as t,K as n,M as r,P as i,ut as a,vt as o}from"../chunks/CxKeDCcw.js";import{t as s}from"../chunks/uBIymjUX.js";import"../chunks/xihTtKlq.js";import"../chunks/CYM1xkwL.js";var c=e({prerender:()=>!0});function l(e){let c=window.location.hostname.startsWith(`app.`)?s(()=>import(`../chunks/By-MUCdv.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]),import.meta.url):s(()=>import(`../chunks/D3xoa4tU.js`),__vite__mapDeps([24,2,1,6,12,25]),import.meta.url);var l=t(),u=a(l);r(u,()=>c,null,(e,t)=>{let r=o(()=>n(t).default);n(r)(e,{})}),i(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.COOlYmhK.js b/apps/api/internal/webassets/dist/_app/immutable/nodes/4.K5JTYH6J.js similarity index 63% rename from apps/api/internal/webassets/dist/_app/immutable/nodes/4.COOlYmhK.js rename to apps/api/internal/webassets/dist/_app/immutable/nodes/4.K5JTYH6J.js index b30178ac..51a2b38e 100644 --- a/apps/api/internal/webassets/dist/_app/immutable/nodes/4.COOlYmhK.js +++ b/apps/api/internal/webassets/dist/_app/immutable/nodes/4.K5JTYH6J.js @@ -1 +1 @@ -import"../chunks/CxKeDCcw.js";import"../chunks/xihTtKlq.js";import"../chunks/CYM1xkwL.js";import{t as e}from"../chunks/TM-oTWC2.js";function t(t){e(t,{})}export{t as component}; \ No newline at end of file +import"../chunks/CxKeDCcw.js";import"../chunks/xihTtKlq.js";import"../chunks/CYM1xkwL.js";import{t as e}from"../chunks/By-MUCdv.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.BdROoItM.js b/apps/api/internal/webassets/dist/_app/immutable/nodes/5.DKZdmaNg.js similarity index 72% rename from apps/api/internal/webassets/dist/_app/immutable/nodes/5.BdROoItM.js rename to apps/api/internal/webassets/dist/_app/immutable/nodes/5.DKZdmaNg.js index 512350d6..219e44c1 100644 --- a/apps/api/internal/webassets/dist/_app/immutable/nodes/5.BdROoItM.js +++ b/apps/api/internal/webassets/dist/_app/immutable/nodes/5.DKZdmaNg.js @@ -1 +1 @@ -import{Et as e,Tt as t}from"../chunks/CxKeDCcw.js";import"../chunks/xihTtKlq.js";import{t as n}from"../chunks/TM-oTWC2.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/CxKeDCcw.js";import"../chunks/xihTtKlq.js";import{t as n}from"../chunks/By-MUCdv.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 86c9a83e..df36d2f4 100644 --- a/apps/api/internal/webassets/dist/index.html +++ b/apps/api/internal/webassets/dist/index.html @@ -103,17 +103,17 @@ - + - + - + - + @@ -128,7 +128,7 @@ Promise.all([ import("./_app/immutable/entry/start.W_KKVBz4.js"), - import("./_app/immutable/entry/app.CqYZBsX3.js") + import("./_app/immutable/entry/app.DLOeY-00.js") ]).then(([kit, app]) => { kit.start(app, element); }); diff --git a/apps/web/src/ChatApp.svelte b/apps/web/src/ChatApp.svelte index 148c6dbb..8fc71b5b 100644 --- a/apps/web/src/ChatApp.svelte +++ b/apps/web/src/ChatApp.svelte @@ -61,6 +61,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"; @@ -69,7 +71,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; @@ -165,6 +167,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; @@ -257,6 +267,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) && (currentWorkspaceRole === "owner" || currentWorkspaceRole === "moderator"); @@ -515,6 +526,95 @@ } } + 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 channel = channels.find((candidate) => candidate.id === event.payload.channel_id); + if (!channel) return; + const deletedBy = event.payload.deleted_by || ""; + const actor = mentionPeople.find((person) => person.id === deletedBy)?.display_name || ""; + const notice = channelDeletedNotice(channelDisplayTitle(channel), actor, deletedBy === user?.id); + await removeDeletedChannel(channel.id, notice); + } + + async function removeDeletedChannel(channelID: string, notice: string) { + const wasSelected = selectedChannelID === 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), + }; + } + 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); @@ -1132,9 +1232,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) { @@ -2640,7 +2744,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 { @@ -3220,6 +3324,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; @@ -3796,7 +3904,7 @@ function closeModal() { if (pendingDeleteMessage && deletingMessageIDs.has(pendingDeleteMessage.id)) return; - if (channelSettingsSaving) return; + if (channelSettingsSaving || deleteChannelDeleting) return; resetCreateActions(); pendingDeleteMessage = null; deleteMessageError = ""; @@ -3804,6 +3912,7 @@ settingsModalOpen = false; channelSettingsOpen = false; channelSettingsError = ""; + closeDeleteChannel(); } function closeMobileNav() { @@ -4259,8 +4368,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/settings/ChannelSettingsModal.svelte b/apps/web/src/components/settings/ChannelSettingsModal.svelte index 6229c220..5eb568aa 100644 --- a/apps/web/src/components/settings/ChannelSettingsModal.svelte +++ b/apps/web/src/components/settings/ChannelSettingsModal.svelte @@ -6,16 +6,20 @@ channel: Channel; saving?: boolean; error?: string; + canDelete?: boolean; onClose: () => void; onArchivedChange: (archived: boolean) => void; + onDelete?: () => void; }; let { channel, saving = false, error = "", + canDelete = false, onClose, onArchivedChange, + onDelete, }: Props = $props(); let confirmingArchive = $state(false); @@ -115,6 +119,20 @@
                {/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 00000000..df5a68fe --- /dev/null +++ b/apps/web/src/components/settings/DeleteChannelModal.svelte @@ -0,0 +1,129 @@ + + + diff --git a/apps/web/src/lib/channel-deletion.test.ts b/apps/web/src/lib/channel-deletion.test.ts new file mode 100644 index 00000000..3c2bea63 --- /dev/null +++ b/apps/web/src/lib/channel-deletion.test.ts @@ -0,0 +1,35 @@ +import test from "node:test"; +import assert from "node:assert/strict"; +import { + channelDeletedNotice, + channelDeletionBlockerMessage, + channelDeletionConfirmed, +} from "./channel-deletion.ts"; + +test("channelDeletionConfirmed requires the exact routing name", () => { + const channel = { name: "ventas-asia" }; + assert.equal(channelDeletionConfirmed("ventas-asia", channel), true); + assert.equal(channelDeletionConfirmed(" ventas-asia ", channel), true); + assert.equal(channelDeletionConfirmed("ventas-as", channel), false); + assert.equal(channelDeletionConfirmed("#ventas-asia", channel), false); + assert.equal(channelDeletionConfirmed("Ventas-Asia", channel), false); + assert.equal(channelDeletionConfirmed("", channel), false); +}); + +test("channelDeletionBlockerMessage explains each server blocker", () => { + assert.match(channelDeletionBlockerMessage({ blocker: "last_channel" }), /at least one channel/); + assert.match( + channelDeletionBlockerMessage({ blocker: "provisioned_channel" }), + /recreates this channel/, + ); + assert.equal(channelDeletionBlockerMessage({}), ""); +}); + +test("channelDeletedNotice names the actor when known", () => { + assert.equal( + channelDeletedNotice("ventas-asia", "Sergio"), + "#ventas-asia was deleted by Sergio.", + ); + assert.equal(channelDeletedNotice("ventas-asia", ""), "#ventas-asia was deleted."); + assert.equal(channelDeletedNotice("ventas-asia", "Sergio", true), "Deleted #ventas-asia."); +}); diff --git a/apps/web/src/lib/channel-deletion.ts b/apps/web/src/lib/channel-deletion.ts new file mode 100644 index 00000000..a7a3af89 --- /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 4804beb2..3932cd32 100644 --- a/apps/web/src/lib/types.ts +++ b/apps/web/src/lib/types.ts @@ -61,6 +61,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; @@ -318,6 +333,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 bf47b3b7..cc602ed4 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 18609415..99feb30b 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 c3b27706..9b2494b3 100644 --- a/docs/cli.md +++ b/docs/cli.md @@ -335,6 +335,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 b1b285e4..a5fedf65 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 66a401f9..b2692dcc 100644 --- a/docs/features/messages.md +++ b/docs/features/messages.md @@ -239,7 +239,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 bf26aab4..cbcb03a7 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 f1d0bef4..0a4d7131 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 9d33e34a..405dbe2f 100644 --- a/docs/features/workspaces.md +++ b/docs/features/workspaces.md @@ -67,6 +67,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?, @@ -104,14 +106,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 ff0bcf51..663cf850 100644 --- a/packages/protocol/openapi.yaml +++ b/packages/protocol/openapi.yaml @@ -1156,6 +1156,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 @@ -3082,6 +3117,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 dda1636f..d6e583ee 100644 --- a/packages/sdk-ts/src/generated/openapi.d.ts +++ b/packages/sdk-ts/src/generated/openapi.d.ts @@ -810,12 +810,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; @@ -1914,6 +1932,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. */ @@ -4213,6 +4255,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; @@ -4237,6 +4320,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 24409163..2203e9f8 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 00000000..b803b462 --- /dev/null +++ b/tests/e2e/channel-deletion.spec.ts @@ -0,0 +1,128 @@ +import { expect, test, type APIRequestContext } from "@playwright/test"; +import { execFileSync } from "node:child_process"; +import { randomUUID } from "node:crypto"; +import { waitForAppReady } from "./app-ready"; + +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 }) => { + 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 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"]); +}); + +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(); +});