From e5941b1b0177649a0b63f1720185f9e0658b81f2 Mon Sep 17 00:00:00 2001 From: Tater Date: Sun, 13 Sep 2026 18:31:56 -0400 Subject: [PATCH 1/2] feat(web): roam the personal channel order with the account The sidebar channel order lived only in that browser's localStorage, so a reorder on the desktop app was invisible on the laptop and on the phone, and clearing site data lost it. Isaiah asked for the order he arranges once to follow him: "It should work on every instance I'm on!" Appearance preferences already roam this way, so the sidebar follows that precedent: a sibling sidebar_preferences object on /api/me carrying channel_order keyed by workspace id, one row per (user, workspace) in both stores, and localStorage kept as the pre-paint cache and the offline fallback. The account copy wins on load and is written back into the cache, and each reorder writes locally first and then patches the account, debounced and best effort, so drag, keyboard, and touch moves never wait on the network. A reorder made just before the page goes away is flushed on pagehide with keepalive, so it roams instead of dying with the tab. The store validates in both databases: membership is required for every workspace key, ids that are not channels of that workspace are dropped rather than rejected so a deleted channel cannot wedge a save, repeated ids keep their first position, and one workspace holds at most 500 ids. Co-Authored-By: Claude Fable 5.1 --- CHANGELOG.md | 1 + apps/api/internal/httpapi/profile.go | 12 +- apps/api/internal/httpapi/responses.go | 2 + .../httpapi/sidebar_preferences_test.go | 175 ++++++++++ .../0036_user_sidebar_channel_order.sql | 8 + apps/api/internal/store/postgres/postgres.go | 18 +- apps/api/internal/store/postgres/sidebar.go | 81 +++++ .../internal/store/postgres/sidebar_test.go | 321 ++++++++++++++++++ .../internal/store/postgres/sqlc/queries.sql | 24 ++ .../internal/store/postgres/sqlc/schema.sql | 9 + .../internal/store/postgres/storedb/models.go | 7 + .../store/postgres/storedb/queries.sql.go | 106 ++++++ apps/api/internal/store/sidebar.go | 74 ++++ apps/api/internal/store/sidebar_test.go | 148 ++++++++ .../0043_user_sidebar_channel_order.sql | 8 + apps/api/internal/store/sqlite/sidebar.go | 81 +++++ .../api/internal/store/sqlite/sidebar_test.go | 311 +++++++++++++++++ .../internal/store/sqlite/sqlc/queries.sql | 24 ++ .../api/internal/store/sqlite/sqlc/schema.sql | 9 + apps/api/internal/store/sqlite/sqlite.go | 18 +- .../internal/store/sqlite/storedb/models.go | 7 + .../store/sqlite/storedb/queries.sql.go | 106 ++++++ apps/api/internal/store/types.go | 19 ++ apps/api/internal/webassets/dist/200.html | 4 +- .../dist/_app/immutable/chunks/BgeFVQgV.js | 4 + .../dist/_app/immutable/chunks/DkQ50URG.js | 4 - .../{app.DxtUHBGv.js => app.B01dN3Y3.js} | 4 +- .../nodes/{11.7x9MvaTq.js => 11.CGeSIvDi.js} | 2 +- .../nodes/{3.BgwcTYGi.js => 3.DNBxx-Ro.js} | 4 +- .../nodes/{4.hPm7AisK.js => 4.Dm2A-e2p.js} | 2 +- .../nodes/{5.DxwA2zRh.js => 5.C-PBhhsU.js} | 2 +- apps/api/internal/webassets/dist/index.html | 6 +- .../src/components/navigation/Sidebar.svelte | 69 ++-- apps/web/src/lib/channel-order.test.ts | 254 ++++++++++++++ apps/web/src/lib/channel-order.ts | 210 ++++++++++++ apps/web/src/lib/types.ts | 11 + docs/features/profiles.md | 32 +- packages/protocol/openapi.yaml | 32 ++ packages/sdk-ts/src/account.type-tests.d.ts | 13 + packages/sdk-ts/src/generated/openapi.d.ts | 16 + tests/e2e/chat.spec.ts | 52 ++- tests/e2e/sidebar-channel-order.spec.ts | 65 +++- 42 files changed, 2282 insertions(+), 73 deletions(-) create mode 100644 apps/api/internal/httpapi/sidebar_preferences_test.go create mode 100644 apps/api/internal/store/postgres/migrations/0036_user_sidebar_channel_order.sql create mode 100644 apps/api/internal/store/postgres/sidebar.go create mode 100644 apps/api/internal/store/postgres/sidebar_test.go create mode 100644 apps/api/internal/store/sidebar.go create mode 100644 apps/api/internal/store/sidebar_test.go create mode 100644 apps/api/internal/store/sqlite/migrations/0043_user_sidebar_channel_order.sql create mode 100644 apps/api/internal/store/sqlite/sidebar.go create mode 100644 apps/api/internal/store/sqlite/sidebar_test.go create mode 100644 apps/api/internal/webassets/dist/_app/immutable/chunks/BgeFVQgV.js delete mode 100644 apps/api/internal/webassets/dist/_app/immutable/chunks/DkQ50URG.js rename apps/api/internal/webassets/dist/_app/immutable/entry/{app.DxtUHBGv.js => app.B01dN3Y3.js} (90%) rename apps/api/internal/webassets/dist/_app/immutable/nodes/{11.7x9MvaTq.js => 11.CGeSIvDi.js} (77%) rename apps/api/internal/webassets/dist/_app/immutable/nodes/{3.BgwcTYGi.js => 3.DNBxx-Ro.js} (91%) rename apps/api/internal/webassets/dist/_app/immutable/nodes/{4.hPm7AisK.js => 4.Dm2A-e2p.js} (63%) rename apps/api/internal/webassets/dist/_app/immutable/nodes/{5.DxwA2zRh.js => 5.C-PBhhsU.js} (72%) create mode 100644 apps/web/src/lib/channel-order.test.ts create mode 100644 apps/web/src/lib/channel-order.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index f839e4ad1..6a0f1b5db 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. - 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..e85386d9b --- /dev/null +++ b/apps/api/internal/httpapi/sidebar_preferences_test.go @@ -0,0 +1,175 @@ +package httpapi + +import ( + "context" + "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. + cleared := patchJSON[currentUserResponse](t, server.URL+"/api/me", map[string]any{ + "sidebar_preferences": map[string]any{"channel_order": map[string]any{workspaceID: []string{}}}, + }) + if cleared.User.SidebarPreferences != nil { + t.Fatalf("clearing the only workspace left a snapshot: %#v", cleared.User.SidebarPreferences) + } +} + +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) + } +} + +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..11c37a954 --- /dev/null +++ b/apps/api/internal/store/postgres/sidebar.go @@ -0,0 +1,81 @@ +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 + } + if len(ids) == 0 { + continue + } + 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 + } + filtered := store.FilterSidebarChannelOrder(order, channelIDs) + if len(filtered) == 0 { + if err := q.DeleteSidebarChannelOrder(ctx, storedb.DeleteSidebarChannelOrderParams{ + UserID: userID, + WorkspaceID: workspaceID, + }); err != nil { + return err + } + continue + } + 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..57a39779c --- /dev/null +++ b/apps/api/internal/store/postgres/sidebar_test.go @@ -0,0 +1,321 @@ +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. + 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") + } + if _, ok := account.SidebarPreferences.ChannelOrder[workspace.ID]; ok { + t.Fatalf("cleared workspace survived: %#v", account.SidebarPreferences.ChannelOrder) + } + assertChannelOrder(t, account.SidebarPreferences, 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") +} + +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..5556348a7 100644 --- a/apps/api/internal/store/postgres/sqlc/queries.sql +++ b/apps/api/internal/store/postgres/sqlc/queries.sql @@ -280,6 +280,30 @@ 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: DeleteSidebarChannelOrder :exec +DELETE FROM user_sidebar_channel_order +WHERE user_id = sqlc.arg(user_id) + AND workspace_id = sqlc.arg(workspace_id); + +-- 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..30acb6478 100644 --- a/apps/api/internal/store/postgres/storedb/queries.sql.go +++ b/apps/api/internal/store/postgres/storedb/queries.sql.go @@ -602,6 +602,22 @@ func (q *Queries) DeletePendingUploadCleanup(ctx context.Context, id string) err return err } +const deleteSidebarChannelOrder = `-- name: DeleteSidebarChannelOrder :exec +DELETE FROM user_sidebar_channel_order +WHERE user_id = $1 + AND workspace_id = $2 +` + +type DeleteSidebarChannelOrderParams struct { + UserID string `json:"user_id"` + WorkspaceID string `json:"workspace_id"` +} + +func (q *Queries) DeleteSidebarChannelOrder(ctx context.Context, arg DeleteSidebarChannelOrderParams) error { + _, err := q.db.ExecContext(ctx, deleteSidebarChannelOrder, arg.UserID, arg.WorkspaceID) + return err +} + const deleteUnclaimedBotSetupCodesForTokenName = `-- name: DeleteUnclaimedBotSetupCodesForTokenName :execrows DELETE FROM bot_setup_codes WHERE workspace_id = $1 @@ -4234,6 +4250,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 +4846,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 +6609,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..fdf1a27bb --- /dev/null +++ b/apps/api/internal/store/sqlite/sidebar.go @@ -0,0 +1,81 @@ +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 + } + if len(ids) == 0 { + continue + } + 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 + } + filtered := store.FilterSidebarChannelOrder(order, channelIDs) + if len(filtered) == 0 { + if err := q.DeleteSidebarChannelOrder(ctx, storedb.DeleteSidebarChannelOrderParams{ + UserID: userID, + WorkspaceID: workspaceID, + }); err != nil { + return err + } + continue + } + 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..e05f547d2 --- /dev/null +++ b/apps/api/internal/store/sqlite/sidebar_test.go @@ -0,0 +1,311 @@ +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. + 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") + } + if _, ok := account.SidebarPreferences.ChannelOrder[workspace.ID]; ok { + t.Fatalf("cleared workspace survived: %#v", account.SidebarPreferences.ChannelOrder) + } + assertChannelOrder(t, account.SidebarPreferences, 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) +} + +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..303193438 100644 --- a/apps/api/internal/store/sqlite/sqlc/queries.sql +++ b/apps/api/internal/store/sqlite/sqlc/queries.sql @@ -273,6 +273,30 @@ 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: DeleteSidebarChannelOrder :exec +DELETE FROM user_sidebar_channel_order +WHERE user_id = sqlc.arg(user_id) + AND workspace_id = sqlc.arg(workspace_id); + +-- 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..f978aa0b1 100644 --- a/apps/api/internal/store/sqlite/storedb/queries.sql.go +++ b/apps/api/internal/store/sqlite/storedb/queries.sql.go @@ -598,6 +598,22 @@ func (q *Queries) DeletePendingUploadCleanup(ctx context.Context, id string) err return err } +const deleteSidebarChannelOrder = `-- name: DeleteSidebarChannelOrder :exec +DELETE FROM user_sidebar_channel_order +WHERE user_id = ?1 + AND workspace_id = ?2 +` + +type DeleteSidebarChannelOrderParams struct { + UserID string `json:"user_id"` + WorkspaceID string `json:"workspace_id"` +} + +func (q *Queries) DeleteSidebarChannelOrder(ctx context.Context, arg DeleteSidebarChannelOrderParams) error { + _, err := q.db.ExecContext(ctx, deleteSidebarChannelOrder, arg.UserID, arg.WorkspaceID) + return err +} + const deleteUnclaimedBotSetupCodesForTokenName = `-- name: DeleteUnclaimedBotSetupCodesForTokenName :execrows DELETE FROM bot_setup_codes WHERE workspace_id = ?1 @@ -4133,6 +4149,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 +4720,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 +6347,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..0e84cf5f4 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.B01dN3Y3.js") ]).then(([kit, app]) => { kit.start(app, element); }); diff --git a/apps/api/internal/webassets/dist/_app/immutable/chunks/BgeFVQgV.js b/apps/api/internal/webassets/dist/_app/immutable/chunks/BgeFVQgV.js new file mode 100644 index 000000000..9098150df --- /dev/null +++ b/apps/api/internal/webassets/dist/_app/immutable/chunks/BgeFVQgV.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 Set;function qr(e,t){return`${t}:${e}`}function Jr(e,t){return`${Wr}${t}:${e}`}function Yr(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 Xr(e,t){if(!e||!t)return[];try{return Yr(window.localStorage.getItem(Jr(e,t)))}catch{return[]}}function Zr(e,t,n){if(e&&t)try{let r=Jr(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 Qr(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 $r(e,t){return e===void 0?[...t]:Qr(e)}function ei(e,t){if(!t)return;let n=e?.sidebar_preferences?.channel_order?.[t];return Array.isArray(n)?n:void 0}function ti(e,t){let n=e?.id||``;if(!t||!n)return[];let r=Xr(t,n);if(Kr.has(qr(t,n)))return r;let i=ei(e,t),a=$r(i,r);return i!==void 0&&Zr(t,n,a),a}function ni(e,t,n,r){e&&t&&(Kr.add(qr(e,t)),Zr(e,t,n),ii(e,t,n,r))}function ri(e,t){return{sidebar_preferences:{channel_order:{[e]:t.slice(0,500)}}}}function ii(e,t,n,r){if(!e||!t)return;let i=qr(e,t),a=Gr.get(i);a&&clearTimeout(a.timer);let o=ri(e,n),s=setTimeout(()=>{Gr.delete(i),oi(r,o,!1)},400);Gr.set(i,{timer:s,body:o})}function ai(e){if(Gr.size===0)return;let t=[...Gr.values()];Gr.clear();for(let n of t)clearTimeout(n.timer),oi(e,n.body,!0)}async function oi(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 si=l(``),ci=l(` `,1),li=l(``),ui=l(` `),di=l(`
#
`),fi=l(`
`),pi=l(``),mi=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),hi=l(`
`);function gi(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=di();let b;var C=I(y),T=e=>{var r=ci(),s=ce(r),c=k(s,2),l=e=>{var r=si(),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=li();p(e,t)};P(ee,e=>{i().external_managed&&e(te)});var L=k(ee,2),R=e=>{var t=ui(),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=fi();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=hi();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=mi(),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=pi();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 _i=l(` `),vi=l(``),yi=l(``),bi=l(`
`),xi=l(``),Si=l(`
`),Ci=l(`
`);function wi(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=Ci();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=bi();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=_i(),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=vi();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=yi(),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=xi();p(e,t)};P(S,e=>{r.expanded&&r.conversations.length===0&&e(C)});var T=k(S,2),E=e=>{var i=Si(),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 Ti=l(``),Ei=l(`Connecting…`),Di=l(`
`),Oi=l(` `),ki=l(``),Ai=l(``),ji=l(``);function Mi(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&&ni(r.workspaceID,r.currentUser.id,e,G)}C(()=>{let e=()=>ai(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){r.workspaceID&&r.currentUser?.id&&e.key===Jr(r.workspaceID,r.currentUser.id)&&M(g,Yr(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,ti(r.currentUser,r.workspaceID),!0)});function T(e){return e.button===0&&!e.metaKey&&!e.ctrlKey&&!e.shiftKey&&!e.altKey}var O=ji();v(`storage`,E,b);var j=I(O),F=e=>{var i=Di(),a=I(i),o=I(a),s=e=>{var t=Ti();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=Ei();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);gi(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);wi(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=Oi();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=ki();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=Ai(),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 Ni=l(`
Loading...
`),Pi=l(`
`),Fi=l(`
`),Ii=l(`

No pinned messages

Pin important messages to keep them easily accessible.

`),Li=l(`
`),Ri=l(`
`),zi=l(`
`),Bi=l(` `,1),Vi=l(`

Pinned Messages

`);function Hi(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=Vi(),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=Ni();p(e,t)},R=e=>{var t=Pi(),n=D(t,!0);N(()=>d(n,s())),p(e,t)},ne=e=>{var a=Bi(),o=ce(a),s=e=>{var t=Fi(),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=Ii();p(e,t)},b=e=>{var a=zi();f(a,21,()=>r.messages,e=>e.id,(e,a)=>{let o=U(()=>c().find(e=>e.id===u(a).topic_id));var s=Ri(),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=Li();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 Ui=l(` `,1),Wi=l(`
`),Gi=l(`
We couldn’t search messages

`),Ki=l(`
No messages found

Try another word or phrase.

`),qi=l(`deleted bot`),Ji=l(` `),Yi=l(` `),Xi=l(` `),Zi=l(` Reply in thread`),Qi=l(` `),$i=l(`
  • `),ea=l(``),ta=l(``),na=l(``),ra=l(`
      `,1),ia=l(``);function aa(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=Ui(),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=Wi();p(e,t)},B=e=>{var n=Gi(),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=ra(),a=ce(i);f(a,21,()=>r.session.results,e=>e.id,(e,i)=>{let a=U(()=>r.contextFor(u(i)));var o=$i(),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=qi();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=Yi(),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=Xi(),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=Zi();p(e,t)},re=e=>{var n=Qi(),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=ea(),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=ta(),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=na();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 oa=l(``),sa=l(`
      `),ca=l(`

      `,1),la=l(`
      `),ua=l(``);function da(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=ua(),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=oa(),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=sa(),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=ca(),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=la(),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 fa=l(`

      `),pa=l(``),ma=l(`
      `);function ha(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=ma(),m=I(f),h=I(m);a(h,()=>n.children),t(m);var g=k(m,2),y=I(g),b=e=>{var t=fa();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=pa();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 ga=l(`

      Browser notifications are not supported on this device.

      `),_a=l(`

      Browser notifications are blocked by this browser.

      `),va=l(`

      `),ya=l(`

      Show alerts when ClickClack is in the background.

      `);function ba(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=ya(),v=I(g),y=I(v),b=D(y,!0),x=k(y,4),T=e=>{var t=ga();p(e,t)},E=e=>{var t=_a();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=va();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 xa=l(``),Sa=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 Ca(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,``)}ha(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=Sa(),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=xa();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),ba(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 wa=l(`

      Desktop

      Mobile push

      Send push notifications to your phone via Pushover.

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

      `);function Ta(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)}),ha(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=wa(),c=k(I(s),2);ba(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 Ea=l(`

      Loading…

      `),Da=l(`

      `),Oa=l(`
      You don't own any bots yet. Open a workspace's Bots & agents page to mint one.
      `),ka=l(``),$=l(`
    • `),Aa=l(`

        `),ja=l(`
        `),Ma=l(`

        Account

        My bots

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

        `,1);function Na(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=Ma(),b=k(ce(y),2),x=e=>{var t=Ea();p(e,t)},S=e=>{var t=Da(),n=D(t,!0);N(()=>d(n,u(s))),p(e,t)},C=e=>{var t=Oa();p(e,t)},w=e=>{var r=ja();f(r,21,()=>u(v),e=>e.workspace.id,(e,r)=>{var i=Aa(),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=$(),a=I(i),o=I(a),s=e=>{var t=ka();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 Pa(e,t){return t.includes(`password`)&&e.password_enrolled===!0}function Fa(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 Ia=l(`

        `),La=l(``),Ra=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 za(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=Fa(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=Ra(),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=Ia();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=La();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 Ba=l(``),Va=l(``),Ha=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 Ua(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=Ha(),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=Ba();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=Va();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=Ba();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=Ba();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 Wa=l(` `,1),Ga=l(` `,1),Ka=l(` `,1),qa=l(` `,1),Ja=l(`
      • `),Ya=l(`
      • `),Xa=l(`

          `),Za=l(`

          Loading...

          `),Qa=l(`

          `),$a=l(`

          `),eo=l(`

          Account

          Profile settings

          How you appear across ClickClack.

          Sign out

          End this session on this device.

          `,1),to=l(`

          Account

          Notifications

          Decide when and how ClickClack should reach you.

          `,1),no=l(``);function ro(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(()=>Pa(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=no();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=Wa(),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=Ga(),n=k(ce(t),2),r=D(n,!0);N(()=>d(r,u(i).label)),p(e,t)},m=e=>{var t=Ka(),n=k(ce(t),2),r=D(n,!0);N(()=>d(r,u(i).label)),p(e,t)},g=e=>{var t=qa(),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=Xa(),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=Ya(),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=Za();p(e,t)},se=e=>{var t=Qa(),n=D(t,!0);N(()=>d(n,u(b))),p(e,t)},le=e=>{var i=eo(),a=k(ce(i),2);Ca(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=>{za(e,{})};P(o,e=>{u(g)&&e(s)});var f=k(o,2),h=I(f),_=k(I(h),4),v=e=>{var t=$a(),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=>{Ua(e,{get user(){return r.user}})},ue=e=>{var t=to();Ta(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=>{Na(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 io=l(`
          No thread open Hover any message and tap the bubble to keep side conversations tidy.
          `);function ao(e){var t=io();p(e,t)}var oo=l(``),so=l(`

          `,1),co=l(``),lo=l(``),uo=l(``),fo=l(``),po=l(``),mo=l(``),ho=l(``),go=l(`
          `),_o=l(`Connecting…`),vo=l(`
          `);function yo(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=vo(),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=so(),n=k(ce(t),2),i=D(n,!0),a=k(n,2),o=e=>{var t=oo();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=co();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=go(),u=I(o),d=e=>{var r=po(),o=I(r),c=e=>{var t=lo();p(e,t)},l=e=>{var t=uo();p(e,t)},u=e=>{var t=fo();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=mo();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=ho();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=_o();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 bo=l(`

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

          `,1),Eo=l(`

          ClickClack

          `),Do=l(``),Oo=l(``),ko=l(``),Ao=l(``),jo=l(`

          `);function Mo(e,r){o(r,!0);function i(e){return e===`muted`?`Channel muted - click to change`:e===`mentions`?`Notifications for @mentions only - click to change`:`All notifications enabled - click to change`}let a=S(r,`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=jo(),y=I(g),b=I(y),x=e=>{var t=bo(),n=D(t,!0);N(e=>d(n,e),[()=>`@${rt(r.selectedDirect,r.currentUserID)}`]),p(e,t)},C=e=>{var a=To(),o=ce(a),l=D(o,!0),u=k(o,2),f=e=>{var r=wo(),a=I(r),o=e=>{var t=xo();p(e,t)},l=e=>{var t=So();p(e,t)},u=e=>{var t=Co();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=Eo();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=Do();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=Oo();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=ko();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=Ao();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 No(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 Po(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=No(a.userId,t,n);e&&i.push(e)}return i}async function Fo(e){return(await G(`/api/workspaces/${e}/bot-commands`)).bot_commands??[]}function Io(e){let t=e.trim().toLowerCase();return t?t.startsWith(`/`)?t:`/${t}`:``}function Lo(e){let t=/^(\/\S+)\s*([\s\S]*)$/.exec(e);return t?{command:Io(t[1]),text:t[2].trim()}:null}function Ro(e,t){return e.find(e=>!e.revoked_at&&Io(e.command)===t)}async function zo(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 Bo=e({default:()=>ts}),Vo=l(``),Ho=l(``),Uo=l(``),Wo=l(`
          Showing topic
          `),Go=l(`

          `),Ko=l(`
          `),qo=l(``),Jo=l(``),Yo=l(``),Xo=l(` `,1),Zo=l(`

          Loading thread…

          `),Qo=l(`
          Thread
          `,1),$o=l(``),es=l(`
          `,1);function ts(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(Do),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)}:${$()}`,Io),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),lo(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`);co({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 Pi(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&&(oo(),Le.clear(),Vn.clear(),Ii(),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 Ui(!1,!1),n!==Tr||((a||u(J).length===0)&&await Cs(),a&&(await Promise.all([Ki(),Ji(i.id),Yi(i.id),Wi(i.id)]),qi(i.id)),n!==Tr))return;if(r){let e=await Ni(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){ga(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){ga(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 Fi(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 Ni(e,t){return e.target_type===`channel`?(u(q).some(t=>t.id===e.target_id)||await Ui(!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 Ui(!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 Pi(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 Fi(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 No(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 Ii(){on++,M(Qt,null),M($t,``),M(en,``),M(an,``),M(rr,!1),M(wn,!1),M(Tn,!1)}function Li(){let e=!u(rr);Ii(),M(rr,e)}function Ri(){Ii(),M(wn,!0)}function zi(){Ii(),M(Tn,!0),qi()}async function Bi(){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 Ui(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 Wi(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 oa()}catch(e){if($()!==n||u(ot))return;uo(),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 Gi(){M(fr,`message`),u(X)&&Wi()}async function Ki(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 qi(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 Ji(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 Yi(e=u(Y),t=!1){let n=++zr;if(!e){M(Mt,[]);return}try{let t=await Fo(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 Xi(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 Ui(!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){ya(),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()&&fa(``,{messages:[],oldest_seq:0,newest_seq:0,has_older:!1,has_newer:!1},t);return}await Vn.run(()=>G(la(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=>fo(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 ia(e=!0){return e&&oo(),ra(sa())}async function oa(e=na()){let t=$();if(t)return M(nr,!0),zn.set(t,{atBottom:!0}),ra(`limit=100`,`replace`,e)}function sa(){let e=ca(),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 ca(){return u(Z)?u(J).find(e=>e.id===u(Z))||{}:u(X)&&u(q).find(e=>e.id===u(X))||{}}function la(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 ua(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 oa()}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 oa(),$()!==t||st!==c)return;a&&(zn.set(t,a),M(er,a))}catch{if($()!==t||st!==c)return;i?(pa(t,i),so(t,i.messages),ga(t,i)):uo(),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=So(e).flatMap(e=>e.receipt?[e.receipt]:[]).sort((e,t)=>fo(e)-fo(t)),i=fo(t.messages.at(-1));if(!t.has_newer)for(let e of r)fo(e)===i+1&&(t={...t,messages:[...t.messages,e]},i=fo(e));r.some(e=>fo(e)>i)&&(t={...t,has_newer:!0});let a=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)),so(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=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&&po(Q.root,e)&&t.add(Q.root.id),u(cr)&&po(u(cr),e)&&t.add(u(cr).id);for(let n of u(Ye))(n.status===`pending`||n.status===`failed`)&&po(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`),oo();let i=!1;try{await Vn.run(()=>G(la(`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 ia();return}Hn.add(r),Kn=!1,va(`newer`,`loading`);let i=!1;try{await Vn.run(()=>G(la(`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 ia();return}await Vn.run(()=>G(la(`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(!po(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:io(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:io(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?io(i.created_at):``}function io(e){let t=new Date(e);return Number.isNaN(t.getTime())?``:new Intl.DateTimeFormat(void 0,{hour:`numeric`,minute:`2-digit`}).format(t)}function oo(){if(!u($n)||!u(Rn))return;let e=u(Rn).captureState();e&&zn.set(u($n),e)}function so(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=So(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 co(e){uo(Vn.updateMessage(e))}function lo(e){uo(Vn.updateAuthor(e))}function uo(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`):so(t,r)}function fo(e){return e?.channel_seq||0}function po(e,t){return t?e.channel_id===t||e.direct_conversation_id===t:!1}async function mo(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 oa(n),await mo(n),!n())return;u(Jn)||La({all:!0}),await mo(n)}catch(t){n()&&(M(Lt,{kind:`error`,text:xe(t,`Could not jump to latest messages`)}),e&&await mo(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=Lo(e),i=r?Ro(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 zo(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?xo(e):`${t} failed`}),u(Jt).trim()||M(Jt,r)}}function xo(e){try{let t=JSON.parse(e.message);if(t&&typeof t.error==`string`&&t.error)return t.error}catch{}return e.message}function So(e){return[...lt.values()].filter(({draft:t})=>t.viewKey===e&&(!u(ot)||t.topicID===u(ot)))}async function Co(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 oa(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}uo(),M(Lt,{kind:`error`,text:a?`${n} The unfiltered timeline could not reload.`:n}),await mo(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=_o(a,e,s),f={draft:e,message:d,receipt:lt.get(a)?.receipt};lt.set(a,f),$()===e.viewKey&&c&&(uo(),t||mo());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 Co(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?uo():lt.delete(a)}catch(t){console.warn(`send failed`,t),await Co(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 To(e){if(!e.nonce)return;let t=lt.get(e.nonce)?.draft;t&&wo(t,e.nonce,e.id)}function Eo(e){if(!e.nonce)return;let t=lt.get(e.nonce);t?.receipt?t.message={...t.receipt,nonce:e.nonce}:lt.delete(e.nonce),uo()}async function Do(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 No(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){co(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),co(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 jo(e){Tr++,hs(),M(dt,!1),await No(e.id,e)&&u(Y)&&Q.root?.route_id&&await bi(u(Y),Q.root.id)}async function No(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 Io(e=[]){let t=Q.root;t&&(Ie.seedMessages(e),Le.reconcile($(),[t,...Q.replies]),co({id:t.id,thread_state:t.thread_state}))}async function Bo(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]),co(t)})}async function ts(e,t){(u(Ye).some(t=>t.id===e)||Vn.pending)&&await Vn.run(()=>G(`/api/messages/${e}`),e=>co(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=na();if(u(Rn)?.scrollToMessage(t)??!1){await ds(t,n);return}let r=await G(`/api/messages/${t}`);n()&&po(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 No(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([Ji(e),Yi(e,!0)]);return}if(Ie.clear(),await Promise.all([pi(),Ui(!1,!1,!1),Cs(e),Ki(e),Ji(e),Yi(e,!0),Wi(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)&&Yi(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 Ui(!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 Ki(),await Ui(!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 ia()}return}e.workspace_id===u(Y)&&e.payload.topic_id&&!u(He).some(t=>t.id===e.payload.topic_id)&&await Wi(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,_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 Bo(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(),Ki(),Ji(),Yi()]),qi(),lo({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),Ki(e.workspace_id),Ji(e.workspace_id),Yi(e.workspace_id)]),qi(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&&(Ii(),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)&&Ki())}function Gs(e){e.key===`Enter`&&!e.shiftKey&&(e.preventDefault(),vo())}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),Si();return}Ii(),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 No(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(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(),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:()=>as()||u(or),messageInput:u(ur),replyInput:u(dr),target:os})}}function oc(){u(qr)&&u(Kr).has(u(qr).id)||u(bn)||(Ii(),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),()=>{Xi(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,Po(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)&&xi(Ne(),Pe())}),re(),ie();var lc=s();r(`1oa2eo8`,e=>{var t=Vo();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=es(),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)));yo(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=Ho();p(e,t)};P(g,e=>{u(or)?e(_):e(v,-1)}),t(h);var y=k(h,2),S=e=>{var t=Uo();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:Li,onWorkspaceName:e=>M(Yt,e),onCreateWorkspace:()=>void Bi()})}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)));Mi(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:Ri,onSelectDirect:e=>void Ts(e),onCreateDirect:zi,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)));Mo(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=Wo(),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 ua(``)),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:Gi,onInlineImagePointerUp:Qs,onOpenProfile:Ws,onReply:is,onOpenThread:jo,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:To,onDiscard:Eo,onDeleteMessage:ko,get editController(){return Le},get editScope(){return u(tr)},onMessageEdited:Oo,get topics(){return u(He)},onSelectTopic:e=>void ua(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=Go(),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=Go(),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=qo(),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:Gi,onInputRef:e=>M(ur,e),onUploadFile:Ss,onRemoveUpload:xs,onClearReply:ss})}t(fe),t(ne);var Fe=k(ne,2),ze=e=>{var n=Yo();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);aa(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=$o();let i;var o=I(r),s=e=>{Hi(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),ua(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: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 cs(e),onOpenImage:qs,onOpenArtifact:Js})}},l=e=>{var r=Qo(),i=ce(r),o=k(I(i),2);t(i);var s=k(i,2),c=e=>{var t=Xo(),r=ce(t),i=D(r,!0),o=k(r,2);N(()=>d(i,(a(),b(()=>a().error)))),n(`click`,o,()=>a().selection&&void No(a().selection.messageID)),p(e,t)},l=e=>{var t=Zo();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=>{ao(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);ro(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=>{da(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{Bo as n,ts 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.B01dN3Y3.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.B01dN3Y3.js index ba1ca65a0..ea74565d8 100644 --- a/apps/api/internal/webassets/dist/_app/immutable/entry/app.DxtUHBGv.js +++ b/apps/api/internal/webassets/dist/_app/immutable/entry/app.B01dN3Y3.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.DNBxx-Ro.js","../chunks/uBIymjUX.js","../chunks/Cbo1iWSZ.js","../nodes/4.Dm2A-e2p.js","../chunks/BgeFVQgV.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.C-PBhhsU.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.CGeSIvDi.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.DNBxx-Ro.js`),__vite__mapDeps([15,1,2,16,5,17]),import.meta.url),()=>T(()=>import(`../nodes/4.Dm2A-e2p.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.C-PBhhsU.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.CGeSIvDi.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.CGeSIvDi.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.CGeSIvDi.js index a83161462..bda250389 100644 --- a/apps/api/internal/webassets/dist/_app/immutable/nodes/11.7x9MvaTq.js +++ b/apps/api/internal/webassets/dist/_app/immutable/nodes/11.CGeSIvDi.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/BgeFVQgV.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.DNBxx-Ro.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.DNBxx-Ro.js index f0854b74b..e0262263c 100644 --- a/apps/api/internal/webassets/dist/_app/immutable/nodes/3.BgwcTYGi.js +++ b/apps/api/internal/webassets/dist/_app/immutable/nodes/3.DNBxx-Ro.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/BgeFVQgV.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/BgeFVQgV.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.Dm2A-e2p.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.Dm2A-e2p.js index bff683f05..7ccb828eb 100644 --- a/apps/api/internal/webassets/dist/_app/immutable/nodes/4.hPm7AisK.js +++ b/apps/api/internal/webassets/dist/_app/immutable/nodes/4.Dm2A-e2p.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/BgeFVQgV.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.C-PBhhsU.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.C-PBhhsU.js index 280eca75a..1325b3908 100644 --- a/apps/api/internal/webassets/dist/_app/immutable/nodes/5.DxwA2zRh.js +++ b/apps/api/internal/webassets/dist/_app/immutable/nodes/5.C-PBhhsU.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/BgeFVQgV.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..f812892d4 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.B01dN3Y3.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..14061658d 100644 --- a/apps/web/src/components/navigation/Sidebar.svelte +++ b/apps/web/src/components/navigation/Sidebar.svelte @@ -1,6 +1,13 @@