diff --git a/CHANGELOG.md b/CHANGELOG.md index f839e4ad1..9c3fa2de6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ ## Unreleased +- Added roaming personal channel order, so a sidebar reordered on one device appears in the same order on every other device signed in to the same account, with localStorage still serving the pre-paint cache and the offline fallback. Clearing the order on one device clears it on the others, saves for one workspace are sent one at a time so the newest order is the one that lands, and positions past the 500-id roaming cap stay on the device that made them. - Updated Virtua, Wrangler, transitive build dependencies, the pinned AWS CLI, and the PostgreSQL CI service while retaining the 48-hour release-age gate and supported runtime minimums. - Preserve generated JavaScript literals during web builds, preventing whitespace cleanup from corrupting syntax grammars and Svelte class handling. - Hide OpenClaw ID sign-in when the server has not configured it, and show the correct sign-in guidance for OpenClaw-only servers. diff --git a/apps/api/internal/httpapi/profile.go b/apps/api/internal/httpapi/profile.go index e2cf687d1..15ef2e519 100644 --- a/apps/api/internal/httpapi/profile.go +++ b/apps/api/internal/httpapi/profile.go @@ -20,6 +20,9 @@ func (s *Server) me(w http.ResponseWriter, r *http.Request) { } preferences, err := s.store.GetAppearancePreferences(r.Context(), act.user.ID) payload := currentUserPayload{User: act.user, AppearancePreferences: preferences} + if err == nil { + payload.SidebarPreferences, err = s.store.GetSidebarPreferences(r.Context(), act.user.ID) + } if err == nil { payload.PasswordEnrolled, err = s.passwordEnrolled(r.Context(), act.user.ID) } @@ -42,6 +45,7 @@ func (s *Server) updateMe(w http.ResponseWriter, r *http.Request) { AvatarURL *string `json:"avatar_url"` NotificationSettings *store.NotificationSettings `json:"notification_settings"` AppearancePreferences *store.AppearancePreferencesPatch `json:"appearance_preferences"` + SidebarPreferences *store.SidebarPreferencesPatch `json:"sidebar_preferences"` } if err := readJSON(w, r, &body); err != nil { writeError(w, http.StatusBadRequest, err) @@ -54,8 +58,13 @@ func (s *Server) updateMe(w http.ResponseWriter, r *http.Request) { AvatarURL: body.AvatarURL, NotificationSettings: body.NotificationSettings, AppearancePreferences: body.AppearancePreferences, + SidebarPreferences: body.SidebarPreferences, }) - payload := currentUserPayload{User: updated.User, AppearancePreferences: updated.AppearancePreferences} + payload := currentUserPayload{ + User: updated.User, + AppearancePreferences: updated.AppearancePreferences, + SidebarPreferences: updated.SidebarPreferences, + } if err == nil { payload.PasswordEnrolled, err = s.passwordEnrolled(r.Context(), updated.User.ID) } @@ -65,6 +74,7 @@ func (s *Server) updateMe(w http.ResponseWriter, r *http.Request) { type currentUserPayload struct { store.User AppearancePreferences *store.AppearancePreferences `json:"appearance_preferences,omitempty"` + SidebarPreferences *store.SidebarPreferences `json:"sidebar_preferences,omitempty"` PasswordEnrolled bool `json:"password_enrolled"` } diff --git a/apps/api/internal/httpapi/responses.go b/apps/api/internal/httpapi/responses.go index bd532b039..890cee72d 100644 --- a/apps/api/internal/httpapi/responses.go +++ b/apps/api/internal/httpapi/responses.go @@ -124,6 +124,8 @@ func writeStoreError(w http.ResponseWriter, err error) { writeError(w, http.StatusForbidden, err) case errors.Is(err, store.ErrNotWorkspaceManager): writeError(w, http.StatusForbidden, err) + case errors.Is(err, store.ErrNotWorkspaceMember): + writeError(w, http.StatusForbidden, err) case errors.Is(err, store.ErrWorkspaceOwnerRequired): writeError(w, http.StatusForbidden, err) case errors.Is(err, store.ErrBotOwnerRequired): diff --git a/apps/api/internal/httpapi/sidebar_preferences_test.go b/apps/api/internal/httpapi/sidebar_preferences_test.go new file mode 100644 index 000000000..c5ca4ddb1 --- /dev/null +++ b/apps/api/internal/httpapi/sidebar_preferences_test.go @@ -0,0 +1,218 @@ +package httpapi + +import ( + "context" + "encoding/json" + "net/http" + "net/http/httptest" + "path/filepath" + "strings" + "testing" + + "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" +) + +type currentUserResponse = struct { + User currentUserPayload `json:"user"` +} + +// The sidebar order roams with the account, so /api/me carries it beside the +// appearance snapshot and each section patches independently. +func TestSidebarPreferencesRoamWithTheAccount(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", "sidebar-owner@example.com") + if err != nil { + t.Fatal(err) + } + workspaces, err := st.ListWorkspaces(ctx, owner.ID) + if err != nil { + t.Fatal(err) + } + workspaceID := workspaces[0].ID + first, _, err := st.CreateChannel(ctx, store.CreateChannelInput{WorkspaceID: workspaceID, Name: "aa-order", Kind: "public", UserID: owner.ID}) + if err != nil { + t.Fatal(err) + } + second, _, err := st.CreateChannel(ctx, store.CreateChannelInput{WorkspaceID: workspaceID, Name: "zz-order", Kind: "public", UserID: owner.ID}) + if err != nil { + t.Fatal(err) + } + server := newSidebarTestServer(t, st, dataDir) + + empty := getJSON[currentUserResponse](t, server.URL+"/api/me") + if empty.User.SidebarPreferences != nil { + t.Fatalf("a fresh account reported a sidebar order: %#v", empty.User.SidebarPreferences) + } + + dark := patchJSON[currentUserResponse](t, server.URL+"/api/me", map[string]any{ + "appearance_preferences": map[string]any{"color_mode": "dark"}, + }) + if dark.User.AppearancePreferences == nil || dark.User.AppearancePreferences.ColorMode != "dark" { + t.Fatalf("appearance patch did not apply: %#v", dark.User.AppearancePreferences) + } + + // A sidebar patch leaves appearance alone, drops an id that is not a + // channel of this workspace, and keeps the caller's order. + saved := patchJSON[currentUserResponse](t, server.URL+"/api/me", map[string]any{ + "sidebar_preferences": map[string]any{ + "channel_order": map[string]any{workspaceID: []string{second.ID, "chn_stranger", first.ID}}, + }, + }) + assertSidebarOrder(t, saved.User.SidebarPreferences, workspaceID, second.ID, first.ID) + if saved.User.AppearancePreferences == nil || saved.User.AppearancePreferences.ColorMode != "dark" { + t.Fatalf("a sidebar patch changed appearance: %#v", saved.User.AppearancePreferences) + } + + persisted := getJSON[currentUserResponse](t, server.URL+"/api/me") + assertSidebarOrder(t, persisted.User.SidebarPreferences, workspaceID, second.ID, first.ID) + + // An appearance patch leaves the sidebar order alone. + light := patchJSON[currentUserResponse](t, server.URL+"/api/me", map[string]any{ + "appearance_preferences": map[string]any{"color_mode": "light"}, + }) + if light.User.AppearancePreferences == nil || light.User.AppearancePreferences.ColorMode != "light" { + t.Fatalf("appearance patch did not apply: %#v", light.User.AppearancePreferences) + } + assertSidebarOrder(t, light.User.SidebarPreferences, workspaceID, second.ID, first.ID) + + // A profile-only patch leaves both sections alone. + renamed := patchJSON[currentUserResponse](t, server.URL+"/api/me", map[string]any{"display_name": "Renamed Owner"}) + if renamed.User.DisplayName != "Renamed Owner" { + t.Fatalf("profile patch did not apply: %#v", renamed.User.User) + } + assertSidebarOrder(t, renamed.User.SidebarPreferences, workspaceID, second.ID, first.ID) + if renamed.User.AppearancePreferences == nil || renamed.User.AppearancePreferences.ColorMode != "light" { + t.Fatalf("profile patch changed appearance: %#v", renamed.User.AppearancePreferences) + } + + // An empty list clears that workspace, and the cleared workspace keeps its + // key. A client that cached the old order needs to see the clear; a + // response that simply omitted the workspace would look identical to one + // that never saved an order, and the cache would win on the next load. + cleared := patchJSON[currentUserResponse](t, server.URL+"/api/me", map[string]any{ + "sidebar_preferences": map[string]any{"channel_order": map[string]any{workspaceID: []string{}}}, + }) + assertClearedSidebarOrder(t, cleared.User.SidebarPreferences, workspaceID) + + afterClear := getJSON[currentUserResponse](t, server.URL+"/api/me") + assertClearedSidebarOrder(t, afterClear.User.SidebarPreferences, workspaceID) + assertClearedSidebarOrderJSON(t, server.URL+"/api/me", workspaceID) +} + +func TestSidebarPreferencesRejectNonMembers(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", "sidebar-stranger-owner@example.com") + if err != nil { + t.Fatal(err) + } + workspaces, err := st.ListWorkspaces(ctx, owner.ID) + if err != nil { + t.Fatal(err) + } + private, err := st.CreateWorkspace(ctx, store.CreateWorkspaceInput{Name: "Private", Slug: "private"}, owner.ID) + if err != nil { + t.Fatal(err) + } + channel, _, err := st.CreateChannel(ctx, store.CreateChannelInput{WorkspaceID: private.ID, Name: "aa-private", Kind: "public", UserID: owner.ID}) + if err != nil { + t.Fatal(err) + } + stranger, err := st.CreateUser(ctx, store.CreateUserInput{DisplayName: "Stranger", Email: "sidebar-stranger@example.com"}) + if err != nil { + t.Fatal(err) + } + if err := st.AddWorkspaceMember(ctx, workspaces[0].ID, stranger.ID, "member"); err != nil { + t.Fatal(err) + } + server := newSidebarTestServer(t, st, dataDir) + + body := `{"sidebar_preferences":{"channel_order":{"` + private.ID + `":["` + channel.ID + `"]}}}` + expectStatusAsUser(t, stranger.ID, http.MethodPatch, server.URL+"/api/me", strings.NewReader(body), http.StatusForbidden) + + after := getJSONAsUser[currentUserResponse](t, stranger.ID, server.URL+"/api/me") + if after.User.SidebarPreferences != nil { + t.Fatalf("a rejected patch stored an order: %#v", after.User.SidebarPreferences) + } +} + +// assertClearedSidebarOrder pins the difference a client depends on: a cleared +// workspace keeps its key and holds an empty list, where a workspace that never +// saved an order is absent. +func assertClearedSidebarOrder(t *testing.T, preferences *store.SidebarPreferences, workspaceID string) { + t.Helper() + if preferences == nil { + t.Fatalf("clearing the only workspace dropped the snapshot for %s", workspaceID) + } + got, ok := preferences.ChannelOrder[workspaceID] + if !ok { + t.Fatalf("cleared workspace %s lost its key: %#v", workspaceID, preferences.ChannelOrder) + } + if len(got) != 0 { + t.Fatalf("cleared workspace %s kept an order: %#v", workspaceID, got) + } +} + +// assertClearedSidebarOrderJSON reads the wire bytes, because a nil slice would +// satisfy the typed assertion above and still reach the browser as null. +func assertClearedSidebarOrderJSON(t *testing.T, url, workspaceID string) { + t.Helper() + payload := getJSON[struct { + User struct { + SidebarPreferences struct { + ChannelOrder map[string]json.RawMessage `json:"channel_order"` + } `json:"sidebar_preferences"` + } `json:"user"` + }](t, url) + raw, ok := payload.User.SidebarPreferences.ChannelOrder[workspaceID] + if !ok { + t.Fatalf("cleared workspace %s is missing from the response body", workspaceID) + } + if string(raw) != "[]" { + t.Fatalf("cleared workspace %s serialized as %s, want []", workspaceID, raw) + } +} + +func newSidebarTestServer(t *testing.T, st *sqlitestore.Store, dataDir string) *httptest.Server { + t.Helper() + server := httptest.NewServer(New(st, realtime.NewHub(), Options{UploadDir: filepath.Join(dataDir, "uploads")}).Handler()) + t.Cleanup(server.Close) + return server +} + +func assertSidebarOrder(t *testing.T, preferences *store.SidebarPreferences, workspaceID string, want ...string) { + t.Helper() + if preferences == nil { + t.Fatalf("expected a sidebar snapshot for %s", workspaceID) + } + got := preferences.ChannelOrder[workspaceID] + if len(got) != len(want) { + t.Fatalf("unexpected order for %s: %#v", workspaceID, got) + } + for i := range want { + if got[i] != want[i] { + t.Fatalf("unexpected order for %s: %#v", workspaceID, got) + } + } +} diff --git a/apps/api/internal/store/postgres/migrations/0036_user_sidebar_channel_order.sql b/apps/api/internal/store/postgres/migrations/0036_user_sidebar_channel_order.sql new file mode 100644 index 000000000..e09a99b8d --- /dev/null +++ b/apps/api/internal/store/postgres/migrations/0036_user_sidebar_channel_order.sql @@ -0,0 +1,8 @@ +CREATE TABLE IF NOT EXISTS user_sidebar_channel_order ( + user_id TEXT NOT NULL, + workspace_id TEXT NOT NULL, + channel_ids TEXT NOT NULL DEFAULT '[]', + updated_at TEXT NOT NULL, + PRIMARY KEY (user_id, workspace_id), + FOREIGN KEY (workspace_id, user_id) REFERENCES workspace_members(workspace_id, user_id) ON DELETE CASCADE +); diff --git a/apps/api/internal/store/postgres/postgres.go b/apps/api/internal/store/postgres/postgres.go index 2ec10f881..010f1bb64 100644 --- a/apps/api/internal/store/postgres/postgres.go +++ b/apps/api/internal/store/postgres/postgres.go @@ -283,6 +283,13 @@ func (s *Store) UpdateCurrentUser(ctx context.Context, input store.UpdateCurrent return store.CurrentUserState{}, err } } + var sidebarPatch store.SidebarPreferencesPatch + if input.SidebarPreferences != nil { + sidebarPatch, err = store.NormalizeSidebarPreferencesPatch(*input.SidebarPreferences) + if err != nil { + return store.CurrentUserState{}, err + } + } tx, err := s.db.BeginTx(ctx, nil) if err != nil { return store.CurrentUserState{}, err @@ -353,6 +360,11 @@ func (s *Store) UpdateCurrentUser(ctx context.Context, input store.UpdateCurrent return store.CurrentUserState{}, err } } + if input.SidebarPreferences != nil && !store.SidebarPreferencesPatchEmpty(sidebarPatch) { + if err := updateSidebarPreferences(ctx, qtx, input.UserID, sidebarPatch, now()); err != nil { + return store.CurrentUserState{}, err + } + } if err := tx.Commit(); err != nil { return store.CurrentUserState{}, err } @@ -364,7 +376,11 @@ func (s *Store) UpdateCurrentUser(ctx context.Context, input store.UpdateCurrent if err != nil { return store.CurrentUserState{}, err } - return store.CurrentUserState{User: user, AppearancePreferences: preferences}, nil + sidebar, err := s.GetSidebarPreferences(ctx, input.UserID) + if err != nil { + return store.CurrentUserState{}, err + } + return store.CurrentUserState{User: user, AppearancePreferences: preferences, SidebarPreferences: sidebar}, nil } func profileUpdateError(err error) error { diff --git a/apps/api/internal/store/postgres/sidebar.go b/apps/api/internal/store/postgres/sidebar.go new file mode 100644 index 000000000..8242f4125 --- /dev/null +++ b/apps/api/internal/store/postgres/sidebar.go @@ -0,0 +1,78 @@ +package postgres + +import ( + "context" + "database/sql" + "encoding/json" + "errors" + + "github.com/openclaw/clickclack/apps/api/internal/store" + "github.com/openclaw/clickclack/apps/api/internal/store/postgres/storedb" +) + +func (s *Store) GetSidebarPreferences(ctx context.Context, userID string) (*store.SidebarPreferences, error) { + rows, err := s.q.ListSidebarChannelOrder(ctx, userID) + if err != nil { + return nil, err + } + order := make(map[string][]string, len(rows)) + for _, row := range rows { + ids, err := decodeSidebarChannelOrder(row.ChannelIds) + if err != nil { + // A row we cannot read is a stale cache, not a broken account. The + // workspace falls back to the server's default ordering. + continue + } + // A row holding an empty list is a cleared order, which is not the same + // as never having saved one: the client needs the key back so it can + // drop its own cached order instead of restoring it. + if ids == nil { + ids = []string{} + } + order[row.WorkspaceID] = ids + } + if len(order) == 0 { + return nil, nil + } + return &store.SidebarPreferences{ChannelOrder: order}, nil +} + +func updateSidebarPreferences(ctx context.Context, q *storedb.Queries, userID string, patch store.SidebarPreferencesPatch, timestamp string) error { + for workspaceID, order := range patch.ChannelOrder { + if _, err := q.RequireMembership(ctx, storedb.RequireMembershipParams{WorkspaceID: workspaceID, UserID: userID}); err != nil { + if errors.Is(err, sql.ErrNoRows) { + return store.ErrNotWorkspaceMember + } + return err + } + channelIDs, err := q.ListWorkspaceChannelIDs(ctx, workspaceID) + if err != nil { + return err + } + // A cleared order is stored as a row holding an empty list rather than + // deleted, so a later read can tell "cleared" from "never saved". The + // row goes away only when the membership it hangs off does. + filtered := store.FilterSidebarChannelOrder(order, channelIDs) + encoded, err := json.Marshal(filtered) + if err != nil { + return err + } + if err := q.UpsertSidebarChannelOrder(ctx, storedb.UpsertSidebarChannelOrderParams{ + UserID: userID, + WorkspaceID: workspaceID, + ChannelIds: string(encoded), + UpdatedAt: timestamp, + }); err != nil { + return err + } + } + return nil +} + +func decodeSidebarChannelOrder(raw string) ([]string, error) { + var ids []string + if err := json.Unmarshal([]byte(raw), &ids); err != nil { + return nil, err + } + return ids, nil +} diff --git a/apps/api/internal/store/postgres/sidebar_test.go b/apps/api/internal/store/postgres/sidebar_test.go new file mode 100644 index 000000000..577ce75b5 --- /dev/null +++ b/apps/api/internal/store/postgres/sidebar_test.go @@ -0,0 +1,349 @@ +package postgres + +import ( + "context" + "errors" + "os" + "strconv" + "testing" + "time" + + "github.com/openclaw/clickclack/apps/api/internal/store" +) + +func TestSidebarChannelOrderLifecycle(t *testing.T) { + ctx, st, suffix := newSidebarTestStore(t) + + user, err := st.CreateUser(ctx, store.CreateUserInput{ + DisplayName: "Sidebar User", + Email: "sidebar-postgres-" + suffix + "@example.com", + }) + if err != nil { + t.Fatal(err) + } + + preferences, err := st.GetSidebarPreferences(ctx, user.ID) + if err != nil { + t.Fatal(err) + } + if preferences != nil { + t.Fatalf("expected missing preferences, got %#v", preferences) + } + + workspace, err := st.CreateWorkspace(ctx, store.CreateWorkspaceInput{Name: "Sidebar", Slug: "sidebar-" + suffix}, user.ID) + if err != nil { + t.Fatal(err) + } + first, _, err := st.CreateChannel(ctx, store.CreateChannelInput{WorkspaceID: workspace.ID, Name: "aa", Kind: "public", UserID: user.ID}) + if err != nil { + t.Fatal(err) + } + second, _, err := st.CreateChannel(ctx, store.CreateChannelInput{WorkspaceID: workspace.ID, Name: "bb", Kind: "public", UserID: user.ID}) + if err != nil { + t.Fatal(err) + } + + account, err := st.UpdateCurrentUser(ctx, store.UpdateCurrentUserInput{ + UserID: user.ID, + SidebarPreferences: &store.SidebarPreferencesPatch{}, + }) + if err != nil { + t.Fatal(err) + } + if account.SidebarPreferences != nil { + t.Fatalf("empty patch created a row: %#v", account.SidebarPreferences) + } + + account, err = st.UpdateCurrentUser(ctx, store.UpdateCurrentUserInput{ + UserID: user.ID, + SidebarPreferences: &store.SidebarPreferencesPatch{ + ChannelOrder: map[string][]string{workspace.ID: {second.ID, first.ID}}, + }, + }) + if err != nil { + t.Fatal(err) + } + assertChannelOrder(t, account.SidebarPreferences, workspace.ID, second.ID, first.ID) + + roundTrip, err := st.GetSidebarPreferences(ctx, user.ID) + if err != nil { + t.Fatal(err) + } + assertChannelOrder(t, roundTrip, workspace.ID, second.ID, first.ID) + + // An id that is not a channel of this workspace is dropped rather than + // rejected, so a channel deleted since the client rendered cannot wedge a + // save. Duplicates keep their first position. + account, err = st.UpdateCurrentUser(ctx, store.UpdateCurrentUserInput{ + UserID: user.ID, + SidebarPreferences: &store.SidebarPreferencesPatch{ + ChannelOrder: map[string][]string{workspace.ID: {first.ID, "chn_gone", second.ID, first.ID}}, + }, + }) + if err != nil { + t.Fatal(err) + } + assertChannelOrder(t, account.SidebarPreferences, workspace.ID, first.ID, second.ID) + + // A second workspace is stored independently. + other, err := st.CreateWorkspace(ctx, store.CreateWorkspaceInput{Name: "Other Sidebar", Slug: "other-sidebar-" + suffix}, user.ID) + if err != nil { + t.Fatal(err) + } + otherChannel, _, err := st.CreateChannel(ctx, store.CreateChannelInput{WorkspaceID: other.ID, Name: "cc", Kind: "public", UserID: user.ID}) + if err != nil { + t.Fatal(err) + } + account, err = st.UpdateCurrentUser(ctx, store.UpdateCurrentUserInput{ + UserID: user.ID, + SidebarPreferences: &store.SidebarPreferencesPatch{ + ChannelOrder: map[string][]string{other.ID: {otherChannel.ID}}, + }, + }) + if err != nil { + t.Fatal(err) + } + assertChannelOrder(t, account.SidebarPreferences, workspace.ID, first.ID, second.ID) + assertChannelOrder(t, account.SidebarPreferences, other.ID, otherChannel.ID) + + // A channel of the other workspace never enters this workspace's order. + account, err = st.UpdateCurrentUser(ctx, store.UpdateCurrentUserInput{ + UserID: user.ID, + SidebarPreferences: &store.SidebarPreferencesPatch{ + ChannelOrder: map[string][]string{workspace.ID: {otherChannel.ID, second.ID, first.ID}}, + }, + }) + if err != nil { + t.Fatal(err) + } + assertChannelOrder(t, account.SidebarPreferences, workspace.ID, second.ID, first.ID) + + // An empty list clears that workspace and leaves the rest alone. The + // cleared workspace keeps its key, holding an empty list, so a client can + // tell a clear from a workspace that never saved an order and drop its own + // cached copy instead of restoring it. + account, err = st.UpdateCurrentUser(ctx, store.UpdateCurrentUserInput{ + UserID: user.ID, + SidebarPreferences: &store.SidebarPreferencesPatch{ + ChannelOrder: map[string][]string{workspace.ID: {}}, + }, + }) + if err != nil { + t.Fatal(err) + } + if account.SidebarPreferences == nil { + t.Fatal("clearing one workspace dropped the whole snapshot") + } + assertClearedChannelOrder(t, account.SidebarPreferences, workspace.ID) + assertChannelOrder(t, account.SidebarPreferences, other.ID, otherChannel.ID) + + cleared, err := st.GetSidebarPreferences(ctx, user.ID) + if err != nil { + t.Fatal(err) + } + assertClearedChannelOrder(t, cleared, workspace.ID) + assertChannelOrder(t, cleared, other.ID, otherChannel.ID) +} + +func TestSidebarChannelOrderRequiresMembership(t *testing.T) { + ctx, st, suffix := newSidebarTestStore(t) + + owner, err := st.CreateUser(ctx, store.CreateUserInput{DisplayName: "Owner", Email: "sidebar-owner-postgres-" + suffix + "@example.com"}) + if err != nil { + t.Fatal(err) + } + stranger, err := st.CreateUser(ctx, store.CreateUserInput{DisplayName: "Stranger", Email: "sidebar-stranger-postgres-" + suffix + "@example.com"}) + if err != nil { + t.Fatal(err) + } + workspace, err := st.CreateWorkspace(ctx, store.CreateWorkspaceInput{Name: "Members Only", Slug: "members-only-" + suffix}, owner.ID) + if err != nil { + t.Fatal(err) + } + channel, _, err := st.CreateChannel(ctx, store.CreateChannelInput{WorkspaceID: workspace.ID, Name: "aa", Kind: "public", UserID: owner.ID}) + if err != nil { + t.Fatal(err) + } + + _, err = st.UpdateCurrentUser(ctx, store.UpdateCurrentUserInput{ + UserID: stranger.ID, + SidebarPreferences: &store.SidebarPreferencesPatch{ + ChannelOrder: map[string][]string{workspace.ID: {channel.ID}}, + }, + }) + if !errors.Is(err, store.ErrNotWorkspaceMember) { + t.Fatalf("expected a membership error, got %v", err) + } + preferences, err := st.GetSidebarPreferences(ctx, stranger.ID) + if err != nil { + t.Fatal(err) + } + if preferences != nil { + t.Fatalf("a non-member wrote an order: %#v", preferences) + } +} + +func TestSidebarChannelOrderRejectsOversizedPatch(t *testing.T) { + ctx, st, suffix := newSidebarTestStore(t) + + user, err := st.CreateUser(ctx, store.CreateUserInput{DisplayName: "Cap User", Email: "sidebar-cap-postgres-" + suffix + "@example.com"}) + if err != nil { + t.Fatal(err) + } + workspace, err := st.CreateWorkspace(ctx, store.CreateWorkspaceInput{Name: "Cap", Slug: "cap-" + suffix}, user.ID) + if err != nil { + t.Fatal(err) + } + overLimit := make([]string, 0, store.MaxSidebarChannelOrderIDs+1) + for i := 0; i <= store.MaxSidebarChannelOrderIDs; i++ { + overLimit = append(overLimit, "chn_"+strconv.Itoa(i)) + } + if _, err := st.UpdateCurrentUser(ctx, store.UpdateCurrentUserInput{ + UserID: user.ID, + SidebarPreferences: &store.SidebarPreferencesPatch{ + ChannelOrder: map[string][]string{workspace.ID: overLimit}, + }, + }); err == nil { + t.Fatal("expected the per-workspace cap to reject the patch") + } +} + +func TestSidebarChannelOrderCascadesWithMembership(t *testing.T) { + ctx, st, suffix := newSidebarTestStore(t) + + user, err := st.CreateUser(ctx, store.CreateUserInput{DisplayName: "Cascade User", Email: "sidebar-cascade-postgres-" + suffix + "@example.com"}) + if err != nil { + t.Fatal(err) + } + workspace, err := st.CreateWorkspace(ctx, store.CreateWorkspaceInput{Name: "Cascade", Slug: "cascade-" + suffix}, user.ID) + if err != nil { + t.Fatal(err) + } + channel, _, err := st.CreateChannel(ctx, store.CreateChannelInput{WorkspaceID: workspace.ID, Name: "aa", Kind: "public", UserID: user.ID}) + if err != nil { + t.Fatal(err) + } + if _, err := st.UpdateCurrentUser(ctx, store.UpdateCurrentUserInput{ + UserID: user.ID, + SidebarPreferences: &store.SidebarPreferencesPatch{ + ChannelOrder: map[string][]string{workspace.ID: {channel.ID}}, + }, + }); err != nil { + t.Fatal(err) + } + if _, err := st.db.ExecContext(ctx, `DELETE FROM workspace_members WHERE workspace_id = $1 AND user_id = $2`, workspace.ID, user.ID); err != nil { + t.Fatal(err) + } + preferences, err := st.GetSidebarPreferences(ctx, user.ID) + if err != nil { + t.Fatal(err) + } + if preferences != nil { + t.Fatalf("membership removal did not cascade the saved order: %#v", preferences) + } +} + +func TestSidebarChannelOrderIndependentOfAppearance(t *testing.T) { + ctx, st, suffix := newSidebarTestStore(t) + + user, err := st.CreateUser(ctx, store.CreateUserInput{DisplayName: "Both User", Email: "sidebar-both-postgres-" + suffix + "@example.com"}) + if err != nil { + t.Fatal(err) + } + workspace, err := st.CreateWorkspace(ctx, store.CreateWorkspaceInput{Name: "Both", Slug: "both-" + suffix}, user.ID) + if err != nil { + t.Fatal(err) + } + channel, _, err := st.CreateChannel(ctx, store.CreateChannelInput{WorkspaceID: workspace.ID, Name: "aa", Kind: "public", UserID: user.ID}) + if err != nil { + t.Fatal(err) + } + + dark := "dark" + if _, err := st.UpdateCurrentUser(ctx, store.UpdateCurrentUserInput{ + UserID: user.ID, + AppearancePreferences: &store.AppearancePreferencesPatch{ColorMode: &dark}, + }); err != nil { + t.Fatal(err) + } + account, err := st.UpdateCurrentUser(ctx, store.UpdateCurrentUserInput{ + UserID: user.ID, + SidebarPreferences: &store.SidebarPreferencesPatch{ + ChannelOrder: map[string][]string{workspace.ID: {channel.ID}}, + }, + }) + if err != nil { + t.Fatal(err) + } + if account.AppearancePreferences == nil || account.AppearancePreferences.ColorMode != "dark" { + t.Fatalf("a sidebar patch changed appearance: %#v", account.AppearancePreferences) + } + assertChannelOrder(t, account.SidebarPreferences, workspace.ID, channel.ID) + + light := "light" + account, err = st.UpdateCurrentUser(ctx, store.UpdateCurrentUserInput{ + UserID: user.ID, + AppearancePreferences: &store.AppearancePreferencesPatch{ColorMode: &light}, + }) + if err != nil { + t.Fatal(err) + } + if account.AppearancePreferences == nil || account.AppearancePreferences.ColorMode != "light" { + t.Fatalf("unexpected appearance: %#v", account.AppearancePreferences) + } + assertChannelOrder(t, account.SidebarPreferences, workspace.ID, channel.ID) +} + +func newSidebarTestStore(t *testing.T) (context.Context, *Store, string) { + t.Helper() + dsn := os.Getenv("CLICKCLACK_POSTGRES_TEST_DSN") + if dsn == "" { + t.Skip("set CLICKCLACK_POSTGRES_TEST_DSN to run Postgres integration smoke") + } + ctx := context.Background() + st, err := Open(dsn) + if err != nil { + t.Fatal(err) + } + t.Cleanup(func() { _ = st.Close() }) + if err := st.Migrate(ctx); err != nil { + t.Fatal(err) + } + return ctx, st, time.Now().UTC().Format("20060102150405.000000000") +} + +// assertClearedChannelOrder pins the difference between a workspace whose order +// was cleared and one that never saved one: the cleared workspace keeps its key +// and holds an empty list. +func assertClearedChannelOrder(t *testing.T, preferences *store.SidebarPreferences, workspaceID string) { + t.Helper() + if preferences == nil { + t.Fatalf("expected a sidebar snapshot for %s", workspaceID) + } + got, ok := preferences.ChannelOrder[workspaceID] + if !ok { + t.Fatalf("cleared workspace %s lost its key: %#v", workspaceID, preferences.ChannelOrder) + } + if got == nil { + t.Fatalf("cleared workspace %s reported a null order", workspaceID) + } + if len(got) != 0 { + t.Fatalf("cleared workspace %s kept an order: %#v", workspaceID, got) + } +} + +func assertChannelOrder(t *testing.T, preferences *store.SidebarPreferences, workspaceID string, want ...string) { + t.Helper() + if preferences == nil { + t.Fatalf("expected a sidebar snapshot for %s", workspaceID) + } + got := preferences.ChannelOrder[workspaceID] + if len(got) != len(want) { + t.Fatalf("unexpected order for %s: %#v", workspaceID, got) + } + for i := range want { + if got[i] != want[i] { + t.Fatalf("unexpected order for %s: %#v", workspaceID, got) + } + } +} diff --git a/apps/api/internal/store/postgres/sqlc/queries.sql b/apps/api/internal/store/postgres/sqlc/queries.sql index 4a2567c3e..b567811a8 100644 --- a/apps/api/internal/store/postgres/sqlc/queries.sql +++ b/apps/api/internal/store/postgres/sqlc/queries.sql @@ -280,6 +280,25 @@ UPDATE user_appearance_preferences SET density = sqlc.arg(density) WHERE user_id = sqlc.arg(user_id); +-- name: ListSidebarChannelOrder :many +SELECT workspace_id, channel_ids +FROM user_sidebar_channel_order +WHERE user_id = sqlc.arg(user_id) +ORDER BY workspace_id; + +-- name: UpsertSidebarChannelOrder :exec +INSERT INTO user_sidebar_channel_order (user_id, workspace_id, channel_ids, updated_at) +VALUES (sqlc.arg(user_id), sqlc.arg(workspace_id), sqlc.arg(channel_ids), sqlc.arg(updated_at)) +ON CONFLICT(user_id, workspace_id) DO UPDATE SET + channel_ids = excluded.channel_ids, + updated_at = excluded.updated_at; + +-- name: ListWorkspaceChannelIDs :many +SELECT id +FROM channels +WHERE workspace_id = sqlc.arg(workspace_id) +ORDER BY id; + -- name: UpsertChannelNotificationSettings :exec INSERT INTO channel_notification_settings (channel_id, user_id, preference, created_at, updated_at) VALUES (sqlc.arg(channel_id), sqlc.arg(user_id), sqlc.arg(preference), sqlc.arg(created_at), sqlc.arg(updated_at)) diff --git a/apps/api/internal/store/postgres/sqlc/schema.sql b/apps/api/internal/store/postgres/sqlc/schema.sql index a55588f63..0a3486835 100644 --- a/apps/api/internal/store/postgres/sqlc/schema.sql +++ b/apps/api/internal/store/postgres/sqlc/schema.sql @@ -362,6 +362,15 @@ CREATE TABLE user_appearance_preferences ( density TEXT NOT NULL DEFAULT '' ); +CREATE TABLE user_sidebar_channel_order ( + user_id TEXT NOT NULL, + workspace_id TEXT NOT NULL, + channel_ids TEXT NOT NULL DEFAULT '[]', + updated_at TEXT NOT NULL, + PRIMARY KEY (user_id, workspace_id), + FOREIGN KEY (workspace_id, user_id) REFERENCES workspace_members(workspace_id, user_id) ON DELETE CASCADE +); + CREATE TABLE bot_tokens ( id TEXT PRIMARY KEY, token_hash TEXT NOT NULL UNIQUE, diff --git a/apps/api/internal/store/postgres/storedb/models.go b/apps/api/internal/store/postgres/storedb/models.go index d7ab08dbd..0dc84d26a 100644 --- a/apps/api/internal/store/postgres/storedb/models.go +++ b/apps/api/internal/store/postgres/storedb/models.go @@ -426,6 +426,13 @@ type UserPassword struct { UpdatedAt string `json:"updated_at"` } +type UserSidebarChannelOrder struct { + UserID string `json:"user_id"` + WorkspaceID string `json:"workspace_id"` + ChannelIds string `json:"channel_ids"` + UpdatedAt string `json:"updated_at"` +} + type Workspace struct { ID string `json:"id"` Name string `json:"name"` diff --git a/apps/api/internal/store/postgres/storedb/queries.sql.go b/apps/api/internal/store/postgres/storedb/queries.sql.go index 714bf3581..cc52e4d15 100644 --- a/apps/api/internal/store/postgres/storedb/queries.sql.go +++ b/apps/api/internal/store/postgres/storedb/queries.sql.go @@ -4234,6 +4234,41 @@ func (q *Queries) ListReactionsForMessages(ctx context.Context, arg ListReaction return items, nil } +const listSidebarChannelOrder = `-- name: ListSidebarChannelOrder :many +SELECT workspace_id, channel_ids +FROM user_sidebar_channel_order +WHERE user_id = $1 +ORDER BY workspace_id +` + +type ListSidebarChannelOrderRow struct { + WorkspaceID string `json:"workspace_id"` + ChannelIds string `json:"channel_ids"` +} + +func (q *Queries) ListSidebarChannelOrder(ctx context.Context, userID string) ([]ListSidebarChannelOrderRow, error) { + rows, err := q.db.QueryContext(ctx, listSidebarChannelOrder, userID) + if err != nil { + return nil, err + } + defer rows.Close() + var items []ListSidebarChannelOrderRow + for rows.Next() { + var i ListSidebarChannelOrderRow + if err := rows.Scan(&i.WorkspaceID, &i.ChannelIds); 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 listThreadReplyPage = `-- name: ListThreadReplyPage :many WITH descending_page AS ( SELECT candidate.id, candidate.workspace_id, candidate.channel_id, candidate.direct_conversation_id, candidate.author_id, candidate.parent_message_id, candidate.thread_root_id, candidate.topic_id, candidate.channel_seq, candidate.thread_seq, candidate.body, candidate.body_format, candidate.created_at, candidate.edited_at, candidate.deleted_at, candidate.quoted_message_id, candidate.quoted_body_snapshot, candidate.quoted_author_id, candidate.client_nonce, candidate.route_id, candidate.kind, candidate.turn_id FROM messages candidate @@ -4795,6 +4830,36 @@ func (q *Queries) ListWorkspaceBots(ctx context.Context, workspaceID string) ([] return items, nil } +const listWorkspaceChannelIDs = `-- name: ListWorkspaceChannelIDs :many +SELECT id +FROM channels +WHERE workspace_id = $1 +ORDER BY id +` + +func (q *Queries) ListWorkspaceChannelIDs(ctx context.Context, workspaceID string) ([]string, error) { + rows, err := q.db.QueryContext(ctx, listWorkspaceChannelIDs, workspaceID) + 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 listWorkspaceMemberPage = `-- name: ListWorkspaceMemberPage :many SELECT u.id, u.kind, COALESCE(u.owner_user_id, '') AS owner_user_id, u.display_name, u.handle, u.avatar_url, u.created_at, wm.role, wm.created_at AS joined_at, @@ -6528,6 +6593,31 @@ func (q *Queries) UpsertNotificationSettings(ctx context.Context, arg UpsertNoti return err } +const upsertSidebarChannelOrder = `-- name: UpsertSidebarChannelOrder :exec +INSERT INTO user_sidebar_channel_order (user_id, workspace_id, channel_ids, updated_at) +VALUES ($1, $2, $3, $4) +ON CONFLICT(user_id, workspace_id) DO UPDATE SET + channel_ids = excluded.channel_ids, + updated_at = excluded.updated_at +` + +type UpsertSidebarChannelOrderParams struct { + UserID string `json:"user_id"` + WorkspaceID string `json:"workspace_id"` + ChannelIds string `json:"channel_ids"` + UpdatedAt string `json:"updated_at"` +} + +func (q *Queries) UpsertSidebarChannelOrder(ctx context.Context, arg UpsertSidebarChannelOrderParams) error { + _, err := q.db.ExecContext(ctx, upsertSidebarChannelOrder, + arg.UserID, + arg.WorkspaceID, + arg.ChannelIds, + arg.UpdatedAt, + ) + return err +} + const upsertUserPassword = `-- name: UpsertUserPassword :exec INSERT INTO user_passwords (user_id, password_hash, updated_at) VALUES ($1, $2, $3) diff --git a/apps/api/internal/store/sidebar.go b/apps/api/internal/store/sidebar.go new file mode 100644 index 000000000..f9d95014b --- /dev/null +++ b/apps/api/internal/store/sidebar.go @@ -0,0 +1,74 @@ +package store + +import "errors" + +// MaxSidebarChannelOrderIDs bounds one workspace's saved channel order. A +// client with more channels than this saves the leading window and lets the +// server's default ordering carry the rest. +const MaxSidebarChannelOrderIDs = 500 + +// MaxSidebarChannelOrderWorkspaces bounds how many workspaces one patch may +// rewrite, so a single request cannot fan out into unbounded membership work. +const MaxSidebarChannelOrderWorkspaces = 100 + +// maxSidebarChannelIDLength matches the client's own id guard. Longer values +// cannot name a channel, so they are dropped with the other unknown ids. +const maxSidebarChannelIDLength = 128 + +func SidebarPreferencesPatchEmpty(patch SidebarPreferencesPatch) bool { + return patch.ChannelOrder == nil +} + +// NormalizeSidebarPreferencesPatch collapses repeated ids to their first +// position and drops ids that cannot name a channel. Ids that are well formed +// but unknown survive here and are filtered against the workspace's channels in +// the store, where the workspace is known. +func NormalizeSidebarPreferencesPatch(input SidebarPreferencesPatch) (SidebarPreferencesPatch, error) { + if input.ChannelOrder == nil { + return SidebarPreferencesPatch{}, nil + } + if len(input.ChannelOrder) > MaxSidebarChannelOrderWorkspaces { + return SidebarPreferencesPatch{}, errors.New("channel_order lists too many workspaces") + } + normalized := make(map[string][]string, len(input.ChannelOrder)) + for workspaceID, ids := range input.ChannelOrder { + if workspaceID == "" { + return SidebarPreferencesPatch{}, errors.New("channel_order workspace id is required") + } + seen := make(map[string]struct{}, len(ids)) + order := make([]string, 0, len(ids)) + for _, id := range ids { + if id == "" || len(id) > maxSidebarChannelIDLength { + continue + } + if _, duplicate := seen[id]; duplicate { + continue + } + seen[id] = struct{}{} + order = append(order, id) + } + if len(order) > MaxSidebarChannelOrderIDs { + return SidebarPreferencesPatch{}, errors.New("channel_order lists too many channels for one workspace") + } + normalized[workspaceID] = order + } + return SidebarPreferencesPatch{ChannelOrder: normalized}, nil +} + +// FilterSidebarChannelOrder keeps only ids that are channels of the workspace, +// in the caller's order. A channel that was deleted since the client last read +// the sidebar is dropped instead of failing the save. +func FilterSidebarChannelOrder(order []string, workspaceChannelIDs []string) []string { + known := make(map[string]struct{}, len(workspaceChannelIDs)) + for _, id := range workspaceChannelIDs { + known[id] = struct{}{} + } + filtered := make([]string, 0, len(order)) + for _, id := range order { + if _, ok := known[id]; !ok { + continue + } + filtered = append(filtered, id) + } + return filtered +} diff --git a/apps/api/internal/store/sidebar_test.go b/apps/api/internal/store/sidebar_test.go new file mode 100644 index 000000000..fe7df7e1c --- /dev/null +++ b/apps/api/internal/store/sidebar_test.go @@ -0,0 +1,148 @@ +package store + +import ( + "strconv" + "testing" +) + +// Characterization tests pinning NormalizeSidebarPreferencesPatch and +// FilterSidebarChannelOrder, the sidebar validators invoked by both store +// backends before a channel order reaches the database. + +func TestNormalizeSidebarPreferencesPatch_NilOrderStaysNil(t *testing.T) { + out, err := NormalizeSidebarPreferencesPatch(SidebarPreferencesPatch{}) + if err != nil { + t.Fatal(err) + } + if out.ChannelOrder != nil { + t.Fatalf("nil channel order became %#v", out.ChannelOrder) + } + if !SidebarPreferencesPatchEmpty(out) { + t.Fatal("nil channel order is not empty") + } +} + +func TestSidebarPreferencesPatchEmpty_EmptyMapIsNotNil(t *testing.T) { + if SidebarPreferencesPatchEmpty(SidebarPreferencesPatch{ChannelOrder: map[string][]string{}}) { + t.Fatal("an empty map should not report as an absent patch") + } +} + +func TestNormalizeSidebarPreferencesPatch_CollapsesDuplicatesToFirstPosition(t *testing.T) { + out, err := NormalizeSidebarPreferencesPatch(SidebarPreferencesPatch{ + ChannelOrder: map[string][]string{ + "wsp_1": {"chn_a", "chn_b", "chn_a", "chn_c", "chn_b"}, + }, + }) + if err != nil { + t.Fatal(err) + } + want := []string{"chn_a", "chn_b", "chn_c"} + got := out.ChannelOrder["wsp_1"] + if len(got) != len(want) { + t.Fatalf("unexpected order: %#v", got) + } + for i := range want { + if got[i] != want[i] { + t.Fatalf("unexpected order: %#v", got) + } + } +} + +func TestNormalizeSidebarPreferencesPatch_DropsUnusableIDs(t *testing.T) { + long := "" + for len(long) <= maxSidebarChannelIDLength { + long += "x" + } + out, err := NormalizeSidebarPreferencesPatch(SidebarPreferencesPatch{ + ChannelOrder: map[string][]string{"wsp_1": {"", long, "chn_a"}}, + }) + if err != nil { + t.Fatal(err) + } + got := out.ChannelOrder["wsp_1"] + if len(got) != 1 || got[0] != "chn_a" { + t.Fatalf("unusable ids survived: %#v", got) + } +} + +func TestNormalizeSidebarPreferencesPatch_KeepsClearedWorkspaces(t *testing.T) { + out, err := NormalizeSidebarPreferencesPatch(SidebarPreferencesPatch{ + ChannelOrder: map[string][]string{"wsp_1": {}}, + }) + if err != nil { + t.Fatal(err) + } + order, ok := out.ChannelOrder["wsp_1"] + if !ok { + t.Fatal("a cleared workspace must survive normalization so the store can delete its row") + } + if len(order) != 0 { + t.Fatalf("cleared workspace kept ids: %#v", order) + } +} + +func TestNormalizeSidebarPreferencesPatch_RejectsOversizedInput(t *testing.T) { + overLimit := make([]string, 0, MaxSidebarChannelOrderIDs+1) + for i := 0; i <= MaxSidebarChannelOrderIDs; i++ { + overLimit = append(overLimit, "chn_"+strconv.Itoa(i)) + } + if _, err := NormalizeSidebarPreferencesPatch(SidebarPreferencesPatch{ + ChannelOrder: map[string][]string{"wsp_1": overLimit}, + }); err == nil { + t.Fatal("expected the per-workspace cap to reject the patch") + } + + workspaces := make(map[string][]string, MaxSidebarChannelOrderWorkspaces+1) + for i := 0; i <= MaxSidebarChannelOrderWorkspaces; i++ { + workspaces["wsp_"+strconv.Itoa(i)] = []string{"chn_a"} + } + if _, err := NormalizeSidebarPreferencesPatch(SidebarPreferencesPatch{ChannelOrder: workspaces}); err == nil { + t.Fatal("expected the workspace-count cap to reject the patch") + } + + if _, err := NormalizeSidebarPreferencesPatch(SidebarPreferencesPatch{ + ChannelOrder: map[string][]string{"": {"chn_a"}}, + }); err == nil { + t.Fatal("expected an empty workspace id to be rejected") + } +} + +func TestNormalizeSidebarPreferencesPatch_CountsAfterDeduplication(t *testing.T) { + atLimit := make([]string, 0, MaxSidebarChannelOrderIDs+1) + for i := 0; i < MaxSidebarChannelOrderIDs; i++ { + atLimit = append(atLimit, "chn_"+strconv.Itoa(i)) + } + atLimit = append(atLimit, "chn_0") + out, err := NormalizeSidebarPreferencesPatch(SidebarPreferencesPatch{ + ChannelOrder: map[string][]string{"wsp_1": atLimit}, + }) + if err != nil { + t.Fatal(err) + } + if len(out.ChannelOrder["wsp_1"]) != MaxSidebarChannelOrderIDs { + t.Fatalf("unexpected length: %d", len(out.ChannelOrder["wsp_1"])) + } +} + +func TestFilterSidebarChannelOrder_KeepsCallerOrderAndDropsStrangers(t *testing.T) { + got := FilterSidebarChannelOrder( + []string{"chn_c", "chn_missing", "chn_a"}, + []string{"chn_a", "chn_b", "chn_c"}, + ) + want := []string{"chn_c", "chn_a"} + if len(got) != len(want) { + t.Fatalf("unexpected filtered order: %#v", got) + } + for i := range want { + if got[i] != want[i] { + t.Fatalf("unexpected filtered order: %#v", got) + } + } +} + +func TestFilterSidebarChannelOrder_EmptyWorkspaceDropsEverything(t *testing.T) { + if got := FilterSidebarChannelOrder([]string{"chn_a"}, nil); len(got) != 0 { + t.Fatalf("expected an empty result, got %#v", got) + } +} diff --git a/apps/api/internal/store/sqlite/migrations/0043_user_sidebar_channel_order.sql b/apps/api/internal/store/sqlite/migrations/0043_user_sidebar_channel_order.sql new file mode 100644 index 000000000..e09a99b8d --- /dev/null +++ b/apps/api/internal/store/sqlite/migrations/0043_user_sidebar_channel_order.sql @@ -0,0 +1,8 @@ +CREATE TABLE IF NOT EXISTS user_sidebar_channel_order ( + user_id TEXT NOT NULL, + workspace_id TEXT NOT NULL, + channel_ids TEXT NOT NULL DEFAULT '[]', + updated_at TEXT NOT NULL, + PRIMARY KEY (user_id, workspace_id), + FOREIGN KEY (workspace_id, user_id) REFERENCES workspace_members(workspace_id, user_id) ON DELETE CASCADE +); diff --git a/apps/api/internal/store/sqlite/sidebar.go b/apps/api/internal/store/sqlite/sidebar.go new file mode 100644 index 000000000..0c02b4a37 --- /dev/null +++ b/apps/api/internal/store/sqlite/sidebar.go @@ -0,0 +1,78 @@ +package sqlite + +import ( + "context" + "database/sql" + "encoding/json" + "errors" + + "github.com/openclaw/clickclack/apps/api/internal/store" + "github.com/openclaw/clickclack/apps/api/internal/store/sqlite/storedb" +) + +func (s *Store) GetSidebarPreferences(ctx context.Context, userID string) (*store.SidebarPreferences, error) { + rows, err := s.q.ListSidebarChannelOrder(ctx, userID) + if err != nil { + return nil, err + } + order := make(map[string][]string, len(rows)) + for _, row := range rows { + ids, err := decodeSidebarChannelOrder(row.ChannelIds) + if err != nil { + // A row we cannot read is a stale cache, not a broken account. The + // workspace falls back to the server's default ordering. + continue + } + // A row holding an empty list is a cleared order, which is not the same + // as never having saved one: the client needs the key back so it can + // drop its own cached order instead of restoring it. + if ids == nil { + ids = []string{} + } + order[row.WorkspaceID] = ids + } + if len(order) == 0 { + return nil, nil + } + return &store.SidebarPreferences{ChannelOrder: order}, nil +} + +func updateSidebarPreferences(ctx context.Context, q *storedb.Queries, userID string, patch store.SidebarPreferencesPatch, timestamp string) error { + for workspaceID, order := range patch.ChannelOrder { + if _, err := q.RequireMembership(ctx, storedb.RequireMembershipParams{WorkspaceID: workspaceID, UserID: userID}); err != nil { + if errors.Is(err, sql.ErrNoRows) { + return store.ErrNotWorkspaceMember + } + return err + } + channelIDs, err := q.ListWorkspaceChannelIDs(ctx, workspaceID) + if err != nil { + return err + } + // A cleared order is stored as a row holding an empty list rather than + // deleted, so a later read can tell "cleared" from "never saved". The + // row goes away only when the membership it hangs off does. + filtered := store.FilterSidebarChannelOrder(order, channelIDs) + encoded, err := json.Marshal(filtered) + if err != nil { + return err + } + if err := q.UpsertSidebarChannelOrder(ctx, storedb.UpsertSidebarChannelOrderParams{ + UserID: userID, + WorkspaceID: workspaceID, + ChannelIds: string(encoded), + UpdatedAt: timestamp, + }); err != nil { + return err + } + } + return nil +} + +func decodeSidebarChannelOrder(raw string) ([]string, error) { + var ids []string + if err := json.Unmarshal([]byte(raw), &ids); err != nil { + return nil, err + } + return ids, nil +} diff --git a/apps/api/internal/store/sqlite/sidebar_test.go b/apps/api/internal/store/sqlite/sidebar_test.go new file mode 100644 index 000000000..9e691b54e --- /dev/null +++ b/apps/api/internal/store/sqlite/sidebar_test.go @@ -0,0 +1,339 @@ +package sqlite + +import ( + "context" + "errors" + "strconv" + "testing" + + "github.com/openclaw/clickclack/apps/api/internal/store" +) + +func TestSidebarChannelOrderLifecycle(t *testing.T) { + t.Parallel() + ctx := context.Background() + st := newTestStore(t) + + user, err := st.CreateUser(ctx, store.CreateUserInput{ + DisplayName: "Sidebar User", + Email: "sidebar-sqlite@example.com", + }) + if err != nil { + t.Fatal(err) + } + + preferences, err := st.GetSidebarPreferences(ctx, user.ID) + if err != nil { + t.Fatal(err) + } + if preferences != nil { + t.Fatalf("expected missing preferences, got %#v", preferences) + } + + workspace, err := st.CreateWorkspace(ctx, store.CreateWorkspaceInput{Name: "Sidebar", Slug: "sidebar"}, user.ID) + if err != nil { + t.Fatal(err) + } + first, _, err := st.CreateChannel(ctx, store.CreateChannelInput{WorkspaceID: workspace.ID, Name: "aa", Kind: "public", UserID: user.ID}) + if err != nil { + t.Fatal(err) + } + second, _, err := st.CreateChannel(ctx, store.CreateChannelInput{WorkspaceID: workspace.ID, Name: "bb", Kind: "public", UserID: user.ID}) + if err != nil { + t.Fatal(err) + } + + account, err := st.UpdateCurrentUser(ctx, store.UpdateCurrentUserInput{ + UserID: user.ID, + SidebarPreferences: &store.SidebarPreferencesPatch{}, + }) + if err != nil { + t.Fatal(err) + } + if account.SidebarPreferences != nil { + t.Fatalf("empty patch created a row: %#v", account.SidebarPreferences) + } + + account, err = st.UpdateCurrentUser(ctx, store.UpdateCurrentUserInput{ + UserID: user.ID, + SidebarPreferences: &store.SidebarPreferencesPatch{ + ChannelOrder: map[string][]string{workspace.ID: {second.ID, first.ID}}, + }, + }) + if err != nil { + t.Fatal(err) + } + assertChannelOrder(t, account.SidebarPreferences, workspace.ID, second.ID, first.ID) + + roundTrip, err := st.GetSidebarPreferences(ctx, user.ID) + if err != nil { + t.Fatal(err) + } + assertChannelOrder(t, roundTrip, workspace.ID, second.ID, first.ID) + + // An id that is not a channel of this workspace is dropped rather than + // rejected, so a channel deleted since the client rendered cannot wedge a + // save. Duplicates keep their first position. + account, err = st.UpdateCurrentUser(ctx, store.UpdateCurrentUserInput{ + UserID: user.ID, + SidebarPreferences: &store.SidebarPreferencesPatch{ + ChannelOrder: map[string][]string{workspace.ID: {first.ID, "chn_gone", second.ID, first.ID}}, + }, + }) + if err != nil { + t.Fatal(err) + } + assertChannelOrder(t, account.SidebarPreferences, workspace.ID, first.ID, second.ID) + + // A second workspace is stored independently. + other, err := st.CreateWorkspace(ctx, store.CreateWorkspaceInput{Name: "Other Sidebar", Slug: "other-sidebar"}, user.ID) + if err != nil { + t.Fatal(err) + } + otherChannel, _, err := st.CreateChannel(ctx, store.CreateChannelInput{WorkspaceID: other.ID, Name: "cc", Kind: "public", UserID: user.ID}) + if err != nil { + t.Fatal(err) + } + account, err = st.UpdateCurrentUser(ctx, store.UpdateCurrentUserInput{ + UserID: user.ID, + SidebarPreferences: &store.SidebarPreferencesPatch{ + ChannelOrder: map[string][]string{other.ID: {otherChannel.ID}}, + }, + }) + if err != nil { + t.Fatal(err) + } + assertChannelOrder(t, account.SidebarPreferences, workspace.ID, first.ID, second.ID) + assertChannelOrder(t, account.SidebarPreferences, other.ID, otherChannel.ID) + + // A channel of the other workspace never enters this workspace's order. + account, err = st.UpdateCurrentUser(ctx, store.UpdateCurrentUserInput{ + UserID: user.ID, + SidebarPreferences: &store.SidebarPreferencesPatch{ + ChannelOrder: map[string][]string{workspace.ID: {otherChannel.ID, second.ID, first.ID}}, + }, + }) + if err != nil { + t.Fatal(err) + } + assertChannelOrder(t, account.SidebarPreferences, workspace.ID, second.ID, first.ID) + + // An empty list clears that workspace and leaves the rest alone. The + // cleared workspace keeps its key, holding an empty list, so a client can + // tell a clear from a workspace that never saved an order and drop its own + // cached copy instead of restoring it. + account, err = st.UpdateCurrentUser(ctx, store.UpdateCurrentUserInput{ + UserID: user.ID, + SidebarPreferences: &store.SidebarPreferencesPatch{ + ChannelOrder: map[string][]string{workspace.ID: {}}, + }, + }) + if err != nil { + t.Fatal(err) + } + if account.SidebarPreferences == nil { + t.Fatal("clearing one workspace dropped the whole snapshot") + } + assertClearedChannelOrder(t, account.SidebarPreferences, workspace.ID) + assertChannelOrder(t, account.SidebarPreferences, other.ID, otherChannel.ID) + + cleared, err := st.GetSidebarPreferences(ctx, user.ID) + if err != nil { + t.Fatal(err) + } + assertClearedChannelOrder(t, cleared, workspace.ID) + assertChannelOrder(t, cleared, other.ID, otherChannel.ID) +} + +func TestSidebarChannelOrderRequiresMembership(t *testing.T) { + t.Parallel() + ctx := context.Background() + st := newTestStore(t) + + owner, err := st.CreateUser(ctx, store.CreateUserInput{DisplayName: "Owner", Email: "sidebar-owner-sqlite@example.com"}) + if err != nil { + t.Fatal(err) + } + stranger, err := st.CreateUser(ctx, store.CreateUserInput{DisplayName: "Stranger", Email: "sidebar-stranger-sqlite@example.com"}) + if err != nil { + t.Fatal(err) + } + workspace, err := st.CreateWorkspace(ctx, store.CreateWorkspaceInput{Name: "Members Only", Slug: "members-only"}, owner.ID) + if err != nil { + t.Fatal(err) + } + channel, _, err := st.CreateChannel(ctx, store.CreateChannelInput{WorkspaceID: workspace.ID, Name: "aa", Kind: "public", UserID: owner.ID}) + if err != nil { + t.Fatal(err) + } + + _, err = st.UpdateCurrentUser(ctx, store.UpdateCurrentUserInput{ + UserID: stranger.ID, + SidebarPreferences: &store.SidebarPreferencesPatch{ + ChannelOrder: map[string][]string{workspace.ID: {channel.ID}}, + }, + }) + if !errors.Is(err, store.ErrNotWorkspaceMember) { + t.Fatalf("expected a membership error, got %v", err) + } + preferences, err := st.GetSidebarPreferences(ctx, stranger.ID) + if err != nil { + t.Fatal(err) + } + if preferences != nil { + t.Fatalf("a non-member wrote an order: %#v", preferences) + } +} + +func TestSidebarChannelOrderRejectsOversizedPatch(t *testing.T) { + t.Parallel() + ctx := context.Background() + st := newTestStore(t) + + user, err := st.CreateUser(ctx, store.CreateUserInput{DisplayName: "Cap User", Email: "sidebar-cap-sqlite@example.com"}) + if err != nil { + t.Fatal(err) + } + workspace, err := st.CreateWorkspace(ctx, store.CreateWorkspaceInput{Name: "Cap", Slug: "cap"}, user.ID) + if err != nil { + t.Fatal(err) + } + overLimit := make([]string, 0, store.MaxSidebarChannelOrderIDs+1) + for i := 0; i <= store.MaxSidebarChannelOrderIDs; i++ { + overLimit = append(overLimit, "chn_"+strconv.Itoa(i)) + } + if _, err := st.UpdateCurrentUser(ctx, store.UpdateCurrentUserInput{ + UserID: user.ID, + SidebarPreferences: &store.SidebarPreferencesPatch{ + ChannelOrder: map[string][]string{workspace.ID: overLimit}, + }, + }); err == nil { + t.Fatal("expected the per-workspace cap to reject the patch") + } +} + +func TestSidebarChannelOrderCascadesWithMembership(t *testing.T) { + t.Parallel() + ctx := context.Background() + st := newTestStore(t) + + user, err := st.CreateUser(ctx, store.CreateUserInput{DisplayName: "Cascade User", Email: "sidebar-cascade-sqlite@example.com"}) + if err != nil { + t.Fatal(err) + } + workspace, err := st.CreateWorkspace(ctx, store.CreateWorkspaceInput{Name: "Cascade", Slug: "cascade"}, user.ID) + if err != nil { + t.Fatal(err) + } + channel, _, err := st.CreateChannel(ctx, store.CreateChannelInput{WorkspaceID: workspace.ID, Name: "aa", Kind: "public", UserID: user.ID}) + if err != nil { + t.Fatal(err) + } + if _, err := st.UpdateCurrentUser(ctx, store.UpdateCurrentUserInput{ + UserID: user.ID, + SidebarPreferences: &store.SidebarPreferencesPatch{ + ChannelOrder: map[string][]string{workspace.ID: {channel.ID}}, + }, + }); err != nil { + t.Fatal(err) + } + if _, err := st.db.ExecContext(ctx, `DELETE FROM workspace_members WHERE workspace_id = ? AND user_id = ?`, workspace.ID, user.ID); err != nil { + t.Fatal(err) + } + preferences, err := st.GetSidebarPreferences(ctx, user.ID) + if err != nil { + t.Fatal(err) + } + if preferences != nil { + t.Fatalf("membership removal did not cascade the saved order: %#v", preferences) + } +} + +func TestSidebarChannelOrderIndependentOfAppearance(t *testing.T) { + t.Parallel() + ctx := context.Background() + st := newTestStore(t) + + user, err := st.CreateUser(ctx, store.CreateUserInput{DisplayName: "Both User", Email: "sidebar-both-sqlite@example.com"}) + if err != nil { + t.Fatal(err) + } + workspace, err := st.CreateWorkspace(ctx, store.CreateWorkspaceInput{Name: "Both", Slug: "both"}, user.ID) + if err != nil { + t.Fatal(err) + } + channel, _, err := st.CreateChannel(ctx, store.CreateChannelInput{WorkspaceID: workspace.ID, Name: "aa", Kind: "public", UserID: user.ID}) + if err != nil { + t.Fatal(err) + } + + dark := "dark" + if _, err := st.UpdateCurrentUser(ctx, store.UpdateCurrentUserInput{ + UserID: user.ID, + AppearancePreferences: &store.AppearancePreferencesPatch{ColorMode: &dark}, + }); err != nil { + t.Fatal(err) + } + account, err := st.UpdateCurrentUser(ctx, store.UpdateCurrentUserInput{ + UserID: user.ID, + SidebarPreferences: &store.SidebarPreferencesPatch{ + ChannelOrder: map[string][]string{workspace.ID: {channel.ID}}, + }, + }) + if err != nil { + t.Fatal(err) + } + if account.AppearancePreferences == nil || account.AppearancePreferences.ColorMode != "dark" { + t.Fatalf("a sidebar patch changed appearance: %#v", account.AppearancePreferences) + } + assertChannelOrder(t, account.SidebarPreferences, workspace.ID, channel.ID) + + light := "light" + account, err = st.UpdateCurrentUser(ctx, store.UpdateCurrentUserInput{ + UserID: user.ID, + AppearancePreferences: &store.AppearancePreferencesPatch{ColorMode: &light}, + }) + if err != nil { + t.Fatal(err) + } + if account.AppearancePreferences == nil || account.AppearancePreferences.ColorMode != "light" { + t.Fatalf("unexpected appearance: %#v", account.AppearancePreferences) + } + assertChannelOrder(t, account.SidebarPreferences, workspace.ID, channel.ID) +} + +// assertClearedChannelOrder pins the difference between a workspace whose order +// was cleared and one that never saved one: the cleared workspace keeps its key +// and holds an empty list. +func assertClearedChannelOrder(t *testing.T, preferences *store.SidebarPreferences, workspaceID string) { + t.Helper() + if preferences == nil { + t.Fatalf("expected a sidebar snapshot for %s", workspaceID) + } + got, ok := preferences.ChannelOrder[workspaceID] + if !ok { + t.Fatalf("cleared workspace %s lost its key: %#v", workspaceID, preferences.ChannelOrder) + } + if got == nil { + t.Fatalf("cleared workspace %s reported a null order", workspaceID) + } + if len(got) != 0 { + t.Fatalf("cleared workspace %s kept an order: %#v", workspaceID, got) + } +} + +func assertChannelOrder(t *testing.T, preferences *store.SidebarPreferences, workspaceID string, want ...string) { + t.Helper() + if preferences == nil { + t.Fatalf("expected a sidebar snapshot for %s", workspaceID) + } + got := preferences.ChannelOrder[workspaceID] + if len(got) != len(want) { + t.Fatalf("unexpected order for %s: %#v", workspaceID, got) + } + for i := range want { + if got[i] != want[i] { + t.Fatalf("unexpected order for %s: %#v", workspaceID, got) + } + } +} diff --git a/apps/api/internal/store/sqlite/sqlc/queries.sql b/apps/api/internal/store/sqlite/sqlc/queries.sql index 5f3131b59..612908d6a 100644 --- a/apps/api/internal/store/sqlite/sqlc/queries.sql +++ b/apps/api/internal/store/sqlite/sqlc/queries.sql @@ -273,6 +273,25 @@ UPDATE user_appearance_preferences SET density = sqlc.arg(density) WHERE user_id = sqlc.arg(user_id); +-- name: ListSidebarChannelOrder :many +SELECT workspace_id, channel_ids +FROM user_sidebar_channel_order +WHERE user_id = sqlc.arg(user_id) +ORDER BY workspace_id; + +-- name: UpsertSidebarChannelOrder :exec +INSERT INTO user_sidebar_channel_order (user_id, workspace_id, channel_ids, updated_at) +VALUES (sqlc.arg(user_id), sqlc.arg(workspace_id), sqlc.arg(channel_ids), sqlc.arg(updated_at)) +ON CONFLICT(user_id, workspace_id) DO UPDATE SET + channel_ids = excluded.channel_ids, + updated_at = excluded.updated_at; + +-- name: ListWorkspaceChannelIDs :many +SELECT id +FROM channels +WHERE workspace_id = sqlc.arg(workspace_id) +ORDER BY id; + -- name: UpsertChannelNotificationSettings :exec INSERT INTO channel_notification_settings (channel_id, user_id, preference, created_at, updated_at) VALUES (sqlc.arg(channel_id), sqlc.arg(user_id), sqlc.arg(preference), sqlc.arg(created_at), sqlc.arg(updated_at)) diff --git a/apps/api/internal/store/sqlite/sqlc/schema.sql b/apps/api/internal/store/sqlite/sqlc/schema.sql index f517a403d..84f519c8c 100644 --- a/apps/api/internal/store/sqlite/sqlc/schema.sql +++ b/apps/api/internal/store/sqlite/sqlc/schema.sql @@ -354,6 +354,15 @@ CREATE TABLE user_appearance_preferences ( density TEXT NOT NULL DEFAULT '' ); +CREATE TABLE user_sidebar_channel_order ( + user_id TEXT NOT NULL, + workspace_id TEXT NOT NULL, + channel_ids TEXT NOT NULL DEFAULT '[]', + updated_at TEXT NOT NULL, + PRIMARY KEY (user_id, workspace_id), + FOREIGN KEY (workspace_id, user_id) REFERENCES workspace_members(workspace_id, user_id) ON DELETE CASCADE +); + CREATE TABLE bot_tokens ( id TEXT PRIMARY KEY, token_hash TEXT NOT NULL UNIQUE, diff --git a/apps/api/internal/store/sqlite/sqlite.go b/apps/api/internal/store/sqlite/sqlite.go index cefff3167..6d78e5d9b 100644 --- a/apps/api/internal/store/sqlite/sqlite.go +++ b/apps/api/internal/store/sqlite/sqlite.go @@ -297,6 +297,13 @@ func (s *Store) UpdateCurrentUser(ctx context.Context, input store.UpdateCurrent return store.CurrentUserState{}, err } } + var sidebarPatch store.SidebarPreferencesPatch + if input.SidebarPreferences != nil { + sidebarPatch, err = store.NormalizeSidebarPreferencesPatch(*input.SidebarPreferences) + if err != nil { + return store.CurrentUserState{}, err + } + } tx, err := s.db.BeginTx(ctx, nil) if err != nil { return store.CurrentUserState{}, err @@ -367,6 +374,11 @@ func (s *Store) UpdateCurrentUser(ctx context.Context, input store.UpdateCurrent return store.CurrentUserState{}, err } } + if input.SidebarPreferences != nil && !store.SidebarPreferencesPatchEmpty(sidebarPatch) { + if err := updateSidebarPreferences(ctx, qtx, input.UserID, sidebarPatch, now()); err != nil { + return store.CurrentUserState{}, err + } + } if err := tx.Commit(); err != nil { return store.CurrentUserState{}, err } @@ -378,7 +390,11 @@ func (s *Store) UpdateCurrentUser(ctx context.Context, input store.UpdateCurrent if err != nil { return store.CurrentUserState{}, err } - return store.CurrentUserState{User: user, AppearancePreferences: preferences}, nil + sidebar, err := s.GetSidebarPreferences(ctx, input.UserID) + if err != nil { + return store.CurrentUserState{}, err + } + return store.CurrentUserState{User: user, AppearancePreferences: preferences, SidebarPreferences: sidebar}, nil } func profileUpdateError(err error) error { diff --git a/apps/api/internal/store/sqlite/storedb/models.go b/apps/api/internal/store/sqlite/storedb/models.go index 92cf3f499..8d8e7def6 100644 --- a/apps/api/internal/store/sqlite/storedb/models.go +++ b/apps/api/internal/store/sqlite/storedb/models.go @@ -425,6 +425,13 @@ type UserPassword struct { UpdatedAt string `json:"updated_at"` } +type UserSidebarChannelOrder struct { + UserID string `json:"user_id"` + WorkspaceID string `json:"workspace_id"` + ChannelIds string `json:"channel_ids"` + UpdatedAt string `json:"updated_at"` +} + type Workspace struct { ID string `json:"id"` Name string `json:"name"` diff --git a/apps/api/internal/store/sqlite/storedb/queries.sql.go b/apps/api/internal/store/sqlite/storedb/queries.sql.go index ef6923470..4fbd883bc 100644 --- a/apps/api/internal/store/sqlite/storedb/queries.sql.go +++ b/apps/api/internal/store/sqlite/storedb/queries.sql.go @@ -4133,6 +4133,41 @@ func (q *Queries) ListReactionsForMessages(ctx context.Context, arg ListReaction return items, nil } +const listSidebarChannelOrder = `-- name: ListSidebarChannelOrder :many +SELECT workspace_id, channel_ids +FROM user_sidebar_channel_order +WHERE user_id = ?1 +ORDER BY workspace_id +` + +type ListSidebarChannelOrderRow struct { + WorkspaceID string `json:"workspace_id"` + ChannelIds string `json:"channel_ids"` +} + +func (q *Queries) ListSidebarChannelOrder(ctx context.Context, userID string) ([]ListSidebarChannelOrderRow, error) { + rows, err := q.db.QueryContext(ctx, listSidebarChannelOrder, userID) + if err != nil { + return nil, err + } + defer rows.Close() + var items []ListSidebarChannelOrderRow + for rows.Next() { + var i ListSidebarChannelOrderRow + if err := rows.Scan(&i.WorkspaceID, &i.ChannelIds); 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 listThreadReplyPage = `-- name: ListThreadReplyPage :many WITH descending_page AS ( SELECT candidate.id, candidate.workspace_id, candidate.channel_id, candidate.direct_conversation_id, candidate.author_id, candidate.parent_message_id, candidate.thread_root_id, candidate.topic_id, candidate.channel_seq, candidate.thread_seq, candidate.body, candidate.body_format, candidate.created_at, candidate.edited_at, candidate.deleted_at, candidate.quoted_message_id, candidate.quoted_body_snapshot, candidate.quoted_author_id, candidate.client_nonce, candidate.route_id, candidate.kind, candidate.turn_id FROM messages candidate @@ -4669,6 +4704,36 @@ func (q *Queries) ListWorkspaceBots(ctx context.Context, workspaceID string) ([] return items, nil } +const listWorkspaceChannelIDs = `-- name: ListWorkspaceChannelIDs :many +SELECT id +FROM channels +WHERE workspace_id = ?1 +ORDER BY id +` + +func (q *Queries) ListWorkspaceChannelIDs(ctx context.Context, workspaceID string) ([]string, error) { + rows, err := q.db.QueryContext(ctx, listWorkspaceChannelIDs, workspaceID) + 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 listWorkspaceMemberPage = `-- name: ListWorkspaceMemberPage :many SELECT u.id, u.kind, COALESCE(u.owner_user_id, '') AS owner_user_id, u.display_name, u.handle, u.avatar_url, u.created_at, wm.role, wm.created_at AS joined_at, @@ -6266,6 +6331,31 @@ func (q *Queries) UpsertNotificationSettings(ctx context.Context, arg UpsertNoti return err } +const upsertSidebarChannelOrder = `-- name: UpsertSidebarChannelOrder :exec +INSERT INTO user_sidebar_channel_order (user_id, workspace_id, channel_ids, updated_at) +VALUES (?1, ?2, ?3, ?4) +ON CONFLICT(user_id, workspace_id) DO UPDATE SET + channel_ids = excluded.channel_ids, + updated_at = excluded.updated_at +` + +type UpsertSidebarChannelOrderParams struct { + UserID string `json:"user_id"` + WorkspaceID string `json:"workspace_id"` + ChannelIds string `json:"channel_ids"` + UpdatedAt string `json:"updated_at"` +} + +func (q *Queries) UpsertSidebarChannelOrder(ctx context.Context, arg UpsertSidebarChannelOrderParams) error { + _, err := q.db.ExecContext(ctx, upsertSidebarChannelOrder, + arg.UserID, + arg.WorkspaceID, + arg.ChannelIds, + arg.UpdatedAt, + ) + return err +} + const upsertUserPassword = `-- name: UpsertUserPassword :exec INSERT INTO user_passwords (user_id, password_hash, updated_at) VALUES (?1, ?2, ?3) diff --git a/apps/api/internal/store/types.go b/apps/api/internal/store/types.go index 982b618fc..99642ad15 100644 --- a/apps/api/internal/store/types.go +++ b/apps/api/internal/store/types.go @@ -142,6 +142,10 @@ func NormalizeMessageKind(kind string) (string, error) { // owner or moderator. var ErrNotWorkspaceManager = errors.New("workspace manager permission required") +// ErrNotWorkspaceMember is returned when a workspace operation requires any +// membership and the caller has none. +var ErrNotWorkspaceMember = errors.New("workspace membership required") + // ErrWorkspaceOwnerRequired is returned when a workspace operation requires the // current owner, not just a moderator. var ErrWorkspaceOwnerRequired = errors.New("workspace owner permission required") @@ -235,6 +239,18 @@ type AppearancePreferencesPatch struct { Density *string `json:"density,omitempty"` } +// SidebarPreferences is the caller's complete roaming sidebar snapshot. +// Workspaces with no saved channel order are absent from the map. +type SidebarPreferences struct { + ChannelOrder map[string][]string `json:"channel_order,omitempty"` +} + +// SidebarPreferencesPatch replaces the channel order of every workspace it +// lists and leaves the rest untouched. An empty list clears that workspace. +type SidebarPreferencesPatch struct { + ChannelOrder map[string][]string `json:"channel_order,omitempty"` +} + type ChannelNotificationInput struct { ChannelID string UserID string @@ -836,11 +852,13 @@ type UpdateCurrentUserInput struct { AvatarURL *string NotificationSettings *NotificationSettings AppearancePreferences *AppearancePreferencesPatch + SidebarPreferences *SidebarPreferencesPatch } type CurrentUserState struct { User User AppearancePreferences *AppearancePreferences + SidebarPreferences *SidebarPreferences } type CreateWorkspaceInput struct { @@ -1247,6 +1265,7 @@ type Store interface { UpdateUserProfile(ctx context.Context, input UpdateUserProfileInput) (User, error) UpdateCurrentUser(ctx context.Context, input UpdateCurrentUserInput) (CurrentUserState, error) GetAppearancePreferences(ctx context.Context, userID string) (*AppearancePreferences, error) + GetSidebarPreferences(ctx context.Context, userID string) (*SidebarPreferences, error) ListPushNotificationRecipients(ctx context.Context, messageID string, mentionedUserIDs []string) ([]PushNotificationRecipient, error) UpsertChannelNotificationSettings(ctx context.Context, input ChannelNotificationInput) error GetChannelNotificationPreference(ctx context.Context, channelID, userID string) (string, error) diff --git a/apps/api/internal/webassets/dist/200.html b/apps/api/internal/webassets/dist/200.html index 7a1bbc846..1625f8627 100644 --- a/apps/api/internal/webassets/dist/200.html +++ b/apps/api/internal/webassets/dist/200.html @@ -103,7 +103,7 @@ - + @@ -125,7 +125,7 @@ Promise.all([ import("/_app/immutable/entry/start.By1vhz9u.js"), - import("/_app/immutable/entry/app.DxtUHBGv.js") + import("/_app/immutable/entry/app.Cn7RWqrK.js") ]).then(([kit, app]) => { kit.start(app, element); }); diff --git a/apps/api/internal/webassets/dist/_app/immutable/chunks/DNUfuHVs.js b/apps/api/internal/webassets/dist/_app/immutable/chunks/DNUfuHVs.js new file mode 100644 index 000000000..68104e4fe --- /dev/null +++ b/apps/api/internal/webassets/dist/_app/immutable/chunks/DNUfuHVs.js @@ -0,0 +1,4 @@ +const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./DxhId6dF.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"./D5itlxY6.js";import{c as de,n as fe,t as pe}from"./DAzn6KWz.js";import{t as me}from"./uBIymjUX.js";import"./xihTtKlq.js";import"./DD-5HdQf.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"./Cbo1iWSZ.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"./BTDeUFdm.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"./CCzTQXXV.js";import{i as ft,n as pt,r as mt,t as ht}from"./W96STwh2.js";import{n as gt,t as _t}from"./DlGnnCJo.js";import{n as vt,r as yt,t as bt}from"./DaoRWw_m.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-ChjPCl7B.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(`./DxhId6dF.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=`clickclack:sidebar-channel-order:v1:`,Gr=new Map,Kr=new Map,qr=new Set,Jr=new WeakMap;function Yr(e,t){return`${t}:${e}`}function Xr(e,t){return`${Wr}${t}:${e}`}function Zr(e,t){if(!e||!t)return null;let n=`${Wr}${t}:`;return e.startsWith(n)&&e.slice(n.length)||null}function Qr(e){if(!e||e.length>1e6)return[];try{let t=JSON.parse(e);return Array.isArray(t)&&t.length<=1e4&&t.every(e=>typeof e==`string`&&e.length<=128)?[...new Set(t)]:[]}catch{return[]}}function $r(e,t){if(!e||!t)return[];try{return Qr(window.localStorage.getItem(Xr(e,t)))}catch{return[]}}function ei(e,t,n){if(e&&t)try{let r=Xr(e,t);if(n.length===0){window.localStorage.removeItem(r);return}let i=JSON.stringify(n);if(i.length>1e6){window.localStorage.removeItem(r);return}window.localStorage.setItem(r,i)}catch{}}function ti(e){let t=new Set;for(let n of e)if(!(typeof n!=`string`||!n||n.length>128)){if(t.size>=1e4)break;t.add(n)}return[...t]}function ni(e,t){if(e===void 0)return[...t];let n=ti(e);if(n.length===0)return[];let r=new Set(n),i=[...n];for(let e of t){if(i.length>=1e4)break;typeof e!=`string`||!e||e.length>128||r.has(e)||(r.add(e),i.push(e))}return i}function ri(e,t){if(!t)return;let n=e?.sidebar_preferences?.channel_order?.[t];return Array.isArray(n)?n:void 0}function ii(e,t){e&&t&&qr.add(Yr(e,t))}function ai(e,t){return Jr.get(e)?.has(t)===!0}function oi(e,t){let n=Jr.get(e);n?n.add(t):Jr.set(e,new Set([t]))}function si(e,t){let n=e?.id||``;if(!e||!t||!n)return[];let r=$r(t,n);if(qr.has(Yr(t,n)))return r;let i=ri(e,t);if(i===void 0)return ni(void 0,r);if(ai(e,t))return r;oi(e,t);let a=ni(i,r);return ei(t,n,a),a}function ci(e,t,n,r){e&&t&&(ii(e,t),ei(e,t,n),ui(e,t,n,r))}function li(e,t){return{sidebar_preferences:{channel_order:{[e]:t.slice(0,500)}}}}function ui(e,t,n,r){if(!e||!t)return;let i=Yr(e,t),a=Gr.get(i);a&&clearTimeout(a.timer);let o=li(e,n),s=setTimeout(()=>{Gr.delete(i),fi(i,r,o,!1)},400);Gr.set(i,{timer:s,body:o})}function di(e){if(Gr.size===0)return;let t=[...Gr.entries()];Gr.clear();for(let[n,r]of t)clearTimeout(r.timer),fi(n,e,r.body,!0)}function fi(e,t,n,r){let i=Kr.get(e);if(i){i.queued={body:n,keepalive:r};return}pi(e,t,n,r)}function pi(e,t,n,r){let i={};Kr.set(e,i),mi(t,n,r).then(()=>{Kr.delete(e);let n=i.queued;n&&pi(e,t,n.body,n.keepalive)})}async function mi(e,t,n){try{await e(`/api/me`,{method:`PATCH`,body:JSON.stringify(t),...n?{keepalive:!0}:{}})}catch(e){console.warn(`channel order save failed`,e)}}var hi=l(``),gi=l(` `,1),_i=l(``),vi=l(` `),yi=l(`
#
`),bi=l(`
`),xi=l(``),Si=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),Ci=l(`
`);function wi(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=yi();let b;var C=I(y),T=e=>{var r=gi(),s=ce(r),c=k(s,2),l=e=>{var r=hi(),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=_i();p(e,t)};P(ee,e=>{i().external_managed&&e(te)});var L=k(ee,2),R=e=>{var t=vi(),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=bi();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=Ci();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=Si(),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=xi();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 Ti=l(` `),Ei=l(``),Di=l(``),Oi=l(`
`),ki=l(``),Ai=l(`
`),ji=l(`
`);function Mi(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=ji();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=Oi();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=Ti(),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=Ei();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=Di(),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=ki();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 Ni=l(``),Pi=l(`Connecting…`),Fi=l(`
`),Ii=l(` `),Li=l(``),Ri=l(``),zi=l(``);function Bi(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=A(B([]));function y(e){M(g,e,!0),r.workspaceID&&r.currentUser?.id&&ci(r.workspaceID,r.currentUser.id,e,G)}C(()=>{let e=()=>di(G),t=()=>{document.visibilityState===`hidden`&&e()};return window.addEventListener(`pagehide`,e),document.addEventListener(`visibilitychange`,t),()=>{window.removeEventListener(`pagehide`,e),document.removeEventListener(`visibilitychange`,t)}});function b(e){if(!r.workspaceID||!r.currentUser?.id)return;let t=Zr(e.key,r.currentUser.id);t&&(ii(t,r.currentUser.id),t===r.workspaceID&&M(g,Qr(e.newValue),!0))}let x=U(()=>{let e=new Map(r.channels.map(e=>[e.id,e]));return[...u(g).flatMap(t=>{let n=e.get(t);return n?(e.delete(t),[n]):[]}),...e.values()]});C(()=>{M(g,si(r.currentUser,r.workspaceID),!0)});function T(e){return e.button===0&&!e.metaKey&&!e.ctrlKey&&!e.shiftKey&&!e.altKey}var O=zi();v(`storage`,E,b);var j=I(O),F=e=>{var i=Fi(),a=I(i),o=I(a),s=e=>{var t=Ni();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=Pi();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(j,e=>{i()&&e(F)});var ee=k(j,2),L=I(ee);wi(L,{get workspaceID(){return r.workspaceID},get expanded(){return u(c).channels},get channels(){return u(x)},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:y});var R=k(L,2);{let e=U(()=>r.currentUser?.id);Mi(R,{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 ne=k(R,2);let re;var ie=I(ne),ae=D(ie),oe=k(ie,2),V=I(oe);f(V,17,()=>r.recentPeople,e=>e.id,(e,i)=>{let a=U(()=>st(r.directConversations,u(i).id,r.currentUser?.id));var o=Ii();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(!T(e))return;e.preventDefault(),r.onSelectDirect(u(a).id)}else e.preventDefault(),r.onOpenProfile(u(i))}),p(e,o)});var se=k(V,2),ce=e=>{var t=Li();p(e,t)};P(se,e=>{r.recentPeople.length===0&&e(ce)}),t(oe),t(ne),t(ee);var le=k(ee,2),H=e=>{var i=Ri(),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(le,e=>{r.currentUser&&e(H)}),t(O),N(()=>{re=w(ne,1,`nav-section`,null,re,{collapsed:!u(c).people}),z(ae,`aria-expanded`,u(c).people),z(oe,`hidden`,!u(c).people)}),n(`click`,ae,()=>h(`people`)),p(e,O),_()}W([`click`,`contextmenu`]);var Vi=l(`
Loading...
`),Hi=l(`
`),Ui=l(`
`),Wi=l(`

No pinned messages

Pin important messages to keep them easily accessible.

`),Gi=l(`
`),Ki=l(`
`),qi=l(`
`),Ji=l(` `,1),Yi=l(`

Pinned Messages

`);function Xi(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=Yi(),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=Vi();p(e,t)},R=e=>{var t=Hi(),n=D(t,!0);N(()=>d(n,s())),p(e,t)},ne=e=>{var a=Ji(),o=ce(a),s=e=>{var t=Ui(),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=Wi();p(e,t)},b=e=>{var a=qi();f(a,21,()=>r.messages,e=>e.id,(e,a)=>{let o=U(()=>c().find(e=>e.id===u(a).topic_id));var s=Ki(),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=Gi();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 Zi=l(` `,1),Qi=l(`
`),$i=l(`
We couldn’t search messages

`),ea=l(`
No messages found

Try another word or phrase.

`),ta=l(`deleted bot`),na=l(` `),ra=l(` `),ia=l(` `),aa=l(` Reply in thread`),oa=l(` `),sa=l(`
  • `),ca=l(``),la=l(``),ua=l(``),da=l(`
      `,1),fa=l(``);function pa(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=Zi(),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=Qi();p(e,t)},B=e=>{var n=$i(),i=k(I(n),4),a=D(i,!0);t(n),N(()=>d(a,r.session.error)),p(e,n)},ae=e=>{var t=ea();p(e,t)},oe=e=>{var i=da(),a=ce(i);f(a,21,()=>r.session.results,e=>e.id,(e,i)=>{let a=U(()=>r.contextFor(u(i)));var o=sa(),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=ta();p(e,t)},T=U(()=>dt(u(i).author)),E=e=>{var t=na(),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=ra(),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=ia(),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=aa();p(e,t)},re=e=>{var n=oa(),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=ca(),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=la(),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=ua();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 ma=l(``),ha=l(`
      `),ga=l(`

      `,1),_a=l(`
      `),va=l(``);function ya(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=va(),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=ma(),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=ha(),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=ga(),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=_a(),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 ba=l(`

      `),xa=l(``),Sa=l(`
      `);function Ca(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=Sa(),m=I(f),h=I(m);a(h,()=>n.children),t(m);var g=k(m,2),y=I(g),b=e=>{var t=ba();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=xa();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 wa=l(`

      Browser notifications are not supported on this device.

      `),Ta=l(`

      Browser notifications are blocked by this browser.

      `),Ea=l(`

      `),Da=l(`

      Show alerts when ClickClack is in the background.

      `);function Oa(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=Da(),v=I(g),y=I(v),b=D(y,!0),x=k(y,4),T=e=>{var t=wa();p(e,t)},E=e=>{var t=Ta();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=Ea();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 ka=l(``),$=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 Aa(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,``)}Ca(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=$(),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=ka();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),Oa(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 ja=l(`

      Desktop

      Mobile push

      Send push notifications to your phone via Pushover.

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

      `);function Ma(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)}),Ca(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=ja(),c=k(I(s),2);Oa(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 Na=l(`

      Loading…

      `),Pa=l(`

      `),Fa=l(`
      You don't own any bots yet. Open a workspace's Bots & agents page to mint one.
      `),Ia=l(``),La=l(`
    • `),Ra=l(`

        `),za=l(`
        `),Ba=l(`

        Account

        My bots

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

        `,1);function Va(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=Ba(),b=k(ce(y),2),x=e=>{var t=Na();p(e,t)},S=e=>{var t=Pa(),n=D(t,!0);N(()=>d(n,u(s))),p(e,t)},C=e=>{var t=Fa();p(e,t)},w=e=>{var r=za();f(r,21,()=>u(v),e=>e.workspace.id,(e,r)=>{var i=Ra(),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=La(),a=I(i),o=I(a),s=e=>{var t=Ia();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 Ha(e,t){return t.includes(`password`)&&e.password_enrolled===!0}function Ua(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 Wa=l(`

        `),Ga=l(``),Ka=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 qa(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=Ua(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=Ka(),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=Wa();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=Ga();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 Ja=l(``),Ya=l(``),Xa=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=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=Xa(),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=Ja();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=Ya();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=Ja();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=Ja();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 Qa=l(` `,1),$a=l(` `,1),eo=l(` `,1),to=l(` `,1),no=l(`
      • `),ro=l(`
      • `),io=l(`

          `),ao=l(`

          Loading...

          `),oo=l(`

          `),so=l(`

          `),co=l(`

          Account

          Profile settings

          How you appear across ClickClack.

          Sign out

          End this session on this device.

          `,1),lo=l(`

          Account

          Notifications

          Decide when and how ClickClack should reach you.

          `,1),uo=l(``);function fo(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(()=>Ha(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=uo();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=no(),o=I(a);let s;var c=I(o),l=e=>{var t=Qa(),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=$a(),n=k(ce(t),2),r=D(n,!0);N(()=>d(r,u(i).label)),p(e,t)},m=e=>{var t=eo(),n=k(ce(t),2),r=D(n,!0);N(()=>d(r,u(i).label)),p(e,t)},g=e=>{var t=to(),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=io(),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=ro(),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=ao();p(e,t)},se=e=>{var t=oo(),n=D(t,!0);N(()=>d(n,u(b))),p(e,t)},le=e=>{var i=co(),a=k(ce(i),2);Aa(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=>{qa(e,{})};P(o,e=>{u(g)&&e(s)});var f=k(o,2),h=I(f),_=k(I(h),4),v=e=>{var t=so(),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=>{Za(e,{get user(){return r.user}})},ue=e=>{var t=lo();Ma(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=>{Va(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 po=l(`
          No thread open Hover any message and tap the bubble to keep side conversations tidy.
          `);function mo(e){var t=po();p(e,t)}var ho=l(``),go=l(`

          `,1),_o=l(``),vo=l(``),yo=l(``),bo=l(``),xo=l(``),So=l(``),Co=l(``),wo=l(`
          `),To=l(`Connecting…`),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,`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=go(),n=k(ce(t),2),i=D(n,!0),a=k(n,2),o=e=>{var t=ho();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=_o();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=wo(),u=I(o),d=e=>{var r=xo(),o=I(r),c=e=>{var t=vo();p(e,t)},l=e=>{var t=yo();p(e,t)},u=e=>{var t=bo();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=So();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=Co();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=To();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 Oo=l(`

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

          `,1),Po=l(`

          ClickClack

          `),Fo=l(``),Io=l(``),Lo=l(``),Ro=l(``),zo=l(`

          `);function Bo(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=zo(),y=I(g),b=I(y),x=e=>{var t=Oo(),n=D(t,!0);N(e=>d(n,e),[()=>`@${rt(r.selectedDirect,r.currentUserID)}`]),p(e,t)},C=e=>{var a=No(),o=ce(a),l=D(o,!0),u=k(o,2),f=e=>{var r=Mo(),a=I(r),o=e=>{var t=ko();p(e,t)},l=e=>{var t=Ao();p(e,t)},u=e=>{var t=jo();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=Po();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=Fo();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=Io();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=Lo();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=Ro();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 Vo(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 Ho(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=Vo(a.userId,t,n);e&&i.push(e)}return i}async function Uo(e){return(await G(`/api/workspaces/${e}/bot-commands`)).bot_commands??[]}function Wo(e){let t=e.trim().toLowerCase();return t?t.startsWith(`/`)?t:`/${t}`:``}function Go(e){let t=/^(\/\S+)\s*([\s\S]*)$/.exec(e);return t?{command:Wo(t[1]),text:t[2].trim()}:null}function Ko(e,t){return e.find(e=>!e.revoked_at&&Wo(e.command)===t)}async function qo(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 Jo=e({default:()=>ls}),Yo=l(``),Xo=l(``),Zo=l(``),Qo=l(`
          Showing topic
          `),$o=l(`

          `),es=l(`
          `),ts=l(``),ns=l(``),rs=l(``),is=l(` `,1),as=l(`

          Loading thread…

          `),os=l(`
          Thread
          `,1),ss=l(``),cs=l(`
          `,1);function ls(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(Eo),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)}:${$()}`,No),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),so(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 hi(e=u(Y),t=``){let n=vi(e);if(!n)return`/app`;let r=`/app/${encodeURIComponent(n)}`,i=yi(t);return i?`${r}/${encodeURIComponent(i)}`:r}async function gi(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`);oo({id:t.message.id,route_id:t.message.route_id});let n=vi(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 _i(e){let t=u(q).find(t=>t.id===e)?.route_id||u(J).find(t=>t.id===e)?.route_id;return t?hi(u(Y),t):!u(Y)||!e?`/app`:`/app/${encodeURIComponent(u(Y))}/${encodeURIComponent(e)}`}function vi(e=u(Y)){return e?u(Re).find(t=>t.id===e||t.route_id===e)?.route_id||e:``}function yi(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 bi(e=u(Y),t=``,n=!1){let r=hi(e,t);window.location.pathname!==r&&await fe(r,{replaceState:n,noScroll:!0,keepFocus:!0})}function xi(e,t){mi(e,t)!==wr&&ji(e,t)}function Si(){Tr++,wr=mi(vi(),yi($())),bi(u(Y),$())}function Ci(){u(un)&&hs(),Q.close(),M(ut,null),M(dt,!1),M(fr,`message`),M(or,!1)}function wi(e=u(Y)){return Oi(e)||u(q).find(e=>e.name.toLowerCase()===`guest`)?.id||u(q)[0]?.id||u(J)[0]?.id||``}function Ti(e=u(Y)){return u(Re).find(t=>t.id===e||t.route_id===e)}function Ei(e=u(Y)){let t=Ti(e),n=t?.route_id||t?.id||e;return n?`clickclack:last-channel:v1:${n}`:``}function Di(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 Oi(e=u(Y)){let t=Ei(e);if(!t)return``;let n;try{let e=window.localStorage.getItem(t);if(!e)return``;n=Di(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=Ei(e);if(r)try{window.localStorage.setItem(r,JSON.stringify({id:n.id,routeID:n.route_id}))}catch{}}function Ai(e){In===e&&(In=``,js())}async function ji(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 Ni(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){ua(``,{messages:[],oldest_seq:0,newest_seq:0,has_older:!1,has_newer:!1},`replace`);return}let a=u(Y)!==i.id;if(a&&(io(),Le.clear(),Vn.clear(),Fi(),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(),va(),M(nr,!0),In=i.id),(a||u(q).length===0)&&await Hi(!1,!1),n!==Tr||((a||u(J).length===0)&&await Cs(),a&&(await Promise.all([Gi(),qi(i.id),Ji(i.id),Ui(i.id)]),Ki(i.id)),n!==Tr))return;if(r){let e=await Mi(r,n);if(n!==Tr)return;if(!e){Ci(),await bi(i.id,wi(),!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,``),ki(i.id,e),Ci(),t){ha(e),Ai(i.id);return}if(Yr(e),await Promise.all([ia(),tc()]),n!==Tr)return;Ai(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,``),Ci(),t){ha(e),Ai(i.id);return}if(Yr(e),await ia(),n!==Tr)return;Ai(i.id);return}if(r?.target_type===`thread`){let e=await Pi(r,n);if(n!==Tr)return;e&&Ai(i.id);return}let o=wi();if(Ci(),!o){M(X,``),M(Z,``),Yr(``),await ia(),(e!==i.route_id||t)&&await bi(i.id,``,!0),Ai(i.id);return}await bi(i.id,o,!0)}catch(e){n===Tr&&oi(e)}}async function Mi(e,t){return e.target_type===`channel`?(u(q).some(t=>t.id===e.target_id)||await Hi(!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 Hi(!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 Ni(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 Pi(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;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 Mo(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 Fi(){on++,M(Qt,null),M($t,``),M(en,``),M(an,``),M(rr,!1),M(wn,!1),M(Tn,!1)}function Ii(){let e=!u(rr);Fi(),M(rr,e)}function Li(){Fi(),M(wn,!0)}function Ri(){Fi(),M(Tn,!0),Ki()}async function zi(){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 bi(e.workspace.id)}catch(e){r()&&M($t,xe(e,`Could not create workspace`))}finally{n===on&&M(Qt,null)}}async function Vi(e){M(or,!1),await bi(e)}async function Hi(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 ia())}async function Ui(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 aa()}catch(e){if($()!==n||u(ot))return;co(),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 Wi(){M(fr,`message`),u(X)&&Ui()}async function Gi(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 Ki(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 qi(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 Ji(e=u(Y),t=!1){let n=++zr;if(!e){M(Mt,[]);return}try{let t=await Uo(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 Yi(e){Hr+=1,M(Lt,null)}async function Zi(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 Hi(!1,!1,!1)}async function Qi(){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 bi(e,t.channel.id)}catch(e){r()&&M(en,xe(e,`Could not create channel`))}finally{n===on&&M(Qt,null)}}async function $i(e){M(or,!1),ki(u(Y),e);let t=hi(u(Y),e);(e!==u(X)||u(Z)||window.location.pathname!==t)&&await bi(u(Y),e)}async function ea(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;Xa(e,t.preference),M(We,t.preference)}catch{if(n===Br&&e===u(X)&&!u(Z)){let t=Ya(e)||`all`;Xa(e,t),M(We,t)}}}async function ta(){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),Xa(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&&Xa(e,r),t===Br&&e===u(X)&&!u(Z)&&M(We,r)}finally{M(Je,!1)}}function na(e=!1){va(),M(nr,e),Dr+=1,Vn.prune();let t=Zr();return()=>Zr()===t}async function ra(e,t=`replace`,n=na()){let r=$();r!==u($n)&&M(nr,!0);try{if(!r){n()&&ua(``,{messages:[],oldest_seq:0,newest_seq:0,has_older:!1,has_newer:!1},t);return}await Vn.run(()=>G(ca(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=>lo(e)>n.newest_seq)),newest_seq:i.newest_seq,has_newer:i.has_newer}),ua(r,n,t)},n)}catch(e){if(n())throw e}finally{n()&&M(nr,!1)}}async function ia(e=!0){return e&&io(),ra(oa())}async function aa(e=na()){let t=$();if(t)return M(nr,!0),zn.set(t,{atBottom:!0}),ra(`limit=100`,`replace`,e)}function oa(){let e=sa(),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 sa(){return u(Z)?u(J).find(e=>e.id===u(Z))||{}:u(X)&&u(q).find(e=>e.id===u(X))||{}}function ca(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 la(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 aa()}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 aa(),$()!==t||st!==c)return;a&&(zn.set(t,a),M(er,a))}catch{if($()!==t||st!==c)return;i?(da(t,i),ao(t,i.messages),ha(t,i)):co(),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 ua(e,t,n){let r=xo(e).flatMap(e=>e.receipt?[e.receipt]:[]).sort((e,t)=>lo(e)-lo(t)),i=lo(t.messages.at(-1));if(!t.has_newer)for(let e of r)lo(e)===i+1&&(t={...t,messages:[...t.messages,e]},i=lo(e));r.some(e=>lo(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};da(e,d),ha(e,d),(n!==`append`||e!==u($n))&&M(er,zn.get(e)),ao(e,a)}function da(e,t){e&&(u(Bn).delete(e),u(Bn).set(e,t),fa(e),ma(e),M(Bn,new Map(u(Bn))))}function fa(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 ma(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 ha(e,t=u(Bn).get(e)){e===$()&&(M(qn,t?.has_older||!1),M(Jn,t?.has_newer||!1))}function ga(e){let t=u(Bn).get(e);e&&t&&(da(e,{...t,has_newer:!0}),ha(e))}function _a(e,t){e===`older`?(M(Un,t),M(Yn,t===`loading`)):(Wn=t,M(Xn,t===`loading`))}function va(){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=Ba(e);if(n>=0){let r=Va(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&&uo(Q.root,e)&&t.add(Q.root.id),u(cr)&&uo(u(cr),e)&&t.add(u(cr).id);for(let n of u(Ye))(n.status===`pending`||n.status===`failed`)&&uo(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,_a(`older`,`loading`),io();let i=!1;try{await Vn.run(()=>G(ca(`before_seq=${encodeURIComponent(String(n.oldest_seq))}&limit=50`)),t=>{let n=u(Bn).get(e);n&&(ua(e,{...n,messages:ba(t.messages,n.messages),has_older:t.has_older},`prepend`),i=!0,_a(`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&&_a(`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 ia();return}Hn.add(r),Kn=!1,_a(`newer`,`loading`);let i=!1;try{await Vn.run(()=>G(ca(`after_seq=${encodeURIComponent(String(n.newest_seq))}&limit=50`)),t=>{i=Oa(e,t,n.newest_seq),i&&_a(`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&&_a(`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 ia();return}await Vn.run(()=>G(ca(`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=Ba(t);if(e>=0&&!to(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 Ba(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 Va(e,t,n){for(let r of t){if(!uo(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 Ha(e,t){if(!e)return;let n=eo(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||!to(e,r))return;let a=Va(e,t,r);a&&(Zn=new Map(Zn).set(e,{boundarySeq:r,since:ro(a.created_at)}))}function Ua(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:ro(n)}))}function Wa(e){let t=e.payload,n=t.channel_seq??e.seq??t.seq;return typeof n==`number`?n:Number(n)||0}function Ga(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 Ka(e){try{let t=await G(`/api/channels/${e}/notification-settings`);return Xa(e,t.preference),e===u(X)&&!u(Z)&&!u(Je)&&M(We,t.preference),t.preference}catch{return Ya(e)||`all`}}function qa(e){return u(K)?.id&&e?`clickclack:channel-notification:v1:${u(K).id}:${e}`:``}function Ja(e){let t=qa(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 Ya(e){return Ke.get(e)||Ja(e)}function Xa(e,t){Ke=new Map(Ke).set(e,t);let n=qa(e);if(n)try{window.localStorage.setItem(n,t)}catch{}}async function Za(e,t){if(e.type!==`message.created`&&e.type!==`thread.reply_created`)return;let{channelID:n,dmID:r}=Ga(e),i=Wa(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 Ka(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:Qa(l),route:_i(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:Qa(l),tag:`clickclack:${s}`,icon:`/favicon.svg`});e.onclick=()=>{window.focus(),e.close(),n?$i(n):r&&Ts(r)}}catch{}}function Qa(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 $a(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 eo(e){return u(q).find(t=>t.id===e)||u(J).find(t=>t.id===e)||{}}function to(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 no(e,t,n=u(Bn)){let r=Zn.get(e);if(r?.boundarySeq===t)return r.since;if(!to(e,t,n))return``;let i=Va(e,u(Ye),t);return i?ro(i.created_at):``}function ro(e){let t=new Date(e);return Number.isNaN(t.getTime())?``:new Intl.DateTimeFormat(void 0,{hour:`numeric`,minute:`2-digit`}).format(t)}function io(){if(!u($n)||!u(Rn))return;let e=u(Rn).captureState();e&&zn.set(u($n),e)}function ao(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=xo(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),Ha(e,u(Ye)),n&&(M(mr,[]),M(vr,[]),Cn())}function oo(e){co(Vn.updateMessage(e))}function so(e){co(Vn.updateAuthor(e))}function co(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?ua(t,{...n,messages:r},`append`):ao(t,r)}function lo(e){return e?.channel_seq||0}function uo(e,t){return t?e.channel_id===t||e.direct_conversation_id===t:!1}async function po(e=()=>!0){await y(),e()&&await u(Rn)?.scrollToBottom()}function ho(){return u(Rn)?.isFollowing()||u(Rn)?.isNearBottom(96)!==!1}async function go(e=!1){let t=u(nr)||u(Jn)||u(me)>0,n=na();try{if(t&&await aa(n),await po(n),!n())return;u(Jn)||La({all:!0}),await po(n)}catch(t){n()&&(M(Lt,{kind:`error`,text:xe(t,`Could not jump to latest messages`)}),e&&await po(n))}}function _o(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 vo(){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=Go(e),i=r?Ko(u(jt),r.command):void 0;if(r&&i){M(Jt,``),xs(),await yo(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&&Wo(),xs(),await Co(a)}async function yo(e,t,n,r,i,a){try{let r=await qo(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?bo(e):`${t} failed`}),u(Jt).trim()||M(Jt,r)}}function bo(e){try{let t=JSON.parse(e.message);if(t&&typeof t.error==`string`&&t.error)return t.error}catch{}return e.message}function xo(e){return[...lt.values()].filter(({draft:t})=>t.viewKey===e&&(!u(ot)||t.topicID===u(ot)))}async function So(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=na();try{await aa(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}co(),M(Lt,{kind:`error`,text:a?`${n} The unfiltered timeline could not reload.`:n}),await po(r)}}async function Co(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=_o(a,e,s),f={draft:e,message:d,receipt:lt.get(a)?.receipt};lt.set(a,f),$()===e.viewKey&&c&&(co(),t||po());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 So(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?co():lt.delete(a)}catch(t){console.warn(`send failed`,t),await So(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 go(!0)}function wo(e){if(!e.nonce)return;let t=lt.get(e.nonce)?.draft;t&&Co(t,e.nonce,e.id)}function To(e){if(!e.nonce)return;let t=lt.get(e.nonce);t?.receipt?t.message={...t.receipt,nonce:e.nonce}:lt.delete(e.nonce),co()}async function Eo(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 Mo(t.threadRootID,void 0,r))||!await Q.target({messageID:t.messageID,threadSeq:t.threadSeq},r)||!r())return;Q.root?.route_id&&await bi(u(Y),Q.root.id)}else u(Rn)?.scrollToMessage(t.messageID),await bi(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 Oo(e){oo(e),Q.updateMessage(e),M(mt,u(mt).map(t=>t.id===e.id?Ze(t,e):t))}function ko(e){!e.id||e.deleted_at||u(Kr).has(e.id)||(M(qr,e),M(Jr,``))}async function Ao(){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),oo(t),Q.updateMessage(t),M(mt,u(mt).filter(e=>e.id!==t.id)),u(cr)?.id===t.id&&Wo(),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 jo(e){Tr++,hs(),M(dt,!1),await Mo(e.id,e)&&u(Y)&&Q.root?.route_id&&await bi(u(Y),Q.root.id)}async function Mo(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 No(e=[]){let t=Q.root;t&&(Ie.seedMessages(e),Le.reconcile($(),[t,...Q.replies]),oo({id:t.id,thread_state:t.thread_state}))}async function Po(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]),oo(t)})}async function Fo(e,t){(u(Ye).some(t=>t.id===e)||Vn.pending)&&await Vn.run(()=>G(`/api/messages/${e}`),e=>oo(e.message),t)}function Io(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 Lo(){(!u(B)||u(se))&&await Q.send()}function Ro(e,t){t===`thread`?Q.setQuote(e):(M(cr,e),M(lr,t)),M(fr,t===`thread`?`thread`:`message`)}function zo(){return u(qr)!==null||u(Bt)!==null||u(_n)||u(yn)||u(wn)||u(Tn)}function Vo(){return u(fr)===`thread`&&Q.root&&u(dr)?u(dr):u(ur)}function Wo(){M(cr,null),M(lr,null)}async function Jo(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=na();if(u(Rn)?.scrollToMessage(t)??!1){await ds(t,n);return}let r=await G(`/api/messages/${t}`);n()&&uo(r.message,$())&&await ys(r.message)}async function ls(){na(),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 bi(u(Y),n),await ji(vi(u(Y)),yi(n))),$()===n)){if(e.parent_message_id){dn=document.querySelector(`.search-results-scroll`)?.scrollTop??0;let t=fn;if(M(un,!0),!await Mo(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 bi(u(Y),Q.root.id),await y(),n()&&document.querySelector(`.thread .thread-back`)?.focus({preventScroll:!0});return}if(await bi(u(Y),n),e.channel_seq&&e.channel_seq>0){await bs(e.channel_seq,e.id);return}await ia()}}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 bi(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 ia();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=na(r);t&&zn.set(n,{atBottom:!1,anchorMessageID:t,anchorPixelOffset:0}),await ra(`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=hi(u(Y),e);(e!==u(Z)||u(X)||window.location.pathname!==t)&&await bi(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),Ci(),await bi(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 bi(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){Ci();let e=u(q)[0]?.id||``;M(Z,``),M(X,e),e&&ki(u(Y),e),await bi(u(Y),e),await ia()}}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()!==vi(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([qi(e),Ji(e,!0)]);return}if(Ie.clear(),await Promise.all([pi(),Hi(!1,!1,!1),Cs(e),Gi(e),qi(e),Ji(e,!0),Ui(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=wi(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 bi(e,t,!0)}}if(i===Vr&&e===u(Y)&&t()&&(await ia(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)&&Ji(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 Hi(!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 Gi(),await Hi(!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)){ua(``,{messages:[],oldest_seq:0,newest_seq:0,has_older:!1,has_newer:!1},`replace`);return}await ia()}return}e.workspace_id===u(Y)&&e.payload.topic_id&&!u(He).some(t=>t.id===e.payload.topic_id)&&await Ui(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(Za(e,n),e.type===`message.created`&&!n&&(await $a(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=ho(),i=Wa(e),a=e.type===`message.created`&&(i<=0||i>(u(Bn).get($())?.newest_seq||0));if(a&&!r?(Qn=Date.now()+1200,ga($())):a?await Da(t):e.type!==`message.created`&&await Fo(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`&&Io(r,e)&&await Po(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(),Gi(),qi(),Ji()]),Ki(),so({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),Gi(e.workspace_id),qi(e.workspace_id),Ji(e.workspace_id)]),Ki(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=Wa(e),{channelID:s,dmID:c}=Ga(e),l=s||c;if(!l)return;let d=eo(l),f=s?s===u(X)&&!u(Z):c===u(Z),p=f&&(!s||!u(ot))&&(t??ho());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&&Ua(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}=Ga(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}=Ga(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&&(Fi(),hs(),M(Vt,null),M(Ht,``),Ci(),M(ut,e),Si(),(u(O)===`owner`||u(O)===`moderator`)&&!u(Dt).some(t=>t.user.id===e.id)&&Gi())}function Gs(e){e.key===`Enter`&&!e.shiftKey&&(e.preventDefault(),vo())}function Ks(e){e.key===`Enter`&&!e.shiftKey&&(e.preventDefault(),Lo())}function qs(e,t){zo()||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),Si();return}Fi(),Le.cancel($(),`thread`),Ci(),Si()}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(),Ci(),M(dt,e),Si(),e&&tc()}async function ic(e){Tr++,M(dt,!1),await Mo(e.thread_root_id,e.parent_message_id?void 0:e)&&u(Y)&&Q.root?.route_id&&window.location.pathname!==hi(u(Y),Q.root.id)&&await bi(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(zo())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):Wo();return}else{e.preventDefault(),go();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:()=>zo()||u(or),messageInput:u(ur),replyInput:u(dr),target:Vo})}}function oc(){u(qr)&&u(Kr).has(u(qr).id)||u(bn)||(Fi(),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)),()=>{ea(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),()=>{Yi(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&&to(u(tr),u(ge),u(Bn)))}),V(()=>(u(me),u(tr),u(ge),u(Bn)),()=>{M(Se,u(me)>0?no(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,Ho(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)&&Wo()}),V(()=>(u(lr),u(cr),u(Ye)),()=>{u(lr)===`dm`&&u(cr)&&!u(Ye).some(e=>e.id===u(cr)?.id)&&Wo()}),V(()=>(u(jn),c(Ne()),c(Pe())),()=>{u(jn)&&xi(Ne(),Pe())}),re(),ie();var lc=s();r(`1oa2eo8`,e=>{var t=Yo();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=cs(),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)));Do(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 ta(),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=Xo();p(e,t)};P(g,e=>{u(or)?e(_):e(v,-1)}),t(h);var y=k(h,2),S=e=>{var t=Zo();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=>hi(e),onSelectWorkspace:e=>void Vi(e),onToggleWorkspaceCreate:Ii,onWorkspaceName:e=>M(Yt,e),onCreateWorkspace:()=>void zi()})}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)));Bi(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=>hi(u(Y),e),hrefForDirect:e=>hi(u(Y),e),onSelectChannel:e=>void $i(e),onCreateChannel:Li,onSelectDirect:e=>void Ts(e),onCreateDirect:Ri,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)));Bo(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 ta(),onPinnedItems:rc,onOpenChannelSettings:li})}};P(re,e=>{je||e(ie)});var ae=k(re,2),V=e=>{var r=Qo(),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 la(``)),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:gi,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:Wi,onInlineImagePointerUp:Qs,onOpenProfile:Ws,onReply:Ro,onOpenThread:jo,onJumpToQuote:e=>void Jo(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:wo,onDiscard:To,onDeleteMessage:ko,get editController(){return Le},get editScope(){return u(tr)},onMessageEdited:Oo,get topics(){return u(He)},onSelectTopic:e=>void la(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=$o(),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=$o(),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=es();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=ns(),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=ts(),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 vo(),onKeydown:Gs,onFocus:Wi,onInputRef:e=>M(ur,e),onUploadFile:Ss,onRemoveUpload:xs,onClearReply:Wo})}t(fe),t(ne);var Fe=k(ne,2),ze=e=>{var n=rs();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);pa(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=ss();let i;var o=I(r),s=e=>{Xi(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),la(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 Lo(),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:Ro,onClearReply:()=>Q.setQuote(null),get canDeleteAnyMessage(){return u(d)},get deletingMessageIDs(){return u(Kr)},onDeleteMessage:ko,get channelID(){return u(X)},get pinnedMessageIDs(){return u(St)},onTogglePin:nc,onCopyLink:gi,get editController(){return Le},get editScope(){return u(tr)},onMessageEdited:Oo,onActivateThreadComposer:()=>M(fr,`thread`),onInlineImagePointerUp:Qs,onJumpToQuote:e=>void Jo(e),onOpenImage:qs,onOpenArtifact:Js})}},l=e=>{var r=os(),i=ce(r),o=k(I(i),2);t(i);var s=k(i,2),c=e=>{var t=is(),r=ce(t),i=D(r,!0),o=k(r,2);N(()=>d(i,(a(),b(()=>a().error)))),n(`click`,o,()=>a().selection&&void Mo(a().selection.messageID)),p(e,t)},l=e=>{var t=as();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 Zi(e,{role:`member`,clear_timeout:!0,blocked:!1}),onTimeout:e=>void Zi(e,{timeout_minutes:60}),onBlock:e=>void Zi(e,{blocked:!0}),onUnblock:e=>void Zi(e,{blocked:!1,clear_timeout:!0})})}},m=e=>{mo(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);fo(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=>{ya(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 Qi()})}};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 Ao()})}};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{Jo as n,ls as t}; \ No newline at end of file diff --git a/apps/api/internal/webassets/dist/_app/immutable/chunks/DkQ50URG.js b/apps/api/internal/webassets/dist/_app/immutable/chunks/DkQ50URG.js deleted file mode 100644 index 0eeb2b80e..000000000 --- a/apps/api/internal/webassets/dist/_app/immutable/chunks/DkQ50URG.js +++ /dev/null @@ -1,4 +0,0 @@ -const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./DxhId6dF.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"./D5itlxY6.js";import{c as de,n as fe,t as pe}from"./DAzn6KWz.js";import{t as me}from"./uBIymjUX.js";import"./xihTtKlq.js";import"./DD-5HdQf.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"./Cbo1iWSZ.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"./BTDeUFdm.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"./CCzTQXXV.js";import{i as ft,n as pt,r as mt,t as ht}from"./W96STwh2.js";import{n as gt,t as _t}from"./DlGnnCJo.js";import{n as vt,r as yt,t as bt}from"./DaoRWw_m.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-ChjPCl7B.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(`./DxhId6dF.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.DxtUHBGv.js b/apps/api/internal/webassets/dist/_app/immutable/entry/app.Cn7RWqrK.js similarity index 90% rename from apps/api/internal/webassets/dist/_app/immutable/entry/app.DxtUHBGv.js rename to apps/api/internal/webassets/dist/_app/immutable/entry/app.Cn7RWqrK.js index ba1ca65a0..64625f006 100644 --- a/apps/api/internal/webassets/dist/_app/immutable/entry/app.DxtUHBGv.js +++ b/apps/api/internal/webassets/dist/_app/immutable/entry/app.Cn7RWqrK.js @@ -1,2 +1,2 @@ -const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["../nodes/0.DQ4BRnNh.js","../chunks/DK3Fl9T5.js","../chunks/D5itlxY6.js","../chunks/DAzn6KWz.js","../chunks/Dt-HX3Vu.js","../chunks/xihTtKlq.js","../chunks/DD-5HdQf.js","../chunks/Dqjw8vaP.js","../chunks/DEPNME54.js","../assets/0.C7M1Y4Cy.css","../nodes/1.vKcy_xta.js","../chunks/BaUeYfz1.js","../nodes/2.B0kOPABa.js","../chunks/Qo16U5GS.js","../chunks/OQjxVT6U.js","../nodes/3.BgwcTYGi.js","../chunks/uBIymjUX.js","../chunks/Cbo1iWSZ.js","../nodes/4.hPm7AisK.js","../chunks/DkQ50URG.js","../chunks/BTDeUFdm.js","../chunks/CCzTQXXV.js","../assets/QuoteBlock.Bmfc9wvU.css","../chunks/W96STwh2.js","../chunks/DlGnnCJo.js","../chunks/C0IGmcs2.js","../chunks/DaoRWw_m.js","../assets/ThreadPanel.DFXp9CyT.css","../chunks/CVdgRPye.js","../chunks/BIhzYFGW.js","../assets/ChatApp.BrxGlI__.css","../nodes/5.DxwA2zRh.js","../nodes/6.D1H8DGKr.js","../nodes/7.Drxnvthl.js","../chunks/CkTB2XUz.js","../nodes/8.CJLP_Hly.js","../nodes/9.BSSyUS41.js","../nodes/10.DBE-LLj4.js","../nodes/11.7x9MvaTq.js","../nodes/12.Hh37mWN8.js","../assets/12.CzRaoRZI.css","../nodes/13.Dnc1ydkj.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/D5itlxY6.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.DQ4BRnNh.js`),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9]),import.meta.url),()=>T(()=>import(`../nodes/1.vKcy_xta.js`),__vite__mapDeps([10,2,1,5,11,3,4]),import.meta.url),()=>T(()=>import(`../nodes/2.B0kOPABa.js`),__vite__mapDeps([12,1,2,3,4,5,6,8,11,13,14]),import.meta.url),()=>T(()=>import(`../nodes/3.BgwcTYGi.js`),__vite__mapDeps([15,1,2,16,5,17]),import.meta.url),()=>T(()=>import(`../nodes/4.hPm7AisK.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.DxwA2zRh.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.Drxnvthl.js`),__vite__mapDeps([33,1,2,5,8,7,14,28,34]),import.meta.url),()=>T(()=>import(`../nodes/8.CJLP_Hly.js`),__vite__mapDeps([35,1,2,5,8,7,14,24,25,28,29,34]),import.meta.url),()=>T(()=>import(`../nodes/9.BSSyUS41.js`),__vite__mapDeps([36,1,2,5,21,8,25,29]),import.meta.url),()=>T(()=>import(`../nodes/10.DBE-LLj4.js`),__vite__mapDeps([37,1,2,3,4,5,6,8,14,29]),import.meta.url),()=>T(()=>import(`../nodes/11.7x9MvaTq.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.Hh37mWN8.js`),__vite__mapDeps([39,1,2,5,8,7,20,21,22,23,24,25,29,40]),import.meta.url),()=>T(()=>import(`../nodes/13.Dnc1ydkj.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.DQ4BRnNh.js","../chunks/DK3Fl9T5.js","../chunks/D5itlxY6.js","../chunks/DAzn6KWz.js","../chunks/Dt-HX3Vu.js","../chunks/xihTtKlq.js","../chunks/DD-5HdQf.js","../chunks/Dqjw8vaP.js","../chunks/DEPNME54.js","../assets/0.C7M1Y4Cy.css","../nodes/1.vKcy_xta.js","../chunks/BaUeYfz1.js","../nodes/2.B0kOPABa.js","../chunks/Qo16U5GS.js","../chunks/OQjxVT6U.js","../nodes/3.C-mr27r9.js","../chunks/uBIymjUX.js","../chunks/Cbo1iWSZ.js","../nodes/4.a_Bio8Hs.js","../chunks/DNUfuHVs.js","../chunks/BTDeUFdm.js","../chunks/CCzTQXXV.js","../assets/QuoteBlock.Bmfc9wvU.css","../chunks/W96STwh2.js","../chunks/DlGnnCJo.js","../chunks/C0IGmcs2.js","../chunks/DaoRWw_m.js","../assets/ThreadPanel.DFXp9CyT.css","../chunks/CVdgRPye.js","../chunks/BIhzYFGW.js","../assets/ChatApp.BrxGlI__.css","../nodes/5.BZwMa0rM.js","../nodes/6.D1H8DGKr.js","../nodes/7.Drxnvthl.js","../chunks/CkTB2XUz.js","../nodes/8.CJLP_Hly.js","../nodes/9.BSSyUS41.js","../nodes/10.DBE-LLj4.js","../nodes/11.DOh12vRA.js","../nodes/12.Hh37mWN8.js","../assets/12.CzRaoRZI.css","../nodes/13.Dnc1ydkj.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/D5itlxY6.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.DQ4BRnNh.js`),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9]),import.meta.url),()=>T(()=>import(`../nodes/1.vKcy_xta.js`),__vite__mapDeps([10,2,1,5,11,3,4]),import.meta.url),()=>T(()=>import(`../nodes/2.B0kOPABa.js`),__vite__mapDeps([12,1,2,3,4,5,6,8,11,13,14]),import.meta.url),()=>T(()=>import(`../nodes/3.C-mr27r9.js`),__vite__mapDeps([15,1,2,16,5,17]),import.meta.url),()=>T(()=>import(`../nodes/4.a_Bio8Hs.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.BZwMa0rM.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.Drxnvthl.js`),__vite__mapDeps([33,1,2,5,8,7,14,28,34]),import.meta.url),()=>T(()=>import(`../nodes/8.CJLP_Hly.js`),__vite__mapDeps([35,1,2,5,8,7,14,24,25,28,29,34]),import.meta.url),()=>T(()=>import(`../nodes/9.BSSyUS41.js`),__vite__mapDeps([36,1,2,5,21,8,25,29]),import.meta.url),()=>T(()=>import(`../nodes/10.DBE-LLj4.js`),__vite__mapDeps([37,1,2,3,4,5,6,8,14,29]),import.meta.url),()=>T(()=>import(`../nodes/11.DOh12vRA.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.Hh37mWN8.js`),__vite__mapDeps([39,1,2,5,8,7,20,21,22,23,24,25,29,40]),import.meta.url),()=>T(()=>import(`../nodes/13.Dnc1ydkj.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/11.7x9MvaTq.js b/apps/api/internal/webassets/dist/_app/immutable/nodes/11.DOh12vRA.js similarity index 77% rename from apps/api/internal/webassets/dist/_app/immutable/nodes/11.7x9MvaTq.js rename to apps/api/internal/webassets/dist/_app/immutable/nodes/11.DOh12vRA.js index a83161462..d6a75f39f 100644 --- a/apps/api/internal/webassets/dist/_app/immutable/nodes/11.7x9MvaTq.js +++ b/apps/api/internal/webassets/dist/_app/immutable/nodes/11.DOh12vRA.js @@ -1 +1 @@ -import{Et as e,Tt as t}from"../chunks/D5itlxY6.js";import"../chunks/xihTtKlq.js";import{t as n}from"../chunks/DkQ50URG.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/D5itlxY6.js";import"../chunks/xihTtKlq.js";import{t as n}from"../chunks/DNUfuHVs.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/3.BgwcTYGi.js b/apps/api/internal/webassets/dist/_app/immutable/nodes/3.C-mr27r9.js similarity index 91% rename from apps/api/internal/webassets/dist/_app/immutable/nodes/3.BgwcTYGi.js rename to apps/api/internal/webassets/dist/_app/immutable/nodes/3.C-mr27r9.js index f0854b74b..d22778ab3 100644 --- a/apps/api/internal/webassets/dist/_app/immutable/nodes/3.BgwcTYGi.js +++ b/apps/api/internal/webassets/dist/_app/immutable/nodes/3.C-mr27r9.js @@ -1,2 +1,2 @@ -const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["../chunks/DkQ50URG.js","../chunks/DK3Fl9T5.js","../chunks/D5itlxY6.js","../chunks/DAzn6KWz.js","../chunks/Dt-HX3Vu.js","../chunks/uBIymjUX.js","../chunks/xihTtKlq.js","../chunks/DD-5HdQf.js","../chunks/DEPNME54.js","../chunks/Dqjw8vaP.js","../chunks/Qo16U5GS.js","../chunks/OQjxVT6U.js","../chunks/Cbo1iWSZ.js","../chunks/BTDeUFdm.js","../chunks/CCzTQXXV.js","../assets/QuoteBlock.Bmfc9wvU.css","../chunks/W96STwh2.js","../chunks/DlGnnCJo.js","../chunks/C0IGmcs2.js","../chunks/DaoRWw_m.js","../assets/ThreadPanel.DFXp9CyT.css","../chunks/CVdgRPye.js","../chunks/BIhzYFGW.js","../assets/ChatApp.BrxGlI__.css","../chunks/BDmwRgA7.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/D5itlxY6.js";import{t as s}from"../chunks/uBIymjUX.js";import"../chunks/xihTtKlq.js";import"../chunks/Cbo1iWSZ.js";var c=e({prerender:()=>!0});function l(e){let c=window.location.hostname.startsWith(`app.`)?s(()=>import(`../chunks/DkQ50URG.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/BDmwRgA7.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/DNUfuHVs.js","../chunks/DK3Fl9T5.js","../chunks/D5itlxY6.js","../chunks/DAzn6KWz.js","../chunks/Dt-HX3Vu.js","../chunks/uBIymjUX.js","../chunks/xihTtKlq.js","../chunks/DD-5HdQf.js","../chunks/DEPNME54.js","../chunks/Dqjw8vaP.js","../chunks/Qo16U5GS.js","../chunks/OQjxVT6U.js","../chunks/Cbo1iWSZ.js","../chunks/BTDeUFdm.js","../chunks/CCzTQXXV.js","../assets/QuoteBlock.Bmfc9wvU.css","../chunks/W96STwh2.js","../chunks/DlGnnCJo.js","../chunks/C0IGmcs2.js","../chunks/DaoRWw_m.js","../assets/ThreadPanel.DFXp9CyT.css","../chunks/CVdgRPye.js","../chunks/BIhzYFGW.js","../assets/ChatApp.BrxGlI__.css","../chunks/BDmwRgA7.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/D5itlxY6.js";import{t as s}from"../chunks/uBIymjUX.js";import"../chunks/xihTtKlq.js";import"../chunks/Cbo1iWSZ.js";var c=e({prerender:()=>!0});function l(e){let c=window.location.hostname.startsWith(`app.`)?s(()=>import(`../chunks/DNUfuHVs.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/BDmwRgA7.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.hPm7AisK.js b/apps/api/internal/webassets/dist/_app/immutable/nodes/4.a_Bio8Hs.js similarity index 63% rename from apps/api/internal/webassets/dist/_app/immutable/nodes/4.hPm7AisK.js rename to apps/api/internal/webassets/dist/_app/immutable/nodes/4.a_Bio8Hs.js index bff683f05..2c25493b0 100644 --- a/apps/api/internal/webassets/dist/_app/immutable/nodes/4.hPm7AisK.js +++ b/apps/api/internal/webassets/dist/_app/immutable/nodes/4.a_Bio8Hs.js @@ -1 +1 @@ -import"../chunks/D5itlxY6.js";import"../chunks/xihTtKlq.js";import"../chunks/Cbo1iWSZ.js";import{t as e}from"../chunks/DkQ50URG.js";function t(t){e(t,{})}export{t as component}; \ No newline at end of file +import"../chunks/D5itlxY6.js";import"../chunks/xihTtKlq.js";import"../chunks/Cbo1iWSZ.js";import{t as e}from"../chunks/DNUfuHVs.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.DxwA2zRh.js b/apps/api/internal/webassets/dist/_app/immutable/nodes/5.BZwMa0rM.js similarity index 72% rename from apps/api/internal/webassets/dist/_app/immutable/nodes/5.DxwA2zRh.js rename to apps/api/internal/webassets/dist/_app/immutable/nodes/5.BZwMa0rM.js index 280eca75a..259cc4b50 100644 --- a/apps/api/internal/webassets/dist/_app/immutable/nodes/5.DxwA2zRh.js +++ b/apps/api/internal/webassets/dist/_app/immutable/nodes/5.BZwMa0rM.js @@ -1 +1 @@ -import{Et as e,Tt as t}from"../chunks/D5itlxY6.js";import"../chunks/xihTtKlq.js";import{t as n}from"../chunks/DkQ50URG.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/D5itlxY6.js";import"../chunks/xihTtKlq.js";import{t as n}from"../chunks/DNUfuHVs.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 99a205df2..73ee9f53e 100644 --- a/apps/api/internal/webassets/dist/index.html +++ b/apps/api/internal/webassets/dist/index.html @@ -103,14 +103,14 @@ - + - + @@ -128,7 +128,7 @@ Promise.all([ import("./_app/immutable/entry/start.By1vhz9u.js"), - import("./_app/immutable/entry/app.DxtUHBGv.js") + import("./_app/immutable/entry/app.Cn7RWqrK.js") ]).then(([kit, app]) => { kit.start(app, element); }); diff --git a/apps/web/src/components/navigation/Sidebar.svelte b/apps/web/src/components/navigation/Sidebar.svelte index 3e944c425..146d5b391 100644 --- a/apps/web/src/components/navigation/Sidebar.svelte +++ b/apps/web/src/components/navigation/Sidebar.svelte @@ -1,6 +1,14 @@