diff --git a/CHANGELOG.md b/CHANGELOG.md index d32e6f07..83fd6630 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ ## Unreleased +- Added bot-scoped durable agent commentary and tool activity, collapsed into per-turn preambles with independent visibility controls and configurable self-message alignment. Thanks @ragesaq. - Added persistent thread activity counts and row-click thread opening in channel and DM timelines, with live summary refreshes. Thanks @PollyBot13. - Added per-user DM closing with durable history, direct-link access, Undo, canonical one-to-one reopening, and automatic resurfacing on new messages. Thanks @PollyBot13. - Kept self-hosted landing-page App links on the instance-local `/app` route for Tailscale, LAN, and custom hostnames instead of redirecting to the hosted app. Thanks @iXandru for the report and @TurboTheTurtle for the fix. diff --git a/apps/api/internal/httpapi/agent_activity_test.go b/apps/api/internal/httpapi/agent_activity_test.go new file mode 100644 index 00000000..c4dae6c8 --- /dev/null +++ b/apps/api/internal/httpapi/agent_activity_test.go @@ -0,0 +1,228 @@ +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" +) + +// TestAgentActivityMessageAuthz is the authorization gate for durable agent +// activity messages (kind = agent_commentary / agent_tool). It mirrors the +// authz matrix that previously guarded the ephemeral agent.progress frame, but +// now the activity rows are durable messages on the normal create path: +// +// - a human session can never create an activity-kind message (403), +// - an activity kind requires a BOT token carrying agent_activity:write; a +// bot:write token MUST NOT inherit it (403, no bundle inheritance), +// - an unknown kind is a 400, +// - a scoped bot can create both activity kinds (success), +// - an ordinary message is unaffected for any caller with messages:write. +func TestAgentActivityMessageAuthz(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", "owner@example.com") + if err != nil { + t.Fatal(err) + } + workspaces, err := st.ListWorkspaces(ctx, owner.ID) + if err != nil { + t.Fatal(err) + } + workspace := workspaces[0] + channels, err := st.ListChannels(ctx, workspace.ID, owner.ID) + if err != nil { + t.Fatal(err) + } + channel := channels[0] + + // A bridge bot WITH the explicit activity scope. + activityBot, activityToken, err := st.CreateBot(ctx, store.CreateBotInput{ + WorkspaceID: workspace.ID, + OwnerUserID: owner.ID, + DisplayName: "Activity Bot", + Scopes: []string{"bot:write", store.AgentActivityWriteScope}, + CreatedBy: owner.ID, + }) + if err != nil { + t.Fatal(err) + } + if err := st.AddWorkspaceMember(ctx, workspace.ID, activityBot.ID, "bot"); err != nil { + t.Fatal(err) + } + + // A bridge bot WITHOUT the activity scope (bot:write only). Per the + // no-inheritance rule this must NOT gain agent_activity:write. + writeBot, writeToken, err := st.CreateBot(ctx, store.CreateBotInput{ + WorkspaceID: workspace.ID, + OwnerUserID: owner.ID, + DisplayName: "Write Bot", + Scopes: []string{"bot:write"}, + CreatedBy: owner.ID, + }) + if err != nil { + t.Fatal(err) + } + if err := st.AddWorkspaceMember(ctx, workspace.ID, writeBot.ID, "bot"); err != nil { + t.Fatal(err) + } + + server := httptest.NewServer(New(st, realtime.NewHub(), Options{UploadDir: filepath.Join(dataDir, "uploads")}).Handler()) + t.Cleanup(server.Close) + endpoint := server.URL + "/api/channels/" + channel.ID + "/messages" + + commentary := `{"body":"thinking about it","kind":"agent_commentary","turn_id":"t1"}` + toolFrame := `{"body":"ran bash","kind":"agent_tool","turn_id":"t1"}` + unknownKind := `{"body":"nope","kind":"agent_bogus"}` + ordinary := `{"body":"hello channel"}` + + // 1. Human (dev-auth) session cannot create an activity-kind message. + expectStatusAsUser(t, owner.ID, http.MethodPost, endpoint, strings.NewReader(commentary), http.StatusForbidden) + + // 2. bot:write WITHOUT agent_activity:write is rejected (no inheritance). + expectStatusWithBearer(t, writeToken.Token, http.MethodPost, endpoint, strings.NewReader(commentary), http.StatusForbidden) + + // 3. Unknown kind is a 400, regardless of scope. + expectStatusWithBearer(t, activityToken.Token, http.MethodPost, endpoint, strings.NewReader(unknownKind), http.StatusBadRequest) + + // 4. Scoped bot can create both activity kinds. + expectStatusWithBearer(t, activityToken.Token, http.MethodPost, endpoint, strings.NewReader(commentary), http.StatusCreated) + expectStatusWithBearer(t, activityToken.Token, http.MethodPost, endpoint, strings.NewReader(toolFrame), http.StatusCreated) + + // 5. Ordinary messages are unaffected for any messages:write caller. + expectStatusAsUser(t, owner.ID, http.MethodPost, endpoint, strings.NewReader(ordinary), http.StatusCreated) + expectStatusWithBearer(t, writeToken.Token, http.MethodPost, endpoint, strings.NewReader(ordinary), http.StatusCreated) +} + +// TestAgentActivityMessagePrivacy proves a durable activity message inherits the +// same membership privacy as any channel message: a user who is not a member of +// the workspace cannot read the channel that holds it (the activity row never +// leaks to a non-member). +func TestAgentActivityMessagePrivacy(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", "owner@example.com") + if err != nil { + t.Fatal(err) + } + workspaces, err := st.ListWorkspaces(ctx, owner.ID) + if err != nil { + t.Fatal(err) + } + workspace := workspaces[0] + channels, err := st.ListChannels(ctx, workspace.ID, owner.ID) + if err != nil { + t.Fatal(err) + } + channel := channels[0] + + // Seed a durable activity message in the channel via the store directly. + activity, _, err := st.CreateMessage(ctx, store.CreateMessageInput{ChannelID: channel.ID, AuthorID: owner.ID, Body: "private commentary", Kind: store.MessageKindAgentCommentary, TurnID: "t1"}) + if err != nil { + t.Fatal(err) + } + + // A user who is NOT a member of the workspace. + stranger, err := st.CreateUser(ctx, store.CreateUserInput{DisplayName: "Stranger", Email: "stranger@example.com"}) + if err != nil { + t.Fatal(err) + } + + server := httptest.NewServer(New(st, realtime.NewHub(), Options{UploadDir: filepath.Join(dataDir, "uploads")}).Handler()) + t.Cleanup(server.Close) + + // The non-member cannot list the channel's messages or fetch the activity + // row by id: the store's membership check denies access (surfaced as a 4xx), + // so the activity body never reaches a non-member. + expectStatusNot2xxAsUser(t, stranger.ID, http.MethodGet, server.URL+"/api/channels/"+channel.ID+"/messages") + expectStatusNot2xxAsUser(t, stranger.ID, http.MethodGet, server.URL+"/api/messages/"+activity.ID) + // The owner (a member) can read it. + expectStatusAsUser(t, owner.ID, http.MethodGet, server.URL+"/api/messages/"+activity.ID, nil, http.StatusOK) +} + +// expectStatusNot2xxAsUser asserts a dev-auth request as userID is rejected with +// a non-2xx status (the exact 400-vs-403 mapping is an internal detail; the +// privacy invariant is simply that the caller is denied). +func expectStatusNot2xxAsUser(t *testing.T, userID, method, endpoint string) { + t.Helper() + req, err := http.NewRequest(method, endpoint, nil) + if err != nil { + t.Fatal(err) + } + req.Header.Set("X-ClickClack-User", userID) + resp, err := http.DefaultClient.Do(req) + if err != nil { + t.Fatal(err) + } + defer resp.Body.Close() + if resp.StatusCode < 400 { + t.Fatalf("%s %s as %s: expected a denial (>=400), got %s", method, endpoint, userID, resp.Status) + } +} + +// TestAgentActivityScopeExcludedFromBotBundles asserts the new scope is NOT part +// of any bot:* bundle, so existing deployments that minted bot:read/write/admin +// tokens gain no new capability. +func TestAgentActivityScopeExcludedFromBotBundles(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", "owner@example.com") + if err != nil { + t.Fatal(err) + } + workspaces, err := st.ListWorkspaces(ctx, owner.ID) + if err != nil { + t.Fatal(err) + } + workspace := workspaces[0] + for _, bundle := range []string{"bot:read", "bot:write", "bot:admin"} { + _, token, err := st.CreateBot(ctx, store.CreateBotInput{ + WorkspaceID: workspace.ID, + OwnerUserID: owner.ID, + DisplayName: "Bundle Bot " + bundle, + Scopes: []string{bundle}, + CreatedBy: owner.ID, + }) + if err != nil { + t.Fatalf("create bot for %s: %v", bundle, err) + } + for _, scope := range token.Scopes { + if scope == store.AgentActivityWriteScope { + t.Fatalf("%s bundle unexpectedly granted %s", bundle, store.AgentActivityWriteScope) + } + } + } +} diff --git a/apps/api/internal/httpapi/features.go b/apps/api/internal/httpapi/features.go index 39cfcc46..5cd5dcc4 100644 --- a/apps/api/internal/httpapi/features.go +++ b/apps/api/internal/httpapi/features.go @@ -921,6 +921,8 @@ func (s *Server) createDirectMessage(w http.ResponseWriter, r *http.Request) { Body string `json:"body"` QuotedMessageID string `json:"quoted_message_id"` Nonce string `json:"nonce"` + Kind string `json:"kind"` + TurnID string `json:"turn_id"` } if err := readJSON(w, r, &body); err != nil { writeError(w, http.StatusBadRequest, err) @@ -930,13 +932,19 @@ func (s *Server) createDirectMessage(w http.ResponseWriter, r *http.Request) { writeError(w, http.StatusForbidden, err) return } + kind, turnID, ok := s.resolveMessageKind(w, act, body.Kind, body.TurnID) + if !ok { + return + } if !s.requireBotDirectWorkspace(w, r, act, chi.URLParam(r, "conversation_id")) { return } - message, event, err := s.store.CreateDirectMessage(r.Context(), store.CreateDirectMessageInput{ConversationID: chi.URLParam(r, "conversation_id"), AuthorID: act.user.ID, Body: body.Body, QuotedMessageID: optionalString(body.QuotedMessageID), Nonce: body.Nonce}) + message, event, err := s.store.CreateDirectMessage(r.Context(), store.CreateDirectMessageInput{ConversationID: chi.URLParam(r, "conversation_id"), AuthorID: act.user.ID, Body: body.Body, QuotedMessageID: optionalString(body.QuotedMessageID), Nonce: body.Nonce, Kind: kind, TurnID: turnID}) if err == nil && event.ID != "" { s.publishEvent(r.Context(), event) - s.notifyMessageCreated(r.Context(), message) + if !store.IsActivityMessageKind(message.Kind) { + s.notifyMessageCreated(r.Context(), message) + } } writeMessageCreateResult(w, message, event, err) } diff --git a/apps/api/internal/httpapi/server.go b/apps/api/internal/httpapi/server.go index 1fbbcbad..cee2965e 100644 --- a/apps/api/internal/httpapi/server.go +++ b/apps/api/internal/httpapi/server.go @@ -609,22 +609,69 @@ func (s *Server) createMessage(w http.ResponseWriter, r *http.Request) { QuotedMessageID string `json:"quoted_message_id"` Nonce string `json:"nonce"` TopicID string `json:"topic_id"` + Kind string `json:"kind"` + TurnID string `json:"turn_id"` } if err := readJSON(w, r, &body); err != nil { writeError(w, http.StatusBadRequest, err) return } + kind, turnID, ok := s.resolveMessageKind(w, act, body.Kind, body.TurnID) + if !ok { + return + } if !s.requireBotChannelWorkspace(w, r, act, chi.URLParam(r, "channel_id")) { return } - message, event, err := s.store.CreateMessage(r.Context(), store.CreateMessageInput{ChannelID: chi.URLParam(r, "channel_id"), AuthorID: act.user.ID, Body: body.Body, QuotedMessageID: optionalString(body.QuotedMessageID), Nonce: body.Nonce, TopicID: body.TopicID}) + message, event, err := s.store.CreateMessage(r.Context(), store.CreateMessageInput{ChannelID: chi.URLParam(r, "channel_id"), AuthorID: act.user.ID, Body: body.Body, QuotedMessageID: optionalString(body.QuotedMessageID), Nonce: body.Nonce, TopicID: body.TopicID, Kind: kind, TurnID: turnID}) if err == nil && event.ID != "" { s.publishEvent(r.Context(), event) - s.notifyMessageCreated(r.Context(), message) + if !store.IsActivityMessageKind(message.Kind) { + s.notifyMessageCreated(r.Context(), message) + } } writeMessageCreateResult(w, message, event, err) } +// resolveMessageKind validates a caller-supplied message kind and turn_id and +// enforces the activity authorization contract: +// +// - an empty/'message' kind is always allowed and returned as 'message', +// - an unknown kind is a 400, +// - an ordinary 'message' MUST NOT carry a turn_id (400); turn_id correlates +// agent activity rows only, so a non-empty value on an ordinary message is +// a client contract violation and fails closed, +// - an activity kind (agent_commentary/agent_tool) requires a BOT token that +// carries agent_activity:write; a human session always gets 403 and a bot +// without the scope gets 403, and may carry a turn_id. +// +// It writes the error response itself and returns ok=false when the request +// must not proceed. On success it returns the normalized kind and the turn_id +// that should be persisted. +func (s *Server) resolveMessageKind(w http.ResponseWriter, act actor, rawKind, rawTurnID string) (string, string, bool) { + kind, err := store.NormalizeMessageKind(rawKind) + if err != nil { + writeError(w, http.StatusBadRequest, err) + return "", "", false + } + if !store.IsActivityMessageKind(kind) { + if rawTurnID != "" { + writeError(w, http.StatusBadRequest, store.ErrTurnIDNotAllowed) + return "", "", false + } + return kind, "", true + } + if act.botTokenID == "" { + writeError(w, http.StatusForbidden, errors.New("agent activity messages require a bot token")) + return "", "", false + } + if err := act.requireScope(store.AgentActivityWriteScope); err != nil { + writeError(w, http.StatusForbidden, err) + return "", "", false + } + return kind, rawTurnID, true +} + func (s *Server) getMessage(w http.ResponseWriter, r *http.Request) { act, err := s.currentActor(r) if err != nil { diff --git a/apps/api/internal/store/postgres/bots.go b/apps/api/internal/store/postgres/bots.go index 1ada5928..cb41e8e0 100644 --- a/apps/api/internal/store/postgres/bots.go +++ b/apps/api/internal/store/postgres/bots.go @@ -66,6 +66,11 @@ var botAllowedScopes = []string{ "realtime:read", "uploads:write", "profile:read", + // agent_activity:write is grantable but intentionally NOT part of any + // bot:* bundle. Durable agent activity is a distinct authorization surface + // and must be granted explicitly, so existing bot:* deployments gain no new + // capability. + store.AgentActivityWriteScope, } func (s *Store) CreateBot(ctx context.Context, input store.CreateBotInput) (store.User, store.BotToken, error) { diff --git a/apps/api/internal/store/postgres/dms.go b/apps/api/internal/store/postgres/dms.go index b560c899..84ef7e7c 100644 --- a/apps/api/internal/store/postgres/dms.go +++ b/apps/api/internal/store/postgres/dms.go @@ -270,12 +270,16 @@ func (s *Store) CreateDirectMessage(ctx context.Context, input store.CreateDirec if err != nil { return store.Message{}, store.Event{}, err } + kind, err := store.NormalizeMessageKind(input.Kind) + if err != nil { + return store.Message{}, store.Event{}, err + } var quotedID, quotedAuthorID, quotedSnapshot string if input.QuotedMessageID != nil { quotedID = strings.TrimSpace(*input.QuotedMessageID) } if existing, err := getMessageByClientNonceTx(ctx, tx, input.AuthorID, nonce); err == nil { - if existing.DirectConversationID != input.ConversationID || existing.ChannelID != "" || existing.ParentMessageID != nil || existing.Body != body || !sameQuotedMessageID(existing, quotedID) { + if existing.DirectConversationID != input.ConversationID || existing.ChannelID != "" || existing.ParentMessageID != nil || existing.Body != body || existing.Kind != kind || existing.TurnID != input.TurnID || !sameQuotedMessageID(existing, quotedID) { return store.Message{}, store.Event{}, store.ErrClientNonceConflict } return existing, store.Event{}, nil @@ -303,9 +307,11 @@ func (s *Store) CreateDirectMessage(ctx context.Context, input store.CreateDirec QuotedBodySnapshot: quotedSnapshot, QuotedAuthorID: sqlOptionalText(quotedAuthorID), ClientNonce: nonce, + Kind: kind, + TurnID: sqlOptionalText(input.TurnID), }); err != nil { if existing, lookupErr := getMessageByClientNonceTx(ctx, tx, input.AuthorID, nonce); lookupErr == nil { - if existing.DirectConversationID == input.ConversationID && existing.ChannelID == "" && existing.ParentMessageID == nil && existing.Body == body && sameQuotedMessageID(existing, quotedID) { + if existing.DirectConversationID == input.ConversationID && existing.ChannelID == "" && existing.ParentMessageID == nil && existing.Body == body && existing.Kind == kind && existing.TurnID == input.TurnID && sameQuotedMessageID(existing, quotedID) { return existing, store.Event{}, nil } return store.Message{}, store.Event{}, store.ErrClientNonceConflict @@ -322,7 +328,14 @@ func (s *Store) CreateDirectMessage(ctx context.Context, input store.CreateDirec if err != nil { return store.Message{}, store.Event{}, err } - event, err := insertEventWithRecipients(ctx, tx, workspaceID, "", "message.created", &seq, eventPayload(map[string]string{"message_id": id, "direct_conversation_id": input.ConversationID, "author_id": input.AuthorID}, nonce), recipients) + dmEventFields := map[string]string{"message_id": id, "direct_conversation_id": input.ConversationID, "author_id": input.AuthorID} + if kind != store.MessageKindMessage { + dmEventFields["kind"] = kind + } + if input.TurnID != "" { + dmEventFields["turn_id"] = input.TurnID + } + event, err := insertEventWithRecipients(ctx, tx, workspaceID, "", "message.created", &seq, eventPayload(dmEventFields, nonce), recipients) if err != nil { return store.Message{}, store.Event{}, err } diff --git a/apps/api/internal/store/postgres/helpers.go b/apps/api/internal/store/postgres/helpers.go index 84578dc3..758cbf14 100644 --- a/apps/api/internal/store/postgres/helpers.go +++ b/apps/api/internal/store/postgres/helpers.go @@ -51,7 +51,7 @@ func messageSelect() string { u.id, u.kind, u.owner_user_id, u.display_name, u.handle, u.avatar_url, u.created_at, m.quoted_message_id, m.quoted_body_snapshot, m.quoted_author_id, qu.id, qu.kind, qu.owner_user_id, qu.display_name, qu.handle, qu.avatar_url, qu.created_at, - m.client_nonce + m.client_nonce, m.kind, COALESCE(m.turn_id, '') FROM messages m JOIN users u ON u.id = m.author_id LEFT JOIN users qu ON qu.id = m.quoted_author_id` @@ -72,7 +72,7 @@ func scanMessage(row scanner) (store.Message, error) { &author.ID, &author.Kind, &authorOwnerID, &author.DisplayName, &author.Handle, &author.AvatarURL, &author.CreatedAt, "edMessageID, &m.QuotedBodySnapshot, "edAuthorID, &quAuthorID, &quKind, &quOwnerID, &quDisplayName, &quHandle, &quAvatarURL, &quCreatedAt, - &nonce, + &nonce, &m.Kind, &m.TurnID, ) if err != nil { return store.Message{}, err diff --git a/apps/api/internal/store/postgres/migrations/0011_agent_activity.sql b/apps/api/internal/store/postgres/migrations/0011_agent_activity.sql new file mode 100644 index 00000000..db187ca9 --- /dev/null +++ b/apps/api/internal/store/postgres/migrations/0011_agent_activity.sql @@ -0,0 +1,19 @@ +-- Durable agent activity messages (postgres mirror of sqlite 0017). +-- +-- Adds a message kind discriminator and an optional turn correlation id. See +-- the sqlite migration for the full rationale. Activity rows +-- ('agent_commentary', 'agent_tool') are excluded from the full-text search +-- index and from unread/notification paths; 'message' is the default. + +ALTER TABLE messages ADD COLUMN kind TEXT NOT NULL DEFAULT 'message'; +ALTER TABLE messages ADD COLUMN turn_id TEXT; + +CREATE INDEX IF NOT EXISTS idx_messages_turn ON messages(turn_id); + +-- Rebuild the search GIN index so activity rows are never indexed. The search +-- query also filters on kind = 'message', but keeping the index partial avoids +-- wasting space on rows that can never match. +DROP INDEX IF EXISTS idx_messages_search_fts; +CREATE INDEX idx_messages_search_fts ON messages + USING GIN (to_tsvector('simple', body)) + WHERE direct_conversation_id IS NULL AND channel_id IS NOT NULL AND deleted_at IS NULL AND kind = 'message'; diff --git a/apps/api/internal/store/postgres/postgres.go b/apps/api/internal/store/postgres/postgres.go index ff7a5fd0..9bd41a15 100644 --- a/apps/api/internal/store/postgres/postgres.go +++ b/apps/api/internal/store/postgres/postgres.go @@ -509,12 +509,16 @@ func (s *Store) CreateMessage(ctx context.Context, input store.CreateMessageInpu if err != nil { return store.Message{}, store.Event{}, err } + kind, err := store.NormalizeMessageKind(input.Kind) + if err != nil { + return store.Message{}, store.Event{}, err + } var quotedID, quotedAuthorID, quotedSnapshot string if input.QuotedMessageID != nil { quotedID = strings.TrimSpace(*input.QuotedMessageID) } if existing, err := getMessageByClientNonceTx(ctx, tx, input.AuthorID, nonce); err == nil { - if existing.ChannelID != input.ChannelID || existing.DirectConversationID != "" || existing.ParentMessageID != nil || existing.Body != body || existing.TopicID != input.TopicID || !sameQuotedMessageID(existing, quotedID) { + if existing.ChannelID != input.ChannelID || existing.DirectConversationID != "" || existing.ParentMessageID != nil || existing.Body != body || existing.TopicID != input.TopicID || existing.Kind != kind || existing.TurnID != input.TurnID || !sameQuotedMessageID(existing, quotedID) { return store.Message{}, store.Event{}, store.ErrClientNonceConflict } if err := requireMessageAccessTx(ctx, tx, existing, input.AuthorID); err != nil { @@ -549,9 +553,11 @@ func (s *Store) CreateMessage(ctx context.Context, input store.CreateMessageInpu QuotedBodySnapshot: quotedSnapshot, QuotedAuthorID: sqlOptionalText(quotedAuthorID), ClientNonce: nonce, + Kind: kind, + TurnID: sqlOptionalText(input.TurnID), }); err != nil { if existing, lookupErr := getMessageByClientNonceTx(ctx, tx, input.AuthorID, nonce); lookupErr == nil { - if existing.ChannelID == input.ChannelID && existing.DirectConversationID == "" && existing.ParentMessageID == nil && existing.Body == body && existing.TopicID == input.TopicID && sameQuotedMessageID(existing, quotedID) { + if existing.ChannelID == input.ChannelID && existing.DirectConversationID == "" && existing.ParentMessageID == nil && existing.Body == body && existing.TopicID == input.TopicID && existing.Kind == kind && existing.TurnID == input.TurnID && sameQuotedMessageID(existing, quotedID) { if err := requireMessageAccessTx(ctx, tx, existing, input.AuthorID); err != nil { return store.Message{}, store.Event{}, err } @@ -568,6 +574,12 @@ func (s *Store) CreateMessage(ctx context.Context, input store.CreateMessageInpu if input.TopicID != "" { eventFields["topic_id"] = input.TopicID } + if kind != store.MessageKindMessage { + eventFields["kind"] = kind + } + if input.TurnID != "" { + eventFields["turn_id"] = input.TurnID + } event, err := insertEvent(ctx, tx, workspaceID, input.ChannelID, "message.created", &seq, eventPayload(eventFields, nonce)) if err != nil { return store.Message{}, store.Event{}, err diff --git a/apps/api/internal/store/postgres/search.go b/apps/api/internal/store/postgres/search.go index 844882b0..e932e83d 100644 --- a/apps/api/internal/store/postgres/search.go +++ b/apps/api/internal/store/postgres/search.go @@ -58,6 +58,7 @@ func (s *Store) SearchMessages(ctx context.Context, workspaceID, channelID, user AND m.direct_conversation_id IS NULL AND m.channel_id IS NOT NULL AND m.deleted_at IS NULL + AND m.kind = 'message' `+guestWhere+` `+channelWhere+` ORDER BY rank DESC diff --git a/apps/api/internal/store/postgres/sqlc/queries.sql b/apps/api/internal/store/postgres/sqlc/queries.sql index 5ea3b361..d2ac8997 100644 --- a/apps/api/internal/store/postgres/sqlc/queries.sql +++ b/apps/api/internal/store/postgres/sqlc/queries.sql @@ -193,6 +193,7 @@ SELECT c.id, COALESCE(c.route_id, '') AS route_id, c.workspace_id, c.name, c.kin WHERE m.channel_id = c.id AND m.parent_message_id IS NULL AND m.author_id <> sqlc.arg(reader_user_id) + AND m.kind = 'message' AND m.channel_seq > COALESCE((SELECT cr2.last_read_seq FROM channel_reads cr2 WHERE cr2.channel_id = c.id AND cr2.user_id = sqlc.arg(reader_user_id)), 0) ), 0) AS BIGINT) AS unread_count FROM channels c @@ -458,6 +459,7 @@ SELECT dc.id, COALESCE(dc.route_id, '') AS route_id, dc.workspace_id, dc.created WHERE m.direct_conversation_id = dc.id AND m.parent_message_id IS NULL AND m.author_id <> sqlc.arg(reader_user_id) + AND m.kind = 'message' AND m.channel_seq > COALESCE((SELECT dr2.last_read_seq FROM direct_reads dr2 WHERE dr2.conversation_id = dc.id AND dr2.user_id = sqlc.arg(reader_user_id)), 0) ), 0) AS BIGINT) AS unread_count FROM direct_conversations dc @@ -482,6 +484,7 @@ SELECT dc.id, COALESCE(dc.route_id, '') AS route_id, dc.workspace_id, dc.created WHERE m.direct_conversation_id = dc.id AND m.parent_message_id IS NULL AND m.author_id <> sqlc.arg(reader_user_id) + AND m.kind = 'message' AND m.channel_seq > COALESCE((SELECT dr2.last_read_seq FROM direct_reads dr2 WHERE dr2.conversation_id = dc.id AND dr2.user_id = sqlc.arg(reader_user_id)), 0) ), 0) AS BIGINT) AS unread_count FROM direct_conversations dc @@ -565,12 +568,12 @@ WHERE dcm.conversation_id = sqlc.arg(conversation_id) ORDER BY u.display_name; -- name: InsertChannelMessage :exec -INSERT INTO messages (id, workspace_id, channel_id, direct_conversation_id, author_id, parent_message_id, thread_root_id, topic_id, channel_seq, thread_seq, body, body_format, created_at, quoted_message_id, quoted_body_snapshot, quoted_author_id, client_nonce) -VALUES (sqlc.arg(id), sqlc.arg(workspace_id), sqlc.arg(channel_id), NULL, sqlc.arg(author_id), NULL, sqlc.arg(thread_root_id), sqlc.arg(topic_id), sqlc.arg(channel_seq), NULL, sqlc.arg(body), 'markdown', sqlc.arg(created_at), sqlc.arg(quoted_message_id), sqlc.arg(quoted_body_snapshot), sqlc.arg(quoted_author_id), sqlc.arg(client_nonce)); +INSERT INTO messages (id, workspace_id, channel_id, direct_conversation_id, author_id, parent_message_id, thread_root_id, topic_id, channel_seq, thread_seq, body, body_format, created_at, quoted_message_id, quoted_body_snapshot, quoted_author_id, client_nonce, kind, turn_id) +VALUES (sqlc.arg(id), sqlc.arg(workspace_id), sqlc.arg(channel_id), NULL, sqlc.arg(author_id), NULL, sqlc.arg(thread_root_id), sqlc.arg(topic_id), sqlc.arg(channel_seq), NULL, sqlc.arg(body), 'markdown', sqlc.arg(created_at), sqlc.arg(quoted_message_id), sqlc.arg(quoted_body_snapshot), sqlc.arg(quoted_author_id), sqlc.arg(client_nonce), sqlc.arg(kind), sqlc.arg(turn_id)); -- name: InsertDirectMessage :exec -INSERT INTO messages (id, workspace_id, channel_id, direct_conversation_id, author_id, parent_message_id, thread_root_id, channel_seq, thread_seq, body, body_format, created_at, quoted_message_id, quoted_body_snapshot, quoted_author_id, client_nonce) -VALUES (sqlc.arg(id), sqlc.arg(workspace_id), NULL, sqlc.arg(direct_conversation_id), sqlc.arg(author_id), NULL, sqlc.arg(thread_root_id), sqlc.arg(channel_seq), NULL, sqlc.arg(body), 'markdown', sqlc.arg(created_at), sqlc.arg(quoted_message_id), sqlc.arg(quoted_body_snapshot), sqlc.arg(quoted_author_id), sqlc.arg(client_nonce)); +INSERT INTO messages (id, workspace_id, channel_id, direct_conversation_id, author_id, parent_message_id, thread_root_id, channel_seq, thread_seq, body, body_format, created_at, quoted_message_id, quoted_body_snapshot, quoted_author_id, client_nonce, kind, turn_id) +VALUES (sqlc.arg(id), sqlc.arg(workspace_id), NULL, sqlc.arg(direct_conversation_id), sqlc.arg(author_id), NULL, sqlc.arg(thread_root_id), sqlc.arg(channel_seq), NULL, sqlc.arg(body), 'markdown', sqlc.arg(created_at), sqlc.arg(quoted_message_id), sqlc.arg(quoted_body_snapshot), sqlc.arg(quoted_author_id), sqlc.arg(client_nonce), sqlc.arg(kind), sqlc.arg(turn_id)); -- name: InsertThreadState :exec INSERT INTO thread_state (root_message_id) diff --git a/apps/api/internal/store/postgres/sqlc/schema.sql b/apps/api/internal/store/postgres/sqlc/schema.sql index 6ed39960..cb7e8061 100644 --- a/apps/api/internal/store/postgres/sqlc/schema.sql +++ b/apps/api/internal/store/postgres/sqlc/schema.sql @@ -127,7 +127,9 @@ CREATE TABLE messages ( quoted_body_snapshot TEXT NOT NULL DEFAULT '', quoted_author_id TEXT REFERENCES users(id) ON DELETE SET NULL, client_nonce TEXT NOT NULL DEFAULT '', - route_id TEXT + route_id TEXT, + kind TEXT NOT NULL DEFAULT 'message', + turn_id TEXT ); CREATE INDEX idx_messages_channel_seq ON messages(channel_id, channel_seq); @@ -147,7 +149,7 @@ CREATE UNIQUE INDEX idx_messages_thread_unique_seq ON messages(thread_root_id, t WHERE parent_message_id IS NOT NULL AND thread_seq IS NOT NULL; CREATE INDEX idx_messages_search_fts ON messages USING GIN (to_tsvector('simple', body)) - WHERE direct_conversation_id IS NULL AND channel_id IS NOT NULL AND deleted_at IS NULL; + WHERE direct_conversation_id IS NULL AND channel_id IS NOT NULL AND deleted_at IS NULL AND kind = 'message'; CREATE TABLE thread_state ( root_message_id TEXT PRIMARY KEY REFERENCES messages(id) ON DELETE CASCADE, diff --git a/apps/api/internal/store/postgres/storedb/models.go b/apps/api/internal/store/postgres/storedb/models.go index ab8da222..9603ad52 100644 --- a/apps/api/internal/store/postgres/storedb/models.go +++ b/apps/api/internal/store/postgres/storedb/models.go @@ -196,6 +196,8 @@ type Message struct { QuotedAuthorID sql.NullString `json:"quoted_author_id"` ClientNonce string `json:"client_nonce"` RouteID sql.NullString `json:"route_id"` + Kind string `json:"kind"` + TurnID sql.NullString `json:"turn_id"` } type MessageAttachment struct { diff --git a/apps/api/internal/store/postgres/storedb/queries.sql.go b/apps/api/internal/store/postgres/storedb/queries.sql.go index c14241f2..ab349d1a 100644 --- a/apps/api/internal/store/postgres/storedb/queries.sql.go +++ b/apps/api/internal/store/postgres/storedb/queries.sql.go @@ -724,6 +724,7 @@ SELECT dc.id, COALESCE(dc.route_id, '') AS route_id, dc.workspace_id, dc.created WHERE m.direct_conversation_id = dc.id AND m.parent_message_id IS NULL AND m.author_id <> $1 + AND m.kind = 'message' AND m.channel_seq > COALESCE((SELECT dr2.last_read_seq FROM direct_reads dr2 WHERE dr2.conversation_id = dc.id AND dr2.user_id = $1), 0) ), 0) AS BIGINT) AS unread_count FROM direct_conversations dc @@ -1272,8 +1273,8 @@ func (q *Queries) InsertChannel(ctx context.Context, arg InsertChannelParams) er } const insertChannelMessage = `-- name: InsertChannelMessage :exec -INSERT INTO messages (id, workspace_id, channel_id, direct_conversation_id, author_id, parent_message_id, thread_root_id, topic_id, channel_seq, thread_seq, body, body_format, created_at, quoted_message_id, quoted_body_snapshot, quoted_author_id, client_nonce) -VALUES ($1, $2, $3, NULL, $4, NULL, $5, $6, $7, NULL, $8, 'markdown', $9, $10, $11, $12, $13) +INSERT INTO messages (id, workspace_id, channel_id, direct_conversation_id, author_id, parent_message_id, thread_root_id, topic_id, channel_seq, thread_seq, body, body_format, created_at, quoted_message_id, quoted_body_snapshot, quoted_author_id, client_nonce, kind, turn_id) +VALUES ($1, $2, $3, NULL, $4, NULL, $5, $6, $7, NULL, $8, 'markdown', $9, $10, $11, $12, $13, $14, $15) ` type InsertChannelMessageParams struct { @@ -1290,6 +1291,8 @@ type InsertChannelMessageParams struct { QuotedBodySnapshot string `json:"quoted_body_snapshot"` QuotedAuthorID sql.NullString `json:"quoted_author_id"` ClientNonce string `json:"client_nonce"` + Kind string `json:"kind"` + TurnID sql.NullString `json:"turn_id"` } func (q *Queries) InsertChannelMessage(ctx context.Context, arg InsertChannelMessageParams) error { @@ -1307,6 +1310,8 @@ func (q *Queries) InsertChannelMessage(ctx context.Context, arg InsertChannelMes arg.QuotedBodySnapshot, arg.QuotedAuthorID, arg.ClientNonce, + arg.Kind, + arg.TurnID, ) return err } @@ -1401,8 +1406,8 @@ func (q *Queries) InsertDirectConversationMember(ctx context.Context, arg Insert } const insertDirectMessage = `-- name: InsertDirectMessage :exec -INSERT INTO messages (id, workspace_id, channel_id, direct_conversation_id, author_id, parent_message_id, thread_root_id, channel_seq, thread_seq, body, body_format, created_at, quoted_message_id, quoted_body_snapshot, quoted_author_id, client_nonce) -VALUES ($1, $2, NULL, $3, $4, NULL, $5, $6, NULL, $7, 'markdown', $8, $9, $10, $11, $12) +INSERT INTO messages (id, workspace_id, channel_id, direct_conversation_id, author_id, parent_message_id, thread_root_id, channel_seq, thread_seq, body, body_format, created_at, quoted_message_id, quoted_body_snapshot, quoted_author_id, client_nonce, kind, turn_id) +VALUES ($1, $2, NULL, $3, $4, NULL, $5, $6, NULL, $7, 'markdown', $8, $9, $10, $11, $12, $13, $14) ` type InsertDirectMessageParams struct { @@ -1418,6 +1423,8 @@ type InsertDirectMessageParams struct { QuotedBodySnapshot string `json:"quoted_body_snapshot"` QuotedAuthorID sql.NullString `json:"quoted_author_id"` ClientNonce string `json:"client_nonce"` + Kind string `json:"kind"` + TurnID sql.NullString `json:"turn_id"` } func (q *Queries) InsertDirectMessage(ctx context.Context, arg InsertDirectMessageParams) error { @@ -1434,6 +1441,8 @@ func (q *Queries) InsertDirectMessage(ctx context.Context, arg InsertDirectMessa arg.QuotedBodySnapshot, arg.QuotedAuthorID, arg.ClientNonce, + arg.Kind, + arg.TurnID, ) return err } @@ -1782,6 +1791,7 @@ SELECT c.id, COALESCE(c.route_id, '') AS route_id, c.workspace_id, c.name, c.kin WHERE m.channel_id = c.id AND m.parent_message_id IS NULL AND m.author_id <> $1 + AND m.kind = 'message' AND m.channel_seq > COALESCE((SELECT cr2.last_read_seq FROM channel_reads cr2 WHERE cr2.channel_id = c.id AND cr2.user_id = $1), 0) ), 0) AS BIGINT) AS unread_count FROM channels c @@ -1851,6 +1861,7 @@ SELECT dc.id, COALESCE(dc.route_id, '') AS route_id, dc.workspace_id, dc.created WHERE m.direct_conversation_id = dc.id AND m.parent_message_id IS NULL AND m.author_id <> $1 + AND m.kind = 'message' AND m.channel_seq > COALESCE((SELECT dr2.last_read_seq FROM direct_reads dr2 WHERE dr2.conversation_id = dc.id AND dr2.user_id = $1), 0) ), 0) AS BIGINT) AS unread_count FROM direct_conversations dc diff --git a/apps/api/internal/store/sqlite/agent_activity_test.go b/apps/api/internal/store/sqlite/agent_activity_test.go new file mode 100644 index 00000000..2767fe71 --- /dev/null +++ b/apps/api/internal/store/sqlite/agent_activity_test.go @@ -0,0 +1,264 @@ +package sqlite + +import ( + "context" + "errors" + "testing" + + "github.com/openclaw/clickclack/apps/api/internal/store" +) + +// TestAgentActivityMessageKindRoundTrip verifies that the kind + turn_id columns +// added by migration 0017 survive an insert/read cycle, default to 'message', +// and reject unknown kinds. +func TestAgentActivityMessageKindRoundTrip(t *testing.T) { + t.Parallel() + ctx := context.Background() + st := newTestStore(t) + owner, err := st.EnsureBootstrap(ctx, "Owner", "owner@example.com") + if err != nil { + t.Fatal(err) + } + workspaces, err := st.ListWorkspaces(ctx, owner.ID) + if err != nil { + t.Fatal(err) + } + channels, err := st.ListChannels(ctx, workspaces[0].ID, owner.ID) + if err != nil { + t.Fatal(err) + } + channel := channels[0] + + // Default kind is 'message' with no turn id. + plain, _, err := st.CreateMessage(ctx, store.CreateMessageInput{ChannelID: channel.ID, AuthorID: owner.ID, Body: "ordinary"}) + if err != nil { + t.Fatal(err) + } + if plain.Kind != store.MessageKindMessage { + t.Fatalf("expected default kind %q, got %q", store.MessageKindMessage, plain.Kind) + } + if plain.TurnID != "" { + t.Fatalf("expected empty turn id for ordinary message, got %q", plain.TurnID) + } + + // Activity kinds round-trip with their turn id. + for _, kind := range []string{store.MessageKindAgentCommentary, store.MessageKindAgentTool} { + created, _, err := st.CreateMessage(ctx, store.CreateMessageInput{ChannelID: channel.ID, AuthorID: owner.ID, Body: "activity " + kind, Kind: kind, TurnID: "turn-1"}) + if err != nil { + t.Fatalf("create %s: %v", kind, err) + } + if created.Kind != kind { + t.Fatalf("expected kind %q, got %q", kind, created.Kind) + } + if created.TurnID != "turn-1" { + t.Fatalf("expected turn id to round-trip, got %q", created.TurnID) + } + fetched, err := st.GetMessage(ctx, created.ID, owner.ID) + if err != nil { + t.Fatalf("get %s: %v", kind, err) + } + if fetched.Kind != kind || fetched.TurnID != "turn-1" { + t.Fatalf("re-read lost kind/turn: %#v", fetched) + } + } + + // Unknown kinds are rejected. + if _, _, err := st.CreateMessage(ctx, store.CreateMessageInput{ChannelID: channel.ID, AuthorID: owner.ID, Body: "bad", Kind: "bogus"}); err != store.ErrInvalidMessageKind { + t.Fatalf("expected ErrInvalidMessageKind for unknown kind, got %v", err) + } +} + +func TestAgentActivityNonceReplayIncludesKindAndTurn(t *testing.T) { + t.Parallel() + ctx := context.Background() + st := newTestStore(t) + owner, err := st.EnsureBootstrap(ctx, "Owner", "owner@example.com") + if err != nil { + t.Fatal(err) + } + workspaces, err := st.ListWorkspaces(ctx, owner.ID) + if err != nil { + t.Fatal(err) + } + workspace := workspaces[0] + channels, err := st.ListChannels(ctx, workspace.ID, owner.ID) + if err != nil { + t.Fatal(err) + } + + channelInput := store.CreateMessageInput{ + ChannelID: channels[0].ID, + AuthorID: owner.ID, + Body: "same body", + Nonce: "channel-activity-nonce", + Kind: store.MessageKindAgentCommentary, + TurnID: "turn-1", + } + created, _, err := st.CreateMessage(ctx, channelInput) + if err != nil { + t.Fatal(err) + } + replayed, event, err := st.CreateMessage(ctx, channelInput) + if err != nil || replayed.ID != created.ID || event.ID != "" { + t.Fatalf("expected exact channel replay, got message=%#v event=%#v err=%v", replayed, event, err) + } + changedKind := channelInput + changedKind.Kind = store.MessageKindAgentTool + if _, _, err := st.CreateMessage(ctx, changedKind); !errors.Is(err, store.ErrClientNonceConflict) { + t.Fatalf("expected channel kind mismatch conflict, got %v", err) + } + changedTurn := channelInput + changedTurn.TurnID = "turn-2" + if _, _, err := st.CreateMessage(ctx, changedTurn); !errors.Is(err, store.ErrClientNonceConflict) { + t.Fatalf("expected channel turn mismatch conflict, got %v", err) + } + + other, err := st.CreateUser(ctx, store.CreateUserInput{DisplayName: "Other", Email: "other@example.com"}) + if err != nil { + t.Fatal(err) + } + if err := st.AddWorkspaceMember(ctx, workspace.ID, other.ID, "member"); err != nil { + t.Fatal(err) + } + dm, err := st.CreateDirectConversation(ctx, store.CreateDirectConversationInput{ + WorkspaceID: workspace.ID, + UserID: owner.ID, + MemberIDs: []string{other.ID}, + }) + if err != nil { + t.Fatal(err) + } + dmInput := store.CreateDirectMessageInput{ + ConversationID: dm.ID, + AuthorID: owner.ID, + Body: "same dm body", + Nonce: "dm-activity-nonce", + Kind: store.MessageKindAgentTool, + TurnID: "turn-dm-1", + } + dmCreated, _, err := st.CreateDirectMessage(ctx, dmInput) + if err != nil { + t.Fatal(err) + } + dmReplayed, dmEvent, err := st.CreateDirectMessage(ctx, dmInput) + if err != nil || dmReplayed.ID != dmCreated.ID || dmEvent.ID != "" { + t.Fatalf("expected exact DM replay, got message=%#v event=%#v err=%v", dmReplayed, dmEvent, err) + } + dmChangedKind := dmInput + dmChangedKind.Kind = store.MessageKindAgentCommentary + if _, _, err := st.CreateDirectMessage(ctx, dmChangedKind); !errors.Is(err, store.ErrClientNonceConflict) { + t.Fatalf("expected DM kind mismatch conflict, got %v", err) + } + dmChangedTurn := dmInput + dmChangedTurn.TurnID = "turn-dm-2" + if _, _, err := st.CreateDirectMessage(ctx, dmChangedTurn); !errors.Is(err, store.ErrClientNonceConflict) { + t.Fatalf("expected DM turn mismatch conflict, got %v", err) + } +} + +// TestAgentActivityMessagesExemptFromUnread verifies that durable agent activity +// rows authored by another member do not bump the reader's unread count, while +// an ordinary message from the same author does. +func TestAgentActivityMessagesExemptFromUnread(t *testing.T) { + t.Parallel() + ctx := context.Background() + st := newTestStore(t) + owner, err := st.EnsureBootstrap(ctx, "Owner", "owner@example.com") + if err != nil { + t.Fatal(err) + } + workspaces, err := st.ListWorkspaces(ctx, owner.ID) + if err != nil { + t.Fatal(err) + } + workspace := workspaces[0] + other, err := st.CreateUser(ctx, store.CreateUserInput{DisplayName: "Other", Email: "other@example.com"}) + if err != nil { + t.Fatal(err) + } + if err := st.AddWorkspaceMember(ctx, workspace.ID, other.ID, "member"); err != nil { + t.Fatal(err) + } + channels, err := st.ListChannels(ctx, workspace.ID, owner.ID) + if err != nil { + t.Fatal(err) + } + channel := channels[0] + + unreadFor := func(userID string) int64 { + t.Helper() + list, err := st.ListChannels(ctx, workspace.ID, userID) + if err != nil { + t.Fatal(err) + } + for _, c := range list { + if c.ID == channel.ID { + return c.UnreadCount + } + } + t.Fatalf("channel %s not found for user %s", channel.ID, userID) + return 0 + } + + base := unreadFor(owner.ID) + + // An activity message from another member must NOT bump the owner's unread. + if _, _, err := st.CreateMessage(ctx, store.CreateMessageInput{ChannelID: channel.ID, AuthorID: other.ID, Body: "commentary line", Kind: store.MessageKindAgentCommentary, TurnID: "t1"}); err != nil { + t.Fatal(err) + } + if _, _, err := st.CreateMessage(ctx, store.CreateMessageInput{ChannelID: channel.ID, AuthorID: other.ID, Body: "tool line", Kind: store.MessageKindAgentTool, TurnID: "t1"}); err != nil { + t.Fatal(err) + } + if got := unreadFor(owner.ID); got != base { + t.Fatalf("activity messages bumped unread: expected %d, got %d", base, got) + } + + // An ordinary message from the same member DOES bump unread. + if _, _, err := st.CreateMessage(ctx, store.CreateMessageInput{ChannelID: channel.ID, AuthorID: other.ID, Body: "real message"}); err != nil { + t.Fatal(err) + } + if got := unreadFor(owner.ID); got != base+1 { + t.Fatalf("ordinary message did not bump unread by 1: expected %d, got %d", base+1, got) + } +} + +// TestAgentActivityMessagesExcludedFromSearch verifies the FTS trigger only +// indexes kind='message' rows, so activity bodies never surface in search. +func TestAgentActivityMessagesExcludedFromSearch(t *testing.T) { + t.Parallel() + ctx := context.Background() + st := newTestStore(t) + owner, err := st.EnsureBootstrap(ctx, "Owner", "owner@example.com") + if err != nil { + t.Fatal(err) + } + workspaces, err := st.ListWorkspaces(ctx, owner.ID) + if err != nil { + t.Fatal(err) + } + workspace := workspaces[0] + channels, err := st.ListChannels(ctx, workspace.ID, owner.ID) + if err != nil { + t.Fatal(err) + } + channel := channels[0] + + if _, _, err := st.CreateMessage(ctx, store.CreateMessageInput{ChannelID: channel.ID, AuthorID: owner.ID, Body: "zebrafish ordinary"}); err != nil { + t.Fatal(err) + } + if _, _, err := st.CreateMessage(ctx, store.CreateMessageInput{ChannelID: channel.ID, AuthorID: owner.ID, Body: "zebrafish commentary", Kind: store.MessageKindAgentCommentary, TurnID: "t1"}); err != nil { + t.Fatal(err) + } + + results, err := st.SearchMessages(ctx, workspace.ID, "", owner.ID, "zebrafish", 50) + if err != nil { + t.Fatal(err) + } + if len(results) != 1 { + t.Fatalf("expected exactly one search hit (the ordinary message), got %d: %#v", len(results), results) + } + // The single hit must be the ordinary message, never the activity body. + if results[0].Message.Body != "zebrafish ordinary" { + t.Fatalf("search returned an unexpected (likely activity) row: %#v", results[0].Message) + } +} diff --git a/apps/api/internal/store/sqlite/bots.go b/apps/api/internal/store/sqlite/bots.go index 2b1b44ca..6a65d6e1 100644 --- a/apps/api/internal/store/sqlite/bots.go +++ b/apps/api/internal/store/sqlite/bots.go @@ -66,6 +66,11 @@ var botAllowedScopes = []string{ "realtime:read", "uploads:write", "profile:read", + // agent_activity:write is grantable but intentionally NOT part of any + // bot:* bundle. Durable agent activity is a distinct authorization surface + // and must be granted explicitly, so existing bot:* deployments gain no new + // capability. + store.AgentActivityWriteScope, } func (s *Store) CreateBot(ctx context.Context, input store.CreateBotInput) (store.User, store.BotToken, error) { diff --git a/apps/api/internal/store/sqlite/dms.go b/apps/api/internal/store/sqlite/dms.go index 7d7b847f..a208f924 100644 --- a/apps/api/internal/store/sqlite/dms.go +++ b/apps/api/internal/store/sqlite/dms.go @@ -270,12 +270,16 @@ func (s *Store) CreateDirectMessage(ctx context.Context, input store.CreateDirec if err != nil { return store.Message{}, store.Event{}, err } + kind, err := store.NormalizeMessageKind(input.Kind) + if err != nil { + return store.Message{}, store.Event{}, err + } var quotedID, quotedAuthorID, quotedSnapshot string if input.QuotedMessageID != nil { quotedID = strings.TrimSpace(*input.QuotedMessageID) } if existing, err := getMessageByClientNonceTx(ctx, tx, input.AuthorID, nonce); err == nil { - if existing.DirectConversationID != input.ConversationID || existing.ChannelID != "" || existing.ParentMessageID != nil || existing.Body != body || !sameQuotedMessageID(existing, quotedID) { + if existing.DirectConversationID != input.ConversationID || existing.ChannelID != "" || existing.ParentMessageID != nil || existing.Body != body || existing.Kind != kind || existing.TurnID != input.TurnID || !sameQuotedMessageID(existing, quotedID) { return store.Message{}, store.Event{}, store.ErrClientNonceConflict } return existing, store.Event{}, nil @@ -303,9 +307,11 @@ func (s *Store) CreateDirectMessage(ctx context.Context, input store.CreateDirec QuotedBodySnapshot: quotedSnapshot, QuotedAuthorID: sqlOptionalText(quotedAuthorID), ClientNonce: nonce, + Kind: kind, + TurnID: sqlOptionalText(input.TurnID), }); err != nil { if existing, lookupErr := getMessageByClientNonceTx(ctx, tx, input.AuthorID, nonce); lookupErr == nil { - if existing.DirectConversationID == input.ConversationID && existing.ChannelID == "" && existing.ParentMessageID == nil && existing.Body == body && sameQuotedMessageID(existing, quotedID) { + if existing.DirectConversationID == input.ConversationID && existing.ChannelID == "" && existing.ParentMessageID == nil && existing.Body == body && existing.Kind == kind && existing.TurnID == input.TurnID && sameQuotedMessageID(existing, quotedID) { return existing, store.Event{}, nil } return store.Message{}, store.Event{}, store.ErrClientNonceConflict @@ -322,7 +328,14 @@ func (s *Store) CreateDirectMessage(ctx context.Context, input store.CreateDirec if err != nil { return store.Message{}, store.Event{}, err } - event, err := insertEventWithRecipients(ctx, tx, workspaceID, "", "message.created", &seq, eventPayload(map[string]string{"message_id": id, "direct_conversation_id": input.ConversationID, "author_id": input.AuthorID}, nonce), recipients) + dmEventFields := map[string]string{"message_id": id, "direct_conversation_id": input.ConversationID, "author_id": input.AuthorID} + if kind != store.MessageKindMessage { + dmEventFields["kind"] = kind + } + if input.TurnID != "" { + dmEventFields["turn_id"] = input.TurnID + } + event, err := insertEventWithRecipients(ctx, tx, workspaceID, "", "message.created", &seq, eventPayload(dmEventFields, nonce), recipients) if err != nil { return store.Message{}, store.Event{}, err } diff --git a/apps/api/internal/store/sqlite/helpers.go b/apps/api/internal/store/sqlite/helpers.go index 87df89c2..1e122eb3 100644 --- a/apps/api/internal/store/sqlite/helpers.go +++ b/apps/api/internal/store/sqlite/helpers.go @@ -51,7 +51,7 @@ func messageSelect() string { u.id, u.kind, u.owner_user_id, u.display_name, u.handle, u.avatar_url, u.created_at, m.quoted_message_id, m.quoted_body_snapshot, m.quoted_author_id, qu.id, qu.kind, qu.owner_user_id, qu.display_name, qu.handle, qu.avatar_url, qu.created_at, - m.client_nonce + m.client_nonce, m.kind, COALESCE(m.turn_id, '') FROM messages m JOIN users u ON u.id = m.author_id LEFT JOIN users qu ON qu.id = m.quoted_author_id` @@ -72,7 +72,7 @@ func scanMessage(row scanner) (store.Message, error) { &author.ID, &author.Kind, &authorOwnerID, &author.DisplayName, &author.Handle, &author.AvatarURL, &author.CreatedAt, "edMessageID, &m.QuotedBodySnapshot, "edAuthorID, &quAuthorID, &quKind, &quOwnerID, &quDisplayName, &quHandle, &quAvatarURL, &quCreatedAt, - &nonce, + &nonce, &m.Kind, &m.TurnID, ) if err != nil { return store.Message{}, err diff --git a/apps/api/internal/store/sqlite/migrations/0017_agent_activity.sql b/apps/api/internal/store/sqlite/migrations/0017_agent_activity.sql new file mode 100644 index 00000000..04c94220 --- /dev/null +++ b/apps/api/internal/store/sqlite/migrations/0017_agent_activity.sql @@ -0,0 +1,31 @@ +-- Durable agent activity messages. +-- +-- Adds a message kind discriminator and an optional turn correlation id so a +-- bot bridge can persist agent commentary/tool rows in the normal message +-- stream. Activity rows ('agent_commentary', 'agent_tool') flow through the +-- ordinary message.created fan-out and inherit channel_seq for scrollback, but +-- they are excluded from full-text search and from unread/notification paths. +-- 'message' is the existing, default behaviour. + +ALTER TABLE messages ADD COLUMN kind TEXT NOT NULL DEFAULT 'message'; +ALTER TABLE messages ADD COLUMN turn_id TEXT; + +CREATE INDEX IF NOT EXISTS idx_messages_turn ON messages(turn_id); + +-- Recreate the FTS insert/update triggers so only kind='message' rows are +-- indexed. Activity rows are never user-authored prose and must not surface in +-- search. The delete trigger is unchanged (deleting a never-indexed row is a +-- no-op), but we keep all three definitions co-located for clarity. +DROP TRIGGER IF EXISTS messages_fts_ai; +DROP TRIGGER IF EXISTS messages_fts_au; + +CREATE TRIGGER messages_fts_ai AFTER INSERT ON messages +WHEN new.kind = 'message' BEGIN + INSERT INTO messages_fts(message_id, workspace_id, body) VALUES (new.id, new.workspace_id, new.body); +END; + +CREATE TRIGGER messages_fts_au AFTER UPDATE OF body ON messages +WHEN new.kind = 'message' BEGIN + DELETE FROM messages_fts WHERE message_id = old.id; + INSERT INTO messages_fts(message_id, workspace_id, body) VALUES (new.id, new.workspace_id, new.body); +END; diff --git a/apps/api/internal/store/sqlite/sqlc/queries.sql b/apps/api/internal/store/sqlite/sqlc/queries.sql index 5f383f4d..f061a2f4 100644 --- a/apps/api/internal/store/sqlite/sqlc/queries.sql +++ b/apps/api/internal/store/sqlite/sqlc/queries.sql @@ -191,6 +191,7 @@ SELECT c.id, COALESCE(c.route_id, '') AS route_id, c.workspace_id, c.name, c.kin WHERE m.channel_id = c.id AND m.parent_message_id IS NULL AND m.author_id <> sqlc.arg(reader_user_id) + AND m.kind = 'message' AND m.channel_seq > COALESCE((SELECT cr2.last_read_seq FROM channel_reads cr2 WHERE cr2.channel_id = c.id AND cr2.user_id = sqlc.arg(reader_user_id)), 0) ), 0) AS INTEGER) AS unread_count FROM channels c @@ -447,6 +448,7 @@ SELECT dc.id, COALESCE(dc.route_id, '') AS route_id, dc.workspace_id, dc.created WHERE m.direct_conversation_id = dc.id AND m.parent_message_id IS NULL AND m.author_id <> sqlc.arg(reader_user_id) + AND m.kind = 'message' AND m.channel_seq > COALESCE((SELECT dr2.last_read_seq FROM direct_reads dr2 WHERE dr2.conversation_id = dc.id AND dr2.user_id = sqlc.arg(reader_user_id)), 0) ), 0) AS INTEGER) AS unread_count FROM direct_conversations dc @@ -471,6 +473,7 @@ SELECT dc.id, COALESCE(dc.route_id, '') AS route_id, dc.workspace_id, dc.created WHERE m.direct_conversation_id = dc.id AND m.parent_message_id IS NULL AND m.author_id <> sqlc.arg(reader_user_id) + AND m.kind = 'message' AND m.channel_seq > COALESCE((SELECT dr2.last_read_seq FROM direct_reads dr2 WHERE dr2.conversation_id = dc.id AND dr2.user_id = sqlc.arg(reader_user_id)), 0) ), 0) AS INTEGER) AS unread_count FROM direct_conversations dc @@ -554,12 +557,12 @@ WHERE dcm.conversation_id = sqlc.arg(conversation_id) ORDER BY u.display_name; -- name: InsertChannelMessage :exec -INSERT INTO messages (id, workspace_id, channel_id, direct_conversation_id, author_id, parent_message_id, thread_root_id, topic_id, channel_seq, thread_seq, body, body_format, created_at, quoted_message_id, quoted_body_snapshot, quoted_author_id, client_nonce) -VALUES (sqlc.arg(id), sqlc.arg(workspace_id), sqlc.arg(channel_id), NULL, sqlc.arg(author_id), NULL, sqlc.arg(thread_root_id), sqlc.arg(topic_id), sqlc.arg(channel_seq), NULL, sqlc.arg(body), 'markdown', sqlc.arg(created_at), sqlc.arg(quoted_message_id), sqlc.arg(quoted_body_snapshot), sqlc.arg(quoted_author_id), sqlc.arg(client_nonce)); +INSERT INTO messages (id, workspace_id, channel_id, direct_conversation_id, author_id, parent_message_id, thread_root_id, topic_id, channel_seq, thread_seq, body, body_format, created_at, quoted_message_id, quoted_body_snapshot, quoted_author_id, client_nonce, kind, turn_id) +VALUES (sqlc.arg(id), sqlc.arg(workspace_id), sqlc.arg(channel_id), NULL, sqlc.arg(author_id), NULL, sqlc.arg(thread_root_id), sqlc.arg(topic_id), sqlc.arg(channel_seq), NULL, sqlc.arg(body), 'markdown', sqlc.arg(created_at), sqlc.arg(quoted_message_id), sqlc.arg(quoted_body_snapshot), sqlc.arg(quoted_author_id), sqlc.arg(client_nonce), sqlc.arg(kind), sqlc.arg(turn_id)); -- name: InsertDirectMessage :exec -INSERT INTO messages (id, workspace_id, channel_id, direct_conversation_id, author_id, parent_message_id, thread_root_id, channel_seq, thread_seq, body, body_format, created_at, quoted_message_id, quoted_body_snapshot, quoted_author_id, client_nonce) -VALUES (sqlc.arg(id), sqlc.arg(workspace_id), NULL, sqlc.arg(direct_conversation_id), sqlc.arg(author_id), NULL, sqlc.arg(thread_root_id), sqlc.arg(channel_seq), NULL, sqlc.arg(body), 'markdown', sqlc.arg(created_at), sqlc.arg(quoted_message_id), sqlc.arg(quoted_body_snapshot), sqlc.arg(quoted_author_id), sqlc.arg(client_nonce)); +INSERT INTO messages (id, workspace_id, channel_id, direct_conversation_id, author_id, parent_message_id, thread_root_id, channel_seq, thread_seq, body, body_format, created_at, quoted_message_id, quoted_body_snapshot, quoted_author_id, client_nonce, kind, turn_id) +VALUES (sqlc.arg(id), sqlc.arg(workspace_id), NULL, sqlc.arg(direct_conversation_id), sqlc.arg(author_id), NULL, sqlc.arg(thread_root_id), sqlc.arg(channel_seq), NULL, sqlc.arg(body), 'markdown', sqlc.arg(created_at), sqlc.arg(quoted_message_id), sqlc.arg(quoted_body_snapshot), sqlc.arg(quoted_author_id), sqlc.arg(client_nonce), sqlc.arg(kind), sqlc.arg(turn_id)); -- name: InsertThreadState :exec INSERT INTO thread_state (root_message_id) diff --git a/apps/api/internal/store/sqlite/sqlc/schema.sql b/apps/api/internal/store/sqlite/sqlc/schema.sql index b5f66b9c..12970e12 100644 --- a/apps/api/internal/store/sqlite/sqlc/schema.sql +++ b/apps/api/internal/store/sqlite/sqlc/schema.sql @@ -127,7 +127,9 @@ CREATE TABLE messages ( quoted_body_snapshot TEXT NOT NULL DEFAULT '', quoted_author_id TEXT REFERENCES users(id) ON DELETE SET NULL, client_nonce TEXT NOT NULL DEFAULT '', - route_id TEXT + route_id TEXT, + kind TEXT NOT NULL DEFAULT 'message', + turn_id TEXT ); CREATE INDEX idx_messages_channel_seq ON messages(channel_id, channel_seq); diff --git a/apps/api/internal/store/sqlite/sqlite.go b/apps/api/internal/store/sqlite/sqlite.go index cc073a90..b92b0a82 100644 --- a/apps/api/internal/store/sqlite/sqlite.go +++ b/apps/api/internal/store/sqlite/sqlite.go @@ -508,12 +508,16 @@ func (s *Store) CreateMessage(ctx context.Context, input store.CreateMessageInpu if err != nil { return store.Message{}, store.Event{}, err } + kind, err := store.NormalizeMessageKind(input.Kind) + if err != nil { + return store.Message{}, store.Event{}, err + } var quotedID, quotedAuthorID, quotedSnapshot string if input.QuotedMessageID != nil { quotedID = strings.TrimSpace(*input.QuotedMessageID) } if existing, err := getMessageByClientNonceTx(ctx, tx, input.AuthorID, nonce); err == nil { - if existing.ChannelID != input.ChannelID || existing.DirectConversationID != "" || existing.ParentMessageID != nil || existing.Body != body || existing.TopicID != input.TopicID || !sameQuotedMessageID(existing, quotedID) { + if existing.ChannelID != input.ChannelID || existing.DirectConversationID != "" || existing.ParentMessageID != nil || existing.Body != body || existing.TopicID != input.TopicID || existing.Kind != kind || existing.TurnID != input.TurnID || !sameQuotedMessageID(existing, quotedID) { return store.Message{}, store.Event{}, store.ErrClientNonceConflict } if err := requireMessageAccessTx(ctx, tx, existing, input.AuthorID); err != nil { @@ -548,9 +552,11 @@ func (s *Store) CreateMessage(ctx context.Context, input store.CreateMessageInpu QuotedBodySnapshot: quotedSnapshot, QuotedAuthorID: sqlOptionalText(quotedAuthorID), ClientNonce: nonce, + Kind: kind, + TurnID: sqlOptionalText(input.TurnID), }); err != nil { if existing, lookupErr := getMessageByClientNonceTx(ctx, tx, input.AuthorID, nonce); lookupErr == nil { - if existing.ChannelID == input.ChannelID && existing.DirectConversationID == "" && existing.ParentMessageID == nil && existing.Body == body && existing.TopicID == input.TopicID && sameQuotedMessageID(existing, quotedID) { + if existing.ChannelID == input.ChannelID && existing.DirectConversationID == "" && existing.ParentMessageID == nil && existing.Body == body && existing.TopicID == input.TopicID && existing.Kind == kind && existing.TurnID == input.TurnID && sameQuotedMessageID(existing, quotedID) { if err := requireMessageAccessTx(ctx, tx, existing, input.AuthorID); err != nil { return store.Message{}, store.Event{}, err } @@ -567,6 +573,12 @@ func (s *Store) CreateMessage(ctx context.Context, input store.CreateMessageInpu if input.TopicID != "" { eventFields["topic_id"] = input.TopicID } + if kind != store.MessageKindMessage { + eventFields["kind"] = kind + } + if input.TurnID != "" { + eventFields["turn_id"] = input.TurnID + } event, err := insertEvent(ctx, tx, workspaceID, input.ChannelID, "message.created", &seq, eventPayload(eventFields, nonce)) if err != nil { return store.Message{}, store.Event{}, err diff --git a/apps/api/internal/store/sqlite/storedb/models.go b/apps/api/internal/store/sqlite/storedb/models.go index ab8da222..9603ad52 100644 --- a/apps/api/internal/store/sqlite/storedb/models.go +++ b/apps/api/internal/store/sqlite/storedb/models.go @@ -196,6 +196,8 @@ type Message struct { QuotedAuthorID sql.NullString `json:"quoted_author_id"` ClientNonce string `json:"client_nonce"` RouteID sql.NullString `json:"route_id"` + Kind string `json:"kind"` + TurnID sql.NullString `json:"turn_id"` } type MessageAttachment struct { diff --git a/apps/api/internal/store/sqlite/storedb/queries.sql.go b/apps/api/internal/store/sqlite/storedb/queries.sql.go index bd3da168..72392fff 100644 --- a/apps/api/internal/store/sqlite/storedb/queries.sql.go +++ b/apps/api/internal/store/sqlite/storedb/queries.sql.go @@ -721,6 +721,7 @@ SELECT dc.id, COALESCE(dc.route_id, '') AS route_id, dc.workspace_id, dc.created WHERE m.direct_conversation_id = dc.id AND m.parent_message_id IS NULL AND m.author_id <> ?1 + AND m.kind = 'message' AND m.channel_seq > COALESCE((SELECT dr2.last_read_seq FROM direct_reads dr2 WHERE dr2.conversation_id = dc.id AND dr2.user_id = ?1), 0) ), 0) AS INTEGER) AS unread_count FROM direct_conversations dc @@ -1269,8 +1270,8 @@ func (q *Queries) InsertChannel(ctx context.Context, arg InsertChannelParams) er } const insertChannelMessage = `-- name: InsertChannelMessage :exec -INSERT INTO messages (id, workspace_id, channel_id, direct_conversation_id, author_id, parent_message_id, thread_root_id, topic_id, channel_seq, thread_seq, body, body_format, created_at, quoted_message_id, quoted_body_snapshot, quoted_author_id, client_nonce) -VALUES (?1, ?2, ?3, NULL, ?4, NULL, ?5, ?6, ?7, NULL, ?8, 'markdown', ?9, ?10, ?11, ?12, ?13) +INSERT INTO messages (id, workspace_id, channel_id, direct_conversation_id, author_id, parent_message_id, thread_root_id, topic_id, channel_seq, thread_seq, body, body_format, created_at, quoted_message_id, quoted_body_snapshot, quoted_author_id, client_nonce, kind, turn_id) +VALUES (?1, ?2, ?3, NULL, ?4, NULL, ?5, ?6, ?7, NULL, ?8, 'markdown', ?9, ?10, ?11, ?12, ?13, ?14, ?15) ` type InsertChannelMessageParams struct { @@ -1287,6 +1288,8 @@ type InsertChannelMessageParams struct { QuotedBodySnapshot string `json:"quoted_body_snapshot"` QuotedAuthorID sql.NullString `json:"quoted_author_id"` ClientNonce string `json:"client_nonce"` + Kind string `json:"kind"` + TurnID sql.NullString `json:"turn_id"` } func (q *Queries) InsertChannelMessage(ctx context.Context, arg InsertChannelMessageParams) error { @@ -1304,6 +1307,8 @@ func (q *Queries) InsertChannelMessage(ctx context.Context, arg InsertChannelMes arg.QuotedBodySnapshot, arg.QuotedAuthorID, arg.ClientNonce, + arg.Kind, + arg.TurnID, ) return err } @@ -1397,8 +1402,8 @@ func (q *Queries) InsertDirectConversationMember(ctx context.Context, arg Insert } const insertDirectMessage = `-- name: InsertDirectMessage :exec -INSERT INTO messages (id, workspace_id, channel_id, direct_conversation_id, author_id, parent_message_id, thread_root_id, channel_seq, thread_seq, body, body_format, created_at, quoted_message_id, quoted_body_snapshot, quoted_author_id, client_nonce) -VALUES (?1, ?2, NULL, ?3, ?4, NULL, ?5, ?6, NULL, ?7, 'markdown', ?8, ?9, ?10, ?11, ?12) +INSERT INTO messages (id, workspace_id, channel_id, direct_conversation_id, author_id, parent_message_id, thread_root_id, channel_seq, thread_seq, body, body_format, created_at, quoted_message_id, quoted_body_snapshot, quoted_author_id, client_nonce, kind, turn_id) +VALUES (?1, ?2, NULL, ?3, ?4, NULL, ?5, ?6, NULL, ?7, 'markdown', ?8, ?9, ?10, ?11, ?12, ?13, ?14) ` type InsertDirectMessageParams struct { @@ -1414,6 +1419,8 @@ type InsertDirectMessageParams struct { QuotedBodySnapshot string `json:"quoted_body_snapshot"` QuotedAuthorID sql.NullString `json:"quoted_author_id"` ClientNonce string `json:"client_nonce"` + Kind string `json:"kind"` + TurnID sql.NullString `json:"turn_id"` } func (q *Queries) InsertDirectMessage(ctx context.Context, arg InsertDirectMessageParams) error { @@ -1430,6 +1437,8 @@ func (q *Queries) InsertDirectMessage(ctx context.Context, arg InsertDirectMessa arg.QuotedBodySnapshot, arg.QuotedAuthorID, arg.ClientNonce, + arg.Kind, + arg.TurnID, ) return err } @@ -1777,6 +1786,7 @@ SELECT c.id, COALESCE(c.route_id, '') AS route_id, c.workspace_id, c.name, c.kin WHERE m.channel_id = c.id AND m.parent_message_id IS NULL AND m.author_id <> ?1 + AND m.kind = 'message' AND m.channel_seq > COALESCE((SELECT cr2.last_read_seq FROM channel_reads cr2 WHERE cr2.channel_id = c.id AND cr2.user_id = ?1), 0) ), 0) AS INTEGER) AS unread_count FROM channels c @@ -1846,6 +1856,7 @@ SELECT dc.id, COALESCE(dc.route_id, '') AS route_id, dc.workspace_id, dc.created WHERE m.direct_conversation_id = dc.id AND m.parent_message_id IS NULL AND m.author_id <> ?1 + AND m.kind = 'message' AND m.channel_seq > COALESCE((SELECT dr2.last_read_seq FROM direct_reads dr2 WHERE dr2.conversation_id = dc.id AND dr2.user_id = ?1), 0) ), 0) AS INTEGER) AS unread_count FROM direct_conversations dc diff --git a/apps/api/internal/store/types.go b/apps/api/internal/store/types.go index 7ddd0e8a..a29892ca 100644 --- a/apps/api/internal/store/types.go +++ b/apps/api/internal/store/types.go @@ -34,6 +34,54 @@ var ErrPostRateLimited = errors.New("waiting room post limit reached") // budget in a workspace. var ErrUploadQuotaExceeded = errors.New("upload quota exceeded") +// ErrInvalidMessageKind is returned when a caller supplies a message kind that +// is not one of the recognised values. HTTP callers surface it as a 400. +var ErrInvalidMessageKind = errors.New("invalid message kind") + +// ErrTurnIDNotAllowed is returned when an ordinary ('message') row is created +// with a non-empty turn_id. turn_id correlates a sequence of agent activity +// rows belonging to one turn; an ordinary message carrying one contradicts the +// documented "must be empty for ordinary messages" contract. HTTP callers surface it as +// a 400 so a client bug fails closed instead of silently persisting a +// contradictory turn_id. +var ErrTurnIDNotAllowed = errors.New("turn_id is only valid for agent activity messages") + +// Message kinds. 'message' is an ordinary human/bot message and is the default +// for any row created before this column existed. The agent_* kinds are +// durable agent activity rows: they ride the normal message stream (channel +// sequence, message.created fan-out, scrollback) but are excluded from +// full-text search and from unread/notification accounting. +const ( + MessageKindMessage = "message" + MessageKindAgentCommentary = "agent_commentary" + MessageKindAgentTool = "agent_tool" +) + +// AgentActivityWriteScope is the dedicated, non-inherited bot scope required to +// create an agent activity message (kind != 'message'). It is deliberately +// EXCLUDED from the bot:* bundles so existing deployments' capability surface +// is unchanged: a bot must be granted it explicitly. +const AgentActivityWriteScope = "agent_activity:write" + +// IsActivityMessageKind reports whether kind is one of the durable agent +// activity kinds (anything other than the ordinary 'message'). +func IsActivityMessageKind(kind string) bool { + return kind == MessageKindAgentCommentary || kind == MessageKindAgentTool +} + +// NormalizeMessageKind validates a caller-supplied kind. An empty value +// defaults to 'message'. Unknown values return ErrInvalidMessageKind. +func NormalizeMessageKind(kind string) (string, error) { + switch kind { + case "", MessageKindMessage: + return MessageKindMessage, nil + case MessageKindAgentCommentary, MessageKindAgentTool: + return kind, nil + default: + return "", ErrInvalidMessageKind + } +} + const ( WorkspaceRoleOwner = "owner" WorkspaceRoleModerator = "moderator" @@ -99,29 +147,38 @@ type Channel struct { } type Message struct { - ID string `json:"id"` - RouteID string `json:"route_id,omitempty"` - WorkspaceID string `json:"workspace_id"` - ChannelID string `json:"channel_id,omitempty"` - DirectConversationID string `json:"direct_conversation_id,omitempty"` - AuthorID string `json:"author_id"` - ParentMessageID *string `json:"parent_message_id,omitempty"` - ThreadRootID string `json:"thread_root_id"` - TopicID string `json:"topic_id,omitempty"` - ChannelSeq *int64 `json:"channel_seq,omitempty"` - ThreadSeq *int64 `json:"thread_seq,omitempty"` - Body string `json:"body"` - BodyFormat string `json:"body_format"` - CreatedAt string `json:"created_at"` - EditedAt *string `json:"edited_at,omitempty"` - DeletedAt *string `json:"deleted_at,omitempty"` - Author *User `json:"author,omitempty"` - Attachments []Upload `json:"attachments,omitempty"` - QuotedMessageID *string `json:"quoted_message_id,omitempty"` - QuotedBodySnapshot string `json:"quoted_body_snapshot,omitempty"` - QuotedAuthorID *string `json:"quoted_author_id,omitempty"` - QuotedAuthor *User `json:"quoted_author,omitempty"` - ThreadState *ThreadState `json:"thread_state,omitempty"` + ID string `json:"id"` + RouteID string `json:"route_id,omitempty"` + WorkspaceID string `json:"workspace_id"` + ChannelID string `json:"channel_id,omitempty"` + DirectConversationID string `json:"direct_conversation_id,omitempty"` + AuthorID string `json:"author_id"` + ParentMessageID *string `json:"parent_message_id,omitempty"` + ThreadRootID string `json:"thread_root_id"` + TopicID string `json:"topic_id,omitempty"` + ChannelSeq *int64 `json:"channel_seq,omitempty"` + ThreadSeq *int64 `json:"thread_seq,omitempty"` + Body string `json:"body"` + BodyFormat string `json:"body_format"` + CreatedAt string `json:"created_at"` + EditedAt *string `json:"edited_at,omitempty"` + DeletedAt *string `json:"deleted_at,omitempty"` + // Kind discriminates ordinary messages from durable agent activity rows. + // Empty in JSON means the default 'message'. + Kind string `json:"kind,omitempty"` + // TurnID correlates a sequence of agent activity rows belonging to one + // agent turn. It must be empty for ordinary messages (kind="message"): the + // create path enforces this and rejects a non-empty turn_id on a 'message' + // kind with a 400 ErrTurnIDNotAllowed. It is optional for agent activity + // kinds (agent_commentary/agent_tool), which may carry one. + TurnID string `json:"turn_id,omitempty"` + Author *User `json:"author,omitempty"` + Attachments []Upload `json:"attachments,omitempty"` + QuotedMessageID *string `json:"quoted_message_id,omitempty"` + QuotedBodySnapshot string `json:"quoted_body_snapshot,omitempty"` + QuotedAuthorID *string `json:"quoted_author_id,omitempty"` + QuotedAuthor *User `json:"quoted_author,omitempty"` + ThreadState *ThreadState `json:"thread_state,omitempty"` // Nonce is a client-supplied idempotency key used by optimistic UIs to match // the server response to a pending placeholder and safely retry after a lost // response. @@ -422,6 +479,10 @@ type CreateMessageInput struct { QuotedMessageID *string Nonce string TopicID string + // Kind defaults to 'message' when empty. Activity kinds are gated at the + // API layer by AgentActivityWriteScope. + Kind string + TurnID string } type UpdateMessageInput struct { @@ -534,6 +595,8 @@ type CreateDirectMessageInput struct { Body string QuotedMessageID *string Nonce string + Kind string + TurnID string } type Topic struct { diff --git a/apps/api/internal/webassets/dist/200.html b/apps/api/internal/webassets/dist/200.html index 1d22f0dc..7031eded 100644 --- a/apps/api/internal/webassets/dist/200.html +++ b/apps/api/internal/webassets/dist/200.html @@ -9,15 +9,15 @@ - + - + - +
@@ -31,7 +31,7 @@ Promise.all([ import("/_app/immutable/entry/start.DptDfE7f.js"), - import("/_app/immutable/entry/app.BOItyeok.js") + import("/_app/immutable/entry/app.Nt0q6qqN.js") ]).then(([kit, app]) => { kit.start(app, element); }); diff --git a/apps/api/internal/webassets/dist/_app/immutable/assets/0.BN2BZL1h.css b/apps/api/internal/webassets/dist/_app/immutable/assets/0.BN2BZL1h.css new file mode 100644 index 00000000..af912ee4 --- /dev/null +++ b/apps/api/internal/webassets/dist/_app/immutable/assets/0.BN2BZL1h.css @@ -0,0 +1 @@ +@font-face{font-family:Geist Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(./geist-cyrillic-ext-wght-normal.DjL33-gN.woff2) format("woff2-variations");unicode-range:U+0460-052F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Geist Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(./geist-cyrillic-wght-normal.BEAKL7Jp.woff2) format("woff2-variations");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Geist Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(./geist-vietnamese-wght-normal.6IgcOCM7.woff2) format("woff2-variations");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Geist Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(./geist-latin-ext-wght-normal.DC-KSUi6.woff2) format("woff2-variations");unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Geist Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(./geist-latin-wght-normal.BgDaEnEv.woff2) format("woff2-variations");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Geist Mono Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(./geist-mono-cyrillic-ext-wght-normal.I4S5GZfc.woff2) format("woff2-variations");unicode-range:U+0460-052F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Geist Mono Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(./geist-mono-cyrillic-wght-normal.BmXc_FBt.woff2) format("woff2-variations");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Geist Mono Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(./geist-mono-symbols2-wght-normal.GZpp1pK2.woff2) format("woff2-variations");unicode-range:U+2000-2001,U+2004-2008,U+200A,U+23B8-23BD,U+2500-259F}@font-face{font-family:Geist Mono Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(./geist-mono-vietnamese-wght-normal.D8KDMBhC.woff2) format("woff2-variations");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Geist Mono Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(./geist-mono-latin-ext-wght-normal.DrnZ1wKl.woff2) format("woff2-variations");unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Geist Mono Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(./geist-mono-latin-wght-normal.B_7UjwxQ.woff2) format("woff2-variations");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}:root{color-scheme:light dark;font-family:Geist Variable,Inter,SF Pro Text,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif;font-feature-settings:"ss01","cv11";--rail: #e9e1d7;--bg: #f7f3ed;--panel: #fffaf2;--panel-2: #efe7dc;--panel-3: #e4dbcf;--hover: rgba(16, 32, 39, .05);--hover-strong: rgba(16, 32, 39, .08);--line: rgba(16, 32, 39, .1);--line-strong: rgba(16, 32, 39, .16);--text: #22201d;--text-strong: #11100e;--muted: #6f675f;--muted-2: #958b80;--accent: #dd5d45;--accent-2: #006d77;--accent-soft: rgba(221, 93, 69, .16);--user-bubble-soft: color-mix(in srgb, var(--accent) 9%, transparent);--activity-accent: #d49415;--activity-accent-soft: rgba(212, 148, 21, .09);--delivery-accent: #2f6df6;--delivery-accent-soft: rgba(47, 109, 246, .06);--tool-call-bg: rgba(47, 109, 246, .09);--tool-call-bg-hover: rgba(47, 109, 246, .14);--accent-glow: 0 0 0 1px rgba(221, 93, 69, .28), 0 8px 30px -12px rgba(221, 93, 69, .45);--success: #168b51;--warn: #f5b050;--danger: #c84343;--shadow: 0 24px 60px -24px rgba(16, 32, 39, .32);--radius-sm: 6px;--radius: 8px;--radius-lg: 14px;--radius-xl: 18px;--safe-area-top: env(safe-area-inset-top, 0px);--safe-area-right: env(safe-area-inset-right, 0px);--safe-area-bottom: env(safe-area-inset-bottom, 0px);--safe-area-left: env(safe-area-inset-left, 0px);background:var(--bg);color:var(--text)}@media(prefers-color-scheme:dark){:root{--rail: #0d0e12;--bg: #131419;--panel: #1a1b22;--panel-2: #20222b;--panel-3: #272a35;--hover: rgba(255, 255, 255, .04);--hover-strong: rgba(255, 255, 255, .07);--line: rgba(255, 255, 255, .07);--line-strong: rgba(255, 255, 255, .12);--text: #e7e9ee;--text-strong: #ffffff;--muted: #8a8f9c;--muted-2: #5d626d;--accent: #6f7eff;--accent-2: #5666ee;--accent-soft: rgba(111, 126, 255, .18);--activity-accent: #e8b23e;--activity-accent-soft: rgba(232, 178, 62, .1);--delivery-accent: #6096ff;--delivery-accent-soft: rgba(96, 150, 255, .08);--tool-call-bg: rgba(96, 150, 255, .12);--tool-call-bg-hover: rgba(96, 150, 255, .18);--accent-glow: 0 0 0 1px rgba(111, 126, 255, .4), 0 8px 30px -12px rgba(111, 126, 255, .6);--success: #2ecc71;--warn: #f5b050;--danger: #ff6b6b;--shadow: 0 24px 60px -20px rgba(0, 0, 0, .6)}}*{box-sizing:border-box}html,body{margin:0;padding:0;height:100%}body{background:radial-gradient(1000px 600px at 0% 0%,rgba(111,126,255,.08),transparent 60%),radial-gradient(900px 700px at 100% 100%,rgba(255,130,200,.05),transparent 60%),var(--bg);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}button,input,textarea{font:inherit;color:inherit}button{cursor:pointer}input,textarea{background:transparent;border:0;outline:0}::-webkit-scrollbar{width:10px;height:10px}::-webkit-scrollbar-thumb{background:#ffffff0f;border-radius:999px;border:2px solid transparent;background-clip:content-box}::-webkit-scrollbar-thumb:hover{background:#ffffff1f;background-clip:content-box}.auth-shell{display:grid;min-height:100vh;min-height:100dvh;place-items:center;padding:calc(32px + var(--safe-area-top)) calc(32px + var(--safe-area-right)) calc(32px + var(--safe-area-bottom)) calc(32px + var(--safe-area-left));background:radial-gradient(700px 500px at 30% 20%,rgba(111,126,255,.18),transparent 60%),radial-gradient(700px 500px at 80% 90%,rgba(255,110,196,.12),transparent 60%),var(--bg)}.auth-panel{display:grid;gap:22px;width:min(100%,440px);border:1px solid var(--line-strong);border-radius:var(--radius-xl);background:linear-gradient(180deg,#ffffff0a,#fff0) var(--panel);box-shadow:var(--shadow);padding:36px}.auth-brand{display:flex;align-items:center;gap:12px}.auth-brand .mark{width:44px;height:44px;display:grid;place-items:center;border-radius:12px;background:linear-gradient(135deg,var(--accent),#b46cff);color:#fff;font-weight:800;letter-spacing:-.02em;box-shadow:0 10px 24px -8px #6f7effb3}.auth-brand .brand-text strong{display:block;color:var(--text-strong);letter-spacing:-.01em}.auth-brand .brand-text span{display:block;color:var(--muted);font-size:12px}.auth-copy{display:grid;gap:8px;margin-top:8px}.auth-copy h1{margin:0;font-size:28px;letter-spacing:-.02em;color:var(--text-strong)}.auth-copy p{margin:0;color:var(--muted);line-height:1.5}.github-login{display:inline-flex;align-items:center;justify-content:center;gap:10px;min-height:46px;border-radius:12px;background:#0d1117;color:#fff;font-weight:600;text-decoration:none;border:1px solid #2b2f36;transition:transform 80ms ease,background .12s ease,border-color .12s ease}.github-login:hover{background:#161b22;border-color:#3f4750;transform:translateY(-1px)}.auth-foot{margin:0;color:var(--muted-2);font-size:12px;text-align:center}.shell{display:grid;grid-template-columns:72px 260px minmax(0,1fr) 0;height:100vh;height:100dvh;min-height:100vh;min-height:100dvh;overflow:hidden;transition:grid-template-columns .22s cubic-bezier(.2,.8,.2,1)}.shell.thread-open{grid-template-columns:72px 260px minmax(0,1fr) minmax(340px,28vw)}.shell.sidebar-collapsed{grid-template-columns:72px 0 minmax(0,1fr) 0}.shell.sidebar-collapsed.thread-open{grid-template-columns:72px 0 minmax(0,1fr) minmax(340px,28vw)}.timeline{display:flex;flex-direction:column;min-width:0;background:var(--bg);overflow:hidden}.timeline>*{min-width:0;flex-shrink:0}.timeline>.messages{flex:1 1 0;min-height:0}.topbar{display:flex;align-items:center;gap:14px;padding:12px 20px;min-height:60px;border-bottom:1px solid var(--line);background:linear-gradient(180deg,rgba(255,255,255,.02),transparent),var(--bg)}.topbar-title{display:flex;align-items:center;gap:10px;min-width:0;flex:1}.topbar-title h1{margin:0;font-size:16px;font-weight:700;letter-spacing:-.01em;color:var(--text-strong);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.topbar-title h1.with-glyph:first-letter{color:var(--muted);margin-right:1px}.topbar-divider{width:1px;height:18px;background:var(--line-strong);margin:0 6px}.topbar-meta{margin:0;color:var(--muted);font-size:12px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.search{display:flex;align-items:center;gap:8px;width:min(280px,30vw);height:34px;padding:0 10px;border-radius:var(--radius);background:var(--panel);border:1px solid var(--line);color:var(--muted);transition:border-color .12s ease,background .12s ease}.search:focus-within{border-color:var(--accent);background:var(--panel-2);color:var(--text)}.search input{flex:1;min-width:0;height:100%;color:var(--text)}.search input::placeholder{color:var(--muted)}.search-clear{width:18px;height:18px;border-radius:50%;border:0;background:var(--panel-3);color:var(--muted);display:grid;place-items:center;font-size:14px;line-height:1}.search-clear:hover{background:var(--accent);color:#fff}.search-submit{height:22px;padding:0 8px;border:0;border-radius:5px;background:var(--accent-soft);color:var(--accent);font-size:10.5px;font-weight:700;letter-spacing:.04em;text-transform:uppercase}.search-submit:hover{background:var(--accent);color:#fff}.topbar-actions{display:inline-flex;align-items:center;gap:6px}.topbar-actions button{width:32px;height:32px;display:grid;place-items:center;border:1px solid var(--line);border-radius:9px;background:var(--panel);color:var(--muted);transition:background .12s ease,color .12s ease,border-color .12s ease,transform 80ms ease}.topbar-actions button:hover,.topbar-actions button.active{background:var(--accent-soft);border-color:color-mix(in srgb,var(--accent) 55%,transparent);color:var(--accent)}.topbar-actions button:active{transform:translateY(1px)}@keyframes pulse{0%,to{opacity:1}50%{opacity:.5}}.search-results{display:flex;flex-direction:column;gap:2px;padding:10px 14px 14px;border-bottom:1px solid var(--line);background:var(--panel);max-height:280px;overflow-y:auto}.search-results-head{display:flex;align-items:center;justify-content:space-between;padding:0 6px 8px}.search-results-head strong{color:var(--text-strong);font-size:13px}.search-results-head button{border:0;background:transparent;color:var(--muted);font-size:12px;padding:4px 8px;border-radius:var(--radius-sm)}.search-results-head button:hover{background:var(--hover);color:var(--text)}.search-result{display:flex;align-items:flex-start;gap:10px;border:0;background:transparent;color:var(--text);padding:8px;border-radius:var(--radius-sm);text-align:left}.search-result:hover{background:var(--hover)}.search-result .dm-avatar{width:30px;height:30px;font-size:13px}.search-result-body{display:flex;flex-direction:column;gap:2px;min-width:0;flex:1}.search-result-body>div{display:flex;align-items:baseline;gap:8px}.search-result-body strong{color:var(--text-strong);font-size:13px}.search-result-body time{color:var(--muted);font-size:11px}.search-result-body span{color:var(--muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.guild-rail{display:flex;flex-direction:column;align-items:center;gap:8px;padding:14px 0;background:var(--rail);border-right:1px solid var(--line);overflow-y:auto;position:relative}.guild-rail .guild{width:48px;height:48px;border-radius:16px;display:grid;place-items:center;background:var(--panel-2);color:var(--text);text-decoration:none;border:0;font-weight:700;font-size:14px;letter-spacing:-.02em;position:relative;transition:border-radius .14s ease,background .12s ease,transform .12s ease;box-shadow:0 1px #ffffff0a inset}.guild-rail .guild:hover{border-radius:12px;background:var(--accent);color:#fff;box-shadow:0 8px 24px -10px #6f7eff99}.guild-rail .guild.home{background:linear-gradient(135deg,var(--accent),#b46cff);color:#fff;font-weight:800}.guild-rail .guild.home:hover{border-radius:12px;filter:brightness(1.1)}.guild-rail .guild.add{background:transparent;color:var(--success);border:1px dashed rgba(46,204,113,.4)}.guild-rail .guild.add:hover{background:#2ecc711f;color:#fff;border-style:solid;border-color:var(--success)}.guild-divider{width:36px;height:1px;background:var(--line-strong);margin:4px 0}.guild-list{display:flex;flex-direction:column;align-items:center;gap:8px}.guild-wrap{position:relative}.guild-wrap:before{content:"";position:absolute;left:-14px;top:50%;transform:translateY(-50%) scaleY(.2);width:4px;height:28px;border-radius:0 4px 4px 0;background:var(--text-strong);opacity:0;transition:opacity .14s ease,transform .14s ease}.guild-wrap:hover:before{opacity:.6;transform:translateY(-50%) scaleY(.5)}.guild-wrap.active:before{opacity:1;transform:translateY(-50%) scaleY(1)}.guild-wrap.active .guild{border-radius:14px;background:var(--accent);color:#fff}.guild-create{position:absolute;left:100%;top:14px;margin-left:8px;background:var(--panel);border:1px solid var(--line-strong);border-radius:var(--radius);padding:8px;box-shadow:var(--shadow);z-index:20}.guild-create input{height:32px;padding:0 10px;width:200px;border-radius:var(--radius-sm);background:var(--panel-2);color:var(--text)}.sidebar{display:grid;grid-template-rows:auto minmax(0,1fr) auto;background:var(--panel);border-right:1px solid var(--line);overflow:hidden;min-width:0;transition:opacity .16s ease,transform .22s cubic-bezier(.2,.8,.2,1)}.sidebar-collapsed .sidebar{opacity:0;pointer-events:none;transform:translate(-14px)}.workspace-header{padding:14px 16px;border-bottom:1px solid var(--line);display:flex;align-items:center;justify-content:space-between;min-height:60px}.sidebar-collapse{width:30px;height:30px;display:grid;place-items:center;border:0;border-radius:8px;background:var(--panel-2);color:var(--muted);transition:color .12s ease,background .12s ease,transform .12s ease}.sidebar-collapse:hover{background:var(--panel-3);color:var(--text-strong);transform:translate(-1px)}.workspace-name{display:flex;flex-direction:column;gap:2px;min-width:0}.workspace-name strong{color:var(--text-strong);letter-spacing:-.01em;font-size:15px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.workspace-name .presence{display:inline-flex;align-items:center;gap:6px;color:var(--muted);font-size:11px}.workspace-name .presence:before{content:"";width:7px;height:7px;border-radius:50%;background:var(--muted-2)}.workspace-name .presence.online{color:var(--success)}.workspace-name .presence.online:before{background:var(--success);box-shadow:0 0 0 3px #2ecc712e}.sidebar-scroll{overflow-y:auto;padding:12px 8px 16px}.nav-section+.nav-section{margin-top:12px}.section-title{display:flex;align-items:center;gap:6px;width:100%;border:0;background:transparent;color:var(--muted);text-transform:uppercase;font-size:11px;font-weight:700;letter-spacing:.04em;padding:6px 8px;border-radius:var(--radius-sm)}.section-title:hover{color:var(--text);background:var(--hover)}.section-title .caret{font-size:10px;opacity:.7}.section-title .label{flex:1;text-align:left}.section-title .add-button{flex:0 0 auto;width:18px;height:18px;border:0;border-radius:4px;display:grid;place-items:center;font-size:14px;font-weight:700;line-height:1;background:#ffffff0f;color:var(--text);padding:0}.section-title:hover .add-button{background:var(--accent);color:#fff}.nav-list{display:flex;flex-direction:column;gap:1px;margin-top:4px}.nav-item{display:flex;align-items:center;gap:8px;width:100%;border:0;border-radius:var(--radius-sm);background:transparent;color:var(--muted);text-decoration:none;text-align:left;padding:6px 10px;min-height:30px;transition:background .1s ease,color .1s ease}.nav-item:hover{background:var(--hover);color:var(--text)}.nav-item:focus{outline:none}.nav-item:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}.nav-item.active{background:var(--accent-soft);color:var(--text-strong)}.nav-item.has-unread{color:var(--text-strong);font-weight:600}.nav-item.has-unread .hash{color:var(--text-strong)}.unread-badge{flex-shrink:0;min-width:18px;height:18px;padding:0 6px;border-radius:9px;background:var(--accent);color:var(--accent-contrast, white);font-size:11px;font-weight:700;line-height:18px;text-align:center;letter-spacing:.01em}.nav-item .hash{color:var(--muted);font-weight:600;width:14px;text-align:center}.nav-item.active .hash{color:var(--accent)}.nav-label{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-size:14px}.dm-row{display:grid;grid-template-columns:minmax(0,1fr) 24px;align-items:center;gap:2px;position:relative}.dm-row .nav-item{min-width:0}.dm-actions-trigger{width:22px;height:22px;display:grid;place-items:center;border:0;border-radius:var(--radius-sm);background:transparent;color:var(--muted-2);font-size:18px;font-weight:700;line-height:1;opacity:0}.dm-row:hover .dm-actions-trigger,.dm-row:focus-within .dm-actions-trigger,.dm-row.active .dm-actions-trigger{opacity:1}.dm-actions-trigger:hover,.dm-actions-trigger:focus-visible,.dm-actions-trigger[aria-expanded=true]{background:var(--hover);color:var(--text);outline:none}.dm-actions-menu{position:absolute;z-index:30;top:28px;right:0;min-width:164px;padding:4px;border:1px solid var(--line-strong);border-radius:var(--radius-sm);background:var(--panel-2);box-shadow:var(--shadow)}.dm-actions-item{width:100%;min-height:30px;border:0;border-radius:6px;background:transparent;color:var(--text);font-size:13px;text-align:left;padding:0 10px}.dm-actions-item:hover,.dm-actions-item:focus-visible{background:var(--hover);color:var(--text-strong);outline:none}.dm-undo{display:flex;align-items:center;gap:8px;margin:6px 8px 2px;padding:6px 8px;border:1px solid var(--line);border-radius:var(--radius-sm);background:var(--panel-2);color:var(--muted);font-size:12px}.dm-undo span{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dm-undo button{border:0;border-radius:6px;background:var(--hover);color:var(--text);font-size:12px;font-weight:700;padding:4px 8px}.dm-undo button:hover,.dm-undo button:focus-visible{background:var(--accent);color:#fff;outline:none}.nav-empty{margin:4px 8px;color:var(--muted-2);font-size:12px}.dm-avatar{width:22px;height:22px;border-radius:50%;display:grid;place-items:center;font-size:11px;font-weight:700;color:#fff;background:linear-gradient(135deg,hsl(var(--hue, 220deg) 70% 55%),hsl(calc(var(--hue, 220deg) + 40deg) 70% 45%));flex-shrink:0;overflow:hidden}.dm-avatar img,.avatar img{width:100%;height:100%;display:block;object-fit:cover}.presence-dot{width:8px;height:8px;border-radius:50%;background:var(--muted-2);flex-shrink:0}.presence-dot.active{background:var(--success);box-shadow:0 0 0 2px var(--panel)}.inline-create{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:6px;margin:6px 4px 2px}.inline-create input{width:100%;min-width:0;height:30px;padding:0 10px;border-radius:var(--radius-sm);background:var(--panel-2);color:var(--text);border:1px solid var(--line)}.inline-create input:focus{border-color:var(--accent);background:var(--panel-3)}.inline-create button.ghost,button.ghost{width:30px;height:30px;border:0;border-radius:var(--radius-sm);background:var(--panel-3);color:var(--muted);font-weight:600;padding:0;font-size:14px;display:grid;place-items:center}.inline-create button.ghost:hover{background:var(--accent);color:#fff}.user-card{display:flex;align-items:center;gap:10px;width:100%;padding:10px 12px;background:var(--panel-2);border-top:1px solid var(--line);border-right:0;border-bottom:0;border-left:0;color:inherit;text-align:left;cursor:pointer;transition:background .12s ease}.user-card:hover{background:var(--panel-3)}.user-card .dm-avatar{width:28px;height:28px;font-size:12px}.user-card .user-meta{flex:1;min-width:0}.user-card .user-meta strong{display:block;color:var(--text-strong);font-size:13px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.user-card .user-meta span{display:block;color:var(--muted);font-size:11px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}@media(max-width:820px){.workspace-header{min-height:calc(60px + var(--safe-area-top));padding-top:calc(14px + var(--safe-area-top));padding-right:calc(16px + var(--safe-area-right))}.sidebar-scroll{padding-bottom:calc(16px + var(--safe-area-bottom))}.user-card{padding-bottom:calc(10px + var(--safe-area-bottom))}}.messages{position:relative;display:flex;flex-direction:column}.messages-scroll{flex:1;min-height:0;overflow-y:auto;overflow-anchor:none;display:flex;flex-direction:column;padding:0 4px;opacity:1;transition:opacity .14s ease-out}.messages-scroll:focus{outline:none}.messages.is-revealing .messages-scroll{opacity:0;pointer-events:none;transition:opacity 0ms}.messages-spacer{flex-grow:1}.history-loader{display:grid;gap:14px;margin:4px 0 6px;padding:6px 18px;pointer-events:none;animation:history-loader-fade .22s ease-out both}.history-loader--newer{margin-top:6px;margin-bottom:4px}@keyframes history-loader-fade{0%{opacity:0}to{opacity:1}}.history-loader__row{display:grid;grid-template-columns:56px minmax(0,1fr);min-height:44px}.history-loader__avatar,.history-loader__meta,.history-loader__line,.history-loader__block{display:block;background:linear-gradient(90deg,color-mix(in srgb,var(--muted-2) 16%,transparent),color-mix(in srgb,var(--muted-2) 36%,transparent),color-mix(in srgb,var(--muted-2) 16%,transparent));background-size:220% 100%;animation:history-loading 1.4s ease-in-out infinite;animation-delay:calc(var(--history-row, 0) * 80ms)}.history-loader__avatar{width:38px;height:38px;border-radius:12px}.history-loader__body{display:grid;align-content:start;gap:8px;min-width:0;padding-top:4px}.history-loader__meta{width:min(180px,38%);height:11px;border-radius:999px}.history-loader__line{height:10px;border-radius:999px}.history-loader__line--wide{width:min(540px,72%)}.history-loader__line--mid{width:min(360px,48%)}@keyframes history-loading{0%{background-position:120% 0}to{background-position:-120% 0}}@media(prefers-reduced-motion:reduce){.history-loader{animation:none}.history-loader__avatar,.history-loader__meta,.history-loader__line,.history-loader__block{animation:none;background:color-mix(in srgb,var(--muted-2) 22%,transparent)}}.unread-bar{position:absolute;left:50%;top:10px;transform:translate(-50%);z-index:5;display:inline-flex;align-items:center;gap:6px;height:30px;padding:0 5px 0 14px;max-width:calc(100% - 32px);border-radius:999px;background:color-mix(in srgb,var(--panel) 82%,transparent);backdrop-filter:blur(14px) saturate(140%);-webkit-backdrop-filter:blur(14px) saturate(140%);border:1px solid color-mix(in srgb,var(--accent) 38%,transparent);color:var(--text);font-size:12px;font-weight:600;letter-spacing:.005em;box-shadow:inset 0 1px color-mix(in srgb,#fff 8%,transparent),0 10px 24px -14px #0000008c,0 0 0 4px color-mix(in srgb,var(--accent) 10%,transparent);opacity:1;transition:opacity .16s ease-out,transform .18s cubic-bezier(.2,.8,.2,1)}.unread-bar.is-clearing{opacity:0;pointer-events:none;transform:translate(-50%,-6px)}.unread-bar__jump,.unread-bar__mark{display:inline-flex;align-items:center;gap:8px;border:0;background:transparent;color:inherit;font:inherit;cursor:pointer;transition:background-color .12s ease-out,color .12s ease-out}.unread-bar__jump{flex:0 1 auto;min-width:0;padding:0 6px 0 0;text-align:left;color:color-mix(in srgb,var(--accent) 92%,var(--text))}.unread-bar__jump:before{content:"";flex-shrink:0;width:7px;height:7px;border-radius:50%;background:var(--accent);box-shadow:0 0 color-mix(in srgb,var(--accent) 55%,transparent);animation:unread-bar-pulse 1.8s ease-out infinite}@keyframes unread-bar-pulse{0%{box-shadow:0 0 color-mix(in srgb,var(--accent) 55%,transparent)}70%{box-shadow:0 0 0 7px color-mix(in srgb,var(--accent) 0%,transparent)}to{box-shadow:0 0 color-mix(in srgb,var(--accent) 0%,transparent)}}@media(prefers-reduced-motion:reduce){.unread-bar__jump:before{animation:none}}.unread-bar__mark{flex-shrink:0;height:22px;padding:0 10px;border-radius:999px;background:color-mix(in srgb,var(--accent) 14%,transparent);color:color-mix(in srgb,var(--accent) 90%,var(--text));font-size:11px;font-weight:600;letter-spacing:.01em}.unread-bar__jump:hover{color:var(--accent)}.unread-bar__mark:hover{background:color-mix(in srgb,var(--accent) 24%,transparent);color:var(--accent)}.unread-bar__jump:focus-visible,.unread-bar__mark:focus-visible{outline:2px solid color-mix(in srgb,var(--accent) 70%,transparent);outline-offset:2px;border-radius:999px}.unread-bar__label{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.typing-indicator{display:flex;align-items:center;gap:8px;height:0;padding:0 22px;margin-top:0;font-size:12px;color:var(--text-muted);opacity:0;transform:translateY(2px);overflow:hidden;transition:height .12s ease-out,margin-top .12s ease-out,opacity .12s ease-out,transform .16s cubic-bezier(.2,.8,.2,1);pointer-events:none}.typing-indicator.visible{height:20px;margin-top:-4px;opacity:1;transform:translateY(0)}.composer-dock{position:relative;padding-top:20px}.composer-dock .agent-responding{position:absolute;top:0;left:0;right:0;height:20px;margin:0;padding:0 22px;display:flex;align-items:center;overflow:hidden;opacity:0;transform:none;transition:opacity .12s ease-out;pointer-events:none}.composer-dock .agent-responding.visible{height:20px;margin:0;opacity:1;transform:none}.typing-indicator__dots{display:inline-flex;align-items:center;gap:3px}.typing-indicator__dots i{width:4px;height:4px;border-radius:50%;background:currentColor;opacity:.55;animation:typing-dot 1.1s ease-in-out infinite}.typing-indicator__dots i:nth-child(2){animation-delay:.15s}.typing-indicator__dots i:nth-child(3){animation-delay:.3s}@keyframes typing-dot{0%,60%,to{transform:translateY(0);opacity:.35}30%{transform:translateY(-3px);opacity:1}}.message-row.is-pending{opacity:.55}.message-row.is-pending .message-content,.message-row.is-pending .markdown{pointer-events:none}.message-row.is-failed{opacity:1}.message-failed{display:inline-flex;align-items:center;gap:10px;margin-top:6px;padding:4px 10px;border-radius:999px;background:color-mix(in srgb,var(--danger, #d04848) 14%,transparent);color:var(--danger, #d04848);font-size:12px}.message-failed__label{font-weight:500}.message-failed__action{background:transparent;border:1px solid currentColor;color:inherit;font:inherit;padding:2px 8px;border-radius:999px;cursor:pointer;line-height:1}.message-failed__action:hover{background:color-mix(in srgb,currentColor 12%,transparent)}.message-failed__action--ghost{border-color:color-mix(in srgb,currentColor 50%,transparent)}@media(prefers-reduced-motion:reduce){.typing-indicator{transition:opacity 80ms ease-out;transform:none}.typing-indicator.visible{transform:none}.typing-indicator__dots i{animation:none;opacity:.7}}.empty{display:grid;place-items:center;align-content:center;text-align:center;gap:10px;min-height:50vh;padding:48px 24px}.empty-icon{width:64px;height:64px;border-radius:18px;background:linear-gradient(135deg,var(--accent),#b46cff);color:#fff;display:grid;place-items:center;font-size:26px;font-weight:800;box-shadow:0 18px 40px -16px #6f7effb3}.empty strong{color:var(--text-strong);font-size:18px;letter-spacing:-.01em}.empty span{color:var(--muted);max-width:380px;line-height:1.5}.day-divider{display:flex;align-items:center;gap:12px;margin:18px 18px 8px;pointer-events:none}.day-divider:before,.day-divider:after{content:"";flex:1;height:1px;background:var(--line)}.day-divider span{background:var(--bg);border:1px solid var(--line);border-radius:999px;padding:4px 12px;font-size:11px;font-weight:600;color:var(--muted);text-transform:uppercase;letter-spacing:.04em}.new-messages-divider{display:flex;align-items:center;gap:0;margin:4px 0 2px;padding:0 18px;pointer-events:none;position:relative;opacity:1;transform:translateY(0);transition:opacity .16s ease-out,transform .18s cubic-bezier(.2,.8,.2,1)}.new-messages-divider.is-clearing{opacity:0;transform:translateY(-4px)}.new-messages-divider:before{content:"";flex:1;height:1px;background:var(--danger, #ed4245);opacity:.9}.new-messages-divider span{display:inline-flex;align-items:center;height:14px;padding:0 5px;margin-left:8px;background:var(--danger, #ed4245);color:#fff;font-size:9px;font-weight:700;letter-spacing:.04em;text-transform:uppercase;border-radius:3px}.message-group{display:grid;grid-template-columns:56px minmax(0,1fr);padding:8px 18px;position:relative}.message-group:hover{background:var(--hover)}.avatar{width:38px;height:38px;border-radius:12px;display:grid;place-items:center;color:#fff;font-weight:700;font-size:14px;background:linear-gradient(135deg,hsl(var(--hue, 220deg) 70% 55%),hsl(calc(var(--hue, 220deg) + 40deg) 70% 45%));box-shadow:0 6px 20px -10px #0009;margin-top:2px;overflow:hidden}.avatar-button{position:relative;z-index:2;border:0;padding:0;cursor:pointer;transition:transform .1s ease,box-shadow .12s ease,filter .12s ease}.avatar-button:hover{transform:translateY(-1px);filter:brightness(1.05);box-shadow:0 10px 24px -12px #000c}.avatar.small{width:30px;height:30px;font-size:12px;border-radius:10px}.avatar.large{width:56px;height:56px;border-radius:16px;font-size:18px;margin:0}.group-body{min-width:0}.group-body>header{display:flex;align-items:baseline;gap:8px;margin-bottom:2px}.group-body>header strong{color:var(--text-strong);font-size:14.5px;letter-spacing:-.005em;font-weight:700}.author-name{border:0;background:transparent;color:var(--text-strong);padding:0;border-radius:4px;font-size:14.5px;letter-spacing:0;font-weight:700}.author-name:hover{color:var(--accent);text-decoration:underline;text-underline-offset:2px}.group-body>header time{color:var(--muted);font-size:11px}.group-body>header span{color:var(--muted);font-size:12px}.bot-chip{display:inline-flex;align-items:center;height:18px;padding:0 6px;border:1px solid color-mix(in srgb,var(--accent) 45%,transparent);border-radius:999px;color:var(--accent);font-size:10px;font-weight:800;line-height:1;text-transform:uppercase}.message-row{margin-left:-56px;padding:1px 0 1px 56px;position:relative;border-radius:0;transition:background 80ms ease}.message-row:not(:first-child){margin-top:1px}.message-row.selected{background:var(--accent-soft)}.message-row.selected:before{content:"";position:absolute;left:0;top:0;bottom:0;width:3px;background:var(--accent)}.message-row.can-open-thread{cursor:pointer}.row-stamp{position:absolute;left:8px;top:4px;font-size:10px;color:var(--muted-2);opacity:0;font-variant-numeric:tabular-nums}.message-row.is-preamble{background:transparent;margin-bottom:6px;padding-top:4px;padding-bottom:4px}.message-row.is-preamble:not(.before-final-message) .message-content{padding:7px 11px;border:1px solid color-mix(in srgb,var(--activity-accent) 20%,var(--line-strong));border-left:3px solid var(--activity-accent);border-radius:11px;background:var(--activity-accent-soft)}.message-row.is-preamble-collapsed .message-content{padding-top:4px;padding-bottom:4px}.message-row.is-preamble.before-final-message{background:transparent;margin-bottom:0;padding-top:2px;padding-bottom:0}.message-row.after-preamble{margin-top:0;padding-top:0;padding-bottom:2px}.message-row.is-preamble.before-final-message:before{display:none}.message-row.is-preamble.before-final-message .message-content{padding:7px 11px;border:1px solid color-mix(in srgb,var(--activity-accent) 20%,var(--line-strong));border-left:3px solid var(--activity-accent);background:var(--activity-accent-soft)}.message-row.is-preamble.before-final-message .message-content{border-top-left-radius:11px;border-top-right-radius:11px;border-bottom:0}.message-row.after-preamble .message-content{padding:7px 11px;border:1px solid color-mix(in srgb,var(--delivery-accent) 26%,var(--line-strong));border-left:3px solid var(--delivery-accent);border-top:0;border-bottom-left-radius:11px;border-bottom-right-radius:11px;background:var(--delivery-accent-soft)}.message-row.is-preamble.before-final-message.is-preamble-collapsed .message-content{padding-top:7px;padding-bottom:7px;background:color-mix(in srgb,var(--activity-accent) 10%,var(--panel));border-bottom:1px solid color-mix(in srgb,var(--activity-accent) 30%,transparent)}.message-group.is-self .message-content{width:fit-content;max-width:min(100%,680px);padding:7px 11px;border:1px solid color-mix(in srgb,var(--accent) 22%,var(--line-strong));border-left:3px solid var(--accent);border-radius:11px;background:var(--user-bubble-soft)}:root[data-user-align=right] .message-group.is-self{grid-template-columns:minmax(0,1fr) 56px}:root[data-user-align=right] .message-group.is-self>.avatar{grid-column:2;grid-row:1;justify-self:end}:root[data-user-align=right] .message-group.is-self>.group-body{grid-column:1;grid-row:1;min-width:0}:root[data-user-align=right] .message-group.is-self .group-body>header{justify-content:flex-end}:root[data-user-align=right] .message-group.is-self .message-content{margin-left:auto}:root[data-user-align=right] .message-group.is-self .markdown{text-align:right}.preamble-contract{display:grid;gap:7px;min-width:0}.preamble-toggle{display:grid;grid-template-columns:auto auto auto minmax(0,1fr);align-items:center;gap:7px;width:100%;min-height:20px;padding:0;border:0;background:transparent;color:var(--activity-accent);font:inherit;text-align:left;cursor:pointer}.preamble-chevron{color:var(--activity-accent);font-size:10px;transition:transform .12s ease}.preamble-chevron.open{transform:rotate(90deg)}.preamble-state,.preamble-action{line-height:1}.preamble-state{display:inline-flex;align-items:center;height:17px;padding:0 7px;border:1px solid color-mix(in srgb,var(--activity-accent) 30%,transparent);border-radius:999px;color:var(--activity-accent);font-size:9.5px;font-weight:750;text-transform:uppercase;letter-spacing:.03em}.preamble-state.is-live{border-color:color-mix(in srgb,var(--activity-accent) 55%,transparent);animation:preamble-live-pulse 1.6s ease-in-out infinite}@keyframes preamble-live-pulse{0%,to{opacity:1}50%{opacity:.45}}@media(prefers-reduced-motion:reduce){.preamble-state.is-live{animation:none}}.preamble-action{min-width:0;color:var(--muted);font-size:11px;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.preamble-body{color:var(--muted);min-width:0;overflow-wrap:anywhere;word-break:break-word}.preamble-flow{display:grid;gap:7px;padding-left:17px;min-width:0}.preamble-tool{--tool-accent: var(--activity-accent);min-width:0;border-radius:7px;background:var(--tool-call-bg);overflow:hidden}.preamble-tool-summary{display:flex;align-items:baseline;gap:7px;width:100%;min-width:0;padding:4px 9px;border:0;background:transparent;font:inherit;line-height:1.5;text-align:left;cursor:pointer}.preamble-tool-summary:hover{background:var(--tool-call-bg-hover)}.preamble-tool-full{display:grid;gap:5px;padding:2px 10px 8px 27px;color:var(--muted);font-size:12px;min-width:0;overflow-wrap:anywhere;word-break:break-word}.preamble-tool-full-head{font-family:ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,monospace;font-size:11px;font-weight:600;color:color-mix(in srgb,var(--tool-accent) 45%,var(--muted))}.preamble-tool-full-body{min-width:0}.preamble-tool-full pre{white-space:pre-wrap;overflow-wrap:anywhere}.tool-line-chevron{flex-shrink:0;font-size:9px;color:var(--muted-2);transition:transform .12s ease}.tool-line-chevron.open{transform:rotate(90deg)}.tool-line-glyph{flex-shrink:0;font-size:11px;filter:saturate(.85)}.tool-line-action{flex-shrink:0;font-size:11.5px;font-weight:600;color:color-mix(in srgb,var(--tool-accent) 38%,var(--text))}.tool-line-name{flex-shrink:0;max-width:40%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:11px;font-weight:500;color:color-mix(in srgb,var(--tool-accent) 55%,var(--muted));font-family:ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,monospace}.tool-line-detail{min-width:0;flex:1 1 auto;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:11px;font-weight:400;color:var(--muted);font-family:ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,monospace;opacity:.85}.message-row:hover .row-stamp{opacity:1}.message-content{min-width:0}.thread-hint{display:inline-flex;align-items:center;gap:5px;min-height:22px;margin-top:5px;padding:2px 7px;border:1px solid color-mix(in srgb,var(--line-strong) 70%,transparent);border-radius:8px;background:color-mix(in srgb,var(--panel) 70%,transparent);color:var(--muted-2);font-size:11px;font-weight:700;line-height:1;cursor:pointer}.thread-hint:not(.has-replies):not(.is-open){width:24px;height:22px;justify-content:center;padding:0;opacity:.62}.thread-hint svg{flex:0 0 auto}.thread-hint time{color:var(--muted-2);font-size:10px;font-weight:700;font-variant-numeric:tabular-nums}.thread-hint.has-replies,.thread-hint.is-open{border-color:color-mix(in srgb,var(--accent) 48%,var(--line-strong));background:color-mix(in srgb,var(--accent-soft) 70%,transparent);color:var(--text-strong)}.thread-hint.has-replies time,.thread-hint.is-open time{color:var(--muted)}.thread-hint:hover{border-color:color-mix(in srgb,var(--accent) 55%,var(--line-strong));background:var(--hover-strong);color:var(--text-strong)}.thread-hint:disabled{cursor:default;opacity:.45}.message-actions{display:flex;align-items:flex-start;gap:4px;opacity:0;transform:translateY(-50%);position:absolute;right:8px;top:0;background:var(--panel);border:1px solid var(--line-strong);border-radius:8px;padding:2px;box-shadow:var(--shadow);transition:opacity .1s ease,transform .1s ease}.message-row:hover .message-actions,.message-row.selected .message-actions{opacity:1}.message-actions button{width:28px;height:28px;display:grid;place-items:center;border:0;border-radius:6px;background:transparent;color:var(--muted)}.message-actions button:hover{background:var(--hover-strong);color:var(--text-strong)}.markdown{line-height:1.5;color:var(--text);font-size:14.5px;overflow-wrap:anywhere;word-break:break-word}.markdown>:first-child{margin-top:0}.markdown>:last-child{margin-bottom:0}.markdown p{margin:0}.markdown p+p,.markdown ul,.markdown ol,.markdown blockquote,.markdown pre{margin-top:6px}.markdown a{color:var(--accent);text-decoration:none}.markdown a:hover{text-decoration:underline}.markdown code{background:var(--panel-2);border:1px solid var(--line);border-radius:4px;padding:1px 5px;font-family:Geist Mono Variable,JetBrains Mono,ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:.9em}.markdown pre{background:var(--panel-2);border:1px solid var(--line);border-radius:var(--radius);padding:12px 14px;overflow-x:auto}.markdown pre code{background:transparent;border:0;padding:0}.markdown blockquote{border-left:3px solid var(--accent);margin:0;padding:4px 0 4px 12px;color:var(--muted)}.markdown ul,.markdown ol{padding-left:22px}.markdown img{max-width:100%;max-height:360px;border-radius:var(--radius);margin-top:6px;border:1px solid var(--line);object-fit:contain;background:var(--panel);cursor:zoom-in}.gif-player{position:relative;display:inline-block;max-width:100%;vertical-align:top}.gif-player img{display:block}.gif-badge,.gif-replay{position:absolute;z-index:1;border:0;color:#fff;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px)}.gif-badge{left:9px;bottom:9px;padding:4px 7px;border-radius:999px;background:#0000008a;font-size:10px;font-weight:800;letter-spacing:.04em;pointer-events:none}.gif-replay{right:9px;bottom:9px;width:30px;height:30px;display:grid;place-items:center;border-radius:999px;background:#0a0c12b8;font-size:16px;line-height:1;opacity:0;transform:scale(.88);pointer-events:none;transition:opacity .13s ease,transform .13s ease,background .12s ease}.gif-replay:hover{background:var(--accent)}.gif-player.paused .gif-replay{opacity:1;transform:scale(1);pointer-events:auto}.gif-player.playing .gif-badge{animation:gif-breathe .9s ease-in-out infinite}@keyframes gif-breathe{0%,to{opacity:.85}50%{opacity:.45}}.attachment-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:8px;margin-top:8px;max-width:560px}.attachment-grid.compact{grid-template-columns:minmax(0,1fr);max-width:420px}.media-tile{position:relative;display:block;width:100%;margin:0;padding:0;border:1px solid var(--line);border-radius:var(--radius-lg);background:#0a0c12;overflow:hidden;isolation:isolate;text-align:left;color:inherit;text-decoration:none;cursor:pointer;transition:border-color .14s ease,transform .14s ease,box-shadow .14s ease}.media-tile:hover{border-color:var(--line-strong);box-shadow:0 18px 40px -28px #000000e6}.media-tile:focus-visible{outline:none;border-color:var(--line-strong);box-shadow:0 0 0 2px color-mix(in srgb,var(--accent) 35%,transparent)}.media-tile--image{cursor:zoom-in}.media-tile__open{display:block;width:100%;margin:0;padding:0;border:0;background:transparent;color:inherit;cursor:zoom-in}.media-tile__open:focus{outline:0}.media-tile__open:focus-visible+.media-tile__caption .media-tile__name{text-decoration:underline;text-decoration-thickness:1px;text-underline-offset:3px}.media-tile--video{cursor:default}.media-tile img,.media-tile video{display:block;width:100%;max-height:360px;object-fit:contain;background:#05070d}.media-tile--image img{max-height:320px}.media-tile__caption{position:absolute;inset:auto 0 0;z-index:3;display:flex;align-items:center;gap:8px;padding:22px 10px 8px;background:linear-gradient(to top,#000000c7,#00000080 40%,#0000);opacity:0;pointer-events:none;transition:opacity .14s ease}.media-tile__caption>*{pointer-events:auto}.media-tile:hover .media-tile__caption,.media-tile:focus-within .media-tile__caption{opacity:1}.media-tile--video.is-started .media-tile__caption{display:none}.media-tile__name{flex:1;min-width:0;color:#fff;font-size:12px;font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;text-shadow:0 1px 2px rgba(0,0,0,.6)}.media-tile__chip{position:relative;z-index:4;display:inline-grid;place-items:center;width:28px;height:28px;flex:none;border-radius:8px;background:#00000080;color:#fff;border:1px solid rgba(255,255,255,.18);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);text-decoration:none;transition:background .12s ease,border-color .12s ease,transform .12s ease}.media-tile__chip:hover{background:#000000b3;border-color:#ffffff52;transform:translateY(-1px)}.media-tile__play{position:absolute;inset:0 0 48px;display:grid;place-items:center;width:100%;height:auto;border:0;margin:0;padding:0;background:transparent;cursor:pointer;z-index:1}.media-tile__play:before{content:"";position:absolute;inset:0;background:radial-gradient(ellipse at center,#0000002e,#0000000d 45%,#0000 70%);opacity:.7;transition:opacity .16s ease;pointer-events:none}.media-tile__play:hover:before{opacity:.9}.media-tile__play-icon{position:relative;display:grid;place-items:center;width:46px;height:46px;border-radius:999px;background:#0000008c;color:#fff;backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);box-shadow:0 6px 20px -8px #0000008c;padding-left:3px;transition:transform .2s cubic-bezier(.2,.8,.2,1),background .18s ease,box-shadow .2s ease}.media-tile__play-icon svg{filter:drop-shadow(0 1px 2px rgba(0,0,0,.4))}.media-tile__play:hover .media-tile__play-icon{transform:scale(1.06);background:#000000b3;box-shadow:0 10px 28px -10px #000000a6}.media-tile__play:active .media-tile__play-icon{transform:scale(.97);transition-duration:80ms}.media-tile__play:focus-visible{outline:none}.media-tile__play:focus-visible .media-tile__play-icon{box-shadow:0 0 0 2px #fff9,0 10px 28px -10px #000000a6}.media-tile__duration{position:absolute;left:8px;bottom:8px;z-index:2;padding:2px 6px;border-radius:4px;background:#000000b8;color:#fff;font-size:11px;font-variant-numeric:tabular-nums;font-weight:600;letter-spacing:.02em;pointer-events:none}.file-attachment{display:flex;align-items:center;gap:10px;max-width:360px;padding:10px;border:1px solid var(--line);border-radius:var(--radius);background:var(--panel)}.file-attachment:hover{border-color:var(--line-strong);background:var(--panel-2)}.file-icon{width:34px;height:34px;display:grid;place-items:center;border-radius:8px;background:var(--accent-soft);color:var(--accent);font-weight:800}.file-attachment strong,.file-attachment small{display:block}.file-attachment strong{color:var(--text-strong);font-size:13px}.file-attachment small{color:var(--muted);font-size:11px}.audio-attachment,.document-attachment{width:min(100%,420px);border:1px solid var(--line);border-radius:var(--radius);background:var(--panel);overflow:hidden}.audio-attachment{display:grid;gap:10px;padding:10px}.audio-attachment__meta{display:flex;align-items:center;gap:10px;min-width:0}.audio-attachment audio{width:100%;height:36px}.document-attachment{display:grid;grid-template-columns:64px minmax(0,1fr) auto;align-items:center;gap:12px;padding:10px}.document-attachment__thumbnail{position:relative;display:inline-grid;place-items:center;width:64px;height:82px;border:1px solid var(--line);border-radius:6px;background:linear-gradient(135deg,transparent 0 76%,var(--panel-3) 76% 100%),linear-gradient(180deg,#fff,#f0f2f7);color:var(--accent);font-size:13px;font-weight:800;letter-spacing:0;text-decoration:none;overflow:hidden;box-shadow:0 8px 18px -16px #0009}.document-attachment__thumbnail.has-preview{background:#fff}.document-attachment__preview-canvas{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;opacity:0;transition:opacity .16s ease}.document-attachment__thumbnail.has-preview .document-attachment__preview-canvas{opacity:1}.document-attachment__thumbnail.has-preview span{position:absolute;left:5px;top:5px;border-radius:4px;padding:2px 4px;background:#10121ac7;color:#fff;font-size:9px;line-height:1}.document-attachment__thumbnail:before,.document-attachment__thumbnail:after{content:"";position:absolute;left:14px;right:14px;height:2px;border-radius:999px;background:color-mix(in srgb,var(--muted) 36%,transparent)}.document-attachment__thumbnail:before{top:48px}.document-attachment__thumbnail:after{top:56px}.document-attachment__thumbnail.has-preview:before,.document-attachment__thumbnail.has-preview:after{display:none}.document-attachment__meta{display:grid;gap:5px;min-width:0}.document-attachment__title{min-width:0;color:var(--text-strong);font-size:13px;font-weight:700;text-decoration:none;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.document-attachment__title:hover{text-decoration:underline;text-underline-offset:3px}.document-attachment__meta small{color:var(--muted);font-size:11px;white-space:nowrap}.document-attachment__download{display:inline-grid;place-items:center;width:30px;height:30px;border-radius:8px;color:var(--muted);text-decoration:none;transition:background .12s ease,color .12s ease}.document-attachment__download:hover{background:var(--panel-2);color:var(--text-strong)}@media(max-width:520px){.message-group{grid-template-columns:44px minmax(0,1fr);padding:7px 12px}:root[data-user-align=right] .message-group.is-self{grid-template-columns:minmax(0,1fr) 44px}.message-row{margin-left:-44px;padding-left:44px}.row-stamp{display:none}.attachment-grid,.attachment-grid.compact{grid-template-columns:minmax(0,1fr);max-width:100%}}.composer{--composer-card-top: 8px;--composer-overlay-gap: 8px;--composer-overlay-inset-x: 18px;padding:8px 18px 6px;background:var(--bg);display:grid;gap:0;position:relative}.composer-card{display:flex;flex-direction:column;background:var(--panel);border:1px solid var(--line-strong);border-radius:var(--radius-lg);overflow:hidden;transition:border-color .12s ease,box-shadow .12s ease}.composer:focus-within .composer-card{border-color:color-mix(in srgb,var(--accent) 55%,var(--line-strong));box-shadow:0 0 0 3px color-mix(in srgb,var(--accent) 14%,transparent)}.composer-suggestions{position:absolute;left:var(--composer-overlay-inset-x);bottom:calc(100% - var(--composer-card-top) + var(--composer-overlay-gap));z-index:40;width:min(560px,calc(100% - (var(--composer-overlay-inset-x) * 2)));max-height:min(320px,45vh);margin:0;overflow-x:hidden;overflow-y:auto;border:1px solid var(--line-strong);border-radius:12px;background:color-mix(in srgb,var(--panel) 97%,transparent);box-shadow:var(--shadow)}.composer-suggestions button{width:100%;min-height:48px;display:grid;grid-template-columns:30px minmax(0,1fr) auto;align-items:center;gap:10px;padding:8px 10px;border:0;border-bottom:1px solid var(--line);border-radius:0;background:transparent;color:var(--text);text-align:left}.composer-suggestions button:last-child{border-bottom:0}.composer-suggestions button:hover,.composer-suggestions button.active{background:var(--hover-strong)}.suggestion-mark{width:30px;height:30px;display:grid;place-items:center;border-radius:8px;background:var(--accent-soft);color:var(--accent);font-size:13px;font-weight:800}.suggestion-copy{min-width:0;display:grid;gap:2px}.suggestion-copy strong,.suggestion-copy span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.suggestion-copy strong{color:var(--text-strong);font-size:13px}.suggestion-copy span{color:var(--muted);font-size:12px}.suggestion-kind{color:var(--muted-2);font-size:11px;font-weight:700;text-transform:uppercase}.composer-toolbar{display:inline-flex;align-items:center;gap:2px;width:100%;min-width:0;padding:4px 6px;margin:0;border:0;border-top:1px solid var(--line);border-radius:0;background:color-mix(in srgb,var(--panel-2) 35%,transparent);box-shadow:none;overflow-x:auto;overflow-y:hidden;scrollbar-width:none;-webkit-overflow-scrolling:touch}.composer-toolbar::-webkit-scrollbar{display:none}.composer-toolbar button{flex:0 0 auto;min-width:28px;height:26px;display:grid;place-items:center;border:0;border-radius:6px;background:transparent;color:var(--text);opacity:.78;font-size:11.5px;font-weight:700;transition:background .1s ease,color .1s ease,opacity .1s ease,transform 80ms ease}.composer-toolbar button:hover{background:var(--hover-strong);color:var(--text-strong);opacity:1}.composer-toolbar button.active{background:var(--accent-soft);color:var(--accent);opacity:1}.composer-toolbar button:active{transform:translateY(1px)}.gif-picker{margin-top:8px;margin-bottom:8px;width:min(520px,calc(100vw - 40px));border:1px solid var(--line-strong);border-radius:16px;background:color-mix(in srgb,var(--panel) 96%,transparent);box-shadow:var(--shadow);padding:10px;animation:picker-in .16s cubic-bezier(.2,.8,.2,1)}.gif-picker-head{display:grid;grid-template-columns:auto minmax(0,1fr);align-items:center;gap:10px;padding:2px 2px 10px}.gif-picker-head strong{color:var(--text-strong);font-size:13px}.gif-picker-head input{min-width:0;height:32px;padding:0 10px;border:1px solid var(--line);border-radius:var(--radius);background:var(--panel-2)}.gif-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:8px;max-height:240px;overflow-y:auto}.gif-grid button{position:relative;overflow:hidden;aspect-ratio:4 / 3;border:0;border-radius:12px;background:var(--panel-2);color:#fff;padding:0;box-shadow:inset 0 0 0 1px var(--line);transition:transform .12s ease,box-shadow .12s ease}.gif-grid button:hover{transform:translateY(-2px);box-shadow:inset 0 0 0 2px var(--accent),0 14px 30px -22px #000c}.gif-grid img{width:100%;height:100%;display:block;object-fit:cover}.gif-grid span{position:absolute;left:6px;right:6px;bottom:6px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;border-radius:999px;background:#0000008f;padding:4px 7px;font-size:10.5px;font-weight:700;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px)}@keyframes picker-in{0%{opacity:0;transform:translateY(8px) scale(.98)}to{opacity:1;transform:translateY(0) scale(1)}}.composer-row{--composer-control-size: 36px;--composer-line-height: 22px;--composer-text-padding-block: 7px;display:grid;grid-template-columns:auto minmax(0,1fr) auto;align-items:start;gap:4px;padding:8px 8px 4px 10px;background:transparent;border:0;border-radius:0}.composer:focus-within .composer-toolbar,.composer-row:focus-within{border-color:transparent}.composer-row:focus-within{box-shadow:none}.composer-icon{align-self:start;width:var(--composer-control-size);height:var(--composer-control-size);margin-top:calc(var(--composer-text-padding-block) + (var(--composer-line-height) - var(--composer-control-size)) / 2);display:grid;place-items:center;color:var(--muted);border-radius:10px;cursor:pointer;transition:background .12s ease,color .12s ease}.composer-icon:hover{background:var(--hover-strong);color:var(--text-strong)}.composer-icon input[type=file]{position:absolute;inline-size:1px;block-size:1px;opacity:0;pointer-events:none}.composer textarea,.reply-composer textarea{width:100%;height:auto;min-height:44px;max-height:50vh;padding:var(--composer-text-padding-block) 4px;resize:none;color:var(--text);line-height:var(--composer-line-height);font-size:14.5px;align-self:start;overflow-y:auto;box-sizing:border-box}.composer textarea::placeholder,.reply-composer textarea::placeholder{color:var(--muted)}.send{align-self:start;width:var(--composer-control-size);height:var(--composer-control-size);margin-top:calc(var(--composer-text-padding-block) + (var(--composer-line-height) - var(--composer-control-size)) / 2);display:grid;place-items:center;border:0;border-radius:10px;background:var(--accent);color:#fff;transition:background .12s ease,transform 80ms ease,opacity .12s ease}.send:hover:not(:disabled){background:var(--accent-2);transform:translateY(-1px)}.send:disabled{background:var(--panel-3);color:var(--muted-2);cursor:not-allowed}.composer-attachment{margin-top:8px;margin-bottom:8px;display:inline-flex;align-items:center;gap:8px;padding:6px 10px;background:var(--panel);border:1px solid var(--line);border-radius:var(--radius);color:var(--text);font-size:13px;width:fit-content}.attachment-icon{display:grid;place-items:center;width:20px;height:20px;border-radius:6px;background:var(--accent-soft);color:var(--accent)}.pending-image{width:42px;height:32px;object-fit:cover;border-radius:7px;border:1px solid var(--line);background:var(--panel-2)}.attachment-name{max-width:240px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.attachment-remove{width:18px;height:18px;border:0;background:transparent;color:var(--muted);border-radius:50%;font-size:14px;line-height:1}.attachment-remove:hover{background:var(--danger);color:#fff}.composer-hint{color:var(--muted-2);font-size:11px;padding:7px 4px 0}.composer-hint kbd{display:inline-block;background:var(--panel-2);border:1px solid var(--line);border-radius:4px;padding:0 5px;font-family:Geist Mono Variable,ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:10.5px;color:var(--text)}@media(max-width:820px){.composer{padding:8px calc(14px + var(--safe-area-right)) calc(6px + var(--safe-area-bottom)) calc(14px + var(--safe-area-left))}.composer textarea,.reply-composer textarea{font-size:16px}.composer-suggestions{max-height:min(320px,42dvh)}}.thread{display:grid;grid-template-rows:auto minmax(0,1fr) auto;background:var(--panel);border-left:1px solid var(--line);min-width:0;overflow:hidden;opacity:0;transform:translate(28px);pointer-events:none;transition:opacity .18s ease,transform .22s cubic-bezier(.2,.8,.2,1)}.thread.open{opacity:1;transform:translate(0);pointer-events:auto}.thread>header{display:flex;align-items:center;justify-content:space-between;padding:12px 16px;min-height:60px;border-bottom:1px solid var(--line);background:linear-gradient(180deg,rgba(255,255,255,.02),transparent),var(--panel)}.thread>header p,.thread>header strong{margin:0}.thread>header p{color:var(--muted);font-size:11px;text-transform:uppercase;letter-spacing:.04em;font-weight:700}.thread>header strong{display:block;color:var(--text-strong);font-size:14px}.thread .close{width:28px;height:28px;border:0;border-radius:50%;background:var(--panel-2);color:var(--muted);font-size:18px;line-height:1}.thread .close:hover{background:var(--panel-3);color:var(--text-strong)}.thread-scroll{overflow-y:auto;padding:12px 16px}.thread-root{display:grid;grid-template-columns:38px minmax(0,1fr);gap:12px;padding-bottom:12px;border-bottom:1px solid var(--line)}.thread-divider{display:flex;align-items:center;gap:10px;margin:14px 0 10px}.thread-divider:before,.thread-divider:after{content:"";flex:1;height:1px;background:var(--line)}.thread-divider span{font-size:11px;color:var(--muted);text-transform:uppercase;letter-spacing:.04em;font-weight:700}.reply-list{display:flex;flex-direction:column;gap:10px}.reply{display:grid;grid-template-columns:30px minmax(0,1fr);gap:10px;padding:6px;border-radius:var(--radius-sm)}.reply:hover{background:var(--hover)}.reply-composer{--composer-card-top: 10px;--composer-overlay-inset-x: 14px;padding:10px 14px 14px;background:var(--panel);border-top:1px solid var(--line)}.reply-composer .composer-row{border-radius:0}.thread-empty{display:grid;place-items:center;align-content:center;gap:8px;padding:32px 24px;text-align:center;grid-row:span 3}.thread-icon{width:56px;height:56px;border-radius:16px;background:var(--panel-2);color:var(--muted);display:grid;place-items:center}.thread-empty strong{color:var(--text-strong);font-size:15px}.thread-empty span{color:var(--muted);font-size:13px;max-width:260px;line-height:1.5}.profile-pane{overflow-y:auto}.profile-hero{min-height:210px;display:grid;place-items:end center;padding:28px 20px;background:linear-gradient(180deg,transparent,rgba(0,0,0,.24)),linear-gradient(135deg,hsl(var(--hue, 220deg) 76% 58%),hsl(calc(var(--hue, 220deg) + 54deg) 74% 38%));border-bottom:1px solid var(--line)}.profile-avatar{width:min(240px,70%);aspect-ratio:1;display:grid;place-items:center;overflow:hidden;border-radius:16px;background:#ffffff2e;color:#fff;font-size:clamp(48px,12vw,88px);font-weight:800;box-shadow:0 26px 60px -30px #000000e6}.profile-avatar img{width:100%;height:100%;object-fit:cover}.profile-pane-body{display:grid;gap:18px;padding:18px 16px 22px}.profile-pane-title{display:flex;align-items:flex-start;justify-content:space-between;gap:12px}.profile-pane-title h2{margin:0;color:var(--text-strong);font-size:22px;letter-spacing:0}.profile-pane-title span{display:block;margin-top:3px;color:var(--muted);font-size:13px}.profile-pane-title .bot-badge{display:inline-flex;align-items:center;min-height:20px;margin-top:6px;padding:0 8px;border:1px solid color-mix(in srgb,var(--accent) 45%,transparent);border-radius:999px;color:var(--accent);font-size:11px;font-weight:800;line-height:1}.text-action{border:0;border-radius:6px;background:transparent;color:var(--accent);font-size:13px;font-weight:700;padding:4px 6px}.text-action:hover{background:var(--accent-soft)}.profile-presence{display:inline-flex;align-items:center;gap:8px;color:var(--text);font-size:14px}.profile-actions-row{display:grid;grid-template-columns:repeat(auto-fit,minmax(132px,1fr));gap:10px}.profile-actions-row .primary-action,.profile-actions-row .ghost-action{display:inline-flex;align-items:center;justify-content:center;width:100%;height:48px;min-width:0;padding:0 16px;border-radius:var(--radius);font-size:14px;font-weight:800;line-height:1;white-space:nowrap}.moderation-actions{display:grid;grid-template-columns:repeat(auto-fit,minmax(108px,1fr));gap:8px}.moderation-actions .primary-action,.moderation-actions .ghost-action,.moderation-actions .danger-action{min-height:40px;border-radius:var(--radius);font-size:13px;font-weight:800}.danger-action{border:1px solid color-mix(in srgb,var(--danger),transparent 35%);background:color-mix(in srgb,var(--danger),transparent 86%);color:var(--danger)}.role-pill{padding:4px 8px;border-radius:999px;background:var(--panel-2);color:var(--muted);font-size:11px;font-weight:800;text-transform:uppercase}.profile-info{display:grid;gap:12px;padding-top:18px;border-top:1px solid var(--line)}.profile-info header{display:flex;align-items:center;justify-content:space-between;gap:10px}.profile-info header strong{color:var(--text-strong);font-size:14px}.profile-info-row{display:grid;grid-template-columns:48px minmax(0,1fr);gap:14px;align-items:center;min-height:48px}.info-icon{width:48px;height:48px;display:inline-flex;align-items:center;justify-content:center;border-radius:12px;background:var(--panel-2);color:var(--muted);line-height:1}.info-icon svg{display:block;flex:none}.profile-info-row>div>small,.profile-info-row>div>span{display:block}.profile-info-row>div>small{color:var(--muted);font-size:12px;line-height:1.2}.profile-info-row>div>span{color:var(--text);font-size:14px;line-height:1.3;overflow-wrap:anywhere}.profile-note{margin:0;color:var(--muted);line-height:1.5;font-size:13px}@media(max-width:820px){.thread{min-height:100dvh}.thread>header{min-height:calc(60px + var(--safe-area-top));padding-top:calc(12px + var(--safe-area-top));padding-right:calc(16px + var(--safe-area-right));padding-left:calc(16px + var(--safe-area-left))}.thread-scroll{padding-right:calc(16px + var(--safe-area-right));padding-left:calc(16px + var(--safe-area-left))}.reply-composer{padding-right:calc(14px + var(--safe-area-right));padding-bottom:calc(14px + var(--safe-area-bottom));padding-left:calc(14px + var(--safe-area-left))}}.modal-scrim{position:fixed;inset:0;z-index:50;display:grid;place-items:center;padding:24px;background:#05080f8a;-webkit-backdrop-filter:blur(14px);backdrop-filter:blur(14px)}.modal-backdrop{position:absolute;inset:0;border:0;background:transparent}.modal-backdrop:focus{outline:0}.profile-modal{position:relative;z-index:1;width:min(480px,100%);border:1px solid var(--line-strong);border-radius:14px;background:var(--panel);color:var(--text);box-shadow:var(--shadow);overflow:hidden}.create-modal{width:min(420px,100%)}.profile-modal>header{display:flex;align-items:center;justify-content:space-between;gap:16px;padding:18px 20px;border-bottom:1px solid var(--line);background:var(--panel-2)}.profile-modal p{margin:0 0 3px;color:var(--muted);font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.06em}.profile-modal h2{margin:0;color:var(--text-strong);font-size:20px;letter-spacing:0}.profile-modal>header button{width:32px;height:32px;border:0;border-radius:8px;background:transparent;color:var(--muted);font-size:22px}.profile-modal>header button:hover{background:var(--hover);color:var(--text-strong)}.profile-form{display:grid;gap:14px;padding:20px}.profile-preview{display:flex;align-items:center;gap:14px;padding:14px;border:1px solid var(--line);border-radius:var(--radius);background:var(--panel-2)}.profile-preview strong,.profile-preview span{display:block}.profile-preview strong{color:var(--text-strong);font-size:15px}.profile-preview span{color:var(--muted);font-size:13px}.field{display:grid;gap:6px}.field span{color:var(--muted);font-size:12px;font-weight:700}.field input,.field select{width:100%;height:38px;padding:0 12px;border:1px solid var(--line);border-radius:var(--radius-sm);background:var(--panel-2);color:var(--text)}.field select{cursor:pointer}.field input:focus,.field select:focus{border-color:var(--accent);outline:0;box-shadow:0 0 0 3px var(--accent-soft)}.check-field{display:flex;align-items:center;gap:10px}.check-field input{width:16px;height:16px;padding:0}.profile-status{color:var(--success);font-size:12px}.profile-status.error{color:var(--danger)}.profile-actions{display:flex;justify-content:flex-end;gap:8px;padding-top:4px}.person-picker{display:grid;gap:4px;max-height:240px;overflow-y:auto;padding:4px;border:1px solid var(--line);border-radius:var(--radius);background:var(--panel-2)}.person-choice{display:grid;grid-template-columns:32px minmax(0,1fr);align-items:center;gap:10px;width:100%;min-height:44px;border:0;border-radius:var(--radius-sm);background:transparent;color:var(--text);padding:6px 8px;text-align:left}.person-choice:hover{background:var(--hover-strong)}.person-choice .dm-avatar{width:32px;height:32px}.person-choice strong,.person-choice small{display:block;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.person-choice strong{color:var(--text-strong);font-size:13px}.person-choice small{color:var(--muted);font-size:12px}.person-empty{padding:10px 8px;color:var(--muted);font-size:12px}.profile-actions .ghost-action,.profile-actions .primary-action{box-sizing:border-box;display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto;min-height:44px;padding:0 14px;border-radius:var(--radius-sm);font-weight:700;line-height:1;white-space:nowrap}.ghost-action{border:1px solid var(--line);background:var(--panel);color:var(--text)}.primary-action{border:0;background:var(--accent);color:#fff}.ghost-action:hover{background:var(--hover)}.primary-action:hover{filter:brightness(1.04)}.image-viewer-scrim{padding:28px;background:#000000c7;-webkit-backdrop-filter:blur(18px);backdrop-filter:blur(18px)}.image-viewer{position:relative;z-index:1;display:grid;grid-template-rows:auto minmax(0,1fr);width:min(1120px,100%);max-height:min(86vh,900px);overflow:hidden;border-radius:14px;background:#07090f;color:#fff;box-shadow:0 34px 90px -34px #000000f2;animation:picker-in .15s cubic-bezier(.2,.8,.2,1)}.image-viewer>header{display:flex;align-items:center;justify-content:space-between;gap:16px;min-height:52px;padding:10px 12px 10px 16px;border-bottom:1px solid rgba(255,255,255,.1);background:#ffffff0a}.image-viewer>header strong{min-width:0;overflow:hidden;color:#fff;font-size:13px;text-overflow:ellipsis;white-space:nowrap}.image-viewer>header div{display:inline-flex;align-items:center;gap:8px;flex-shrink:0}.image-viewer>header a{height:30px;display:inline-flex;align-items:center;padding:0 10px;border-radius:7px;background:#ffffff14;color:#fff;font-size:12px;font-weight:700;text-decoration:none}.image-viewer>header a:hover{background:#ffffff24}.image-viewer>header button{width:30px;height:30px;display:grid;place-items:center;border:0;border-radius:7px;background:transparent;color:#ffffffc7;font-size:22px;line-height:1}.image-viewer>header button:hover{background:#ffffff1f;color:#fff}.image-viewer-stage{display:grid;place-items:center;min-height:0;padding:18px}.image-viewer-stage img{display:block;max-width:100%;max-height:calc(86vh - 96px);object-fit:contain;border-radius:8px;background:#ffffff0a}.mobile-nav-toggle{display:none;position:fixed;top:calc(14px + var(--safe-area-top));left:calc(14px + var(--safe-area-left));z-index:30;width:38px;height:38px;border-radius:10px;border:1px solid var(--line-strong);background:var(--panel);color:var(--text);font-size:22px;line-height:1}.mobile-nav-toggle .bars{display:grid;gap:3px}.mobile-nav-toggle .bars i{display:block;width:16px;height:2px;background:currentColor;border-radius:2px}.mobile-nav-backdrop{display:none}@media(max-width:1180px){.shell{grid-template-columns:72px 240px minmax(0,1fr)}.shell.sidebar-collapsed,.shell.sidebar-collapsed.thread-open{grid-template-columns:72px 0 minmax(0,1fr)}.thread{position:fixed;inset:0 0 0 auto;width:min(420px,100vw);box-shadow:var(--shadow);transform:translate(100%);transition:transform .18s ease;z-index:4;border-left:1px solid var(--line-strong)}.thread.open{transform:translate(0)}}@media(max-width:820px){.mobile-nav-toggle{display:grid;place-items:center}.shell,.shell.thread-open,.shell.sidebar-collapsed,.shell.sidebar-collapsed.thread-open{grid-template-columns:1fr}.sidebar-collapsed .sidebar{opacity:1;pointer-events:none;transform:translate3d(calc(-100% - 72px),0,0)}.guild-rail,.sidebar{position:fixed;inset:0 auto 0 0;z-index:20;height:100vh;height:100dvh;pointer-events:none;transform:translate3d(-100%,0,0);transition:transform .18s ease}.guild-rail{width:72px;padding-top:calc(14px + var(--safe-area-top));padding-bottom:calc(14px + var(--safe-area-bottom))}.sidebar{left:72px;width:min(260px,calc(100vw - 72px));transform:translate3d(calc(-100% - 72px),0,0)}.nav-open .guild-rail,.nav-open .sidebar{pointer-events:auto;transform:translateZ(0)}.nav-open .guild-rail{padding-top:calc(62px + var(--safe-area-top))}.mobile-nav-backdrop{display:block;position:fixed;top:0;right:0;bottom:0;left:min(332px,100vw);z-index:15;border:0;background:#05081075;padding:0}.topbar{min-height:calc(60px + var(--safe-area-top));padding-top:calc(12px + var(--safe-area-top));padding-right:calc(20px + var(--safe-area-right));padding-left:calc(64px + var(--safe-area-left))}.search{width:180px}}@media(max-width:520px){.search,.topbar-meta,.topbar-divider{display:none}}.message-row.highlight,.thread-root.highlight,.reply.highlight{animation:quote-flash 1.4s ease-out}@keyframes quote-flash{0%{background:#6366f138}to{background:transparent}}.quote-block{display:inline-flex;align-items:stretch;gap:.5rem;margin:0 0 .35rem;padding:.25rem .5rem .25rem 0;background:transparent;border:0;border-radius:6px;color:inherit;cursor:pointer;text-align:left;max-width:100%;font:inherit}.quote-block:hover:not(:disabled){background:#6366f114}.quote-block:disabled{cursor:default;opacity:.75}.quote-block .quote-bar{width:3px;align-self:stretch;background:var(--accent, #6366f1);border-radius:2px;flex:0 0 3px}.quote-block .quote-content{display:flex;flex-direction:column;gap:.1rem;min-width:0}.quote-block .quote-author{font-size:.78rem;font-weight:600;color:var(--accent, #6366f1)}.quote-block .quote-snippet{font-size:.85rem;color:var(--text-muted, #6b7280);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:56ch}.quote-block .quote-snippet.muted{font-style:italic;opacity:.75}.quote-preview{display:flex;align-items:center;gap:.5rem;padding:6px 10px 6px 12px;margin:0;background:color-mix(in srgb,var(--accent) 5%,transparent);border:0;border-bottom:1px solid var(--line);border-radius:0;font-size:12.5px;color:var(--muted)}.quote-preview .quote-bar{display:none}.quote-preview-body{display:flex;align-items:baseline;gap:.4rem;flex:1;min-width:0;overflow:hidden}.quote-preview-label{font-size:12px;color:color-mix(in srgb,var(--accent) 85%,var(--text));white-space:nowrap}.quote-preview-label strong{color:var(--text-strong);font-weight:600}.quote-preview-snippet{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:var(--muted);font-size:12px;flex:1;min-width:0}.quote-preview-clear{background:transparent;border:0;color:var(--muted);font-size:16px;line-height:1;cursor:pointer;padding:2px 6px;border-radius:6px;transition:background .1s ease,color .1s ease}.quote-preview-clear:hover{color:var(--text-strong);background:var(--hover-strong)}.reply-quote-btn{position:relative;margin-left:auto;background:transparent;border:0;color:var(--text-muted, #6b7280);cursor:pointer;font-size:.95rem;padding:0 .3rem;opacity:0;transition:opacity .15s}.reply:hover .reply-quote-btn,.thread-root:hover .reply-quote-btn,.reply-quote-btn:focus-visible{opacity:1}.reply-quote-btn:hover{color:var(--accent, #6366f1)}.tooltip{position:relative}.tooltip:before,.reply-quote-btn:before{content:attr(data-tooltip);position:absolute;left:50%;bottom:calc(100% + 12px);z-index:20;transform:translate(-50%,4px) scale(.96);padding:.42rem .62rem;border-radius:9px;background:#3a3a44;color:#f4f4f7;box-shadow:0 10px 28px #00000047;font-size:.78rem;font-weight:700;line-height:1;white-space:nowrap;opacity:0;pointer-events:none;transition:opacity .12s ease,transform .12s ease}.tooltip:after,.reply-quote-btn:after{content:"";position:absolute;left:50%;bottom:calc(100% + 5px);z-index:20;width:12px;height:12px;border-radius:2px;background:#3a3a44;transform:translate(-50%,4px) rotate(45deg) scale(.9);opacity:0;pointer-events:none;transition:opacity .12s ease,transform .12s ease}.tooltip:hover:before,.tooltip:focus-visible:before,.reply-quote-btn:hover:before,.reply-quote-btn:focus-visible:before,.tooltip:hover:after,.tooltip:focus-visible:after,.reply-quote-btn:hover:after,.reply-quote-btn:focus-visible:after{opacity:1;transform:translate(-50%) scale(1)}.tooltip:hover:after,.tooltip:focus-visible:after,.reply-quote-btn:hover:after,.reply-quote-btn:focus-visible:after{transform:translate(-50%) rotate(45deg) scale(1)} diff --git a/apps/api/internal/webassets/dist/_app/immutable/assets/0.D8lBNawf.css b/apps/api/internal/webassets/dist/_app/immutable/assets/0.D8lBNawf.css deleted file mode 100644 index c6791a15..00000000 --- a/apps/api/internal/webassets/dist/_app/immutable/assets/0.D8lBNawf.css +++ /dev/null @@ -1 +0,0 @@ -@font-face{font-family:Geist Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(./geist-cyrillic-ext-wght-normal.DjL33-gN.woff2) format("woff2-variations");unicode-range:U+0460-052F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Geist Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(./geist-cyrillic-wght-normal.BEAKL7Jp.woff2) format("woff2-variations");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Geist Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(./geist-vietnamese-wght-normal.6IgcOCM7.woff2) format("woff2-variations");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Geist Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(./geist-latin-ext-wght-normal.DC-KSUi6.woff2) format("woff2-variations");unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Geist Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(./geist-latin-wght-normal.BgDaEnEv.woff2) format("woff2-variations");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Geist Mono Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(./geist-mono-cyrillic-ext-wght-normal.I4S5GZfc.woff2) format("woff2-variations");unicode-range:U+0460-052F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Geist Mono Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(./geist-mono-cyrillic-wght-normal.BmXc_FBt.woff2) format("woff2-variations");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Geist Mono Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(./geist-mono-symbols2-wght-normal.GZpp1pK2.woff2) format("woff2-variations");unicode-range:U+2000-2001,U+2004-2008,U+200A,U+23B8-23BD,U+2500-259F}@font-face{font-family:Geist Mono Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(./geist-mono-vietnamese-wght-normal.D8KDMBhC.woff2) format("woff2-variations");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Geist Mono Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(./geist-mono-latin-ext-wght-normal.DrnZ1wKl.woff2) format("woff2-variations");unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Geist Mono Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(./geist-mono-latin-wght-normal.B_7UjwxQ.woff2) format("woff2-variations");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}:root{color-scheme:light dark;font-family:Geist Variable,Inter,SF Pro Text,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif;font-feature-settings:"ss01","cv11";--rail: #e9e1d7;--bg: #f7f3ed;--panel: #fffaf2;--panel-2: #efe7dc;--panel-3: #e4dbcf;--hover: rgba(16, 32, 39, .05);--hover-strong: rgba(16, 32, 39, .08);--line: rgba(16, 32, 39, .1);--line-strong: rgba(16, 32, 39, .16);--text: #22201d;--text-strong: #11100e;--muted: #6f675f;--muted-2: #958b80;--accent: #dd5d45;--accent-2: #006d77;--accent-soft: rgba(221, 93, 69, .16);--accent-glow: 0 0 0 1px rgba(221, 93, 69, .28), 0 8px 30px -12px rgba(221, 93, 69, .45);--success: #168b51;--warn: #f5b050;--danger: #c84343;--shadow: 0 24px 60px -24px rgba(16, 32, 39, .32);--radius-sm: 6px;--radius: 8px;--radius-lg: 14px;--radius-xl: 18px;--safe-area-top: env(safe-area-inset-top, 0px);--safe-area-right: env(safe-area-inset-right, 0px);--safe-area-bottom: env(safe-area-inset-bottom, 0px);--safe-area-left: env(safe-area-inset-left, 0px);background:var(--bg);color:var(--text)}@media(prefers-color-scheme:dark){:root{--rail: #0d0e12;--bg: #131419;--panel: #1a1b22;--panel-2: #20222b;--panel-3: #272a35;--hover: rgba(255, 255, 255, .04);--hover-strong: rgba(255, 255, 255, .07);--line: rgba(255, 255, 255, .07);--line-strong: rgba(255, 255, 255, .12);--text: #e7e9ee;--text-strong: #ffffff;--muted: #8a8f9c;--muted-2: #5d626d;--accent: #6f7eff;--accent-2: #5666ee;--accent-soft: rgba(111, 126, 255, .18);--accent-glow: 0 0 0 1px rgba(111, 126, 255, .4), 0 8px 30px -12px rgba(111, 126, 255, .6);--success: #2ecc71;--warn: #f5b050;--danger: #ff6b6b;--shadow: 0 24px 60px -20px rgba(0, 0, 0, .6)}}*{box-sizing:border-box}html,body{margin:0;padding:0;height:100%}body{background:radial-gradient(1000px 600px at 0% 0%,rgba(111,126,255,.08),transparent 60%),radial-gradient(900px 700px at 100% 100%,rgba(255,130,200,.05),transparent 60%),var(--bg);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}button,input,textarea{font:inherit;color:inherit}button{cursor:pointer}input,textarea{background:transparent;border:0;outline:0}::-webkit-scrollbar{width:10px;height:10px}::-webkit-scrollbar-thumb{background:#ffffff0f;border-radius:999px;border:2px solid transparent;background-clip:content-box}::-webkit-scrollbar-thumb:hover{background:#ffffff1f;background-clip:content-box}.auth-shell{display:grid;min-height:100vh;min-height:100dvh;place-items:center;padding:calc(32px + var(--safe-area-top)) calc(32px + var(--safe-area-right)) calc(32px + var(--safe-area-bottom)) calc(32px + var(--safe-area-left));background:radial-gradient(700px 500px at 30% 20%,rgba(111,126,255,.18),transparent 60%),radial-gradient(700px 500px at 80% 90%,rgba(255,110,196,.12),transparent 60%),var(--bg)}.auth-panel{display:grid;gap:22px;width:min(100%,440px);border:1px solid var(--line-strong);border-radius:var(--radius-xl);background:linear-gradient(180deg,#ffffff0a,#fff0) var(--panel);box-shadow:var(--shadow);padding:36px}.auth-brand{display:flex;align-items:center;gap:12px}.auth-brand .mark{width:44px;height:44px;display:grid;place-items:center;border-radius:12px;background:linear-gradient(135deg,var(--accent),#b46cff);color:#fff;font-weight:800;letter-spacing:-.02em;box-shadow:0 10px 24px -8px #6f7effb3}.auth-brand .brand-text strong{display:block;color:var(--text-strong);letter-spacing:-.01em}.auth-brand .brand-text span{display:block;color:var(--muted);font-size:12px}.auth-copy{display:grid;gap:8px;margin-top:8px}.auth-copy h1{margin:0;font-size:28px;letter-spacing:-.02em;color:var(--text-strong)}.auth-copy p{margin:0;color:var(--muted);line-height:1.5}.github-login{display:inline-flex;align-items:center;justify-content:center;gap:10px;min-height:46px;border-radius:12px;background:#0d1117;color:#fff;font-weight:600;text-decoration:none;border:1px solid #2b2f36;transition:transform 80ms ease,background .12s ease,border-color .12s ease}.github-login:hover{background:#161b22;border-color:#3f4750;transform:translateY(-1px)}.auth-foot{margin:0;color:var(--muted-2);font-size:12px;text-align:center}.shell{display:grid;grid-template-columns:72px 260px minmax(0,1fr) 0;height:100vh;height:100dvh;min-height:100vh;min-height:100dvh;overflow:hidden;transition:grid-template-columns .22s cubic-bezier(.2,.8,.2,1)}.shell.thread-open{grid-template-columns:72px 260px minmax(0,1fr) minmax(340px,28vw)}.shell.sidebar-collapsed{grid-template-columns:72px 0 minmax(0,1fr) 0}.shell.sidebar-collapsed.thread-open{grid-template-columns:72px 0 minmax(0,1fr) minmax(340px,28vw)}.timeline{display:flex;flex-direction:column;min-width:0;background:var(--bg);overflow:hidden}.timeline>*{min-width:0;flex-shrink:0}.timeline>.messages{flex:1 1 0;min-height:0}.topbar{display:flex;align-items:center;gap:14px;padding:12px 20px;min-height:60px;border-bottom:1px solid var(--line);background:linear-gradient(180deg,rgba(255,255,255,.02),transparent),var(--bg)}.topbar-title{display:flex;align-items:center;gap:10px;min-width:0;flex:1}.topbar-title h1{margin:0;font-size:16px;font-weight:700;letter-spacing:-.01em;color:var(--text-strong);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.topbar-title h1.with-glyph:first-letter{color:var(--muted);margin-right:1px}.topbar-divider{width:1px;height:18px;background:var(--line-strong);margin:0 6px}.topbar-meta{margin:0;color:var(--muted);font-size:12px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.search{display:flex;align-items:center;gap:8px;width:min(280px,30vw);height:34px;padding:0 10px;border-radius:var(--radius);background:var(--panel);border:1px solid var(--line);color:var(--muted);transition:border-color .12s ease,background .12s ease}.search:focus-within{border-color:var(--accent);background:var(--panel-2);color:var(--text)}.search input{flex:1;min-width:0;height:100%;color:var(--text)}.search input::placeholder{color:var(--muted)}.search-clear{width:18px;height:18px;border-radius:50%;border:0;background:var(--panel-3);color:var(--muted);display:grid;place-items:center;font-size:14px;line-height:1}.search-clear:hover{background:var(--accent);color:#fff}.search-submit{height:22px;padding:0 8px;border:0;border-radius:5px;background:var(--accent-soft);color:var(--accent);font-size:10.5px;font-weight:700;letter-spacing:.04em;text-transform:uppercase}.search-submit:hover{background:var(--accent);color:#fff}.topbar-actions{display:inline-flex;align-items:center;gap:6px}.topbar-actions button{width:32px;height:32px;display:grid;place-items:center;border:1px solid var(--line);border-radius:9px;background:var(--panel);color:var(--muted);transition:background .12s ease,color .12s ease,border-color .12s ease,transform 80ms ease}.topbar-actions button:hover,.topbar-actions button.active{background:var(--accent-soft);border-color:color-mix(in srgb,var(--accent) 55%,transparent);color:var(--accent)}.topbar-actions button:active{transform:translateY(1px)}@keyframes pulse{0%,to{opacity:1}50%{opacity:.5}}.search-results{display:flex;flex-direction:column;gap:2px;padding:10px 14px 14px;border-bottom:1px solid var(--line);background:var(--panel);max-height:280px;overflow-y:auto}.search-results-head{display:flex;align-items:center;justify-content:space-between;padding:0 6px 8px}.search-results-head strong{color:var(--text-strong);font-size:13px}.search-results-head button{border:0;background:transparent;color:var(--muted);font-size:12px;padding:4px 8px;border-radius:var(--radius-sm)}.search-results-head button:hover{background:var(--hover);color:var(--text)}.search-result{display:flex;align-items:flex-start;gap:10px;border:0;background:transparent;color:var(--text);padding:8px;border-radius:var(--radius-sm);text-align:left}.search-result:hover{background:var(--hover)}.search-result .dm-avatar{width:30px;height:30px;font-size:13px}.search-result-body{display:flex;flex-direction:column;gap:2px;min-width:0;flex:1}.search-result-body>div{display:flex;align-items:baseline;gap:8px}.search-result-body strong{color:var(--text-strong);font-size:13px}.search-result-body time{color:var(--muted);font-size:11px}.search-result-body span{color:var(--muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.guild-rail{display:flex;flex-direction:column;align-items:center;gap:8px;padding:14px 0;background:var(--rail);border-right:1px solid var(--line);overflow-y:auto;position:relative}.guild-rail .guild{width:48px;height:48px;border-radius:16px;display:grid;place-items:center;background:var(--panel-2);color:var(--text);text-decoration:none;border:0;font-weight:700;font-size:14px;letter-spacing:-.02em;position:relative;transition:border-radius .14s ease,background .12s ease,transform .12s ease;box-shadow:0 1px #ffffff0a inset}.guild-rail .guild:hover{border-radius:12px;background:var(--accent);color:#fff;box-shadow:0 8px 24px -10px #6f7eff99}.guild-rail .guild.home{background:linear-gradient(135deg,var(--accent),#b46cff);color:#fff;font-weight:800}.guild-rail .guild.home:hover{border-radius:12px;filter:brightness(1.1)}.guild-rail .guild.add{background:transparent;color:var(--success);border:1px dashed rgba(46,204,113,.4)}.guild-rail .guild.add:hover{background:#2ecc711f;color:#fff;border-style:solid;border-color:var(--success)}.guild-divider{width:36px;height:1px;background:var(--line-strong);margin:4px 0}.guild-list{display:flex;flex-direction:column;align-items:center;gap:8px}.guild-wrap{position:relative}.guild-wrap:before{content:"";position:absolute;left:-14px;top:50%;transform:translateY(-50%) scaleY(.2);width:4px;height:28px;border-radius:0 4px 4px 0;background:var(--text-strong);opacity:0;transition:opacity .14s ease,transform .14s ease}.guild-wrap:hover:before{opacity:.6;transform:translateY(-50%) scaleY(.5)}.guild-wrap.active:before{opacity:1;transform:translateY(-50%) scaleY(1)}.guild-wrap.active .guild{border-radius:14px;background:var(--accent);color:#fff}.guild-create{position:absolute;left:100%;top:14px;margin-left:8px;background:var(--panel);border:1px solid var(--line-strong);border-radius:var(--radius);padding:8px;box-shadow:var(--shadow);z-index:20}.guild-create input{height:32px;padding:0 10px;width:200px;border-radius:var(--radius-sm);background:var(--panel-2);color:var(--text)}.sidebar{display:grid;grid-template-rows:auto minmax(0,1fr) auto;background:var(--panel);border-right:1px solid var(--line);overflow:hidden;min-width:0;transition:opacity .16s ease,transform .22s cubic-bezier(.2,.8,.2,1)}.sidebar-collapsed .sidebar{opacity:0;pointer-events:none;transform:translate(-14px)}.workspace-header{padding:14px 16px;border-bottom:1px solid var(--line);display:flex;align-items:center;justify-content:space-between;min-height:60px}.sidebar-collapse{width:30px;height:30px;display:grid;place-items:center;border:0;border-radius:8px;background:var(--panel-2);color:var(--muted);transition:color .12s ease,background .12s ease,transform .12s ease}.sidebar-collapse:hover{background:var(--panel-3);color:var(--text-strong);transform:translate(-1px)}.workspace-name{display:flex;flex-direction:column;gap:2px;min-width:0}.workspace-name strong{color:var(--text-strong);letter-spacing:-.01em;font-size:15px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.workspace-name .presence{display:inline-flex;align-items:center;gap:6px;color:var(--muted);font-size:11px}.workspace-name .presence:before{content:"";width:7px;height:7px;border-radius:50%;background:var(--muted-2)}.workspace-name .presence.online{color:var(--success)}.workspace-name .presence.online:before{background:var(--success);box-shadow:0 0 0 3px #2ecc712e}.sidebar-scroll{overflow-y:auto;padding:12px 8px 16px}.nav-section+.nav-section{margin-top:12px}.section-title{display:flex;align-items:center;gap:6px;width:100%;border:0;background:transparent;color:var(--muted);text-transform:uppercase;font-size:11px;font-weight:700;letter-spacing:.04em;padding:6px 8px;border-radius:var(--radius-sm)}.section-title:hover{color:var(--text);background:var(--hover)}.section-title .caret{font-size:10px;opacity:.7}.section-title .label{flex:1;text-align:left}.section-title .add-button{flex:0 0 auto;width:18px;height:18px;border:0;border-radius:4px;display:grid;place-items:center;font-size:14px;font-weight:700;line-height:1;background:#ffffff0f;color:var(--text);padding:0}.section-title:hover .add-button{background:var(--accent);color:#fff}.nav-list{display:flex;flex-direction:column;gap:1px;margin-top:4px}.nav-item{display:flex;align-items:center;gap:8px;width:100%;border:0;border-radius:var(--radius-sm);background:transparent;color:var(--muted);text-decoration:none;text-align:left;padding:6px 10px;min-height:30px;transition:background .1s ease,color .1s ease}.nav-item:hover{background:var(--hover);color:var(--text)}.nav-item:focus{outline:none}.nav-item:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}.nav-item.active{background:var(--accent-soft);color:var(--text-strong)}.nav-item.has-unread{color:var(--text-strong);font-weight:600}.nav-item.has-unread .hash{color:var(--text-strong)}.unread-badge{flex-shrink:0;min-width:18px;height:18px;padding:0 6px;border-radius:9px;background:var(--accent);color:var(--accent-contrast, white);font-size:11px;font-weight:700;line-height:18px;text-align:center;letter-spacing:.01em}.nav-item .hash{color:var(--muted);font-weight:600;width:14px;text-align:center}.nav-item.active .hash{color:var(--accent)}.nav-label{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-size:14px}.dm-row{display:grid;grid-template-columns:minmax(0,1fr) 24px;align-items:center;gap:2px;position:relative}.dm-row .nav-item{min-width:0}.dm-actions-trigger{width:22px;height:22px;display:grid;place-items:center;border:0;border-radius:var(--radius-sm);background:transparent;color:var(--muted-2);font-size:18px;font-weight:700;line-height:1;opacity:0}.dm-row:hover .dm-actions-trigger,.dm-row:focus-within .dm-actions-trigger,.dm-row.active .dm-actions-trigger{opacity:1}.dm-actions-trigger:hover,.dm-actions-trigger:focus-visible,.dm-actions-trigger[aria-expanded=true]{background:var(--hover);color:var(--text);outline:none}.dm-actions-menu{position:absolute;z-index:30;top:28px;right:0;min-width:164px;padding:4px;border:1px solid var(--line-strong);border-radius:var(--radius-sm);background:var(--panel-2);box-shadow:var(--shadow)}.dm-actions-item{width:100%;min-height:30px;border:0;border-radius:6px;background:transparent;color:var(--text);font-size:13px;text-align:left;padding:0 10px}.dm-actions-item:hover,.dm-actions-item:focus-visible{background:var(--hover);color:var(--text-strong);outline:none}.dm-undo{display:flex;align-items:center;gap:8px;margin:6px 8px 2px;padding:6px 8px;border:1px solid var(--line);border-radius:var(--radius-sm);background:var(--panel-2);color:var(--muted);font-size:12px}.dm-undo span{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dm-undo button{border:0;border-radius:6px;background:var(--hover);color:var(--text);font-size:12px;font-weight:700;padding:4px 8px}.dm-undo button:hover,.dm-undo button:focus-visible{background:var(--accent);color:#fff;outline:none}.nav-empty{margin:4px 8px;color:var(--muted-2);font-size:12px}.dm-avatar{width:22px;height:22px;border-radius:50%;display:grid;place-items:center;font-size:11px;font-weight:700;color:#fff;background:linear-gradient(135deg,hsl(var(--hue, 220deg) 70% 55%),hsl(calc(var(--hue, 220deg) + 40deg) 70% 45%));flex-shrink:0;overflow:hidden}.dm-avatar img,.avatar img{width:100%;height:100%;display:block;object-fit:cover}.presence-dot{width:8px;height:8px;border-radius:50%;background:var(--muted-2);flex-shrink:0}.presence-dot.active{background:var(--success);box-shadow:0 0 0 2px var(--panel)}.inline-create{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:6px;margin:6px 4px 2px}.inline-create input{width:100%;min-width:0;height:30px;padding:0 10px;border-radius:var(--radius-sm);background:var(--panel-2);color:var(--text);border:1px solid var(--line)}.inline-create input:focus{border-color:var(--accent);background:var(--panel-3)}.inline-create button.ghost,button.ghost{width:30px;height:30px;border:0;border-radius:var(--radius-sm);background:var(--panel-3);color:var(--muted);font-weight:600;padding:0;font-size:14px;display:grid;place-items:center}.inline-create button.ghost:hover{background:var(--accent);color:#fff}.user-card{display:flex;align-items:center;gap:10px;width:100%;padding:10px 12px;background:var(--panel-2);border-top:1px solid var(--line);border-right:0;border-bottom:0;border-left:0;color:inherit;text-align:left;cursor:pointer;transition:background .12s ease}.user-card:hover{background:var(--panel-3)}.user-card .dm-avatar{width:28px;height:28px;font-size:12px}.user-card .user-meta{flex:1;min-width:0}.user-card .user-meta strong{display:block;color:var(--text-strong);font-size:13px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.user-card .user-meta span{display:block;color:var(--muted);font-size:11px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}@media(max-width:820px){.workspace-header{min-height:calc(60px + var(--safe-area-top));padding-top:calc(14px + var(--safe-area-top));padding-right:calc(16px + var(--safe-area-right))}.sidebar-scroll{padding-bottom:calc(16px + var(--safe-area-bottom))}.user-card{padding-bottom:calc(10px + var(--safe-area-bottom))}}.messages{position:relative;display:flex;flex-direction:column}.messages-scroll{flex:1;min-height:0;overflow-y:auto;overflow-anchor:none;display:flex;flex-direction:column;padding:0 4px;opacity:1;transition:opacity .14s ease-out}.messages-scroll:focus{outline:none}.messages.is-revealing .messages-scroll{opacity:0;pointer-events:none;transition:opacity 0ms}.messages-spacer{flex-grow:1}.history-loader{display:grid;gap:14px;margin:4px 0 6px;padding:6px 18px;pointer-events:none;animation:history-loader-fade .22s ease-out both}.history-loader--newer{margin-top:6px;margin-bottom:4px}@keyframes history-loader-fade{0%{opacity:0}to{opacity:1}}.history-loader__row{display:grid;grid-template-columns:56px minmax(0,1fr);min-height:44px}.history-loader__avatar,.history-loader__meta,.history-loader__line,.history-loader__block{display:block;background:linear-gradient(90deg,color-mix(in srgb,var(--muted-2) 16%,transparent),color-mix(in srgb,var(--muted-2) 36%,transparent),color-mix(in srgb,var(--muted-2) 16%,transparent));background-size:220% 100%;animation:history-loading 1.4s ease-in-out infinite;animation-delay:calc(var(--history-row, 0) * 80ms)}.history-loader__avatar{width:38px;height:38px;border-radius:12px}.history-loader__body{display:grid;align-content:start;gap:8px;min-width:0;padding-top:4px}.history-loader__meta{width:min(180px,38%);height:11px;border-radius:999px}.history-loader__line{height:10px;border-radius:999px}.history-loader__line--wide{width:min(540px,72%)}.history-loader__line--mid{width:min(360px,48%)}@keyframes history-loading{0%{background-position:120% 0}to{background-position:-120% 0}}@media(prefers-reduced-motion:reduce){.history-loader{animation:none}.history-loader__avatar,.history-loader__meta,.history-loader__line,.history-loader__block{animation:none;background:color-mix(in srgb,var(--muted-2) 22%,transparent)}}.unread-bar{position:absolute;left:50%;top:10px;transform:translate(-50%);z-index:5;display:inline-flex;align-items:center;gap:6px;height:30px;padding:0 5px 0 14px;max-width:calc(100% - 32px);border-radius:999px;background:color-mix(in srgb,var(--panel) 82%,transparent);backdrop-filter:blur(14px) saturate(140%);-webkit-backdrop-filter:blur(14px) saturate(140%);border:1px solid color-mix(in srgb,var(--accent) 38%,transparent);color:var(--text);font-size:12px;font-weight:600;letter-spacing:.005em;box-shadow:inset 0 1px color-mix(in srgb,#fff 8%,transparent),0 10px 24px -14px #0000008c,0 0 0 4px color-mix(in srgb,var(--accent) 10%,transparent);opacity:1;transition:opacity .16s ease-out,transform .18s cubic-bezier(.2,.8,.2,1)}.unread-bar.is-clearing{opacity:0;pointer-events:none;transform:translate(-50%,-6px)}.unread-bar__jump,.unread-bar__mark{display:inline-flex;align-items:center;gap:8px;border:0;background:transparent;color:inherit;font:inherit;cursor:pointer;transition:background-color .12s ease-out,color .12s ease-out}.unread-bar__jump{flex:0 1 auto;min-width:0;padding:0 6px 0 0;text-align:left;color:color-mix(in srgb,var(--accent) 92%,var(--text))}.unread-bar__jump:before{content:"";flex-shrink:0;width:7px;height:7px;border-radius:50%;background:var(--accent);box-shadow:0 0 color-mix(in srgb,var(--accent) 55%,transparent);animation:unread-bar-pulse 1.8s ease-out infinite}@keyframes unread-bar-pulse{0%{box-shadow:0 0 color-mix(in srgb,var(--accent) 55%,transparent)}70%{box-shadow:0 0 0 7px color-mix(in srgb,var(--accent) 0%,transparent)}to{box-shadow:0 0 color-mix(in srgb,var(--accent) 0%,transparent)}}@media(prefers-reduced-motion:reduce){.unread-bar__jump:before{animation:none}}.unread-bar__mark{flex-shrink:0;height:22px;padding:0 10px;border-radius:999px;background:color-mix(in srgb,var(--accent) 14%,transparent);color:color-mix(in srgb,var(--accent) 90%,var(--text));font-size:11px;font-weight:600;letter-spacing:.01em}.unread-bar__jump:hover{color:var(--accent)}.unread-bar__mark:hover{background:color-mix(in srgb,var(--accent) 24%,transparent);color:var(--accent)}.unread-bar__jump:focus-visible,.unread-bar__mark:focus-visible{outline:2px solid color-mix(in srgb,var(--accent) 70%,transparent);outline-offset:2px;border-radius:999px}.unread-bar__label{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.typing-indicator{display:flex;align-items:center;gap:8px;height:0;padding:0 22px;margin-top:0;font-size:12px;color:var(--text-muted);opacity:0;transform:translateY(2px);overflow:hidden;transition:height .12s ease-out,margin-top .12s ease-out,opacity .12s ease-out,transform .16s cubic-bezier(.2,.8,.2,1);pointer-events:none}.typing-indicator.visible{height:20px;margin-top:-4px;opacity:1;transform:translateY(0)}.typing-indicator__dots{display:inline-flex;align-items:center;gap:3px}.typing-indicator__dots i{width:4px;height:4px;border-radius:50%;background:currentColor;opacity:.55;animation:typing-dot 1.1s ease-in-out infinite}.typing-indicator__dots i:nth-child(2){animation-delay:.15s}.typing-indicator__dots i:nth-child(3){animation-delay:.3s}@keyframes typing-dot{0%,60%,to{transform:translateY(0);opacity:.35}30%{transform:translateY(-3px);opacity:1}}.message-row.is-pending{opacity:.55}.message-row.is-pending .message-content,.message-row.is-pending .markdown{pointer-events:none}.message-row.is-failed{opacity:1}.message-failed{display:inline-flex;align-items:center;gap:10px;margin-top:6px;padding:4px 10px;border-radius:999px;background:color-mix(in srgb,var(--danger, #d04848) 14%,transparent);color:var(--danger, #d04848);font-size:12px}.message-failed__label{font-weight:500}.message-failed__action{background:transparent;border:1px solid currentColor;color:inherit;font:inherit;padding:2px 8px;border-radius:999px;cursor:pointer;line-height:1}.message-failed__action:hover{background:color-mix(in srgb,currentColor 12%,transparent)}.message-failed__action--ghost{border-color:color-mix(in srgb,currentColor 50%,transparent)}@media(prefers-reduced-motion:reduce){.typing-indicator{transition:opacity 80ms ease-out;transform:none}.typing-indicator.visible{transform:none}.typing-indicator__dots i{animation:none;opacity:.7}}.empty{display:grid;place-items:center;align-content:center;text-align:center;gap:10px;min-height:50vh;padding:48px 24px}.empty-icon{width:64px;height:64px;border-radius:18px;background:linear-gradient(135deg,var(--accent),#b46cff);color:#fff;display:grid;place-items:center;font-size:26px;font-weight:800;box-shadow:0 18px 40px -16px #6f7effb3}.empty strong{color:var(--text-strong);font-size:18px;letter-spacing:-.01em}.empty span{color:var(--muted);max-width:380px;line-height:1.5}.day-divider{display:flex;align-items:center;gap:12px;margin:18px 18px 8px;pointer-events:none}.day-divider:before,.day-divider:after{content:"";flex:1;height:1px;background:var(--line)}.day-divider span{background:var(--bg);border:1px solid var(--line);border-radius:999px;padding:4px 12px;font-size:11px;font-weight:600;color:var(--muted);text-transform:uppercase;letter-spacing:.04em}.new-messages-divider{display:flex;align-items:center;gap:0;margin:4px 0 2px;padding:0 18px;pointer-events:none;position:relative;opacity:1;transform:translateY(0);transition:opacity .16s ease-out,transform .18s cubic-bezier(.2,.8,.2,1)}.new-messages-divider.is-clearing{opacity:0;transform:translateY(-4px)}.new-messages-divider:before{content:"";flex:1;height:1px;background:var(--danger, #ed4245);opacity:.9}.new-messages-divider span{display:inline-flex;align-items:center;height:14px;padding:0 5px;margin-left:8px;background:var(--danger, #ed4245);color:#fff;font-size:9px;font-weight:700;letter-spacing:.04em;text-transform:uppercase;border-radius:3px}.message-group{display:grid;grid-template-columns:56px minmax(0,1fr);padding:8px 18px;position:relative}.message-group:hover{background:var(--hover)}.avatar{width:38px;height:38px;border-radius:12px;display:grid;place-items:center;color:#fff;font-weight:700;font-size:14px;background:linear-gradient(135deg,hsl(var(--hue, 220deg) 70% 55%),hsl(calc(var(--hue, 220deg) + 40deg) 70% 45%));box-shadow:0 6px 20px -10px #0009;margin-top:2px;overflow:hidden}.avatar-button{position:relative;z-index:2;border:0;padding:0;cursor:pointer;transition:transform .1s ease,box-shadow .12s ease,filter .12s ease}.avatar-button:hover{transform:translateY(-1px);filter:brightness(1.05);box-shadow:0 10px 24px -12px #000c}.avatar.small{width:30px;height:30px;font-size:12px;border-radius:10px}.avatar.large{width:56px;height:56px;border-radius:16px;font-size:18px;margin:0}.group-body{min-width:0}.group-body>header{display:flex;align-items:baseline;gap:8px;margin-bottom:2px}.group-body>header strong{color:var(--text-strong);font-size:14.5px;letter-spacing:-.005em;font-weight:700}.author-name{border:0;background:transparent;color:var(--text-strong);padding:0;border-radius:4px;font-size:14.5px;letter-spacing:0;font-weight:700}.author-name:hover{color:var(--accent);text-decoration:underline;text-underline-offset:2px}.group-body>header time{color:var(--muted);font-size:11px}.group-body>header span{color:var(--muted);font-size:12px}.bot-chip{display:inline-flex;align-items:center;height:18px;padding:0 6px;border:1px solid color-mix(in srgb,var(--accent) 45%,transparent);border-radius:999px;color:var(--accent);font-size:10px;font-weight:800;line-height:1;text-transform:uppercase}.message-row{margin-left:-56px;padding:1px 0 1px 56px;position:relative;border-radius:0;transition:background 80ms ease}.message-row:not(:first-child){margin-top:1px}.message-row.selected{background:var(--accent-soft)}.message-row.selected:before{content:"";position:absolute;left:0;top:0;bottom:0;width:3px;background:var(--accent)}.message-row.can-open-thread{cursor:pointer}.row-stamp{position:absolute;left:8px;top:4px;font-size:10px;color:var(--muted-2);opacity:0;font-variant-numeric:tabular-nums}.message-row:hover .row-stamp{opacity:1}.message-content{min-width:0}.thread-hint{display:inline-flex;align-items:center;gap:5px;min-height:22px;margin-top:5px;padding:2px 7px;border:1px solid color-mix(in srgb,var(--line-strong) 70%,transparent);border-radius:8px;background:color-mix(in srgb,var(--panel) 70%,transparent);color:var(--muted-2);font-size:11px;font-weight:700;line-height:1;cursor:pointer}.thread-hint:not(.has-replies):not(.is-open){width:24px;height:22px;justify-content:center;padding:0;opacity:.62}.thread-hint svg{flex:0 0 auto}.thread-hint time{color:var(--muted-2);font-size:10px;font-weight:700;font-variant-numeric:tabular-nums}.thread-hint.has-replies,.thread-hint.is-open{border-color:color-mix(in srgb,var(--accent) 48%,var(--line-strong));background:color-mix(in srgb,var(--accent-soft) 70%,transparent);color:var(--text-strong)}.thread-hint.has-replies time,.thread-hint.is-open time{color:var(--muted)}.thread-hint:hover{border-color:color-mix(in srgb,var(--accent) 55%,var(--line-strong));background:var(--hover-strong);color:var(--text-strong)}.thread-hint:disabled{cursor:default;opacity:.45}.message-actions{display:flex;align-items:flex-start;gap:4px;opacity:0;transform:translateY(-50%);position:absolute;right:8px;top:0;background:var(--panel);border:1px solid var(--line-strong);border-radius:8px;padding:2px;box-shadow:var(--shadow);transition:opacity .1s ease,transform .1s ease}.message-row:hover .message-actions,.message-row.selected .message-actions{opacity:1}.message-actions button{width:28px;height:28px;display:grid;place-items:center;border:0;border-radius:6px;background:transparent;color:var(--muted)}.message-actions button:hover{background:var(--hover-strong);color:var(--text-strong)}.markdown{line-height:1.5;color:var(--text);font-size:14.5px;overflow-wrap:anywhere;word-break:break-word}.markdown>:first-child{margin-top:0}.markdown>:last-child{margin-bottom:0}.markdown p{margin:0}.markdown p+p,.markdown ul,.markdown ol,.markdown blockquote,.markdown pre{margin-top:6px}.markdown a{color:var(--accent);text-decoration:none}.markdown a:hover{text-decoration:underline}.markdown code{background:var(--panel-2);border:1px solid var(--line);border-radius:4px;padding:1px 5px;font-family:Geist Mono Variable,JetBrains Mono,ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:.9em}.markdown pre{background:var(--panel-2);border:1px solid var(--line);border-radius:var(--radius);padding:12px 14px;overflow-x:auto}.markdown pre code{background:transparent;border:0;padding:0}.markdown blockquote{border-left:3px solid var(--accent);margin:0;padding:4px 0 4px 12px;color:var(--muted)}.markdown ul,.markdown ol{padding-left:22px}.markdown img{max-width:100%;max-height:360px;border-radius:var(--radius);margin-top:6px;border:1px solid var(--line);object-fit:contain;background:var(--panel);cursor:zoom-in}.gif-player{position:relative;display:inline-block;max-width:100%;vertical-align:top}.gif-player img{display:block}.gif-badge,.gif-replay{position:absolute;z-index:1;border:0;color:#fff;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px)}.gif-badge{left:9px;bottom:9px;padding:4px 7px;border-radius:999px;background:#0000008a;font-size:10px;font-weight:800;letter-spacing:.04em;pointer-events:none}.gif-replay{right:9px;bottom:9px;width:30px;height:30px;display:grid;place-items:center;border-radius:999px;background:#0a0c12b8;font-size:16px;line-height:1;opacity:0;transform:scale(.88);pointer-events:none;transition:opacity .13s ease,transform .13s ease,background .12s ease}.gif-replay:hover{background:var(--accent)}.gif-player.paused .gif-replay{opacity:1;transform:scale(1);pointer-events:auto}.gif-player.playing .gif-badge{animation:gif-breathe .9s ease-in-out infinite}@keyframes gif-breathe{0%,to{opacity:.85}50%{opacity:.45}}.attachment-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:8px;margin-top:8px;max-width:560px}.attachment-grid.compact{grid-template-columns:minmax(0,1fr);max-width:420px}.media-tile{position:relative;display:block;width:100%;margin:0;padding:0;border:1px solid var(--line);border-radius:var(--radius-lg);background:#0a0c12;overflow:hidden;isolation:isolate;text-align:left;color:inherit;text-decoration:none;cursor:pointer;transition:border-color .14s ease,transform .14s ease,box-shadow .14s ease}.media-tile:hover{border-color:var(--line-strong);box-shadow:0 18px 40px -28px #000000e6}.media-tile:focus-visible{outline:none;border-color:var(--line-strong);box-shadow:0 0 0 2px color-mix(in srgb,var(--accent) 35%,transparent)}.media-tile--image{cursor:zoom-in}.media-tile__open{display:block;width:100%;margin:0;padding:0;border:0;background:transparent;color:inherit;cursor:zoom-in}.media-tile__open:focus{outline:0}.media-tile__open:focus-visible+.media-tile__caption .media-tile__name{text-decoration:underline;text-decoration-thickness:1px;text-underline-offset:3px}.media-tile--video{cursor:default}.media-tile img,.media-tile video{display:block;width:100%;max-height:360px;object-fit:contain;background:#05070d}.media-tile--image img{max-height:320px}.media-tile__caption{position:absolute;inset:auto 0 0;z-index:3;display:flex;align-items:center;gap:8px;padding:22px 10px 8px;background:linear-gradient(to top,#000000c7,#00000080 40%,#0000);opacity:0;pointer-events:none;transition:opacity .14s ease}.media-tile__caption>*{pointer-events:auto}.media-tile:hover .media-tile__caption,.media-tile:focus-within .media-tile__caption{opacity:1}.media-tile--video.is-started .media-tile__caption{display:none}.media-tile__name{flex:1;min-width:0;color:#fff;font-size:12px;font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;text-shadow:0 1px 2px rgba(0,0,0,.6)}.media-tile__chip{position:relative;z-index:4;display:inline-grid;place-items:center;width:28px;height:28px;flex:none;border-radius:8px;background:#00000080;color:#fff;border:1px solid rgba(255,255,255,.18);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);text-decoration:none;transition:background .12s ease,border-color .12s ease,transform .12s ease}.media-tile__chip:hover{background:#000000b3;border-color:#ffffff52;transform:translateY(-1px)}.media-tile__play{position:absolute;inset:0 0 48px;display:grid;place-items:center;width:100%;height:auto;border:0;margin:0;padding:0;background:transparent;cursor:pointer;z-index:1}.media-tile__play:before{content:"";position:absolute;inset:0;background:radial-gradient(ellipse at center,#0000002e,#0000000d 45%,#0000 70%);opacity:.7;transition:opacity .16s ease;pointer-events:none}.media-tile__play:hover:before{opacity:.9}.media-tile__play-icon{position:relative;display:grid;place-items:center;width:46px;height:46px;border-radius:999px;background:#0000008c;color:#fff;backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);box-shadow:0 6px 20px -8px #0000008c;padding-left:3px;transition:transform .2s cubic-bezier(.2,.8,.2,1),background .18s ease,box-shadow .2s ease}.media-tile__play-icon svg{filter:drop-shadow(0 1px 2px rgba(0,0,0,.4))}.media-tile__play:hover .media-tile__play-icon{transform:scale(1.06);background:#000000b3;box-shadow:0 10px 28px -10px #000000a6}.media-tile__play:active .media-tile__play-icon{transform:scale(.97);transition-duration:80ms}.media-tile__play:focus-visible{outline:none}.media-tile__play:focus-visible .media-tile__play-icon{box-shadow:0 0 0 2px #fff9,0 10px 28px -10px #000000a6}.media-tile__duration{position:absolute;left:8px;bottom:8px;z-index:2;padding:2px 6px;border-radius:4px;background:#000000b8;color:#fff;font-size:11px;font-variant-numeric:tabular-nums;font-weight:600;letter-spacing:.02em;pointer-events:none}.file-attachment{display:flex;align-items:center;gap:10px;max-width:360px;padding:10px;border:1px solid var(--line);border-radius:var(--radius);background:var(--panel)}.file-attachment:hover{border-color:var(--line-strong);background:var(--panel-2)}.file-icon{width:34px;height:34px;display:grid;place-items:center;border-radius:8px;background:var(--accent-soft);color:var(--accent);font-weight:800}.file-attachment strong,.file-attachment small{display:block}.file-attachment strong{color:var(--text-strong);font-size:13px}.file-attachment small{color:var(--muted);font-size:11px}.audio-attachment,.document-attachment{width:min(100%,420px);border:1px solid var(--line);border-radius:var(--radius);background:var(--panel);overflow:hidden}.audio-attachment{display:grid;gap:10px;padding:10px}.audio-attachment__meta{display:flex;align-items:center;gap:10px;min-width:0}.audio-attachment audio{width:100%;height:36px}.document-attachment{display:grid;grid-template-columns:64px minmax(0,1fr) auto;align-items:center;gap:12px;padding:10px}.document-attachment__thumbnail{position:relative;display:inline-grid;place-items:center;width:64px;height:82px;border:1px solid var(--line);border-radius:6px;background:linear-gradient(135deg,transparent 0 76%,var(--panel-3) 76% 100%),linear-gradient(180deg,#fff,#f0f2f7);color:var(--accent);font-size:13px;font-weight:800;letter-spacing:0;text-decoration:none;overflow:hidden;box-shadow:0 8px 18px -16px #0009}.document-attachment__thumbnail.has-preview{background:#fff}.document-attachment__preview-canvas{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;opacity:0;transition:opacity .16s ease}.document-attachment__thumbnail.has-preview .document-attachment__preview-canvas{opacity:1}.document-attachment__thumbnail.has-preview span{position:absolute;left:5px;top:5px;border-radius:4px;padding:2px 4px;background:#10121ac7;color:#fff;font-size:9px;line-height:1}.document-attachment__thumbnail:before,.document-attachment__thumbnail:after{content:"";position:absolute;left:14px;right:14px;height:2px;border-radius:999px;background:color-mix(in srgb,var(--muted) 36%,transparent)}.document-attachment__thumbnail:before{top:48px}.document-attachment__thumbnail:after{top:56px}.document-attachment__thumbnail.has-preview:before,.document-attachment__thumbnail.has-preview:after{display:none}.document-attachment__meta{display:grid;gap:5px;min-width:0}.document-attachment__title{min-width:0;color:var(--text-strong);font-size:13px;font-weight:700;text-decoration:none;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.document-attachment__title:hover{text-decoration:underline;text-underline-offset:3px}.document-attachment__meta small{color:var(--muted);font-size:11px;white-space:nowrap}.document-attachment__download{display:inline-grid;place-items:center;width:30px;height:30px;border-radius:8px;color:var(--muted);text-decoration:none;transition:background .12s ease,color .12s ease}.document-attachment__download:hover{background:var(--panel-2);color:var(--text-strong)}@media(max-width:520px){.message-group{grid-template-columns:44px minmax(0,1fr);padding:7px 12px}.message-row{margin-left:-44px;padding-left:44px}.row-stamp{display:none}.attachment-grid,.attachment-grid.compact{grid-template-columns:minmax(0,1fr);max-width:100%}}.composer{--composer-card-top: 18px;--composer-overlay-gap: 8px;--composer-overlay-inset-x: 18px;padding:18px 18px 10px;background:var(--bg);display:grid;gap:0;position:relative}.composer-card{display:flex;flex-direction:column;background:var(--panel);border:1px solid var(--line-strong);border-radius:var(--radius-lg);overflow:hidden;transition:border-color .12s ease,box-shadow .12s ease}.composer:focus-within .composer-card{border-color:color-mix(in srgb,var(--accent) 55%,var(--line-strong));box-shadow:0 0 0 3px color-mix(in srgb,var(--accent) 14%,transparent)}.composer-suggestions{position:absolute;left:var(--composer-overlay-inset-x);bottom:calc(100% - var(--composer-card-top) + var(--composer-overlay-gap));z-index:40;width:min(560px,calc(100% - (var(--composer-overlay-inset-x) * 2)));max-height:min(320px,45vh);margin:0;overflow-x:hidden;overflow-y:auto;border:1px solid var(--line-strong);border-radius:12px;background:color-mix(in srgb,var(--panel) 97%,transparent);box-shadow:var(--shadow)}.composer-suggestions button{width:100%;min-height:48px;display:grid;grid-template-columns:30px minmax(0,1fr) auto;align-items:center;gap:10px;padding:8px 10px;border:0;border-bottom:1px solid var(--line);border-radius:0;background:transparent;color:var(--text);text-align:left}.composer-suggestions button:last-child{border-bottom:0}.composer-suggestions button:hover,.composer-suggestions button.active{background:var(--hover-strong)}.suggestion-mark{width:30px;height:30px;display:grid;place-items:center;border-radius:8px;background:var(--accent-soft);color:var(--accent);font-size:13px;font-weight:800}.suggestion-copy{min-width:0;display:grid;gap:2px}.suggestion-copy strong,.suggestion-copy span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.suggestion-copy strong{color:var(--text-strong);font-size:13px}.suggestion-copy span{color:var(--muted);font-size:12px}.suggestion-kind{color:var(--muted-2);font-size:11px;font-weight:700;text-transform:uppercase}.composer-toolbar{display:inline-flex;align-items:center;gap:2px;width:100%;min-width:0;padding:4px 6px;margin:0;border:0;border-top:1px solid var(--line);border-radius:0;background:color-mix(in srgb,var(--panel-2) 35%,transparent);box-shadow:none;overflow-x:auto;overflow-y:hidden;scrollbar-width:none;-webkit-overflow-scrolling:touch}.composer-toolbar::-webkit-scrollbar{display:none}.composer-toolbar button{flex:0 0 auto;min-width:28px;height:26px;display:grid;place-items:center;border:0;border-radius:6px;background:transparent;color:var(--text);opacity:.78;font-size:11.5px;font-weight:700;transition:background .1s ease,color .1s ease,opacity .1s ease,transform 80ms ease}.composer-toolbar button:hover{background:var(--hover-strong);color:var(--text-strong);opacity:1}.composer-toolbar button.active{background:var(--accent-soft);color:var(--accent);opacity:1}.composer-toolbar button:active{transform:translateY(1px)}.gif-picker{margin-top:8px;margin-bottom:8px;width:min(520px,calc(100vw - 40px));border:1px solid var(--line-strong);border-radius:16px;background:color-mix(in srgb,var(--panel) 96%,transparent);box-shadow:var(--shadow);padding:10px;animation:picker-in .16s cubic-bezier(.2,.8,.2,1)}.gif-picker-head{display:grid;grid-template-columns:auto minmax(0,1fr);align-items:center;gap:10px;padding:2px 2px 10px}.gif-picker-head strong{color:var(--text-strong);font-size:13px}.gif-picker-head input{min-width:0;height:32px;padding:0 10px;border:1px solid var(--line);border-radius:var(--radius);background:var(--panel-2)}.gif-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:8px;max-height:240px;overflow-y:auto}.gif-grid button{position:relative;overflow:hidden;aspect-ratio:4 / 3;border:0;border-radius:12px;background:var(--panel-2);color:#fff;padding:0;box-shadow:inset 0 0 0 1px var(--line);transition:transform .12s ease,box-shadow .12s ease}.gif-grid button:hover{transform:translateY(-2px);box-shadow:inset 0 0 0 2px var(--accent),0 14px 30px -22px #000c}.gif-grid img{width:100%;height:100%;display:block;object-fit:cover}.gif-grid span{position:absolute;left:6px;right:6px;bottom:6px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;border-radius:999px;background:#0000008f;padding:4px 7px;font-size:10.5px;font-weight:700;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px)}@keyframes picker-in{0%{opacity:0;transform:translateY(8px) scale(.98)}to{opacity:1;transform:translateY(0) scale(1)}}.composer-row{--composer-control-size: 36px;--composer-line-height: 22px;--composer-text-padding-block: 7px;display:grid;grid-template-columns:auto minmax(0,1fr) auto;align-items:start;gap:4px;padding:8px 8px 4px 10px;background:transparent;border:0;border-radius:0}.composer:focus-within .composer-toolbar,.composer-row:focus-within{border-color:transparent}.composer-row:focus-within{box-shadow:none}.composer-icon{align-self:start;width:var(--composer-control-size);height:var(--composer-control-size);margin-top:calc(var(--composer-text-padding-block) + (var(--composer-line-height) - var(--composer-control-size)) / 2);display:grid;place-items:center;color:var(--muted);border-radius:10px;cursor:pointer;transition:background .12s ease,color .12s ease}.composer-icon:hover{background:var(--hover-strong);color:var(--text-strong)}.composer-icon input[type=file]{position:absolute;inline-size:1px;block-size:1px;opacity:0;pointer-events:none}.composer textarea,.reply-composer textarea{width:100%;height:auto;min-height:44px;max-height:50vh;padding:var(--composer-text-padding-block) 4px;resize:none;color:var(--text);line-height:var(--composer-line-height);font-size:14.5px;align-self:start;overflow-y:auto;box-sizing:border-box}.composer textarea::placeholder,.reply-composer textarea::placeholder{color:var(--muted)}.send{align-self:start;width:var(--composer-control-size);height:var(--composer-control-size);margin-top:calc(var(--composer-text-padding-block) + (var(--composer-line-height) - var(--composer-control-size)) / 2);display:grid;place-items:center;border:0;border-radius:10px;background:var(--accent);color:#fff;transition:background .12s ease,transform 80ms ease,opacity .12s ease}.send:hover:not(:disabled){background:var(--accent-2);transform:translateY(-1px)}.send:disabled{background:var(--panel-3);color:var(--muted-2);cursor:not-allowed}.composer-attachment{margin-top:8px;margin-bottom:8px;display:inline-flex;align-items:center;gap:8px;padding:6px 10px;background:var(--panel);border:1px solid var(--line);border-radius:var(--radius);color:var(--text);font-size:13px;width:fit-content}.attachment-icon{display:grid;place-items:center;width:20px;height:20px;border-radius:6px;background:var(--accent-soft);color:var(--accent)}.pending-image{width:42px;height:32px;object-fit:cover;border-radius:7px;border:1px solid var(--line);background:var(--panel-2)}.attachment-name{max-width:240px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.attachment-remove{width:18px;height:18px;border:0;background:transparent;color:var(--muted);border-radius:50%;font-size:14px;line-height:1}.attachment-remove:hover{background:var(--danger);color:#fff}.composer-hint{color:var(--muted-2);font-size:11px;padding:7px 4px 0}.composer-hint kbd{display:inline-block;background:var(--panel-2);border:1px solid var(--line);border-radius:4px;padding:0 5px;font-family:Geist Mono Variable,ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:10.5px;color:var(--text)}@media(max-width:820px){.composer{padding:16px calc(14px + var(--safe-area-right)) calc(10px + var(--safe-area-bottom)) calc(14px + var(--safe-area-left))}.composer textarea,.reply-composer textarea{font-size:16px}.composer-suggestions{max-height:min(320px,42dvh)}}.thread{display:grid;grid-template-rows:auto minmax(0,1fr) auto;background:var(--panel);border-left:1px solid var(--line);min-width:0;overflow:hidden;opacity:0;transform:translate(28px);pointer-events:none;transition:opacity .18s ease,transform .22s cubic-bezier(.2,.8,.2,1)}.thread.open{opacity:1;transform:translate(0);pointer-events:auto}.thread>header{display:flex;align-items:center;justify-content:space-between;padding:12px 16px;min-height:60px;border-bottom:1px solid var(--line);background:linear-gradient(180deg,rgba(255,255,255,.02),transparent),var(--panel)}.thread>header p,.thread>header strong{margin:0}.thread>header p{color:var(--muted);font-size:11px;text-transform:uppercase;letter-spacing:.04em;font-weight:700}.thread>header strong{display:block;color:var(--text-strong);font-size:14px}.thread .close{width:28px;height:28px;border:0;border-radius:50%;background:var(--panel-2);color:var(--muted);font-size:18px;line-height:1}.thread .close:hover{background:var(--panel-3);color:var(--text-strong)}.thread-scroll{overflow-y:auto;padding:12px 16px}.thread-root{display:grid;grid-template-columns:38px minmax(0,1fr);gap:12px;padding-bottom:12px;border-bottom:1px solid var(--line)}.thread-divider{display:flex;align-items:center;gap:10px;margin:14px 0 10px}.thread-divider:before,.thread-divider:after{content:"";flex:1;height:1px;background:var(--line)}.thread-divider span{font-size:11px;color:var(--muted);text-transform:uppercase;letter-spacing:.04em;font-weight:700}.reply-list{display:flex;flex-direction:column;gap:10px}.reply{display:grid;grid-template-columns:30px minmax(0,1fr);gap:10px;padding:6px;border-radius:var(--radius-sm)}.reply:hover{background:var(--hover)}.reply-composer{--composer-card-top: 10px;--composer-overlay-inset-x: 14px;padding:10px 14px 14px;background:var(--panel);border-top:1px solid var(--line)}.reply-composer .composer-row{border-radius:0}.thread-empty{display:grid;place-items:center;align-content:center;gap:8px;padding:32px 24px;text-align:center;grid-row:span 3}.thread-icon{width:56px;height:56px;border-radius:16px;background:var(--panel-2);color:var(--muted);display:grid;place-items:center}.thread-empty strong{color:var(--text-strong);font-size:15px}.thread-empty span{color:var(--muted);font-size:13px;max-width:260px;line-height:1.5}.profile-pane{overflow-y:auto}.profile-hero{min-height:210px;display:grid;place-items:end center;padding:28px 20px;background:linear-gradient(180deg,transparent,rgba(0,0,0,.24)),linear-gradient(135deg,hsl(var(--hue, 220deg) 76% 58%),hsl(calc(var(--hue, 220deg) + 54deg) 74% 38%));border-bottom:1px solid var(--line)}.profile-avatar{width:min(240px,70%);aspect-ratio:1;display:grid;place-items:center;overflow:hidden;border-radius:16px;background:#ffffff2e;color:#fff;font-size:clamp(48px,12vw,88px);font-weight:800;box-shadow:0 26px 60px -30px #000000e6}.profile-avatar img{width:100%;height:100%;object-fit:cover}.profile-pane-body{display:grid;gap:18px;padding:18px 16px 22px}.profile-pane-title{display:flex;align-items:flex-start;justify-content:space-between;gap:12px}.profile-pane-title h2{margin:0;color:var(--text-strong);font-size:22px;letter-spacing:0}.profile-pane-title span{display:block;margin-top:3px;color:var(--muted);font-size:13px}.profile-pane-title .bot-badge{display:inline-flex;align-items:center;min-height:20px;margin-top:6px;padding:0 8px;border:1px solid color-mix(in srgb,var(--accent) 45%,transparent);border-radius:999px;color:var(--accent);font-size:11px;font-weight:800;line-height:1}.text-action{border:0;border-radius:6px;background:transparent;color:var(--accent);font-size:13px;font-weight:700;padding:4px 6px}.text-action:hover{background:var(--accent-soft)}.profile-presence{display:inline-flex;align-items:center;gap:8px;color:var(--text);font-size:14px}.profile-actions-row{display:grid;grid-template-columns:repeat(auto-fit,minmax(132px,1fr));gap:10px}.profile-actions-row .primary-action,.profile-actions-row .ghost-action{display:inline-flex;align-items:center;justify-content:center;width:100%;height:48px;min-width:0;padding:0 16px;border-radius:var(--radius);font-size:14px;font-weight:800;line-height:1;white-space:nowrap}.moderation-actions{display:grid;grid-template-columns:repeat(auto-fit,minmax(108px,1fr));gap:8px}.moderation-actions .primary-action,.moderation-actions .ghost-action,.moderation-actions .danger-action{min-height:40px;border-radius:var(--radius);font-size:13px;font-weight:800}.danger-action{border:1px solid color-mix(in srgb,var(--danger),transparent 35%);background:color-mix(in srgb,var(--danger),transparent 86%);color:var(--danger)}.role-pill{padding:4px 8px;border-radius:999px;background:var(--panel-2);color:var(--muted);font-size:11px;font-weight:800;text-transform:uppercase}.profile-info{display:grid;gap:12px;padding-top:18px;border-top:1px solid var(--line)}.profile-info header{display:flex;align-items:center;justify-content:space-between;gap:10px}.profile-info header strong{color:var(--text-strong);font-size:14px}.profile-info-row{display:grid;grid-template-columns:48px minmax(0,1fr);gap:14px;align-items:center;min-height:48px}.info-icon{width:48px;height:48px;display:inline-flex;align-items:center;justify-content:center;border-radius:12px;background:var(--panel-2);color:var(--muted);line-height:1}.info-icon svg{display:block;flex:none}.profile-info-row>div>small,.profile-info-row>div>span{display:block}.profile-info-row>div>small{color:var(--muted);font-size:12px;line-height:1.2}.profile-info-row>div>span{color:var(--text);font-size:14px;line-height:1.3;overflow-wrap:anywhere}.profile-note{margin:0;color:var(--muted);line-height:1.5;font-size:13px}@media(max-width:820px){.thread{min-height:100dvh}.thread>header{min-height:calc(60px + var(--safe-area-top));padding-top:calc(12px + var(--safe-area-top));padding-right:calc(16px + var(--safe-area-right));padding-left:calc(16px + var(--safe-area-left))}.thread-scroll{padding-right:calc(16px + var(--safe-area-right));padding-left:calc(16px + var(--safe-area-left))}.reply-composer{padding-right:calc(14px + var(--safe-area-right));padding-bottom:calc(14px + var(--safe-area-bottom));padding-left:calc(14px + var(--safe-area-left))}}.modal-scrim{position:fixed;inset:0;z-index:50;display:grid;place-items:center;padding:24px;background:#05080f8a;-webkit-backdrop-filter:blur(14px);backdrop-filter:blur(14px)}.modal-backdrop{position:absolute;inset:0;border:0;background:transparent}.modal-backdrop:focus{outline:0}.profile-modal{position:relative;z-index:1;width:min(480px,100%);border:1px solid var(--line-strong);border-radius:14px;background:var(--panel);color:var(--text);box-shadow:var(--shadow);overflow:hidden}.create-modal{width:min(420px,100%)}.profile-modal>header{display:flex;align-items:center;justify-content:space-between;gap:16px;padding:18px 20px;border-bottom:1px solid var(--line);background:var(--panel-2)}.profile-modal p{margin:0 0 3px;color:var(--muted);font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.06em}.profile-modal h2{margin:0;color:var(--text-strong);font-size:20px;letter-spacing:0}.profile-modal>header button{width:32px;height:32px;border:0;border-radius:8px;background:transparent;color:var(--muted);font-size:22px}.profile-modal>header button:hover{background:var(--hover);color:var(--text-strong)}.profile-form{display:grid;gap:14px;padding:20px}.profile-preview{display:flex;align-items:center;gap:14px;padding:14px;border:1px solid var(--line);border-radius:var(--radius);background:var(--panel-2)}.profile-preview strong,.profile-preview span{display:block}.profile-preview strong{color:var(--text-strong);font-size:15px}.profile-preview span{color:var(--muted);font-size:13px}.field{display:grid;gap:6px}.field span{color:var(--muted);font-size:12px;font-weight:700}.field input{width:100%;height:38px;padding:0 12px;border:1px solid var(--line);border-radius:var(--radius-sm);background:var(--panel-2);color:var(--text)}.field input:focus{border-color:var(--accent);outline:0;box-shadow:0 0 0 3px var(--accent-soft)}.check-field{display:flex;align-items:center;gap:10px}.check-field input{width:16px;height:16px;padding:0}.profile-status{color:var(--success);font-size:12px}.profile-status.error{color:var(--danger)}.profile-actions{display:flex;justify-content:flex-end;gap:8px;padding-top:4px}.person-picker{display:grid;gap:4px;max-height:240px;overflow-y:auto;padding:4px;border:1px solid var(--line);border-radius:var(--radius);background:var(--panel-2)}.person-choice{display:grid;grid-template-columns:32px minmax(0,1fr);align-items:center;gap:10px;width:100%;min-height:44px;border:0;border-radius:var(--radius-sm);background:transparent;color:var(--text);padding:6px 8px;text-align:left}.person-choice:hover{background:var(--hover-strong)}.person-choice .dm-avatar{width:32px;height:32px}.person-choice strong,.person-choice small{display:block;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.person-choice strong{color:var(--text-strong);font-size:13px}.person-choice small{color:var(--muted);font-size:12px}.person-empty{padding:10px 8px;color:var(--muted);font-size:12px}.profile-actions .ghost-action,.profile-actions .primary-action{box-sizing:border-box;display:inline-flex;align-items:center;justify-content:center;flex:0 0 auto;min-height:44px;padding:0 14px;border-radius:var(--radius-sm);font-weight:700;line-height:1;white-space:nowrap}.ghost-action{border:1px solid var(--line);background:var(--panel);color:var(--text)}.primary-action{border:0;background:var(--accent);color:#fff}.ghost-action:hover{background:var(--hover)}.primary-action:hover{filter:brightness(1.04)}.image-viewer-scrim{padding:28px;background:#000000c7;-webkit-backdrop-filter:blur(18px);backdrop-filter:blur(18px)}.image-viewer{position:relative;z-index:1;display:grid;grid-template-rows:auto minmax(0,1fr);width:min(1120px,100%);max-height:min(86vh,900px);overflow:hidden;border-radius:14px;background:#07090f;color:#fff;box-shadow:0 34px 90px -34px #000000f2;animation:picker-in .15s cubic-bezier(.2,.8,.2,1)}.image-viewer>header{display:flex;align-items:center;justify-content:space-between;gap:16px;min-height:52px;padding:10px 12px 10px 16px;border-bottom:1px solid rgba(255,255,255,.1);background:#ffffff0a}.image-viewer>header strong{min-width:0;overflow:hidden;color:#fff;font-size:13px;text-overflow:ellipsis;white-space:nowrap}.image-viewer>header div{display:inline-flex;align-items:center;gap:8px;flex-shrink:0}.image-viewer>header a{height:30px;display:inline-flex;align-items:center;padding:0 10px;border-radius:7px;background:#ffffff14;color:#fff;font-size:12px;font-weight:700;text-decoration:none}.image-viewer>header a:hover{background:#ffffff24}.image-viewer>header button{width:30px;height:30px;display:grid;place-items:center;border:0;border-radius:7px;background:transparent;color:#ffffffc7;font-size:22px;line-height:1}.image-viewer>header button:hover{background:#ffffff1f;color:#fff}.image-viewer-stage{display:grid;place-items:center;min-height:0;padding:18px}.image-viewer-stage img{display:block;max-width:100%;max-height:calc(86vh - 96px);object-fit:contain;border-radius:8px;background:#ffffff0a}.mobile-nav-toggle{display:none;position:fixed;top:calc(14px + var(--safe-area-top));left:calc(14px + var(--safe-area-left));z-index:30;width:38px;height:38px;border-radius:10px;border:1px solid var(--line-strong);background:var(--panel);color:var(--text);font-size:22px;line-height:1}.mobile-nav-toggle .bars{display:grid;gap:3px}.mobile-nav-toggle .bars i{display:block;width:16px;height:2px;background:currentColor;border-radius:2px}.mobile-nav-backdrop{display:none}@media(max-width:1180px){.shell{grid-template-columns:72px 240px minmax(0,1fr)}.shell.sidebar-collapsed,.shell.sidebar-collapsed.thread-open{grid-template-columns:72px 0 minmax(0,1fr)}.thread{position:fixed;inset:0 0 0 auto;width:min(420px,100vw);box-shadow:var(--shadow);transform:translate(100%);transition:transform .18s ease;z-index:4;border-left:1px solid var(--line-strong)}.thread.open{transform:translate(0)}}@media(max-width:820px){.mobile-nav-toggle{display:grid;place-items:center}.shell,.shell.thread-open,.shell.sidebar-collapsed,.shell.sidebar-collapsed.thread-open{grid-template-columns:1fr}.sidebar-collapsed .sidebar{opacity:1;pointer-events:none;transform:translate3d(calc(-100% - 72px),0,0)}.guild-rail,.sidebar{position:fixed;inset:0 auto 0 0;z-index:20;height:100vh;height:100dvh;pointer-events:none;transform:translate3d(-100%,0,0);transition:transform .18s ease}.guild-rail{width:72px;padding-top:calc(14px + var(--safe-area-top));padding-bottom:calc(14px + var(--safe-area-bottom))}.sidebar{left:72px;width:min(260px,calc(100vw - 72px));transform:translate3d(calc(-100% - 72px),0,0)}.nav-open .guild-rail,.nav-open .sidebar{pointer-events:auto;transform:translateZ(0)}.nav-open .guild-rail{padding-top:calc(62px + var(--safe-area-top))}.mobile-nav-backdrop{display:block;position:fixed;top:0;right:0;bottom:0;left:min(332px,100vw);z-index:15;border:0;background:#05081075;padding:0}.topbar{min-height:calc(60px + var(--safe-area-top));padding-top:calc(12px + var(--safe-area-top));padding-right:calc(20px + var(--safe-area-right));padding-left:calc(64px + var(--safe-area-left))}.search{width:180px}}@media(max-width:520px){.search,.topbar-meta,.topbar-divider{display:none}}.message-row.highlight,.thread-root.highlight,.reply.highlight{animation:quote-flash 1.4s ease-out}@keyframes quote-flash{0%{background:#6366f138}to{background:transparent}}.quote-block{display:inline-flex;align-items:stretch;gap:.5rem;margin:0 0 .35rem;padding:.25rem .5rem .25rem 0;background:transparent;border:0;border-radius:6px;color:inherit;cursor:pointer;text-align:left;max-width:100%;font:inherit}.quote-block:hover:not(:disabled){background:#6366f114}.quote-block:disabled{cursor:default;opacity:.75}.quote-block .quote-bar{width:3px;align-self:stretch;background:var(--accent, #6366f1);border-radius:2px;flex:0 0 3px}.quote-block .quote-content{display:flex;flex-direction:column;gap:.1rem;min-width:0}.quote-block .quote-author{font-size:.78rem;font-weight:600;color:var(--accent, #6366f1)}.quote-block .quote-snippet{font-size:.85rem;color:var(--text-muted, #6b7280);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:56ch}.quote-block .quote-snippet.muted{font-style:italic;opacity:.75}.quote-preview{display:flex;align-items:center;gap:.5rem;padding:6px 10px 6px 12px;margin:0;background:color-mix(in srgb,var(--accent) 5%,transparent);border:0;border-bottom:1px solid var(--line);border-radius:0;font-size:12.5px;color:var(--muted)}.quote-preview .quote-bar{display:none}.quote-preview-body{display:flex;align-items:baseline;gap:.4rem;flex:1;min-width:0;overflow:hidden}.quote-preview-label{font-size:12px;color:color-mix(in srgb,var(--accent) 85%,var(--text));white-space:nowrap}.quote-preview-label strong{color:var(--text-strong);font-weight:600}.quote-preview-snippet{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:var(--muted);font-size:12px;flex:1;min-width:0}.quote-preview-clear{background:transparent;border:0;color:var(--muted);font-size:16px;line-height:1;cursor:pointer;padding:2px 6px;border-radius:6px;transition:background .1s ease,color .1s ease}.quote-preview-clear:hover{color:var(--text-strong);background:var(--hover-strong)}.reply-quote-btn{position:relative;margin-left:auto;background:transparent;border:0;color:var(--text-muted, #6b7280);cursor:pointer;font-size:.95rem;padding:0 .3rem;opacity:0;transition:opacity .15s}.reply:hover .reply-quote-btn,.thread-root:hover .reply-quote-btn,.reply-quote-btn:focus-visible{opacity:1}.reply-quote-btn:hover{color:var(--accent, #6366f1)}.tooltip{position:relative}.tooltip:before,.reply-quote-btn:before{content:attr(data-tooltip);position:absolute;left:50%;bottom:calc(100% + 12px);z-index:20;transform:translate(-50%,4px) scale(.96);padding:.42rem .62rem;border-radius:9px;background:#3a3a44;color:#f4f4f7;box-shadow:0 10px 28px #00000047;font-size:.78rem;font-weight:700;line-height:1;white-space:nowrap;opacity:0;pointer-events:none;transition:opacity .12s ease,transform .12s ease}.tooltip:after,.reply-quote-btn:after{content:"";position:absolute;left:50%;bottom:calc(100% + 5px);z-index:20;width:12px;height:12px;border-radius:2px;background:#3a3a44;transform:translate(-50%,4px) rotate(45deg) scale(.9);opacity:0;pointer-events:none;transition:opacity .12s ease,transform .12s ease}.tooltip:hover:before,.tooltip:focus-visible:before,.reply-quote-btn:hover:before,.reply-quote-btn:focus-visible:before,.tooltip:hover:after,.tooltip:focus-visible:after,.reply-quote-btn:hover:after,.reply-quote-btn:focus-visible:after{opacity:1;transform:translate(-50%) scale(1)}.tooltip:hover:after,.tooltip:focus-visible:after,.reply-quote-btn:hover:after,.reply-quote-btn:focus-visible:after{transform:translate(-50%) rotate(45deg) scale(1)} diff --git a/apps/api/internal/webassets/dist/_app/immutable/chunks/C-yBSfLe.js b/apps/api/internal/webassets/dist/_app/immutable/chunks/C-yBSfLe.js new file mode 100644 index 00000000..3f2b21e7 --- /dev/null +++ b/apps/api/internal/webassets/dist/_app/immutable/chunks/C-yBSfLe.js @@ -0,0 +1,66 @@ +import{b as pr,a as O,f as H,t as Mn,c as bn}from"./BQbSjbnU.js";import{h as ot,y as jn,aw as fo,aI as ho,a5 as pi,B as Wa,b as mi,I as t,J as Cc,a9 as Ic,K as gs,D as Pn,L as Yn,i as Nn,ar as vi,az as Rc,ai as ps,g as Dc,f as ba,aJ as Mc,s as Nc,_ as Zt,aK as go,ay as _i,aL as Oc,a7 as ms,aM as Lc,aN as Pc,aD as ie,e as Ba,aO as On,aP as po,X as Uc,r as mo,c as vo,aQ as Hr,aR as qc,aS as zc,m as Bc,d as _r,at as br,t as se,x as _o,aT as Fc,aA as Hc,au as Wc,w as bo,aU as yo,aV as Gc,aW as Kc,E as jc,an as wo,aX as Vc,H as bi,k as ln,M as Yc,aY as Fa,aZ as Zc,a_ as ko,a$ as vs,b0 as _s,b1 as Xc,b2 as Jc,b3 as Qc,b4 as $c,b5 as eu,b6 as Za,b7 as tu,b8 as nu,b9 as au,ba as ru,bb as iu,j as su,aE as $r,u as en,bc as bs,bd as ou,a1 as lu,be as cu,p as ht,o as _,v as y,q as p,a as gt,V as h,aG as dt,aH as oe,G as _n,aF as Vn,n as Ft,U as To,bf as ys,bg as Rt,bh as uu,bi as ws}from"./Dtg1jxvd.js";import{a as Xa,o as So}from"./C__K3_0V.js";import{i as du,a as fu,d as $,b as _t,c as hu,n as gu,e as pu,s as ee,f as un,r as ks}from"./D2t05ipP.js";import{p as Fe,i as le,b as $n,_ as Ts}from"./BT2tP07K.js";import{g as Ss}from"./01jLas2k.js";import{B as mu}from"./CpwnOByv.js";import{s as vu}from"./Cq0K50L1.js";function _u(n,e){if(e){const a=document.body;n.autofocus=!0,pi(()=>{document.activeElement===a&&n.focus()})}}function bu(n){ot&&jn(n)!==null&&fo(n)}let xs=!1;function yu(){xs||(xs=!0,document.addEventListener("reset",n=>{Promise.resolve().then(()=>{if(!n.defaultPrevented)for(const e of n.target.elements)e[ho]?.()})},{capture:!0}))}function wu(n,e){return e}function ku(n,e,a){for(var r=[],i=e.length,o,c=e.length,d=0;d{if(o){if(o.pending.delete(b),o.done.add(b),o.pending.size===0){var w=n.outrogroups;ei(n,_i(o.done)),w.delete(o),w.size===0&&(n.outrogroups=null)}}else c-=1},!1)}if(c===0){var u=r.length===0&&a!==null;if(u){var m=a,f=m.parentNode;fo(f),f.append(m),n.items.clear()}ei(n,e,!u)}else o={pending:new Set(e),done:new Set},(n.outrogroups??=new Set).add(o)}function ei(n,e,a=!0){var r;if(n.pending.size>0){r=new Set;for(const c of n.pending.values())for(const d of c)r.add(n.items.get(d).e)}for(var i=0;i{var D=a();return go(D)?D:D==null?[]:_i(D)}),w,C=new Map,x=!0;function E(D){(P.effect.f&Uc)===0&&(P.pending.delete(D),P.fallback=f,Tu(P,w,c,e,r),f!==null&&(w.length===0?(f.f&On)===0?mo(f):(f.f^=On,Ua(f,null,c)):vo(f,()=>{f=null})))}function T(D){P.pending.delete(D)}var R=mi(()=>{w=t(b);var D=w.length;let W=!1;if(ot){var Y=Cc(c)===Ic;Y!==(D===0)&&(c=gs(),Pn(c),Yn(!1),W=!0)}for(var U=new Set,Z=Dc,K=Nc(),G=0;Go(c)):(f=ba(()=>o(As??=Ba())),f.f|=On)),D>U.size&&Mc(),ot&&D>0&&Pn(gs()),!x)if(C.set(Z,U),K){for(const[V,M]of d)U.has(V)||Z.skip_effect(M.e);Z.oncommit(E),Z.ondiscard(T)}else E(Z);W&&Yn(!0),t(b)}),P={effect:R,items:d,pending:C,outrogroups:null,fallback:f};x=!1,ot&&(c=Nn)}function Ra(n){for(;n!==null&&(n.f&qc)===0;)n=n.next;return n}function Tu(n,e,a,r,i){var o=(r&zc)!==0,c=e.length,d=n.items,u=Ra(n.effect.first),m,f=null,b,w=[],C=[],x,E,T,R;if(o)for(R=0;R0){var G=(r&po)!==0&&c===0?a:null;if(o){for(R=0;R{if(b!==void 0)for(T of b)T.nodes?.a?.apply()})}function Su(n,e,a,r,i,o,c,d){var u=(c&Lc)!==0?(c&Pc)===0?ie(a,!1,!1):ms(a):null,m=(c&Oc)!==0?ms(i):null;return{v:u,i:m,e:ba(()=>(o(e,u??a,m??i,d),()=>{n.delete(r)}))}}function Ua(n,e,a){if(n.nodes)for(var r=n.nodes.start,i=n.nodes.end,o=e&&(e.f&On)===0?e.nodes.start:a;r!==null;){var c=br(r);if(o.before(r),r===i)return;r=c}}function Qn(n,e,a){e===null?n.effect.first=a:e.next=a,a===null?n.effect.last=e:a.prev=e}function Ga(n,e,a=!1,r=!1,i=!1,o=!1){var c=n,d="";if(a){var u=n;ot&&(c=Pn(jn(u)))}se(()=>{var m=_o;if(d===(d=e()??"")){ot&&Wa();return}if(a&&!ot){m.nodes=null,u.innerHTML=d,d!==""&&pr(jn(u),u.lastChild);return}if(m.nodes!==null&&(Fc(m.nodes.start,m.nodes.end),m.nodes=null),d!==""){if(ot){Nn.data;for(var f=Wa(),b=f;f!==null&&(f.nodeType!==vi||f.data!=="");)b=f,f=br(f);if(f===null)throw Hc(),Wc;pr(Nn,b),c=Pn(f);return}var w=r?yo:i?Gc:void 0,C=bo(r?"svg":i?"math":"template",w);C.innerHTML=d;var x=r||i?C:C.content;if(pr(jn(x),x.lastChild),r||i)for(;jn(x);)c.before(jn(x));else c.before(x)}})}function xo(n,e,a,r,i,o){let c=ot;ot&&Wa();var d=null;ot&&Nn.nodeType===Kc&&(d=Nn,Wa());var u=ot?Nn:n,m=new mu(u,!1);mi(()=>{const f=e()||null;var b=f==="svg"?yo:void 0;if(f===null){m.ensure(null,null);return}return m.ensure(f,w=>{if(f){if(d=ot?d:bo(f,b),pr(d,d),r){var C=null;ot&&du(f)&&d.append(C=document.createComment(""));var x=ot?jn(d):d.appendChild(Ba());ot&&(x===null?Yn(!1):Pn(x)),r(d,x),C?.remove()}_o.nodes.end=d,w.before(d)}ot&&Pn(w)}),()=>{}},jc),wo(()=>{}),c&&(Yn(!0),Pn(u))}function xu(n,e){let a=null,r=ot;var i;if(ot){a=Nn;for(var o=jn(document.head);o!==null&&(o.nodeType!==vi||o.data!==n);)o=br(o);if(o===null)Yn(!1);else{var c=br(o);o.remove(),Pn(c)}}ot||(i=document.head.appendChild(Ba()));try{mi(()=>{var d=ba(()=>e(i));d.f|=Vc})}finally{r&&(Yn(!0),Pn(a))}}function Ka(n,e,a){bi(()=>{var r=ln(()=>e(n,a?.())||{});if(a&&r?.update){var i=!1,o={};Yc(()=>{var c=a();Fa(c),i&&Zc(o,c)&&(o=c,r.update(c))}),i=!0}if(r?.destroy)return()=>r.destroy()})}function Au(n,e){var a=void 0,r;ko(()=>{a!==(a=e())&&(r&&(_r(r),r=null),a&&(r=ba(()=>{bi(()=>a(n))})))})}function Ao(n){var e,a,r="";if(typeof n=="string"||typeof n=="number")r+=n;else if(typeof n=="object")if(Array.isArray(n)){var i=n.length;for(e=0;e=0;){var d=c+o;(c===0||Es.includes(r[c-1]))&&(d===r.length||Es.includes(r[d]))?r=(c===0?"":r.substring(0,c))+r.substring(d+1):c=d}}return r===""?null:r}function Cs(n,e=!1){var a=e?" !important;":";",r="";for(var i of Object.keys(n)){var o=n[i];o!=null&&o!==""&&(r+=" "+i+": "+o+a)}return r}function Wr(n){return n[0]!=="-"||n[1]!=="-"?n.toLowerCase():n}function Iu(n,e){if(e){var a="",r,i;if(Array.isArray(e)?(r=e[0],i=e[1]):r=e,n){n=String(n).replaceAll(/\s*\/\*.*?\*\/\s*/g,"").trim();var o=!1,c=0,d=!1,u=[];r&&u.push(...Object.keys(r).map(Wr)),i&&u.push(...Object.keys(i).map(Wr));var m=0,f=-1;const E=n.length;for(var b=0;b{wr(n,n.__value)});e.observe(n,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["value"]}),wo(()=>{e.disconnect()})}function Is(n){return"__value"in n?n.__value:n.value}const Da=Symbol("class"),Ma=Symbol("style"),Co=Symbol("is custom element"),Io=Symbol("is html"),Ru=Za?"link":"LINK",Rs=Za?"input":"INPUT",Du=Za?"option":"OPTION",Mu=Za?"select":"SELECT",Nu=Za?"progress":"PROGRESS";function cn(n){if(ot){var e=!1,a=()=>{if(!e){if(e=!0,n.hasAttribute("value")){var r=n.value;ne(n,"value",null),n.value=r}if(n.hasAttribute("checked")){var i=n.checked;ne(n,"checked",null),n.checked=i}}};n[ho]=a,pi(a),yu()}}function Ln(n,e){var a=Ar(n);a.value===(a.value=e??void 0)||n.value===e&&(e!==0||n.nodeName!==Nu)||(n.value=e??"")}function cr(n,e){var a=Ar(n);a.checked!==(a.checked=e??void 0)&&(n.checked=e)}function Ou(n,e){e?n.hasAttribute("selected")||n.setAttribute("selected",""):n.removeAttribute("selected")}function ne(n,e,a,r){var i=Ar(n);ot&&(i[e]=n.getAttribute(e),e==="src"||e==="srcset"||e==="href"&&n.nodeName===Ru)||i[e]!==(i[e]=a)&&(e==="loading"&&(n[Qc]=a),a==null?n.removeAttribute(e):typeof a!="string"&&Do(n).includes(e)?n[e]=a:n.setAttribute(e,a))}function Lu(n,e,a,r,i=!1,o=!1){if(ot&&i&&n.nodeName===Rs){var c=n,d=c.type==="checkbox"?"defaultChecked":"defaultValue";d in a||cn(c)}var u=Ar(n),m=u[Co],f=!u[Io];let b=ot&&m;b&&Yn(!1);var w=e||{},C=n.nodeName===Du;for(var x in e)x in a||(a[x]=null);a.class?a.class=yr(a.class):a[Da]&&(a.class=null),a[Ma]&&(a.style??=null);var E=Do(n);if(n.nodeName===Rs&&"type"in a&&("value"in a||"__value"in a)){var T=a.type;(T!==w.type||T===void 0&&n.hasAttribute("type"))&&(w.type=T,ne(n,"type",T))}for(const Z in a){let K=a[Z];if(C&&Z==="value"&&K==null){n.value=n.__value="",w[Z]=K;continue}if(Z==="class"){var R=n.namespaceURI==="http://www.w3.org/1999/xhtml";Qe(n,R,K,r,e?.[Da],a[Da]),w[Z]=K,w[Da]=a[Da];continue}if(Z==="style"){oa(n,K,e?.[Ma],a[Ma]),w[Z]=K,w[Ma]=a[Ma];continue}var P=w[Z];if(!(K===P&&!(K===void 0&&n.hasAttribute(Z)))){w[Z]=K;var D=Z[0]+Z[1];if(D!=="$$")if(D==="on"){const G={},ue="$$"+Z;let ce=Z.slice(2);var W=pu(ce);if(fu(ce)&&(ce=ce.slice(0,-7),G.capture=!0),!W&&P){if(K!=null)continue;n.removeEventListener(ce,w[ue],G),w[ue]=null}if(W)$(ce,n,K),_t([ce]);else if(K!=null){let j=function(V){w[Z].call(this,V)};w[ue]=hu(ce,n,j,G)}}else if(Z==="style")ne(n,Z,K);else if(Z==="autofocus")_u(n,!!K);else if(!m&&(Z==="__value"||Z==="value"&&K!=null))n.value=n.__value=K;else if(Z==="selected"&&C)Ou(n,K);else{var Y=Z;f||(Y=gu(Y));var U=Y==="defaultValue"||Y==="defaultChecked";if(K==null&&!m&&!U)if(u[Z]=null,Y==="value"||Y==="checked"){let G=n;const ue=e===void 0;if(Y==="value"){let ce=G.defaultValue;G.removeAttribute(Y),G.defaultValue=ce,G.value=G.__value=ue?ce:null}else{let ce=G.defaultChecked;G.removeAttribute(Y),G.defaultChecked=ce,G.checked=ue?ce:!1}}else n.removeAttribute(Z);else U||E.includes(Y)&&(m||typeof K!="string")?(n[Y]=K,Y in u&&(u[Y]=iu)):typeof K!="function"&&ne(n,Y,K)}}}return b&&Yn(!0),w}function Ro(n,e,a=[],r=[],i=[],o,c=!1,d=!1){au(i,a,r,u=>{var m=void 0,f={},b=n.nodeName===Mu,w=!1;if(ko(()=>{var x=e(...u.map(t)),E=Lu(n,m,x,o,c,d);w&&b&&"value"in x&&wr(n,x.value);for(let R of Object.getOwnPropertySymbols(f))x[R]||_r(f[R]);for(let R of Object.getOwnPropertySymbols(x)){var T=x[R];R.description===ru&&(!m||T!==m[R])&&(f[R]&&_r(f[R]),f[R]=ba(()=>Au(n,()=>T))),E[R]=T}m=E}),b){var C=n;bi(()=>{wr(C,m.value,!0),Eo(C)})}w=!0})}function Ar(n){return n[$c]??={[Co]:n.nodeName.includes("-"),[Io]:n.namespaceURI===eu}}var Ds=new Map;function Do(n){var e=n.getAttribute("is")||n.nodeName,a=Ds.get(e);if(a)return a;Ds.set(e,a=[]);for(var r,i=n,o=Element.prototype;o!==i;){r=nu(i);for(var c in r)r[c].set&&c!=="innerHTML"&&c!=="textContent"&&c!=="innerText"&&a.push(c);i=tu(i)}return a}function Pu(n=!1){const e=su,a=e.l.u;if(!a)return;let r=()=>Fa(e.s);if(n){let i=0,o={};const c=lu(()=>{let d=!1;const u=e.s;for(const m in u)u[m]!==o[m]&&(o[m]=u[m],d=!0);return d&&i++,i});r=()=>t(c)}a.b.length&&$r(()=>{Ms(e,r),bs(a.b)}),en(()=>{const i=ln(()=>a.m.map(ou));return()=>{for(const o of i)typeof o=="function"&&o()}}),a.a.length&&en(()=>{Ms(e,r),bs(a.a)})}function Ms(n,e){if(n.l.s)for(const a of n.l.s)t(a);e()}cu();class ti extends Error{constructor(e,a){super(a),this.status=e}status}async function at(n,e={}){const a=new Headers(e.headers),r=(e.method??"GET").toUpperCase();a.set("Accept","application/json"),e.body&&!(e.body instanceof FormData)&&a.set("Content-Type","application/json"),["GET","HEAD","OPTIONS","TRACE"].includes(r)||a.set("X-ClickClack-CSRF","1");const i=await fetch(n,{...e,headers:a});if(!i.ok)throw new ti(i.status,await i.text());if(i.status===204||i.status===205)return;const o=await i.text();return o?JSON.parse(o):void 0}async function Uu(n){return n.type.startsWith("image/")?qu(n):n.type.startsWith("video/")?zu(n):{width:0,height:0,durationMS:0}}function qu(n){return new Promise(e=>{const a=URL.createObjectURL(n),r=new Image;r.onload=()=>{const i={width:r.naturalWidth,height:r.naturalHeight,durationMS:0};URL.revokeObjectURL(a),e(i)},r.onerror=()=>{URL.revokeObjectURL(a),e({width:0,height:0,durationMS:0})},r.src=a})}function zu(n){return new Promise(e=>{const a=URL.createObjectURL(n),r=document.createElement("video");r.preload="metadata",r.muted=!0;const i=()=>{URL.revokeObjectURL(a),r.src=""};r.onloadedmetadata=()=>{const o=Number.isFinite(r.duration)&&r.duration>0?Math.round(r.duration*1e3):0,c={width:r.videoWidth,height:r.videoHeight,durationMS:o};i(),e(c)},r.onerror=()=>{i(),e({width:0,height:0,durationMS:0})},r.src=a})}const Bu=[{title:"Ship it",url:"https://media.giphy.com/media/v1.Y2lkPTc5MGI3NjExYjJ1bm1meHE4N2x3bnN0djJkMWtjNGc5bXYzZDFiOHBsbG16M3F0ZSZlcD12MV9naWZzX3NlYXJjaCZjdD1n/l0HlHFRbmaZtBRhXG/giphy.gif",tags:["ship","launch","done"]},{title:"Approved",url:"https://media.giphy.com/media/v1.Y2lkPTc5MGI3NjExazBpbzJ6ODZ3bXQ3OHBvNGJidWZoajc0cHV6YnVub3MzZ3c1a2Z2dSZlcD12MV9naWZzX3NlYXJjaCZjdD1n/111ebonMs90YLu/giphy.gif",tags:["yes","approved","nice"]},{title:"Deploy dance",url:"https://media.giphy.com/media/v1.Y2lkPTc5MGI3NjExY3NkaTVmZW9ydWNnZnl0ZWQ5aHQyeGNrd2k3NG4wZWNqYzNmd3k1ZCZlcD12MV9naWZzX3NlYXJjaCZjdD1n/GeimqsH0TLDt4tScGw/giphy.gif",tags:["deploy","dance","celebrate"]},{title:"Looking",url:"https://media.giphy.com/media/v1.Y2lkPTc5MGI3NjExYWZ3emE0dm5mN2h0bGVsY2w0OXBodGd2cGJlNDRiZXo1YWNtdWRmZyZlcD12MV9naWZzX3NlYXJjaCZjdD1n/26n6WywJyh39n1pBu/giphy.gif",tags:["search","looking","debug"]},{title:"Typing faster",url:"https://media.giphy.com/media/v1.Y2lkPTc5MGI3NjExOWFlbnJnbnIzbHYxcDIzdXZ3NGF3N2FocHNvMmR5enU3bHpycHBlZSZlcD12MV9naWZzX3NlYXJjaCZjdD1n/13HgwGsXF0aiGY/giphy.gif",tags:["typing","code","work"]},{title:"Tiny victory",url:"https://media.giphy.com/media/v1.Y2lkPTc5MGI3NjExdjJ2b2tqNmF4dG16NjE0eXhuc3h5bTlvamgwNTR0Zmd6ZjhtM2JuaSZlcD12MV9naWZzX3NlYXJjaCZjdD1n/3o7abKhOpu0NwenH3O/giphy.gif",tags:["win","victory","celebrate"]}],ni=Symbol("clickclackAnimatedURL");function Fu(n){return n[ni]||n.currentSrc||n.src}function ai(n){const e=new Map,a=new Map,r=new Map;let i=!1;const o=f=>{try{const b=new URL(f,window.location.href);if(b.hostname!=="giphy.com"&&!b.hostname.endsWith(".giphy.com"))return"";const w=b.pathname.match(/\/media\/(?:v1\.[^/]+\/)?([^/]+)\/giphy\.gif$/);if(w)return`${b.origin}/media/${w[1]}/giphy_s.gif`}catch{return""}return""},c=f=>{const b=f.includes("?")?"&":"?";return`${f}${b}cc_replay=${Date.now()}`},d=(f,b,w,C,x,E=!1)=>{const T=e.get(b);T&&window.clearTimeout(T);const R=(a.get(b)||0)+1;a.set(b,R),f.classList.add("playing"),f.classList.remove("paused"),w.disabled=!0,w.tabIndex=-1,w.ariaHidden="true";let P=!1;const D=()=>{if(P||(P=!0,i||a.get(b)!==R))return;const Y=window.setTimeout(()=>{i||a.get(b)!==R||(f.classList.remove("playing"),f.classList.add("paused"),w.disabled=!1,w.tabIndex=0,w.ariaHidden="false",x&&(b.src=x))},2600);e.set(b,Y)},W=()=>{b.decode().catch(()=>{}).then(D)};b.addEventListener("load",W,{once:!0}),E&&(b.src=c(C)),b.complete&&b.naturalWidth>0&&W()},u=()=>{for(const f of n.querySelectorAll("img")){if(f.closest(".gif-player")||f.closest("a"))continue;const b=f.getAttribute("src")||f.src;if(!/\.gif(?:$|[?#])/i.test(b))continue;const w=o(b);if(!w)continue;const C=document.createElement("span");C.className="gif-player";const x=document.createElement("span");x.className="gif-badge",x.textContent="GIF";const E=document.createElement("button");E.type="button",E.className="gif-replay",E.disabled=!0,E.tabIndex=-1,E.ariaHidden="true",E.ariaLabel=`Replay GIF ${f.alt||"image"}`,E.title="Replay GIF",E.textContent="↻";const T=f.parentNode,R=f.nextSibling,P=f.getAttribute("src")||f.src;f[ni]=b,T?.insertBefore(C,f),C.append(f,x,E);const D=W=>{W.preventDefault(),W.stopPropagation(),d(C,f,E,b,w,!0)};r.set(f,{wrapper:C,replay:E,originalSrc:P,originalParent:T,originalNextSibling:R,onReplay:D}),E.addEventListener("click",D),d(C,f,E,b,w)}},m=new MutationObserver(u);return m.observe(n,{childList:!0,subtree:!0}),u(),{destroy(){i=!0,m.disconnect();for(const f of e.values())window.clearTimeout(f);for(const[f,b]of r)b.replay.removeEventListener("click",b.onReplay),delete f[ni],f.src=b.originalSrc,b.wrapper.parentNode?b.wrapper.replaceWith(f):b.originalParent&&f.parentNode!==b.originalParent&&b.originalParent.insertBefore(f,b.originalNextSibling);r.clear(),e.clear(),a.clear()}}}const ur=100,ri=50,Mo=900,ha=700,Kr=Mo+ri*2,Hu=8,Wu=16;function Gu(n,e,a){if(n.length<=Mo)return n;const r=Ku(n,a);if(e==="prepend")return dr(n,0,ha,r,"start");if(e==="append")return dr(n,Math.max(0,n.length-ha),n.length,r,"end");if(e==="around"){const i=r?.first??-1,o=i>=0?i:Math.floor(n.length/2);let c=Math.max(0,o-Math.floor(ha/2)),d=Math.min(n.length,c+ha);return c=Math.max(0,d-ha),dr(n,c,d,r,"start")}return dr(n,Math.max(0,n.length-ha),n.length,r,"end")}function Ku(n,e){if(e.size===0)return null;let a=-1,r=-1;for(let i=0;iKr&&(i==="start"?(o=e,c=Math.min(n.length,o+Kr)):(c=a,o=Math.max(0,c-Kr))),n.slice(o,c)}function ju(n){const e=n.trim();if(!e)return"?";const a=e.split(/\s+/);return a.length>=2?(a[0][0]+a[1][0]).toUpperCase():e.slice(0,2).toUpperCase()}function No(n){if(!n)return"?";const e=n.trim();return e?e[0].toUpperCase():"?"}function Un(n){return n?`@${n}`:""}function Oo(n){let e=0;for(let a=0;a>>0;return e%360}function Vu(n,e){return n.members.find(a=>a.id!==e)||n.members[0]}function sa(n,e){const a=n.members.filter(i=>i.id!==e);return(a.length>0?a:n.members).map(i=>i.display_name).join(", ")}function Yu(n,e,a){const r=new Map;for(const i of e)for(const o of i.members)o.id&&o.id!==a&&r.set(o.id,o);for(const i of[...n].reverse()){const o=i.author;o?.id&&o.id!==a&&r.set(o.id,o)}return[...r.values()].slice(0,12)}function Zu(n,e){return n.find(a=>a.members.some(r=>r.id===e))}const Xu=new Set(["agent_commentary","agent_tool"]),Ju=180*1e3;function Ns(n){return n.kind!==void 0&&Xu.has(n.kind)}function Qu(n){return n.kind===void 0||n.kind==="message"}function ii(n){return n.author?.id||n.author_id||""}function Os(n){return`${n.channel_id?`channel:${n.channel_id}`:`direct:${n.direct_conversation_id||""}`}\0${ii(n)}\0${n.turn_id||n.id}`}function $u(n){const e=n.trim();let a="",r="";const i=e.match(/^\*\*([^*]+)\*\*\s*\n+([\s\S]+)$/),o=e.match(/^\*\*([^*]+)\*\*$/);if(i)a=i[1].trim(),r=Lo(i[2]);else if(o)a=o[1].trim();else{const c=e.replace(/\*\*/g,"").trim();return Ls(c,"")}return Ls(a,r)}function Ls(n,e){const a=Lo(n),r=a.indexOf(" ");let i,o;r===-1?(i=a,o=""):(i=a.slice(0,r),o=a.slice(r+1).trim());const d=[o,e].filter(u=>u.length>0).join(" · ");return{name:i,detail:d||void 0}}function Lo(n){return n.replace(/\s+/g," ").trim()}function ed(n,e,a,r){const i=[];for(const o of e)if(o.kind==="agent_tool"){if(r.hideToolCalls)continue;const c=$u(o.body);i.push({type:"tool",id:o.id,name:c.name,detail:c.detail,full:o.body.trim()})}else{if(r.hideCommentary)continue;const c=o.body.trim();c&&i.push({type:"commentary",id:o.id,body:c})}return i.length===0?null:{turnId:n,items:i,final:a}}function td(n,e,a=Date.now()){const r=new Map,i=new Map;for(let d=0;du.firstIndex;if(!m){const f=Date.parse(u.rows[u.rows.length-1].created_at);Number.isFinite(f)&&a-f>Ju&&(m=!0)}o.set(d,m)}const c=[];for(let d=0;d`clickclack:${n}:cursor`;function dd(n){const{workspaceID:e,onEvent:a,onStatusChange:r}=n,i=n.reconnectDelayMs??1200;let o=null,c,d=!1,u=!1;function m(b){u!==b&&(u=b,r?.(b))}function f(){if(d)return;const b=new URL("/api/realtime/ws",window.location.href);b.protocol=window.location.protocol==="https:"?"wss:":"ws:",b.searchParams.set("workspace_id",e);const w=localStorage.getItem(Ps(e))||"";w&&b.searchParams.set("after_cursor",w);const C=new WebSocket(b);o=C,C.addEventListener("open",()=>{o===C&&m(!0)}),C.addEventListener("message",x=>{let E;try{E=JSON.parse(String(x.data))}catch{return}fd(E)&&(E.cursor&&localStorage.setItem(Ps(e),E.cursor),a(E))}),C.addEventListener("close",()=>{o!==C||d||(o=null,m(!1),c=window.setTimeout(f,i))})}return f(),{get connected(){return u},close(){d=!0,m(!1),c&&window.clearTimeout(c),o?.close(),o=null}}}function fd(n){return typeof n=="object"&&n!==null&&typeof n.type=="string"}const hd=5e3,gd=4e3;let Ot=null;function pd(n,e){return n.workspaceID===e.workspaceID&&(n.channelID??"")===(e.channelID??"")&&(n.directConversationID??"")===(e.directConversationID??"")}function md(n){const e={};return n.channelID&&(e.channel_id=n.channelID),n.directConversationID&&(e.direct_conversation_id=n.directConversationID),e}async function Po(n,e){try{await at("/api/realtime/ephemeral",{method:"POST",body:JSON.stringify({workspace_id:n.workspaceID,channel_id:n.channelID||"",direct_conversation_id:n.directConversationID||"",type:e,payload:md(n)})})}catch{}}function vd(n){if(!n.workspaceID||!n.channelID&&!n.directConversationID)return;const e=Date.now();Ot&&!pd(Ot.scope,n)&&(si(Ot),Ot=null),Ot||(Ot={scope:n,active:!1,lastPingAt:0}),(!Ot.active||e-Ot.lastPingAt>=gd)&&(Ot.active=!0,Ot.lastPingAt=e,Po(n,"typing.started")),Ot.idleTimer&&window.clearTimeout(Ot.idleTimer),Ot.idleTimer=window.setTimeout(()=>{Ot&&(si(Ot),Ot=null)},hd)}async function si(n){n.idleTimer&&window.clearTimeout(n.idleTimer),n.active&&await Po(n.scope,"typing.stopped")}function fr(){Ot&&(si(Ot),Ot=null)}function _d(n,e){const a=()=>{const o=n.style.height;n.style.height="auto";const c=`${n.scrollHeight}px`;o!==c?n.style.height=c:n.style.height=o},r=()=>a(),i=()=>a();return requestAnimationFrame(a),n.addEventListener("input",r),window.addEventListener("resize",i),{update(){requestAnimationFrame(a)},destroy(){n.removeEventListener("input",r),window.removeEventListener("resize",i)}}}function kr(n){return`/api/uploads/${encodeURIComponent(n.id)}`}function bd(n){return n.content_type.startsWith("image/")}function yd(n){return n<1024?`${n} B`:n<1024*1024?`${Math.round(n/1024)} KB`:`${(n/(1024*1024)).toFixed(1)} MB`}var wd=H('
');function kd(n,e){ht(e,!0);var a=wd(),r=_(a),i=y(r,2),o=y(i,2),c=_(o);c.textContent="<>",p(o);var d=y(o,2),u=_(d);u.textContent="{}",p(d);var m=y(d,2),f=y(m,2);let b;p(a),se(()=>b=Qe(f,1,"",null,b,{active:e.showGifPicker})),$("click",r,()=>e.onWrap("**")),$("click",i,()=>e.onWrap("_")),$("click",o,()=>e.onWrap("`")),$("click",d,()=>e.onWrap("```","\n```")),$("click",m,()=>e.onAppend("[label](https://)")),$("click",f,function(...w){e.onToggleGif?.apply(this,w)}),O(n,a),gt()}_t(["click"]);var Td=H(''),Sd=H('
GIFs
');function xd(n,e){ht(e,!0);var a=Sd(),r=_(a),i=y(_(r),2);cn(i),p(r);var o=y(r,2);Bt(o,21,()=>e.gifs,c=>c.url,(c,d)=>{var u=Td(),m=_(u),f=y(m,2),b=_(f,!0);p(f),p(u),se(()=>{ne(m,"src",t(d).url),ne(m,"alt",t(d).title),ee(b,t(d).title)}),$("click",u,()=>e.onPick(t(d).url,t(d).title)),O(c,u)}),p(o),p(a),se(()=>Ln(i,e.query)),$("input",i,c=>e.onQuery(c.currentTarget.value)),O(n,a),gt()}_t(["input","click"]);function oi(n,e=120){if(!n||e<=0)return"";const a=n.replace(/\s+/g," ").trim();return a.length<=e?a:e<=3?".".repeat(e):`${a.slice(0,e-3)}...`}function Us(n){return n.quoted_author?.display_name||"Unknown"}function jr(n,e){if(e===n.id)return"Open";const a=n.thread_state?.reply_count||0;return a===0?"No replies yet":`${a} ${a===1?"reply":"replies"}`}function Ad(n){const e=n.thread_state?.reply_count||0;return e===0?"Thread":`${e} ${e===1?"reply":"replies"}`}function Ed(n){const e=n.thread_state?.last_reply_at;return e?Cd(e):""}function Cd(n){const e=new Date(n).getTime();if(!Number.isFinite(e))return"";const a=Math.max(0,Date.now()-e),r=Math.floor(a/6e4);if(r<1)return"now";if(r<60)return`${r}m`;const i=Math.floor(r/60);return i<24?`${i}h`:`${Math.floor(i/24)}d`}function Id(n){const e=new Date(n),a=new Date,r=new Date;r.setDate(a.getDate()-1);const i=(o,c)=>o.getFullYear()===c.getFullYear()&&o.getMonth()===c.getMonth()&&o.getDate()===c.getDate();return i(e,a)?"Today":i(e,r)?"Yesterday":new Intl.DateTimeFormat(void 0,{weekday:"long",month:"long",day:"numeric"}).format(e)}function Rd(n){const e=[];let a="",r="",i=0;for(const o of n){const c=new Date(o.created_at),d=c.toDateString(),u=o.author?.id||o.author_id||"local",m=d!==a,f=u!==r,b=c.getTime()-i>300*1e3;m||f||b||e.length===0?e.push({key:o.id,dayLabel:m?Id(o.created_at):null,messages:[o],authorName:o.author?.display_name||"Local User",authorHandle:o.author?.handle||"",authorAvatarURL:o.author?.avatar_url||"",authorID:u,timestamp:o.created_at}):e[e.length-1].messages.push(o),a=d,r=u,i=c.getTime()}return e}var Dd=H('
Replying to
');function Md(n,e){ht(e,!0);var a=Dd(),r=y(_(a),2),i=_(r),o=y(_(i)),c=_(o,!0);p(o),p(i);var d=y(i,2),u=_(d,!0);p(d),p(r);var m=y(r,2);p(a),se(f=>{ee(c,e.target.author?.display_name||"Local User"),ee(u,f)},[()=>oi(e.target.body)]),$("click",m,function(...f){e.onClear?.apply(this,f)}),O(n,a),gt()}_t(["click"]);var Nd=H(''),Od=H('
'),Ld=H(''),Pd=H('
'),Ud=H(''),qd=H('
');function Uo(n,e){ht(e,!0);let a=Fe(e,"formClass",3,"composer"),r=Fe(e,"pendingUpload",3,null),i=Fe(e,"replyTarget",3,null),o=Fe(e,"showUpload",3,!1),c=Fe(e,"showToolbar",3,!1),d=Fe(e,"showGifPicker",3,!1),u=Fe(e,"gifQuery",3,""),m=Fe(e,"filteredGifs",19,()=>[]),f=Fe(e,"slashCommands",19,()=>[]),b=Fe(e,"mentionPeople",19,()=>[]),w=Fe(e,"onUploadFile",3,()=>{}),C=Fe(e,"onRemoveUpload",3,()=>{}),x=Fe(e,"onClearReply",3,()=>{}),E=Fe(e,"onApplyMarkdownWrap",3,()=>{}),T=Fe(e,"onAppendToComposer",3,()=>{}),R=Fe(e,"onToggleGif",3,()=>{}),P=Fe(e,"onGifQuery",3,()=>{}),D=Fe(e,"onPickGif",3,()=>{}),W=dt(null),Y=dt(0),U=dt(""),Z=dt(0);const K=oe(()=>ue(e.value,t(Y))),G=oe(()=>!t(K)||ce(t(K))===t(U)?[]:t(K).kind==="slash"?M(t(K)):B(t(K)));en(()=>(e.onInputRef(t(W)),()=>e.onInputRef(null))),en(()=>{if(t(G).length===0){h(Z,0);return}t(Z)>=t(G).length&&h(Z,0)});function ue(X,Te){const De=Math.max(0,Math.min(Te||X.length,X.length)),Re=X.slice(0,De),rt=/(^|\s)([/@][^\s]*)$/.exec(Re);if(!rt)return null;const Ye=rt[2],kt=Re.length-Ye.length;return Ye.startsWith("/")&&kt!==0?null:{kind:Ye.startsWith("/")?"slash":"mention",start:kt,end:De,query:Ye.slice(1).toLowerCase(),raw:Ye}}function ce(X){return`${X.kind}:${X.start}:${X.raw}`}function j(X=t(W)){h(Y,X?.selectionStart??e.value.length,!0)}function V(X){return X.startsWith("/")?X:`/${X}`}function M(X){const Te=X.query;return f().filter(De=>!De.revoked_at).map(De=>{const Re=V(De.command),rt=Re.slice(1).toLowerCase();return{id:De.id,kind:"slash",label:Re,detail:De.description||"Slash command",insertText:`${Re} `,sortText:rt}}).filter(De=>!Te||De.sortText.includes(Te)).sort((De,Re)=>+!De.sortText.startsWith(Te)-+!Re.sortText.startsWith(Te)||De.sortText.localeCompare(Re.sortText)).slice(0,6)}function z(X){return Un(X.handle||X.display_name.replace(/\s+/g,""))}function B(X){const Te=X.query,De=new Set;return b().filter(Re=>!Re.id||De.has(Re.id)?!1:(De.add(Re.id),!0)).map(Re=>{const rt=z(Re),Ye=`${Re.handle||""} ${Re.display_name}`.trim().toLowerCase();return{id:Re.id,kind:"mention",label:rt,detail:Re.kind==="bot"?`${Re.display_name} · bot`:Re.display_name,insertText:`${rt} `,sortText:Ye}}).filter(Re=>!Te||Re.sortText.includes(Te)).sort((Re,rt)=>+!Re.sortText.startsWith(Te)-+!rt.sortText.startsWith(Te)||Re.sortText.localeCompare(rt.sortText)).slice(0,6)}function J(X){if(!t(K))return;const Te=`${e.value.slice(0,t(K).start)}${X.insertText}${e.value.slice(t(K).end)}`,De=t(K).start+X.insertText.length;e.onValue(Te),Vn().then(()=>{t(W)?.focus(),t(W)?.setSelectionRange(De,De),h(Y,De)})}function S(X){const Te=X.currentTarget;e.onValue(Te.value),j(Te)}function I(){j(),e.onFocus()}function N(X){if(t(G).length>0){if(X.key==="ArrowDown"){X.preventDefault(),h(Z,(t(Z)+1)%t(G).length);return}if(X.key==="ArrowUp"){X.preventDefault(),h(Z,(t(Z)-1+t(G).length)%t(G).length);return}if(X.key==="Enter"||X.key==="Tab"){X.preventDefault(),J(t(G)[t(Z)]);return}if(X.key==="Escape"&&t(K)){X.preventDefault(),h(U,ce(t(K)),!0);return}}e.onKeydown(X)}var q=qd(),ye=_(q);{var de=X=>{xd(X,{get gifs(){return m()},get query(){return u()},get onQuery(){return P()},get onPick(){return D()}})};le(ye,X=>{d()&&X(de)})}var pe=y(ye,2);{var me=X=>{var Te=Od();Bt(Te,23,()=>t(G),De=>De.id,(De,Re,rt)=>{var Ye=Nd();let kt;var St=_(Ye),mt=_(St);{var bt=It=>{var Kt=Mn("/");O(It,Kt)},Ht=It=>{var Kt=Mn();se(Lt=>ee(Kt,Lt),[()=>No(t(Re).detail)]),O(It,Kt)};le(mt,It=>{t(Re).kind==="slash"?It(bt):It(Ht,-1)})}p(St);var Tt=y(St,2),vt=_(Tt),Ct=_(vt,!0);p(vt);var yt=y(vt,2),Ve=_(yt,!0);p(yt),p(Tt);var Oe=y(Tt,2),Gt=_(Oe,!0);p(Oe),p(Ye),se(()=>{ne(Ye,"aria-selected",t(rt)===t(Z)),kt=Qe(Ye,1,"",null,kt,{active:t(rt)===t(Z)}),ee(Ct,t(Re).label),ee(Ve,t(Re).detail),ee(Gt,t(Re).kind==="slash"?"command":"mention")}),$("mousedown",Ye,It=>It.preventDefault()),$("click",Ye,()=>J(t(Re))),O(De,Ye)}),p(Te),se(()=>ne(Te,"aria-label",t(K)?.kind==="slash"?"Slash command suggestions":"Mention suggestions")),O(X,Te)};le(pe,X=>{t(G).length>0&&X(me)})}var _e=y(pe,2),re=_(_e);{var ge=X=>{var Te=Pd(),De=y(_(Te),2);{var Re=mt=>{var bt=Ld();se(Ht=>{ne(bt,"src",Ht),ne(bt,"alt",r().filename)},[()=>kr(r())]),O(mt,bt)},rt=oe(()=>bd(r()));le(De,mt=>{t(rt)&&mt(Re)})}var Ye=y(De,2),kt=_(Ye);p(Ye);var St=y(Ye,2);p(Te),se(mt=>ee(kt,`${r().filename??""} · ${mt??""}`),[()=>yd(r().byte_size)]),$("click",St,function(...mt){C()?.apply(this,mt)}),O(X,Te)};le(re,X=>{r()&&X(ge)})}var ze=y(re,2);{var ve=X=>{Md(X,{get target(){return i()},get onClear(){return x()}})};le(ze,X=>{i()&&X(ve)})}var ke=y(ze,2),Ce=_(ke);{var Ke=X=>{var Te=Ud(),De=_(Te);_n(2),p(Te),$("change",De,function(...Re){w()?.apply(this,Re)}),O(X,Te)};le(Ce,X=>{o()&&X(Ke)})}var He=y(Ce,2);bu(He),$n(He,X=>h(W,X),()=>t(W)),Ka(He,(X,Te)=>_d?.(X),()=>e.value);var we=y(He,2);p(ke);var Pe=y(ke,2);{var ut=X=>{kd(X,{get showGifPicker(){return d()},get onWrap(){return E()},get onAppend(){return T()},get onToggleGif(){return R()}})};le(Pe,X=>{c()&&X(ut)})}p(_e),p(q),se(X=>{Qe(q,1,yr(a())),Ln(He,e.value),ne(He,"placeholder",e.placeholder),ne(He,"aria-label",e.ariaLabel),ne(we,"aria-label",e.submitLabel),we.disabled=X},[()=>!e.value.trim()]),un("submit",q,X=>{X.preventDefault(),e.onSubmit()}),$("input",He,S),un("focus",He,I),$("keydown",He,N),$("keyup",He,()=>j()),$("mouseup",He,()=>j()),un("select",He,()=>j()),O(n,q),gt()}_t(["mousedown","click","change","input","keydown","keyup","mouseup"]);var zd=H('');function Bd(n,e){var a=zd(),r=_(a),i=y(r,2),o=_(i),c=_(o),d=_(c,!0);p(c);var u=y(c,2),m=_(u),f=y(m,2);p(u),p(o);var b=y(o,2),w=_(b);p(b),p(i),p(a),se(()=>{ee(d,e.title),ne(m,"href",e.url),ne(w,"src",e.url),ne(w,"alt",e.title)}),$("click",r,function(...C){e.onClose?.apply(this,C)}),$("click",f,function(...C){e.onClose?.apply(this,C)}),O(n,a)}_t(["click"]);const qo=n=>Object.keys(n).reduce((e,a)=>{const r=n[a];return r==null?e:e+`${a}:${r};`},""),Fd=(n,e)=>"_"+e,ja=null,{min:ia,max:Sn,abs:qs,floor:Hd}=Math,zo=(n,e,a)=>ia(a,Sn(e,n)),Bo=n=>[...n].sort((e,a)=>e-a),Wd=typeof queueMicrotask=="function"?queueMicrotask:n=>{Promise.resolve().then(n)},li=()=>{let n;return[new Promise(e=>{n=e}),n]},Fo=n=>{let e;return()=>(n&&(e=n(),n=void 0),e)},Ha=(n,e,a)=>{const r=a?"unshift":"push";for(let i=0;i{const a=n.t[e];return a===-1?n.o:a},Gd=(n,e,a)=>{const r=n.t[e]===-1;return n.t[e]=a,n.i=ia(e,n.i),r},vr=(n,e)=>{if(!n.l)return 0;if(n.i>=e)return n.u[e];n.i<0&&(n.u[0]=0,n.i=0);let a=n.i,r=n.u[a];for(;a{let i=a;for(;a<=r;){const o=Hd((a+r)/2);vr(n,o)<=e?(i=o,a=o+1):r=o-1}return zo(i,0,n.l-1)},zs=(n,e,a)=>{const r=e-n.l;return n.i=a?-1:ia(e-1,n.i),n.l=e,r>0?(Ha(n.u,r),Ha(n.t,r,a),n.o*r):(n.u.splice(r),(a?n.t.splice(0,-r):n.t.splice(r)).reduce((i,o)=>i-(o===-1?n.o:o),0))},Kd=n=>n.documentElement,jd=n=>n.ownerDocument,Vd=n=>n.defaultView,Wo=Fo(()=>!!/iP(hone|od|ad)/.test(navigator.userAgent)||navigator.platform==="MacIntel"&&navigator.maxTouchPoints>0),Yd=Fo(()=>"scrollBehavior"in Kd(document).style),Zd=5,Xd=6,Jd=1,Qd=4,$d=8,ef=n=>Sn(n.$getTotalSize(),n.$getViewportSize()),tf=(n,e=40,a=0,r,i=!1)=>{let o=!!a,c=1,d=0,u=0,m=0,f=0,b=0,w=0,C=0,x=0,E=ja,T=[0,o?Sn(a-1,0):-1],R=0,P=!1;const D=((V,M,z)=>({o:M,t:z?Ha(z.slice(0,ia(V,z.length)),Sn(0,V-z.length)):Ha([],V),l:V,i:-1,u:Ha([],V+1)}))(n,r?r[1]:e,r&&r[0]),W=new Set,Y=()=>m-u,U=()=>Y()+b+f,Z=(V,M)=>((z,B,J,S)=>{if(S=ia(S,z.l-1),vr(z,S)<=B){const I=ga(z,J,S);return[ga(z,B,S,I),I]}{const I=ga(z,B,void 0,S);return[I,ga(z,J,I)]}})(D,V,M,T[0]),K=()=>vr(D,D.l),G=(V,M)=>{const z=vr(D,V)-b;return M?K()-z-ue(V):z},ue=V=>Ho(D,V),ce=(V,M=-1)=>D.t[V]===M,j=V=>{V&&(Wo()&&C!==0||E&&x===1?b+=V:f+=V)};return{$dispose:()=>{W.clear()},$getStateVersion:()=>c,$getCacheSnapshot:()=>(V=>[V.t.slice(),V.o])(D),$getRange:(V=200)=>{if(!P||o)return T;let M,z;if(w)[M,z]=T;else{let B=Sn(0,U()),J=B+d;i||(V=Sn(0,V),C!==1&&(B-=V),C!==2&&(J+=V)),[M,z]=T=Z(Sn(0,B),Sn(0,J)),E&&(M=ia(M,E[0]),z=Sn(z,E[1]))}return[Sn(M,0),ia(z,D.l-1)]},$findItemIndex:V=>ga(D,V-u),$isUnmeasuredItem:ce,$getItemOffset:G,$getItemSize:ue,$getItemsLength:()=>D.l,$getScrollOffset:()=>m,$isScrolling:()=>C!==0,$getViewportSize:()=>d,$getStartSpacerSize:()=>u,$getTotalSize:K,$:()=>(w=f,f=0,[w,x===2]),$subscribe:(V,M)=>{const z=[V,M];return W.add(z),()=>{W.delete(z)}},$update:(V,M)=>{let z,B,J=0;switch(V){case 1:{if(M===m&&x===0)break;const S=w;w=0;const I=M-m,N=qs(I);S&&N=-d&&q<=K()&&(J+=1,B=N>d);break}case 2:J=8,C!==0&&(z=!0,J+=1),C=0,x=0,E=ja;break;case 3:{const S=M.filter(([I,N])=>!ce(I,N));if(!S.length)break;j(S.reduce((I,[N,q])=>{let ye;if(x===2)ye=!0;else if(E&&x===1)ye=Nd&&(j(((I,N)=>{let q=0;const ye=[];I.t.forEach((ge,ze)=>{ge!==-1&&(ye.push(ge),ze{J&S&&I(B)}))}}},yi=setTimeout,Vr=(n,e)=>e?-n:n,nf=(n,e,a,r,i,o)=>{const c=Date.now;let d=0,u=!1,m=!1,f=!1,b=!1;const w=(()=>{let R;const P=()=>{R!=ja&&clearTimeout(R)},D=()=>{P(),R=yi(()=>{R=ja,(()=>{if(u||m)return u=!1,void w();f=!1,n.$update(2)})()},150)};return D.p=P,D})(),C=()=>{d=c(),f&&(b=!0),n.$update(1,r()),w()},x=R=>{if(u||!n.$isScrolling()||R.ctrlKey)return;const P=c()-d;150>P&&50{m=!0,f=b=!1},T=()=>{m=!1,Wo()&&(f=!0)};return e.addEventListener("scroll",C),e.addEventListener("wheel",x,{passive:!0}),e.addEventListener("touchstart",E,{passive:!0}),e.addEventListener("touchend",T,{passive:!0}),{h:()=>{e.removeEventListener("scroll",C),e.removeEventListener("wheel",x),e.removeEventListener("touchstart",E),e.removeEventListener("touchend",T),w.p()},m:()=>{const[R,P]=n.$();R&&(i(R,P,b),b=!1,P&&n.$getViewportSize()>n.$getTotalSize()&&n.$update(1,r()))}}},af=(n,e,a)=>{let r;return[async(i,o)=>{if(!await e())return;r&&r();const c=()=>{const[d,u]=li();return r=()=>{u(!1)},n.$getViewportSize()&&yi(r,150),[d,n.$subscribe(2,()=>{u(!0)})]};if(o&&Yd())n.$update(8,i()),Wd(async()=>{for(;;){let d=!0;for(let[f,b]=n.$getRange();f<=b;f++)if(n.$isUnmeasuredItem(f)){d=!1;break}if(d)break;const[u,m]=c();try{if(!await u)return}finally{m()}}n.$update(7),a(i(),o)});else for(;;){const[d,u]=c();try{if(n.$update(7),a(i()),!await d)return}finally{u()}}},()=>{r&&r()}]},rf=(n,e)=>{let a,r,i=li(),o=!1;const c=e?"scrollLeft":"scrollTop",d=e?"overflowX":"overflowY",[u,m]=af(n,()=>i[0],(f,b)=>{f=Vr(f,o),b?a.scrollTo({[e?"left":"top"]:f,behavior:"smooth"}):a[c]=f});return{$observe(f,b){a=b,e&&(o=getComputedStyle(b).direction==="rtl"),r=nf(n,b,e,()=>Vr(b[c],o),(w,C,x)=>{if(x){const E=b.style,T=E[d];E[d]="hidden",yi(()=>{E[d]=T})}b[c]=Vr(n.$getScrollOffset()+w,o),C&&m()}),i[1](!0)},$dispose(){r&&r.h(),i[1](!1),i=li()},$isNegative:()=>o,$scrollTo(f){u(()=>f)},$scrollBy(f){f+=n.$getScrollOffset(),u(()=>f)},$scrollToIndex(f,{align:b,smooth:w,offset:C=0}={}){if(f=zo(f,0,n.$getItemsLength()-1),b==="nearest"){const x=n.$getItemOffset(f),E=n.$getScrollOffset();if(xE+n.$getViewportSize()))return;b="end"}}u(()=>C+n.$getStartSpacerSize()+n.$getItemOffset(f)+(b==="end"?n.$getItemSize(f)-n.$getViewportSize():b==="center"?(n.$getItemSize(f)-n.$getViewportSize())/2:0),w)},$fixScrollJump:()=>{r&&r.m()}}},sf=n=>{let e;return{v(a){(e||(e=new(Vd(jd(a))).ResizeObserver(n))).observe(a)},S(a){e.unobserve(a)},h(){e&&e.disconnect()}}},of=(n,e)=>{let a;const r=e?"width":"height",i=new WeakMap,o=sf(c=>{const d=[];for(const{target:u,contentRect:m}of c)if(u.offsetParent)if(u===a)n.$update(4,m[r]);else{const f=i.get(u);f!=ja&&d.push([f,m[r]])}d.length&&n.$update(3,d)});return{$observeRoot(c){o.v(a=c)},$observeItem:(c,d)=>(i.set(c,d),o.v(c),()=>{i.delete(c),o.S(c)}),$dispose:o.h}};function lf(n,e){ht(e,!0);let a=Fe(e,"as",3,"div"),r,i,o;en(()=>{o!==e.index&&(i&&i(),i=e.resizer(r,o=e.index))}),Xa(()=>{i&&i()});let c=oe(()=>{const m={contain:"layout style",position:"absolute",[e.horizontal?"height":"width"]:"100%",[e.horizontal?"top":"left"]:"0px",[e.horizontal?"left":"top"]:e.offset+"px",visibility:e.hide?"hidden":void 0};return e.horizontal&&(m.display="inline-flex"),qo(m)});var d=bn(),u=Ft(d);xo(u,a,!1,(m,f)=>{$n(m,C=>r=C,()=>r),Ro(m,()=>({style:t(c)}));var b=bn(),w=Ft(b);vu(w,()=>e.children,()=>e.item,()=>e.index),O(f,b)}),O(n,d),gt()}function cf(n,e){ht(e,!0);let a=Fe(e,"getKey",3,Fd),r=Fe(e,"as",3,"div"),i=Fe(e,"shift",3,!1),o=Fe(e,"horizontal",3,!1),c=Fe(e,"startMargin",3,0);const d=tf(e.data.length,e.itemSize,e.ssrCount,e.cache,!e.itemSize),u=of(d,o()),m=rf(d,o());d.$subscribe(Jd,()=>{h(b,d.$getStateVersion(),!0)}),d.$subscribe(Qd,()=>{e.onscroll&&e.onscroll(d.$getScrollOffset())}),d.$subscribe($d,()=>{e.onscrollend&&e.onscrollend()});let f=dt(void 0),b=dt(To(d.$getStateVersion())),w=oe(()=>t(b)&&d.$getRange(e.bufferSize)),C=oe(()=>t(b)&&d.$isScrolling()),x=oe(()=>t(b)&&d.$getTotalSize()),E=oe(()=>t(b)&&m.$isNegative()),T=oe(()=>{const B=e.data.length,[J,S]=t(w),I=[];if(e.keepMounted){const N=new Set(e.keepMounted);for(let q=J;q<=S;q++)N.add(q);for(const q of Bo([...N]))q{const B=t(f),J=S=>{u.$observeRoot(S),m.$observe(B,S)};Vn().then(()=>{e.scrollRef?J(e.scrollRef):J(B.parentElement)})}),Xa(()=>{d.$dispose(),u.$dispose(),m.$dispose()}),$r(()=>{e.data.length!==d.$getItemsLength()&&d.$update(Zd,[e.data.length,i()])}),$r(()=>{c()!==d.$getStartSpacerSize()&&d.$update(Xd,c())});let R;en(()=>{R!==t(b)&&(R=t(b),m.$fixScrollJump())});const P=d.$getCacheSnapshot,D=d.$getScrollOffset,W=()=>ef(d),Y=d.$getViewportSize,U=d.$findItemIndex,Z=d.$getItemOffset,K=d.$getItemSize,G=m.$scrollToIndex,ue=m.$scrollTo,ce=m.$scrollBy;let j=oe(()=>qo({contain:"size style","overflow-anchor":"none",flex:"none",position:"relative",width:o()?t(x)+"px":"100%",height:o()?"100%":t(x)+"px","pointer-events":t(C)?"none":void 0}));var V={getCache:P,getScrollOffset:D,getScrollSize:W,getViewportSize:Y,findItemIndex:U,getItemOffset:Z,getItemSize:K,scrollToIndex:G,scrollTo:ue,scrollBy:ce},M=bn(),z=Ft(M);return xo(z,r,!1,(B,J)=>{$n(B,N=>h(f,N,!0),()=>t(f)),Ro(B,()=>({style:t(j)}));var S=bn(),I=Ft(S);Bt(I,17,()=>t(T),N=>a()(e.data[N],N),(N,q)=>{const ye=oe(()=>e.data[t(q)]);{let de=oe(()=>t(b)&&d.$getItemOffset(t(q),t(E))),pe=oe(()=>t(b)&&d.$isUnmeasuredItem(t(q)));lf(N,{get children(){return e.children},get item(){return t(ye)},get index(){return t(q)},get as(){return e.item},get offset(){return t(de)},get hide(){return t(pe)},get horizontal(){return o()},get resizer(){return u.$observeItem}})}}),O(J,S)}),O(n,M),gt(V)}var uf=H('
'),df=H('
');function Bs(n,e){let a=Fe(e,"rows",3,3);var r=df();Bt(r,21,()=>Array.from({length:a()}),wu,(i,o,c)=>{var d=uf();oa(d,`--history-row: ${c}`),O(i,d)}),p(r),se(()=>{Qe(r,1,`history-loader history-loader--${e.direction}`),ne(r,"aria-label",e.direction==="older"?"Loading older messages":"Loading newer messages")}),O(n,r)}const ff=512,Na=new Map;function hf(n){const e=n?.trim()||"";if(!e)return"";const a=Na.get(e);if(a)return a;if(Na.size>=ff){const r=Na.keys().next().value;r&&Na.delete(r)}return Na.set(e,e),e}var Fs=H(''),gf=H(''),pf=H("");function qn(n,e){ht(e,!0);let a=Fe(e,"class",3,"avatar"),r=Fe(e,"size",3,40),i=Fe(e,"loading",3,"lazy"),o=Fe(e,"fetchPriority",3,"low"),c=dt("");const d=oe(()=>hf(e.src)),u=oe(()=>t(d)!==""&&t(c)!==t(d)),m=oe(()=>Oo(e.id||e.name||t(d)||"avatar")),f=oe(()=>No(e.name));function b(){h(c,t(d),!0)}var w=bn(),C=Ft(w);{var x=T=>{var R=gf(),P=_(R);{var D=Y=>{var U=Fs();se(()=>{ne(U,"src",t(d)),ne(U,"width",r()),ne(U,"height",r()),ne(U,"loading",i()),ne(U,"fetchpriority",o())}),un("error",U,b),ks(U),O(Y,U)},W=Y=>{var U=Mn();se(()=>ee(U,t(f))),O(Y,U)};le(P,Y=>{t(u)?Y(D):Y(W,-1)})}p(R),se(()=>{Qe(R,1,yr(a())),oa(R,`--hue: ${t(m)??""}deg`),ne(R,"aria-label",e.buttonLabel)}),$("click",R,function(...Y){e.onclick?.apply(this,Y)}),O(T,R)},E=T=>{var R=pf(),P=_(R);{var D=Y=>{var U=Fs();se(()=>{ne(U,"src",t(d)),ne(U,"width",r()),ne(U,"height",r()),ne(U,"loading",i()),ne(U,"fetchpriority",o())}),un("error",U,b),ks(U),O(Y,U)},W=Y=>{var U=Mn();se(()=>ee(U,t(f))),O(Y,U)};le(P,Y=>{t(u)?Y(D):Y(W,-1)})}p(R),se(()=>{Qe(R,1,yr(a())),oa(R,`--hue: ${t(m)??""}deg`)}),O(T,R)};le(C,T=>{e.buttonLabel?T(x):T(E,-1)})}O(n,w),gt()}_t(["click"]);function Hs(n,e){(e==null||e>n.length)&&(e=n.length);for(var a=0,r=Array(e);a2?r-2:0),o=2;o1?a-1:0),i=1;i"u"?null:Mt(BigInt.prototype.toString),Ys=typeof Symbol>"u"?null:Mt(Symbol.prototype.toString),Et=Mt(Object.prototype.hasOwnProperty),Oa=Mt(Object.prototype.toString),Wt=Mt(RegExp.prototype.test),va=If(TypeError);function Mt(n){return function(e){e instanceof RegExp&&(e.lastIndex=0);for(var a=arguments.length,r=new Array(a>1?a-1:0),i=1;i2&&arguments[2]!==void 0?arguments[2]:qa;if(Ws&&Ws(n,null),!$t(e))return n;let r=e.length;for(;r--;){let i=e[r];if(typeof i=="string"){const o=a(i);o!==i&&(wf(e)||(e[r]=o),i=o)}n[i]=!0}return n}function Rf(n){for(let e=0;e/g),Uf=yn(/\${[\w\W]*/g),qf=yn(/^data-[\-\w.\u00B7-\uFFFF]+$/),zf=yn(/^aria-[\-\w]+$/),$s=yn(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp|matrix):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i),Bf=yn(/^(?:\w+script|data):/i),Ff=yn(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g),Hf=yn(/^html$/i),Wf=yn(/^[a-z][.\w]*(-[.\w]+)+$/i),In={element:1,attribute:2,text:3,cdataSection:4,entityReference:5,entityNode:6,progressingInstruction:7,comment:8,document:9,documentType:10,documentFragment:11,notation:12},Gf=function(){return typeof window>"u"?null:window},Kf=function(e,a){if(typeof e!="object"||typeof e.createPolicy!="function")return null;let r=null;const i="data-tt-policy-suffix";a&&a.hasAttribute(i)&&(r=a.getAttribute(i));const o="dompurify"+(r?"#"+r:"");try{return e.createPolicy(o,{createHTML(c){return c},createScriptURL(c){return c}})}catch{return console.warn("TrustedTypes policy "+o+" could not be created."),null}},eo=function(){return{afterSanitizeAttributes:[],afterSanitizeElements:[],afterSanitizeShadowDOM:[],beforeSanitizeAttributes:[],beforeSanitizeElements:[],beforeSanitizeShadowDOM:[],uponSanitizeAttribute:[],uponSanitizeElement:[],uponSanitizeShadowNode:[]}};function jo(){let n=arguments.length>0&&arguments[0]!==void 0?arguments[0]:Gf();const e=be=>jo(be);if(e.version="3.4.8",e.removed=[],!n||!n.document||n.document.nodeType!==In.document||!n.Element)return e.isSupported=!1,e;let a=n.document;const r=a,i=r.currentScript;n.DocumentFragment;const o=n.HTMLTemplateElement,c=n.Node,d=n.Element,u=n.NodeFilter,m=n.NamedNodeMap;m===void 0&&(n.NamedNodeMap||n.MozNamedAttrMap),n.HTMLFormElement;const f=n.DOMParser,b=n.trustedTypes,w=d.prototype,C=Rn(w,"cloneNode"),x=Rn(w,"remove"),E=Rn(w,"nextSibling"),T=Rn(w,"childNodes"),R=Rn(w,"parentNode"),P=Rn(w,"shadowRoot"),D=Rn(w,"attributes"),W=c&&c.prototype?Rn(c.prototype,"nodeType"):null,Y=c&&c.prototype?Rn(c.prototype,"nodeName"):null;if(typeof o=="function"){const be=a.createElement("template");be.content&&be.content.ownerDocument&&(a=be.content.ownerDocument)}let U,Z="",K=0;const G=function(v){if(K>0)throw va('The configured TRUSTED_TYPES_POLICY.createHTML must not call DOMPurify.sanitize, as that causes infinite recursion. Do not pass a policy whose createHTML wraps DOMPurify as TRUSTED_TYPES_POLICY; see the "DOMPurify and Trusted Types" section of the README.');K++;try{return U.createHTML(v)}finally{K--}},ue=a,ce=ue.implementation,j=ue.createNodeIterator,V=ue.createDocumentFragment,M=ue.getElementsByTagName,z=r.importNode;let B=eo();e.isSupported=typeof Go=="function"&&typeof R=="function"&&ce&&ce.createHTMLDocument!==void 0;const J=Lf,S=Pf,I=Uf,N=qf,q=zf,ye=Bf,de=Ff,pe=Wf;let me=$s,_e=null;const re=Ge({},[...Zs,...Zr,...Xr,...Jr,...Xs]);let ge=null;const ze=Ge({},[...Js,...Qr,...Qs,...hr]);let ve=Object.seal(_a(null,{tagNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},allowCustomizedBuiltInElements:{writable:!0,configurable:!1,enumerable:!0,value:!1}})),ke=null,Ce=null;const Ke=Object.seal(_a(null,{tagCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeCheck:{writable:!0,configurable:!1,enumerable:!0,value:null}}));let He=!0,we=!0,Pe=!1,ut=!0,X=!1,Te=!0,De=!1,Re=!1,rt=!1,Ye=!1,kt=!1,St=!1,mt=!0,bt=!1;const Ht="user-content-";let Tt=!0,vt=!1,Ct={},yt=null;const Ve=Ge({},["annotation-xml","audio","colgroup","desc","foreignobject","head","iframe","math","mi","mn","mo","ms","mtext","noembed","noframes","noscript","plaintext","script","style","svg","template","thead","title","video","xmp"]);let Oe=null;const Gt=Ge({},["audio","video","img","source","image","track"]);let It=null;const Kt=Ge({},["alt","class","for","id","label","name","pattern","placeholder","role","summary","title","value","style","xmlns"]),Lt="http://www.w3.org/1998/Math/MathML",Nt="http://www.w3.org/2000/svg",je="http://www.w3.org/1999/xhtml";let Pt=je,dn=!1,fn=null;const Jt=Ge({},[Lt,Nt,je],Yr);let hn=Ge({},["mi","mo","mn","ms","mtext"]),En=Ge({},["annotation-xml"]);const zn=Ge({},["title","style","font","a","script"]);let wn=null;const ea=["application/xhtml+xml","text/html"],Ut="text/html";let L=null,Q=null;const he=a.createElement("form"),te=function(v){return v instanceof RegExp||v instanceof Function},Ae=function(){let v=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};if(Q&&Q===v)return;(!v||typeof v!="object")&&(v={}),v=Xt(v),wn=ea.indexOf(v.PARSER_MEDIA_TYPE)===-1?Ut:v.PARSER_MEDIA_TYPE,L=wn==="application/xhtml+xml"?Yr:qa,_e=Et(v,"ALLOWED_TAGS")&&$t(v.ALLOWED_TAGS)?Ge({},v.ALLOWED_TAGS,L):re,ge=Et(v,"ALLOWED_ATTR")&&$t(v.ALLOWED_ATTR)?Ge({},v.ALLOWED_ATTR,L):ze,fn=Et(v,"ALLOWED_NAMESPACES")&&$t(v.ALLOWED_NAMESPACES)?Ge({},v.ALLOWED_NAMESPACES,Yr):Jt,It=Et(v,"ADD_URI_SAFE_ATTR")&&$t(v.ADD_URI_SAFE_ATTR)?Ge(Xt(Kt),v.ADD_URI_SAFE_ATTR,L):Kt,Oe=Et(v,"ADD_DATA_URI_TAGS")&&$t(v.ADD_DATA_URI_TAGS)?Ge(Xt(Gt),v.ADD_DATA_URI_TAGS,L):Gt,yt=Et(v,"FORBID_CONTENTS")&&$t(v.FORBID_CONTENTS)?Ge({},v.FORBID_CONTENTS,L):Ve,ke=Et(v,"FORBID_TAGS")&&$t(v.FORBID_TAGS)?Ge({},v.FORBID_TAGS,L):Xt({}),Ce=Et(v,"FORBID_ATTR")&&$t(v.FORBID_ATTR)?Ge({},v.FORBID_ATTR,L):Xt({}),Ct=Et(v,"USE_PROFILES")?v.USE_PROFILES&&typeof v.USE_PROFILES=="object"?Xt(v.USE_PROFILES):v.USE_PROFILES:!1,He=v.ALLOW_ARIA_ATTR!==!1,we=v.ALLOW_DATA_ATTR!==!1,Pe=v.ALLOW_UNKNOWN_PROTOCOLS||!1,ut=v.ALLOW_SELF_CLOSE_IN_ATTR!==!1,X=v.SAFE_FOR_TEMPLATES||!1,Te=v.SAFE_FOR_XML!==!1,De=v.WHOLE_DOCUMENT||!1,Ye=v.RETURN_DOM||!1,kt=v.RETURN_DOM_FRAGMENT||!1,St=v.RETURN_TRUSTED_TYPE||!1,rt=v.FORCE_BODY||!1,mt=v.SANITIZE_DOM!==!1,bt=v.SANITIZE_NAMED_PROPS||!1,Tt=v.KEEP_CONTENT!==!1,vt=v.IN_PLACE||!1,me=Mf(v.ALLOWED_URI_REGEXP)?v.ALLOWED_URI_REGEXP:$s,Pt=typeof v.NAMESPACE=="string"?v.NAMESPACE:je,hn=Et(v,"MATHML_TEXT_INTEGRATION_POINTS")&&v.MATHML_TEXT_INTEGRATION_POINTS&&typeof v.MATHML_TEXT_INTEGRATION_POINTS=="object"?Xt(v.MATHML_TEXT_INTEGRATION_POINTS):Ge({},["mi","mo","mn","ms","mtext"]),En=Et(v,"HTML_INTEGRATION_POINTS")&&v.HTML_INTEGRATION_POINTS&&typeof v.HTML_INTEGRATION_POINTS=="object"?Xt(v.HTML_INTEGRATION_POINTS):Ge({},["annotation-xml"]);const F=Et(v,"CUSTOM_ELEMENT_HANDLING")&&v.CUSTOM_ELEMENT_HANDLING&&typeof v.CUSTOM_ELEMENT_HANDLING=="object"?Xt(v.CUSTOM_ELEMENT_HANDLING):_a(null);if(ve=_a(null),Et(F,"tagNameCheck")&&te(F.tagNameCheck)&&(ve.tagNameCheck=F.tagNameCheck),Et(F,"attributeNameCheck")&&te(F.attributeNameCheck)&&(ve.attributeNameCheck=F.attributeNameCheck),Et(F,"allowCustomizedBuiltInElements")&&typeof F.allowCustomizedBuiltInElements=="boolean"&&(ve.allowCustomizedBuiltInElements=F.allowCustomizedBuiltInElements),X&&(we=!1),kt&&(Ye=!0),Ct&&(_e=Ge({},Xs),ge=_a(null),Ct.html===!0&&(Ge(_e,Zs),Ge(ge,Js)),Ct.svg===!0&&(Ge(_e,Zr),Ge(ge,Qr),Ge(ge,hr)),Ct.svgFilters===!0&&(Ge(_e,Xr),Ge(ge,Qr),Ge(ge,hr)),Ct.mathMl===!0&&(Ge(_e,Jr),Ge(ge,Qs),Ge(ge,hr))),Ke.tagCheck=null,Ke.attributeCheck=null,Et(v,"ADD_TAGS")&&(typeof v.ADD_TAGS=="function"?Ke.tagCheck=v.ADD_TAGS:$t(v.ADD_TAGS)&&(_e===re&&(_e=Xt(_e)),Ge(_e,v.ADD_TAGS,L))),Et(v,"ADD_ATTR")&&(typeof v.ADD_ATTR=="function"?Ke.attributeCheck=v.ADD_ATTR:$t(v.ADD_ATTR)&&(ge===ze&&(ge=Xt(ge)),Ge(ge,v.ADD_ATTR,L))),Et(v,"ADD_URI_SAFE_ATTR")&&$t(v.ADD_URI_SAFE_ATTR)&&Ge(It,v.ADD_URI_SAFE_ATTR,L),Et(v,"FORBID_CONTENTS")&&$t(v.FORBID_CONTENTS)&&(yt===Ve&&(yt=Xt(yt)),Ge(yt,v.FORBID_CONTENTS,L)),Et(v,"ADD_FORBID_CONTENTS")&&$t(v.ADD_FORBID_CONTENTS)&&(yt===Ve&&(yt=Xt(yt)),Ge(yt,v.ADD_FORBID_CONTENTS,L)),Tt&&(_e["#text"]=!0),De&&Ge(_e,["html","head","body"]),_e.table&&(Ge(_e,["tbody"]),delete ke.tbody),v.TRUSTED_TYPES_POLICY){if(typeof v.TRUSTED_TYPES_POLICY.createHTML!="function")throw va('TRUSTED_TYPES_POLICY configuration option must provide a "createHTML" hook.');if(typeof v.TRUSTED_TYPES_POLICY.createScriptURL!="function")throw va('TRUSTED_TYPES_POLICY configuration option must provide a "createScriptURL" hook.');const fe=U;U=v.TRUSTED_TYPES_POLICY;try{Z=G("")}catch(et){throw U=fe,et}}else U===void 0&&v.TRUSTED_TYPES_POLICY!==null&&(U=Kf(b,i)),U&&typeof Z=="string"&&(Z=G(""));(B.uponSanitizeElement.length>0||B.uponSanitizeAttribute.length>0)&&_e===re&&(_e=Xt(_e)),B.uponSanitizeAttribute.length>0&&ge===ze&&(ge=Xt(ge)),nn&&nn(v),Q=v},Ne=Ge({},[...Zr,...Xr,...Nf]),Be=Ge({},[...Jr,...Of]),Ue=function(v){let F=R(v);(!F||!F.tagName)&&(F={namespaceURI:Pt,tagName:"template"});const fe=qa(v.tagName),et=qa(F.tagName);return fn[v.namespaceURI]?v.namespaceURI===Nt?F.namespaceURI===je?fe==="svg":F.namespaceURI===Lt?fe==="svg"&&(et==="annotation-xml"||hn[et]):!!Ne[fe]:v.namespaceURI===Lt?F.namespaceURI===je?fe==="math":F.namespaceURI===Nt?fe==="math"&&En[et]:!!Be[fe]:v.namespaceURI===je?F.namespaceURI===Nt&&!En[et]||F.namespaceURI===Lt&&!hn[et]?!1:!Be[fe]&&(zn[fe]||!Ne[fe]):!!(wn==="application/xhtml+xml"&&fn[v.namespaceURI]):!1},Le=function(v){pa(e.removed,{element:v});try{R(v).removeChild(v)}catch{x(v)}},lt=function(v,F){try{pa(e.removed,{attribute:F.getAttributeNode(v),from:F})}catch{pa(e.removed,{attribute:null,from:F})}if(F.removeAttribute(v),v==="is")if(Ye||kt)try{Le(F)}catch{}else try{F.setAttribute(v,"")}catch{}},Cn=function(v){let F=null,fe=null;if(rt)v=""+v;else{const it=Ks(v,/^[\r\n\t ]+/);fe=it&&it[0]}wn==="application/xhtml+xml"&&Pt===je&&(v=''+v+"");const et=U?G(v):v;if(Pt===je)try{F=new f().parseFromString(et,wn)}catch{}if(!F||!F.documentElement){F=ce.createDocument(Pt,"template",null);try{F.documentElement.innerHTML=dn?Z:et}catch{}}const We=F.body||F.documentElement;return v&&fe&&We.insertBefore(a.createTextNode(fe),We.childNodes[0]||null),Pt===je?M.call(F,De?"html":"body")[0]:De?F.documentElement:We},pt=function(v){return j.call(v.ownerDocument||v,v,u.SHOW_ELEMENT|u.SHOW_COMMENT|u.SHOW_TEXT|u.SHOW_PROCESSING_INSTRUCTION|u.SHOW_CDATA_SECTION,null)},ct=function(v){var F,fe;v.normalize();const et=j.call(v.ownerDocument||v,v,u.SHOW_TEXT|u.SHOW_COMMENT|u.SHOW_CDATA_SECTION|u.SHOW_PROCESSING_INSTRUCTION,null);let We=et.nextNode();for(;We;){let xt=We.data;aa([J,S,I],an=>{xt=ma(xt,an," ")}),We.data=xt,We=et.nextNode()}const it=(F=(fe=v.querySelectorAll)===null||fe===void 0?void 0:fe.call(v,"template"))!==null&&F!==void 0?F:[];aa(Array.from(it),xt=>{jt(xt.content)&&ct(xt.content)})},qt=function(v){const F=Y?Y(v):null;return typeof F!="string"||L(F)!=="form"?!1:typeof v.nodeName!="string"||typeof v.textContent!="string"||typeof v.removeChild!="function"||v.attributes!==D(v)||typeof v.removeAttribute!="function"||typeof v.setAttribute!="function"||typeof v.namespaceURI!="string"||typeof v.insertBefore!="function"||typeof v.hasChildNodes!="function"||v.nodeType!==W(v)||v.childNodes!==T(v)},jt=function(v){if(!W||typeof v!="object"||v===null)return!1;try{return W(v)===In.documentFragment}catch{return!1}},tt=function(v){if(!W||typeof v!="object"||v===null)return!1;try{return typeof W(v)=="number"}catch{return!1}};function wt(be,v,F){aa(be,fe=>{fe.call(e,v,F,Q)})}const gn=function(v){let F=null;if(wt(B.beforeSanitizeElements,v,null),qt(v))return Le(v),!0;const fe=L(Y?Y(v):v.nodeName);if(wt(B.uponSanitizeElement,v,{tagName:fe,allowedTags:_e}),Te&&v.hasChildNodes()&&!tt(v.firstElementChild)&&Wt(/<[/\w!]/g,v.innerHTML)&&Wt(/<[/\w!]/g,v.textContent)||Te&&v.namespaceURI===je&&fe==="style"&&tt(v.firstElementChild)||v.nodeType===In.progressingInstruction||Te&&v.nodeType===In.comment&&Wt(/<[/\w]/g,v.data))return Le(v),!0;if(ke[fe]||!(Ke.tagCheck instanceof Function&&Ke.tagCheck(fe))&&!_e[fe]){if(!ke[fe]&&Vt(fe)&&(ve.tagNameCheck instanceof RegExp&&Wt(ve.tagNameCheck,fe)||ve.tagNameCheck instanceof Function&&ve.tagNameCheck(fe)))return!1;if(Tt&&!yt[fe]){const We=R(v),it=T(v);if(it&&We){const xt=it.length;for(let an=xt-1;an>=0;--an){const Yt=C(it[an],!0);We.insertBefore(Yt,E(v))}}}return Le(v),!0}return(W?W(v):v.nodeType)===In.element&&!Ue(v)||(fe==="noscript"||fe==="noembed"||fe==="noframes")&&Wt(/<\/no(script|embed|frames)/i,v.innerHTML)?(Le(v),!0):(X&&v.nodeType===In.text&&(F=v.textContent,aa([J,S,I],We=>{F=ma(F,We," ")}),v.textContent!==F&&(pa(e.removed,{element:v.cloneNode()}),v.textContent=F)),wt(B.afterSanitizeElements,v,null),!1)},Zn=function(v,F,fe){if(Ce[F]||mt&&(F==="id"||F==="name")&&(fe in a||fe in he))return!1;const et=ge[F]||Ke.attributeCheck instanceof Function&&Ke.attributeCheck(F,v);if(!(we&&!Ce[F]&&Wt(N,F))){if(!(He&&Wt(q,F))){if(!et||Ce[F]){if(!(Vt(v)&&(ve.tagNameCheck instanceof RegExp&&Wt(ve.tagNameCheck,v)||ve.tagNameCheck instanceof Function&&ve.tagNameCheck(v))&&(ve.attributeNameCheck instanceof RegExp&&Wt(ve.attributeNameCheck,F)||ve.attributeNameCheck instanceof Function&&ve.attributeNameCheck(F,v))||F==="is"&&ve.allowCustomizedBuiltInElements&&(ve.tagNameCheck instanceof RegExp&&Wt(ve.tagNameCheck,fe)||ve.tagNameCheck instanceof Function&&ve.tagNameCheck(fe))))return!1}else if(!It[F]){if(!Wt(me,ma(fe,de,""))){if(!((F==="src"||F==="xlink:href"||F==="href")&&v!=="script"&&js(fe,"data:")===0&&Oe[v])){if(!(Pe&&!Wt(ye,ma(fe,de,"")))){if(fe)return!1}}}}}}return!0},pn=Ge({},["annotation-xml","color-profile","font-face","font-face-format","font-face-name","font-face-src","font-face-uri","missing-glyph"]),Vt=function(v){return!pn[qa(v)]&&Wt(pe,v)},Bn=function(v){wt(B.beforeSanitizeAttributes,v,null);const F=v.attributes;if(!F||qt(v))return;const fe={attrName:"",attrValue:"",keepAttr:!0,allowedAttributes:ge,forceKeepAttr:void 0};let et=F.length;for(;et--;){const We=F[et],it=We.name,xt=We.namespaceURI,an=We.value,Yt=L(it),wa=an;let Dt=it==="value"?wa:Af(wa);if(fe.attrName=Yt,fe.attrValue=Dt,fe.keepAttr=!0,fe.forceKeepAttr=void 0,wt(B.uponSanitizeAttribute,v,fe),Dt=fe.attrValue,bt&&(Yt==="id"||Yt==="name")&&js(Dt,Ht)!==0&&(lt(it,v),Dt=Ht+Dt),Te&&Wt(/((--!?|])>)|<\/(style|script|title|xmp|textarea|noscript|iframe|noembed|noframes)/i,Dt)){lt(it,v);continue}if(Yt==="attributename"&&Ks(Dt,"href")){lt(it,v);continue}if(fe.forceKeepAttr)continue;if(!fe.keepAttr){lt(it,v);continue}if(!ut&&Wt(/\/>/i,Dt)){lt(it,v);continue}X&&aa([J,S,I],ta=>{Dt=ma(Dt,ta," ")});const ka=L(v.nodeName);if(!Zn(ka,Yt,Dt)){lt(it,v);continue}if(U&&typeof b=="object"&&typeof b.getAttributeType=="function"&&!xt)switch(b.getAttributeType(ka,Yt)){case"TrustedHTML":{Dt=G(Dt);break}case"TrustedScriptURL":{Dt=U.createScriptURL(Dt);break}}if(Dt!==wa)try{xt?v.setAttributeNS(xt,it,Dt):v.setAttribute(it,Dt),qt(v)?Le(v):Gs(e.removed)}catch{lt(it,v)}}wt(B.afterSanitizeAttributes,v,null)},mn=function(v){let F=null;const fe=pt(v);for(wt(B.beforeSanitizeShadowDOM,v,null);F=fe.nextNode();)if(wt(B.uponSanitizeShadowNode,F,null),gn(F),Bn(F),jt(F.content)&&mn(F.content),(W?W(F):F.nodeType)===In.element){const We=P?P(F):F.shadowRoot;jt(We)&&(Xn(We),mn(We))}wt(B.afterSanitizeShadowDOM,v,null)},Xn=function(v){const F=W?W(v):v.nodeType;if(F===In.element){const We=P?P(v):v.shadowRoot;jt(We)&&(Xn(We),mn(We))}const fe=T?T(v):v.childNodes;if(!fe)return;const et=[];aa(fe,We=>{pa(et,We)});for(const We of et)Xn(We);if(F===In.element){const We=Y?Y(v):null;if(typeof We=="string"&&L(We)==="template"){const it=v.content;jt(it)&&Xn(it)}}};return e.sanitize=function(be){let v=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},F=null,fe=null,et=null,We=null;if(dn=!be,dn&&(be=""),typeof be!="string"&&!tt(be)&&(be=Df(be),typeof be!="string"))throw va("dirty is not a string, aborting");if(!e.isSupported)return be;if(Re||Ae(v),e.removed=[],typeof be=="string"&&(vt=!1),vt){const an=Y?Y(be):be.nodeName;if(typeof an=="string"){const Yt=L(an);if(!_e[Yt]||ke[Yt])throw va("root node is forbidden and cannot be sanitized in-place")}if(qt(be))throw va("root node is clobbered and cannot be sanitized in-place");Xn(be)}else if(tt(be))F=Cn(""),fe=F.ownerDocument.importNode(be,!0),fe.nodeType===In.element&&fe.nodeName==="BODY"||fe.nodeName==="HTML"?F=fe:F.appendChild(fe),Xn(fe);else{if(!Ye&&!X&&!De&&be.indexOf("<")===-1)return U&&St?G(be):be;if(F=Cn(be),!F)return Ye?null:St?Z:""}F&&rt&&Le(F.firstChild);const it=pt(vt?be:F);for(;et=it.nextNode();)gn(et),Bn(et),jt(et.content)&&mn(et.content);if(vt)return X&&ct(be),be;if(Ye){if(X&&ct(F),kt)for(We=V.call(F.ownerDocument);F.firstChild;)We.appendChild(F.firstChild);else We=F;return(ge.shadowroot||ge.shadowrootmode)&&(We=z.call(r,We,!0)),We}let xt=De?F.outerHTML:F.innerHTML;return De&&_e["!doctype"]&&F.ownerDocument&&F.ownerDocument.doctype&&F.ownerDocument.doctype.name&&Wt(Hf,F.ownerDocument.doctype.name)&&(xt=" +`+xt),X&&aa([J,S,I],an=>{xt=ma(xt,an," ")}),U&&St?G(xt):xt},e.setConfig=function(){let be=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};Ae(be),Re=!0},e.clearConfig=function(){Q=null,Re=!1},e.isValidAttribute=function(be,v,F){Q||Ae({});const fe=L(be),et=L(v);return Zn(fe,et,F)},e.addHook=function(be,v){typeof v=="function"&&pa(B[be],v)},e.removeHook=function(be,v){if(v!==void 0){const F=Sf(B[be],v);return F===-1?void 0:xf(B[be],F,1)[0]}return Gs(B[be])},e.removeHooks=function(be){B[be]=[]},e.removeAllHooks=function(){B=eo()},e}var jf=jo();function wi(){return{async:!1,breaks:!1,extensions:null,gfm:!0,hooks:null,pedantic:!1,renderer:null,silent:!1,tokenizer:null,walkTokens:null}}var ca=wi();function Vo(n){ca=n}var ra={exec:()=>null};function $e(n,e=""){let a=typeof n=="string"?n:n.source,r={replace:(i,o)=>{let c=typeof o=="string"?o:o.source;return c=c.replace(tn.caret,"$1"),a=a.replace(i,c),r},getRegex:()=>new RegExp(a,e)};return r}var Vf=(()=>{try{return!!new RegExp("(?<=1)(?/,blockquoteSetextReplace:/\n {0,3}((?:=+|-+) *)(?=\n|$)/g,blockquoteSetextReplace2:/^ {0,3}>[ \t]?/gm,listReplaceNesting:/^ {1,4}(?=( {4})*[^ ])/g,listIsTask:/^\[[ xX]\] +\S/,listReplaceTask:/^\[[ xX]\] +/,listTaskCheckbox:/\[[ xX]\]/,anyLine:/\n.*\n/,hrefBrackets:/^<(.*)>$/,tableDelimiter:/[:|]/,tableAlignChars:/^\||\| *$/g,tableRowBlankLine:/\n[ \t]*$/,tableAlignRight:/^ *-+: *$/,tableAlignCenter:/^ *:-+: *$/,tableAlignLeft:/^ *:-+ *$/,startATag:/^/i,startPreScriptTag:/^<(pre|code|kbd|script)(\s|>)/i,endPreScriptTag:/^<\/(pre|code|kbd|script)(\s|>)/i,startAngleBracket:/^$/,pedanticHrefTitle:/^([^'"]*[^\s])\s+(['"])(.*)\2/,unicodeAlphaNumeric:/[\p{L}\p{N}]/u,escapeTest:/[&<>"']/,escapeReplace:/[&<>"']/g,escapeTestNoEncode:/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/,escapeReplaceNoEncode:/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/g,caret:/(^|[^\[])\^/g,percentDecode:/%25/g,findPipe:/\|/g,splitPipe:/ \|/,slashPipe:/\\\|/g,carriageReturn:/\r\n|\r/g,spaceLine:/^ +$/gm,notSpaceStart:/^\S*/,endingNewline:/\n$/,listItemRegex:n=>new RegExp(`^( {0,3}${n})((?:[ ][^\\n]*)?(?:\\n|$))`),nextBulletRegex:n=>new RegExp(`^ {0,${Math.min(3,n-1)}}(?:[*+-]|\\d{1,9}[.)])((?:[ ][^\\n]*)?(?:\\n|$))`),hrRegex:n=>new RegExp(`^ {0,${Math.min(3,n-1)}}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)`),fencesBeginRegex:n=>new RegExp(`^ {0,${Math.min(3,n-1)}}(?:\`\`\`|~~~)`),headingBeginRegex:n=>new RegExp(`^ {0,${Math.min(3,n-1)}}#`),htmlBeginRegex:n=>new RegExp(`^ {0,${Math.min(3,n-1)}}<(?:[a-z].*>|!--)`,"i"),blockquoteBeginRegex:n=>new RegExp(`^ {0,${Math.min(3,n-1)}}>`)},Yf=/^(?:[ \t]*(?:\n|$))+/,Zf=/^((?: {4}| {0,3}\t)[^\n]+(?:\n(?:[ \t]*(?:\n|$))*)?)+/,Xf=/^ {0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?: {0,3}\1[~`]* *(?=\n|$)|$)/,Ja=/^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/,Jf=/^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/,ki=/ {0,3}(?:[*+-]|\d{1,9}[.)])/,Yo=/^(?!bull |blockCode|fences|blockquote|heading|html|table)((?:.|\n(?!\s*?\n|bull |blockCode|fences|blockquote|heading|html|table))+?)\n {0,3}(=+|-+) *(?:\n+|$)/,Zo=$e(Yo).replace(/bull/g,ki).replace(/blockCode/g,/(?: {4}| {0,3}\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).replace(/\|table/g,"").getRegex(),Qf=$e(Yo).replace(/bull/g,ki).replace(/blockCode/g,/(?: {4}| {0,3}\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).replace(/table/g,/ {0,3}\|?(?:[:\- ]*\|)+[\:\- ]*\n/).getRegex(),Ti=/^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\n)[^\n]+)*)/,$f=/^[^\n]+/,Si=/(?!\s*\])(?:\\[\s\S]|[^\[\]\\])+/,eh=$e(/^ {0,3}\[(label)\]: *(?:\n[ \t]*)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n[ \t]*)?| *\n[ \t]*)(title))? *(?:\n+|$)/).replace("label",Si).replace("title",/(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/).getRegex(),th=$e(/^(bull)([ \t][^\n]+?)?(?:\n|$)/).replace(/bull/g,ki).getRegex(),Er="address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul",xi=/|$))/,nh=$e("^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|\\n*|$)|\\n*|$)|)[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$))","i").replace("comment",xi).replace("tag",Er).replace("attribute",/ +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(),Xo=$e(Ti).replace("hr",Ja).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("|lheading","").replace("|table","").replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)])[ \\t]").replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",Er).getRegex(),ah=$e(/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/).replace("paragraph",Xo).getRegex(),Ai={blockquote:ah,code:Zf,def:eh,fences:Xf,heading:Jf,hr:Ja,html:nh,lheading:Zo,list:th,newline:Yf,paragraph:Xo,table:ra,text:$f},to=$e("^ *([^\\n ].*)\\n {0,3}((?:\\| *)?:?-+:? *(?:\\| *:?-+:? *)*(?:\\| *)?)(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)").replace("hr",Ja).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("blockquote"," {0,3}>").replace("code","(?: {4}| {0,3} )[^\\n]").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)])[ \\t]").replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",Er).getRegex(),rh={...Ai,lheading:Qf,table:to,paragraph:$e(Ti).replace("hr",Ja).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("|lheading","").replace("table",to).replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)])[ \\t]").replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",Er).getRegex()},ih={...Ai,html:$e(`^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+? *(?:\\n{2,}|\\s*$)|\\s]*)*?/?> *(?:\\n{2,}|\\s*$))`).replace("comment",xi).replace(/tag/g,"(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(),def:/^ *\[([^\]]+)\]: *]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,heading:/^(#{1,6})(.*)(?:\n+|$)/,fences:ra,lheading:/^(.+?)\n {0,3}(=+|-+) *(?:\n+|$)/,paragraph:$e(Ti).replace("hr",Ja).replace("heading",` *#{1,6} *[^ +]`).replace("lheading",Zo).replace("|table","").replace("blockquote"," {0,3}>").replace("|fences","").replace("|list","").replace("|html","").replace("|tag","").getRegex()},sh=/^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,oh=/^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,Jo=/^( {2,}|\\)\n(?!\s*$)/,lh=/^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\`+)[^`]+\k(?!`))*?\]\((?:\\[\s\S]|[^\\\(\)]|\((?:\\[\s\S]|[^\\\(\)])*\))*\)/).replace("precode-",Vf?"(?`+)[^`]+\k(?!`)/).replace("html",/<(?! )[^<>]*?>/).getRegex(),$o=/^(?:\*+(?:((?!\*)punct)|([^\s*]))?)|^_+(?:((?!_)punct)|([^\s_]))?/,hh=$e($o,"u").replace(/punct/g,ya).getRegex(),gh=$e($o,"u").replace(/punct/g,Qo).getRegex(),el="^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\*)punct(\\*+)(?=[\\s]|$)|notPunctSpace(\\*+)(?!\\*)(?=punctSpace|$)|(?!\\*)punctSpace(\\*+)(?=notPunctSpace)|[\\s](\\*+)(?!\\*)(?=punct)|(?!\\*)punct(\\*+)(?!\\*)(?=punct)|notPunctSpace(\\*+)(?=notPunctSpace)",ph=$e(el,"gu").replace(/notPunctSpace/g,Ei).replace(/punctSpace/g,Cr).replace(/punct/g,ya).getRegex(),mh=$e(el,"gu").replace(/notPunctSpace/g,dh).replace(/punctSpace/g,uh).replace(/punct/g,Qo).getRegex(),vh=$e("^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)punctSpace(_+)(?=notPunctSpace)|[\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)","gu").replace(/notPunctSpace/g,Ei).replace(/punctSpace/g,Cr).replace(/punct/g,ya).getRegex(),_h=$e(/^~~?(?:((?!~)punct)|[^\s~])/,"u").replace(/punct/g,ya).getRegex(),bh="^[^~]+(?=[^~])|(?!~)punct(~~?)(?=[\\s]|$)|notPunctSpace(~~?)(?!~)(?=punctSpace|$)|(?!~)punctSpace(~~?)(?=notPunctSpace)|[\\s](~~?)(?!~)(?=punct)|(?!~)punct(~~?)(?!~)(?=punct)|notPunctSpace(~~?)(?=notPunctSpace)",yh=$e(bh,"gu").replace(/notPunctSpace/g,Ei).replace(/punctSpace/g,Cr).replace(/punct/g,ya).getRegex(),wh=$e(/\\(punct)/,"gu").replace(/punct/g,ya).getRegex(),kh=$e(/^<(scheme:[^\s\x00-\x1f<>]*|email)>/).replace("scheme",/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/).replace("email",/[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/).getRegex(),Th=$e(xi).replace("(?:-->|$)","-->").getRegex(),Sh=$e("^comment|^|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^|^").replace("comment",Th).replace("attribute",/\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/).getRegex(),Tr=/(?:\[(?:\\[\s\S]|[^\[\]\\])*\]|\\[\s\S]|`+(?!`)[^`]*?`+(?!`)|``+(?=\])|[^\[\]\\`])*?/,xh=$e(/^!?\[(label)\]\(\s*(href)(?:(?:[ \t]+(?:\n[ \t]*)?|\n[ \t]*)(title))?\s*\)/).replace("label",Tr).replace("href",/<(?:\\.|[^\n<>\\])+>|[^ \t\n\x00-\x1f]*/).replace("title",/"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/).getRegex(),tl=$e(/^!?\[(label)\]\[(ref)\]/).replace("label",Tr).replace("ref",Si).getRegex(),nl=$e(/^!?\[(ref)\](?:\[\])?/).replace("ref",Si).getRegex(),Ah=$e("reflink|nolink(?!\\()","g").replace("reflink",tl).replace("nolink",nl).getRegex(),no=/[hH][tT][tT][pP][sS]?|[fF][tT][pP]/,Ci={_backpedal:ra,anyPunctuation:wh,autolink:kh,blockSkip:fh,br:Jo,code:oh,del:ra,delLDelim:ra,delRDelim:ra,emStrongLDelim:hh,emStrongRDelimAst:ph,emStrongRDelimUnd:vh,escape:sh,link:xh,nolink:nl,punctuation:ch,reflink:tl,reflinkSearch:Ah,tag:Sh,text:lh,url:ra},Eh={...Ci,link:$e(/^!?\[(label)\]\((.*?)\)/).replace("label",Tr).getRegex(),reflink:$e(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label",Tr).getRegex()},di={...Ci,emStrongRDelimAst:mh,emStrongLDelim:gh,delLDelim:_h,delRDelim:yh,url:$e(/^((?:protocol):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/).replace("protocol",no).replace("email",/[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/).getRegex(),_backpedal:/(?:[^?!.,:;*_'"~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'"~)]+(?!$))+/,del:/^(~~?)(?=[^\s~])((?:\\[\s\S]|[^\\])*?(?:\\[\s\S]|[^\s~\\]))\1(?=[^~]|$)/,text:$e(/^([`~]+|[^`~])(?:(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\":">",'"':""","'":"'"},ao=n=>Ih[n];function Dn(n,e){if(e){if(tn.escapeTest.test(n))return n.replace(tn.escapeReplace,ao)}else if(tn.escapeTestNoEncode.test(n))return n.replace(tn.escapeReplaceNoEncode,ao);return n}function ro(n){try{n=encodeURI(n).replace(tn.percentDecode,"%")}catch{return null}return n}function io(n,e){let a=n.replace(tn.findPipe,(o,c,d)=>{let u=!1,m=c;for(;--m>=0&&d[m]==="\\";)u=!u;return u?"|":" |"}),r=a.split(tn.splitPipe),i=0;if(r[0].trim()||r.shift(),r.length>0&&!r.at(-1)?.trim()&&r.pop(),e)if(r.length>e)r.splice(e);else for(;r.length0?-2:-1}function Dh(n,e=0){let a=e,r="";for(let i of n)if(i===" "){let o=4-a%4;r+=" ".repeat(o),a+=o}else r+=i,a++;return r}function so(n,e,a,r,i){let o=e.href,c=e.title||null,d=n[1].replace(i.other.outputLinkReplace,"$1");r.state.inLink=!0;let u={type:n[0].charAt(0)==="!"?"image":"link",raw:a,href:o,title:c,text:d,tokens:r.inlineTokens(d)};return r.state.inLink=!1,u}function Mh(n,e,a){let r=n.match(a.other.indentCodeCompensation);if(r===null)return e;let i=r[1];return e.split(` +`).map(o=>{let c=o.match(a.other.beginningSpace);if(c===null)return o;let[d]=c;return d.length>=i.length?o.slice(i.length):o}).join(` +`)}var Sr=class{options;rules;lexer;constructor(n){this.options=n||ca}space(n){let e=this.rules.block.newline.exec(n);if(e&&e[0].length>0)return{type:"space",raw:e[0]}}code(n){let e=this.rules.block.code.exec(n);if(e){let a=e[0].replace(this.rules.other.codeRemoveIndent,"");return{type:"code",raw:e[0],codeBlockStyle:"indented",text:this.options.pedantic?a:Pa(a,` +`)}}}fences(n){let e=this.rules.block.fences.exec(n);if(e){let a=e[0],r=Mh(a,e[3]||"",this.rules);return{type:"code",raw:a,lang:e[2]?e[2].trim().replace(this.rules.inline.anyPunctuation,"$1"):e[2],text:r}}}heading(n){let e=this.rules.block.heading.exec(n);if(e){let a=e[2].trim();if(this.rules.other.endingHash.test(a)){let r=Pa(a,"#");(this.options.pedantic||!r||this.rules.other.endingSpaceChar.test(r))&&(a=r.trim())}return{type:"heading",raw:e[0],depth:e[1].length,text:a,tokens:this.lexer.inline(a)}}}hr(n){let e=this.rules.block.hr.exec(n);if(e)return{type:"hr",raw:Pa(e[0],` +`)}}blockquote(n){let e=this.rules.block.blockquote.exec(n);if(e){let a=Pa(e[0],` +`).split(` +`),r="",i="",o=[];for(;a.length>0;){let c=!1,d=[],u;for(u=0;u1,i={type:"list",raw:"",ordered:r,start:r?+a.slice(0,-1):"",loose:!1,items:[]};a=r?`\\d{1,9}\\${a.slice(-1)}`:`\\${a}`,this.options.pedantic&&(a=r?a:"[*+-]");let o=this.rules.other.listItemRegex(a),c=!1;for(;n;){let u=!1,m="",f="";if(!(e=o.exec(n))||this.rules.block.hr.test(n))break;m=e[0],n=n.substring(m.length);let b=Dh(e[2].split(` +`,1)[0],e[1].length),w=n.split(` +`,1)[0],C=!b.trim(),x=0;if(this.options.pedantic?(x=2,f=b.trimStart()):C?x=e[1].length+1:(x=b.search(this.rules.other.nonSpaceChar),x=x>4?1:x,f=b.slice(x),x+=e[1].length),C&&this.rules.other.blankLine.test(w)&&(m+=w+` +`,n=n.substring(w.length+1),u=!0),!u){let E=this.rules.other.nextBulletRegex(x),T=this.rules.other.hrRegex(x),R=this.rules.other.fencesBeginRegex(x),P=this.rules.other.headingBeginRegex(x),D=this.rules.other.htmlBeginRegex(x),W=this.rules.other.blockquoteBeginRegex(x);for(;n;){let Y=n.split(` +`,1)[0],U;if(w=Y,this.options.pedantic?(w=w.replace(this.rules.other.listReplaceNesting," "),U=w):U=w.replace(this.rules.other.tabCharGlobal," "),R.test(w)||P.test(w)||D.test(w)||W.test(w)||E.test(w)||T.test(w))break;if(U.search(this.rules.other.nonSpaceChar)>=x||!w.trim())f+=` +`+U.slice(x);else{if(C||b.replace(this.rules.other.tabCharGlobal," ").search(this.rules.other.nonSpaceChar)>=4||R.test(b)||P.test(b)||T.test(b))break;f+=` +`+w}C=!w.trim(),m+=Y+` +`,n=n.substring(Y.length+1),b=U.slice(x)}}i.loose||(c?i.loose=!0:this.rules.other.doubleBlankLine.test(m)&&(c=!0)),i.items.push({type:"list_item",raw:m,task:!!this.options.gfm&&this.rules.other.listIsTask.test(f),loose:!1,text:f,tokens:[]}),i.raw+=m}let d=i.items.at(-1);if(d)d.raw=d.raw.trimEnd(),d.text=d.text.trimEnd();else return;i.raw=i.raw.trimEnd();for(let u of i.items){if(this.lexer.state.top=!1,u.tokens=this.lexer.blockTokens(u.text,[]),u.task){if(u.text=u.text.replace(this.rules.other.listReplaceTask,""),u.tokens[0]?.type==="text"||u.tokens[0]?.type==="paragraph"){u.tokens[0].raw=u.tokens[0].raw.replace(this.rules.other.listReplaceTask,""),u.tokens[0].text=u.tokens[0].text.replace(this.rules.other.listReplaceTask,"");for(let f=this.lexer.inlineQueue.length-1;f>=0;f--)if(this.rules.other.listIsTask.test(this.lexer.inlineQueue[f].src)){this.lexer.inlineQueue[f].src=this.lexer.inlineQueue[f].src.replace(this.rules.other.listReplaceTask,"");break}}let m=this.rules.other.listTaskCheckbox.exec(u.raw);if(m){let f={type:"checkbox",raw:m[0]+" ",checked:m[0]!=="[ ]"};u.checked=f.checked,i.loose?u.tokens[0]&&["paragraph","text"].includes(u.tokens[0].type)&&"tokens"in u.tokens[0]&&u.tokens[0].tokens?(u.tokens[0].raw=f.raw+u.tokens[0].raw,u.tokens[0].text=f.raw+u.tokens[0].text,u.tokens[0].tokens.unshift(f)):u.tokens.unshift({type:"paragraph",raw:f.raw,text:f.raw,tokens:[f]}):u.tokens.unshift(f)}}if(!i.loose){let m=u.tokens.filter(b=>b.type==="space"),f=m.length>0&&m.some(b=>this.rules.other.anyLine.test(b.raw));i.loose=f}}if(i.loose)for(let u of i.items){u.loose=!0;for(let m of u.tokens)m.type==="text"&&(m.type="paragraph")}return i}}html(n){let e=this.rules.block.html.exec(n);if(e)return{type:"html",block:!0,raw:e[0],pre:e[1]==="pre"||e[1]==="script"||e[1]==="style",text:e[0]}}def(n){let e=this.rules.block.def.exec(n);if(e){let a=e[1].toLowerCase().replace(this.rules.other.multipleSpaceGlobal," "),r=e[2]?e[2].replace(this.rules.other.hrefBrackets,"$1").replace(this.rules.inline.anyPunctuation,"$1"):"",i=e[3]?e[3].substring(1,e[3].length-1).replace(this.rules.inline.anyPunctuation,"$1"):e[3];return{type:"def",tag:a,raw:e[0],href:r,title:i}}}table(n){let e=this.rules.block.table.exec(n);if(!e||!this.rules.other.tableDelimiter.test(e[2]))return;let a=io(e[1]),r=e[2].replace(this.rules.other.tableAlignChars,"").split("|"),i=e[3]?.trim()?e[3].replace(this.rules.other.tableRowBlankLine,"").split(` +`):[],o={type:"table",raw:e[0],header:[],align:[],rows:[]};if(a.length===r.length){for(let c of r)this.rules.other.tableAlignRight.test(c)?o.align.push("right"):this.rules.other.tableAlignCenter.test(c)?o.align.push("center"):this.rules.other.tableAlignLeft.test(c)?o.align.push("left"):o.align.push(null);for(let c=0;c({text:d,tokens:this.lexer.inline(d),header:!1,align:o.align[u]})));return o}}lheading(n){let e=this.rules.block.lheading.exec(n);if(e){let a=e[1].trim();return{type:"heading",raw:e[0],depth:e[2].charAt(0)==="="?1:2,text:a,tokens:this.lexer.inline(a)}}}paragraph(n){let e=this.rules.block.paragraph.exec(n);if(e){let a=e[1].charAt(e[1].length-1)===` +`?e[1].slice(0,-1):e[1];return{type:"paragraph",raw:e[0],text:a,tokens:this.lexer.inline(a)}}}text(n){let e=this.rules.block.text.exec(n);if(e)return{type:"text",raw:e[0],text:e[0],tokens:this.lexer.inline(e[0])}}escape(n){let e=this.rules.inline.escape.exec(n);if(e)return{type:"escape",raw:e[0],text:e[1]}}tag(n){let e=this.rules.inline.tag.exec(n);if(e)return!this.lexer.state.inLink&&this.rules.other.startATag.test(e[0])?this.lexer.state.inLink=!0:this.lexer.state.inLink&&this.rules.other.endATag.test(e[0])&&(this.lexer.state.inLink=!1),!this.lexer.state.inRawBlock&&this.rules.other.startPreScriptTag.test(e[0])?this.lexer.state.inRawBlock=!0:this.lexer.state.inRawBlock&&this.rules.other.endPreScriptTag.test(e[0])&&(this.lexer.state.inRawBlock=!1),{type:"html",raw:e[0],inLink:this.lexer.state.inLink,inRawBlock:this.lexer.state.inRawBlock,block:!1,text:e[0]}}link(n){let e=this.rules.inline.link.exec(n);if(e){let a=e[2].trim();if(!this.options.pedantic&&this.rules.other.startAngleBracket.test(a)){if(!this.rules.other.endAngleBracket.test(a))return;let o=Pa(a.slice(0,-1),"\\");if((a.length-o.length)%2===0)return}else{let o=Rh(e[2],"()");if(o===-2)return;if(o>-1){let c=(e[0].indexOf("!")===0?5:4)+e[1].length+o;e[2]=e[2].substring(0,o),e[0]=e[0].substring(0,c).trim(),e[3]=""}}let r=e[2],i="";if(this.options.pedantic){let o=this.rules.other.pedanticHrefTitle.exec(r);o&&(r=o[1],i=o[3])}else i=e[3]?e[3].slice(1,-1):"";return r=r.trim(),this.rules.other.startAngleBracket.test(r)&&(this.options.pedantic&&!this.rules.other.endAngleBracket.test(a)?r=r.slice(1):r=r.slice(1,-1)),so(e,{href:r&&r.replace(this.rules.inline.anyPunctuation,"$1"),title:i&&i.replace(this.rules.inline.anyPunctuation,"$1")},e[0],this.lexer,this.rules)}}reflink(n,e){let a;if((a=this.rules.inline.reflink.exec(n))||(a=this.rules.inline.nolink.exec(n))){let r=(a[2]||a[1]).replace(this.rules.other.multipleSpaceGlobal," "),i=e[r.toLowerCase()];if(!i){let o=a[0].charAt(0);return{type:"text",raw:o,text:o}}return so(a,i,a[0],this.lexer,this.rules)}}emStrong(n,e,a=""){let r=this.rules.inline.emStrongLDelim.exec(n);if(!(!r||!r[1]&&!r[2]&&!r[3]&&!r[4]||r[4]&&a.match(this.rules.other.unicodeAlphaNumeric))&&(!(r[1]||r[3])||!a||this.rules.inline.punctuation.exec(a))){let i=[...r[0]].length-1,o,c,d=i,u=0,m=r[0][0]==="*"?this.rules.inline.emStrongRDelimAst:this.rules.inline.emStrongRDelimUnd;for(m.lastIndex=0,e=e.slice(-1*n.length+i);(r=m.exec(e))!==null;){if(o=r[1]||r[2]||r[3]||r[4]||r[5]||r[6],!o)continue;if(c=[...o].length,r[3]||r[4]){d+=c;continue}else if((r[5]||r[6])&&i%3&&!((i+c)%3)){u+=c;continue}if(d-=c,d>0)continue;c=Math.min(c,c+d+u);let f=[...r[0]][0].length,b=n.slice(0,i+r.index+f+c);if(Math.min(i,c)%2){let C=b.slice(1,-1);return{type:"em",raw:b,text:C,tokens:this.lexer.inlineTokens(C)}}let w=b.slice(2,-2);return{type:"strong",raw:b,text:w,tokens:this.lexer.inlineTokens(w)}}}}codespan(n){let e=this.rules.inline.code.exec(n);if(e){let a=e[2].replace(this.rules.other.newLineCharGlobal," "),r=this.rules.other.nonSpaceChar.test(a),i=this.rules.other.startingSpaceChar.test(a)&&this.rules.other.endingSpaceChar.test(a);return r&&i&&(a=a.substring(1,a.length-1)),{type:"codespan",raw:e[0],text:a}}}br(n){let e=this.rules.inline.br.exec(n);if(e)return{type:"br",raw:e[0]}}del(n,e,a=""){let r=this.rules.inline.delLDelim.exec(n);if(r&&(!r[1]||!a||this.rules.inline.punctuation.exec(a))){let i=[...r[0]].length-1,o,c,d=i,u=this.rules.inline.delRDelim;for(u.lastIndex=0,e=e.slice(-1*n.length+i);(r=u.exec(e))!==null;){if(o=r[1]||r[2]||r[3]||r[4]||r[5]||r[6],!o||(c=[...o].length,c!==i))continue;if(r[3]||r[4]){d+=c;continue}if(d-=c,d>0)continue;c=Math.min(c,c+d);let m=[...r[0]][0].length,f=n.slice(0,i+r.index+m+c),b=f.slice(i,-i);return{type:"del",raw:f,text:b,tokens:this.lexer.inlineTokens(b)}}}}autolink(n){let e=this.rules.inline.autolink.exec(n);if(e){let a,r;return e[2]==="@"?(a=e[1],r="mailto:"+a):(a=e[1],r=a),{type:"link",raw:e[0],text:a,href:r,tokens:[{type:"text",raw:a,text:a}]}}}url(n){let e;if(e=this.rules.inline.url.exec(n)){let a,r;if(e[2]==="@")a=e[0],r="mailto:"+a;else{let i;do i=e[0],e[0]=this.rules.inline._backpedal.exec(e[0])?.[0]??"";while(i!==e[0]);a=e[0],e[1]==="www."?r="http://"+e[0]:r=e[0]}return{type:"link",raw:e[0],text:a,href:r,tokens:[{type:"text",raw:a,text:a}]}}}inlineText(n){let e=this.rules.inline.text.exec(n);if(e){let a=this.lexer.state.inRawBlock;return{type:"text",raw:e[0],text:e[0],escaped:a}}}},xn=class fi{tokens;options;state;inlineQueue;tokenizer;constructor(e){this.tokens=[],this.tokens.links=Object.create(null),this.options=e||ca,this.options.tokenizer=this.options.tokenizer||new Sr,this.tokenizer=this.options.tokenizer,this.tokenizer.options=this.options,this.tokenizer.lexer=this,this.inlineQueue=[],this.state={inLink:!1,inRawBlock:!1,top:!0};let a={other:tn,block:gr.normal,inline:La.normal};this.options.pedantic?(a.block=gr.pedantic,a.inline=La.pedantic):this.options.gfm&&(a.block=gr.gfm,this.options.breaks?a.inline=La.breaks:a.inline=La.gfm),this.tokenizer.rules=a}static get rules(){return{block:gr,inline:La}}static lex(e,a){return new fi(a).lex(e)}static lexInline(e,a){return new fi(a).inlineTokens(e)}lex(e){e=e.replace(tn.carriageReturn,` +`),this.blockTokens(e,this.tokens);for(let a=0;a(i=c.call({lexer:this},e,a))?(e=e.substring(i.raw.length),a.push(i),!0):!1))continue;if(i=this.tokenizer.space(e)){e=e.substring(i.raw.length);let c=a.at(-1);i.raw.length===1&&c!==void 0?c.raw+=` +`:a.push(i);continue}if(i=this.tokenizer.code(e)){e=e.substring(i.raw.length);let c=a.at(-1);c?.type==="paragraph"||c?.type==="text"?(c.raw+=(c.raw.endsWith(` +`)?"":` +`)+i.raw,c.text+=` +`+i.text,this.inlineQueue.at(-1).src=c.text):a.push(i);continue}if(i=this.tokenizer.fences(e)){e=e.substring(i.raw.length),a.push(i);continue}if(i=this.tokenizer.heading(e)){e=e.substring(i.raw.length),a.push(i);continue}if(i=this.tokenizer.hr(e)){e=e.substring(i.raw.length),a.push(i);continue}if(i=this.tokenizer.blockquote(e)){e=e.substring(i.raw.length),a.push(i);continue}if(i=this.tokenizer.list(e)){e=e.substring(i.raw.length),a.push(i);continue}if(i=this.tokenizer.html(e)){e=e.substring(i.raw.length),a.push(i);continue}if(i=this.tokenizer.def(e)){e=e.substring(i.raw.length);let c=a.at(-1);c?.type==="paragraph"||c?.type==="text"?(c.raw+=(c.raw.endsWith(` +`)?"":` +`)+i.raw,c.text+=` +`+i.raw,this.inlineQueue.at(-1).src=c.text):this.tokens.links[i.tag]||(this.tokens.links[i.tag]={href:i.href,title:i.title},a.push(i));continue}if(i=this.tokenizer.table(e)){e=e.substring(i.raw.length),a.push(i);continue}if(i=this.tokenizer.lheading(e)){e=e.substring(i.raw.length),a.push(i);continue}let o=e;if(this.options.extensions?.startBlock){let c=1/0,d=e.slice(1),u;this.options.extensions.startBlock.forEach(m=>{u=m.call({lexer:this},d),typeof u=="number"&&u>=0&&(c=Math.min(c,u))}),c<1/0&&c>=0&&(o=e.substring(0,c+1))}if(this.state.top&&(i=this.tokenizer.paragraph(o))){let c=a.at(-1);r&&c?.type==="paragraph"?(c.raw+=(c.raw.endsWith(` +`)?"":` +`)+i.raw,c.text+=` +`+i.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=c.text):a.push(i),r=o.length!==e.length,e=e.substring(i.raw.length);continue}if(i=this.tokenizer.text(e)){e=e.substring(i.raw.length);let c=a.at(-1);c?.type==="text"?(c.raw+=(c.raw.endsWith(` +`)?"":` +`)+i.raw,c.text+=` +`+i.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=c.text):a.push(i);continue}if(e){let c="Infinite loop on byte: "+e.charCodeAt(0);if(this.options.silent){console.error(c);break}else throw new Error(c)}}return this.state.top=!0,a}inline(e,a=[]){return this.inlineQueue.push({src:e,tokens:a}),a}inlineTokens(e,a=[]){this.tokenizer.lexer=this;let r=e,i=null;if(this.tokens.links){let u=Object.keys(this.tokens.links);if(u.length>0)for(;(i=this.tokenizer.rules.inline.reflinkSearch.exec(r))!==null;)u.includes(i[0].slice(i[0].lastIndexOf("[")+1,-1))&&(r=r.slice(0,i.index)+"["+"a".repeat(i[0].length-2)+"]"+r.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex))}for(;(i=this.tokenizer.rules.inline.anyPunctuation.exec(r))!==null;)r=r.slice(0,i.index)+"++"+r.slice(this.tokenizer.rules.inline.anyPunctuation.lastIndex);let o;for(;(i=this.tokenizer.rules.inline.blockSkip.exec(r))!==null;)o=i[2]?i[2].length:0,r=r.slice(0,i.index+o)+"["+"a".repeat(i[0].length-o-2)+"]"+r.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);r=this.options.hooks?.emStrongMask?.call({lexer:this},r)??r;let c=!1,d="";for(;e;){c||(d=""),c=!1;let u;if(this.options.extensions?.inline?.some(f=>(u=f.call({lexer:this},e,a))?(e=e.substring(u.raw.length),a.push(u),!0):!1))continue;if(u=this.tokenizer.escape(e)){e=e.substring(u.raw.length),a.push(u);continue}if(u=this.tokenizer.tag(e)){e=e.substring(u.raw.length),a.push(u);continue}if(u=this.tokenizer.link(e)){e=e.substring(u.raw.length),a.push(u);continue}if(u=this.tokenizer.reflink(e,this.tokens.links)){e=e.substring(u.raw.length);let f=a.at(-1);u.type==="text"&&f?.type==="text"?(f.raw+=u.raw,f.text+=u.text):a.push(u);continue}if(u=this.tokenizer.emStrong(e,r,d)){e=e.substring(u.raw.length),a.push(u);continue}if(u=this.tokenizer.codespan(e)){e=e.substring(u.raw.length),a.push(u);continue}if(u=this.tokenizer.br(e)){e=e.substring(u.raw.length),a.push(u);continue}if(u=this.tokenizer.del(e,r,d)){e=e.substring(u.raw.length),a.push(u);continue}if(u=this.tokenizer.autolink(e)){e=e.substring(u.raw.length),a.push(u);continue}if(!this.state.inLink&&(u=this.tokenizer.url(e))){e=e.substring(u.raw.length),a.push(u);continue}let m=e;if(this.options.extensions?.startInline){let f=1/0,b=e.slice(1),w;this.options.extensions.startInline.forEach(C=>{w=C.call({lexer:this},b),typeof w=="number"&&w>=0&&(f=Math.min(f,w))}),f<1/0&&f>=0&&(m=e.substring(0,f+1))}if(u=this.tokenizer.inlineText(m)){e=e.substring(u.raw.length),u.raw.slice(-1)!=="_"&&(d=u.raw.slice(-1)),c=!0;let f=a.at(-1);f?.type==="text"?(f.raw+=u.raw,f.text+=u.text):a.push(u);continue}if(e){let f="Infinite loop on byte: "+e.charCodeAt(0);if(this.options.silent){console.error(f);break}else throw new Error(f)}}return a}},xr=class{options;parser;constructor(n){this.options=n||ca}space(n){return""}code({text:n,lang:e,escaped:a}){let r=(e||"").match(tn.notSpaceStart)?.[0],i=n.replace(tn.endingNewline,"")+` +`;return r?'
'+(a?i:Dn(i,!0))+`
+`:"
"+(a?i:Dn(i,!0))+`
+`}blockquote({tokens:n}){return`
+${this.parser.parse(n)}
+`}html({text:n}){return n}def(n){return""}heading({tokens:n,depth:e}){return`${this.parser.parseInline(n)} +`}hr(n){return`
+`}list(n){let e=n.ordered,a=n.start,r="";for(let c=0;c +`+r+" +`}listitem(n){return`
  • ${this.parser.parse(n.tokens)}
  • +`}checkbox({checked:n}){return" '}paragraph({tokens:n}){return`

    ${this.parser.parseInline(n)}

    +`}table(n){let e="",a="";for(let i=0;i${r}`),` + +`+e+` +`+r+`
    +`}tablerow({text:n}){return` +${n} +`}tablecell(n){let e=this.parser.parseInline(n.tokens),a=n.header?"th":"td";return(n.align?`<${a} align="${n.align}">`:`<${a}>`)+e+` +`}strong({tokens:n}){return`${this.parser.parseInline(n)}`}em({tokens:n}){return`${this.parser.parseInline(n)}`}codespan({text:n}){return`${Dn(n,!0)}`}br(n){return"
    "}del({tokens:n}){return`${this.parser.parseInline(n)}`}link({href:n,title:e,tokens:a}){let r=this.parser.parseInline(a),i=ro(n);if(i===null)return r;n=i;let o='
    ",o}image({href:n,title:e,text:a,tokens:r}){r&&(a=this.parser.parseInline(r,this.parser.textRenderer));let i=ro(n);if(i===null)return Dn(a);n=i;let o=`${Dn(a)}{let c=i[o].flat(1/0);a=a.concat(this.walkTokens(c,e))}):i.tokens&&(a=a.concat(this.walkTokens(i.tokens,e)))}}return a}use(...n){let e=this.defaults.extensions||{renderers:{},childTokens:{}};return n.forEach(a=>{let r={...a};if(r.async=this.defaults.async||r.async||!1,a.extensions&&(a.extensions.forEach(i=>{if(!i.name)throw new Error("extension name required");if("renderer"in i){let o=e.renderers[i.name];o?e.renderers[i.name]=function(...c){let d=i.renderer.apply(this,c);return d===!1&&(d=o.apply(this,c)),d}:e.renderers[i.name]=i.renderer}if("tokenizer"in i){if(!i.level||i.level!=="block"&&i.level!=="inline")throw new Error("extension level must be 'block' or 'inline'");let o=e[i.level];o?o.unshift(i.tokenizer):e[i.level]=[i.tokenizer],i.start&&(i.level==="block"?e.startBlock?e.startBlock.push(i.start):e.startBlock=[i.start]:i.level==="inline"&&(e.startInline?e.startInline.push(i.start):e.startInline=[i.start]))}"childTokens"in i&&i.childTokens&&(e.childTokens[i.name]=i.childTokens)}),r.extensions=e),a.renderer){let i=this.defaults.renderer||new xr(this.defaults);for(let o in a.renderer){if(!(o in i))throw new Error(`renderer '${o}' does not exist`);if(["options","parser"].includes(o))continue;let c=o,d=a.renderer[c],u=i[c];i[c]=(...m)=>{let f=d.apply(i,m);return f===!1&&(f=u.apply(i,m)),f||""}}r.renderer=i}if(a.tokenizer){let i=this.defaults.tokenizer||new Sr(this.defaults);for(let o in a.tokenizer){if(!(o in i))throw new Error(`tokenizer '${o}' does not exist`);if(["options","rules","lexer"].includes(o))continue;let c=o,d=a.tokenizer[c],u=i[c];i[c]=(...m)=>{let f=d.apply(i,m);return f===!1&&(f=u.apply(i,m)),f}}r.tokenizer=i}if(a.hooks){let i=this.defaults.hooks||new za;for(let o in a.hooks){if(!(o in i))throw new Error(`hook '${o}' does not exist`);if(["options","block"].includes(o))continue;let c=o,d=a.hooks[c],u=i[c];za.passThroughHooks.has(o)?i[c]=m=>{if(this.defaults.async&&za.passThroughHooksRespectAsync.has(o))return(async()=>{let b=await d.call(i,m);return u.call(i,b)})();let f=d.call(i,m);return u.call(i,f)}:i[c]=(...m)=>{if(this.defaults.async)return(async()=>{let b=await d.apply(i,m);return b===!1&&(b=await u.apply(i,m)),b})();let f=d.apply(i,m);return f===!1&&(f=u.apply(i,m)),f}}r.hooks=i}if(a.walkTokens){let i=this.defaults.walkTokens,o=a.walkTokens;r.walkTokens=function(c){let d=[];return d.push(o.call(this,c)),i&&(d=d.concat(i.call(this,c))),d}}this.defaults={...this.defaults,...r}}),this}setOptions(n){return this.defaults={...this.defaults,...n},this}lexer(n,e){return xn.lex(n,e??this.defaults)}parser(n,e){return An.parse(n,e??this.defaults)}parseMarkdown(n){return(e,a)=>{let r={...a},i={...this.defaults,...r},o=this.onError(!!i.silent,!!i.async);if(this.defaults.async===!0&&r.async===!1)return o(new Error("marked(): The async option was set to true by an extension. Remove async: false from the parse options object to return a Promise."));if(typeof e>"u"||e===null)return o(new Error("marked(): input parameter is undefined or null"));if(typeof e!="string")return o(new Error("marked(): input parameter is of type "+Object.prototype.toString.call(e)+", string expected"));if(i.hooks&&(i.hooks.options=i,i.hooks.block=n),i.async)return(async()=>{let c=i.hooks?await i.hooks.preprocess(e):e,d=await(i.hooks?await i.hooks.provideLexer(n):n?xn.lex:xn.lexInline)(c,i),u=i.hooks?await i.hooks.processAllTokens(d):d;i.walkTokens&&await Promise.all(this.walkTokens(u,i.walkTokens));let m=await(i.hooks?await i.hooks.provideParser(n):n?An.parse:An.parseInline)(u,i);return i.hooks?await i.hooks.postprocess(m):m})().catch(o);try{i.hooks&&(e=i.hooks.preprocess(e));let c=(i.hooks?i.hooks.provideLexer(n):n?xn.lex:xn.lexInline)(e,i);i.hooks&&(c=i.hooks.processAllTokens(c)),i.walkTokens&&this.walkTokens(c,i.walkTokens);let d=(i.hooks?i.hooks.provideParser(n):n?An.parse:An.parseInline)(c,i);return i.hooks&&(d=i.hooks.postprocess(d)),d}catch(c){return o(c)}}}onError(n,e){return a=>{if(a.message+=` +Please report this to https://github.com/markedjs/marked.`,n){let r="

    An error occurred:

    "+Dn(a.message+"",!0)+"
    ";return e?Promise.resolve(r):r}if(e)return Promise.reject(a);throw a}}},la=new Nh;function ft(n,e){return la.parse(n,e)}ft.options=ft.setOptions=function(n){return la.setOptions(n),ft.defaults=la.defaults,Vo(ft.defaults),ft};ft.getDefaults=wi;ft.defaults=ca;ft.use=function(...n){return la.use(...n),ft.defaults=la.defaults,Vo(ft.defaults),ft};ft.walkTokens=function(n,e){return la.walkTokens(n,e)};ft.parseInline=la.parseInline;ft.Parser=An;ft.parser=An.parse;ft.Renderer=xr;ft.TextRenderer=Ii;ft.Lexer=xn;ft.lexer=xn.lex;ft.Tokenizer=Sr;ft.Hooks=za;ft.parse=ft;ft.options;ft.setOptions;ft.use;ft.walkTokens;ft.parseInline;An.parse;xn.lex;function Va(n){return jf.sanitize(ft.parse(n,{async:!1,breaks:!0,gfm:!0}))}function Ya(n){return new Intl.DateTimeFormat(void 0,{hour:"2-digit",minute:"2-digit"}).format(new Date(n))}var Oh=H('
    '),Lh=H(''),Ph=H(' ',1),Uh=H('
    ',2),qh=H('
    '),zh=H(''),Bh=H(''),Fh=H(' ');function gi(n,e){ht(e,!0);let a=Fe(e,"onOpenImage",3,()=>{});const r=360,i=120;let o=dt(null),c=dt(null),d=dt(!1),u=dt(!1),m=dt(!1),f=dt(""),b=oe(()=>t(f)||U(e.upload.duration_ms??0)),w=null,C=oe(()=>(e.upload.content_type||"").split(";")[0].trim().toLowerCase()),x=oe(()=>t(C).startsWith("image/")),E=oe(()=>t(C).startsWith("video/")),T=oe(()=>t(C).startsWith("audio/")),R=oe(()=>t(C)==="application/pdf"),P=oe(()=>t(C)==="text/plain"),D=oe(()=>t(R)||t(P)),W=oe(()=>t(R)?"PDF":"Text"),Y=oe(()=>{const S=e.upload.width??0,I=e.upload.height??0;if(S<=0||I<=0)return"";const N=t(x)?320:r,q=Math.min(N,Math.max(i,I));return`aspect-ratio: ${S} / ${I}; max-height: ${q}px;`});function U(S){if(!S||S<=0)return"";const I=Math.floor(S/1e3),N=Math.floor(I/60),q=I%60;return`${N}:${q.toString().padStart(2,"0")}`}function Z(){h(d,!0)}function K(){!t(o)||!isFinite(t(o).duration)||h(f,U(t(o).duration*1e3),!0)}function G(){t(o)&&(h(d,!0),t(o).play())}function ue(S){return S<1024?`${S} B`:S<1024*1024?`${Math.round(S/1024)} KB`:`${(S/(1024*1024)).toFixed(1)} MB`}en(()=>{if(!t(R)||!t(c)){h(u,!1),h(m,!1);return}w?.();let S=!1,I=null,N=null,q=null;return h(u,!1),h(m,!1),(async()=>{try{const[de,pe]=await Promise.all([Ts(()=>import("./B75MOh95.js"),[],import.meta.url),Ts(()=>import("./DGzl3AwC.js"),[],import.meta.url)]);de.GlobalWorkerOptions.workerSrc=pe.default,N=de.getDocument({url:e.url,withCredentials:!0}),q=await N.promise;const me=await q.getPage(1);if(S)return;const re=128/me.getViewport({scale:1}).width,ge=me.getViewport({scale:re}),ze=t(c),ve=ze?.getContext("2d");if(!ze||!ve)throw new Error("pdf thumbnail canvas unavailable");const ke=Math.min(window.devicePixelRatio||1,2);ze.width=Math.max(1,Math.floor(ge.width*ke)),ze.height=Math.max(1,Math.floor(ge.height*ke)),ve.setTransform(ke,0,0,ke,0,0),I=me.render({canvasContext:ve,viewport:ge}),await I.promise,S||h(u,!0)}catch(de){!S&&!(de instanceof Error&&de.name==="RenderingCancelledException")&&h(m,!0)}})(),w=()=>{S=!0,I?.cancel(),q?.destroy(),N?.destroy(),w=null},()=>w?.()}),Xa(()=>w?.());var ce=bn(),j=Ft(ce);{var V=S=>{var I=Oh(),N=_(I),q=_(N);p(N);var ye=y(N,2),de=_(ye),pe=_(de,!0);p(de);var me=y(de,2);p(ye),p(I),se(()=>{ne(N,"aria-label",`Open image ${e.upload.filename}`),ne(q,"src",e.url),ne(q,"alt",e.upload.filename),ne(q,"width",e.upload.width||void 0),ne(q,"height",e.upload.height||void 0),oa(q,t(Y)),ee(pe,e.upload.filename),ne(me,"href",e.url),ne(me,"download",e.upload.filename),ne(me,"aria-label",`Download ${e.upload.filename}`)}),$("click",N,()=>a()(e.url,e.upload.filename)),$("click",me,_e=>_e.stopPropagation()),O(S,I)},M=S=>{var I=Uh();let N;var q=_(I),ye=_(q);p(q),$n(q,ze=>h(o,ze),()=>t(o));var de=y(q,2);{var pe=ze=>{var ve=Ph(),ke=Ft(ve),Ce=y(ke,2);{var Ke=He=>{var we=Lh(),Pe=_(we,!0);p(we),se(()=>ee(Pe,t(b))),O(He,we)};le(Ce,He=>{t(b)&&He(Ke)})}se(()=>ne(ke,"aria-label",`Play ${e.upload.filename}`)),$("click",ke,G),O(ze,ve)};le(de,ze=>{t(d)||ze(pe)})}var me=y(de,2),_e=_(me),re=_(_e,!0);p(_e);var ge=y(_e,2);p(me),p(I),se(()=>{N=Qe(I,1,"media-tile media-tile--video",null,N,{"is-started":t(d)}),q.controls=t(d),ne(q,"aria-label",e.upload.filename),ne(q,"width",e.upload.width||void 0),ne(q,"height",e.upload.height||void 0),oa(q,t(Y)),ne(ye,"src",e.url),ne(ye,"type",t(C)),ee(re,e.upload.filename),ne(ge,"href",e.url),ne(ge,"download",e.upload.filename),ne(ge,"aria-label",`Download ${e.upload.filename}`)}),un("play",q,Z),un("loadedmetadata",q,K),$("click",ge,ze=>ze.stopPropagation()),O(S,I)},z=S=>{var I=qh(),N=_(I),q=y(_(N),2),ye=_(q),de=_(ye,!0);p(ye);var pe=y(ye,2),me=_(pe,!0);p(pe),p(q),p(N);var _e=y(N,2),re=_(_e),ge=_(re,!0);p(re),p(_e),p(I),se(ze=>{ee(de,e.upload.filename),ee(me,ze),ne(_e,"src",e.url),ne(re,"href",e.url),ee(ge,e.upload.filename)},[()=>ue(e.upload.byte_size)]),O(S,I)},B=S=>{var I=Bh(),N=_(I);let q;var ye=_(N);{var de=Ce=>{var Ke=zh();$n(Ke,He=>h(c,He),()=>t(c)),O(Ce,Ke)};le(ye,Ce=>{t(R)&&Ce(de)})}var pe=y(ye,2),me=_(pe,!0);p(pe),p(N);var _e=y(N,2),re=_(_e),ge=_(re,!0);p(re);var ze=y(re,2),ve=_(ze,!0);p(ze),p(_e);var ke=y(_e,2);p(I),se(Ce=>{q=Qe(N,1,"document-attachment__thumbnail",null,q,{"has-preview":t(u),"thumbnail-failed":t(m)}),ne(N,"href",e.url),ne(N,"aria-label",`Open ${e.upload.filename}`),ee(me,t(W)),ne(re,"href",e.url),ee(ge,e.upload.filename),ee(ve,Ce),ne(ke,"href",e.url),ne(ke,"download",e.upload.filename),ne(ke,"aria-label",`Download ${e.upload.filename}`)},[()=>ue(e.upload.byte_size)]),O(S,I)},J=S=>{var I=Fh(),N=y(_(I),2),q=_(N),ye=_(q,!0);p(q);var de=y(q,2),pe=_(de,!0);p(de),p(N),p(I),se(me=>{ne(I,"href",e.url),ee(ye,e.upload.filename),ee(pe,me)},[()=>ue(e.upload.byte_size)]),O(S,I)};le(j,S=>{t(x)?S(V):t(E)?S(M,1):t(T)?S(z,2):t(D)?S(B,3):S(J,-1)})}O(n,ce),gt()}_t(["click"]);var Hh=H(' '),Wh=H(' '),Gh=H('');function al(n,e){ht(e,!0);var a=bn(),r=Ft(a);{var i=o=>{var c=Gh();let d;var u=y(_(c),2),m=_(u),f=_(m,!0);p(m);var b=y(m,2);{var w=x=>{var E=Hh(),T=_(E,!0);p(E),se(R=>ee(T,R),[()=>oi(e.message.quoted_body_snapshot)]),O(x,E)},C=x=>{var E=Wh(),T=_(E);p(E),se(R=>ee(T,`[original deleted] ${R??""}`),[()=>oi(e.message.quoted_body_snapshot)]),O(x,E)};le(b,x=>{e.message.quoted_message_id?x(w):x(C,-1)})}p(u),p(c),se((x,E)=>{d=Qe(c,1,"quote-block",null,d,{dangling:!e.message.quoted_message_id}),c.disabled=!e.message.quoted_message_id,ne(c,"aria-label",x),ee(f,E)},[()=>e.message.quoted_message_id?`Jump to quoted message from ${Us(e.message)}`:"Original message was deleted",()=>Us(e.message)]),$("click",c,()=>e.onJump(e.message)),O(o,c)};le(r,o=>{(e.message.quoted_message_id||e.message.quoted_body_snapshot)&&o(i)})}O(n,a),gt()}_t(["click"]);const Kh={bash:{glyph:"🖥",action:"Ran shell command"},exec:{glyph:"🖥",action:"Ran shell command"},command:{glyph:"🖥",action:"Ran shell command"},bashsession:{glyph:"🖥",action:"Managed shell session"},sessions_send:{glyph:"🖥",action:"Managed shell session"},read:{glyph:"📖",action:"Read file"},write:{glyph:"📝",action:"Wrote file"},edit:{glyph:"✏",action:"Edited file"},apply_patch:{glyph:"🧩",action:"Applied patch"},applypatch:{glyph:"🧩",action:"Applied patch"},browsercontrol:{glyph:"🌐",action:"Controlled browser"},websearch:{glyph:"🔍",action:"Searched the web"},webfetch:{glyph:"🔗",action:"Fetched a page"},image:{glyph:"🖼",action:"Analyzed image"},imagecreate:{glyph:"🎨",action:"Generated image"},scheduler:{glyph:"⏰",action:"Scheduled a job"},sendmessage:{glyph:"📤",action:"Sent a message"},message:{glyph:"📤",action:"Sent a message"},systemctl:{glyph:"⚙",action:"Controlled the system"},process:{glyph:"⚙",action:"Managed a process"},devicecontrol:{glyph:"📱",action:"Controlled a device"},pdfparse:{glyph:"📄",action:"Parsed a PDF"},statuscheck:{glyph:"📊",action:"Checked status"}},jh=[{test:n=>n.includes("search"),glyph:"🔍",action:"Searched"},{test:n=>n.includes("fetch"),glyph:"🔗",action:"Fetched"},{test:n=>n.includes("browser"),glyph:"🌐",action:"Controlled browser"},{test:n=>n.includes("patch"),glyph:"🧩",action:"Applied patch"},{test:n=>n.includes("write"),glyph:"📝",action:"Wrote file"},{test:n=>n.includes("edit"),glyph:"✏",action:"Edited file"},{test:n=>n.includes("read"),glyph:"📖",action:"Read file"},{test:n=>n.includes("session"),glyph:"🖥",action:"Managed shell session"},{test:n=>n.includes("bash")||n.includes("shell")||n.includes("exec"),glyph:"🖥",action:"Ran command"},{test:n=>n.includes("image"),glyph:"🖼",action:"Worked with image"},{test:n=>n.includes("message")||n.includes("send"),glyph:"📤",action:"Sent a message"},{test:n=>n.includes("agent")||n.includes("subagent"),glyph:"🤖",action:"Ran a sub-agent"},{test:n=>n.includes("schedul")||n.includes("cron"),glyph:"⏰",action:"Scheduled a job"},{test:n=>n.includes("device"),glyph:"📱",action:"Controlled a device"},{test:n=>n.includes("file")||n.includes("dir"),glyph:"📁",action:"Worked with files"}];function Vh(n,e){const a=String(n||"").trim(),r=a.toLowerCase().replace(/[^a-z0-9_]/g,""),i=String(e||"").trim()||void 0,o=Kh[r];if(o)return{name:a,glyph:o.glyph,action:o.action,detail:i};for(const c of jh)if(c.test(r))return{name:a,glyph:c.glyph,action:c.action,detail:i};return{name:a||"tool",glyph:"🔧",action:"Used tool",detail:i}}var Yh=H('
    '),Zh=H(' '),Xh=H(' '),Jh=H('
    '),Qh=H('
    '),$h=H('
    '),eg=H('
    '),tg=H('
    '),ng=H('
    ');function ag(n,e){ht(e,!0);let a=dt(!0),r=dt(void 0);en(()=>{(t(r)===void 0||e.block.final!==t(r))&&(h(r,e.block.final,!0),h(a,!e.block.final))});let i=To({});function o(U){i[U]=!i[U]}function c(U){const Z=U.match(/^\*\*([^]*?)\*\*\s*\n*([^]*)$/);if(!Z)return{text:U};const K=Z[1].trim(),G=Z[2].trim();return{head:K||void 0,text:G}}let d=oe(()=>e.block.items.map(U=>U.type==="tool"?{item:U,tool:Vh(U.name,U.detail)}:{item:U,tool:null})),u=oe(()=>e.block.final?t(a)?"expanded":"collapsed":"live"),m=oe(()=>t(a)?"Hide preamble":"Show preamble");var f=ng();let b;var w=_(f),C=_(w);let x;var E=y(C,2);let T;var R=_(E,!0);p(E);var P=y(E,2),D=_(P,!0);p(P),p(w);var W=y(w,2);{var Y=U=>{var Z=tg();Bt(Z,21,()=>t(d),K=>K.item.id,(K,G)=>{var ue=bn(),ce=Ft(ue);{var j=M=>{var z=Yh();Ga(z,()=>Va(t(G).item.body),!0),p(z),O(M,z)},V=M=>{const z=oe(()=>i[t(G).item.id]===!0);var B=eg();let J;var S=_(B),I=_(S);let N;var q=y(I,2),ye=_(q,!0);p(q);var de=y(q,2),pe=_(de,!0);p(de);var me=y(de,2);{var _e=ke=>{var Ce=Zh(),Ke=_(Ce,!0);p(Ce),se(()=>ee(Ke,t(G).tool.name)),O(ke,Ce)};le(me,ke=>{t(G).tool.name&&t(G).tool.name!=="tool"&&ke(_e)})}var re=y(me,2);{var ge=ke=>{var Ce=Xh(),Ke=_(Ce,!0);p(Ce),se(()=>{ne(Ce,"title",t(G).tool.detail),ee(Ke,t(G).tool.detail)}),O(ke,Ce)};le(re,ke=>{!t(z)&&t(G).tool.detail&&ke(ge)})}p(S);var ze=y(S,2);{var ve=ke=>{const Ce=oe(()=>c(t(G).item.full));var Ke=$h(),He=_(Ke);{var we=X=>{var Te=Jh(),De=_(Te,!0);p(Te),se(()=>ee(De,t(Ce).head)),O(X,Te)};le(He,X=>{t(Ce).head&&X(we)})}var Pe=y(He,2);{var ut=X=>{var Te=Qh();Ga(Te,()=>Va(t(Ce).text),!0),p(Te),O(X,Te)};le(Pe,X=>{t(Ce).text&&X(ut)})}p(Ke),O(ke,Ke)};le(ze,ke=>{t(z)&&ke(ve)})}p(B),se(()=>{J=Qe(B,1,"preamble-tool",null,J,{expanded:t(z)}),ne(S,"aria-expanded",t(z)),N=Qe(I,1,"tool-line-chevron",null,N,{open:t(z)}),ee(ye,t(G).tool.glyph),ee(pe,t(G).tool.action)}),$("click",S,()=>o(t(G).item.id)),O(M,B)};le(ce,M=>{t(G).item.type==="commentary"?M(j):t(G).tool&&M(V,1)})}O(K,ue)}),p(Z),O(U,Z)};le(W,U=>{t(a)&&U(Y)})}p(f),se(()=>{b=Qe(f,1,"preamble-contract",null,b,{"is-final":e.block.final}),ne(w,"aria-expanded",t(a)),x=Qe(C,1,"preamble-chevron",null,x,{open:t(a)}),T=Qe(E,1,"preamble-state",null,T,{"is-live":!e.block.final}),ee(R,t(u)),ee(D,t(m))}),$("click",w,()=>h(a,!t(a))),O(n,f),gt()}_t(["click"]);var rg=H('
    '),ig=H(''),sg=H(''),og=H(``),lg=H(""),cg=H(" ",1),ug=H('
    ',1),dg=H('
    '),fg=H('
    ');function hg(n,e){ht(e,!0);let a=oe(()=>e.message.status==="pending"),r=oe(()=>e.message.status==="failed"),i=oe(()=>e.message.preamble_block),o=oe(()=>!!e.previousMessage?.preamble_block&&!t(i)),c=oe(()=>!!t(i)&&!!e.nextMessage&&!e.nextMessage?.preamble_block),d=oe(()=>e.message.thread_state?.reply_count||0),u=oe(()=>t(d)>0),m=oe(()=>Ed(e.message));function f(U){t(i)||t(a)||t(r)||window.getSelection()?.toString()||U.target?.closest("a, button, input, textarea, select, .attachment-grid, .media-tile, .markdown img, .gif-player, .message-actions, .message-failed")||e.onOpenThread(e.message)}function b(U){return U.addEventListener("click",f),{destroy(){U.removeEventListener("click",f)}}}var w=fg();let C;var x=_(w),E=_(x,!0);p(x);var T=y(x,2),R=_(T);{var P=U=>{ag(U,{get block(){return t(i)}})},D=U=>{var Z=ug(),K=Ft(Z);al(K,{get message(){return e.message},get onJump(){return e.onJumpToQuote}});var G=y(K,2);Ga(G,()=>Va(e.message.body),!0),p(G),Ka(G,S=>ai?.(S));var ue=y(G,2);{var ce=S=>{var I=rg();Bt(I,21,()=>e.message.attachments,N=>N.id,(N,q)=>{{let ye=oe(()=>kr(t(q)));gi(N,{get upload(){return t(q)},get url(){return t(ye)},get onOpenImage(){return e.onOpenImage}})}}),p(I),O(S,I)};le(ue,S=>{e.message.attachments?.length&&S(ce)})}var j=y(ue,2);{var V=S=>{var I=og(),N=y(_(I),2);{var q=pe=>{var me=ig();$("click",me,()=>e.onRetry?.(e.message)),O(pe,me)};le(N,pe=>{e.onRetry&&pe(q)})}var ye=y(N,2);{var de=pe=>{var me=sg();$("click",me,()=>e.onDiscard?.(e.message)),O(pe,me)};le(ye,pe=>{e.onDiscard&&pe(de)})}p(I),O(S,I)};le(j,S=>{t(r)&&S(V)})}var M=y(j,2);let z;var B=y(_(M),2);{var J=S=>{var I=cg(),N=Ft(I),q=_(N,!0);p(N);var ye=y(N,2);{var de=pe=>{var me=lg(),_e=_(me,!0);p(me),se(()=>{ne(me,"datetime",e.message.thread_state?.last_reply_at),ee(_e,t(m))}),O(pe,me)};le(ye,pe=>{t(m)&&pe(de)})}se(pe=>ee(q,pe),[()=>Ad(e.message)]),O(S,I)};le(B,S=>{(t(u)||e.selectedThreadID===e.message.id)&&S(J)})}p(M),se((S,I)=>{z=Qe(M,1,"thread-hint tooltip",null,z,{"has-replies":t(u),"is-open":e.selectedThreadID===e.message.id}),ne(M,"data-tooltip",S),ne(M,"aria-label",I),M.disabled=t(a)||t(r)},[()=>jr(e.message,e.selectedThreadID),()=>jr(e.message,e.selectedThreadID)]),$("click",M,()=>e.onOpenThread(e.message)),O(U,Z)};le(R,U=>{t(i)?U(P):U(D,-1)})}p(T);var W=y(T,2);{var Y=U=>{var Z=dg(),K=_(Z),G=y(K,2);p(Z),se(ue=>{K.disabled=t(a)||t(r),ne(G,"data-tooltip",ue),G.disabled=t(a)||t(r)},[()=>jr(e.message,e.selectedThreadID)]),$("click",K,()=>e.onReply(e.message,e.replyContext)),$("click",G,()=>e.onOpenThread(e.message)),O(U,Z)};le(W,U=>{t(i)||U(Y)})}p(w),Ka(w,U=>b?.(U)),se((U,Z)=>{C=Qe(w,1,"message-row",null,C,U),ne(w,"data-message-id",e.message.id),ee(E,Z)},[()=>({selected:e.selected,"is-pending":t(a),"is-failed":t(r),"is-preamble":!!t(i),"is-preamble-collapsed":t(i)?.final===!0,"is-preamble-live":t(i)?.final===!1,"before-final-message":t(c),"after-preamble":t(o),"can-open-thread":!t(i)&&!t(a)&&!t(r)}),()=>e.index===0?"":Ya(e.message.created_at)]),O(n,w),gt()}_t(["click"]);var gg=H('bot'),pg=H(" "),mg=H('
    ');function vg(n,e){ht(e,!0);const a=oe(()=>e.group.messages[0]?.author),r=oe(()=>t(a)?.kind==="bot"),i=oe(()=>!t(r)&&!!e.currentUserID&&e.group.authorID===e.currentUserID);var o=mg();let c;var d=_(o);{let D=oe(()=>`View profile for ${e.group.authorName}`);qn(d,{class:"avatar avatar-button",get id(){return e.group.authorID},get name(){return e.group.authorName},get src(){return e.group.authorAvatarURL},size:38,get buttonLabel(){return t(D)},onclick:()=>e.onOpenProfile(e.group.messages[0]?.author)})}var u=y(d,2),m=_(u),f=_(m),b=_(f,!0);p(f);var w=y(f,2);{var C=D=>{var W=gg();O(D,W)};le(w,D=>{t(r)&&D(C)})}var x=y(w,2);{var E=D=>{var W=pg(),Y=_(W,!0);p(W),se(U=>ee(Y,U),[()=>Un(e.group.authorHandle)]),O(D,W)};le(x,D=>{e.group.authorHandle&&D(E)})}var T=y(x,2),R=_(T,!0);p(T),p(m);var P=y(m,2);Bt(P,19,()=>e.group.messages,D=>D.id,(D,W,Y)=>{{let U=oe(()=>e.selectedThreadID===t(W).id);hg(D,{get message(){return t(W)},get index(){return t(Y)},get previousMessage(){return e.group.messages[t(Y)-1]},get nextMessage(){return e.group.messages[t(Y)+1]},get selected(){return t(U)},get replyContext(){return e.replyContext},get selectedThreadID(){return e.selectedThreadID},get onReply(){return e.onReply},get onOpenThread(){return e.onOpenThread},get onJumpToQuote(){return e.onJumpToQuote},get onOpenImage(){return e.onOpenImage},get onRetry(){return e.onRetry},get onDiscard(){return e.onDiscard}})}}),p(u),p(o),se(D=>{c=Qe(o,1,"message-group",null,c,{"is-agent":t(r),"is-self":t(i)}),ee(b,e.group.authorName),ee(R,D)},[()=>Ya(e.group.timestamp)]),$("click",f,()=>e.onOpenProfile(e.group.messages[0]?.author)),O(n,o),gt()}_t(["click"]);var _g=H('
    Send a message in Markdown — code fences, lists, links all work. Threads open from any message.
    '),bg=H('
    '),yg=H('
    '),wg=H('
    New
    '),kg=H('
    '),Tg=H('
    '),Sg=H('
    ');function xg(n,e){ht(e,!0);let a=Fe(e,"loading",3,!1),r=Fe(e,"unreadCount",3,0),i=Fe(e,"unreadBoundarySeq",3,0),o=Fe(e,"unreadBoundaryLoaded",3,!1),c=Fe(e,"unreadSince",3,""),d=Fe(e,"hasOlder",3,!1),u=Fe(e,"hasNewer",3,!1),m=Fe(e,"loadingOlder",3,!1),f=Fe(e,"loadingNewer",3,!1),b=Fe(e,"prepending",3,!1);const w=1.5,C=160,x=260,E=180;let T=dt(void 0),R=dt(void 0),P=dt(void 0),D=dt(0),W=dt(0),Y=oe(()=>e.selectedDirect?"dm":"channel"),U=dt(""),Z=dt(-1),K=dt(0),G=oe(()=>t(U)===e.viewKey&&t(Z)===i()&&r()<=t(K)?0:r()),ue=dt(""),ce=dt(0),j=dt(!1),V,M=oe(()=>t(G)>0?t(G):t(ce));function z(){V&&(window.clearTimeout(V),V=void 0)}en(()=>{if(t(ue)&&t(ue)!==e.viewKey){z(),h(ce,0),h(ue,""),h(j,!1);return}if(t(G)>0){z(),h(ue,e.viewKey,!0),h(ce,t(G),!0),h(j,!1);return}t(ce)>0&&!t(j)&&(h(j,!0),V=window.setTimeout(()=>{V=void 0,!(t(G)>0)&&(h(ce,0),h(ue,""),h(j,!1))},E))}),Xa(z);let B=oe(()=>{const L=i()+1;if(t(M)<=0||L<=0)return!1;let Q=Number.POSITIVE_INFINITY,he=0;for(const te of e.messages){if(te.parent_message_id)continue;const Ae=te.channel_seq||0;Ae<=0||(Q=Math.min(Q,Ae),he=Math.max(he,Ae))}return Q<=L&&he>=L}),J=oe(()=>o()&&t(B)),S=oe(()=>{const L=[];let Q=!1;const he=te=>!t(J)||te.parent_message_id||te.author?.id===e.currentUserID||te.author_id===e.currentUserID?!1:t(M)>0&&(te.channel_seq||0)>i();for(const te of Rd(e.messages)){let Ae=-1;if(!Q){for(let Ne=0;Ne{requestAnimationFrame(()=>{if(Q===ze){if(te<=1){_e=!1;return}he(te-1)}})};he(L)}function He(){if(!t(T))return 0;const L=t(T).getScrollSize()+t(D);return Math.max(0,L-t(T).getScrollOffset()-t(T).getViewportSize())}function we(){return t(T)?He()<=w:!0}function Pe(L=w){return t(T)?He()<=L:!0}function ut(){if(!t(T))return{atBottom:!0,nearOlder:!1,nearNewer:!1};const L=He();return{atBottom:we(),nearOlder:t(T).getScrollOffset()-t(D)<=C,nearNewer:L<=x}}function X(){e.onHistorySettled?.(ut())}function Te(){u()||t(G)>0||e.onReachedBottom?.()}en(()=>{if(f()){ge=!0;return}ge&&(ge=!1,re=!1)});async function De(){!t(T)||t(S).length===0||(I=!u(),await Re(ke()))}async function Re(L=ke()){if(!t(T)||t(S).length===0)return;const Q=e.viewKey;document.activeElement===t(R)&&t(R).blur(),I=!u(),Ke(2),t(T).scrollToIndex(t(S).length-1,{align:"end"}),await Vn(),await vt(),Ce(Q,L)&&(h(q,!0),I=!u(),we()&&(h(N,!0),Te()),X())}en(()=>{if(!t(R))return;const L=t(R),Q=he=>{he.deltaY>0&&!me&&!_e&&u()&&we()&&(re=!0,e.onLoadNewer?.("wheel"))};return L.addEventListener("wheel",Q,{passive:!0}),()=>{L.removeEventListener("wheel",Q)}});function rt(L){return t(S).findIndex(Q=>Q.kind==="group"&&Q.group.messages.some(he=>he.id===L))}const Ye=52;let kt=oe(()=>{if(!d()||a()||!b())return 0;const L=Math.max(t(W),480);return Math.max(4,Math.ceil(L/Ye))});en(()=>{if(!t(R))return;const L=()=>{t(R)&&h(W,t(R).clientHeight,!0)};L();const Q=new ResizeObserver(L);return Q.observe(t(R)),()=>Q.disconnect()});let St=0;en(()=>{if(!t(P)||!t(R)){h(D,0),St=0;return}const L=t(P),Q=()=>{const te=L.offsetHeight,Ae=St;if(h(D,te,!0),St=te,Ae>0&&te!==Ae){const Ne=te-Ae;t(T)&&t(T).getScrollOffset()>0&&t(T).scrollBy(Ne)}};Q();const he=new ResizeObserver(Q);return he.observe(L),()=>{he.disconnect(),h(D,0),St=0}});function mt(){return t(S).findIndex(L=>L.kind==="divider")}function bt(){if(!t(J)||t(M)<=0)return"";for(const L of e.messages)if(!L.parent_message_id&&!(L.author?.id===e.currentUserID||L.author_id===e.currentUserID)&&(L.channel_seq||0)>i())return L.id;return""}function Ht(){let L=0;for(const Q of e.messages)L=Math.max(L,Q.channel_seq||0);return L}function Tt(){h(U,e.viewKey,!0),h(Z,i()),h(K,r()),e.onMarkRead?.(Ht())}function vt(){return new Promise(L=>requestAnimationFrame(()=>L()))}function Ct(L){if(!t(R)||!t(T))return!1;const Q=t(R).querySelector(L);if(!Q)return!1;const he=Q.getBoundingClientRect().top-t(R).getBoundingClientRect().top;return Math.abs(he)<=w?!0:(t(T).scrollBy(he),!1)}function yt(){if(!t(R))return null;const L=t(R).getBoundingClientRect(),Q=new Map(e.messages.map((Ae,Ne)=>[Ae.id,Ne]));let he=Number.POSITIVE_INFINITY,te=-1;for(const Ae of t(R).querySelectorAll("[data-message-id]")){const Ne=Ae.getBoundingClientRect();if(Ne.bottomL.bottom)continue;const Be=Q.get(Ae.dataset.messageId||"");Be!==void 0&&(he=Math.min(he,Be),te=Math.max(te,Be))}return te<0?null:{first:he,last:te}}function Ve(L){if(!t(R)||!t(T))return!1;const Q=e.messages.findIndex(te=>te.id===L),he=yt();return Q<0||!he?!1:he.first>Q?(t(T).scrollBy(-Math.max(80,t(R).clientHeight*.85)),!0):he.lastrt(L),`[data-message-id="${CSS.escape(L)}"]`,L),!0}function Kt(L=!0){if(!t(T)||mt()<0)return!1;I=!1;const he=e.viewKey,te=ke();return Gt(he,te,()=>mt(),"[data-unread-divider='true']",bt()).then(Ae=>{L&&!Ae&&Ce(he,te)&&e.onJumpToUnread?.()}),!0}function Lt(){if(!(t(J)&&Kt(!1))&&e.onJumpToUnread){e.onJumpToUnread();return}}function Nt(){if(!t(T))return null;if(we())return{atBottom:!0};const Q=t(T).getScrollOffset(),he=t(T).findItemIndex(Q),te=Math.max(0,Q-t(D));for(let Ae=Math.max(0,he);Ae(e.onListRef({scrollToBottom:De,scrollToMessage:It,scrollToDivider:Kt,captureState:Nt,isAtBottom:()=>we(),isNearBottom:L=>Pe(L)}),()=>e.onListRef(null))),en(()=>{const L=e.viewKey,Q=t(S).length;if(L!==ye){ye=L,de=Q,pe=e.restoreState,I=!0,h(N,!0),h(q,!1),re=!1,me=!0,Pt(L,e.restoreState,!0);return}const he=e.restoreState;if(he&&he!==pe){if(pe=he,he.atBottom){de=Q,me=!0,Pt(L,he,!0);return}if(he.anchorMessageID){de=Q,me=!0,Pt(L,he,!1);return}}Q!==de&&I&&!u()&&!me?Re():Q!==de&&!me&&je(L),de=Q});async function je(L){await Vn(),await vt(),L===ye&&X()}async function Pt(L,Q,he){const te=ke(!1);let Ae=!1;if(await Vn(),await new Promise(Ne=>requestAnimationFrame(Ne)),!!Ce(L,te)){if(Q&&!Q.atBottom&&Q.anchorMessageID){const Ne=await dn(L,te,Q.anchorMessageID,Q.anchorPixelOffset??0);if(!Ce(L,te))return;!Ne&&he?await Re(te):I=!1}else t(S).findIndex(Be=>Be.kind==="divider")>=0&&t(T)?(Ae=!0,await Gt(L,te,()=>mt(),"[data-unread-divider='true']",bt()),I=!1):await Re(te);await new Promise(Ne=>requestAnimationFrame(Ne)),Ce(L,te)&&(me=!1,h(q,!0),h(N,we(),!0),I=t(N)&&!u(),Ae||(t(N)&&Te(),t(T)&&fn(t(T).getScrollOffset())),X())}}async function dn(L,Q,he,te){if(!t(T))return!1;const Ae=rt(he);if(Ae<0)return!1;for(let Ne=0;Ne<8;Ne++){if(!t(T)||!Ce(L,Q))return!1;const Be=t(D)+t(T).getItemOffset(Ae)+te;if(Ke(),t(T).scrollTo(Be),await new Promise(lt=>requestAnimationFrame(lt)),!Ce(L,Q))return!1;const Ue=t(D)+t(T).getItemOffset(Ae)+te,Le=t(T).getScrollOffset();if(Math.abs(Ue-Be)<1&&Math.abs(Le-Be)<1)break}return!0}function fn(L){if(!t(T)||me&&!t(q))return;const Q=He(),he=we(),te=he||Q<=x;I=he&&!u(),h(N,he,!0),u()||(re=!1),!he&&d()&&L-t(D)<=C&&e.onLoadOlder?.(),!_e&&u()&&te&&!re&&(re=!0,e.onLoadNewer?.("scroll")),he&&!_e&&Te()}var Jt=Sg();let hn;var En=_(Jt);{var zn=L=>{var Q=_g(),he=_(Q),te=_(he);{var Ae=pt=>{var ct=Mn("@");O(pt,ct)},Ne=pt=>{var ct=Mn("#");O(pt,ct)};le(te,pt=>{e.selectedDirect?pt(Ae):pt(Ne,-1)})}p(he);var Be=y(he,2),Ue=_(Be);{var Le=pt=>{var ct=Mn();se(qt=>ee(ct,`This is the start of your conversation with ${qt??""}.`),[()=>sa(e.selectedDirect,e.currentUserID)]),O(pt,ct)},lt=pt=>{var ct=Mn();se(()=>ee(ct,`Welcome to #${e.selectedChannel.name??""}!`)),O(pt,ct)},Cn=pt=>{var ct=Mn("Pick a channel to get started.");O(pt,ct)};le(Ue,pt=>{e.selectedDirect?pt(Le):e.selectedChannel?pt(lt,1):pt(Cn,-1)})}p(Be),_n(2),p(Q),O(L,Q)},wn=L=>{var Q=kg(),he=y(_(Q),2);{var te=Ne=>{var Be=bg(),Ue=_(Be);Bs(Ue,{direction:"older",get rows(){return t(kt)}}),p(Be),$n(Be,Le=>h(P,Le),()=>t(P)),se(()=>ne(Be,"aria-hidden",m()?"false":"true")),O(Ne,Be)};le(he,Ne=>{t(kt)>0&&Ne(te)})}var Ae=y(he,2);$n(cf(Ae,{get data(){return t(S)},getKey:Be=>Be.id,get scrollRef(){return t(R)},get shift(){return b()},get startMargin(){return t(D)},onscroll:fn,children:(Be,Ue=ys,Le=ys)=>{var lt=bn(),Cn=Ft(lt);{var pt=tt=>{Bs(tt,{get direction(){return Ue().direction},get rows(){return Ue().rows}})},ct=tt=>{var wt=yg(),gn=_(wt),Zn=_(gn,!0);p(gn),p(wt),se(()=>ee(Zn,Ue().label)),O(tt,wt)},qt=tt=>{var wt=wg();let gn;se(()=>gn=Qe(wt,1,"new-messages-divider",null,gn,{"is-clearing":t(j)})),O(tt,wt)},jt=tt=>{vg(tt,{get group(){return Ue().group},get currentUserID(){return e.currentUserID},get selectedThreadID(){return e.selectedThreadID},get replyContext(){return t(Y)},get onOpenProfile(){return e.onOpenProfile},get onReply(){return e.onReply},get onOpenThread(){return e.onOpenThread},get onJumpToQuote(){return e.onJumpToQuote},get onOpenImage(){return e.onOpenImage},get onRetry(){return e.onRetry},get onDiscard(){return e.onDiscard}})};le(Cn,tt=>{Ue().kind==="loader"?tt(pt):Ue().kind==="day"?tt(ct,1):Ue().kind==="divider"?tt(qt,2):Ue().kind==="group"&&tt(jt,3)})}O(Be,lt)},$$slots:{default:!0}}),Be=>h(T,Be,!0),()=>t(T)),p(Q),$n(Q,Ne=>h(R,Ne),()=>t(R)),O(L,Q)};le(En,L=>{!a()&&e.messages.length===0?L(zn):e.messages.length>0&&L(wn,1)})}var ea=y(En,2);{var Ut=L=>{var Q=Tg();let he;var te=_(Q),Ae=_(te),Ne=_(Ae);p(Ae),p(te);var Be=y(te,2);p(Q),se(Ue=>{he=Qe(Q,1,"unread-bar",null,he,{"is-clearing":t(j)}),ne(Q,"aria-hidden",t(j)?"true":void 0),te.disabled=t(j),ne(te,"aria-label",Ue),ee(Ne,`${(t(ce)>99?"99+":t(ce))??""} new message${t(ce)===1?"":"s"}${c()?` since ${c()}`:""}`),Be.disabled=t(j)},[()=>`Jump to ${t(ce)>0?t(ce):""} new message${t(ce)===1?"":"s"}`.replace(/ +/g," ")]),$("click",te,Lt),$("click",Be,Tt),O(L,Q)};le(ea,L=>{!a()&&e.messages.length>0&&t(ce)>0&&L(Ut)})}p(Jt),se(()=>hn=Qe(Jt,1,"messages",null,hn,{"is-revealing":a()||!t(q)&&e.messages.length>0})),$("pointerdown",Jt,function(...L){e.onActivateMessageComposer?.apply(this,L)}),$("pointerup",Jt,function(...L){e.onInlineImagePointerUp?.apply(this,L)}),O(n,Jt),gt()}_t(["pointerdown","pointerup","click"]);const Ag=6500;var Eg=H('
    ');function Cg(n,e){ht(e,!0);let a=oe(()=>e.entries.filter(m=>m.userID!==e.currentUserID));function r(m,f="Someone"){return m?.display_name?.trim()||(m?.handle?`@${m.handle}`:f)}let i=oe(()=>t(a).length===0?"":t(a).length===1?`${r(t(a)[0].user)} is typing…`:t(a).length===2?`${r(t(a)[0].user)} and ${r(t(a)[1].user)} are typing…`:t(a).length===3?`${r(t(a)[0].user)}, ${r(t(a)[1].user)}, and ${r(t(a)[2].user)} are typing…`:"Several people are typing…");var o=Eg();let c;var d=y(_(o),2),u=_(d,!0);p(d),p(o),se(()=>{c=Qe(o,1,"typing-indicator",null,c,{visible:t(a).length>0}),ee(u,t(i))}),O(n,o),gt()}const Ig=45e3;var Rg=H('
    '),Dg=H('
    '),Mg=H('
    ');function Ng(n,e){ht(e,!0);function a(d){return d.kind==="tool"&&d.toolName?!d.text||d.text===d.toolName?d.toolName:`${d.toolName}: ${d.text}`:d.text}function r(d){switch(d){case"tool":return"⚙";case"thinking":case"commentary":return"✦";case"plan":return"☰";case"patch":return"±";case"command_output":return"›";case"error":return"✕";default:return"·"}}var i=bn(),o=Ft(i);{var c=d=>{var u=Mg();Bt(u,21,()=>e.turns,m=>m.turnId,(m,f)=>{var b=Dg();Bt(b,21,()=>t(f).lines,w=>w.id,(w,C)=>{var x=Rg();let E;var T=_(x),R=_(T,!0);p(T);var P=y(T,2),D=_(P,!0);p(P),p(x),se((W,Y)=>{E=Qe(x,1,"agent-progress__line svelte-6vwkyv",null,E,{"agent-progress__line--done":t(C).finalized}),ne(x,"data-kind",t(C).kind),ee(R,W),ee(D,Y)},[()=>r(t(C).kind),()=>a(t(C))]),O(w,x)}),p(b),O(m,b)}),p(u),O(d,u)};le(o,d=>{e.turns.length>0&&d(c)})}O(n,i),gt()}var Og=H('
    Agent is responding…
    ');function Lg(n,e){var a=Og();let r;se(()=>r=Qe(a,1,"typing-indicator agent-responding",null,r,{visible:e.active})),O(n,a)}var Pg=H('

    '),Ug=H('');function qg(n,e){ht(e,!0);var a=Ug(),r=_(a),i=y(r,2),o=_(i),c=y(_(o),2);p(o);var d=y(o,2),u=_(d),m=y(_(u),2);cn(m),p(u);var f=y(u,2);{var b=x=>{var E=Pg(),T=_(E,!0);p(E),se(()=>ee(T,e.status)),O(x,E)};le(f,x=>{e.status&&x(b)})}var w=y(f,2),C=_(w);_n(2),p(w),p(d),p(i),p(a),se(()=>Ln(m,e.channelName)),$("click",r,function(...x){e.onClose?.apply(this,x)}),$("click",c,function(...x){e.onClose?.apply(this,x)}),un("submit",d,x=>{x.preventDefault(),e.onCreate()}),$("input",m,x=>e.onChannelName(x.currentTarget.value)),$("click",C,function(...x){e.onClose?.apply(this,x)}),O(n,a),gt()}_t(["click","input"]);var zg=H(''),Bg=H('
    No matching people yet
    '),Fg=H('');function Hg(n,e){ht(e,!0);let a=oe(()=>e.memberID.trim().toLowerCase()),r=oe(()=>e.people.filter(P=>P.id!==e.currentUserID).filter(P=>t(a)?P.display_name.toLowerCase().includes(t(a))||P.handle?.toLowerCase().includes(t(a))||P.id.toLowerCase().includes(t(a)):!0));var i=Fg(),o=_(i),c=y(o,2),d=_(c),u=y(_(d),2);p(d);var m=y(d,2),f=_(m),b=y(_(f),2);cn(b),p(f);var w=y(f,2),C=_(w);Bt(C,17,()=>t(r),P=>P.id,(P,D)=>{var W=zg(),Y=_(W);qn(Y,{class:"dm-avatar",get id(){return t(D).id},get name(){return t(D).display_name},get src(){return t(D).avatar_url},size:32});var U=y(Y,2),Z=_(U),K=_(Z,!0);p(Z);var G=y(Z,2),ue=_(G,!0);p(G),p(U),p(W),se(ce=>{ee(K,t(D).display_name),ee(ue,ce)},[()=>Un(t(D).handle)||t(D).id]),$("click",W,()=>e.onStart(t(D).id)),O(P,W)});var x=y(C,2);{var E=P=>{var D=Bg();O(P,D)};le(x,P=>{t(r).length===0&&P(E)})}p(w);var T=y(w,2),R=_(T);_n(2),p(T),p(m),p(c),p(i),se(()=>Ln(b,e.memberID)),$("click",o,function(...P){e.onClose?.apply(this,P)}),$("click",u,function(...P){e.onClose?.apply(this,P)}),un("submit",m,P=>{P.preventDefault(),e.onStart(e.memberID)}),$("input",b,P=>e.onMemberID(P.currentTarget.value)),$("click",R,function(...P){e.onClose?.apply(this,P)}),O(n,i),gt()}_t(["click","input"]);var Wg=H(''),Gg=H('
    '),Kg=H('');function jg(n,e){ht(e,!0);function a(m){return m.button===0&&!m.metaKey&&!m.ctrlKey&&!m.shiftKey&&!m.altKey}var r=Kg(),i=y(_(r),4),o=_(i);Bt(o,17,()=>e.workspaces,m=>m.id,(m,f)=>{var b=Wg();let w;var C=_(b),x=_(C),E=_(x,!0);p(x),p(C),p(b),se((T,R)=>{w=Qe(b,1,"guild-wrap",null,w,{active:t(f).id===e.selectedWorkspaceID}),ne(C,"title",t(f).name),ne(C,"href",T),ee(E,R)},[()=>e.hrefForWorkspace(t(f).id),()=>ju(t(f).name)]),$("click",C,T=>{a(T)&&(T.preventDefault(),e.onSelectWorkspace(t(f).id))}),O(m,b)});var c=y(o,2);p(i);var d=y(i,2);{var u=m=>{var f=Gg(),b=_(f);cn(b),p(f),se(()=>Ln(b,e.workspaceName)),un("submit",f,w=>{w.preventDefault(),e.onCreateWorkspace()}),$("input",b,w=>e.onWorkspaceName(w.currentTarget.value)),O(m,f)};le(d,m=>{e.showWorkspaceCreate&&m(u)})}p(r),$("click",c,function(...m){e.onToggleWorkspaceCreate?.apply(this,m)}),O(n,r),gt()}_t(["click","input"]);var Vg=H(' '),Yg=H('# '),Zg=H(''),Xg=H('');function Jg(n,e){ht(e,!0);function a(f){return f.button===0&&!f.metaKey&&!f.ctrlKey&&!f.shiftKey&&!f.altKey}var r=Xg(),i=_(r),o=y(_(i),4);p(i);var c=y(i,2),d=_(c);Bt(d,17,()=>e.channels,f=>f.id,(f,b)=>{const w=oe(()=>t(b).unread_count||0);var C=Yg();let x;var E=y(_(C),2),T=_(E,!0);p(E);var R=y(E,2);{var P=D=>{var W=Vg(),Y=_(W,!0);p(W),se(()=>{ne(W,"aria-label",`${t(w)} unread`),ee(Y,t(w)>99?"99+":t(w))}),O(D,W)};le(R,D=>{t(w)>0&&!(t(b).id===e.selectedChannelID&&!e.selectedDirectID)&&D(P)})}p(C),se(D=>{ne(C,"href",D),x=Qe(C,1,"nav-item channel",null,x,{active:t(b).id===e.selectedChannelID&&!e.selectedDirectID,"has-unread":t(w)>0&&!(t(b).id===e.selectedChannelID&&!e.selectedDirectID)}),ee(T,t(b).name)},[()=>e.hrefForChannel(t(b).id)]),$("click",C,D=>{a(D)&&(D.preventDefault(),e.onSelectChannel(t(b).id))}),O(f,C)});var u=y(d,2);{var m=f=>{var b=Zg();O(f,b)};le(u,f=>{e.channels.length===0&&f(m)})}p(c),p(r),$("click",o,function(...f){e.onCreateChannel?.apply(this,f)}),O(n,r),gt()}_t(["click"]);var Qg=H(' '),$g=H(''),ep=H(''),tp=H('
    '),np=H(''),ap=H('
    '),rp=H('');function ip(n,e){ht(e,!0);let a=dt("");function r(E){return E.button===0&&!E.metaKey&&!E.ctrlKey&&!E.shiftKey&&!E.altKey}function i(E){h(a,t(a)===E?"":E,!0)}function o(){h(a,"")}var c=rp(),d=_(c),u=y(_(d),4);p(d);var m=y(d,2),f=_(m);Bt(f,17,()=>e.conversations,E=>E.id,(E,T)=>{const R=oe(()=>Vu(t(T),e.currentUserID)),P=oe(()=>t(T).unread_count||0),D=oe(()=>t(T).id===e.selectedDirectID);var W=tp();let Y;var U=_(W);let Z;var K=_(U);{let J=oe(()=>t(R)?.id||t(T).id),S=oe(()=>t(R)?.display_name),I=oe(()=>t(R)?.avatar_url);qn(K,{class:"dm-avatar",get id(){return t(J)},get name(){return t(S)},get src(){return t(I)},size:22})}var G=y(K,2),ue=_(G,!0);p(G);var ce=y(G,2);{var j=J=>{var S=Qg(),I=_(S,!0);p(S),se(()=>{ne(S,"aria-label",`${t(P)} unread`),ee(I,t(P)>99?"99+":t(P))}),O(J,S)},V=J=>{var S=$g();O(J,S)};le(ce,J=>{t(P)>0&&!t(D)?J(j):J(V,-1)})}p(U);var M=y(U,2),z=y(M,2);{var B=J=>{var S=ep(),I=_(S);p(S),$("click",I,N=>{N.preventDefault(),N.stopPropagation(),o(),e.onHideDirect(t(T).id)}),O(J,S)};le(z,J=>{t(a)===t(T).id&&J(B)})}p(W),se((J,S,I)=>{Y=Qe(W,1,"dm-row",null,Y,{active:t(D)}),ne(U,"href",J),Z=Qe(U,1,"nav-item dm",null,Z,{active:t(D),"has-unread":t(P)>0&&!t(D)}),ee(ue,S),ne(M,"aria-label",I),ne(M,"aria-expanded",t(a)===t(T).id)},[()=>e.hrefForDirect(t(T).id),()=>sa(t(T),e.currentUserID),()=>`Direct message actions for ${sa(t(T),e.currentUserID)}`]),$("click",U,J=>{r(J)&&(J.preventDefault(),e.onSelectDirect(t(T).id))}),$("click",M,J=>{J.preventDefault(),J.stopPropagation(),i(t(T).id)}),$("keydown",M,J=>{J.key==="Escape"&&o()}),O(E,W)});var b=y(f,2);{var w=E=>{var T=np();O(E,T)};le(b,E=>{e.conversations.length===0&&E(w)})}var C=y(b,2);{var x=E=>{var T=ap(),R=_(T),P=_(R);p(R);var D=y(R,2);p(T),se(()=>ee(P,`Closed ${e.hiddenDirectTitle??""}`)),$("click",D,function(...W){e.onUndoHideDirect?.apply(this,W)}),O(E,T)};le(C,E=>{e.hiddenDirectTitle&&E(x)})}p(m),p(c),$("click",u,function(...E){e.onCreateDirect?.apply(this,E)}),O(n,c),gt()}_t(["click","keydown"]);var sp=H(' '),op=H(''),lp=H(''),cp=H('');function up(n,e){ht(e,!0);function a(K){return K.button===0&&!K.metaKey&&!K.ctrlKey&&!K.shiftKey&&!K.altKey}var r=cp(),i=_(r),o=_(i),c=_(o),d=_(c,!0);p(c);var u=y(c,2);let m;var f=_(u,!0);p(u),p(o);var b=y(o,2),w=_(b),C=_(w);p(w),p(b),p(i);var x=y(i,2),E=_(x);Jg(E,{get channels(){return e.channels},get selectedChannelID(){return e.selectedChannelID},get selectedDirectID(){return e.selectedDirectID},get hrefForChannel(){return e.hrefForChannel},get onSelectChannel(){return e.onSelectChannel},get onCreateChannel(){return e.onCreateChannel}});var T=y(E,2);{let K=oe(()=>e.currentUser?.id);ip(T,{get conversations(){return e.directConversations},get currentUserID(){return t(K)},get selectedDirectID(){return e.selectedDirectID},get hrefForDirect(){return e.hrefForDirect},get onSelectDirect(){return e.onSelectDirect},get onCreateDirect(){return e.onCreateDirect},get onHideDirect(){return e.onHideDirect},get hiddenDirectTitle(){return e.hiddenDirectTitle},get onUndoHideDirect(){return e.onUndoHideDirect}})}var R=y(T,2),P=y(_(R),2),D=_(P);Bt(D,17,()=>e.recentPeople,K=>K.id,(K,G)=>{const ue=oe(()=>Zu(e.directConversations,t(G).id));var ce=sp();let j;var V=_(ce);qn(V,{class:"dm-avatar",get id(){return t(G).id},get name(){return t(G).display_name},get src(){return t(G).avatar_url},size:22});var M=y(V,2),z=_(M,!0);p(M),_n(2),p(ce),se(B=>{ne(ce,"href",B),j=Qe(ce,1,"nav-item dm",null,j,{active:t(ue)?.id===e.selectedDirectID||e.selectedProfile?.id===t(G).id}),ee(z,t(G).display_name)},[()=>t(ue)?e.hrefForDirect(t(ue).id):"#"]),$("click",ce,B=>{if(t(ue)){if(!a(B))return;B.preventDefault(),e.onSelectDirect(t(ue).id)}else B.preventDefault(),e.onOpenProfile(t(G))}),O(K,ce)});var W=y(D,2);{var Y=K=>{var G=op();O(K,G)};le(W,K=>{e.recentPeople.length===0&&K(Y)})}p(P),p(R),p(x);var U=y(x,2);{var Z=K=>{var G=lp(),ue=_(G);qn(ue,{class:"dm-avatar",get id(){return e.currentUser.id},get name(){return e.currentUser.display_name},get src(){return e.currentUser.avatar_url},size:28,loading:"eager",fetchPriority:"auto"});var ce=y(ue,2),j=_(ce),V=_(j,!0);p(j);var M=y(j,2),z=_(M,!0);p(M),p(ce),_n(2),p(G),se((B,J)=>{ne(G,"aria-label",B),ee(V,e.currentUser.display_name),ee(z,J)},[()=>`Account settings for ${e.currentUser.display_name} ${Un(e.currentUser.handle)}`,()=>e.currentUser.handle?Un(e.currentUser.handle):e.connected?"Active":"Reconnecting…"]),$("click",G,function(...B){e.onOpenSettings?.apply(this,B)}),$("contextmenu",G,B=>{B.preventDefault(),e.onOpenSettings()}),O(K,G)};le(U,K=>{e.currentUser&&K(Z)})}p(r),se(()=>{ee(d,e.workspaceName||"Pick a workspace"),m=Qe(u,1,"presence",null,m,{online:e.connected}),ee(f,e.connected?"Connected":e.status),ne(b,"aria-label",e.sidebarCollapsed?"Expand sidebar":"Collapse sidebar"),ne(b,"title",e.sidebarCollapsed?"Expand sidebar":"Collapse sidebar"),ne(C,"d",e.sidebarCollapsed?"m9 6 6 6-6 6":"m15 6-6 6 6 6")}),$("click",b,function(...K){e.onToggleCollapse?.apply(this,K)}),O(n,r),gt()}_t(["click","contextmenu"]);var dp=H(' '),fp=H(" "),oo=H(''),hp=H(''),gp=H('
    User kind
    '),lo=H('

    '),pp=H('

    Blocked.

    '),mp=H(''),vp=H(''),_p=H(''),bp=H('
    Moderation
    '),yp=H('

    Profile

    Active
    Contact information
    Handle
    User ID
    About

    ',1);function wp(n,e){ht(e,!0);const a=oe(()=>e.profile.kind==="bot"?e.profile.owner_user_id?`Bot of ${e.profile.owner_user_id}`:"Service bot":""),r=oe(()=>e.moderation?.role||"member"),i=oe(()=>!!e.moderation&&t(r)!=="owner"&&(e.currentUserRole==="owner"||e.currentUserRole==="moderator"&&(t(r)==="member"||t(r)==="guest"))),o=oe(()=>e.currentUser?.id!==e.profile.id&&t(i)),c=oe(()=>!!e.moderation?.blocked_at),d=oe(()=>t(r));var u=yp(),m=Ft(u),f=_(m),b=y(_(f),2),w=_(b,!0);p(b),p(f);var C=y(f,2);p(m);var x=y(m,2),E=_(x),T=_(E);qn(T,{class:"profile-avatar",get id(){return e.profile.id},get name(){return e.profile.display_name},get src(){return e.profile.avatar_url},size:240,loading:"eager",fetchPriority:"auto"}),p(E);var R=y(E,2),P=_(R),D=_(P),W=_(D),Y=_(W,!0);p(W);var U=y(W,2);{var Z=we=>{var Pe=dp(),ut=_(Pe,!0);p(Pe),se(()=>ee(ut,t(a))),O(we,Pe)};le(U,we=>{t(a)&&we(Z)})}var K=y(U,2);{var G=we=>{var Pe=fp(),ut=_(Pe,!0);p(Pe),se(X=>ee(ut,X),[()=>Un(e.profile.handle)]),O(we,Pe)};le(K,we=>{e.profile.handle&&we(G)})}p(D);var ue=y(D,2);{var ce=we=>{var Pe=oo();$("click",Pe,function(...ut){e.onEdit?.apply(this,ut)}),O(we,Pe)};le(ue,we=>{e.currentUser?.id===e.profile.id&&we(ce)})}p(P);var j=y(P,4),V=_(j);{var M=we=>{var Pe=hp();$("click",Pe,()=>e.onMessage(e.profile.id)),O(we,Pe)};le(V,we=>{e.currentUser?.id!==e.profile.id&&we(M)})}var z=y(V,2);p(j);var B=y(j,2),J=_(B),S=y(_(J),2);{var I=we=>{var Pe=oo();$("click",Pe,function(...ut){e.onEdit?.apply(this,ut)}),O(we,Pe)};le(S,we=>{e.currentUser?.id===e.profile.id&&we(I)})}p(J);var N=y(J,2),q=y(_(N),2),ye=y(_(q),2),de=_(ye,!0);p(ye),p(q),p(N);var pe=y(N,2),me=y(_(pe),2),_e=y(_(me),2),re=_(_e,!0);p(_e),p(me),p(pe);var ge=y(pe,2);{var ze=we=>{var Pe=gp(),ut=y(_(Pe),2),X=y(_(ut),2),Te=_(X,!0);p(X),p(ut),p(Pe),se(()=>ee(Te,t(a))),O(we,Pe)};le(ge,we=>{e.profile.kind==="bot"&&we(ze)})}p(B);var ve=y(B,2),ke=y(_(ve),2),Ce=_(ke);p(ke),p(ve);var Ke=y(ve,2);{var He=we=>{var Pe=bp(),ut=_(Pe),X=y(_(ut),2),Te=_(X,!0);p(X),p(ut);var De=y(ut,2);{var Re=Ve=>{var Oe=lo(),Gt=_(Oe);p(Oe),se(()=>ee(Gt,`${e.moderation.posts_remaining??""} of ${e.moderation.post_limit??""} waiting-room posts left today.`)),O(Ve,Oe)};le(De,Ve=>{e.moderation.role==="guest"&&e.moderation.post_limit>0&&Ve(Re)})}var rt=y(De,2);{var Ye=Ve=>{var Oe=lo(),Gt=_(Oe);p(Oe),se(It=>ee(Gt,`Timed out until ${It??""}.`),[()=>new Date(e.moderation.timeout_until).toLocaleString()]),O(Ve,Oe)};le(rt,Ve=>{e.moderation.timeout_until&&Ve(Ye)})}var kt=y(rt,2);{var St=Ve=>{var Oe=pp();O(Ve,Oe)};le(kt,Ve=>{e.moderation.blocked_at&&Ve(St)})}var mt=y(kt,2),bt=_(mt);{var Ht=Ve=>{var Oe=mp();$("click",Oe,()=>e.onApprove(e.profile.id)),O(Ve,Oe)};le(bt,Ve=>{e.moderation.role==="guest"&&Ve(Ht)})}var Tt=y(bt,2),vt=y(Tt,2);{var Ct=Ve=>{var Oe=vp();$("click",Oe,()=>e.onUnblock(e.profile.id)),O(Ve,Oe)},yt=Ve=>{var Oe=_p();$("click",Oe,()=>e.onBlock(e.profile.id)),O(Ve,Oe)};le(vt,Ve=>{t(c)?Ve(Ct):Ve(yt,-1)})}p(mt),p(Pe),se(()=>ee(Te,t(d))),$("click",Tt,()=>e.onTimeout(e.profile.id)),O(we,Pe)};le(Ke,we=>{t(o)&&e.moderation&&we(He)})}p(R),p(x),se((we,Pe)=>{ee(w,e.profile.display_name),oa(E,`--hue: ${we??""}deg`),ee(Y,e.profile.display_name),ee(de,Pe),ee(re,e.profile.id),ee(Ce,`Member of ${(e.workspaceName||"this workspace")??""}.`)},[()=>Oo(e.profile.id),()=>e.profile.handle?Un(e.profile.handle):"No handle set"]),$("click",C,function(...we){e.onClose?.apply(this,we)}),$("click",z,function(...we){e.onSetStatus?.apply(this,we)}),O(n,u),gt()}_t(["click"]);var kp=H('

    Browser notifications are not supported

    '),Tp=H('

    Browser notifications are blocked by this browser

    '),Sp=H("

    "),xp=H('');function Ap(n,e){ht(e,!0);var a=xp(),r=_(a),i=y(r,2),o=_(i),c=y(_(o),2);p(o);var d=y(o,2),u=_(d),m=_(u);qn(m,{class:"avatar large",get id(){return e.user.id},get name(){return e.displayName},get src(){return e.avatarURL},size:56,loading:"eager",fetchPriority:"auto"});var f=y(m,2),b=_(f),w=_(b,!0);p(b);var C=y(b,2),x=_(C,!0);p(C),p(f),p(u);var E=y(u,2),T=y(_(E),2);cn(T),p(E);var R=y(E,2),P=y(_(R),2);cn(P),p(R);var D=y(R,2),W=y(_(D),2);cn(W),p(D);var Y=y(D,2),U=_(Y);cn(U),_n(2),p(Y);var Z=y(Y,2);{var K=re=>{var ge=kp();O(re,ge)},G=re=>{var ge=Tp();O(re,ge)};le(Z,re=>{e.browserNotificationsSupported?e.browserNotificationPermission==="denied"&&re(G,1):re(K)})}var ue=y(Z,2),ce=_(ue);cn(ce),_n(2),p(ue);var j=y(ue,2),V=_(j);cn(V),_n(2),p(j);var M=y(j,2),z=_(M);cn(z),_n(2),p(M);var B=y(M,2),J=y(_(B),2),S=_(J);S.value=S.__value="left";var I=y(S);I.value=I.__value="right",p(J);var N;Eo(J),p(B);var q=y(B,2),ye=y(_(q),2);cn(ye),p(q);var de=y(q,2);{var pe=re=>{var ge=Sp();let ze;var ve=_(ge,!0);p(ge),se(()=>{ze=Qe(ge,1,"profile-status",null,ze,{error:e.statusError}),ee(ve,e.status)}),O(re,ge)};le(de,re=>{e.status&&re(pe)})}var me=y(de,2),_e=_(me);_n(2),p(me),p(d),p(i),p(a),se(re=>{ee(w,e.displayName||e.user.display_name),ee(x,re),Ln(T,e.displayName),Ln(P,e.handle),Ln(W,e.avatarURL),U.disabled=!e.browserNotificationsSupported||e.browserNotificationPermission==="denied",cr(U,e.browserNotificationsEnabled),cr(ce,e.pushoverEnabled),cr(V,e.hideCommentary),cr(z,e.hideToolCalls),N!==(N=e.userAlign)&&(J.value=(J.__value=e.userAlign)??"",wr(J,e.userAlign)),Ln(ye,e.pushoverUserKey)},[()=>e.handle||Un(e.user.handle)||"No handle set"]),$("click",r,function(...re){e.onClose?.apply(this,re)}),$("click",c,function(...re){e.onClose?.apply(this,re)}),un("submit",d,re=>{re.preventDefault(),e.onSave()}),$("input",T,re=>e.onDisplayName(re.currentTarget.value)),$("input",P,re=>e.onHandle(re.currentTarget.value)),$("input",W,re=>e.onAvatarURL(re.currentTarget.value)),$("change",U,re=>e.onBrowserNotificationsEnabled(re.currentTarget.checked)),$("change",ce,re=>e.onPushoverEnabled(re.currentTarget.checked)),$("change",V,re=>e.onHideCommentary(re.currentTarget.checked)),$("change",z,re=>e.onHideToolCalls(re.currentTarget.checked)),$("change",J,re=>e.onUserAlign(re.currentTarget.value==="right"?"right":"left")),$("input",ye,re=>e.onPushoverUserKey(re.currentTarget.value)),$("click",_e,function(...re){e.onClose?.apply(this,re)}),O(n,a),gt()}_t(["click","input","change"]);var Ep=H(''),Cp=H('
    ');function Ip(n,e){ht(e,!0);var a=bn(),r=Ft(a);{var i=o=>{var c=Cp(),d=_(c),u=_(d),m=_(u);p(u);var f=y(u,2);p(d);var b=y(d,2);Bt(b,17,()=>e.results,w=>w.message.id,(w,C)=>{var x=Ep(),E=_(x);{let K=oe(()=>t(C).message.author?.id||t(C).message.author_id),G=oe(()=>t(C).message.author?.display_name),ue=oe(()=>t(C).message.author?.avatar_url);qn(E,{class:"dm-avatar",get id(){return t(K)},get name(){return t(G)},get src(){return t(ue)},size:30})}var T=y(E,2),R=_(T),P=_(R),D=_(P,!0);p(P);var W=y(P,2),Y=_(W,!0);p(W),p(R);var U=y(R,2),Z=_(U,!0);p(U),p(T),p(x),se(K=>{ee(D,t(C).message.author?.display_name||"Local User"),ee(Y,K),ee(Z,t(C).message.body)},[()=>Ya(t(C).message.created_at)]),$("click",x,()=>e.onOpenResult(t(C))),O(w,x)}),p(c),se(()=>ee(m,`${e.results.length??""} ${e.results.length===1?"result":"results"}`)),$("click",f,function(...w){e.onClose?.apply(this,w)}),O(o,c)};le(r,o=>{e.results.length>0&&o(i)})}O(n,a),gt()}_t(["click"]);var Rp=H('
    No thread open Hover any message and tap the bubble to keep side conversations tidy.
    ');function Dp(n){var e=Rp();O(n,e)}var co=H(" "),uo=H('
    '),Mp=H('
    '),Np=H('

    Thread

    ',1);function Op(n,e){ht(e,!0);let a=Fe(e,"mentionPeople",19,()=>[]);var r=Np(),i=Ft(r),o=_(i),c=y(_(o),2),d=_(c);p(c),p(o);var u=y(o,2);p(i);var m=y(i,2),f=_(m),b=_(f);{let V=oe(()=>e.root.author?.id||e.root.author_id),M=oe(()=>e.root.author?.display_name),z=oe(()=>e.root.author?.avatar_url);qn(b,{class:"avatar",get id(){return t(V)},get name(){return t(M)},get src(){return t(z)},size:38})}var w=y(b,2),C=_(w),x=_(C),E=_(x,!0);p(x);var T=y(x,2);{var R=V=>{var M=co(),z=_(M,!0);p(M),se(B=>ee(z,B),[()=>Un(e.root.author.handle)]),O(V,M)};le(T,V=>{e.root.author?.handle&&V(R)})}var P=y(T,2),D=_(P,!0);p(P);var W=y(P,2);p(C);var Y=y(C,2);Ga(Y,()=>Va(e.root.body),!0),p(Y),Ka(Y,V=>ai?.(V));var U=y(Y,2);{var Z=V=>{var M=uo();Bt(M,21,()=>e.root.attachments,z=>z.id,(z,B)=>{{let J=oe(()=>kr(t(B)));gi(z,{get upload(){return t(B)},get url(){return t(J)},get onOpenImage(){return e.onOpenImage}})}}),p(M),O(V,M)};le(U,V=>{e.root.attachments?.length&&V(Z)})}p(w),p(f);var K=y(f,2),G=_(K),ue=_(G);p(G),p(K);var ce=y(K,2);Bt(ce,21,()=>e.replies,V=>V.id,(V,M)=>{var z=Mp(),B=_(z);{let ve=oe(()=>t(M).author?.id||t(M).author_id),ke=oe(()=>t(M).author?.display_name),Ce=oe(()=>t(M).author?.avatar_url);qn(B,{class:"avatar small",get id(){return t(ve)},get name(){return t(ke)},get src(){return t(Ce)},size:30})}var J=y(B,2),S=_(J),I=_(S),N=_(I,!0);p(I);var q=y(I,2);{var ye=ve=>{var ke=co(),Ce=_(ke,!0);p(ke),se(Ke=>ee(Ce,Ke),[()=>Un(t(M).author.handle)]),O(ve,ke)};le(q,ve=>{t(M).author?.handle&&ve(ye)})}var de=y(q,2),pe=_(de,!0);p(de);var me=y(de,2);p(S);var _e=y(S,2);al(_e,{get message(){return t(M)},get onJump(){return e.onJumpToQuote}});var re=y(_e,2);Ga(re,()=>Va(t(M).body),!0),p(re),Ka(re,ve=>ai?.(ve));var ge=y(re,2);{var ze=ve=>{var ke=uo();Bt(ke,21,()=>t(M).attachments,Ce=>Ce.id,(Ce,Ke)=>{{let He=oe(()=>kr(t(Ke)));gi(Ce,{get upload(){return t(Ke)},get url(){return t(He)},get onOpenImage(){return e.onOpenImage}})}}),p(ke),O(ve,ke)};le(ge,ve=>{t(M).attachments?.length&&ve(ze)})}p(J),p(z),se(ve=>{ne(z,"data-message-id",t(M).id),ee(N,t(M).author?.display_name||"Local User"),ee(pe,ve)},[()=>Ya(t(M).created_at)]),$("click",me,()=>e.onSetReplyTarget(t(M),"thread")),O(V,z)}),p(ce),p(m);var j=y(m,2);Uo(j,{get value(){return e.replyBody},placeholder:"Reply in thread",ariaLabel:"Reply body",submitLabel:"Reply",formClass:"composer reply-composer",get replyTarget(){return e.replyTarget},get mentionPeople(){return a()},get onValue(){return e.onReplyBody},get onSubmit(){return e.onSubmitReply},get onKeydown(){return e.onReplyKeydown},get onFocus(){return e.onReplyFocus},get onInputRef(){return e.onReplyInputRef},get onClearReply(){return e.onClearReply}}),se(V=>{ee(d,`${e.threadState?.reply_count??e.replies.length??""} ${(e.threadState?.reply_count??e.replies.length)===1?"reply":"replies"}`),ne(f,"data-message-id",e.root.id),ee(E,e.root.author?.display_name||"Local User"),ee(D,V),ee(ue,`${e.replies.length??""} ${e.replies.length===1?"reply":"replies"}`)},[()=>Ya(e.root.created_at)]),$("click",u,function(...V){e.onClose?.apply(this,V)}),$("pointerdown",m,function(...V){e.onActivateThreadComposer?.apply(this,V)}),$("pointerup",m,function(...V){e.onInlineImagePointerUp?.apply(this,V)}),$("click",W,()=>e.onSetReplyTarget(e.root,"thread")),O(n,r),gt()}_t(["click","pointerdown","pointerup"]);var Lp=H('

    '),Pp=H('

    '),Up=H('

    ClickClack

    '),qp=H(''),zp=H('

    ');function Bp(n,e){ht(e,!0);var a=zp(),r=_(a),i=_(r);{var o=P=>{var D=Lp(),W=_(D,!0);p(D),se(Y=>ee(W,Y),[()=>`@${sa(e.selectedDirect,e.currentUserID)}`]),O(P,D)},c=P=>{var D=Pp(),W=_(D,!0);p(D),se(()=>ee(W,`#${e.selectedChannel.name}`)),O(P,D)},d=P=>{var D=Up();O(P,D)};le(i,P=>{e.selectedDirect?P(o):e.selectedChannel?P(c,1):P(d,-1)})}var u=y(i,4),m=_(u,!0);p(u),p(r);var f=y(r,2),b=y(_(f),2);cn(b);var w=y(b,2);{var C=P=>{var D=qp();$("click",D,function(...W){e.onResetSearch?.apply(this,W)}),O(P,D)};le(w,P=>{e.searchQuery&&P(C)})}_n(2),p(f);var x=y(f,2),E=_(x);let T;var R=y(E,2);p(x),p(a),se(()=>{ee(m,e.workspaceName||"no workspace"),Ln(b,e.searchQuery),ne(E,"title",e.threadOpen?"Close thread":"Open a message thread"),ne(E,"aria-label",e.threadOpen?"Close thread":"Open a message thread"),T=Qe(E,1,"",null,T,{active:e.sidePanelOpen})}),un("submit",f,P=>{P.preventDefault(),e.onSearch()}),$("input",b,P=>e.onSearchQuery(P.currentTarget.value)),$("click",E,function(...P){e.onToggleThread?.apply(this,P)}),$("click",R,function(...P){e.onPinnedItems?.apply(this,P)}),O(n,a),gt()}_t(["input","click"]);var Fp=H(''),Hp=H('
    cc
    ClickClack OpenClaw workspace chat

    Welcome.

    Sign in with GitHub to join the guest room.

    Any GitHub account can join.

    '),Wp=H(''),Gp=H(''),Kp=H('
    ',1);function em(n,e){ht(e,!1);const a=ie(),r=ie(),i=ie(),o=ie(),c=ie(),d=ie(),u=ie(),m=ie(),f=ie(),b=ie(),w=ie(),C=ie(),x=ie(),E=ie(),T=ie(),R=96,P="clickclack:last-channel:v1:",D="clickclack:browser-notifications-enabled:v1:",W="(max-width: 820px)",Y="clickclack:show-agent-activity:v1",U="clickclack:hide-commentary:v1",Z="clickclack:hide-tool-calls:v1",K="clickclack:user-align:v1",G=Date.now();let ue=Fe(e,"routeWorkspaceID",8,""),ce=Fe(e,"routeTargetID",8,""),j=ie(null),V=ie([]),M=ie([]),z=ie([]),B=ie([]),J=ie([]),S=ie(""),I=ie(""),N=ie(""),q=ie(null),ye=ie(null),de=ie(null),pe=ie([]),me=ie([]),_e=ie([]),re=ie(null),ge=ie(""),ze=ie(""),ve=ie(""),ke=ie(""),Ce=ie(""),Ke=ie(""),He=ie([]),we=ie(null),Pe=ie(!1),ut=ie(!1),X=ie(!1),Te=ie(!1),De=ie(""),Re=ie(""),rt=ie(""),Ye=ie(""),kt=ie(!1),St=ie(""),mt=ie(!1),bt=ie(!1),Ht=ie("default"),Tt=ie(""),vt=ie(!1),Ct=ie(!1),yt=ie(!1),Ve=ie("left"),Oe=ie("loading"),Gt=ie(!1),It=ie(!1),Kt=null,Lt=ie(null),Nt=new Map,je=ie(new Map),Pt=new Set,dn=ie("idle"),fn="idle",Jt=!1,hn=!1,En=ie(!1),zn=ie(!1),wn=ie(!1),ea=ie(!1),Ut=new Map,L=0,Q=ie(""),he=ie(void 0),te=ie(""),Ae=ie(!0),Ne=ie(!1),Be=ie(!1),Ue=ie(!1),Le=ie(null),lt=ie(null),Cn=ie(null),pt=ie(null),ct=ie("message"),qt=ie([]),jt,tt=ie([]),wt,gn=ie(Date.now()),Zn,pn=ie(""),Vt=0,Bn=ie(null),mn;So(()=>{Xn(),Zn=window.setInterval(()=>{h(gn,Date.now())},3e4),it(),et();const s=window.matchMedia(W),l=()=>{h(Ue,!1)};return s.addEventListener("change",l),()=>s.removeEventListener("change",l)});function Xn(){try{const s=window.localStorage.getItem(Y)==="0";h(Ct,window.localStorage.getItem(U)==="1"||s),h(yt,window.localStorage.getItem(Z)==="1"||s),h(Ve,window.localStorage.getItem(K)==="right"?"right":"left")}catch{h(Ct,!1),h(yt,!1),h(Ve,"left")}be()}function be(){try{document.documentElement.setAttribute("data-user-align",t(Ve))}catch{}}function v(s){h(Ve,s),be();try{window.localStorage.setItem(K,s)}catch{}}function F(s){h(Ct,s);try{window.localStorage.setItem(U,s?"1":"0")}catch{}}function fe(s){h(yt,s);try{window.localStorage.setItem(Z,s?"1":"0")}catch{}}Xa(()=>{Kt?.close(),Kt=null,h(It,!1),fr(),jt&&window.clearInterval(jt),wt&&window.clearInterval(wt),Zn&&window.clearInterval(Zn),mn&&clearTimeout(mn)});async function et(){try{const s=await at("/api/me");if(h(j,s.user),it(),await ka(),t(V).length===0){h(Oe,"create a workspace");return}await $a(ue(),ce()),h(Oe,"ready")}catch(s){if(s instanceof ti&&(s.status===401||s.status===403)){h(Gt,!0),h(Oe,"auth");return}h(Oe,s instanceof Error?s.message:"Could not load ClickClack")}}function We(){t(j)&&(it(),h(Re,t(j).display_name),h(rt,t(j).handle?`@${t(j).handle}`:""),h(Ye,t(j).avatar_url),h(kt,t(j).notification_settings?.pushover_enabled??!1),h(St,t(j).notification_settings?.pushover_user_key??""),h(Tt,""),h(vt,!1),h(ut,!0))}function it(){h(mt,typeof Notification<"u"),h(Ht,t(mt)?Notification.permission:"unsupported");const s=an();h(bt,t(Ht)==="granted"&&s),s&&t(Ht)!=="granted"&&Yt(!1)}function xt(){return t(j)?.id?`${D}${t(j).id}`:""}function an(){const s=xt();if(!s)return!1;try{return window.localStorage.getItem(s)==="enabled"}catch{return!1}}function Yt(s){const l=xt();if(!l)return!1;try{return s?window.localStorage.setItem(l,"enabled"):window.localStorage.removeItem(l),!0}catch{return!1}}async function wa(s){if(h(Tt,""),h(vt,!1),!s){Yt(!1),h(bt,!1),h(Tt,"Browser notifications disabled");return}if(typeof Notification>"u"){h(mt,!1),h(Ht,"unsupported"),h(bt,!1),h(Tt,"Browser notifications are not supported"),h(vt,!0);return}const l=Notification.permission==="default"?await Notification.requestPermission():Notification.permission;if(h(mt,!0),h(Ht,l),l==="granted"){h(bt,Yt(!0)),h(Tt,t(bt)?"Browser notifications enabled":"Browser notification preference could not be saved"),h(vt,!t(bt));return}Yt(!1),h(bt,!1),h(Tt,l==="denied"?"Browser notifications are blocked by this browser":"Browser notifications were not enabled"),h(vt,!0)}async function Dt(){h(Tt,""),h(vt,!1);try{const s=await at("/api/me",{method:"PATCH",body:JSON.stringify({display_name:t(Re),handle:t(rt),avatar_url:t(Ye),notification_settings:{pushover_enabled:t(kt),pushover_user_key:t(St)}})});h(j,s.user),kn(t(B).map(l=>l.author?.id===t(j)?.id?{...l,author:s.user}:l)),h(J,t(J).map(l=>l.author?.id===t(j)?.id?{...l,author:s.user}:l)),t(q)?.author?.id===t(j).id&&h(q,{...t(q),author:s.user}),h(Tt,"Saved"),h(ut,!1)}catch(s){h(Tt,s instanceof Error?s.message:"Could not save profile"),h(vt,!0)}}async function ka(){const s=await at("/api/workspaces");h(V,s.workspaces)}function ta(s="",l=""){return`${s||""}/${l||""}`}function na(s=t(S),l=""){const g=rl(s);if(!g)return"/app";const k=`/app/${encodeURIComponent(g)}`,A=il(l);return A?`${k}/${encodeURIComponent(A)}`:k}function rl(s=t(S)){return s?t(V).find(l=>l.id===s||l.route_id===s)?.route_id||s:""}function il(s=""){return s?t(M).find(l=>l.id===s||l.route_id===s)?.route_id||t(z).find(l=>l.id===s||l.route_id===s)?.route_id||t(q)?.id===s&&t(q).route_id||""||t(B).find(l=>l.id===s)?.route_id||s:""}async function Qt(s=t(S),l="",g=!1){const k=na(s,l);window.location.pathname!==k&&await Ss(k,{replaceState:g,noScroll:!0,keepFocus:!0})}function Ta(){h(q,null),h(ye,null),h(de,null),h(ct,"message"),h(J,[]),h(Ue,!1)}function Ri(s=t(S)){return ll(s)||t(M).find(l=>l.name.toLowerCase()==="guest")?.id||t(M)[0]?.id||t(z)[0]?.id||""}function sl(s=t(S)){return t(V).find(l=>l.id===s||l.route_id===s)}function Di(s=t(S)){const l=sl(s),g=l?.route_id||l?.id||s;return g?`${P}${g}`:""}function ol(s){try{const l=JSON.parse(s);return{id:typeof l.id=="string"?l.id:"",routeID:typeof l.routeID=="string"?l.routeID:""}}catch{return{id:s}}}function ll(s=t(S)){const l=Di(s);if(!l)return"";let g;try{const A=window.localStorage.getItem(l);if(!A)return"";g=ol(A)}catch{return""}const k=t(M).find(A=>A.id===g.id||A.route_id===g.routeID);if(k)return k.id;try{window.localStorage.removeItem(l)}catch{}return""}function Qa(s,l){if(!s||!l)return;const g=t(M).find(A=>A.id===l);if(!g)return;const k=Di(s);if(k)try{window.localStorage.setItem(k,JSON.stringify({id:g.id,routeID:g.route_id}))}catch{}}async function $a(s="",l=""){const g=++Vt,k=ta(s,l),A=l.trim()?await ul(s,l):null;if(g!==Vt)return;const ae=A?t(V).find(qe=>qe.id===A.workspace_id):t(V).find(qe=>qe.id===s||qe.route_id===s)||t(V)[0];if(!ae){Hn("",da({messages:[],oldest_seq:0,newest_seq:0,has_older:!1,has_newer:!1}),"replace"),h(pn,k);return}const xe=A?ta(A.workspace_route_id,A.target_route_id):ta(ae.route_id,""),Ee=t(S)!==ae.id;if(Ee&&(Lr(),h(S,ae.id),h(I,""),h(N,""),h(q,null),h(ye,null),h(de,null),h(ct,"message"),h(J,[]),es(),tr(),h(Ae,!0),ec()),(Ee||t(M).length===0)&&await ua(!1,!1),g!==Vt||((Ee||t(z).length===0)&&await Ea(),Ee&&await Promise.all([Ir(),gl()]),g!==Vt))return;if(A){const qe=await cl(A,g);if(g!==Vt)return;if(!qe){Ta(),await Qt(ae.id,Ri(),!0);return}}if(A?.canonical_path&&window.location.pathname!==A.canonical_path&&(h(pn,xe),await Ss(A.canonical_path,{replaceState:!0,noScroll:!0,keepFocus:!0}),g!==Vt))return;if(A?.target_type==="channel"&&t(M).some(qe=>qe.id===A.target_id)){const qe=A.target_id,Se=!Ee&&t(I)===qe&&!t(N)&&t(Q)===qe;if(h(I,qe),h(N,""),Qa(ae.id,qe),Ta(),Se){h(pn,xe),xa(qe);return}if(await Fn(),g!==Vt)return;h(pn,xe);return}if(A?.target_type==="direct"&&t(z).some(qe=>qe.id===A.target_id)){const qe=A.target_id,Se=!Ee&&t(N)===qe&&!t(I)&&t(Q)===qe;if(h(N,qe),h(I,""),Ta(),Se){h(pn,xe),xa(qe);return}if(await Fn(),g!==Vt)return;h(pn,xe);return}if(A?.target_type==="thread"){const qe=await dl(A);if(g!==Vt)return;if(qe){h(pn,xe);return}}const Xe=Ri();if(Ta(),!Xe){h(I,""),h(N,""),await Fn(),h(pn,k),(s!==ae.route_id||l)&&await Qt(ae.id,"",!0);return}await Qt(ae.id,Xe,!0)}async function cl(s,l){if(s.target_type==="channel")return t(M).some(g=>g.id===s.target_id)||await ua(!1,!1,!1),l===Vt&&t(M).some(g=>g.id===s.target_id);if(s.target_type==="direct"){if(!t(z).some(g=>g.id===s.target_id)&&(await Ea(),!t(z).some(g=>g.id===s.target_id))){const g=await at(`/api/dms/${s.target_id}`);or(g.conversation)}return l===Vt&&t(z).some(g=>g.id===s.target_id)}if(s.parent_type==="channel"&&s.parent_id)return t(M).some(g=>g.id===s.parent_id)||await ua(!1,!1,!1),l===Vt&&t(M).some(g=>g.id===s.parent_id);if(s.parent_type==="direct"&&s.parent_id){if(!t(z).some(g=>g.id===s.parent_id)&&(await Ea(),!t(z).some(g=>g.id===s.parent_id))){const g=await at(`/api/dms/${s.parent_id}`);or(g.conversation)}return l===Vt&&t(z).some(g=>g.id===s.parent_id)}return!0}async function ul(s,l){try{return(await at(`/api/routes/${encodeURIComponent(s)}/${encodeURIComponent(l)}`)).route}catch(g){if(g instanceof ti&&(g.status===403||g.status===404))return null;throw g}}async function dl(s){if(s.workspace_id!==t(S))return!1;const l=s.parent_type==="channel"&&s.parent_id||"",g=s.parent_type==="direct"&&s.parent_id||"";if(l){if(!t(M).some(A=>A.id===l))return!1;h(I,l),h(N,""),Qa(s.workspace_id,l)}else if(g){if(!t(z).some(A=>A.id===g))return!1;h(N,g),h(I,"")}else return!1;const k=t(q)?.id===s.target_id&&t(Q)===nt();return h(de,null),h(ct,"thread"),h(Ue,!1),await sr(s.target_id),!k&&t(q)&&await Ur(t(q)),!0}async function fl(){if(!t(ve).trim())return;const s=await at("/api/workspaces",{method:"POST",body:JSON.stringify({name:t(ve)})});h(ve,""),h(Ne,!1),h(V,[...t(V),s.workspace]),h(Ue,!1),await $a(s.workspace.route_id||s.workspace.id,""),await Qt(s.workspace.id),h(Oe,"ready")}async function hl(s){h(Ue,!1),await Qt(s)}async function ua(s=!0,l=!0,g=!0){if(!t(S))return;const k=await at(`/api/workspaces/${t(S)}/channels`);h(M,k.channels),l?h(I,t(M).find(A=>A.id===t(I))?.id||t(M)[0]?.id||""):t(I)&&!t(M).some(A=>A.id===t(I))&&h(I,""),g&&(h(q,null),h(de,null),h(ct,"message"),h(J,[])),s&&await Fn()}async function Ir(){if(h(pe,[]),!(!t(S)||t(r)!=="owner"&&t(r)!=="moderator"))try{const s=await at(`/api/workspaces/${t(S)}/moderation/members`);h(pe,s.members)}catch{h(pe,[])}}async function gl(){if(h(me,[]),!!t(S))try{const s=await at(`/api/workspaces/${t(S)}/slash-commands`);h(me,s.slash_commands)}catch{h(me,[])}}function pl(s,l,g,k){const A=new Map;for(const ae of g)ae.user.id&&A.set(ae.user.id,ae.user);for(const ae of k?.members||[])ae.id&&A.set(ae.id,ae);for(const ae of l)ae.id&&A.set(ae.id,ae);return s?.id&&A.set(s.id,s),[...A.values()].slice(0,24)}async function er(s,l){if(!t(S))return;const g=await at(`/api/workspaces/${t(S)}/moderation/members/${s}`,{method:"PATCH",body:JSON.stringify(l)});h(pe,[...t(pe).filter(k=>k.user.id!==s),g.member]),await ua(!1,!1,!1),h(Oe,"ready")}async function ml(){if(!t(S)||!t(ke).trim())return;const s=await at(`/api/workspaces/${t(S)}/channels`,{method:"POST",body:JSON.stringify({name:t(ke),kind:"public"})});h(ke,""),h(M,[...t(M),s.channel]),h(X,!1),await Qt(t(S),s.channel.id)}async function Mi(s){h(Ue,!1),Qa(t(S),s);const l=na(t(S),s);s===t(I)&&!t(N)&&window.location.pathname===l||await Qt(t(S),s)}async function Fn(){Lr();const s=nt(),l=s!==t(Q);tr(),l&&h(Ae,!0);try{if(!t(N)&&!t(I)){Hn("",da({messages:[],oldest_seq:0,newest_seq:0,has_older:!1,has_newer:!1}),"replace");return}const g=await at(Sa(vl()));if(nt()!==s)return;Hn(s,da(g),"replace")}finally{nt()===s&&h(Ae,!1)}}async function Ni(){const s=nt();if(s){tr(),h(Ae,!0),Nt.set(s,{atBottom:!0});try{const l=await at(Sa(`limit=${ur}`));if(nt()!==s)return;Hn(s,da(l),"replace")}finally{nt()===s&&h(Ae,!1)}}}function vl(){const s=_l(),l=s.unread_count||0,g=s.last_read_seq||0;return l>0?`around_seq=${encodeURIComponent(String(g+1))}&limit=${ur}`:`limit=${ur}`}function _l(){return t(N)?t(z).find(s=>s.id===t(N))||{}:t(I)?t(M).find(s=>s.id===t(I))||{}:{}}function Sa(s){const l=t(N)?`/api/dms/${t(N)}/messages`:`/api/channels/${t(I)}/messages`;return s?`${l}?${s}`:l}function da(s){return{messages:s.messages,oldest_seq:s.oldest_seq,newest_seq:s.newest_seq,has_older:s.has_older,has_newer:s.has_newer}}function Hn(s,l,g){const k=Li(s,l.messages,g),A=k[0]?.channel_seq||0,ae=k[k.length-1]?.channel_seq||0,xe=A>(l.messages[0]?.channel_seq||A),Ee=ae<(l.messages[l.messages.length-1]?.channel_seq||ae),Xe={messages:k,oldest_seq:A,newest_seq:ae,has_older:l.has_older||xe,has_newer:l.has_newer||Ee};Rr(s,Xe),xa(s,Xe),Ul(s,k)}function Rr(s,l){s&&(t(je).delete(s),t(je).set(s,l),bl(s),yl(s),h(je,new Map(t(je))))}function bl(s){let l=t(je).size+1;for(;t(je).size>Hu&&l>0;){l--;const g=t(je).keys().next().value;if(!g)return;if(g===s){const k=t(je).get(g);t(je).delete(g),k&&t(je).set(g,k);continue}t(je).delete(g)}}function yl(s){let l=Nt.size+1;for(;Nt.size>Wu&&l>0;){l--;const g=Nt.keys().next().value;if(!g)return;if(g===s){const k=Nt.get(g);Nt.delete(g),k&&Nt.set(g,k);continue}Nt.delete(g)}}function xa(s,l=t(je).get(s)){s===nt()&&(h(En,l?.has_older||!1),h(zn,l?.has_newer||!1))}function wl(s){const l=t(je).get(s);!s||!l||(Rr(s,{...l,has_newer:!0}),xa(s))}function Wn(s,l){s==="older"?(h(dn,l),h(wn,l==="loading")):(fn=l,h(ea,l==="loading"))}function tr(){Pt=new Set,h(dn,"idle"),fn="idle",Jt=!1,hn=!1,h(wn,!1),h(ea,!1)}function Oi(s,l){const g=new Map;for(const k of[...s,...l])g.set(k.id,k);return[...g.values()].sort((k,A)=>(k.channel_seq||0)-(A.channel_seq||0))}function kl(s){const l=new Set,g=Hi(s);if(g>=0){const A=Dr(s,t(B),g);A&&l.add(A.id)}const k=Nt.get(s)?.anchorMessageID;k&&l.add(k),t(q)&&Gn(t(q),s)&&l.add(t(q).id),t(Le)&&Gn(t(Le),s)&&l.add(t(Le).id);for(const A of t(B))(A.status==="pending"||A.status==="failed")&&Gn(A,s)&&l.add(A.id);return l}function Li(s,l,g){return Gu(l,g,kl(s))}function Pi(){if(t(dn)!=="idle"){Jt=!0;return}Tl()}function Ui(s=!1){if(fn!=="idle"){s&&(hn=!0);return}qi()}async function Tl(){const s=nt(),l=t(je).get(s),g=`${s}:older`;if(t(dn)!=="idle"){Jt=!0;return}if(!s||!l?.has_older||l.oldest_seq<=0||Pt.has(g))return;Pt.add(g),Jt=!1,Wn("older","loading"),Lr();let k=!1;try{const A=await at(Sa(`before_seq=${encodeURIComponent(String(l.oldest_seq))}&limit=${ri}`));if(nt()!==s)return;const ae=Oi(A.messages,t(B));Hn(s,{messages:ae,oldest_seq:A.oldest_seq||l.oldest_seq,newest_seq:l.newest_seq,has_older:A.has_older,has_newer:l.has_newer},"prepend"),k=!0,Wn("older","settling")}catch(A){nt()===s&&h(Oe,A instanceof Error?A.message:"Could not load older messages")}finally{Pt.delete(g),nt()===s&&!k&&Wn("older","idle")}}async function qi(){const s=nt(),l=t(je).get(s),g=`${s}:newer`;if(fn!=="idle"){hn=!0;return}if(!s||Pt.has(g))return;if(!l||l.newest_seq<=0){await Fn();return}Pt.add(g),hn=!1,Wn("newer","loading");let k=!1;try{const A=await at(Sa(`after_seq=${encodeURIComponent(String(l.newest_seq))}&limit=${ri}`));if(nt()!==s)return;if(A.messages.length===0){Hn(s,{...l,has_newer:A.has_newer},"append"),k=!0,Wn("newer","settling");return}const ae=Oi(t(B),A.messages);Hn(s,{messages:ae,oldest_seq:l.oldest_seq,newest_seq:A.newest_seq||l.newest_seq,has_older:l.has_older,has_newer:A.has_newer},"append"),k=!0,Wn("newer","settling")}catch(A){nt()===s&&h(Oe,A instanceof Error?A.message:"Could not load newer messages")}finally{Pt.delete(g),nt()===s&&!k&&Wn("newer","idle")}}function Sl(s){const l=t(dn)==="settling"&&Jt&&s.nearOlder&&t(En),g=fn==="settling"&&hn&&s.nearNewer&&t(zn);t(dn)==="settling"&&Wn("older","idle"),fn==="settling"&&Wn("newer","idle"),Jt=!1,hn=!1,l&&Pi(),g&&Ui()}function nt(){return t(N)||t(I)||""}function zi(s,l=t(B)){let g=0;for(const k of l)k.channel_id===s&&(k.parent_message_id||typeof k.channel_seq=="number"&&k.channel_seq>g&&(g=k.channel_seq));return g}function Bi(s,l=t(B)){let g=0;for(const k of l)k.direct_conversation_id===s&&typeof k.channel_seq=="number"&&k.channel_seq>g&&(g=k.channel_seq);return g}function nr(s,l){return s&&l.unread_count||0}async function xl(s,l){const g=t(M).find(k=>k.id===s);if(g&&!(l<=0||l<=(g.last_read_seq||0))){h(M,t(M).map(k=>k.id===s?(()=>{const A=Math.max(k.last_seq||0,l);return{...k,last_seq:A,unread_count:l>=A?0:k.unread_count||0,last_read_seq:l}})():k));try{await at(`/api/channels/${s}/read`,{method:"POST",body:JSON.stringify({seq:l})})}catch{}}}async function Al(s,l){const g=t(z).find(k=>k.id===s);if(g&&!(l<=0||l<=(g.last_read_seq||0))){h(z,t(z).map(k=>k.id===s?(()=>{const A=Math.max(k.last_seq||0,l);return{...k,last_seq:A,unread_count:l>=A?0:k.unread_count||0,last_read_seq:l}})():k));try{await at(`/api/dms/${s}/read`,{method:"POST",body:JSON.stringify({seq:l})})}catch{}}}function El(s){const l=t(je).get(s)?.newest_seq||0,g=t(M).find(A=>A.id===s);if(g)return Math.max(g.last_seq||0,(g.last_read_seq||0)+(g.unread_count||0),zi(s),l);const k=t(z).find(A=>A.id===s);return k?Math.max(k.last_seq||0,(k.last_read_seq||0)+(k.unread_count||0),Bi(s),l):0}function Cl(s){const l=t(je).get(s);return!l||l.has_newer?0:t(M).find(A=>A.id===s)?zi(s):t(z).find(A=>A.id===s)?Bi(s):0}function Aa(s={}){if(!s.all&&Date.now()=0&&!ar(l,A))return}const g=s.all?Math.max(s.seq||0,El(l)):s.seq||Cl(l);if(g<=0)return;if(t(z).some(A=>A.id===l)){Al(l,g),s.all&&Fi(l,g);return}t(M).some(A=>A.id===l)&&(xl(l,g),s.all&&Fi(l,g))}function Fi(s,l){Ut.delete(s),Ut=new Map(Ut),h(M,t(M).map(g=>g.id===s?{...g,last_seq:Math.max(g.last_seq||0,l),last_read_seq:Math.max(g.last_read_seq||0,l),unread_count:0}:g)),h(z,t(z).map(g=>g.id===s?{...g,last_seq:Math.max(g.last_seq||0,l),last_read_seq:Math.max(g.last_read_seq||0,l),unread_count:0}:g))}function Il(s){const l=t(M).find(k=>k.id===s);return l?l.last_read_seq||0:t(z).find(k=>k.id===s)?.last_read_seq||0}function Hi(s){const l=t(M).find(k=>k.id===s);if(l)return nr(s,l)>0?l.last_read_seq||0:-1;const g=t(z).find(k=>k.id===s);return g&&nr(s,g)>0?g.last_read_seq||0:-1}function Dr(s,l,g){for(const k of l){if(!Gn(k,s)||k.parent_message_id||k.author?.id===t(j)?.id||k.author_id===t(j)?.id)continue;const A=k.channel_seq;if(typeof A=="number"&&A>g)return k}return null}function Rl(s,l){if(!s)return;const g=Ll(s);if(nr(s,g)<=0){Ut.delete(s),Ut=new Map(Ut);return}const A=g.last_read_seq||0,ae=Ut.get(s);if(ae?.boundarySeq===A&&ae.since||!ar(s,A))return;const xe=Dr(s,l,A);xe&&(Ut=new Map(Ut).set(s,{boundarySeq:A,since:Or(xe.created_at)}))}function Wi(s,l,g){if(!s||!g)return;const k=Ut.get(s);k?.boundarySeq===l&&k.since||(Ut=new Map(Ut).set(s,{boundarySeq:l,since:Or(g)}))}function Mr(s){const l=s.payload,g=l.channel_seq??s.seq??l.seq;return typeof g=="number"?g:Number(g)||0}function Nr(s){const l=s.payload;return{channelID:s.channel_id||(typeof l.channel_id=="string"?l.channel_id:""),dmID:typeof l.direct_conversation_id=="string"?l.direct_conversation_id:""}}function Dl(s,l){if(s.type!=="message.created")return;const g=s.payload,k=typeof g.kind=="string"?g.kind:"";if(k==="agent_commentary"||k==="agent_tool"||!t(bt)||typeof Notification>"u"||Notification.permission!=="granted"||document.visibilityState==="visible"&&l)return;const A=typeof g.author_id=="string"?g.author_id:"";if(A&&A===t(j)?.id)return;const{channelID:ae,dmID:xe}=Nr(s),Ee=t(M).find(rn=>rn.id===ae),qe=ss(A)?.display_name||"ClickClack",Se=Ee?`#${Ee.name}`:"Direct message",st=typeof g.body=="string"?g.body:"New message",Me=typeof g.message_id=="string"?g.message_id:`${ae||xe}:${s.seq||Date.now()}`;try{const rn=new Notification(`${qe} in ${Se}`,{body:Ml(st),tag:`clickclack:${Me}`,icon:"/favicon.svg"});rn.onclick=()=>{window.focus(),rn.close(),ae?Mi(ae):xe&&ns(xe)}}catch{}}function Ml(s){const l=s.replace(/!\[[^\]]*]\([^)]+\)/g,"[image]").replace(/\[[^\]]+]\(([^)]+)\)/g,"$1").replace(/[`*_>#|]/g,"").replace(/\s+/g," ").trim();return l?l.length>180?`${l.slice(0,177)}...`:l:"New message"}function Nl(s){if(s.type!=="message.created")return!1;const l=Mr(s);if(l<=0)return!1;const{channelID:g,dmID:k}=Nr(s);if(g){const A=t(M).find(ae=>ae.id===g);return l<=(A?.last_seq||0)}if(k){const A=t(z).find(ae=>ae.id===k);return l<=(A?.last_seq||0)}return!1}async function Ol(s){const l=s.payload,g=typeof l.direct_conversation_id=="string"?l.direct_conversation_id:"";return!g||t(z).some(k=>k.id===g)?!1:(await Ea(),t(z).some(k=>k.id===g))}function Ll(s){return t(M).find(l=>l.id===s)||t(z).find(l=>l.id===s)||{}}function ar(s,l,g=t(je)){if(!s||l<0)return!1;const k=g.get(s);if(!k||k.messages.length===0)return!1;const A=l+1;return k.oldest_seq<=A&&k.newest_seq>=A}function Pl(s,l,g=t(je)){const k=Ut.get(s);if(k?.boundarySeq===l)return k.since;if(!ar(s,l,g))return"";const A=Dr(s,t(B),l);return A?Or(A.created_at):""}function Or(s){const l=new Date(s);return Number.isNaN(l.getTime())?"":new Intl.DateTimeFormat(void 0,{hour:"numeric",minute:"2-digit"}).format(l)}function Lr(){if(!t(Q)||!t(Lt))return;const s=t(Lt).captureState();s&&Nt.set(t(Q),s)}function Ul(s,l){const g=s!==t(Q);h(he,Nt.get(s));const k=t(B).filter(Se=>(Se.status==="pending"||Se.status==="failed")&&Gn(Se,s)),A=new Map(k.map(Se=>[Se.id,Se])),ae=new Map(k.filter(Se=>Se.nonce).map(Se=>[Se.nonce,Se])),xe=l.map(Se=>{const st=A.get(Se.id)||(Se.nonce?ae.get(Se.nonce):void 0);return st?Se.nonce&&fa.has(Se.nonce)?{...Se,nonce:st.nonce,status:st.status,attachments:st.attachments?.length?st.attachments:Se.attachments}:{...Se,nonce:st.nonce,attachments:st.attachments?.length?st.attachments:Se.attachments}:Se}),Ee=new Set(xe.map(Se=>Se.id)),Xe=new Set(xe.map(Se=>Se.nonce).filter(Boolean)),qe=t(B).filter(Se=>(Se.status==="pending"||Se.status==="failed")&&Se.id.startsWith("tmp_")&&!Ee.has(Se.id)&&!(Se.nonce&&Xe.has(Se.nonce))&&Gn(Se,s));h(B,qe.length>0?[...xe,...qe]:xe),h(Q,s),Rl(s,t(B)),g&&(h(qt,[]),h(tt,[]),fr())}function kn(s,l="append"){const g=nt(),k=g?t(je).get(g):void 0;if(!g||!k){h(B,s);return}const A=s.filter(st=>Gn(st,g)),ae=Li(g,A,l),xe=ae.filter(st=>(st.channel_seq||0)>0),Ee=xe[0]?.channel_seq||k.oldest_seq,Xe=xe[xe.length-1]?.channel_seq||k.newest_seq,qe=rr(ae[0])>rr(A[0]),Se=rr(ae[ae.length-1])0)&&await Ni(),await ir(),Aa({all:!0}),await ir()}catch(s){h(Oe,s instanceof Error?s.message:"Could not jump to latest messages")}}let fa=new Map;function Ki(){return typeof crypto<"u"&&typeof crypto.randomUUID=="function"?crypto.randomUUID().replace(/-/g,""):`${Date.now().toString(36)}${Math.random().toString(36).slice(2,10)}`}function zl(s,l,g=`tmp_${s}`){const k=new Date().toISOString();return{id:g,workspace_id:l.workspaceID,channel_id:l.channelID,direct_conversation_id:l.directConversationID,author_id:t(j)?.id||"",thread_root_id:g,body:l.body,body_format:"markdown",created_at:k,author:t(j)||void 0,attachments:l.upload?[l.upload]:[],quoted_message_id:l.quotedMessageID,nonce:s,status:"pending"}}async function ji(){const s=t(ge).trim();if(!s)return;if(!t(I)&&!t(N)){h(Oe,"pick or create a channel");return}fr();const l=t(N)?"dm":"channel",g=t(Le)&&t(lt)===l?t(Le):null,k={body:s,quotedMessageID:g?.id,upload:t(we)||void 0,workspaceID:t(S),channelID:t(I)||void 0,directConversationID:t(N)||void 0,viewKey:nt()};h(ge,""),g&&Tn(),h(we,null),await Vi(k)}async function Vi(s,l,g){const k=l??Ki(),A=`tmp_${k}`,ae=g??A,xe=!l&&nt()===s.viewKey,Ee=xe&&t(zn);fa.set(k,s);const Xe=zl(k,s,ae);l?kn(t(B).map(st=>st.id===ae?Xe:st)):nt()===s.viewKey&&(kn([...t(B),Xe]),Gi());const qe=s.directConversationID?`/api/dms/${s.directConversationID}/messages`:`/api/channels/${s.channelID}/messages`,Se={body:s.body,nonce:k};s.quotedMessageID&&(Se.quoted_message_id=s.quotedMessageID);try{let Me=(await at(qe,{method:"POST",body:JSON.stringify(Se)})).message;if(s.upload)try{await at(`/api/messages/${Me.id}/attachments`,{method:"POST",body:JSON.stringify({upload_id:s.upload.id})}),Me={...Me,attachments:[...Me.attachments||[],s.upload]}}catch(At){console.warn("attachment failed",At);const sn={...Me,nonce:k,status:"failed",attachments:s.upload?[...Me.attachments||[],s.upload]:Me.attachments};kn(t(B).map(vn=>vn.id===ae?sn:vn));return}fa.delete(k),t(B).findIndex(At=>At.id===ae)>=0?kn(t(B).map(At=>At.id===ae?Me:At)):t(B).some(At=>At.id===Me.id)?kn(t(B).map(At=>At.id===Me.id?Me:At)):Gn(Me,nt())&&!t(B).some(At=>At.id===Me.id)&&kn([...t(B),Me]),nt()===s.viewKey&&xe&&(Ee&&await Ni(),await Gi(),Aa({all:!0,seq:Me.channel_seq||0}))}catch(st){console.warn("send failed",st),kn(t(B).map(Me=>Me.id===ae?{...Me,status:"failed"}:Me))}}function Bl(s){if(!s.nonce)return;const l=fa.get(s.nonce);if(!l){Yi(s);return}Vi({...l,viewKey:l.viewKey},s.nonce,s.id)}function Yi(s){s.nonce&&fa.delete(s.nonce),kn(t(B).filter(l=>l.id!==s.id))}async function Fl(s){await sr(s.id,s),t(S)&&t(q)?.route_id&&window.location.pathname!==na(t(S),t(q).id)&&await Qt(t(S),t(q).id)}async function sr(s,l){h(de,null),l&&h(q,l),h(ct,"thread");const g=await at(`/api/messages/${s}/thread`),k={...g.root,thread_state:g.thread_state};h(q,k),kn(t(B).map(A=>A.id===k.id?k:A)),h(J,g.replies),h(ye,g.thread_state)}async function Hl(s){const l=await at(`/api/messages/${s}/thread`),g={...l.root,thread_state:l.thread_state};kn(t(B).map(k=>k.id===g.id?g:k))}function Wl(s,l){const g=t(B).find(xe=>xe.id===s);if(!g)return!1;const k=new Date(l.created_at).getTime();if(Number.isFinite(k)&&kae}async function Zi(){const s=t(ze).trim();if(!s||!t(q))return;const l=t(Le)&&t(lt)==="thread"?t(Le):null;h(ze,"");const g={body:s,nonce:Ki()};l&&(g.quoted_message_id=l.id);const k=await at(`/api/messages/${t(q).id}/thread/replies`,{method:"POST",body:JSON.stringify(g)});l&&Tn(),t(J).some(A=>A.id===k.message.id)||h(J,[...t(J),k.message]),h(ye,k.thread_state)}function Xi(s,l){h(Le,s),h(lt,l),h(ct,l==="thread"?"thread":"message")}function Ji(){return t(re)!==null||t(ut)||t(X)||t(Te)}function Gl(){return t(ct)==="thread"&&t(q)&&t(pt)?t(pt):t(Cn)}function Tn(){h(Le,null),h(lt,null)}async function Qi(s){const l=s.quoted_message_id;if(!l)return;if(t(Lt)?.scrollToMessage(l)??!1){await $i(l);return}const k=await at(`/api/messages/${l}`);Gn(k.message,nt())&&await Ur(k.message)}async function Kl(){L=Date.now()+1200,!(t(f)&&t(Lt)?.scrollToDivider(!1))&&await jl()}async function jl(){const s=nt();if(!s)return;L=Date.now()+1200;const l=Il(s),g=Ut.get(s),A=(g?.boundarySeq===l?g.boundarySeq:l)+1;A<=0||(await ts(A),await Vn(),t(Lt)?.scrollToDivider(!1))}async function $i(s){await Vn();const l=document.querySelector(`[data-message-id="${CSS.escape(s)}"]`);l&&(l.classList.add("highlight"),window.setTimeout(()=>l.classList.remove("highlight"),1500))}async function Vl(){if(!t(S)||!t(Ke).trim()){h(He,[]);return}if(t(N)){h(He,[]);return}const s=new URLSearchParams({workspace_id:t(S),q:t(Ke).trim()});t(I)&&s.set("channel_id",t(I));const l=await at(`/api/search?${s.toString()}`);h(He,l.results)}function es(){h(Ke,""),h(He,[])}async function Yl(s){h(He,[]);const l=s.message.channel_id||s.message.direct_conversation_id||"";!t(S)||!l||(nt()!==l&&(await Qt(t(S),l),await $a(t(S),l)),nt()===l&&await Ur(s.message))}async function Ur(s){const l=s.channel_seq||0;if(l<=0){await Fn();return}await ts(l,s.id)}async function ts(s,l=""){const g=nt();if(!g)return;l&&Nt.set(g,{atBottom:!1,anchorMessageID:l,anchorPixelOffset:0});const k=g!==t(Q);tr(),k&&h(Ae,!0);try{const A=await at(Sa(`around_seq=${encodeURIComponent(String(s))}&limit=${ur}`));if(nt()!==g)return;Hn(g,da(A),"around"),await Vn(),l&&(t(Lt)?.scrollToMessage(l),await $i(l))}finally{nt()===g&&h(Ae,!1)}}async function Zl(s){const l=s.currentTarget,g=l.files?.[0];if(!g||!t(S))return;const k=await Uu(g),A=new FormData;A.set("workspace_id",t(S)),A.set("file",g),k.width>0&&A.set("width",String(k.width)),k.height>0&&A.set("height",String(k.height)),k.durationMS>0&&A.set("duration_ms",String(k.durationMS));const ae=await at("/api/uploads",{method:"POST",body:A});h(we,ae.upload),l.value=""}async function Ea(){if(!t(S))return;const s=await at(`/api/dms?workspace_id=${t(S)}`);h(z,s.conversations)}function or(s){h(z,t(z).some(l=>l.id===s.id)?t(z).map(l=>l.id===s.id?s:l):[...t(z),s])}async function Xl(s){const l=s.trim();l&&(await as(l),h(Ce,""),h(Te,!1))}async function ns(s){h(Ue,!1);const l=na(t(S),s);s===t(N)&&!t(I)&&window.location.pathname===l||await Qt(t(S),s)}async function as(s){const l=s.trim();if(!t(S)||!l)return;const g=t(z).find(A=>A.members.some(ae=>ae.id===l));if(g){h(Ue,!1),await Qt(t(S),g.id);return}const k=await at("/api/dms",{method:"POST",body:JSON.stringify({workspace_id:t(S),member_ids:[l]})});or(k.conversation),h(Ue,!1),await Qt(t(S),k.conversation.id)}function rs(){mn&&clearTimeout(mn),mn=void 0,h(Bn,null)}function Jl(s,l){rs(),h(Bn,{conversation:s,restoreRoute:l,title:sa(s,t(j)?.id)}),mn=setTimeout(()=>{h(Bn,null),mn=void 0},8e3)}async function Ql(){const s=t(Bn);if(s){rs();try{const l=await at(`/api/dms/${s.conversation.id}/open`,{method:"POST"});or(l.conversation),s.restoreRoute&&await Qt(s.conversation.workspace_id,l.conversation.id),h(Oe,"direct message restored")}catch(l){h(Oe,l instanceof Error?l.message:"Could not restore direct message")}}}async function $l(s){if(!s)return;const l=t(z).find(k=>k.id===s),g=t(N)===s;if(await at(`/api/dms/${s}`,{method:"DELETE"}),h(z,t(z).filter(k=>k.id!==s)),l&&Jl(l,g),g){Ta();const k=t(M)[0]?.id||"";h(N,""),h(I,k),k&&Qa(t(S),k),await Qt(t(S),k),await Fn()}}function ec(){Kt?.close(),Kt=null,h(It,!1),t(S)&&(Kt=dd({workspaceID:t(S),onEvent:s=>{tc(s)},onStatusChange:s=>h(It,s)}))}async function tc(s){if(s.type==="typing.started"||s.type==="typing.stopped"){ac(s);return}if(s.type==="agent.progress"){rc(s);return}if(s.type==="channel.read"||s.type==="dm.read"){nc(s);return}if((s.type==="channel.created"||s.type==="channel.updated")&&s.workspace_id===t(S)){await ua(!1,!1,!1);return}if(s.type==="member.moderation_updated"&&s.workspace_id===t(S)){const k=t(N),A=s.payload.user_id===t(j)?.id;if(await ka(),await Ir(),await ua(!1,A,A),A){if(await Ea(),k&&(t(z).some(ae=>ae.id===k)?(h(N,k),h(I,"")):h(N,"")),!t(I)&&!t(N)){Hn("",da({messages:[],oldest_seq:0,newest_seq:0,has_older:!1,has_newer:!1}),"replace");return}await Fn()}return}if(Nl(s))return;const l=s.channel_id===t(I)||s.payload.direct_conversation_id===t(N);if(Dl(s,l),s.type==="message.created"&&!l&&(await Ol(s)||is(s)),l&&(s.type==="message.created"||s.type==="message.updated"||s.type==="message.deleted")){const k=s.payload.nonce;if(s.type==="message.created"&&k&&fa.has(k))return;const A=Pr();s.type==="message.created"&&!A?(L=Date.now()+1200,wl(nt())):s.type==="message.created"?await qi():await Fn(),s.type==="message.created"&&is(s,A),s.type==="message.created"&&A&&(await ir(),Aa({all:!0,seq:Mr(s)}))}const g=s.payload.root_message_id||s.payload.message_id;g&&s.type==="thread.state_updated"&&Wl(g,s)?t(q)?.id===g?await sr(g,t(q)):await Hl(g):s.type!=="thread.reply_created"&&t(q)&&g===t(q).id&&await sr(t(q).id,t(q))}function nc(s){const l=s.payload,g=typeof l.user_id=="string"?l.user_id:"";if(!g||g!==t(j)?.id)return;const k=s.seq??l.last_read_seq??l.seq,A=typeof k=="number"?k:Number(k)||0;if(s.type==="channel.read"){const ae=typeof l.channel_id=="string"?l.channel_id:s.channel_id||"";if(!ae)return;h(M,t(M).map(xe=>{if(xe.id!==ae)return xe;const Ee=Math.max(xe.last_read_seq||0,A);return{...xe,last_read_seq:Ee,unread_count:Ee>=(xe.last_seq||0)?0:xe.unread_count||0}}))}else{const ae=typeof l.direct_conversation_id=="string"?l.direct_conversation_id:"";if(!ae)return;h(z,t(z).map(xe=>{if(xe.id!==ae)return xe;const Ee=Math.max(xe.last_read_seq||0,A);return{...xe,last_read_seq:Ee,unread_count:Ee>=(xe.last_seq||0)?0:xe.unread_count||0}}))}}function is(s,l){const g=s.payload,k=typeof g.kind=="string"?g.kind:"";if(k==="agent_commentary"||k==="agent_tool")return;const A=typeof g.author_id=="string"?g.author_id:"";if(A&&A===t(j)?.id||g.parent_message_id)return;const ae=Mr(s),{channelID:xe,dmID:Ee}=Nr(s);if(xe){const Xe=xe===t(I)&&!t(N),qe=Xe?l??Pr():!1,Se=t(M).find(Me=>Me.id===xe),st=ae>0?ae:(Se?.last_seq||0)+1;Xe&&!qe&&(Se?.unread_count||0)===0&&Wi(xe,Se?.last_read_seq||0,s.created_at),h(M,t(M).map(Me=>{if(Me.id!==xe)return Me;const rn=Math.max(Me.last_seq||0,st),At=Xe&&!qe&&(Me.unread_count||0)===0?Math.max(Me.last_read_seq||0,st-1):Me.last_read_seq||0,sn=qe?0:(Me.unread_count||0)+1;return{...Me,last_seq:rn,last_read_seq:At,unread_count:sn}}))}else if(Ee){const Xe=Ee===t(N),qe=Xe?l??Pr():!1,Se=t(z).find(Me=>Me.id===Ee),st=ae>0?ae:(Se?.last_seq||0)+1;Xe&&!qe&&(Se?.unread_count||0)===0&&Wi(Ee,Se?.last_read_seq||0,s.created_at),h(z,t(z).map(Me=>{if(Me.id!==Ee)return Me;const rn=Math.max(Me.last_seq||0,st),At=Xe&&!qe&&(Me.unread_count||0)===0?Math.max(Me.last_read_seq||0,st-1):Me.last_read_seq||0,sn=qe?0:(Me.unread_count||0)+1;return{...Me,last_seq:rn,last_read_seq:At,unread_count:sn}}))}}function ac(s){const l=s.payload,g=typeof l.user_id=="string"?l.user_id:"";if(!g||g===t(j)?.id)return;const k=s.channel_id||(typeof l.channel_id=="string"?l.channel_id:""),A=typeof l.direct_conversation_id=="string"?l.direct_conversation_id:"";if(!(t(I)&&k===t(I)||t(N)&&A===t(N)))return;if(s.type==="typing.stopped"){h(qt,t(qt).filter(Xe=>Xe.userID!==g));return}const xe=ss(g),Ee=t(qt).filter(Xe=>Xe.userID!==g);Ee.push({userID:g,user:xe,expiresAt:Date.now()+Ag}),h(qt,Ee),sc()}function rc(s){const l=s.payload,g=s.channel_id||(typeof l.channel_id=="string"?l.channel_id:""),k=typeof l.direct_conversation_id=="string"?l.direct_conversation_id:"";if(!(t(I)&&g===t(I)||t(N)&&k===t(N)))return;const ae=typeof l.turn_id=="string"?l.turn_id:"",xe=typeof l.op=="string"?l.op:"";if(!ae||!xe)return;if(xe==="clear"){h(tt,t(tt).filter(Kn=>Kn.turnId!==ae));return}const Ee=l.line,Xe=Ee&&typeof Ee.id=="string"?Ee.id:"";if(!Xe)return;const qe=Ee&&typeof Ee.text=="string"?Ee.text:"",Se=Ee&&typeof Ee.title=="string"?Ee.title:"",st=qe||Se,Me=Ee&&typeof Ee.tool_name=="string"?Ee.tool_name:typeof Ee?.toolName=="string"?Ee.toolName:void 0,rn=Ee&&typeof Ee.status=="string"?Ee.status:void 0,At=Ee&&typeof Ee.kind=="string"?Ee.kind:void 0,sn=t(tt).find(Kn=>Kn.turnId===ae),vn=sn?.lines.find(Kn=>Kn.id===Xe),Jn={id:Xe,kind:At??vn?.kind??"lifecycle",text:st||vn?.text||"",toolName:Me??vn?.toolName,status:rn??vn?.status,finalized:xe==="finalize"||(vn?.finalized??!1)};if(!vn&&!Jn.text&&!Jn.toolName)return;const lr=typeof l.user_id=="string"?l.user_id:"",Ia=Date.now()+Ig;if(!sn)h(tt,[...t(tt),{turnId:ae,userId:lr,lines:[Jn],expiresAt:Ia}]);else{const Kn=sn.lines.some(on=>on.id===Xe)?sn.lines.map(on=>on.id===Xe?Jn:on):[...sn.lines,Jn];h(tt,t(tt).map(on=>on.turnId===ae?{...on,lines:Kn,expiresAt:Ia}:on))}ic()}function ic(){wt||(wt=window.setInterval(()=>{const s=Date.now(),l=t(tt).filter(g=>g.expiresAt>s);l.length!==t(tt).length&&h(tt,l),l.length===0&&wt&&(window.clearInterval(wt),wt=void 0)},1e3))}function ss(s){if(t(j)?.id===s)return t(j);const l=t(B).find(g=>g.author?.id===s)?.author;if(l)return l;for(const g of t(z)){const k=g.members.find(A=>A.id===s);if(k)return k}}function sc(){jt||(jt=window.setInterval(()=>{const s=Date.now(),l=t(qt).filter(g=>g.expiresAt>s);l.length!==t(qt).length&&h(qt,l),l.length===0&&jt&&(window.clearInterval(jt),jt=void 0)},1e3))}function oc(){t(S)&&(!t(I)&&!t(N)||vd({workspaceID:t(S),channelID:t(I)||void 0,directConversationID:t(N)||void 0}))}function os(s){s&&(h(q,null),h(de,s),(t(r)==="owner"||t(r)==="moderator")&&!t(pe).some(l=>l.user.id===s.id)&&Ir())}function lc(s){if(s.key==="Escape"&&t(Le)&&t(lt)!=="thread"){s.preventDefault(),Tn();return}s.key==="Enter"&&!s.shiftKey&&(s.preventDefault(),ji())}function cc(s){if(s.key==="Escape"&&t(Le)&&t(lt)==="thread"){s.preventDefault(),Tn();return}s.key==="Enter"&&!s.shiftKey&&(s.preventDefault(),Zi())}function qr(s,l){h(re,{url:s,title:l})}function ls(s){const l=s.target;l instanceof HTMLImageElement&&l.closest(".markdown")&&(s.preventDefault(),qr(Fu(l),l.alt||"Image"))}function zr(s){const l=t(ge)&&!t(ge).endsWith(` +`)?` +`:"";h(ge,`${t(ge)}${l}${s}`)}function uc(s,l=s){zr(`${s}${s==="```"?` +code +`:"text"}${l}`)}function dc(s,l){zr(`![${l}](${s})`),h(Pe,!1),h(De,"")}function Br(){const s=t(q)!==null,l=nt();t(lt)==="thread"&&Tn(),h(q,null),h(de,null),h(ct,"message"),h(J,[]),s&&t(S)&&l&&Qt(t(S),l)}function fc(){t(x)?Br():h(Oe,"pick a message to open its thread")}function hc(s){if(s.key==="Escape")if(Ji())Ca();else if(t(Ue)){s.preventDefault(),Fr();return}else if(t(Le)){s.preventDefault(),Tn();return}else{s.preventDefault(),ql();return}if(t(Ue)&&s.key.length===1&&!s.ctrlKey&&!s.metaKey&&!s.altKey&&!s.isComposing){const l=document.activeElement;if(!(l instanceof HTMLInputElement)&&!(l instanceof HTMLTextAreaElement)&&!(l instanceof HTMLSelectElement)&&!(l instanceof HTMLElement&&l.isContentEditable)){s.preventDefault();return}}ud(s,{authRequired:t(Gt),isModalOpen:()=>Ji()||t(Ue),messageInput:t(Cn),replyInput:t(pt),target:Gl})}function Ca(){h(re,null),h(ut,!1),h(X,!1),h(Te,!1)}function Fr(){h(Ue,!1)}function gc(){if(t(Ue)&&window.matchMedia(W).matches){Fr();return}h(Be,!t(Be))}Rt(()=>(t(V),t(S)),()=>{h(a,t(V).find(s=>s.id===t(S)))}),Rt(()=>t(a),()=>{h(r,t(a)?.role||"")}),Rt(()=>(t(de),t(pe)),()=>{h(i,t(de)?t(pe).find(s=>s.user.id===t(de)?.id):void 0)}),Rt(()=>(t(M),t(I)),()=>{h(o,t(M).find(s=>s.id===t(I)))}),Rt(()=>(t(z),t(N)),()=>{h(c,t(z).find(s=>s.id===t(N)))}),Rt(()=>(t(N),t(I)),()=>{h(te,t(N)||t(I)||"")}),Rt(()=>(t(N),t(z),t(I),t(M)),()=>{h(d,t(N)?t(z).find(s=>s.id===t(N))||{}:t(I)?t(M).find(s=>s.id===t(I))||{}:{})}),Rt(()=>(t(te),t(d)),()=>{h(u,nr(t(te),t(d)))}),Rt(()=>(t(u),t(d)),()=>{h(m,t(u)>0&&t(d).last_read_seq||0)}),Rt(()=>(t(u),t(te),t(m),t(je)),()=>{h(f,t(u)>0?ar(t(te),t(m),t(je)):!1)}),Rt(()=>(t(u),t(te),t(m),t(je)),()=>{h(b,t(u)>0?Pl(t(te),t(m),t(je)):"")}),Rt(()=>(t(B),t(Ct),t(yt),t(gn)),()=>{h(w,td(t(B),{hideCommentary:t(Ct),hideToolCalls:t(yt)},t(gn)))}),Rt(()=>t(tt),()=>{h(C,t(tt).some(s=>s.lines.some(l=>!l.finalized)))}),Rt(()=>(t(q),t(de)),()=>{h(x,t(q)!==null||t(de)!==null)}),Rt(()=>(t(B),t(z),t(j)),()=>{h(E,Yu(t(B),t(z),t(j)?.id||""))}),Rt(()=>(t(j),t(E),t(pe),t(c)),()=>{h(_e,pl(t(j),t(E),t(pe),t(c)))}),Rt(()=>(t(lt),t(Le),t(B)),()=>{t(lt)==="channel"&&t(Le)&&!t(B).some(s=>s.id===t(Le)?.id)&&Tn()}),Rt(()=>(t(lt),t(Le),t(B)),()=>{t(lt)==="dm"&&t(Le)&&!t(B).some(s=>s.id===t(Le)?.id)&&Tn()}),Rt(()=>(t(lt),t(Le),t(q),t(J)),()=>{t(lt)==="thread"&&t(Le)&&t(q)&&t(Le).id!==t(q).id&&!t(J).some(s=>s.id===t(Le)?.id)&&Tn()}),Rt(()=>(t(Oe),t(j),Fa(ue()),Fa(ce()),t(pn)),()=>{t(Oe)==="ready"&&t(j)&&ta(ue(),ce())!==t(pn)&&$a(ue(),ce())}),Rt(()=>(t(Pe),t(De)),()=>{h(T,t(Pe)?Bu.filter(s=>{const l=t(De).trim().toLowerCase();return!l||s.title.toLowerCase().includes(l)||s.tags.some(g=>g.includes(l))}):[])}),uu(),Pu();var cs=bn();xu("1oa2eo8",s=>{var l=Fp();O(s,l)}),un("keydown",ws,hc,!0),un("pointerdown",ws,function(...s){rd?.apply(this,s)},!0);var pc=Ft(cs);{var mc=s=>{var l=Hp();O(s,l)},vc=s=>{var l=Kp(),g=Ft(l);let k;var A=_(g),ae=_(A);{var xe=Ie=>{var Je=Mn("×");O(Ie,Je)},Ee=Ie=>{var Je=Wp();O(Ie,Je)};le(ae,Ie=>{t(Ue)?Ie(xe):Ie(Ee,-1)})}p(A);var Xe=y(A,2);{var qe=Ie=>{var Je=Gp();$("click",Je,Fr),O(Ie,Je)};le(Xe,Ie=>{t(Ue)&&Ie(qe)})}var Se=y(Xe,2);jg(Se,{get workspaces(){return t(V)},get selectedWorkspaceID(){return t(S)},get workspaceName(){return t(ve)},get showWorkspaceCreate(){return t(Ne)},hrefForWorkspace:Ie=>na(Ie),onSelectWorkspace:Ie=>{hl(Ie)},onToggleWorkspaceCreate:()=>h(Ne,!t(Ne)),onWorkspaceName:Ie=>h(ve,Ie),onCreateWorkspace:()=>{fl()}});var st=y(Se,2);{let Ie=Zt(()=>(t(a),ln(()=>t(a)?.name))),Je=Zt(()=>(t(Bn),ln(()=>t(Bn)?.title)));up(st,{get workspaceName(){return t(Ie)},get status(){return t(Oe)},get connected(){return t(It)},get sidebarCollapsed(){return t(Be)},get channels(){return t(M)},get directConversations(){return t(z)},get recentPeople(){return t(E)},get currentUser(){return t(j)},get selectedChannelID(){return t(I)},get selectedDirectID(){return t(N)},get selectedProfile(){return t(de)},onToggleCollapse:gc,hrefForChannel:Ze=>na(t(S),Ze),hrefForDirect:Ze=>na(t(S),Ze),onSelectChannel:Ze=>{Mi(Ze)},onCreateChannel:()=>h(X,!0),onSelectDirect:Ze=>{ns(Ze)},onCreateDirect:()=>h(Te,!0),onHideDirect:Ze=>{$l(Ze)},get hiddenDirectTitle(){return t(Je)},onUndoHideDirect:()=>{Ql()},onOpenProfile:os,onOpenSettings:We})}var Me=y(st,2),rn=_(Me);{let Ie=Zt(()=>(t(a),ln(()=>t(a)?.name))),Je=Zt(()=>(t(j),ln(()=>t(j)?.id))),Ze=Zt(()=>t(q)!==null);Bp(rn,{get selectedDirect(){return t(c)},get selectedChannel(){return t(o)},get workspaceName(){return t(Ie)},get currentUserID(){return t(Je)},get searchQuery(){return t(Ke)},get sidePanelOpen(){return t(x)},get threadOpen(){return t(Ze)},onSearchQuery:zt=>h(Ke,zt),onSearch:()=>{Vl()},onResetSearch:es,onToggleThread:fc,onPinnedItems:()=>h(Oe,"no pinned items")})}var At=y(rn,2);Ip(At,{get results(){return t(He)},onClose:()=>h(He,[]),onOpenResult:Ie=>{Yl(Ie)}});var sn=y(At,2);{let Ie=Zt(()=>t(dn)!=="idle"),Je=Zt(()=>(t(q),ln(()=>t(q)?.id))),Ze=Zt(()=>(t(j),ln(()=>t(j)?.id)));xg(sn,{get messages(){return t(w)},get selectedDirect(){return t(c)},get selectedChannel(){return t(o)},get restoreState(){return t(he)},get viewKey(){return t(Q)},get loading(){return t(Ae)},get unreadCount(){return t(u)},get unreadBoundarySeq(){return t(m)},get unreadBoundaryLoaded(){return t(f)},get unreadSince(){return t(b)},get hasOlder(){return t(En)},get hasNewer(){return t(zn)},get loadingOlder(){return t(wn)},get loadingNewer(){return t(ea)},get prepending(){return t(Ie)},get selectedThreadID(){return t(Je)},get currentUserID(){return t(Ze)},onListRef:zt=>h(Lt,zt),onActivateMessageComposer:()=>h(ct,"message"),onInlineImagePointerUp:ls,onOpenProfile:os,onReply:Xi,onOpenThread:Fl,onJumpToQuote:zt=>{Qi(zt)},onOpenImage:qr,onLoadOlder:Pi,onLoadNewer:zt=>Ui(zt==="wheel"),onJumpToUnread:()=>{Kl()},onHistorySettled:Sl,onReachedBottom:Aa,onMarkRead:zt=>{Aa({all:!0,seq:zt})},onRetry:Bl,onDiscard:Yi})}var vn=y(sn,2);Ng(vn,{get turns(){return t(tt)}});var Jn=y(vn,2);{let Ie=Zt(()=>(t(j),ln(()=>t(j)?.id)));Cg(Jn,{get entries(){return t(qt)},get currentUserID(){return t(Ie)}})}var lr=y(Jn,2),Ia=_(lr);Lg(Ia,{get active(){return t(C)}});var Kn=y(Ia,2);{let Ie=Zt(()=>(t(c),Fa(sa),t(j),t(o),ln(()=>t(c)?`Message ${sa(t(c),t(j)?.id)}`:t(o)?`Message #${t(o).name}`:"Pick a channel to start"))),Je=Zt(()=>t(Le)&&t(lt)===(t(N)?"dm":"channel")?t(Le):null),Ze=Zt(()=>t(I)?t(me):[]);Uo(Kn,{get value(){return t(ge)},get placeholder(){return t(Ie)},ariaLabel:"Message body",submitLabel:"Send",get pendingUpload(){return t(we)},get replyTarget(){return t(Je)},showUpload:!0,showToolbar:!0,get showGifPicker(){return t(Pe)},get gifQuery(){return t(De)},get filteredGifs(){return t(T)},get slashCommands(){return t(Ze)},get mentionPeople(){return t(_e)},onValue:zt=>{const Ec=t(ge);h(ge,zt),zt.trim()&&zt!==Ec?oc():zt.trim()||fr()},onSubmit:()=>{ji()},onKeydown:lc,onFocus:()=>h(ct,"message"),onInputRef:zt=>h(Cn,zt),onUploadFile:Zl,onRemoveUpload:()=>h(we,null),onClearReply:Tn,onApplyMarkdownWrap:uc,onAppendToComposer:zr,onToggleGif:()=>h(Pe,!t(Pe)),onGifQuery:zt=>h(De,zt),onPickGif:dc})}p(lr),p(Me);var on=y(Me,2);let us;var _c=_(on);{var bc=Ie=>{{let Je=Zt(()=>t(Le)&&t(lt)==="thread"?t(Le):null);Op(Ie,{get root(){return t(q)},get replies(){return t(J)},get threadState(){return t(ye)},get replyBody(){return t(ze)},get replyTarget(){return t(Je)},get mentionPeople(){return t(_e)},onClose:Br,onReplyBody:Ze=>h(ze,Ze),onSubmitReply:()=>{Zi()},onReplyKeydown:cc,onReplyFocus:()=>h(ct,"thread"),onReplyInputRef:Ze=>h(pt,Ze),onSetReplyTarget:Xi,onClearReply:Tn,onActivateThreadComposer:()=>h(ct,"thread"),onInlineImagePointerUp:ls,onJumpToQuote:Ze=>{Qi(Ze)},onOpenImage:qr})}},yc=Ie=>{{let Je=Zt(()=>(t(a),ln(()=>t(a)?.name)));wp(Ie,{get profile(){return t(de)},get currentUser(){return t(j)},get workspaceName(){return t(Je)},get currentUserRole(){return t(r)},get moderation(){return t(i)},onClose:Br,onEdit:We,onMessage:Ze=>{as(Ze)},onApprove:Ze=>{er(Ze,{role:"member",clear_timeout:!0,blocked:!1})},onTimeout:Ze=>{er(Ze,{timeout_minutes:60})},onBlock:Ze=>{er(Ze,{blocked:!0})},onUnblock:Ze=>{er(Ze,{blocked:!1,clear_timeout:!0})},onSetStatus:()=>h(Oe,"status messages are coming soon")})}},wc=Ie=>{Dp(Ie)};le(_c,Ie=>{t(q)?Ie(bc):t(de)?Ie(yc,1):Ie(wc,-1)})}p(on),p(g);var ds=y(g,2);{var kc=Ie=>{Ap(Ie,{get user(){return t(j)},get displayName(){return t(Re)},get handle(){return t(rt)},get avatarURL(){return t(Ye)},get pushoverEnabled(){return t(kt)},get pushoverUserKey(){return t(St)},get hideCommentary(){return t(Ct)},get hideToolCalls(){return t(yt)},get userAlign(){return t(Ve)},get browserNotificationsSupported(){return t(mt)},get browserNotificationsEnabled(){return t(bt)},get browserNotificationPermission(){return t(Ht)},get status(){return t(Tt)},get statusError(){return t(vt)},onDisplayName:Je=>h(Re,Je),onHandle:Je=>h(rt,Je),onAvatarURL:Je=>h(Ye,Je),onPushoverEnabled:Je=>h(kt,Je),onPushoverUserKey:Je=>h(St,Je),onHideCommentary:F,onHideToolCalls:fe,onUserAlign:v,onBrowserNotificationsEnabled:Je=>{wa(Je)},onClose:Ca,onSave:()=>{Dt()}})};le(ds,Ie=>{t(ut)&&t(j)&&Ie(kc)})}var fs=y(ds,2);{var Tc=Ie=>{qg(Ie,{get channelName(){return t(ke)},status:"",onChannelName:Je=>h(ke,Je),onClose:Ca,onCreate:()=>{ml()}})};le(fs,Ie=>{t(X)&&Ie(Tc)})}var hs=y(fs,2);{var Sc=Ie=>{{let Je=Zt(()=>(t(j),ln(()=>t(j)?.id)));Hg(Ie,{get people(){return t(E)},get currentUserID(){return t(Je)},get memberID(){return t(Ce)},onMemberID:Ze=>h(Ce,Ze),onClose:Ca,onStart:Ze=>{Xl(Ze)}})}};le(hs,Ie=>{t(Te)&&Ie(Sc)})}var xc=y(hs,2);{var Ac=Ie=>{Bd(Ie,{get url(){return t(re),ln(()=>t(re).url)},get title(){return t(re),ln(()=>t(re).title)},onClose:Ca})};le(xc,Ie=>{t(re)&&Ie(Ac)})}se(()=>{k=Qe(g,1,"shell",null,k,{"nav-open":t(Ue),"sidebar-collapsed":t(Be),"thread-open":t(x)}),ne(A,"aria-expanded",t(Ue)),Me.inert=t(Ue),us=Qe(on,1,"thread",null,us,{open:t(x)}),on.inert=t(Ue),ne(on,"aria-label",t(de)?"Profile pane":"Thread pane")}),$("click",A,()=>h(Ue,!t(Ue))),O(s,l)};le(pc,s=>{t(Gt)?s(mc):s(vc,-1)})}O(n,cs),gt()}_t(["click"]);export{em as C,wu as a,Bt as e,xu as h,Pu as i,ne as s}; diff --git a/apps/api/internal/webassets/dist/_app/immutable/chunks/D6tJMEHh.js b/apps/api/internal/webassets/dist/_app/immutable/chunks/D6tJMEHh.js deleted file mode 100644 index 40b81dc9..00000000 --- a/apps/api/internal/webassets/dist/_app/immutable/chunks/D6tJMEHh.js +++ /dev/null @@ -1,66 +0,0 @@ -import{b as ir,a as z,f as V,t as In,c as yn}from"./BQbSjbnU.js";import{h as at,y as Hn,aw as $s,aI as eo,a5 as li,B as Ua,b as ci,I as t,J as ac,a9 as rc,K as rs,D as Nn,L as Gn,i as Rn,ar as ui,az as ic,ai as is,g as sc,f as pa,aJ as oc,s as lc,_ as Kt,aK as to,ay as di,aL as cc,a7 as ss,aM as uc,aN as dc,aD as se,e as Oa,aO as Dn,aP as no,X as fc,r as ao,c as ro,aQ as Nr,aR as hc,aS as gc,m as pc,d as lr,at as cr,t as oe,x as io,aT as mc,aA as vc,au as _c,w as so,aU as oo,aV as bc,aW as yc,E as wc,an as lo,aX as kc,H as fi,k as tn,M as Tc,aY as La,aZ as Sc,a_ as co,a$ as os,b0 as ls,b1 as xc,b2 as Ec,b3 as Ac,b4 as Cc,b5 as Ic,b6 as Fa,b7 as Rc,b8 as Dc,b9 as Mc,ba as Nc,bb as Oc,j as Lc,aE as Gr,u as nn,bc as cs,bd as Pc,a1 as Uc,be as qc,p as vt,o as b,v as k,q as v,a as _t,V as h,aG as ht,aH as ce,G as On,aF as Wn,n as Vt,U as zc,bf as us,bg as Ot,bh as Bc,bi as ds}from"./Dtg1jxvd.js";import{a as Ha,o as uo}from"./C__K3_0V.js";import{i as Fc,a as Hc,d as Q,b as wt,c as Wc,n as Gc,e as Kc,s as ie,f as an,r as fs}from"./D2t05ipP.js";import{p as Oe,i as ue,b as Xn,_ as hs}from"./BT2tP07K.js";import{g as gs}from"./01jLas2k.js";import{B as jc}from"./CpwnOByv.js";import{s as Vc}from"./Cq0K50L1.js";function Yc(n,e){if(e){const a=document.body;n.autofocus=!0,li(()=>{document.activeElement===a&&n.focus()})}}function Zc(n){at&&Hn(n)!==null&&$s(n)}let ps=!1;function Xc(){ps||(ps=!0,document.addEventListener("reset",n=>{Promise.resolve().then(()=>{if(!n.defaultPrevented)for(const e of n.target.elements)e[eo]?.()})},{capture:!0}))}function Jc(n,e){return e}function Qc(n,e,a){for(var r=[],s=e.length,o,c=e.length,d=0;d{if(o){if(o.pending.delete(_),o.done.add(_),o.pending.size===0){var w=n.outrogroups;Kr(n,di(o.done)),w.delete(o),w.size===0&&(n.outrogroups=null)}}else c-=1},!1)}if(c===0){var u=r.length===0&&a!==null;if(u){var m=a,f=m.parentNode;$s(f),f.append(m),n.items.clear()}Kr(n,e,!u)}else o={pending:new Set(e),done:new Set},(n.outrogroups??=new Set).add(o)}function Kr(n,e,a=!0){var r;if(n.pending.size>0){r=new Set;for(const c of n.pending.values())for(const d of c)r.add(n.items.get(d).e)}for(var s=0;s{var U=a();return to(U)?U:U==null?[]:di(U)}),w,A=new Map,x=!0;function C(U){(M.effect.f&fc)===0&&(M.pending.delete(U),M.fallback=f,$c(M,w,c,e,r),f!==null&&(w.length===0?(f.f&Dn)===0?ao(f):(f.f^=Dn,Da(f,null,c)):ro(f,()=>{f=null})))}function T(U){M.pending.delete(U)}var E=ci(()=>{w=t(_);var U=w.length;let F=!1;if(at){var Y=ac(c)===rc;Y!==(U===0)&&(c=rs(),Nn(c),Gn(!1),F=!0)}for(var O=new Set,Z=sc,N=lc(),L=0;Lo(c)):(f=pa(()=>o(ms??=Oa())),f.f|=Dn)),U>O.size&&oc(),at&&U>0&&Nn(rs()),!x)if(A.set(Z,O),N){for(const[D,P]of d)O.has(D)||Z.skip_effect(P.e);Z.oncommit(C),Z.ondiscard(T)}else C(Z);F&&Gn(!0),t(_)}),M={effect:E,items:d,pending:A,outrogroups:null,fallback:f};x=!1,at&&(c=Rn)}function Sa(n){for(;n!==null&&(n.f&hc)===0;)n=n.next;return n}function $c(n,e,a,r,s){var o=(r&gc)!==0,c=e.length,d=n.items,u=Sa(n.effect.first),m,f=null,_,w=[],A=[],x,C,T,E;if(o)for(E=0;E0){var L=(r&no)!==0&&c===0?a:null;if(o){for(E=0;E{if(_!==void 0)for(T of _)T.nodes?.a?.apply()})}function eu(n,e,a,r,s,o,c,d){var u=(c&uc)!==0?(c&dc)===0?se(a,!1,!1):ss(a):null,m=(c&cc)!==0?ss(s):null;return{v:u,i:m,e:pa(()=>(o(e,u??a,m??s,d),()=>{n.delete(r)}))}}function Da(n,e,a){if(n.nodes)for(var r=n.nodes.start,s=n.nodes.end,o=e&&(e.f&Dn)===0?e.nodes.start:a;r!==null;){var c=cr(r);if(o.before(r),r===s)return;r=c}}function Zn(n,e,a){e===null?n.effect.first=a:e.next=a,a===null?n.effect.last=e:a.prev=e}function jr(n,e,a=!1,r=!1,s=!1,o=!1){var c=n,d="";if(a){var u=n;at&&(c=Nn(Hn(u)))}oe(()=>{var m=io;if(d===(d=e()??"")){at&&Ua();return}if(a&&!at){m.nodes=null,u.innerHTML=d,d!==""&&ir(Hn(u),u.lastChild);return}if(m.nodes!==null&&(mc(m.nodes.start,m.nodes.end),m.nodes=null),d!==""){if(at){Rn.data;for(var f=Ua(),_=f;f!==null&&(f.nodeType!==ui||f.data!=="");)_=f,f=cr(f);if(f===null)throw vc(),_c;ir(Rn,_),c=Nn(f);return}var w=r?oo:s?bc:void 0,A=so(r?"svg":s?"math":"template",w);A.innerHTML=d;var x=r||s?A:A.content;if(ir(Hn(x),x.lastChild),r||s)for(;Hn(x);)c.before(Hn(x));else c.before(x)}})}function fo(n,e,a,r,s,o){let c=at;at&&Ua();var d=null;at&&Rn.nodeType===yc&&(d=Rn,Ua());var u=at?Rn:n,m=new jc(u,!1);ci(()=>{const f=e()||null;var _=f==="svg"?oo:void 0;if(f===null){m.ensure(null,null);return}return m.ensure(f,w=>{if(f){if(d=at?d:so(f,_),ir(d,d),r){var A=null;at&&Fc(f)&&d.append(A=document.createComment(""));var x=at?Hn(d):d.appendChild(Oa());at&&(x===null?Gn(!1):Nn(x)),r(d,x),A?.remove()}io.nodes.end=d,w.before(d)}at&&Nn(w)}),()=>{}},wc),lo(()=>{}),c&&(Gn(!0),Nn(u))}function tu(n,e){let a=null,r=at;var s;if(at){a=Rn;for(var o=Hn(document.head);o!==null&&(o.nodeType!==ui||o.data!==n);)o=cr(o);if(o===null)Gn(!1);else{var c=cr(o);o.remove(),Nn(c)}}at||(s=document.head.appendChild(Oa()));try{ci(()=>{var d=pa(()=>e(s));d.f|=kc})}finally{r&&(Gn(!0),Nn(a))}}function qa(n,e,a){fi(()=>{var r=tn(()=>e(n,a?.())||{});if(a&&r?.update){var s=!1,o={};Tc(()=>{var c=a();La(c),s&&Sc(o,c)&&(o=c,r.update(c))}),s=!0}if(r?.destroy)return()=>r.destroy()})}function nu(n,e){var a=void 0,r;co(()=>{a!==(a=e())&&(r&&(lr(r),r=null),a&&(r=pa(()=>{fi(()=>a(n))})))})}function ho(n){var e,a,r="";if(typeof n=="string"||typeof n=="number")r+=n;else if(typeof n=="object")if(Array.isArray(n)){var s=n.length;for(e=0;e=0;){var d=c+o;(c===0||vs.includes(r[c-1]))&&(d===r.length||vs.includes(r[d]))?r=(c===0?"":r.substring(0,c))+r.substring(d+1):c=d}}return r===""?null:r}function _s(n,e=!1){var a=e?" !important;":";",r="";for(var s of Object.keys(n)){var o=n[s];o!=null&&o!==""&&(r+=" "+s+": "+o+a)}return r}function Or(n){return n[0]!=="-"||n[1]!=="-"?n.toLowerCase():n}function iu(n,e){if(e){var a="",r,s;if(Array.isArray(e)?(r=e[0],s=e[1]):r=e,n){n=String(n).replaceAll(/\s*\/\*.*?\*\/\s*/g,"").trim();var o=!1,c=0,d=!1,u=[];r&&u.push(...Object.keys(r).map(Or)),s&&u.push(...Object.keys(s).map(Or));var m=0,f=-1;const C=n.length;for(var _=0;_{Vr(n,n.__value)});e.observe(n,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["value"]}),lo(()=>{e.disconnect()})}function bs(n){return"__value"in n?n.__value:n.value}const xa=Symbol("class"),Ea=Symbol("style"),go=Symbol("is custom element"),po=Symbol("is html"),ou=Fa?"link":"LINK",ys=Fa?"input":"INPUT",lu=Fa?"option":"OPTION",cu=Fa?"select":"SELECT",uu=Fa?"progress":"PROGRESS";function dn(n){if(at){var e=!1,a=()=>{if(!e){if(e=!0,n.hasAttribute("value")){var r=n.value;re(n,"value",null),n.value=r}if(n.hasAttribute("checked")){var s=n.checked;re(n,"checked",null),n.checked=s}}};n[eo]=a,li(a),Xc()}}function Mn(n,e){var a=pr(n);a.value===(a.value=e??void 0)||n.value===e&&(e!==0||n.nodeName!==uu)||(n.value=e??"")}function ws(n,e){var a=pr(n);a.checked!==(a.checked=e??void 0)&&(n.checked=e)}function du(n,e){e?n.hasAttribute("selected")||n.setAttribute("selected",""):n.removeAttribute("selected")}function re(n,e,a,r){var s=pr(n);at&&(s[e]=n.getAttribute(e),e==="src"||e==="srcset"||e==="href"&&n.nodeName===ou)||s[e]!==(s[e]=a)&&(e==="loading"&&(n[Ac]=a),a==null?n.removeAttribute(e):typeof a!="string"&&vo(n).includes(e)?n[e]=a:n.setAttribute(e,a))}function fu(n,e,a,r,s=!1,o=!1){if(at&&s&&n.nodeName===ys){var c=n,d=c.type==="checkbox"?"defaultChecked":"defaultValue";d in a||dn(c)}var u=pr(n),m=u[go],f=!u[po];let _=at&&m;_&&Gn(!1);var w=e||{},A=n.nodeName===lu;for(var x in e)x in a||(a[x]=null);a.class?a.class=ur(a.class):a[xa]&&(a.class=null),a[Ea]&&(a.style??=null);var C=vo(n);if(n.nodeName===ys&&"type"in a&&("value"in a||"__value"in a)){var T=a.type;(T!==w.type||T===void 0&&n.hasAttribute("type"))&&(w.type=T,re(n,"type",T))}for(const Z in a){let N=a[Z];if(A&&Z==="value"&&N==null){n.value=n.__value="",w[Z]=N;continue}if(Z==="class"){var E=n.namespaceURI==="http://www.w3.org/1999/xhtml";gt(n,E,N,r,e?.[xa],a[xa]),w[Z]=N,w[xa]=a[xa];continue}if(Z==="style"){na(n,N,e?.[Ea],a[Ea]),w[Z]=N,w[Ea]=a[Ea];continue}var M=w[Z];if(!(N===M&&!(N===void 0&&n.hasAttribute(Z)))){w[Z]=N;var U=Z[0]+Z[1];if(U!=="$$")if(U==="on"){const L={},G="$$"+Z;let K=Z.slice(2);var F=Kc(K);if(Hc(K)&&(K=K.slice(0,-7),L.capture=!0),!F&&M){if(N!=null)continue;n.removeEventListener(K,w[G],L),w[G]=null}if(F)Q(K,n,N),wt([K]);else if(N!=null){let q=function(D){w[Z].call(this,D)};w[G]=Wc(K,n,q,L)}}else if(Z==="style")re(n,Z,N);else if(Z==="autofocus")Yc(n,!!N);else if(!m&&(Z==="__value"||Z==="value"&&N!=null))n.value=n.__value=N;else if(Z==="selected"&&A)du(n,N);else{var Y=Z;f||(Y=Gc(Y));var O=Y==="defaultValue"||Y==="defaultChecked";if(N==null&&!m&&!O)if(u[Z]=null,Y==="value"||Y==="checked"){let L=n;const G=e===void 0;if(Y==="value"){let K=L.defaultValue;L.removeAttribute(Y),L.defaultValue=K,L.value=L.__value=G?K:null}else{let K=L.defaultChecked;L.removeAttribute(Y),L.defaultChecked=K,L.checked=G?K:!1}}else n.removeAttribute(Z);else O||C.includes(Y)&&(m||typeof N!="string")?(n[Y]=N,Y in u&&(u[Y]=Oc)):typeof N!="function"&&re(n,Y,N)}}}return _&&Gn(!0),w}function mo(n,e,a=[],r=[],s=[],o,c=!1,d=!1){Mc(s,a,r,u=>{var m=void 0,f={},_=n.nodeName===cu,w=!1;if(co(()=>{var x=e(...u.map(t)),C=fu(n,m,x,o,c,d);w&&_&&"value"in x&&Vr(n,x.value);for(let E of Object.getOwnPropertySymbols(f))x[E]||lr(f[E]);for(let E of Object.getOwnPropertySymbols(x)){var T=x[E];E.description===Nc&&(!m||T!==m[E])&&(f[E]&&lr(f[E]),f[E]=pa(()=>nu(n,()=>T))),C[E]=T}m=C}),_){var A=n;fi(()=>{Vr(A,m.value,!0),su(A)})}w=!0})}function pr(n){return n[Cc]??={[go]:n.nodeName.includes("-"),[po]:n.namespaceURI===Ic}}var ks=new Map;function vo(n){var e=n.getAttribute("is")||n.nodeName,a=ks.get(e);if(a)return a;ks.set(e,a=[]);for(var r,s=n,o=Element.prototype;o!==s;){r=Dc(s);for(var c in r)r[c].set&&c!=="innerHTML"&&c!=="textContent"&&c!=="innerText"&&a.push(c);s=Rc(s)}return a}function hu(n=!1){const e=Lc,a=e.l.u;if(!a)return;let r=()=>La(e.s);if(n){let s=0,o={};const c=Uc(()=>{let d=!1;const u=e.s;for(const m in u)u[m]!==o[m]&&(o[m]=u[m],d=!0);return d&&s++,s});r=()=>t(c)}a.b.length&&Gr(()=>{Ts(e,r),cs(a.b)}),nn(()=>{const s=tn(()=>a.m.map(Pc));return()=>{for(const o of s)typeof o=="function"&&o()}}),a.a.length&&nn(()=>{Ts(e,r),cs(a.a)})}function Ts(n,e){if(n.l.s)for(const a of n.l.s)t(a);e()}qc();class Yr extends Error{constructor(e,a){super(a),this.status=e}status}async function nt(n,e={}){const a=new Headers(e.headers),r=(e.method??"GET").toUpperCase();a.set("Accept","application/json"),e.body&&!(e.body instanceof FormData)&&a.set("Content-Type","application/json"),["GET","HEAD","OPTIONS","TRACE"].includes(r)||a.set("X-ClickClack-CSRF","1");const s=await fetch(n,{...e,headers:a});if(!s.ok)throw new Yr(s.status,await s.text());if(s.status===204||s.status===205)return;const o=await s.text();return o?JSON.parse(o):void 0}async function gu(n){return n.type.startsWith("image/")?pu(n):n.type.startsWith("video/")?mu(n):{width:0,height:0,durationMS:0}}function pu(n){return new Promise(e=>{const a=URL.createObjectURL(n),r=new Image;r.onload=()=>{const s={width:r.naturalWidth,height:r.naturalHeight,durationMS:0};URL.revokeObjectURL(a),e(s)},r.onerror=()=>{URL.revokeObjectURL(a),e({width:0,height:0,durationMS:0})},r.src=a})}function mu(n){return new Promise(e=>{const a=URL.createObjectURL(n),r=document.createElement("video");r.preload="metadata",r.muted=!0;const s=()=>{URL.revokeObjectURL(a),r.src=""};r.onloadedmetadata=()=>{const o=Number.isFinite(r.duration)&&r.duration>0?Math.round(r.duration*1e3):0,c={width:r.videoWidth,height:r.videoHeight,durationMS:o};s(),e(c)},r.onerror=()=>{s(),e({width:0,height:0,durationMS:0})},r.src=a})}const vu=[{title:"Ship it",url:"https://media.giphy.com/media/v1.Y2lkPTc5MGI3NjExYjJ1bm1meHE4N2x3bnN0djJkMWtjNGc5bXYzZDFiOHBsbG16M3F0ZSZlcD12MV9naWZzX3NlYXJjaCZjdD1n/l0HlHFRbmaZtBRhXG/giphy.gif",tags:["ship","launch","done"]},{title:"Approved",url:"https://media.giphy.com/media/v1.Y2lkPTc5MGI3NjExazBpbzJ6ODZ3bXQ3OHBvNGJidWZoajc0cHV6YnVub3MzZ3c1a2Z2dSZlcD12MV9naWZzX3NlYXJjaCZjdD1n/111ebonMs90YLu/giphy.gif",tags:["yes","approved","nice"]},{title:"Deploy dance",url:"https://media.giphy.com/media/v1.Y2lkPTc5MGI3NjExY3NkaTVmZW9ydWNnZnl0ZWQ5aHQyeGNrd2k3NG4wZWNqYzNmd3k1ZCZlcD12MV9naWZzX3NlYXJjaCZjdD1n/GeimqsH0TLDt4tScGw/giphy.gif",tags:["deploy","dance","celebrate"]},{title:"Looking",url:"https://media.giphy.com/media/v1.Y2lkPTc5MGI3NjExYWZ3emE0dm5mN2h0bGVsY2w0OXBodGd2cGJlNDRiZXo1YWNtdWRmZyZlcD12MV9naWZzX3NlYXJjaCZjdD1n/26n6WywJyh39n1pBu/giphy.gif",tags:["search","looking","debug"]},{title:"Typing faster",url:"https://media.giphy.com/media/v1.Y2lkPTc5MGI3NjExOWFlbnJnbnIzbHYxcDIzdXZ3NGF3N2FocHNvMmR5enU3bHpycHBlZSZlcD12MV9naWZzX3NlYXJjaCZjdD1n/13HgwGsXF0aiGY/giphy.gif",tags:["typing","code","work"]},{title:"Tiny victory",url:"https://media.giphy.com/media/v1.Y2lkPTc5MGI3NjExdjJ2b2tqNmF4dG16NjE0eXhuc3h5bTlvamgwNTR0Zmd6ZjhtM2JuaSZlcD12MV9naWZzX3NlYXJjaCZjdD1n/3o7abKhOpu0NwenH3O/giphy.gif",tags:["win","victory","celebrate"]}],Zr=Symbol("clickclackAnimatedURL");function _u(n){return n[Zr]||n.currentSrc||n.src}function Xr(n){const e=new Map,a=new Map,r=new Map;let s=!1;const o=f=>{try{const _=new URL(f,window.location.href);if(_.hostname!=="giphy.com"&&!_.hostname.endsWith(".giphy.com"))return"";const w=_.pathname.match(/\/media\/(?:v1\.[^/]+\/)?([^/]+)\/giphy\.gif$/);if(w)return`${_.origin}/media/${w[1]}/giphy_s.gif`}catch{return""}return""},c=f=>{const _=f.includes("?")?"&":"?";return`${f}${_}cc_replay=${Date.now()}`},d=(f,_,w,A,x,C=!1)=>{const T=e.get(_);T&&window.clearTimeout(T);const E=(a.get(_)||0)+1;a.set(_,E),f.classList.add("playing"),f.classList.remove("paused"),w.disabled=!0,w.tabIndex=-1,w.ariaHidden="true";let M=!1;const U=()=>{if(M||(M=!0,s||a.get(_)!==E))return;const Y=window.setTimeout(()=>{s||a.get(_)!==E||(f.classList.remove("playing"),f.classList.add("paused"),w.disabled=!1,w.tabIndex=0,w.ariaHidden="false",x&&(_.src=x))},2600);e.set(_,Y)},F=()=>{_.decode().catch(()=>{}).then(U)};_.addEventListener("load",F,{once:!0}),C&&(_.src=c(A)),_.complete&&_.naturalWidth>0&&F()},u=()=>{for(const f of n.querySelectorAll("img")){if(f.closest(".gif-player")||f.closest("a"))continue;const _=f.getAttribute("src")||f.src;if(!/\.gif(?:$|[?#])/i.test(_))continue;const w=o(_);if(!w)continue;const A=document.createElement("span");A.className="gif-player";const x=document.createElement("span");x.className="gif-badge",x.textContent="GIF";const C=document.createElement("button");C.type="button",C.className="gif-replay",C.disabled=!0,C.tabIndex=-1,C.ariaHidden="true",C.ariaLabel=`Replay GIF ${f.alt||"image"}`,C.title="Replay GIF",C.textContent="↻";const T=f.parentNode,E=f.nextSibling,M=f.getAttribute("src")||f.src;f[Zr]=_,T?.insertBefore(A,f),A.append(f,x,C);const U=F=>{F.preventDefault(),F.stopPropagation(),d(A,f,C,_,w,!0)};r.set(f,{wrapper:A,replay:C,originalSrc:M,originalParent:T,originalNextSibling:E,onReplay:U}),C.addEventListener("click",U),d(A,f,C,_,w)}},m=new MutationObserver(u);return m.observe(n,{childList:!0,subtree:!0}),u(),{destroy(){s=!0,m.disconnect();for(const f of e.values())window.clearTimeout(f);for(const[f,_]of r)_.replay.removeEventListener("click",_.onReplay),delete f[Zr],f.src=_.originalSrc,_.wrapper.parentNode?_.wrapper.replaceWith(f):_.originalParent&&f.parentNode!==_.originalParent&&_.originalParent.insertBefore(f,_.originalNextSibling);r.clear(),e.clear(),a.clear()}}}const er=100,Jr=50,_o=900,ca=700,Pr=_o+Jr*2,bu=8,yu=16;function wu(n,e,a){if(n.length<=_o)return n;const r=ku(n,a);if(e==="prepend")return tr(n,0,ca,r,"start");if(e==="append")return tr(n,Math.max(0,n.length-ca),n.length,r,"end");if(e==="around"){const s=r?.first??-1,o=s>=0?s:Math.floor(n.length/2);let c=Math.max(0,o-Math.floor(ca/2)),d=Math.min(n.length,c+ca);return c=Math.max(0,d-ca),tr(n,c,d,r,"start")}return tr(n,Math.max(0,n.length-ca),n.length,r,"end")}function ku(n,e){if(e.size===0)return null;let a=-1,r=-1;for(let s=0;sPr&&(s==="start"?(o=e,c=Math.min(n.length,o+Pr)):(c=a,o=Math.max(0,c-Pr))),n.slice(o,c)}function Tu(n){const e=n.trim();if(!e)return"?";const a=e.split(/\s+/);return a.length>=2?(a[0][0]+a[1][0]).toUpperCase():e.slice(0,2).toUpperCase()}function bo(n){if(!n)return"?";const e=n.trim();return e?e[0].toUpperCase():"?"}function Ln(n){return n?`@${n}`:""}function yo(n){let e=0;for(let a=0;a>>0;return e%360}function Su(n,e){return n.members.find(a=>a.id!==e)||n.members[0]}function ta(n,e){const a=n.members.filter(s=>s.id!==e);return(a.length>0?a:n.members).map(s=>s.display_name).join(", ")}function xu(n,e,a){const r=new Map;for(const s of e)for(const o of s.members)o.id&&o.id!==a&&r.set(o.id,o);for(const s of[...n].reverse()){const o=s.author;o?.id&&o.id!==a&&r.set(o.id,o)}return[...r.values()].slice(0,12)}function Eu(n,e){return n.find(a=>a.members.some(r=>r.id===e))}let sr=null;const Au=new Set(["button","checkbox","combobox","link","listbox","menu","menubar","menuitem","menuitemcheckbox","menuitemradio","option","radio","radiogroup","slider","spinbutton","switch","tab","tablist","textbox","tree","treeitem"]),Cu=new Set(["INPUT","TEXTAREA","SELECT","BUTTON","A","DETAILS","SUMMARY","VIDEO","AUDIO"]);function Iu(n){sr=(n.target instanceof HTMLElement?n.target:null)?.closest("a, button, [role='button'], [role='link'], [tabindex]")||null}function Ru(n){if(!n)return!1;if(n.isContentEditable)return!0;if(n instanceof HTMLInputElement){const e=(n.type||"text").toLowerCase();return e!=="checkbox"&&e!=="radio"&&e!=="button"&&e!=="submit"&&e!=="reset"&&e!=="file"}return n instanceof HTMLTextAreaElement}function Du(n){if(!n||Mu(n)||sr&&(n===sr||sr.contains(n)))return!1;if(Cu.has(n.tagName))return!0;const e=n.getAttribute("role");if(e&&Au.has(e))return!0;const a=n.getAttribute("tabindex");return!!(a!==null&&a!=="-1"&&n.hasAttribute("aria-keyshortcuts"))}function Mu(n){if(!n.closest(".messages, .thread"))return!1;if(n instanceof HTMLButtonElement||n instanceof HTMLAnchorElement)return!0;const e=n.getAttribute("role");return e==="button"||e==="link"}function Nu(){const n=typeof window<"u"?window.getSelection():null;if(!n||n.isCollapsed||n.rangeCount===0)return!1;const e=n.getRangeAt(0).commonAncestorContainer;return e?!!(e.nodeType===Node.ELEMENT_NODE?e:e.parentElement)?.closest(".messages, .thread, .markdown"):!1}function Ou(n,e){if(e.authRequired||e.isModalOpen()||n.defaultPrevented||n.isComposing||n.keyCode===229||n.ctrlKey||n.metaKey||n.altKey||n.key.length!==1||Nu())return!1;const a=document.activeElement;return!(a===e.messageInput||a===e.replyInput||Ru(a)||Du(a))}function Lu(n,e){if(!Ou(n,e))return;const a=e.target();if(!a||a.disabled||a.readOnly)return;n.key===" "&&n.preventDefault(),a.focus({preventScroll:!0});const r=a.value.length;if(a.setSelectionRange(r,r),n.key===" "){const s=a.selectionStart??r,o=a.selectionEnd??r;a.setRangeText(" ",s,o,"end"),a.dispatchEvent(new Event("input",{bubbles:!0}))}}const Ss=n=>`clickclack:${n}:cursor`;function Pu(n){const{workspaceID:e,onEvent:a,onStatusChange:r}=n,s=n.reconnectDelayMs??1200;let o=null,c,d=!1,u=!1;function m(_){u!==_&&(u=_,r?.(_))}function f(){if(d)return;const _=new URL("/api/realtime/ws",window.location.href);_.protocol=window.location.protocol==="https:"?"wss:":"ws:",_.searchParams.set("workspace_id",e);const w=localStorage.getItem(Ss(e))||"";w&&_.searchParams.set("after_cursor",w);const A=new WebSocket(_);o=A,A.addEventListener("open",()=>{o===A&&m(!0)}),A.addEventListener("message",x=>{let C;try{C=JSON.parse(String(x.data))}catch{return}Uu(C)&&(C.cursor&&localStorage.setItem(Ss(e),C.cursor),a(C))}),A.addEventListener("close",()=>{o!==A||d||(o=null,m(!1),c=window.setTimeout(f,s))})}return f(),{get connected(){return u},close(){d=!0,m(!1),c&&window.clearTimeout(c),o?.close(),o=null}}}function Uu(n){return typeof n=="object"&&n!==null&&typeof n.type=="string"}const qu=5e3,zu=4e3;let Lt=null;function Bu(n,e){return n.workspaceID===e.workspaceID&&(n.channelID??"")===(e.channelID??"")&&(n.directConversationID??"")===(e.directConversationID??"")}function Fu(n){const e={};return n.channelID&&(e.channel_id=n.channelID),n.directConversationID&&(e.direct_conversation_id=n.directConversationID),e}async function wo(n,e){try{await nt("/api/realtime/ephemeral",{method:"POST",body:JSON.stringify({workspace_id:n.workspaceID,channel_id:n.channelID||"",direct_conversation_id:n.directConversationID||"",type:e,payload:Fu(n)})})}catch{}}function Hu(n){if(!n.workspaceID||!n.channelID&&!n.directConversationID)return;const e=Date.now();Lt&&!Bu(Lt.scope,n)&&(Qr(Lt),Lt=null),Lt||(Lt={scope:n,active:!1,lastPingAt:0}),(!Lt.active||e-Lt.lastPingAt>=zu)&&(Lt.active=!0,Lt.lastPingAt=e,wo(n,"typing.started")),Lt.idleTimer&&window.clearTimeout(Lt.idleTimer),Lt.idleTimer=window.setTimeout(()=>{Lt&&(Qr(Lt),Lt=null)},qu)}async function Qr(n){n.idleTimer&&window.clearTimeout(n.idleTimer),n.active&&await wo(n.scope,"typing.stopped")}function nr(){Lt&&(Qr(Lt),Lt=null)}function Wu(n,e){const a=()=>{const o=n.style.height;n.style.height="auto";const c=`${n.scrollHeight}px`;o!==c?n.style.height=c:n.style.height=o},r=()=>a(),s=()=>a();return requestAnimationFrame(a),n.addEventListener("input",r),window.addEventListener("resize",s),{update(){requestAnimationFrame(a)},destroy(){n.removeEventListener("input",r),window.removeEventListener("resize",s)}}}function dr(n){return`/api/uploads/${encodeURIComponent(n.id)}`}function Gu(n){return n.content_type.startsWith("image/")}function Ku(n){return n<1024?`${n} B`:n<1024*1024?`${Math.round(n/1024)} KB`:`${(n/(1024*1024)).toFixed(1)} MB`}var ju=V('
    ');function Vu(n,e){vt(e,!0);var a=ju(),r=b(a),s=k(r,2),o=k(s,2),c=b(o);c.textContent="<>",v(o);var d=k(o,2),u=b(d);u.textContent="{}",v(d);var m=k(d,2),f=k(m,2);let _;v(a),oe(()=>_=gt(f,1,"",null,_,{active:e.showGifPicker})),Q("click",r,()=>e.onWrap("**")),Q("click",s,()=>e.onWrap("_")),Q("click",o,()=>e.onWrap("`")),Q("click",d,()=>e.onWrap("```","\n```")),Q("click",m,()=>e.onAppend("[label](https://)")),Q("click",f,function(...w){e.onToggleGif?.apply(this,w)}),z(n,a),_t()}wt(["click"]);var Yu=V(''),Zu=V('
    GIFs
    ');function Xu(n,e){vt(e,!0);var a=Zu(),r=b(a),s=k(b(r),2);dn(s),v(r);var o=k(r,2);Ft(o,21,()=>e.gifs,c=>c.url,(c,d)=>{var u=Yu(),m=b(u),f=k(m,2),_=b(f,!0);v(f),v(u),oe(()=>{re(m,"src",t(d).url),re(m,"alt",t(d).title),ie(_,t(d).title)}),Q("click",u,()=>e.onPick(t(d).url,t(d).title)),z(c,u)}),v(o),v(a),oe(()=>Mn(s,e.query)),Q("input",s,c=>e.onQuery(c.currentTarget.value)),z(n,a),_t()}wt(["input","click"]);function $r(n,e=120){if(!n||e<=0)return"";const a=n.replace(/\s+/g," ").trim();return a.length<=e?a:e<=3?".".repeat(e):`${a.slice(0,e-3)}...`}function xs(n){return n.quoted_author?.display_name||"Unknown"}function Ur(n,e){if(e===n.id)return"Open";const a=n.thread_state?.reply_count||0;return a===0?"No replies yet":`${a} ${a===1?"reply":"replies"}`}function Ju(n){const e=n.thread_state?.reply_count||0;return e===0?"Thread":`${e} ${e===1?"reply":"replies"}`}function Qu(n){const e=n.thread_state?.last_reply_at;return e?$u(e):""}function $u(n){const e=new Date(n).getTime();if(!Number.isFinite(e))return"";const a=Math.max(0,Date.now()-e),r=Math.floor(a/6e4);if(r<1)return"now";if(r<60)return`${r}m`;const s=Math.floor(r/60);return s<24?`${s}h`:`${Math.floor(s/24)}d`}function ed(n){const e=new Date(n),a=new Date,r=new Date;r.setDate(a.getDate()-1);const s=(o,c)=>o.getFullYear()===c.getFullYear()&&o.getMonth()===c.getMonth()&&o.getDate()===c.getDate();return s(e,a)?"Today":s(e,r)?"Yesterday":new Intl.DateTimeFormat(void 0,{weekday:"long",month:"long",day:"numeric"}).format(e)}function td(n){const e=[];let a="",r="",s=0;for(const o of n){const c=new Date(o.created_at),d=c.toDateString(),u=o.author?.id||o.author_id||"local",m=d!==a,f=u!==r,_=c.getTime()-s>300*1e3;m||f||_||e.length===0?e.push({key:o.id,dayLabel:m?ed(o.created_at):null,messages:[o],authorName:o.author?.display_name||"Local User",authorHandle:o.author?.handle||"",authorAvatarURL:o.author?.avatar_url||"",authorID:u,timestamp:o.created_at}):e[e.length-1].messages.push(o),a=d,r=u,s=c.getTime()}return e}var nd=V('
    Replying to
    ');function ad(n,e){vt(e,!0);var a=nd(),r=k(b(a),2),s=b(r),o=k(b(s)),c=b(o,!0);v(o),v(s);var d=k(s,2),u=b(d,!0);v(d),v(r);var m=k(r,2);v(a),oe(f=>{ie(c,e.target.author?.display_name||"Local User"),ie(u,f)},[()=>$r(e.target.body)]),Q("click",m,function(...f){e.onClear?.apply(this,f)}),z(n,a),_t()}wt(["click"]);var rd=V(''),id=V('
    '),sd=V(''),od=V('
    '),ld=V(''),cd=V('
    ');function ko(n,e){vt(e,!0);let a=Oe(e,"formClass",3,"composer"),r=Oe(e,"pendingUpload",3,null),s=Oe(e,"replyTarget",3,null),o=Oe(e,"showUpload",3,!1),c=Oe(e,"showToolbar",3,!1),d=Oe(e,"showGifPicker",3,!1),u=Oe(e,"gifQuery",3,""),m=Oe(e,"filteredGifs",19,()=>[]),f=Oe(e,"slashCommands",19,()=>[]),_=Oe(e,"mentionPeople",19,()=>[]),w=Oe(e,"onUploadFile",3,()=>{}),A=Oe(e,"onRemoveUpload",3,()=>{}),x=Oe(e,"onClearReply",3,()=>{}),C=Oe(e,"onApplyMarkdownWrap",3,()=>{}),T=Oe(e,"onAppendToComposer",3,()=>{}),E=Oe(e,"onToggleGif",3,()=>{}),M=Oe(e,"onGifQuery",3,()=>{}),U=Oe(e,"onPickGif",3,()=>{}),F=ht(null),Y=ht(0),O=ht(""),Z=ht(0);const N=ce(()=>G(e.value,t(Y))),L=ce(()=>!t(N)||K(t(N))===t(O)?[]:t(N).kind==="slash"?P(t(N)):ae(t(N)));nn(()=>(e.onInputRef(t(F)),()=>e.onInputRef(null))),nn(()=>{if(t(L).length===0){h(Z,0);return}t(Z)>=t(L).length&&h(Z,0)});function G(X,Ce){const Ie=Math.max(0,Math.min(Ce||X.length,X.length)),ge=X.slice(0,Ie),Je=/(^|\s)([/@][^\s]*)$/.exec(ge);if(!Je)return null;const qe=Je[2],ft=ge.length-qe.length;return qe.startsWith("/")&&ft!==0?null:{kind:qe.startsWith("/")?"slash":"mention",start:ft,end:Ie,query:qe.slice(1).toLowerCase(),raw:qe}}function K(X){return`${X.kind}:${X.start}:${X.raw}`}function q(X=t(F)){h(Y,X?.selectionStart??e.value.length,!0)}function D(X){return X.startsWith("/")?X:`/${X}`}function P(X){const Ce=X.query;return f().filter(Ie=>!Ie.revoked_at).map(Ie=>{const ge=D(Ie.command),Je=ge.slice(1).toLowerCase();return{id:Ie.id,kind:"slash",label:ge,detail:Ie.description||"Slash command",insertText:`${ge} `,sortText:Je}}).filter(Ie=>!Ce||Ie.sortText.includes(Ce)).sort((Ie,ge)=>+!Ie.sortText.startsWith(Ce)-+!ge.sortText.startsWith(Ce)||Ie.sortText.localeCompare(ge.sortText)).slice(0,6)}function W(X){return Ln(X.handle||X.display_name.replace(/\s+/g,""))}function ae(X){const Ce=X.query,Ie=new Set;return _().filter(ge=>!ge.id||Ie.has(ge.id)?!1:(Ie.add(ge.id),!0)).map(ge=>{const Je=W(ge),qe=`${ge.handle||""} ${ge.display_name}`.trim().toLowerCase();return{id:ge.id,kind:"mention",label:Je,detail:ge.kind==="bot"?`${ge.display_name} · bot`:ge.display_name,insertText:`${Je} `,sortText:qe}}).filter(ge=>!Ce||ge.sortText.includes(Ce)).sort((ge,Je)=>+!ge.sortText.startsWith(Ce)-+!Je.sortText.startsWith(Ce)||ge.sortText.localeCompare(Je.sortText)).slice(0,6)}function j(X){if(!t(N))return;const Ce=`${e.value.slice(0,t(N).start)}${X.insertText}${e.value.slice(t(N).end)}`,Ie=t(N).start+X.insertText.length;e.onValue(Ce),Wn().then(()=>{t(F)?.focus(),t(F)?.setSelectionRange(Ie,Ie),h(Y,Ie)})}function I(X){const Ce=X.currentTarget;e.onValue(Ce.value),q(Ce)}function H(){q(),e.onFocus()}function $(X){if(t(L).length>0){if(X.key==="ArrowDown"){X.preventDefault(),h(Z,(t(Z)+1)%t(L).length);return}if(X.key==="ArrowUp"){X.preventDefault(),h(Z,(t(Z)-1+t(L).length)%t(L).length);return}if(X.key==="Enter"||X.key==="Tab"){X.preventDefault(),j(t(L)[t(Z)]);return}if(X.key==="Escape"&&t(N)){X.preventDefault(),h(O,K(t(N)),!0);return}}e.onKeydown(X)}var ee=cd(),Se=b(ee);{var Te=X=>{Xu(X,{get gifs(){return m()},get query(){return u()},get onQuery(){return M()},get onPick(){return U()}})};ue(Se,X=>{d()&&X(Te)})}var Ne=k(Se,2);{var Ae=X=>{var Ce=id();Ft(Ce,23,()=>t(L),Ie=>Ie.id,(Ie,ge,Je)=>{var qe=rd();let ft;var Ke=b(qe),kt=b(Ke);{var Dt=Tt=>{var Qt=In("/");z(Tt,Qt)},Ht=Tt=>{var Qt=In();oe($t=>ie(Qt,$t),[()=>bo(t(ge).detail)]),z(Tt,Qt)};ue(kt,Tt=>{t(ge).kind==="slash"?Tt(Dt):Tt(Ht,-1)})}v(Ke);var St=k(Ke,2),it=b(St),He=b(it,!0);v(it);var bt=k(it,2),We=b(bt,!0);v(bt),v(St);var Qe=k(St,2),Mt=b(Qe,!0);v(Qe),v(qe),oe(()=>{re(qe,"aria-selected",t(Je)===t(Z)),ft=gt(qe,1,"",null,ft,{active:t(Je)===t(Z)}),ie(He,t(ge).label),ie(We,t(ge).detail),ie(Mt,t(ge).kind==="slash"?"command":"mention")}),Q("mousedown",qe,Tt=>Tt.preventDefault()),Q("click",qe,()=>j(t(ge))),z(Ie,qe)}),v(Ce),oe(()=>re(Ce,"aria-label",t(N)?.kind==="slash"?"Slash command suggestions":"Mention suggestions")),z(X,Ce)};ue(Ne,X=>{t(L).length>0&&X(Ae)})}var pe=k(Ne,2),Ue=b(pe);{var we=X=>{var Ce=od(),Ie=k(b(Ce),2);{var ge=kt=>{var Dt=sd();oe(Ht=>{re(Dt,"src",Ht),re(Dt,"alt",r().filename)},[()=>dr(r())]),z(kt,Dt)},Je=ce(()=>Gu(r()));ue(Ie,kt=>{t(Je)&&kt(ge)})}var qe=k(Ie,2),ft=b(qe);v(qe);var Ke=k(qe,2);v(Ce),oe(kt=>ie(ft,`${r().filename??""} · ${kt??""}`),[()=>Ku(r().byte_size)]),Q("click",Ke,function(...kt){A()?.apply(this,kt)}),z(X,Ce)};ue(Ue,X=>{r()&&X(we)})}var Fe=k(Ue,2);{var he=X=>{ad(X,{get target(){return s()},get onClear(){return x()}})};ue(Fe,X=>{s()&&X(he)})}var Re=k(Fe,2),Le=b(Re);{var et=X=>{var Ce=ld(),Ie=b(Ce);On(2),v(Ce),Q("change",Ie,function(...ge){w()?.apply(this,ge)}),z(X,Ce)};ue(Le,X=>{o()&&X(et)})}var Ge=k(Le,2);Zc(Ge),Xn(Ge,X=>h(F,X),()=>t(F)),qa(Ge,(X,Ce)=>Wu?.(X),()=>e.value);var me=k(Ge,2);v(Re);var Be=k(Re,2);{var pt=X=>{Vu(X,{get showGifPicker(){return d()},get onWrap(){return C()},get onAppend(){return T()},get onToggleGif(){return E()}})};ue(Be,X=>{c()&&X(pt)})}v(pe),v(ee),oe(X=>{gt(ee,1,ur(a())),Mn(Ge,e.value),re(Ge,"placeholder",e.placeholder),re(Ge,"aria-label",e.ariaLabel),re(me,"aria-label",e.submitLabel),me.disabled=X},[()=>!e.value.trim()]),an("submit",ee,X=>{X.preventDefault(),e.onSubmit()}),Q("input",Ge,I),an("focus",Ge,H),Q("keydown",Ge,$),Q("keyup",Ge,()=>q()),Q("mouseup",Ge,()=>q()),an("select",Ge,()=>q()),z(n,ee),_t()}wt(["mousedown","click","change","input","keydown","keyup","mouseup"]);var ud=V('');function dd(n,e){var a=ud(),r=b(a),s=k(r,2),o=b(s),c=b(o),d=b(c,!0);v(c);var u=k(c,2),m=b(u),f=k(m,2);v(u),v(o);var _=k(o,2),w=b(_);v(_),v(s),v(a),oe(()=>{ie(d,e.title),re(m,"href",e.url),re(w,"src",e.url),re(w,"alt",e.title)}),Q("click",r,function(...A){e.onClose?.apply(this,A)}),Q("click",f,function(...A){e.onClose?.apply(this,A)}),z(n,a)}wt(["click"]);const To=n=>Object.keys(n).reduce((e,a)=>{const r=n[a];return r==null?e:e+`${a}:${r};`},""),fd=(n,e)=>"_"+e,za=null,{min:ea,max:vn,abs:Es,floor:hd}=Math,So=(n,e,a)=>ea(a,vn(e,n)),xo=n=>[...n].sort((e,a)=>e-a),gd=typeof queueMicrotask=="function"?queueMicrotask:n=>{Promise.resolve().then(n)},ei=()=>{let n;return[new Promise(e=>{n=e}),n]},Eo=n=>{let e;return()=>(n&&(e=n(),n=void 0),e)},Pa=(n,e,a)=>{const r=a?"unshift":"push";for(let s=0;s{const a=n.t[e];return a===-1?n.o:a},pd=(n,e,a)=>{const r=n.t[e]===-1;return n.t[e]=a,n.i=ea(e,n.i),r},or=(n,e)=>{if(!n.l)return 0;if(n.i>=e)return n.u[e];n.i<0&&(n.u[0]=0,n.i=0);let a=n.i,r=n.u[a];for(;a{let s=a;for(;a<=r;){const o=hd((a+r)/2);or(n,o)<=e?(s=o,a=o+1):r=o-1}return So(s,0,n.l-1)},As=(n,e,a)=>{const r=e-n.l;return n.i=a?-1:ea(e-1,n.i),n.l=e,r>0?(Pa(n.u,r),Pa(n.t,r,a),n.o*r):(n.u.splice(r),(a?n.t.splice(0,-r):n.t.splice(r)).reduce((s,o)=>s-(o===-1?n.o:o),0))},md=n=>n.documentElement,vd=n=>n.ownerDocument,_d=n=>n.defaultView,Co=Eo(()=>!!/iP(hone|od|ad)/.test(navigator.userAgent)||navigator.platform==="MacIntel"&&navigator.maxTouchPoints>0),bd=Eo(()=>"scrollBehavior"in md(document).style),yd=5,wd=6,kd=1,Td=4,Sd=8,xd=n=>vn(n.$getTotalSize(),n.$getViewportSize()),Ed=(n,e=40,a=0,r,s=!1)=>{let o=!!a,c=1,d=0,u=0,m=0,f=0,_=0,w=0,A=0,x=0,C=za,T=[0,o?vn(a-1,0):-1],E=0,M=!1;const U=((D,P,W)=>({o:P,t:W?Pa(W.slice(0,ea(D,W.length)),vn(0,D-W.length)):Pa([],D),l:D,i:-1,u:Pa([],D+1)}))(n,r?r[1]:e,r&&r[0]),F=new Set,Y=()=>m-u,O=()=>Y()+_+f,Z=(D,P)=>((W,ae,j,I)=>{if(I=ea(I,W.l-1),or(W,I)<=ae){const H=ua(W,j,I);return[ua(W,ae,I,H),H]}{const H=ua(W,ae,void 0,I);return[H,ua(W,j,H)]}})(U,D,P,T[0]),N=()=>or(U,U.l),L=(D,P)=>{const W=or(U,D)-_;return P?N()-W-G(D):W},G=D=>Ao(U,D),K=(D,P=-1)=>U.t[D]===P,q=D=>{D&&(Co()&&A!==0||C&&x===1?_+=D:f+=D)};return{$dispose:()=>{F.clear()},$getStateVersion:()=>c,$getCacheSnapshot:()=>(D=>[D.t.slice(),D.o])(U),$getRange:(D=200)=>{if(!M||o)return T;let P,W;if(w)[P,W]=T;else{let ae=vn(0,O()),j=ae+d;s||(D=vn(0,D),A!==1&&(ae-=D),A!==2&&(j+=D)),[P,W]=T=Z(vn(0,ae),vn(0,j)),C&&(P=ea(P,C[0]),W=vn(W,C[1]))}return[vn(P,0),ea(W,U.l-1)]},$findItemIndex:D=>ua(U,D-u),$isUnmeasuredItem:K,$getItemOffset:L,$getItemSize:G,$getItemsLength:()=>U.l,$getScrollOffset:()=>m,$isScrolling:()=>A!==0,$getViewportSize:()=>d,$getStartSpacerSize:()=>u,$getTotalSize:N,$:()=>(w=f,f=0,[w,x===2]),$subscribe:(D,P)=>{const W=[D,P];return F.add(W),()=>{F.delete(W)}},$update:(D,P)=>{let W,ae,j=0;switch(D){case 1:{if(P===m&&x===0)break;const I=w;w=0;const H=P-m,$=Es(H);I&&$=-d&&ee<=N()&&(j+=1,ae=$>d);break}case 2:j=8,A!==0&&(W=!0,j+=1),A=0,x=0,C=za;break;case 3:{const I=P.filter(([H,$])=>!K(H,$));if(!I.length)break;q(I.reduce((H,[$,ee])=>{let Se;if(x===2)Se=!0;else if(C&&x===1)Se=$d&&(q(((H,$)=>{let ee=0;const Se=[];H.t.forEach((we,Fe)=>{we!==-1&&(Se.push(we),Fe<$&&ee++)}),H.i=-1;const Te=xo(Se),Ne=Te.length,Ae=Ne/2|0,pe=Ne%2==0?(Te[Ae-1]+Te[Ae])/2:Te[Ae],Ue=H.o;return((H.o=pe)-Ue)*vn($-ee,0)})(U,ua(U,O()))),s=!1),j=3,ae=!0;break}case 4:d!==P&&(d||(M=ae=!0),d=P,j=3);break;case 5:P[1]?(q(As(U,P[0],!0)),x=2,j=1):(As(U,P[0]),j=1);break;case 6:u=P;break;case 7:x=1;break;case 8:C=Z(P,P+d),j=1}j&&(c=1+(2147483647&c),W&&_&&(f+=_,_=0),F.forEach(([I,H])=>{j&I&&H(ae)}))}}},hi=setTimeout,qr=(n,e)=>e?-n:n,Ad=(n,e,a,r,s,o)=>{const c=Date.now;let d=0,u=!1,m=!1,f=!1,_=!1;const w=(()=>{let E;const M=()=>{E!=za&&clearTimeout(E)},U=()=>{M(),E=hi(()=>{E=za,(()=>{if(u||m)return u=!1,void w();f=!1,n.$update(2)})()},150)};return U.p=M,U})(),A=()=>{d=c(),f&&(_=!0),n.$update(1,r()),w()},x=E=>{if(u||!n.$isScrolling()||E.ctrlKey)return;const M=c()-d;150>M&&50{m=!0,f=_=!1},T=()=>{m=!1,Co()&&(f=!0)};return e.addEventListener("scroll",A),e.addEventListener("wheel",x,{passive:!0}),e.addEventListener("touchstart",C,{passive:!0}),e.addEventListener("touchend",T,{passive:!0}),{h:()=>{e.removeEventListener("scroll",A),e.removeEventListener("wheel",x),e.removeEventListener("touchstart",C),e.removeEventListener("touchend",T),w.p()},m:()=>{const[E,M]=n.$();E&&(s(E,M,_),_=!1,M&&n.$getViewportSize()>n.$getTotalSize()&&n.$update(1,r()))}}},Cd=(n,e,a)=>{let r;return[async(s,o)=>{if(!await e())return;r&&r();const c=()=>{const[d,u]=ei();return r=()=>{u(!1)},n.$getViewportSize()&&hi(r,150),[d,n.$subscribe(2,()=>{u(!0)})]};if(o&&bd())n.$update(8,s()),gd(async()=>{for(;;){let d=!0;for(let[f,_]=n.$getRange();f<=_;f++)if(n.$isUnmeasuredItem(f)){d=!1;break}if(d)break;const[u,m]=c();try{if(!await u)return}finally{m()}}n.$update(7),a(s(),o)});else for(;;){const[d,u]=c();try{if(n.$update(7),a(s()),!await d)return}finally{u()}}},()=>{r&&r()}]},Id=(n,e)=>{let a,r,s=ei(),o=!1;const c=e?"scrollLeft":"scrollTop",d=e?"overflowX":"overflowY",[u,m]=Cd(n,()=>s[0],(f,_)=>{f=qr(f,o),_?a.scrollTo({[e?"left":"top"]:f,behavior:"smooth"}):a[c]=f});return{$observe(f,_){a=_,e&&(o=getComputedStyle(_).direction==="rtl"),r=Ad(n,_,e,()=>qr(_[c],o),(w,A,x)=>{if(x){const C=_.style,T=C[d];C[d]="hidden",hi(()=>{C[d]=T})}_[c]=qr(n.$getScrollOffset()+w,o),A&&m()}),s[1](!0)},$dispose(){r&&r.h(),s[1](!1),s=ei()},$isNegative:()=>o,$scrollTo(f){u(()=>f)},$scrollBy(f){f+=n.$getScrollOffset(),u(()=>f)},$scrollToIndex(f,{align:_,smooth:w,offset:A=0}={}){if(f=So(f,0,n.$getItemsLength()-1),_==="nearest"){const x=n.$getItemOffset(f),C=n.$getScrollOffset();if(xC+n.$getViewportSize()))return;_="end"}}u(()=>A+n.$getStartSpacerSize()+n.$getItemOffset(f)+(_==="end"?n.$getItemSize(f)-n.$getViewportSize():_==="center"?(n.$getItemSize(f)-n.$getViewportSize())/2:0),w)},$fixScrollJump:()=>{r&&r.m()}}},Rd=n=>{let e;return{v(a){(e||(e=new(_d(vd(a))).ResizeObserver(n))).observe(a)},S(a){e.unobserve(a)},h(){e&&e.disconnect()}}},Dd=(n,e)=>{let a;const r=e?"width":"height",s=new WeakMap,o=Rd(c=>{const d=[];for(const{target:u,contentRect:m}of c)if(u.offsetParent)if(u===a)n.$update(4,m[r]);else{const f=s.get(u);f!=za&&d.push([f,m[r]])}d.length&&n.$update(3,d)});return{$observeRoot(c){o.v(a=c)},$observeItem:(c,d)=>(s.set(c,d),o.v(c),()=>{s.delete(c),o.S(c)}),$dispose:o.h}};function Md(n,e){vt(e,!0);let a=Oe(e,"as",3,"div"),r,s,o;nn(()=>{o!==e.index&&(s&&s(),s=e.resizer(r,o=e.index))}),Ha(()=>{s&&s()});let c=ce(()=>{const m={contain:"layout style",position:"absolute",[e.horizontal?"height":"width"]:"100%",[e.horizontal?"top":"left"]:"0px",[e.horizontal?"left":"top"]:e.offset+"px",visibility:e.hide?"hidden":void 0};return e.horizontal&&(m.display="inline-flex"),To(m)});var d=yn(),u=Vt(d);fo(u,a,!1,(m,f)=>{Xn(m,A=>r=A,()=>r),mo(m,()=>({style:t(c)}));var _=yn(),w=Vt(_);Vc(w,()=>e.children,()=>e.item,()=>e.index),z(f,_)}),z(n,d),_t()}function Nd(n,e){vt(e,!0);let a=Oe(e,"getKey",3,fd),r=Oe(e,"as",3,"div"),s=Oe(e,"shift",3,!1),o=Oe(e,"horizontal",3,!1),c=Oe(e,"startMargin",3,0);const d=Ed(e.data.length,e.itemSize,e.ssrCount,e.cache,!e.itemSize),u=Dd(d,o()),m=Id(d,o());d.$subscribe(kd,()=>{h(_,d.$getStateVersion(),!0)}),d.$subscribe(Td,()=>{e.onscroll&&e.onscroll(d.$getScrollOffset())}),d.$subscribe(Sd,()=>{e.onscrollend&&e.onscrollend()});let f=ht(void 0),_=ht(zc(d.$getStateVersion())),w=ce(()=>t(_)&&d.$getRange(e.bufferSize)),A=ce(()=>t(_)&&d.$isScrolling()),x=ce(()=>t(_)&&d.$getTotalSize()),C=ce(()=>t(_)&&m.$isNegative()),T=ce(()=>{const ae=e.data.length,[j,I]=t(w),H=[];if(e.keepMounted){const $=new Set(e.keepMounted);for(let ee=j;ee<=I;ee++)$.add(ee);for(const ee of xo([...$]))ee{const ae=t(f),j=I=>{u.$observeRoot(I),m.$observe(ae,I)};Wn().then(()=>{e.scrollRef?j(e.scrollRef):j(ae.parentElement)})}),Ha(()=>{d.$dispose(),u.$dispose(),m.$dispose()}),Gr(()=>{e.data.length!==d.$getItemsLength()&&d.$update(yd,[e.data.length,s()])}),Gr(()=>{c()!==d.$getStartSpacerSize()&&d.$update(wd,c())});let E;nn(()=>{E!==t(_)&&(E=t(_),m.$fixScrollJump())});const M=d.$getCacheSnapshot,U=d.$getScrollOffset,F=()=>xd(d),Y=d.$getViewportSize,O=d.$findItemIndex,Z=d.$getItemOffset,N=d.$getItemSize,L=m.$scrollToIndex,G=m.$scrollTo,K=m.$scrollBy;let q=ce(()=>To({contain:"size style","overflow-anchor":"none",flex:"none",position:"relative",width:o()?t(x)+"px":"100%",height:o()?"100%":t(x)+"px","pointer-events":t(A)?"none":void 0}));var D={getCache:M,getScrollOffset:U,getScrollSize:F,getViewportSize:Y,findItemIndex:O,getItemOffset:Z,getItemSize:N,scrollToIndex:L,scrollTo:G,scrollBy:K},P=yn(),W=Vt(P);return fo(W,r,!1,(ae,j)=>{Xn(ae,$=>h(f,$,!0),()=>t(f)),mo(ae,()=>({style:t(q)}));var I=yn(),H=Vt(I);Ft(H,17,()=>t(T),$=>a()(e.data[$],$),($,ee)=>{const Se=ce(()=>e.data[t(ee)]);{let Te=ce(()=>t(_)&&d.$getItemOffset(t(ee),t(C))),Ne=ce(()=>t(_)&&d.$isUnmeasuredItem(t(ee)));Md($,{get children(){return e.children},get item(){return t(Se)},get index(){return t(ee)},get as(){return e.item},get offset(){return t(Te)},get hide(){return t(Ne)},get horizontal(){return o()},get resizer(){return u.$observeItem}})}}),z(j,I)}),z(n,P),_t(D)}var Od=V('
    '),Ld=V('
    ');function Cs(n,e){let a=Oe(e,"rows",3,3);var r=Ld();Ft(r,21,()=>Array.from({length:a()}),Jc,(s,o,c)=>{var d=Od();na(d,`--history-row: ${c}`),z(s,d)}),v(r),oe(()=>{gt(r,1,`history-loader history-loader--${e.direction}`),re(r,"aria-label",e.direction==="older"?"Loading older messages":"Loading newer messages")}),z(n,r)}const Pd=512,Aa=new Map;function Ud(n){const e=n?.trim()||"";if(!e)return"";const a=Aa.get(e);if(a)return a;if(Aa.size>=Pd){const r=Aa.keys().next().value;r&&Aa.delete(r)}return Aa.set(e,e),e}var Is=V(''),qd=V(''),zd=V("");function Pn(n,e){vt(e,!0);let a=Oe(e,"class",3,"avatar"),r=Oe(e,"size",3,40),s=Oe(e,"loading",3,"lazy"),o=Oe(e,"fetchPriority",3,"low"),c=ht("");const d=ce(()=>Ud(e.src)),u=ce(()=>t(d)!==""&&t(c)!==t(d)),m=ce(()=>yo(e.id||e.name||t(d)||"avatar")),f=ce(()=>bo(e.name));function _(){h(c,t(d),!0)}var w=yn(),A=Vt(w);{var x=T=>{var E=qd(),M=b(E);{var U=Y=>{var O=Is();oe(()=>{re(O,"src",t(d)),re(O,"width",r()),re(O,"height",r()),re(O,"loading",s()),re(O,"fetchpriority",o())}),an("error",O,_),fs(O),z(Y,O)},F=Y=>{var O=In();oe(()=>ie(O,t(f))),z(Y,O)};ue(M,Y=>{t(u)?Y(U):Y(F,-1)})}v(E),oe(()=>{gt(E,1,ur(a())),na(E,`--hue: ${t(m)??""}deg`),re(E,"aria-label",e.buttonLabel)}),Q("click",E,function(...Y){e.onclick?.apply(this,Y)}),z(T,E)},C=T=>{var E=zd(),M=b(E);{var U=Y=>{var O=Is();oe(()=>{re(O,"src",t(d)),re(O,"width",r()),re(O,"height",r()),re(O,"loading",s()),re(O,"fetchpriority",o())}),an("error",O,_),fs(O),z(Y,O)},F=Y=>{var O=In();oe(()=>ie(O,t(f))),z(Y,O)};ue(M,Y=>{t(u)?Y(U):Y(F,-1)})}v(E),oe(()=>{gt(E,1,ur(a())),na(E,`--hue: ${t(m)??""}deg`)}),z(T,E)};ue(A,T=>{e.buttonLabel?T(x):T(C,-1)})}z(n,w),_t()}wt(["click"]);function Rs(n,e){(e==null||e>n.length)&&(e=n.length);for(var a=0,r=Array(e);a2?r-2:0),o=2;o1?a-1:0),s=1;s"u"?null:Rt(BigInt.prototype.toString),Ps=typeof Symbol>"u"?null:Rt(Symbol.prototype.toString),Et=Rt(Object.prototype.hasOwnProperty),Ca=Rt(Object.prototype.toString),Bt=Rt(RegExp.prototype.test),ha=$d(TypeError);function Rt(n){return function(e){e instanceof RegExp&&(e.lastIndex=0);for(var a=arguments.length,r=new Array(a>1?a-1:0),s=1;s2&&arguments[2]!==void 0?arguments[2]:Ma;if(Ds&&Ds(n,null),!Zt(e))return n;let r=e.length;for(;r--;){let s=e[r];if(typeof s=="string"){const o=a(s);o!==s&&(Kd(e)||(e[r]=o),s=o)}n[s]=!0}return n}function ef(n){for(let e=0;e/g),lf=fn(/\${[\w\W]*/g),cf=fn(/^data-[\-\w.\u00B7-\uFFFF]+$/),uf=fn(/^aria-[\-\w]+$/),Fs=fn(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp|matrix):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i),df=fn(/^(?:\w+script|data):/i),ff=fn(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g),hf=fn(/^html$/i),gf=fn(/^[a-z][.\w]*(-[.\w]+)+$/i),En={element:1,attribute:2,text:3,cdataSection:4,entityReference:5,entityNode:6,progressingInstruction:7,comment:8,document:9,documentType:10,documentFragment:11,notation:12},pf=function(){return typeof window>"u"?null:window},mf=function(e,a){if(typeof e!="object"||typeof e.createPolicy!="function")return null;let r=null;const s="data-tt-policy-suffix";a&&a.hasAttribute(s)&&(r=a.getAttribute(s));const o="dompurify"+(r?"#"+r:"");try{return e.createPolicy(o,{createHTML(c){return c},createScriptURL(c){return c}})}catch{return console.warn("TrustedTypes policy "+o+" could not be created."),null}},Hs=function(){return{afterSanitizeAttributes:[],afterSanitizeElements:[],afterSanitizeShadowDOM:[],beforeSanitizeAttributes:[],beforeSanitizeElements:[],beforeSanitizeShadowDOM:[],uponSanitizeAttribute:[],uponSanitizeElement:[],uponSanitizeShadowNode:[]}};function Do(){let n=arguments.length>0&&arguments[0]!==void 0?arguments[0]:pf();const e=fe=>Do(fe);if(e.version="3.4.8",e.removed=[],!n||!n.document||n.document.nodeType!==En.document||!n.Element)return e.isSupported=!1,e;let a=n.document;const r=a,s=r.currentScript;n.DocumentFragment;const o=n.HTMLTemplateElement,c=n.Node,d=n.Element,u=n.NodeFilter,m=n.NamedNodeMap;m===void 0&&(n.NamedNodeMap||n.MozNamedAttrMap),n.HTMLFormElement;const f=n.DOMParser,_=n.trustedTypes,w=d.prototype,A=An(w,"cloneNode"),x=An(w,"remove"),C=An(w,"nextSibling"),T=An(w,"childNodes"),E=An(w,"parentNode"),M=An(w,"shadowRoot"),U=An(w,"attributes"),F=c&&c.prototype?An(c.prototype,"nodeType"):null,Y=c&&c.prototype?An(c.prototype,"nodeName"):null;if(typeof o=="function"){const fe=a.createElement("template");fe.content&&fe.content.ownerDocument&&(a=fe.content.ownerDocument)}let O,Z="",N=0;const L=function(p){if(N>0)throw ha('The configured TRUSTED_TYPES_POLICY.createHTML must not call DOMPurify.sanitize, as that causes infinite recursion. Do not pass a policy whose createHTML wraps DOMPurify as TRUSTED_TYPES_POLICY; see the "DOMPurify and Trusted Types" section of the README.');N++;try{return O.createHTML(p)}finally{N--}},G=a,K=G.implementation,q=G.createNodeIterator,D=G.createDocumentFragment,P=G.getElementsByTagName,W=r.importNode;let ae=Hs();e.isSupported=typeof Io=="function"&&typeof E=="function"&&K&&K.createHTMLDocument!==void 0;const j=sf,I=of,H=lf,$=cf,ee=uf,Se=df,Te=ff,Ne=gf;let Ae=Fs,pe=null;const Ue=ze({},[...Us,...Br,...Fr,...Hr,...qs]);let we=null;const Fe=ze({},[...zs,...Wr,...Bs,...ar]);let he=Object.seal(ga(null,{tagNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},allowCustomizedBuiltInElements:{writable:!0,configurable:!1,enumerable:!0,value:!1}})),Re=null,Le=null;const et=Object.seal(ga(null,{tagCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeCheck:{writable:!0,configurable:!1,enumerable:!0,value:null}}));let Ge=!0,me=!0,Be=!1,pt=!0,X=!1,Ce=!0,Ie=!1,ge=!1,Je=!1,qe=!1,ft=!1,Ke=!1,kt=!0,Dt=!1;const Ht="user-content-";let St=!0,it=!1,He={},bt=null;const We=ze({},["annotation-xml","audio","colgroup","desc","foreignobject","head","iframe","math","mi","mn","mo","ms","mtext","noembed","noframes","noscript","plaintext","script","style","svg","template","thead","title","video","xmp"]);let Qe=null;const Mt=ze({},["audio","video","img","source","image","track"]);let Tt=null;const Qt=ze({},["alt","class","for","id","label","name","pattern","placeholder","role","summary","title","value","style","xmlns"]),$t="http://www.w3.org/1998/Math/MathML",wn="http://www.w3.org/2000/svg",Wt="http://www.w3.org/1999/xhtml";let yt=Wt,kn=!1,Pt=null;const hn=ze({},[$t,wn,Wt],zr);let en=ze({},["mi","mo","mn","ms","mtext"]),Yt=ze({},["annotation-xml"]);const Kn=ze({},["title","style","font","a","script"]);let on=null;const mt=["application/xhtml+xml","text/html"],rt="text/html";let R=null,te=null;const de=a.createElement("form"),J=function(p){return p instanceof RegExp||p instanceof Function},ve=function(){let p=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};if(te&&te===p)return;(!p||typeof p!="object")&&(p={}),p=jt(p),on=mt.indexOf(p.PARSER_MEDIA_TYPE)===-1?rt:p.PARSER_MEDIA_TYPE,R=on==="application/xhtml+xml"?zr:Ma,pe=Et(p,"ALLOWED_TAGS")&&Zt(p.ALLOWED_TAGS)?ze({},p.ALLOWED_TAGS,R):Ue,we=Et(p,"ALLOWED_ATTR")&&Zt(p.ALLOWED_ATTR)?ze({},p.ALLOWED_ATTR,R):Fe,Pt=Et(p,"ALLOWED_NAMESPACES")&&Zt(p.ALLOWED_NAMESPACES)?ze({},p.ALLOWED_NAMESPACES,zr):hn,Tt=Et(p,"ADD_URI_SAFE_ATTR")&&Zt(p.ADD_URI_SAFE_ATTR)?ze(jt(Qt),p.ADD_URI_SAFE_ATTR,R):Qt,Qe=Et(p,"ADD_DATA_URI_TAGS")&&Zt(p.ADD_DATA_URI_TAGS)?ze(jt(Mt),p.ADD_DATA_URI_TAGS,R):Mt,bt=Et(p,"FORBID_CONTENTS")&&Zt(p.FORBID_CONTENTS)?ze({},p.FORBID_CONTENTS,R):We,Re=Et(p,"FORBID_TAGS")&&Zt(p.FORBID_TAGS)?ze({},p.FORBID_TAGS,R):jt({}),Le=Et(p,"FORBID_ATTR")&&Zt(p.FORBID_ATTR)?ze({},p.FORBID_ATTR,R):jt({}),He=Et(p,"USE_PROFILES")?p.USE_PROFILES&&typeof p.USE_PROFILES=="object"?jt(p.USE_PROFILES):p.USE_PROFILES:!1,Ge=p.ALLOW_ARIA_ATTR!==!1,me=p.ALLOW_DATA_ATTR!==!1,Be=p.ALLOW_UNKNOWN_PROTOCOLS||!1,pt=p.ALLOW_SELF_CLOSE_IN_ATTR!==!1,X=p.SAFE_FOR_TEMPLATES||!1,Ce=p.SAFE_FOR_XML!==!1,Ie=p.WHOLE_DOCUMENT||!1,qe=p.RETURN_DOM||!1,ft=p.RETURN_DOM_FRAGMENT||!1,Ke=p.RETURN_TRUSTED_TYPE||!1,Je=p.FORCE_BODY||!1,kt=p.SANITIZE_DOM!==!1,Dt=p.SANITIZE_NAMED_PROPS||!1,St=p.KEEP_CONTENT!==!1,it=p.IN_PLACE||!1,Ae=nf(p.ALLOWED_URI_REGEXP)?p.ALLOWED_URI_REGEXP:Fs,yt=typeof p.NAMESPACE=="string"?p.NAMESPACE:Wt,en=Et(p,"MATHML_TEXT_INTEGRATION_POINTS")&&p.MATHML_TEXT_INTEGRATION_POINTS&&typeof p.MATHML_TEXT_INTEGRATION_POINTS=="object"?jt(p.MATHML_TEXT_INTEGRATION_POINTS):ze({},["mi","mo","mn","ms","mtext"]),Yt=Et(p,"HTML_INTEGRATION_POINTS")&&p.HTML_INTEGRATION_POINTS&&typeof p.HTML_INTEGRATION_POINTS=="object"?jt(p.HTML_INTEGRATION_POINTS):ze({},["annotation-xml"]);const B=Et(p,"CUSTOM_ELEMENT_HANDLING")&&p.CUSTOM_ELEMENT_HANDLING&&typeof p.CUSTOM_ELEMENT_HANDLING=="object"?jt(p.CUSTOM_ELEMENT_HANDLING):ga(null);if(he=ga(null),Et(B,"tagNameCheck")&&J(B.tagNameCheck)&&(he.tagNameCheck=B.tagNameCheck),Et(B,"attributeNameCheck")&&J(B.attributeNameCheck)&&(he.attributeNameCheck=B.attributeNameCheck),Et(B,"allowCustomizedBuiltInElements")&&typeof B.allowCustomizedBuiltInElements=="boolean"&&(he.allowCustomizedBuiltInElements=B.allowCustomizedBuiltInElements),X&&(me=!1),ft&&(qe=!0),He&&(pe=ze({},qs),we=ga(null),He.html===!0&&(ze(pe,Us),ze(we,zs)),He.svg===!0&&(ze(pe,Br),ze(we,Wr),ze(we,ar)),He.svgFilters===!0&&(ze(pe,Fr),ze(we,Wr),ze(we,ar)),He.mathMl===!0&&(ze(pe,Hr),ze(we,Bs),ze(we,ar))),et.tagCheck=null,et.attributeCheck=null,Et(p,"ADD_TAGS")&&(typeof p.ADD_TAGS=="function"?et.tagCheck=p.ADD_TAGS:Zt(p.ADD_TAGS)&&(pe===Ue&&(pe=jt(pe)),ze(pe,p.ADD_TAGS,R))),Et(p,"ADD_ATTR")&&(typeof p.ADD_ATTR=="function"?et.attributeCheck=p.ADD_ATTR:Zt(p.ADD_ATTR)&&(we===Fe&&(we=jt(we)),ze(we,p.ADD_ATTR,R))),Et(p,"ADD_URI_SAFE_ATTR")&&Zt(p.ADD_URI_SAFE_ATTR)&&ze(Tt,p.ADD_URI_SAFE_ATTR,R),Et(p,"FORBID_CONTENTS")&&Zt(p.FORBID_CONTENTS)&&(bt===We&&(bt=jt(bt)),ze(bt,p.FORBID_CONTENTS,R)),Et(p,"ADD_FORBID_CONTENTS")&&Zt(p.ADD_FORBID_CONTENTS)&&(bt===We&&(bt=jt(bt)),ze(bt,p.ADD_FORBID_CONTENTS,R)),St&&(pe["#text"]=!0),Ie&&ze(pe,["html","head","body"]),pe.table&&(ze(pe,["tbody"]),delete Re.tbody),p.TRUSTED_TYPES_POLICY){if(typeof p.TRUSTED_TYPES_POLICY.createHTML!="function")throw ha('TRUSTED_TYPES_POLICY configuration option must provide a "createHTML" hook.');if(typeof p.TRUSTED_TYPES_POLICY.createScriptURL!="function")throw ha('TRUSTED_TYPES_POLICY configuration option must provide a "createScriptURL" hook.');const le=O;O=p.TRUSTED_TYPES_POLICY;try{Z=L("")}catch($e){throw O=le,$e}}else O===void 0&&p.TRUSTED_TYPES_POLICY!==null&&(O=mf(_,s)),O&&typeof Z=="string"&&(Z=L(""));(ae.uponSanitizeElement.length>0||ae.uponSanitizeAttribute.length>0)&&pe===Ue&&(pe=jt(pe)),ae.uponSanitizeAttribute.length>0&&we===Fe&&(we=jt(we)),Jt&&Jt(p),te=p},xe=ze({},[...Br,...Fr,...af]),Ee=ze({},[...Hr,...rf]),st=function(p){let B=E(p);(!B||!B.tagName)&&(B={namespaceURI:yt,tagName:"template"});const le=Ma(p.tagName),$e=Ma(B.tagName);return Pt[p.namespaceURI]?p.namespaceURI===wn?B.namespaceURI===Wt?le==="svg":B.namespaceURI===$t?le==="svg"&&($e==="annotation-xml"||en[$e]):!!xe[le]:p.namespaceURI===$t?B.namespaceURI===Wt?le==="math":B.namespaceURI===wn?le==="math"&&Yt[$e]:!!Ee[le]:p.namespaceURI===Wt?B.namespaceURI===wn&&!Yt[$e]||B.namespaceURI===$t&&!en[$e]?!1:!Ee[le]&&(Kn[le]||!xe[le]):!!(on==="application/xhtml+xml"&&Pt[p.namespaceURI]):!1},ot=function(p){da(e.removed,{element:p});try{E(p).removeChild(p)}catch{x(p)}},dt=function(p,B){try{da(e.removed,{attribute:B.getAttributeNode(p),from:B})}catch{da(e.removed,{attribute:null,from:B})}if(B.removeAttribute(p),p==="is")if(qe||ft)try{ot(B)}catch{}else try{B.setAttribute(p,"")}catch{}},rn=function(p){let B=null,le=null;if(Je)p=""+p;else{const ct=Ns(p,/^[\r\n\t ]+/);le=ct&&ct[0]}on==="application/xhtml+xml"&&yt===Wt&&(p=''+p+"");const $e=O?L(p):p;if(yt===Wt)try{B=new f().parseFromString($e,on)}catch{}if(!B||!B.documentElement){B=K.createDocument(yt,"template",null);try{B.documentElement.innerHTML=kn?Z:$e}catch{}}const Pe=B.body||B.documentElement;return p&&le&&Pe.insertBefore(a.createTextNode(le),Pe.childNodes[0]||null),yt===Wt?P.call(B,Ie?"html":"body")[0]:Ie?B.documentElement:Pe},lt=function(p){return q.call(p.ownerDocument||p,p,u.SHOW_ELEMENT|u.SHOW_COMMENT|u.SHOW_TEXT|u.SHOW_PROCESSING_INSTRUCTION|u.SHOW_CDATA_SECTION,null)},Nt=function(p){var B,le;p.normalize();const $e=q.call(p.ownerDocument||p,p,u.SHOW_TEXT|u.SHOW_COMMENT|u.SHOW_CDATA_SECTION|u.SHOW_PROCESSING_INSTRUCTION,null);let Pe=$e.nextNode();for(;Pe;){let At=Pe.data;Qn([j,I,H],zt=>{At=fa(At,zt," ")}),Pe.data=At,Pe=$e.nextNode()}const ct=(B=(le=p.querySelectorAll)===null||le===void 0?void 0:le.call(p,"template"))!==null&&B!==void 0?B:[];Qn(Array.from(ct),At=>{ln(At.content)&&Nt(At.content)})},gn=function(p){const B=Y?Y(p):null;return typeof B!="string"||R(B)!=="form"?!1:typeof p.nodeName!="string"||typeof p.textContent!="string"||typeof p.removeChild!="function"||p.attributes!==U(p)||typeof p.removeAttribute!="function"||typeof p.setAttribute!="function"||typeof p.namespaceURI!="string"||typeof p.insertBefore!="function"||typeof p.hasChildNodes!="function"||p.nodeType!==F(p)||p.childNodes!==T(p)},ln=function(p){if(!F||typeof p!="object"||p===null)return!1;try{return F(p)===En.documentFragment}catch{return!1}},Ct=function(p){if(!F||typeof p!="object"||p===null)return!1;try{return typeof F(p)=="number"}catch{return!1}};function Ut(fe,p,B){Qn(fe,le=>{le.call(e,p,B,te)})}const sn=function(p){let B=null;if(Ut(ae.beforeSanitizeElements,p,null),gn(p))return ot(p),!0;const le=R(Y?Y(p):p.nodeName);if(Ut(ae.uponSanitizeElement,p,{tagName:le,allowedTags:pe}),Ce&&p.hasChildNodes()&&!Ct(p.firstElementChild)&&Bt(/<[/\w!]/g,p.innerHTML)&&Bt(/<[/\w!]/g,p.textContent)||Ce&&p.namespaceURI===Wt&&le==="style"&&Ct(p.firstElementChild)||p.nodeType===En.progressingInstruction||Ce&&p.nodeType===En.comment&&Bt(/<[/\w]/g,p.data))return ot(p),!0;if(Re[le]||!(et.tagCheck instanceof Function&&et.tagCheck(le))&&!pe[le]){if(!Re[le]&&va(le)&&(he.tagNameCheck instanceof RegExp&&Bt(he.tagNameCheck,le)||he.tagNameCheck instanceof Function&&he.tagNameCheck(le)))return!1;if(St&&!bt[le]){const Pe=E(p),ct=T(p);if(ct&&Pe){const At=ct.length;for(let zt=At-1;zt>=0;--zt){const Gt=A(ct[zt],!0);Pe.insertBefore(Gt,C(p))}}}return ot(p),!0}return(F?F(p):p.nodeType)===En.element&&!st(p)||(le==="noscript"||le==="noembed"||le==="noframes")&&Bt(/<\/no(script|embed|frames)/i,p.innerHTML)?(ot(p),!0):(X&&p.nodeType===En.text&&(B=p.textContent,Qn([j,I,H],Pe=>{B=fa(B,Pe," ")}),p.textContent!==B&&(da(e.removed,{element:p.cloneNode()}),p.textContent=B)),Ut(ae.afterSanitizeElements,p,null),!1)},ia=function(p,B,le){if(Le[B]||kt&&(B==="id"||B==="name")&&(le in a||le in de))return!1;const $e=we[B]||et.attributeCheck instanceof Function&&et.attributeCheck(B,p);if(!(me&&!Le[B]&&Bt($,B))){if(!(Ge&&Bt(ee,B))){if(!$e||Le[B]){if(!(va(p)&&(he.tagNameCheck instanceof RegExp&&Bt(he.tagNameCheck,p)||he.tagNameCheck instanceof Function&&he.tagNameCheck(p))&&(he.attributeNameCheck instanceof RegExp&&Bt(he.attributeNameCheck,B)||he.attributeNameCheck instanceof Function&&he.attributeNameCheck(B,p))||B==="is"&&he.allowCustomizedBuiltInElements&&(he.tagNameCheck instanceof RegExp&&Bt(he.tagNameCheck,le)||he.tagNameCheck instanceof Function&&he.tagNameCheck(le))))return!1}else if(!Tt[B]){if(!Bt(Ae,fa(le,Te,""))){if(!((B==="src"||B==="xlink:href"||B==="href")&&p!=="script"&&Os(le,"data:")===0&&Qe[p])){if(!(Be&&!Bt(Se,fa(le,Te,"")))){if(le)return!1}}}}}}return!0},_r=ze({},["annotation-xml","color-profile","font-face","font-face-format","font-face-name","font-face-src","font-face-uri","missing-glyph"]),va=function(p){return!_r[Ma(p)]&&Bt(Ne,p)},Jn=function(p){Ut(ae.beforeSanitizeAttributes,p,null);const B=p.attributes;if(!B||gn(p))return;const le={attrName:"",attrValue:"",keepAttr:!0,allowedAttributes:we,forceKeepAttr:void 0};let $e=B.length;for(;$e--;){const Pe=B[$e],ct=Pe.name,At=Pe.namespaceURI,zt=Pe.value,Gt=R(ct),_a=zt;let It=ct==="value"?_a:Xd(_a);if(le.attrName=Gt,le.attrValue=It,le.keepAttr=!0,le.forceKeepAttr=void 0,Ut(ae.uponSanitizeAttribute,p,le),It=le.attrValue,Dt&&(Gt==="id"||Gt==="name")&&Os(It,Ht)!==0&&(dt(ct,p),It=Ht+It),Ce&&Bt(/((--!?|])>)|<\/(style|script|title|xmp|textarea|noscript|iframe|noembed|noframes)/i,It)){dt(ct,p);continue}if(Gt==="attributename"&&Ns(It,"href")){dt(ct,p);continue}if(le.forceKeepAttr)continue;if(!le.keepAttr){dt(ct,p);continue}if(!pt&&Bt(/\/>/i,It)){dt(ct,p);continue}X&&Qn([j,I,H],Ka=>{It=fa(It,Ka," ")});const Ga=R(p.nodeName);if(!ia(Ga,Gt,It)){dt(ct,p);continue}if(O&&typeof _=="object"&&typeof _.getAttributeType=="function"&&!At)switch(_.getAttributeType(Ga,Gt)){case"TrustedHTML":{It=L(It);break}case"TrustedScriptURL":{It=O.createScriptURL(It);break}}if(It!==_a)try{At?p.setAttributeNS(At,ct,It):p.setAttribute(ct,It),gn(p)?ot(p):Ms(e.removed)}catch{dt(ct,p)}}Ut(ae.afterSanitizeAttributes,p,null)},cn=function(p){let B=null;const le=lt(p);for(Ut(ae.beforeSanitizeShadowDOM,p,null);B=le.nextNode();)if(Ut(ae.uponSanitizeShadowNode,B,null),sn(B),Jn(B),ln(B.content)&&cn(B.content),(F?F(B):B.nodeType)===En.element){const Pe=M?M(B):B.shadowRoot;ln(Pe)&&(jn(Pe),cn(Pe))}Ut(ae.afterSanitizeShadowDOM,p,null)},jn=function(p){const B=F?F(p):p.nodeType;if(B===En.element){const Pe=M?M(p):p.shadowRoot;ln(Pe)&&(jn(Pe),cn(Pe))}const le=T?T(p):p.childNodes;if(!le)return;const $e=[];Qn(le,Pe=>{da($e,Pe)});for(const Pe of $e)jn(Pe);if(B===En.element){const Pe=Y?Y(p):null;if(typeof Pe=="string"&&R(Pe)==="template"){const ct=p.content;ln(ct)&&jn(ct)}}};return e.sanitize=function(fe){let p=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},B=null,le=null,$e=null,Pe=null;if(kn=!fe,kn&&(fe=""),typeof fe!="string"&&!Ct(fe)&&(fe=tf(fe),typeof fe!="string"))throw ha("dirty is not a string, aborting");if(!e.isSupported)return fe;if(ge||ve(p),e.removed=[],typeof fe=="string"&&(it=!1),it){const zt=Y?Y(fe):fe.nodeName;if(typeof zt=="string"){const Gt=R(zt);if(!pe[Gt]||Re[Gt])throw ha("root node is forbidden and cannot be sanitized in-place")}if(gn(fe))throw ha("root node is clobbered and cannot be sanitized in-place");jn(fe)}else if(Ct(fe))B=rn(""),le=B.ownerDocument.importNode(fe,!0),le.nodeType===En.element&&le.nodeName==="BODY"||le.nodeName==="HTML"?B=le:B.appendChild(le),jn(le);else{if(!qe&&!X&&!Ie&&fe.indexOf("<")===-1)return O&&Ke?L(fe):fe;if(B=rn(fe),!B)return qe?null:Ke?Z:""}B&&Je&&ot(B.firstChild);const ct=lt(it?fe:B);for(;$e=ct.nextNode();)sn($e),Jn($e),ln($e.content)&&cn($e.content);if(it)return X&&Nt(fe),fe;if(qe){if(X&&Nt(B),ft)for(Pe=D.call(B.ownerDocument);B.firstChild;)Pe.appendChild(B.firstChild);else Pe=B;return(we.shadowroot||we.shadowrootmode)&&(Pe=W.call(r,Pe,!0)),Pe}let At=Ie?B.outerHTML:B.innerHTML;return Ie&&pe["!doctype"]&&B.ownerDocument&&B.ownerDocument.doctype&&B.ownerDocument.doctype.name&&Bt(hf,B.ownerDocument.doctype.name)&&(At=" -`+At),X&&Qn([j,I,H],zt=>{At=fa(At,zt," ")}),O&&Ke?L(At):At},e.setConfig=function(){let fe=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};ve(fe),ge=!0},e.clearConfig=function(){te=null,ge=!1},e.isValidAttribute=function(fe,p,B){te||ve({});const le=R(fe),$e=R(p);return ia(le,$e,B)},e.addHook=function(fe,p){typeof p=="function"&&da(ae[fe],p)},e.removeHook=function(fe,p){if(p!==void 0){const B=Yd(ae[fe],p);return B===-1?void 0:Zd(ae[fe],B,1)[0]}return Ms(ae[fe])},e.removeHooks=function(fe){ae[fe]=[]},e.removeAllHooks=function(){ae=Hs()},e}var vf=Do();function gi(){return{async:!1,breaks:!1,extensions:null,gfm:!0,hooks:null,pedantic:!1,renderer:null,silent:!1,tokenizer:null,walkTokens:null}}var ra=gi();function Mo(n){ra=n}var $n={exec:()=>null};function Xe(n,e=""){let a=typeof n=="string"?n:n.source,r={replace:(s,o)=>{let c=typeof o=="string"?o:o.source;return c=c.replace(Xt.caret,"$1"),a=a.replace(s,c),r},getRegex:()=>new RegExp(a,e)};return r}var _f=(()=>{try{return!!new RegExp("(?<=1)(?/,blockquoteSetextReplace:/\n {0,3}((?:=+|-+) *)(?=\n|$)/g,blockquoteSetextReplace2:/^ {0,3}>[ \t]?/gm,listReplaceNesting:/^ {1,4}(?=( {4})*[^ ])/g,listIsTask:/^\[[ xX]\] +\S/,listReplaceTask:/^\[[ xX]\] +/,listTaskCheckbox:/\[[ xX]\]/,anyLine:/\n.*\n/,hrefBrackets:/^<(.*)>$/,tableDelimiter:/[:|]/,tableAlignChars:/^\||\| *$/g,tableRowBlankLine:/\n[ \t]*$/,tableAlignRight:/^ *-+: *$/,tableAlignCenter:/^ *:-+: *$/,tableAlignLeft:/^ *:-+ *$/,startATag:/^/i,startPreScriptTag:/^<(pre|code|kbd|script)(\s|>)/i,endPreScriptTag:/^<\/(pre|code|kbd|script)(\s|>)/i,startAngleBracket:/^$/,pedanticHrefTitle:/^([^'"]*[^\s])\s+(['"])(.*)\2/,unicodeAlphaNumeric:/[\p{L}\p{N}]/u,escapeTest:/[&<>"']/,escapeReplace:/[&<>"']/g,escapeTestNoEncode:/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/,escapeReplaceNoEncode:/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/g,caret:/(^|[^\[])\^/g,percentDecode:/%25/g,findPipe:/\|/g,splitPipe:/ \|/,slashPipe:/\\\|/g,carriageReturn:/\r\n|\r/g,spaceLine:/^ +$/gm,notSpaceStart:/^\S*/,endingNewline:/\n$/,listItemRegex:n=>new RegExp(`^( {0,3}${n})((?:[ ][^\\n]*)?(?:\\n|$))`),nextBulletRegex:n=>new RegExp(`^ {0,${Math.min(3,n-1)}}(?:[*+-]|\\d{1,9}[.)])((?:[ ][^\\n]*)?(?:\\n|$))`),hrRegex:n=>new RegExp(`^ {0,${Math.min(3,n-1)}}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)`),fencesBeginRegex:n=>new RegExp(`^ {0,${Math.min(3,n-1)}}(?:\`\`\`|~~~)`),headingBeginRegex:n=>new RegExp(`^ {0,${Math.min(3,n-1)}}#`),htmlBeginRegex:n=>new RegExp(`^ {0,${Math.min(3,n-1)}}<(?:[a-z].*>|!--)`,"i"),blockquoteBeginRegex:n=>new RegExp(`^ {0,${Math.min(3,n-1)}}>`)},bf=/^(?:[ \t]*(?:\n|$))+/,yf=/^((?: {4}| {0,3}\t)[^\n]+(?:\n(?:[ \t]*(?:\n|$))*)?)+/,wf=/^ {0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?: {0,3}\1[~`]* *(?=\n|$)|$)/,Wa=/^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/,kf=/^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/,pi=/ {0,3}(?:[*+-]|\d{1,9}[.)])/,No=/^(?!bull |blockCode|fences|blockquote|heading|html|table)((?:.|\n(?!\s*?\n|bull |blockCode|fences|blockquote|heading|html|table))+?)\n {0,3}(=+|-+) *(?:\n+|$)/,Oo=Xe(No).replace(/bull/g,pi).replace(/blockCode/g,/(?: {4}| {0,3}\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).replace(/\|table/g,"").getRegex(),Tf=Xe(No).replace(/bull/g,pi).replace(/blockCode/g,/(?: {4}| {0,3}\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).replace(/table/g,/ {0,3}\|?(?:[:\- ]*\|)+[\:\- ]*\n/).getRegex(),mi=/^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\n)[^\n]+)*)/,Sf=/^[^\n]+/,vi=/(?!\s*\])(?:\\[\s\S]|[^\[\]\\])+/,xf=Xe(/^ {0,3}\[(label)\]: *(?:\n[ \t]*)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n[ \t]*)?| *\n[ \t]*)(title))? *(?:\n+|$)/).replace("label",vi).replace("title",/(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/).getRegex(),Ef=Xe(/^(bull)([ \t][^\n]+?)?(?:\n|$)/).replace(/bull/g,pi).getRegex(),mr="address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul",_i=/|$))/,Af=Xe("^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|\\n*|$)|\\n*|$)|)[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$))","i").replace("comment",_i).replace("tag",mr).replace("attribute",/ +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(),Lo=Xe(mi).replace("hr",Wa).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("|lheading","").replace("|table","").replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)])[ \\t]").replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",mr).getRegex(),Cf=Xe(/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/).replace("paragraph",Lo).getRegex(),bi={blockquote:Cf,code:yf,def:xf,fences:wf,heading:kf,hr:Wa,html:Af,lheading:Oo,list:Ef,newline:bf,paragraph:Lo,table:$n,text:Sf},Ws=Xe("^ *([^\\n ].*)\\n {0,3}((?:\\| *)?:?-+:? *(?:\\| *:?-+:? *)*(?:\\| *)?)(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)").replace("hr",Wa).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("blockquote"," {0,3}>").replace("code","(?: {4}| {0,3} )[^\\n]").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)])[ \\t]").replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",mr).getRegex(),If={...bi,lheading:Tf,table:Ws,paragraph:Xe(mi).replace("hr",Wa).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("|lheading","").replace("table",Ws).replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)])[ \\t]").replace("html",")|<(?:script|pre|style|textarea|!--)").replace("tag",mr).getRegex()},Rf={...bi,html:Xe(`^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+? *(?:\\n{2,}|\\s*$)|\\s]*)*?/?> *(?:\\n{2,}|\\s*$))`).replace("comment",_i).replace(/tag/g,"(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(),def:/^ *\[([^\]]+)\]: *]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,heading:/^(#{1,6})(.*)(?:\n+|$)/,fences:$n,lheading:/^(.+?)\n {0,3}(=+|-+) *(?:\n+|$)/,paragraph:Xe(mi).replace("hr",Wa).replace("heading",` *#{1,6} *[^ -]`).replace("lheading",Oo).replace("|table","").replace("blockquote"," {0,3}>").replace("|fences","").replace("|list","").replace("|html","").replace("|tag","").getRegex()},Df=/^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,Mf=/^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,Po=/^( {2,}|\\)\n(?!\s*$)/,Nf=/^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\`+)[^`]+\k(?!`))*?\]\((?:\\[\s\S]|[^\\\(\)]|\((?:\\[\s\S]|[^\\\(\)])*\))*\)/).replace("precode-",_f?"(?`+)[^`]+\k(?!`)/).replace("html",/<(?! )[^<>]*?>/).getRegex(),qo=/^(?:\*+(?:((?!\*)punct)|([^\s*]))?)|^_+(?:((?!_)punct)|([^\s_]))?/,qf=Xe(qo,"u").replace(/punct/g,ma).getRegex(),zf=Xe(qo,"u").replace(/punct/g,Uo).getRegex(),zo="^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\*)punct(\\*+)(?=[\\s]|$)|notPunctSpace(\\*+)(?!\\*)(?=punctSpace|$)|(?!\\*)punctSpace(\\*+)(?=notPunctSpace)|[\\s](\\*+)(?!\\*)(?=punct)|(?!\\*)punct(\\*+)(?!\\*)(?=punct)|notPunctSpace(\\*+)(?=notPunctSpace)",Bf=Xe(zo,"gu").replace(/notPunctSpace/g,yi).replace(/punctSpace/g,vr).replace(/punct/g,ma).getRegex(),Ff=Xe(zo,"gu").replace(/notPunctSpace/g,Pf).replace(/punctSpace/g,Lf).replace(/punct/g,Uo).getRegex(),Hf=Xe("^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)punctSpace(_+)(?=notPunctSpace)|[\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)","gu").replace(/notPunctSpace/g,yi).replace(/punctSpace/g,vr).replace(/punct/g,ma).getRegex(),Wf=Xe(/^~~?(?:((?!~)punct)|[^\s~])/,"u").replace(/punct/g,ma).getRegex(),Gf="^[^~]+(?=[^~])|(?!~)punct(~~?)(?=[\\s]|$)|notPunctSpace(~~?)(?!~)(?=punctSpace|$)|(?!~)punctSpace(~~?)(?=notPunctSpace)|[\\s](~~?)(?!~)(?=punct)|(?!~)punct(~~?)(?!~)(?=punct)|notPunctSpace(~~?)(?=notPunctSpace)",Kf=Xe(Gf,"gu").replace(/notPunctSpace/g,yi).replace(/punctSpace/g,vr).replace(/punct/g,ma).getRegex(),jf=Xe(/\\(punct)/,"gu").replace(/punct/g,ma).getRegex(),Vf=Xe(/^<(scheme:[^\s\x00-\x1f<>]*|email)>/).replace("scheme",/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/).replace("email",/[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/).getRegex(),Yf=Xe(_i).replace("(?:-->|$)","-->").getRegex(),Zf=Xe("^comment|^|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^|^").replace("comment",Yf).replace("attribute",/\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/).getRegex(),fr=/(?:\[(?:\\[\s\S]|[^\[\]\\])*\]|\\[\s\S]|`+(?!`)[^`]*?`+(?!`)|``+(?=\])|[^\[\]\\`])*?/,Xf=Xe(/^!?\[(label)\]\(\s*(href)(?:(?:[ \t]+(?:\n[ \t]*)?|\n[ \t]*)(title))?\s*\)/).replace("label",fr).replace("href",/<(?:\\.|[^\n<>\\])+>|[^ \t\n\x00-\x1f]*/).replace("title",/"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/).getRegex(),Bo=Xe(/^!?\[(label)\]\[(ref)\]/).replace("label",fr).replace("ref",vi).getRegex(),Fo=Xe(/^!?\[(ref)\](?:\[\])?/).replace("ref",vi).getRegex(),Jf=Xe("reflink|nolink(?!\\()","g").replace("reflink",Bo).replace("nolink",Fo).getRegex(),Gs=/[hH][tT][tT][pP][sS]?|[fF][tT][pP]/,wi={_backpedal:$n,anyPunctuation:jf,autolink:Vf,blockSkip:Uf,br:Po,code:Mf,del:$n,delLDelim:$n,delRDelim:$n,emStrongLDelim:qf,emStrongRDelimAst:Bf,emStrongRDelimUnd:Hf,escape:Df,link:Xf,nolink:Fo,punctuation:Of,reflink:Bo,reflinkSearch:Jf,tag:Zf,text:Nf,url:$n},Qf={...wi,link:Xe(/^!?\[(label)\]\((.*?)\)/).replace("label",fr).getRegex(),reflink:Xe(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label",fr).getRegex()},ai={...wi,emStrongRDelimAst:Ff,emStrongLDelim:zf,delLDelim:Wf,delRDelim:Kf,url:Xe(/^((?:protocol):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/).replace("protocol",Gs).replace("email",/[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/).getRegex(),_backpedal:/(?:[^?!.,:;*_'"~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'"~)]+(?!$))+/,del:/^(~~?)(?=[^\s~])((?:\\[\s\S]|[^\\])*?(?:\\[\s\S]|[^\s~\\]))\1(?=[^~]|$)/,text:Xe(/^([`~]+|[^`~])(?:(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\":">",'"':""","'":"'"},Ks=n=>eh[n];function Cn(n,e){if(e){if(Xt.escapeTest.test(n))return n.replace(Xt.escapeReplace,Ks)}else if(Xt.escapeTestNoEncode.test(n))return n.replace(Xt.escapeReplaceNoEncode,Ks);return n}function js(n){try{n=encodeURI(n).replace(Xt.percentDecode,"%")}catch{return null}return n}function Vs(n,e){let a=n.replace(Xt.findPipe,(o,c,d)=>{let u=!1,m=c;for(;--m>=0&&d[m]==="\\";)u=!u;return u?"|":" |"}),r=a.split(Xt.splitPipe),s=0;if(r[0].trim()||r.shift(),r.length>0&&!r.at(-1)?.trim()&&r.pop(),e)if(r.length>e)r.splice(e);else for(;r.length0?-2:-1}function nh(n,e=0){let a=e,r="";for(let s of n)if(s===" "){let o=4-a%4;r+=" ".repeat(o),a+=o}else r+=s,a++;return r}function Ys(n,e,a,r,s){let o=e.href,c=e.title||null,d=n[1].replace(s.other.outputLinkReplace,"$1");r.state.inLink=!0;let u={type:n[0].charAt(0)==="!"?"image":"link",raw:a,href:o,title:c,text:d,tokens:r.inlineTokens(d)};return r.state.inLink=!1,u}function ah(n,e,a){let r=n.match(a.other.indentCodeCompensation);if(r===null)return e;let s=r[1];return e.split(` -`).map(o=>{let c=o.match(a.other.beginningSpace);if(c===null)return o;let[d]=c;return d.length>=s.length?o.slice(s.length):o}).join(` -`)}var hr=class{options;rules;lexer;constructor(n){this.options=n||ra}space(n){let e=this.rules.block.newline.exec(n);if(e&&e[0].length>0)return{type:"space",raw:e[0]}}code(n){let e=this.rules.block.code.exec(n);if(e){let a=e[0].replace(this.rules.other.codeRemoveIndent,"");return{type:"code",raw:e[0],codeBlockStyle:"indented",text:this.options.pedantic?a:Ra(a,` -`)}}}fences(n){let e=this.rules.block.fences.exec(n);if(e){let a=e[0],r=ah(a,e[3]||"",this.rules);return{type:"code",raw:a,lang:e[2]?e[2].trim().replace(this.rules.inline.anyPunctuation,"$1"):e[2],text:r}}}heading(n){let e=this.rules.block.heading.exec(n);if(e){let a=e[2].trim();if(this.rules.other.endingHash.test(a)){let r=Ra(a,"#");(this.options.pedantic||!r||this.rules.other.endingSpaceChar.test(r))&&(a=r.trim())}return{type:"heading",raw:e[0],depth:e[1].length,text:a,tokens:this.lexer.inline(a)}}}hr(n){let e=this.rules.block.hr.exec(n);if(e)return{type:"hr",raw:Ra(e[0],` -`)}}blockquote(n){let e=this.rules.block.blockquote.exec(n);if(e){let a=Ra(e[0],` -`).split(` -`),r="",s="",o=[];for(;a.length>0;){let c=!1,d=[],u;for(u=0;u1,s={type:"list",raw:"",ordered:r,start:r?+a.slice(0,-1):"",loose:!1,items:[]};a=r?`\\d{1,9}\\${a.slice(-1)}`:`\\${a}`,this.options.pedantic&&(a=r?a:"[*+-]");let o=this.rules.other.listItemRegex(a),c=!1;for(;n;){let u=!1,m="",f="";if(!(e=o.exec(n))||this.rules.block.hr.test(n))break;m=e[0],n=n.substring(m.length);let _=nh(e[2].split(` -`,1)[0],e[1].length),w=n.split(` -`,1)[0],A=!_.trim(),x=0;if(this.options.pedantic?(x=2,f=_.trimStart()):A?x=e[1].length+1:(x=_.search(this.rules.other.nonSpaceChar),x=x>4?1:x,f=_.slice(x),x+=e[1].length),A&&this.rules.other.blankLine.test(w)&&(m+=w+` -`,n=n.substring(w.length+1),u=!0),!u){let C=this.rules.other.nextBulletRegex(x),T=this.rules.other.hrRegex(x),E=this.rules.other.fencesBeginRegex(x),M=this.rules.other.headingBeginRegex(x),U=this.rules.other.htmlBeginRegex(x),F=this.rules.other.blockquoteBeginRegex(x);for(;n;){let Y=n.split(` -`,1)[0],O;if(w=Y,this.options.pedantic?(w=w.replace(this.rules.other.listReplaceNesting," "),O=w):O=w.replace(this.rules.other.tabCharGlobal," "),E.test(w)||M.test(w)||U.test(w)||F.test(w)||C.test(w)||T.test(w))break;if(O.search(this.rules.other.nonSpaceChar)>=x||!w.trim())f+=` -`+O.slice(x);else{if(A||_.replace(this.rules.other.tabCharGlobal," ").search(this.rules.other.nonSpaceChar)>=4||E.test(_)||M.test(_)||T.test(_))break;f+=` -`+w}A=!w.trim(),m+=Y+` -`,n=n.substring(Y.length+1),_=O.slice(x)}}s.loose||(c?s.loose=!0:this.rules.other.doubleBlankLine.test(m)&&(c=!0)),s.items.push({type:"list_item",raw:m,task:!!this.options.gfm&&this.rules.other.listIsTask.test(f),loose:!1,text:f,tokens:[]}),s.raw+=m}let d=s.items.at(-1);if(d)d.raw=d.raw.trimEnd(),d.text=d.text.trimEnd();else return;s.raw=s.raw.trimEnd();for(let u of s.items){if(this.lexer.state.top=!1,u.tokens=this.lexer.blockTokens(u.text,[]),u.task){if(u.text=u.text.replace(this.rules.other.listReplaceTask,""),u.tokens[0]?.type==="text"||u.tokens[0]?.type==="paragraph"){u.tokens[0].raw=u.tokens[0].raw.replace(this.rules.other.listReplaceTask,""),u.tokens[0].text=u.tokens[0].text.replace(this.rules.other.listReplaceTask,"");for(let f=this.lexer.inlineQueue.length-1;f>=0;f--)if(this.rules.other.listIsTask.test(this.lexer.inlineQueue[f].src)){this.lexer.inlineQueue[f].src=this.lexer.inlineQueue[f].src.replace(this.rules.other.listReplaceTask,"");break}}let m=this.rules.other.listTaskCheckbox.exec(u.raw);if(m){let f={type:"checkbox",raw:m[0]+" ",checked:m[0]!=="[ ]"};u.checked=f.checked,s.loose?u.tokens[0]&&["paragraph","text"].includes(u.tokens[0].type)&&"tokens"in u.tokens[0]&&u.tokens[0].tokens?(u.tokens[0].raw=f.raw+u.tokens[0].raw,u.tokens[0].text=f.raw+u.tokens[0].text,u.tokens[0].tokens.unshift(f)):u.tokens.unshift({type:"paragraph",raw:f.raw,text:f.raw,tokens:[f]}):u.tokens.unshift(f)}}if(!s.loose){let m=u.tokens.filter(_=>_.type==="space"),f=m.length>0&&m.some(_=>this.rules.other.anyLine.test(_.raw));s.loose=f}}if(s.loose)for(let u of s.items){u.loose=!0;for(let m of u.tokens)m.type==="text"&&(m.type="paragraph")}return s}}html(n){let e=this.rules.block.html.exec(n);if(e)return{type:"html",block:!0,raw:e[0],pre:e[1]==="pre"||e[1]==="script"||e[1]==="style",text:e[0]}}def(n){let e=this.rules.block.def.exec(n);if(e){let a=e[1].toLowerCase().replace(this.rules.other.multipleSpaceGlobal," "),r=e[2]?e[2].replace(this.rules.other.hrefBrackets,"$1").replace(this.rules.inline.anyPunctuation,"$1"):"",s=e[3]?e[3].substring(1,e[3].length-1).replace(this.rules.inline.anyPunctuation,"$1"):e[3];return{type:"def",tag:a,raw:e[0],href:r,title:s}}}table(n){let e=this.rules.block.table.exec(n);if(!e||!this.rules.other.tableDelimiter.test(e[2]))return;let a=Vs(e[1]),r=e[2].replace(this.rules.other.tableAlignChars,"").split("|"),s=e[3]?.trim()?e[3].replace(this.rules.other.tableRowBlankLine,"").split(` -`):[],o={type:"table",raw:e[0],header:[],align:[],rows:[]};if(a.length===r.length){for(let c of r)this.rules.other.tableAlignRight.test(c)?o.align.push("right"):this.rules.other.tableAlignCenter.test(c)?o.align.push("center"):this.rules.other.tableAlignLeft.test(c)?o.align.push("left"):o.align.push(null);for(let c=0;c({text:d,tokens:this.lexer.inline(d),header:!1,align:o.align[u]})));return o}}lheading(n){let e=this.rules.block.lheading.exec(n);if(e){let a=e[1].trim();return{type:"heading",raw:e[0],depth:e[2].charAt(0)==="="?1:2,text:a,tokens:this.lexer.inline(a)}}}paragraph(n){let e=this.rules.block.paragraph.exec(n);if(e){let a=e[1].charAt(e[1].length-1)===` -`?e[1].slice(0,-1):e[1];return{type:"paragraph",raw:e[0],text:a,tokens:this.lexer.inline(a)}}}text(n){let e=this.rules.block.text.exec(n);if(e)return{type:"text",raw:e[0],text:e[0],tokens:this.lexer.inline(e[0])}}escape(n){let e=this.rules.inline.escape.exec(n);if(e)return{type:"escape",raw:e[0],text:e[1]}}tag(n){let e=this.rules.inline.tag.exec(n);if(e)return!this.lexer.state.inLink&&this.rules.other.startATag.test(e[0])?this.lexer.state.inLink=!0:this.lexer.state.inLink&&this.rules.other.endATag.test(e[0])&&(this.lexer.state.inLink=!1),!this.lexer.state.inRawBlock&&this.rules.other.startPreScriptTag.test(e[0])?this.lexer.state.inRawBlock=!0:this.lexer.state.inRawBlock&&this.rules.other.endPreScriptTag.test(e[0])&&(this.lexer.state.inRawBlock=!1),{type:"html",raw:e[0],inLink:this.lexer.state.inLink,inRawBlock:this.lexer.state.inRawBlock,block:!1,text:e[0]}}link(n){let e=this.rules.inline.link.exec(n);if(e){let a=e[2].trim();if(!this.options.pedantic&&this.rules.other.startAngleBracket.test(a)){if(!this.rules.other.endAngleBracket.test(a))return;let o=Ra(a.slice(0,-1),"\\");if((a.length-o.length)%2===0)return}else{let o=th(e[2],"()");if(o===-2)return;if(o>-1){let c=(e[0].indexOf("!")===0?5:4)+e[1].length+o;e[2]=e[2].substring(0,o),e[0]=e[0].substring(0,c).trim(),e[3]=""}}let r=e[2],s="";if(this.options.pedantic){let o=this.rules.other.pedanticHrefTitle.exec(r);o&&(r=o[1],s=o[3])}else s=e[3]?e[3].slice(1,-1):"";return r=r.trim(),this.rules.other.startAngleBracket.test(r)&&(this.options.pedantic&&!this.rules.other.endAngleBracket.test(a)?r=r.slice(1):r=r.slice(1,-1)),Ys(e,{href:r&&r.replace(this.rules.inline.anyPunctuation,"$1"),title:s&&s.replace(this.rules.inline.anyPunctuation,"$1")},e[0],this.lexer,this.rules)}}reflink(n,e){let a;if((a=this.rules.inline.reflink.exec(n))||(a=this.rules.inline.nolink.exec(n))){let r=(a[2]||a[1]).replace(this.rules.other.multipleSpaceGlobal," "),s=e[r.toLowerCase()];if(!s){let o=a[0].charAt(0);return{type:"text",raw:o,text:o}}return Ys(a,s,a[0],this.lexer,this.rules)}}emStrong(n,e,a=""){let r=this.rules.inline.emStrongLDelim.exec(n);if(!(!r||!r[1]&&!r[2]&&!r[3]&&!r[4]||r[4]&&a.match(this.rules.other.unicodeAlphaNumeric))&&(!(r[1]||r[3])||!a||this.rules.inline.punctuation.exec(a))){let s=[...r[0]].length-1,o,c,d=s,u=0,m=r[0][0]==="*"?this.rules.inline.emStrongRDelimAst:this.rules.inline.emStrongRDelimUnd;for(m.lastIndex=0,e=e.slice(-1*n.length+s);(r=m.exec(e))!==null;){if(o=r[1]||r[2]||r[3]||r[4]||r[5]||r[6],!o)continue;if(c=[...o].length,r[3]||r[4]){d+=c;continue}else if((r[5]||r[6])&&s%3&&!((s+c)%3)){u+=c;continue}if(d-=c,d>0)continue;c=Math.min(c,c+d+u);let f=[...r[0]][0].length,_=n.slice(0,s+r.index+f+c);if(Math.min(s,c)%2){let A=_.slice(1,-1);return{type:"em",raw:_,text:A,tokens:this.lexer.inlineTokens(A)}}let w=_.slice(2,-2);return{type:"strong",raw:_,text:w,tokens:this.lexer.inlineTokens(w)}}}}codespan(n){let e=this.rules.inline.code.exec(n);if(e){let a=e[2].replace(this.rules.other.newLineCharGlobal," "),r=this.rules.other.nonSpaceChar.test(a),s=this.rules.other.startingSpaceChar.test(a)&&this.rules.other.endingSpaceChar.test(a);return r&&s&&(a=a.substring(1,a.length-1)),{type:"codespan",raw:e[0],text:a}}}br(n){let e=this.rules.inline.br.exec(n);if(e)return{type:"br",raw:e[0]}}del(n,e,a=""){let r=this.rules.inline.delLDelim.exec(n);if(r&&(!r[1]||!a||this.rules.inline.punctuation.exec(a))){let s=[...r[0]].length-1,o,c,d=s,u=this.rules.inline.delRDelim;for(u.lastIndex=0,e=e.slice(-1*n.length+s);(r=u.exec(e))!==null;){if(o=r[1]||r[2]||r[3]||r[4]||r[5]||r[6],!o||(c=[...o].length,c!==s))continue;if(r[3]||r[4]){d+=c;continue}if(d-=c,d>0)continue;c=Math.min(c,c+d);let m=[...r[0]][0].length,f=n.slice(0,s+r.index+m+c),_=f.slice(s,-s);return{type:"del",raw:f,text:_,tokens:this.lexer.inlineTokens(_)}}}}autolink(n){let e=this.rules.inline.autolink.exec(n);if(e){let a,r;return e[2]==="@"?(a=e[1],r="mailto:"+a):(a=e[1],r=a),{type:"link",raw:e[0],text:a,href:r,tokens:[{type:"text",raw:a,text:a}]}}}url(n){let e;if(e=this.rules.inline.url.exec(n)){let a,r;if(e[2]==="@")a=e[0],r="mailto:"+a;else{let s;do s=e[0],e[0]=this.rules.inline._backpedal.exec(e[0])?.[0]??"";while(s!==e[0]);a=e[0],e[1]==="www."?r="http://"+e[0]:r=e[0]}return{type:"link",raw:e[0],text:a,href:r,tokens:[{type:"text",raw:a,text:a}]}}}inlineText(n){let e=this.rules.inline.text.exec(n);if(e){let a=this.lexer.state.inRawBlock;return{type:"text",raw:e[0],text:e[0],escaped:a}}}},_n=class ri{tokens;options;state;inlineQueue;tokenizer;constructor(e){this.tokens=[],this.tokens.links=Object.create(null),this.options=e||ra,this.options.tokenizer=this.options.tokenizer||new hr,this.tokenizer=this.options.tokenizer,this.tokenizer.options=this.options,this.tokenizer.lexer=this,this.inlineQueue=[],this.state={inLink:!1,inRawBlock:!1,top:!0};let a={other:Xt,block:rr.normal,inline:Ia.normal};this.options.pedantic?(a.block=rr.pedantic,a.inline=Ia.pedantic):this.options.gfm&&(a.block=rr.gfm,this.options.breaks?a.inline=Ia.breaks:a.inline=Ia.gfm),this.tokenizer.rules=a}static get rules(){return{block:rr,inline:Ia}}static lex(e,a){return new ri(a).lex(e)}static lexInline(e,a){return new ri(a).inlineTokens(e)}lex(e){e=e.replace(Xt.carriageReturn,` -`),this.blockTokens(e,this.tokens);for(let a=0;a(s=c.call({lexer:this},e,a))?(e=e.substring(s.raw.length),a.push(s),!0):!1))continue;if(s=this.tokenizer.space(e)){e=e.substring(s.raw.length);let c=a.at(-1);s.raw.length===1&&c!==void 0?c.raw+=` -`:a.push(s);continue}if(s=this.tokenizer.code(e)){e=e.substring(s.raw.length);let c=a.at(-1);c?.type==="paragraph"||c?.type==="text"?(c.raw+=(c.raw.endsWith(` -`)?"":` -`)+s.raw,c.text+=` -`+s.text,this.inlineQueue.at(-1).src=c.text):a.push(s);continue}if(s=this.tokenizer.fences(e)){e=e.substring(s.raw.length),a.push(s);continue}if(s=this.tokenizer.heading(e)){e=e.substring(s.raw.length),a.push(s);continue}if(s=this.tokenizer.hr(e)){e=e.substring(s.raw.length),a.push(s);continue}if(s=this.tokenizer.blockquote(e)){e=e.substring(s.raw.length),a.push(s);continue}if(s=this.tokenizer.list(e)){e=e.substring(s.raw.length),a.push(s);continue}if(s=this.tokenizer.html(e)){e=e.substring(s.raw.length),a.push(s);continue}if(s=this.tokenizer.def(e)){e=e.substring(s.raw.length);let c=a.at(-1);c?.type==="paragraph"||c?.type==="text"?(c.raw+=(c.raw.endsWith(` -`)?"":` -`)+s.raw,c.text+=` -`+s.raw,this.inlineQueue.at(-1).src=c.text):this.tokens.links[s.tag]||(this.tokens.links[s.tag]={href:s.href,title:s.title},a.push(s));continue}if(s=this.tokenizer.table(e)){e=e.substring(s.raw.length),a.push(s);continue}if(s=this.tokenizer.lheading(e)){e=e.substring(s.raw.length),a.push(s);continue}let o=e;if(this.options.extensions?.startBlock){let c=1/0,d=e.slice(1),u;this.options.extensions.startBlock.forEach(m=>{u=m.call({lexer:this},d),typeof u=="number"&&u>=0&&(c=Math.min(c,u))}),c<1/0&&c>=0&&(o=e.substring(0,c+1))}if(this.state.top&&(s=this.tokenizer.paragraph(o))){let c=a.at(-1);r&&c?.type==="paragraph"?(c.raw+=(c.raw.endsWith(` -`)?"":` -`)+s.raw,c.text+=` -`+s.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=c.text):a.push(s),r=o.length!==e.length,e=e.substring(s.raw.length);continue}if(s=this.tokenizer.text(e)){e=e.substring(s.raw.length);let c=a.at(-1);c?.type==="text"?(c.raw+=(c.raw.endsWith(` -`)?"":` -`)+s.raw,c.text+=` -`+s.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=c.text):a.push(s);continue}if(e){let c="Infinite loop on byte: "+e.charCodeAt(0);if(this.options.silent){console.error(c);break}else throw new Error(c)}}return this.state.top=!0,a}inline(e,a=[]){return this.inlineQueue.push({src:e,tokens:a}),a}inlineTokens(e,a=[]){this.tokenizer.lexer=this;let r=e,s=null;if(this.tokens.links){let u=Object.keys(this.tokens.links);if(u.length>0)for(;(s=this.tokenizer.rules.inline.reflinkSearch.exec(r))!==null;)u.includes(s[0].slice(s[0].lastIndexOf("[")+1,-1))&&(r=r.slice(0,s.index)+"["+"a".repeat(s[0].length-2)+"]"+r.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex))}for(;(s=this.tokenizer.rules.inline.anyPunctuation.exec(r))!==null;)r=r.slice(0,s.index)+"++"+r.slice(this.tokenizer.rules.inline.anyPunctuation.lastIndex);let o;for(;(s=this.tokenizer.rules.inline.blockSkip.exec(r))!==null;)o=s[2]?s[2].length:0,r=r.slice(0,s.index+o)+"["+"a".repeat(s[0].length-o-2)+"]"+r.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);r=this.options.hooks?.emStrongMask?.call({lexer:this},r)??r;let c=!1,d="";for(;e;){c||(d=""),c=!1;let u;if(this.options.extensions?.inline?.some(f=>(u=f.call({lexer:this},e,a))?(e=e.substring(u.raw.length),a.push(u),!0):!1))continue;if(u=this.tokenizer.escape(e)){e=e.substring(u.raw.length),a.push(u);continue}if(u=this.tokenizer.tag(e)){e=e.substring(u.raw.length),a.push(u);continue}if(u=this.tokenizer.link(e)){e=e.substring(u.raw.length),a.push(u);continue}if(u=this.tokenizer.reflink(e,this.tokens.links)){e=e.substring(u.raw.length);let f=a.at(-1);u.type==="text"&&f?.type==="text"?(f.raw+=u.raw,f.text+=u.text):a.push(u);continue}if(u=this.tokenizer.emStrong(e,r,d)){e=e.substring(u.raw.length),a.push(u);continue}if(u=this.tokenizer.codespan(e)){e=e.substring(u.raw.length),a.push(u);continue}if(u=this.tokenizer.br(e)){e=e.substring(u.raw.length),a.push(u);continue}if(u=this.tokenizer.del(e,r,d)){e=e.substring(u.raw.length),a.push(u);continue}if(u=this.tokenizer.autolink(e)){e=e.substring(u.raw.length),a.push(u);continue}if(!this.state.inLink&&(u=this.tokenizer.url(e))){e=e.substring(u.raw.length),a.push(u);continue}let m=e;if(this.options.extensions?.startInline){let f=1/0,_=e.slice(1),w;this.options.extensions.startInline.forEach(A=>{w=A.call({lexer:this},_),typeof w=="number"&&w>=0&&(f=Math.min(f,w))}),f<1/0&&f>=0&&(m=e.substring(0,f+1))}if(u=this.tokenizer.inlineText(m)){e=e.substring(u.raw.length),u.raw.slice(-1)!=="_"&&(d=u.raw.slice(-1)),c=!0;let f=a.at(-1);f?.type==="text"?(f.raw+=u.raw,f.text+=u.text):a.push(u);continue}if(e){let f="Infinite loop on byte: "+e.charCodeAt(0);if(this.options.silent){console.error(f);break}else throw new Error(f)}}return a}},gr=class{options;parser;constructor(n){this.options=n||ra}space(n){return""}code({text:n,lang:e,escaped:a}){let r=(e||"").match(Xt.notSpaceStart)?.[0],s=n.replace(Xt.endingNewline,"")+` -`;return r?'
    '+(a?s:Cn(s,!0))+`
    -`:"
    "+(a?s:Cn(s,!0))+`
    -`}blockquote({tokens:n}){return`
    -${this.parser.parse(n)}
    -`}html({text:n}){return n}def(n){return""}heading({tokens:n,depth:e}){return`${this.parser.parseInline(n)} -`}hr(n){return`
    -`}list(n){let e=n.ordered,a=n.start,r="";for(let c=0;c -`+r+" -`}listitem(n){return`
  • ${this.parser.parse(n.tokens)}
  • -`}checkbox({checked:n}){return" '}paragraph({tokens:n}){return`

    ${this.parser.parseInline(n)}

    -`}table(n){let e="",a="";for(let s=0;s${r}`),` - -`+e+` -`+r+`
    -`}tablerow({text:n}){return` -${n} -`}tablecell(n){let e=this.parser.parseInline(n.tokens),a=n.header?"th":"td";return(n.align?`<${a} align="${n.align}">`:`<${a}>`)+e+` -`}strong({tokens:n}){return`${this.parser.parseInline(n)}`}em({tokens:n}){return`${this.parser.parseInline(n)}`}codespan({text:n}){return`${Cn(n,!0)}`}br(n){return"
    "}del({tokens:n}){return`${this.parser.parseInline(n)}`}link({href:n,title:e,tokens:a}){let r=this.parser.parseInline(a),s=js(n);if(s===null)return r;n=s;let o='
    ",o}image({href:n,title:e,text:a,tokens:r}){r&&(a=this.parser.parseInline(r,this.parser.textRenderer));let s=js(n);if(s===null)return Cn(a);n=s;let o=`${Cn(a)}{let c=s[o].flat(1/0);a=a.concat(this.walkTokens(c,e))}):s.tokens&&(a=a.concat(this.walkTokens(s.tokens,e)))}}return a}use(...n){let e=this.defaults.extensions||{renderers:{},childTokens:{}};return n.forEach(a=>{let r={...a};if(r.async=this.defaults.async||r.async||!1,a.extensions&&(a.extensions.forEach(s=>{if(!s.name)throw new Error("extension name required");if("renderer"in s){let o=e.renderers[s.name];o?e.renderers[s.name]=function(...c){let d=s.renderer.apply(this,c);return d===!1&&(d=o.apply(this,c)),d}:e.renderers[s.name]=s.renderer}if("tokenizer"in s){if(!s.level||s.level!=="block"&&s.level!=="inline")throw new Error("extension level must be 'block' or 'inline'");let o=e[s.level];o?o.unshift(s.tokenizer):e[s.level]=[s.tokenizer],s.start&&(s.level==="block"?e.startBlock?e.startBlock.push(s.start):e.startBlock=[s.start]:s.level==="inline"&&(e.startInline?e.startInline.push(s.start):e.startInline=[s.start]))}"childTokens"in s&&s.childTokens&&(e.childTokens[s.name]=s.childTokens)}),r.extensions=e),a.renderer){let s=this.defaults.renderer||new gr(this.defaults);for(let o in a.renderer){if(!(o in s))throw new Error(`renderer '${o}' does not exist`);if(["options","parser"].includes(o))continue;let c=o,d=a.renderer[c],u=s[c];s[c]=(...m)=>{let f=d.apply(s,m);return f===!1&&(f=u.apply(s,m)),f||""}}r.renderer=s}if(a.tokenizer){let s=this.defaults.tokenizer||new hr(this.defaults);for(let o in a.tokenizer){if(!(o in s))throw new Error(`tokenizer '${o}' does not exist`);if(["options","rules","lexer"].includes(o))continue;let c=o,d=a.tokenizer[c],u=s[c];s[c]=(...m)=>{let f=d.apply(s,m);return f===!1&&(f=u.apply(s,m)),f}}r.tokenizer=s}if(a.hooks){let s=this.defaults.hooks||new Na;for(let o in a.hooks){if(!(o in s))throw new Error(`hook '${o}' does not exist`);if(["options","block"].includes(o))continue;let c=o,d=a.hooks[c],u=s[c];Na.passThroughHooks.has(o)?s[c]=m=>{if(this.defaults.async&&Na.passThroughHooksRespectAsync.has(o))return(async()=>{let _=await d.call(s,m);return u.call(s,_)})();let f=d.call(s,m);return u.call(s,f)}:s[c]=(...m)=>{if(this.defaults.async)return(async()=>{let _=await d.apply(s,m);return _===!1&&(_=await u.apply(s,m)),_})();let f=d.apply(s,m);return f===!1&&(f=u.apply(s,m)),f}}r.hooks=s}if(a.walkTokens){let s=this.defaults.walkTokens,o=a.walkTokens;r.walkTokens=function(c){let d=[];return d.push(o.call(this,c)),s&&(d=d.concat(s.call(this,c))),d}}this.defaults={...this.defaults,...r}}),this}setOptions(n){return this.defaults={...this.defaults,...n},this}lexer(n,e){return _n.lex(n,e??this.defaults)}parser(n,e){return bn.parse(n,e??this.defaults)}parseMarkdown(n){return(e,a)=>{let r={...a},s={...this.defaults,...r},o=this.onError(!!s.silent,!!s.async);if(this.defaults.async===!0&&r.async===!1)return o(new Error("marked(): The async option was set to true by an extension. Remove async: false from the parse options object to return a Promise."));if(typeof e>"u"||e===null)return o(new Error("marked(): input parameter is undefined or null"));if(typeof e!="string")return o(new Error("marked(): input parameter is of type "+Object.prototype.toString.call(e)+", string expected"));if(s.hooks&&(s.hooks.options=s,s.hooks.block=n),s.async)return(async()=>{let c=s.hooks?await s.hooks.preprocess(e):e,d=await(s.hooks?await s.hooks.provideLexer(n):n?_n.lex:_n.lexInline)(c,s),u=s.hooks?await s.hooks.processAllTokens(d):d;s.walkTokens&&await Promise.all(this.walkTokens(u,s.walkTokens));let m=await(s.hooks?await s.hooks.provideParser(n):n?bn.parse:bn.parseInline)(u,s);return s.hooks?await s.hooks.postprocess(m):m})().catch(o);try{s.hooks&&(e=s.hooks.preprocess(e));let c=(s.hooks?s.hooks.provideLexer(n):n?_n.lex:_n.lexInline)(e,s);s.hooks&&(c=s.hooks.processAllTokens(c)),s.walkTokens&&this.walkTokens(c,s.walkTokens);let d=(s.hooks?s.hooks.provideParser(n):n?bn.parse:bn.parseInline)(c,s);return s.hooks&&(d=s.hooks.postprocess(d)),d}catch(c){return o(c)}}}onError(n,e){return a=>{if(a.message+=` -Please report this to https://github.com/markedjs/marked.`,n){let r="

    An error occurred:

    "+Cn(a.message+"",!0)+"
    ";return e?Promise.resolve(r):r}if(e)return Promise.reject(a);throw a}}},aa=new rh;function ut(n,e){return aa.parse(n,e)}ut.options=ut.setOptions=function(n){return aa.setOptions(n),ut.defaults=aa.defaults,Mo(ut.defaults),ut};ut.getDefaults=gi;ut.defaults=ra;ut.use=function(...n){return aa.use(...n),ut.defaults=aa.defaults,Mo(ut.defaults),ut};ut.walkTokens=function(n,e){return aa.walkTokens(n,e)};ut.parseInline=aa.parseInline;ut.Parser=bn;ut.parser=bn.parse;ut.Renderer=gr;ut.TextRenderer=ki;ut.Lexer=_n;ut.lexer=_n.lex;ut.Tokenizer=hr;ut.Hooks=Na;ut.parse=ut;ut.options;ut.setOptions;ut.use;ut.walkTokens;ut.parseInline;bn.parse;_n.lex;function si(n){return vf.sanitize(ut.parse(n,{async:!1,breaks:!0,gfm:!0}))}function Ba(n){return new Intl.DateTimeFormat(void 0,{hour:"2-digit",minute:"2-digit"}).format(new Date(n))}var ih=V('
    '),sh=V(''),oh=V(' ',1),lh=V('
    ',2),ch=V('
    '),uh=V(''),dh=V(''),fh=V(' ');function oi(n,e){vt(e,!0);let a=Oe(e,"onOpenImage",3,()=>{});const r=360,s=120;let o=ht(null),c=ht(null),d=ht(!1),u=ht(!1),m=ht(!1),f=ht(""),_=ce(()=>t(f)||O(e.upload.duration_ms??0)),w=null,A=ce(()=>(e.upload.content_type||"").split(";")[0].trim().toLowerCase()),x=ce(()=>t(A).startsWith("image/")),C=ce(()=>t(A).startsWith("video/")),T=ce(()=>t(A).startsWith("audio/")),E=ce(()=>t(A)==="application/pdf"),M=ce(()=>t(A)==="text/plain"),U=ce(()=>t(E)||t(M)),F=ce(()=>t(E)?"PDF":"Text"),Y=ce(()=>{const I=e.upload.width??0,H=e.upload.height??0;if(I<=0||H<=0)return"";const $=t(x)?320:r,ee=Math.min($,Math.max(s,H));return`aspect-ratio: ${I} / ${H}; max-height: ${ee}px;`});function O(I){if(!I||I<=0)return"";const H=Math.floor(I/1e3),$=Math.floor(H/60),ee=H%60;return`${$}:${ee.toString().padStart(2,"0")}`}function Z(){h(d,!0)}function N(){!t(o)||!isFinite(t(o).duration)||h(f,O(t(o).duration*1e3),!0)}function L(){t(o)&&(h(d,!0),t(o).play())}function G(I){return I<1024?`${I} B`:I<1024*1024?`${Math.round(I/1024)} KB`:`${(I/(1024*1024)).toFixed(1)} MB`}nn(()=>{if(!t(E)||!t(c)){h(u,!1),h(m,!1);return}w?.();let I=!1,H=null,$=null,ee=null;return h(u,!1),h(m,!1),(async()=>{try{const[Te,Ne]=await Promise.all([hs(()=>import("./B75MOh95.js"),[],import.meta.url),hs(()=>import("./DGzl3AwC.js"),[],import.meta.url)]);Te.GlobalWorkerOptions.workerSrc=Ne.default,$=Te.getDocument({url:e.url,withCredentials:!0}),ee=await $.promise;const Ae=await ee.getPage(1);if(I)return;const Ue=128/Ae.getViewport({scale:1}).width,we=Ae.getViewport({scale:Ue}),Fe=t(c),he=Fe?.getContext("2d");if(!Fe||!he)throw new Error("pdf thumbnail canvas unavailable");const Re=Math.min(window.devicePixelRatio||1,2);Fe.width=Math.max(1,Math.floor(we.width*Re)),Fe.height=Math.max(1,Math.floor(we.height*Re)),he.setTransform(Re,0,0,Re,0,0),H=Ae.render({canvasContext:he,viewport:we}),await H.promise,I||h(u,!0)}catch(Te){!I&&!(Te instanceof Error&&Te.name==="RenderingCancelledException")&&h(m,!0)}})(),w=()=>{I=!0,H?.cancel(),ee?.destroy(),$?.destroy(),w=null},()=>w?.()}),Ha(()=>w?.());var K=yn(),q=Vt(K);{var D=I=>{var H=ih(),$=b(H),ee=b($);v($);var Se=k($,2),Te=b(Se),Ne=b(Te,!0);v(Te);var Ae=k(Te,2);v(Se),v(H),oe(()=>{re($,"aria-label",`Open image ${e.upload.filename}`),re(ee,"src",e.url),re(ee,"alt",e.upload.filename),re(ee,"width",e.upload.width||void 0),re(ee,"height",e.upload.height||void 0),na(ee,t(Y)),ie(Ne,e.upload.filename),re(Ae,"href",e.url),re(Ae,"download",e.upload.filename),re(Ae,"aria-label",`Download ${e.upload.filename}`)}),Q("click",$,()=>a()(e.url,e.upload.filename)),Q("click",Ae,pe=>pe.stopPropagation()),z(I,H)},P=I=>{var H=lh();let $;var ee=b(H),Se=b(ee);v(ee),Xn(ee,Fe=>h(o,Fe),()=>t(o));var Te=k(ee,2);{var Ne=Fe=>{var he=oh(),Re=Vt(he),Le=k(Re,2);{var et=Ge=>{var me=sh(),Be=b(me,!0);v(me),oe(()=>ie(Be,t(_))),z(Ge,me)};ue(Le,Ge=>{t(_)&&Ge(et)})}oe(()=>re(Re,"aria-label",`Play ${e.upload.filename}`)),Q("click",Re,L),z(Fe,he)};ue(Te,Fe=>{t(d)||Fe(Ne)})}var Ae=k(Te,2),pe=b(Ae),Ue=b(pe,!0);v(pe);var we=k(pe,2);v(Ae),v(H),oe(()=>{$=gt(H,1,"media-tile media-tile--video",null,$,{"is-started":t(d)}),ee.controls=t(d),re(ee,"aria-label",e.upload.filename),re(ee,"width",e.upload.width||void 0),re(ee,"height",e.upload.height||void 0),na(ee,t(Y)),re(Se,"src",e.url),re(Se,"type",t(A)),ie(Ue,e.upload.filename),re(we,"href",e.url),re(we,"download",e.upload.filename),re(we,"aria-label",`Download ${e.upload.filename}`)}),an("play",ee,Z),an("loadedmetadata",ee,N),Q("click",we,Fe=>Fe.stopPropagation()),z(I,H)},W=I=>{var H=ch(),$=b(H),ee=k(b($),2),Se=b(ee),Te=b(Se,!0);v(Se);var Ne=k(Se,2),Ae=b(Ne,!0);v(Ne),v(ee),v($);var pe=k($,2),Ue=b(pe),we=b(Ue,!0);v(Ue),v(pe),v(H),oe(Fe=>{ie(Te,e.upload.filename),ie(Ae,Fe),re(pe,"src",e.url),re(Ue,"href",e.url),ie(we,e.upload.filename)},[()=>G(e.upload.byte_size)]),z(I,H)},ae=I=>{var H=dh(),$=b(H);let ee;var Se=b($);{var Te=Le=>{var et=uh();Xn(et,Ge=>h(c,Ge),()=>t(c)),z(Le,et)};ue(Se,Le=>{t(E)&&Le(Te)})}var Ne=k(Se,2),Ae=b(Ne,!0);v(Ne),v($);var pe=k($,2),Ue=b(pe),we=b(Ue,!0);v(Ue);var Fe=k(Ue,2),he=b(Fe,!0);v(Fe),v(pe);var Re=k(pe,2);v(H),oe(Le=>{ee=gt($,1,"document-attachment__thumbnail",null,ee,{"has-preview":t(u),"thumbnail-failed":t(m)}),re($,"href",e.url),re($,"aria-label",`Open ${e.upload.filename}`),ie(Ae,t(F)),re(Ue,"href",e.url),ie(we,e.upload.filename),ie(he,Le),re(Re,"href",e.url),re(Re,"download",e.upload.filename),re(Re,"aria-label",`Download ${e.upload.filename}`)},[()=>G(e.upload.byte_size)]),z(I,H)},j=I=>{var H=fh(),$=k(b(H),2),ee=b($),Se=b(ee,!0);v(ee);var Te=k(ee,2),Ne=b(Te,!0);v(Te),v($),v(H),oe(Ae=>{re(H,"href",e.url),ie(Se,e.upload.filename),ie(Ne,Ae)},[()=>G(e.upload.byte_size)]),z(I,H)};ue(q,I=>{t(x)?I(D):t(C)?I(P,1):t(T)?I(W,2):t(U)?I(ae,3):I(j,-1)})}z(n,K),_t()}wt(["click"]);var hh=V(' '),gh=V(' '),ph=V('');function Ho(n,e){vt(e,!0);var a=yn(),r=Vt(a);{var s=o=>{var c=ph();let d;var u=k(b(c),2),m=b(u),f=b(m,!0);v(m);var _=k(m,2);{var w=x=>{var C=hh(),T=b(C,!0);v(C),oe(E=>ie(T,E),[()=>$r(e.message.quoted_body_snapshot)]),z(x,C)},A=x=>{var C=gh(),T=b(C);v(C),oe(E=>ie(T,`[original deleted] ${E??""}`),[()=>$r(e.message.quoted_body_snapshot)]),z(x,C)};ue(_,x=>{e.message.quoted_message_id?x(w):x(A,-1)})}v(u),v(c),oe((x,C)=>{d=gt(c,1,"quote-block",null,d,{dangling:!e.message.quoted_message_id}),c.disabled=!e.message.quoted_message_id,re(c,"aria-label",x),ie(f,C)},[()=>e.message.quoted_message_id?`Jump to quoted message from ${xs(e.message)}`:"Original message was deleted",()=>xs(e.message)]),Q("click",c,()=>e.onJump(e.message)),z(o,c)};ue(r,o=>{(e.message.quoted_message_id||e.message.quoted_body_snapshot)&&o(s)})}z(n,a),_t()}wt(["click"]);var mh=V('
    '),vh=V(''),_h=V(''),bh=V(``),yh=V(""),wh=V(" ",1),kh=V('
    ');function Th(n,e){vt(e,!0);let a=ce(()=>e.message.status==="pending"),r=ce(()=>e.message.status==="failed"),s=ce(()=>e.message.thread_state?.reply_count||0),o=ce(()=>t(s)>0),c=ce(()=>Qu(e.message));function d(K){t(a)||t(r)||window.getSelection()?.toString()||K.target?.closest("a, button, input, textarea, select, .attachment-grid, .media-tile, .markdown img, .gif-player, .message-actions, .message-failed")||e.onOpenThread(e.message)}function u(K){return K.addEventListener("click",d),{destroy(){K.removeEventListener("click",d)}}}var m=kh();let f;var _=b(m),w=b(_,!0);v(_);var A=k(_,2),x=b(A);Ho(x,{get message(){return e.message},get onJump(){return e.onJumpToQuote}});var C=k(x,2);jr(C,()=>si(e.message.body),!0),v(C),qa(C,K=>Xr?.(K));var T=k(C,2);{var E=K=>{var q=mh();Ft(q,21,()=>e.message.attachments,D=>D.id,(D,P)=>{{let W=ce(()=>dr(t(P)));oi(D,{get upload(){return t(P)},get url(){return t(W)},get onOpenImage(){return e.onOpenImage}})}}),v(q),z(K,q)};ue(T,K=>{e.message.attachments?.length&&K(E)})}var M=k(T,2);{var U=K=>{var q=bh(),D=k(b(q),2);{var P=j=>{var I=vh();Q("click",I,()=>e.onRetry?.(e.message)),z(j,I)};ue(D,j=>{e.onRetry&&j(P)})}var W=k(D,2);{var ae=j=>{var I=_h();Q("click",I,()=>e.onDiscard?.(e.message)),z(j,I)};ue(W,j=>{e.onDiscard&&j(ae)})}v(q),z(K,q)};ue(M,K=>{t(r)&&K(U)})}var F=k(M,2);let Y;var O=k(b(F),2);{var Z=K=>{var q=wh(),D=Vt(q),P=b(D,!0);v(D);var W=k(D,2);{var ae=j=>{var I=yh(),H=b(I,!0);v(I),oe(()=>{re(I,"datetime",e.message.thread_state?.last_reply_at),ie(H,t(c))}),z(j,I)};ue(W,j=>{t(c)&&j(ae)})}oe(j=>ie(P,j),[()=>Ju(e.message)]),z(K,q)};ue(O,K=>{(t(o)||e.selectedThreadID===e.message.id)&&K(Z)})}v(F),v(A);var N=k(A,2),L=b(N),G=k(L,2);v(N),v(m),qa(m,K=>u?.(K)),oe((K,q,D,P)=>{f=gt(m,1,"message-row",null,f,{selected:e.selected,"is-pending":t(a),"is-failed":t(r),"can-open-thread":!t(a)&&!t(r)}),re(m,"data-message-id",e.message.id),ie(w,K),Y=gt(F,1,"thread-hint tooltip",null,Y,{"has-replies":t(o),"is-open":e.selectedThreadID===e.message.id}),re(F,"data-tooltip",q),re(F,"aria-label",D),F.disabled=t(a)||t(r),L.disabled=t(a)||t(r),re(G,"data-tooltip",P),G.disabled=t(a)||t(r)},[()=>e.index===0?"":Ba(e.message.created_at),()=>Ur(e.message,e.selectedThreadID),()=>Ur(e.message,e.selectedThreadID),()=>Ur(e.message,e.selectedThreadID)]),Q("click",F,()=>e.onOpenThread(e.message)),Q("click",L,()=>e.onReply(e.message,e.replyContext)),Q("click",G,()=>e.onOpenThread(e.message)),z(n,m),_t()}wt(["click"]);var Sh=V('bot'),xh=V(" "),Eh=V('
    ');function Ah(n,e){vt(e,!0);const a=ce(()=>e.group.messages[0]?.author),r=ce(()=>t(a)?.kind==="bot");var s=Eh(),o=b(s);{let E=ce(()=>`View profile for ${e.group.authorName}`);Pn(o,{class:"avatar avatar-button",get id(){return e.group.authorID},get name(){return e.group.authorName},get src(){return e.group.authorAvatarURL},size:38,get buttonLabel(){return t(E)},onclick:()=>e.onOpenProfile(e.group.messages[0]?.author)})}var c=k(o,2),d=b(c),u=b(d),m=b(u,!0);v(u);var f=k(u,2);{var _=E=>{var M=Sh();z(E,M)};ue(f,E=>{t(r)&&E(_)})}var w=k(f,2);{var A=E=>{var M=xh(),U=b(M,!0);v(M),oe(F=>ie(U,F),[()=>Ln(e.group.authorHandle)]),z(E,M)};ue(w,E=>{e.group.authorHandle&&E(A)})}var x=k(w,2),C=b(x,!0);v(x),v(d);var T=k(d,2);Ft(T,19,()=>e.group.messages,E=>E.id,(E,M,U)=>{{let F=ce(()=>e.selectedThreadID===t(M).id);Th(E,{get message(){return t(M)},get index(){return t(U)},get selected(){return t(F)},get replyContext(){return e.replyContext},get selectedThreadID(){return e.selectedThreadID},get onReply(){return e.onReply},get onOpenThread(){return e.onOpenThread},get onJumpToQuote(){return e.onJumpToQuote},get onOpenImage(){return e.onOpenImage},get onRetry(){return e.onRetry},get onDiscard(){return e.onDiscard}})}}),v(c),v(s),oe(E=>{ie(m,e.group.authorName),ie(C,E)},[()=>Ba(e.group.timestamp)]),Q("click",u,()=>e.onOpenProfile(e.group.messages[0]?.author)),z(n,s),_t()}wt(["click"]);var Ch=V('
    Send a message in Markdown — code fences, lists, links all work. Threads open from any message.
    '),Ih=V('
    '),Rh=V('
    '),Dh=V('
    New
    '),Mh=V('
    '),Nh=V('
    '),Oh=V('
    ');function Lh(n,e){vt(e,!0);let a=Oe(e,"loading",3,!1),r=Oe(e,"unreadCount",3,0),s=Oe(e,"unreadBoundarySeq",3,0),o=Oe(e,"unreadBoundaryLoaded",3,!1),c=Oe(e,"unreadSince",3,""),d=Oe(e,"hasOlder",3,!1),u=Oe(e,"hasNewer",3,!1),m=Oe(e,"loadingOlder",3,!1),f=Oe(e,"loadingNewer",3,!1),_=Oe(e,"prepending",3,!1);const w=1.5,A=160,x=260,C=180;let T=ht(void 0),E=ht(void 0),M=ht(void 0),U=ht(0),F=ht(0),Y=ce(()=>e.selectedDirect?"dm":"channel"),O=ht(""),Z=ht(-1),N=ht(0),L=ce(()=>t(O)===e.viewKey&&t(Z)===s()&&r()<=t(N)?0:r()),G=ht(""),K=ht(0),q=ht(!1),D,P=ce(()=>t(L)>0?t(L):t(K));function W(){D&&(window.clearTimeout(D),D=void 0)}nn(()=>{if(t(G)&&t(G)!==e.viewKey){W(),h(K,0),h(G,""),h(q,!1);return}if(t(L)>0){W(),h(G,e.viewKey,!0),h(K,t(L),!0),h(q,!1);return}t(K)>0&&!t(q)&&(h(q,!0),D=window.setTimeout(()=>{D=void 0,!(t(L)>0)&&(h(K,0),h(G,""),h(q,!1))},C))}),Ha(W);let ae=ce(()=>{const R=s()+1;if(t(P)<=0||R<=0)return!1;let te=Number.POSITIVE_INFINITY,de=0;for(const J of e.messages){if(J.parent_message_id)continue;const ve=J.channel_seq||0;ve<=0||(te=Math.min(te,ve),de=Math.max(de,ve))}return te<=R&&de>=R}),j=ce(()=>o()&&t(ae)),I=ce(()=>{const R=[];let te=!1;const de=J=>!t(j)||J.parent_message_id||J.author?.id===e.currentUserID||J.author_id===e.currentUserID?!1:t(P)>0&&(J.channel_seq||0)>s();for(const J of td(e.messages)){let ve=-1;if(!te){for(let xe=0;xe{requestAnimationFrame(()=>{if(te===Fe){if(J<=1){pe=!1;return}de(J-1)}})};de(R)}function Ge(){if(!t(T))return 0;const R=t(T).getScrollSize()+t(U);return Math.max(0,R-t(T).getScrollOffset()-t(T).getViewportSize())}function me(){return t(T)?Ge()<=w:!0}function Be(R=w){return t(T)?Ge()<=R:!0}function pt(){if(!t(T))return{atBottom:!0,nearOlder:!1,nearNewer:!1};const R=Ge();return{atBottom:me(),nearOlder:t(T).getScrollOffset()-t(U)<=A,nearNewer:R<=x}}function X(){e.onHistorySettled?.(pt())}function Ce(){u()||t(L)>0||e.onReachedBottom?.()}nn(()=>{if(f()){we=!0;return}we&&(we=!1,Ue=!1)});async function Ie(){!t(T)||t(I).length===0||(H=!u(),await ge(Re()))}async function ge(R=Re()){if(!t(T)||t(I).length===0)return;const te=e.viewKey;document.activeElement===t(E)&&t(E).blur(),H=!u(),et(2),t(T).scrollToIndex(t(I).length-1,{align:"end"}),await Wn(),await it(),Le(te,R)&&(h(ee,!0),H=!u(),me()&&(h($,!0),Ce()),X())}nn(()=>{if(!t(E))return;const R=t(E),te=de=>{de.deltaY>0&&!Ae&&!pe&&u()&&me()&&(Ue=!0,e.onLoadNewer?.("wheel"))};return R.addEventListener("wheel",te,{passive:!0}),()=>{R.removeEventListener("wheel",te)}});function Je(R){return t(I).findIndex(te=>te.kind==="group"&&te.group.messages.some(de=>de.id===R))}const qe=52;let ft=ce(()=>{if(!d()||a()||!_())return 0;const R=Math.max(t(F),480);return Math.max(4,Math.ceil(R/qe))});nn(()=>{if(!t(E))return;const R=()=>{t(E)&&h(F,t(E).clientHeight,!0)};R();const te=new ResizeObserver(R);return te.observe(t(E)),()=>te.disconnect()});let Ke=0;nn(()=>{if(!t(M)||!t(E)){h(U,0),Ke=0;return}const R=t(M),te=()=>{const J=R.offsetHeight,ve=Ke;if(h(U,J,!0),Ke=J,ve>0&&J!==ve){const xe=J-ve;t(T)&&t(T).getScrollOffset()>0&&t(T).scrollBy(xe)}};te();const de=new ResizeObserver(te);return de.observe(R),()=>{de.disconnect(),h(U,0),Ke=0}});function kt(){return t(I).findIndex(R=>R.kind==="divider")}function Dt(){if(!t(j)||t(P)<=0)return"";for(const R of e.messages)if(!R.parent_message_id&&!(R.author?.id===e.currentUserID||R.author_id===e.currentUserID)&&(R.channel_seq||0)>s())return R.id;return""}function Ht(){let R=0;for(const te of e.messages)R=Math.max(R,te.channel_seq||0);return R}function St(){h(O,e.viewKey,!0),h(Z,s()),h(N,r()),e.onMarkRead?.(Ht())}function it(){return new Promise(R=>requestAnimationFrame(()=>R()))}function He(R){if(!t(E)||!t(T))return!1;const te=t(E).querySelector(R);if(!te)return!1;const de=te.getBoundingClientRect().top-t(E).getBoundingClientRect().top;return Math.abs(de)<=w?!0:(t(T).scrollBy(de),!1)}function bt(){if(!t(E))return null;const R=t(E).getBoundingClientRect(),te=new Map(e.messages.map((ve,xe)=>[ve.id,xe]));let de=Number.POSITIVE_INFINITY,J=-1;for(const ve of t(E).querySelectorAll("[data-message-id]")){const xe=ve.getBoundingClientRect();if(xe.bottomR.bottom)continue;const Ee=te.get(ve.dataset.messageId||"");Ee!==void 0&&(de=Math.min(de,Ee),J=Math.max(J,Ee))}return J<0?null:{first:de,last:J}}function We(R){if(!t(E)||!t(T))return!1;const te=e.messages.findIndex(J=>J.id===R),de=bt();return te<0||!de?!1:de.first>te?(t(T).scrollBy(-Math.max(80,t(E).clientHeight*.85)),!0):de.lastJe(R),`[data-message-id="${CSS.escape(R)}"]`,R),!0}function Qt(R=!0){if(!t(T)||kt()<0)return!1;H=!1;const de=e.viewKey,J=Re();return Mt(de,J,()=>kt(),"[data-unread-divider='true']",Dt()).then(ve=>{R&&!ve&&Le(de,J)&&e.onJumpToUnread?.()}),!0}function $t(){if(!(t(j)&&Qt(!1))&&e.onJumpToUnread){e.onJumpToUnread();return}}function wn(){if(!t(T))return null;if(me())return{atBottom:!0};const te=t(T).getScrollOffset(),de=t(T).findItemIndex(te),J=Math.max(0,te-t(U));for(let ve=Math.max(0,de);ve(e.onListRef({scrollToBottom:Ie,scrollToMessage:Tt,scrollToDivider:Qt,captureState:wn,isAtBottom:()=>me(),isNearBottom:R=>Be(R)}),()=>e.onListRef(null))),nn(()=>{const R=e.viewKey,te=t(I).length;if(R!==Se){Se=R,Te=te,Ne=e.restoreState,H=!0,h($,!0),h(ee,!1),Ue=!1,Ae=!0,yt(R,e.restoreState,!0);return}const de=e.restoreState;if(de&&de!==Ne){if(Ne=de,de.atBottom){Te=te,Ae=!0,yt(R,de,!0);return}if(de.anchorMessageID){Te=te,Ae=!0,yt(R,de,!1);return}}te!==Te&&H&&!u()&&!Ae?ge():te!==Te&&!Ae&&Wt(R),Te=te});async function Wt(R){await Wn(),await it(),R===Se&&X()}async function yt(R,te,de){const J=Re(!1);let ve=!1;if(await Wn(),await new Promise(xe=>requestAnimationFrame(xe)),!!Le(R,J)){if(te&&!te.atBottom&&te.anchorMessageID){const xe=await kn(R,J,te.anchorMessageID,te.anchorPixelOffset??0);if(!Le(R,J))return;!xe&&de?await ge(J):H=!1}else t(I).findIndex(Ee=>Ee.kind==="divider")>=0&&t(T)?(ve=!0,await Mt(R,J,()=>kt(),"[data-unread-divider='true']",Dt()),H=!1):await ge(J);await new Promise(xe=>requestAnimationFrame(xe)),Le(R,J)&&(Ae=!1,h(ee,!0),h($,me(),!0),H=t($)&&!u(),ve||(t($)&&Ce(),t(T)&&Pt(t(T).getScrollOffset())),X())}}async function kn(R,te,de,J){if(!t(T))return!1;const ve=Je(de);if(ve<0)return!1;for(let xe=0;xe<8;xe++){if(!t(T)||!Le(R,te))return!1;const Ee=t(U)+t(T).getItemOffset(ve)+J;if(et(),t(T).scrollTo(Ee),await new Promise(dt=>requestAnimationFrame(dt)),!Le(R,te))return!1;const st=t(U)+t(T).getItemOffset(ve)+J,ot=t(T).getScrollOffset();if(Math.abs(st-Ee)<1&&Math.abs(ot-Ee)<1)break}return!0}function Pt(R){if(!t(T)||Ae&&!t(ee))return;const te=Ge(),de=me(),J=de||te<=x;H=de&&!u(),h($,de,!0),u()||(Ue=!1),!de&&d()&&R-t(U)<=A&&e.onLoadOlder?.(),!pe&&u()&&J&&!Ue&&(Ue=!0,e.onLoadNewer?.("scroll")),de&&!pe&&Ce()}var hn=Oh();let en;var Yt=b(hn);{var Kn=R=>{var te=Ch(),de=b(te),J=b(de);{var ve=lt=>{var Nt=In("@");z(lt,Nt)},xe=lt=>{var Nt=In("#");z(lt,Nt)};ue(J,lt=>{e.selectedDirect?lt(ve):lt(xe,-1)})}v(de);var Ee=k(de,2),st=b(Ee);{var ot=lt=>{var Nt=In();oe(gn=>ie(Nt,`This is the start of your conversation with ${gn??""}.`),[()=>ta(e.selectedDirect,e.currentUserID)]),z(lt,Nt)},dt=lt=>{var Nt=In();oe(()=>ie(Nt,`Welcome to #${e.selectedChannel.name??""}!`)),z(lt,Nt)},rn=lt=>{var Nt=In("Pick a channel to get started.");z(lt,Nt)};ue(st,lt=>{e.selectedDirect?lt(ot):e.selectedChannel?lt(dt,1):lt(rn,-1)})}v(Ee),On(2),v(te),z(R,te)},on=R=>{var te=Mh(),de=k(b(te),2);{var J=xe=>{var Ee=Ih(),st=b(Ee);Cs(st,{direction:"older",get rows(){return t(ft)}}),v(Ee),Xn(Ee,ot=>h(M,ot),()=>t(M)),oe(()=>re(Ee,"aria-hidden",m()?"false":"true")),z(xe,Ee)};ue(de,xe=>{t(ft)>0&&xe(J)})}var ve=k(de,2);Xn(Nd(ve,{get data(){return t(I)},getKey:Ee=>Ee.id,get scrollRef(){return t(E)},get shift(){return _()},get startMargin(){return t(U)},onscroll:Pt,children:(Ee,st=us,ot=us)=>{var dt=yn(),rn=Vt(dt);{var lt=Ct=>{Cs(Ct,{get direction(){return st().direction},get rows(){return st().rows}})},Nt=Ct=>{var Ut=Rh(),sn=b(Ut),ia=b(sn,!0);v(sn),v(Ut),oe(()=>ie(ia,st().label)),z(Ct,Ut)},gn=Ct=>{var Ut=Dh();let sn;oe(()=>sn=gt(Ut,1,"new-messages-divider",null,sn,{"is-clearing":t(q)})),z(Ct,Ut)},ln=Ct=>{Ah(Ct,{get group(){return st().group},get selectedThreadID(){return e.selectedThreadID},get replyContext(){return t(Y)},get onOpenProfile(){return e.onOpenProfile},get onReply(){return e.onReply},get onOpenThread(){return e.onOpenThread},get onJumpToQuote(){return e.onJumpToQuote},get onOpenImage(){return e.onOpenImage},get onRetry(){return e.onRetry},get onDiscard(){return e.onDiscard}})};ue(rn,Ct=>{st().kind==="loader"?Ct(lt):st().kind==="day"?Ct(Nt,1):st().kind==="divider"?Ct(gn,2):st().kind==="group"&&Ct(ln,3)})}z(Ee,dt)},$$slots:{default:!0}}),Ee=>h(T,Ee,!0),()=>t(T)),v(te),Xn(te,xe=>h(E,xe),()=>t(E)),z(R,te)};ue(Yt,R=>{!a()&&e.messages.length===0?R(Kn):e.messages.length>0&&R(on,1)})}var mt=k(Yt,2);{var rt=R=>{var te=Nh();let de;var J=b(te),ve=b(J),xe=b(ve);v(ve),v(J);var Ee=k(J,2);v(te),oe(st=>{de=gt(te,1,"unread-bar",null,de,{"is-clearing":t(q)}),re(te,"aria-hidden",t(q)?"true":void 0),J.disabled=t(q),re(J,"aria-label",st),ie(xe,`${(t(K)>99?"99+":t(K))??""} new message${t(K)===1?"":"s"}${c()?` since ${c()}`:""}`),Ee.disabled=t(q)},[()=>`Jump to ${t(K)>0?t(K):""} new message${t(K)===1?"":"s"}`.replace(/ +/g," ")]),Q("click",J,$t),Q("click",Ee,St),z(R,te)};ue(mt,R=>{!a()&&e.messages.length>0&&t(K)>0&&R(rt)})}v(hn),oe(()=>en=gt(hn,1,"messages",null,en,{"is-revealing":a()||!t(ee)&&e.messages.length>0})),Q("pointerdown",hn,function(...R){e.onActivateMessageComposer?.apply(this,R)}),Q("pointerup",hn,function(...R){e.onInlineImagePointerUp?.apply(this,R)}),z(n,hn),_t()}wt(["pointerdown","pointerup","click"]);const Ph=6500;var Uh=V('
    ');function qh(n,e){vt(e,!0);let a=ce(()=>e.entries.filter(m=>m.userID!==e.currentUserID));function r(m,f="Someone"){return m?.display_name?.trim()||(m?.handle?`@${m.handle}`:f)}let s=ce(()=>t(a).length===0?"":t(a).length===1?`${r(t(a)[0].user)} is typing…`:t(a).length===2?`${r(t(a)[0].user)} and ${r(t(a)[1].user)} are typing…`:t(a).length===3?`${r(t(a)[0].user)}, ${r(t(a)[1].user)}, and ${r(t(a)[2].user)} are typing…`:"Several people are typing…");var o=Uh();let c;var d=k(b(o),2),u=b(d,!0);v(d),v(o),oe(()=>{c=gt(o,1,"typing-indicator",null,c,{visible:t(a).length>0}),ie(u,t(s))}),z(n,o),_t()}const zh=45e3;var Bh=V('
    '),Fh=V('
    '),Hh=V('
    ');function Wh(n,e){vt(e,!0);function a(d){return d.kind==="tool"&&d.toolName?!d.text||d.text===d.toolName?d.toolName:`${d.toolName}: ${d.text}`:d.text}function r(d){switch(d){case"tool":return"⚙";case"thinking":case"commentary":return"✦";case"plan":return"☰";case"patch":return"±";case"command_output":return"›";case"error":return"✕";default:return"·"}}var s=yn(),o=Vt(s);{var c=d=>{var u=Hh();Ft(u,21,()=>e.turns,m=>m.turnId,(m,f)=>{var _=Fh();Ft(_,21,()=>t(f).lines,w=>w.id,(w,A)=>{var x=Bh();let C;var T=b(x),E=b(T,!0);v(T);var M=k(T,2),U=b(M,!0);v(M),v(x),oe((F,Y)=>{C=gt(x,1,"agent-progress__line svelte-6vwkyv",null,C,{"agent-progress__line--done":t(A).finalized}),re(x,"data-kind",t(A).kind),ie(E,F),ie(U,Y)},[()=>r(t(A).kind),()=>a(t(A))]),z(w,x)}),v(_),z(m,_)}),v(u),z(d,u)};ue(o,d=>{e.turns.length>0&&d(c)})}z(n,s),_t()}var Gh=V('

    '),Kh=V('');function jh(n,e){vt(e,!0);var a=Kh(),r=b(a),s=k(r,2),o=b(s),c=k(b(o),2);v(o);var d=k(o,2),u=b(d),m=k(b(u),2);dn(m),v(u);var f=k(u,2);{var _=x=>{var C=Gh(),T=b(C,!0);v(C),oe(()=>ie(T,e.status)),z(x,C)};ue(f,x=>{e.status&&x(_)})}var w=k(f,2),A=b(w);On(2),v(w),v(d),v(s),v(a),oe(()=>Mn(m,e.channelName)),Q("click",r,function(...x){e.onClose?.apply(this,x)}),Q("click",c,function(...x){e.onClose?.apply(this,x)}),an("submit",d,x=>{x.preventDefault(),e.onCreate()}),Q("input",m,x=>e.onChannelName(x.currentTarget.value)),Q("click",A,function(...x){e.onClose?.apply(this,x)}),z(n,a),_t()}wt(["click","input"]);var Vh=V(''),Yh=V('
    No matching people yet
    '),Zh=V('');function Xh(n,e){vt(e,!0);let a=ce(()=>e.memberID.trim().toLowerCase()),r=ce(()=>e.people.filter(M=>M.id!==e.currentUserID).filter(M=>t(a)?M.display_name.toLowerCase().includes(t(a))||M.handle?.toLowerCase().includes(t(a))||M.id.toLowerCase().includes(t(a)):!0));var s=Zh(),o=b(s),c=k(o,2),d=b(c),u=k(b(d),2);v(d);var m=k(d,2),f=b(m),_=k(b(f),2);dn(_),v(f);var w=k(f,2),A=b(w);Ft(A,17,()=>t(r),M=>M.id,(M,U)=>{var F=Vh(),Y=b(F);Pn(Y,{class:"dm-avatar",get id(){return t(U).id},get name(){return t(U).display_name},get src(){return t(U).avatar_url},size:32});var O=k(Y,2),Z=b(O),N=b(Z,!0);v(Z);var L=k(Z,2),G=b(L,!0);v(L),v(O),v(F),oe(K=>{ie(N,t(U).display_name),ie(G,K)},[()=>Ln(t(U).handle)||t(U).id]),Q("click",F,()=>e.onStart(t(U).id)),z(M,F)});var x=k(A,2);{var C=M=>{var U=Yh();z(M,U)};ue(x,M=>{t(r).length===0&&M(C)})}v(w);var T=k(w,2),E=b(T);On(2),v(T),v(m),v(c),v(s),oe(()=>Mn(_,e.memberID)),Q("click",o,function(...M){e.onClose?.apply(this,M)}),Q("click",u,function(...M){e.onClose?.apply(this,M)}),an("submit",m,M=>{M.preventDefault(),e.onStart(e.memberID)}),Q("input",_,M=>e.onMemberID(M.currentTarget.value)),Q("click",E,function(...M){e.onClose?.apply(this,M)}),z(n,s),_t()}wt(["click","input"]);var Jh=V(''),Qh=V('
    '),$h=V('');function eg(n,e){vt(e,!0);function a(m){return m.button===0&&!m.metaKey&&!m.ctrlKey&&!m.shiftKey&&!m.altKey}var r=$h(),s=k(b(r),4),o=b(s);Ft(o,17,()=>e.workspaces,m=>m.id,(m,f)=>{var _=Jh();let w;var A=b(_),x=b(A),C=b(x,!0);v(x),v(A),v(_),oe((T,E)=>{w=gt(_,1,"guild-wrap",null,w,{active:t(f).id===e.selectedWorkspaceID}),re(A,"title",t(f).name),re(A,"href",T),ie(C,E)},[()=>e.hrefForWorkspace(t(f).id),()=>Tu(t(f).name)]),Q("click",A,T=>{a(T)&&(T.preventDefault(),e.onSelectWorkspace(t(f).id))}),z(m,_)});var c=k(o,2);v(s);var d=k(s,2);{var u=m=>{var f=Qh(),_=b(f);dn(_),v(f),oe(()=>Mn(_,e.workspaceName)),an("submit",f,w=>{w.preventDefault(),e.onCreateWorkspace()}),Q("input",_,w=>e.onWorkspaceName(w.currentTarget.value)),z(m,f)};ue(d,m=>{e.showWorkspaceCreate&&m(u)})}v(r),Q("click",c,function(...m){e.onToggleWorkspaceCreate?.apply(this,m)}),z(n,r),_t()}wt(["click","input"]);var tg=V(' '),ng=V('# '),ag=V(''),rg=V('');function ig(n,e){vt(e,!0);function a(f){return f.button===0&&!f.metaKey&&!f.ctrlKey&&!f.shiftKey&&!f.altKey}var r=rg(),s=b(r),o=k(b(s),4);v(s);var c=k(s,2),d=b(c);Ft(d,17,()=>e.channels,f=>f.id,(f,_)=>{const w=ce(()=>t(_).unread_count||0);var A=ng();let x;var C=k(b(A),2),T=b(C,!0);v(C);var E=k(C,2);{var M=U=>{var F=tg(),Y=b(F,!0);v(F),oe(()=>{re(F,"aria-label",`${t(w)} unread`),ie(Y,t(w)>99?"99+":t(w))}),z(U,F)};ue(E,U=>{t(w)>0&&!(t(_).id===e.selectedChannelID&&!e.selectedDirectID)&&U(M)})}v(A),oe(U=>{re(A,"href",U),x=gt(A,1,"nav-item channel",null,x,{active:t(_).id===e.selectedChannelID&&!e.selectedDirectID,"has-unread":t(w)>0&&!(t(_).id===e.selectedChannelID&&!e.selectedDirectID)}),ie(T,t(_).name)},[()=>e.hrefForChannel(t(_).id)]),Q("click",A,U=>{a(U)&&(U.preventDefault(),e.onSelectChannel(t(_).id))}),z(f,A)});var u=k(d,2);{var m=f=>{var _=ag();z(f,_)};ue(u,f=>{e.channels.length===0&&f(m)})}v(c),v(r),Q("click",o,function(...f){e.onCreateChannel?.apply(this,f)}),z(n,r),_t()}wt(["click"]);var sg=V(' '),og=V(''),lg=V(''),cg=V('
    '),ug=V(''),dg=V('
    '),fg=V('');function hg(n,e){vt(e,!0);let a=ht("");function r(C){return C.button===0&&!C.metaKey&&!C.ctrlKey&&!C.shiftKey&&!C.altKey}function s(C){h(a,t(a)===C?"":C,!0)}function o(){h(a,"")}var c=fg(),d=b(c),u=k(b(d),4);v(d);var m=k(d,2),f=b(m);Ft(f,17,()=>e.conversations,C=>C.id,(C,T)=>{const E=ce(()=>Su(t(T),e.currentUserID)),M=ce(()=>t(T).unread_count||0),U=ce(()=>t(T).id===e.selectedDirectID);var F=cg();let Y;var O=b(F);let Z;var N=b(O);{let j=ce(()=>t(E)?.id||t(T).id),I=ce(()=>t(E)?.display_name),H=ce(()=>t(E)?.avatar_url);Pn(N,{class:"dm-avatar",get id(){return t(j)},get name(){return t(I)},get src(){return t(H)},size:22})}var L=k(N,2),G=b(L,!0);v(L);var K=k(L,2);{var q=j=>{var I=sg(),H=b(I,!0);v(I),oe(()=>{re(I,"aria-label",`${t(M)} unread`),ie(H,t(M)>99?"99+":t(M))}),z(j,I)},D=j=>{var I=og();z(j,I)};ue(K,j=>{t(M)>0&&!t(U)?j(q):j(D,-1)})}v(O);var P=k(O,2),W=k(P,2);{var ae=j=>{var I=lg(),H=b(I);v(I),Q("click",H,$=>{$.preventDefault(),$.stopPropagation(),o(),e.onHideDirect(t(T).id)}),z(j,I)};ue(W,j=>{t(a)===t(T).id&&j(ae)})}v(F),oe((j,I,H)=>{Y=gt(F,1,"dm-row",null,Y,{active:t(U)}),re(O,"href",j),Z=gt(O,1,"nav-item dm",null,Z,{active:t(U),"has-unread":t(M)>0&&!t(U)}),ie(G,I),re(P,"aria-label",H),re(P,"aria-expanded",t(a)===t(T).id)},[()=>e.hrefForDirect(t(T).id),()=>ta(t(T),e.currentUserID),()=>`Direct message actions for ${ta(t(T),e.currentUserID)}`]),Q("click",O,j=>{r(j)&&(j.preventDefault(),e.onSelectDirect(t(T).id))}),Q("click",P,j=>{j.preventDefault(),j.stopPropagation(),s(t(T).id)}),Q("keydown",P,j=>{j.key==="Escape"&&o()}),z(C,F)});var _=k(f,2);{var w=C=>{var T=ug();z(C,T)};ue(_,C=>{e.conversations.length===0&&C(w)})}var A=k(_,2);{var x=C=>{var T=dg(),E=b(T),M=b(E);v(E);var U=k(E,2);v(T),oe(()=>ie(M,`Closed ${e.hiddenDirectTitle??""}`)),Q("click",U,function(...F){e.onUndoHideDirect?.apply(this,F)}),z(C,T)};ue(A,C=>{e.hiddenDirectTitle&&C(x)})}v(m),v(c),Q("click",u,function(...C){e.onCreateDirect?.apply(this,C)}),z(n,c),_t()}wt(["click","keydown"]);var gg=V(' '),pg=V(''),mg=V(''),vg=V('');function _g(n,e){vt(e,!0);function a(N){return N.button===0&&!N.metaKey&&!N.ctrlKey&&!N.shiftKey&&!N.altKey}var r=vg(),s=b(r),o=b(s),c=b(o),d=b(c,!0);v(c);var u=k(c,2);let m;var f=b(u,!0);v(u),v(o);var _=k(o,2),w=b(_),A=b(w);v(w),v(_),v(s);var x=k(s,2),C=b(x);ig(C,{get channels(){return e.channels},get selectedChannelID(){return e.selectedChannelID},get selectedDirectID(){return e.selectedDirectID},get hrefForChannel(){return e.hrefForChannel},get onSelectChannel(){return e.onSelectChannel},get onCreateChannel(){return e.onCreateChannel}});var T=k(C,2);{let N=ce(()=>e.currentUser?.id);hg(T,{get conversations(){return e.directConversations},get currentUserID(){return t(N)},get selectedDirectID(){return e.selectedDirectID},get hrefForDirect(){return e.hrefForDirect},get onSelectDirect(){return e.onSelectDirect},get onCreateDirect(){return e.onCreateDirect},get onHideDirect(){return e.onHideDirect},get hiddenDirectTitle(){return e.hiddenDirectTitle},get onUndoHideDirect(){return e.onUndoHideDirect}})}var E=k(T,2),M=k(b(E),2),U=b(M);Ft(U,17,()=>e.recentPeople,N=>N.id,(N,L)=>{const G=ce(()=>Eu(e.directConversations,t(L).id));var K=gg();let q;var D=b(K);Pn(D,{class:"dm-avatar",get id(){return t(L).id},get name(){return t(L).display_name},get src(){return t(L).avatar_url},size:22});var P=k(D,2),W=b(P,!0);v(P),On(2),v(K),oe(ae=>{re(K,"href",ae),q=gt(K,1,"nav-item dm",null,q,{active:t(G)?.id===e.selectedDirectID||e.selectedProfile?.id===t(L).id}),ie(W,t(L).display_name)},[()=>t(G)?e.hrefForDirect(t(G).id):"#"]),Q("click",K,ae=>{if(t(G)){if(!a(ae))return;ae.preventDefault(),e.onSelectDirect(t(G).id)}else ae.preventDefault(),e.onOpenProfile(t(L))}),z(N,K)});var F=k(U,2);{var Y=N=>{var L=pg();z(N,L)};ue(F,N=>{e.recentPeople.length===0&&N(Y)})}v(M),v(E),v(x);var O=k(x,2);{var Z=N=>{var L=mg(),G=b(L);Pn(G,{class:"dm-avatar",get id(){return e.currentUser.id},get name(){return e.currentUser.display_name},get src(){return e.currentUser.avatar_url},size:28,loading:"eager",fetchPriority:"auto"});var K=k(G,2),q=b(K),D=b(q,!0);v(q);var P=k(q,2),W=b(P,!0);v(P),v(K),On(2),v(L),oe((ae,j)=>{re(L,"aria-label",ae),ie(D,e.currentUser.display_name),ie(W,j)},[()=>`Account settings for ${e.currentUser.display_name} ${Ln(e.currentUser.handle)}`,()=>e.currentUser.handle?Ln(e.currentUser.handle):e.connected?"Active":"Reconnecting…"]),Q("click",L,function(...ae){e.onOpenSettings?.apply(this,ae)}),Q("contextmenu",L,ae=>{ae.preventDefault(),e.onOpenSettings()}),z(N,L)};ue(O,N=>{e.currentUser&&N(Z)})}v(r),oe(()=>{ie(d,e.workspaceName||"Pick a workspace"),m=gt(u,1,"presence",null,m,{online:e.connected}),ie(f,e.connected?"Connected":e.status),re(_,"aria-label",e.sidebarCollapsed?"Expand sidebar":"Collapse sidebar"),re(_,"title",e.sidebarCollapsed?"Expand sidebar":"Collapse sidebar"),re(A,"d",e.sidebarCollapsed?"m9 6 6 6-6 6":"m15 6-6 6 6 6")}),Q("click",_,function(...N){e.onToggleCollapse?.apply(this,N)}),z(n,r),_t()}wt(["click","contextmenu"]);var bg=V(' '),yg=V(" "),Zs=V(''),wg=V(''),kg=V('
    User kind
    '),Xs=V('

    '),Tg=V('

    Blocked.

    '),Sg=V(''),xg=V(''),Eg=V(''),Ag=V('
    Moderation
    '),Cg=V('

    Profile

    Active
    Contact information
    Handle
    User ID
    About

    ',1);function Ig(n,e){vt(e,!0);const a=ce(()=>e.profile.kind==="bot"?e.profile.owner_user_id?`Bot of ${e.profile.owner_user_id}`:"Service bot":""),r=ce(()=>e.moderation?.role||"member"),s=ce(()=>!!e.moderation&&t(r)!=="owner"&&(e.currentUserRole==="owner"||e.currentUserRole==="moderator"&&(t(r)==="member"||t(r)==="guest"))),o=ce(()=>e.currentUser?.id!==e.profile.id&&t(s)),c=ce(()=>!!e.moderation?.blocked_at),d=ce(()=>t(r));var u=Cg(),m=Vt(u),f=b(m),_=k(b(f),2),w=b(_,!0);v(_),v(f);var A=k(f,2);v(m);var x=k(m,2),C=b(x),T=b(C);Pn(T,{class:"profile-avatar",get id(){return e.profile.id},get name(){return e.profile.display_name},get src(){return e.profile.avatar_url},size:240,loading:"eager",fetchPriority:"auto"}),v(C);var E=k(C,2),M=b(E),U=b(M),F=b(U),Y=b(F,!0);v(F);var O=k(F,2);{var Z=me=>{var Be=bg(),pt=b(Be,!0);v(Be),oe(()=>ie(pt,t(a))),z(me,Be)};ue(O,me=>{t(a)&&me(Z)})}var N=k(O,2);{var L=me=>{var Be=yg(),pt=b(Be,!0);v(Be),oe(X=>ie(pt,X),[()=>Ln(e.profile.handle)]),z(me,Be)};ue(N,me=>{e.profile.handle&&me(L)})}v(U);var G=k(U,2);{var K=me=>{var Be=Zs();Q("click",Be,function(...pt){e.onEdit?.apply(this,pt)}),z(me,Be)};ue(G,me=>{e.currentUser?.id===e.profile.id&&me(K)})}v(M);var q=k(M,4),D=b(q);{var P=me=>{var Be=wg();Q("click",Be,()=>e.onMessage(e.profile.id)),z(me,Be)};ue(D,me=>{e.currentUser?.id!==e.profile.id&&me(P)})}var W=k(D,2);v(q);var ae=k(q,2),j=b(ae),I=k(b(j),2);{var H=me=>{var Be=Zs();Q("click",Be,function(...pt){e.onEdit?.apply(this,pt)}),z(me,Be)};ue(I,me=>{e.currentUser?.id===e.profile.id&&me(H)})}v(j);var $=k(j,2),ee=k(b($),2),Se=k(b(ee),2),Te=b(Se,!0);v(Se),v(ee),v($);var Ne=k($,2),Ae=k(b(Ne),2),pe=k(b(Ae),2),Ue=b(pe,!0);v(pe),v(Ae),v(Ne);var we=k(Ne,2);{var Fe=me=>{var Be=kg(),pt=k(b(Be),2),X=k(b(pt),2),Ce=b(X,!0);v(X),v(pt),v(Be),oe(()=>ie(Ce,t(a))),z(me,Be)};ue(we,me=>{e.profile.kind==="bot"&&me(Fe)})}v(ae);var he=k(ae,2),Re=k(b(he),2),Le=b(Re);v(Re),v(he);var et=k(he,2);{var Ge=me=>{var Be=Ag(),pt=b(Be),X=k(b(pt),2),Ce=b(X,!0);v(X),v(pt);var Ie=k(pt,2);{var ge=We=>{var Qe=Xs(),Mt=b(Qe);v(Qe),oe(()=>ie(Mt,`${e.moderation.posts_remaining??""} of ${e.moderation.post_limit??""} waiting-room posts left today.`)),z(We,Qe)};ue(Ie,We=>{e.moderation.role==="guest"&&e.moderation.post_limit>0&&We(ge)})}var Je=k(Ie,2);{var qe=We=>{var Qe=Xs(),Mt=b(Qe);v(Qe),oe(Tt=>ie(Mt,`Timed out until ${Tt??""}.`),[()=>new Date(e.moderation.timeout_until).toLocaleString()]),z(We,Qe)};ue(Je,We=>{e.moderation.timeout_until&&We(qe)})}var ft=k(Je,2);{var Ke=We=>{var Qe=Tg();z(We,Qe)};ue(ft,We=>{e.moderation.blocked_at&&We(Ke)})}var kt=k(ft,2),Dt=b(kt);{var Ht=We=>{var Qe=Sg();Q("click",Qe,()=>e.onApprove(e.profile.id)),z(We,Qe)};ue(Dt,We=>{e.moderation.role==="guest"&&We(Ht)})}var St=k(Dt,2),it=k(St,2);{var He=We=>{var Qe=xg();Q("click",Qe,()=>e.onUnblock(e.profile.id)),z(We,Qe)},bt=We=>{var Qe=Eg();Q("click",Qe,()=>e.onBlock(e.profile.id)),z(We,Qe)};ue(it,We=>{t(c)?We(He):We(bt,-1)})}v(kt),v(Be),oe(()=>ie(Ce,t(d))),Q("click",St,()=>e.onTimeout(e.profile.id)),z(me,Be)};ue(et,me=>{t(o)&&e.moderation&&me(Ge)})}v(E),v(x),oe((me,Be)=>{ie(w,e.profile.display_name),na(C,`--hue: ${me??""}deg`),ie(Y,e.profile.display_name),ie(Te,Be),ie(Ue,e.profile.id),ie(Le,`Member of ${(e.workspaceName||"this workspace")??""}.`)},[()=>yo(e.profile.id),()=>e.profile.handle?Ln(e.profile.handle):"No handle set"]),Q("click",A,function(...me){e.onClose?.apply(this,me)}),Q("click",W,function(...me){e.onSetStatus?.apply(this,me)}),z(n,u),_t()}wt(["click"]);var Rg=V('

    Browser notifications are not supported

    '),Dg=V('

    Browser notifications are blocked by this browser

    '),Mg=V("

    "),Ng=V('');function Og(n,e){vt(e,!0);var a=Ng(),r=b(a),s=k(r,2),o=b(s),c=k(b(o),2);v(o);var d=k(o,2),u=b(d),m=b(u);Pn(m,{class:"avatar large",get id(){return e.user.id},get name(){return e.displayName},get src(){return e.avatarURL},size:56,loading:"eager",fetchPriority:"auto"});var f=k(m,2),_=b(f),w=b(_,!0);v(_);var A=k(_,2),x=b(A,!0);v(A),v(f),v(u);var C=k(u,2),T=k(b(C),2);dn(T),v(C);var E=k(C,2),M=k(b(E),2);dn(M),v(E);var U=k(E,2),F=k(b(U),2);dn(F),v(U);var Y=k(U,2),O=b(Y);dn(O),On(2),v(Y);var Z=k(Y,2);{var N=I=>{var H=Rg();z(I,H)},L=I=>{var H=Dg();z(I,H)};ue(Z,I=>{e.browserNotificationsSupported?e.browserNotificationPermission==="denied"&&I(L,1):I(N)})}var G=k(Z,2),K=b(G);dn(K),On(2),v(G);var q=k(G,2),D=k(b(q),2);dn(D),v(q);var P=k(q,2);{var W=I=>{var H=Mg();let $;var ee=b(H,!0);v(H),oe(()=>{$=gt(H,1,"profile-status",null,$,{error:e.statusError}),ie(ee,e.status)}),z(I,H)};ue(P,I=>{e.status&&I(W)})}var ae=k(P,2),j=b(ae);On(2),v(ae),v(d),v(s),v(a),oe(I=>{ie(w,e.displayName||e.user.display_name),ie(x,I),Mn(T,e.displayName),Mn(M,e.handle),Mn(F,e.avatarURL),O.disabled=!e.browserNotificationsSupported||e.browserNotificationPermission==="denied",ws(O,e.browserNotificationsEnabled),ws(K,e.pushoverEnabled),Mn(D,e.pushoverUserKey)},[()=>e.handle||Ln(e.user.handle)||"No handle set"]),Q("click",r,function(...I){e.onClose?.apply(this,I)}),Q("click",c,function(...I){e.onClose?.apply(this,I)}),an("submit",d,I=>{I.preventDefault(),e.onSave()}),Q("input",T,I=>e.onDisplayName(I.currentTarget.value)),Q("input",M,I=>e.onHandle(I.currentTarget.value)),Q("input",F,I=>e.onAvatarURL(I.currentTarget.value)),Q("change",O,I=>e.onBrowserNotificationsEnabled(I.currentTarget.checked)),Q("change",K,I=>e.onPushoverEnabled(I.currentTarget.checked)),Q("input",D,I=>e.onPushoverUserKey(I.currentTarget.value)),Q("click",j,function(...I){e.onClose?.apply(this,I)}),z(n,a),_t()}wt(["click","input","change"]);var Lg=V(''),Pg=V('
    ');function Ug(n,e){vt(e,!0);var a=yn(),r=Vt(a);{var s=o=>{var c=Pg(),d=b(c),u=b(d),m=b(u);v(u);var f=k(u,2);v(d);var _=k(d,2);Ft(_,17,()=>e.results,w=>w.message.id,(w,A)=>{var x=Lg(),C=b(x);{let N=ce(()=>t(A).message.author?.id||t(A).message.author_id),L=ce(()=>t(A).message.author?.display_name),G=ce(()=>t(A).message.author?.avatar_url);Pn(C,{class:"dm-avatar",get id(){return t(N)},get name(){return t(L)},get src(){return t(G)},size:30})}var T=k(C,2),E=b(T),M=b(E),U=b(M,!0);v(M);var F=k(M,2),Y=b(F,!0);v(F),v(E);var O=k(E,2),Z=b(O,!0);v(O),v(T),v(x),oe(N=>{ie(U,t(A).message.author?.display_name||"Local User"),ie(Y,N),ie(Z,t(A).message.body)},[()=>Ba(t(A).message.created_at)]),Q("click",x,()=>e.onOpenResult(t(A))),z(w,x)}),v(c),oe(()=>ie(m,`${e.results.length??""} ${e.results.length===1?"result":"results"}`)),Q("click",f,function(...w){e.onClose?.apply(this,w)}),z(o,c)};ue(r,o=>{e.results.length>0&&o(s)})}z(n,a),_t()}wt(["click"]);var qg=V('
    No thread open Hover any message and tap the bubble to keep side conversations tidy.
    ');function zg(n){var e=qg();z(n,e)}var Js=V(" "),Qs=V('
    '),Bg=V('
    '),Fg=V('

    Thread

    ',1);function Hg(n,e){vt(e,!0);let a=Oe(e,"mentionPeople",19,()=>[]);var r=Fg(),s=Vt(r),o=b(s),c=k(b(o),2),d=b(c);v(c),v(o);var u=k(o,2);v(s);var m=k(s,2),f=b(m),_=b(f);{let D=ce(()=>e.root.author?.id||e.root.author_id),P=ce(()=>e.root.author?.display_name),W=ce(()=>e.root.author?.avatar_url);Pn(_,{class:"avatar",get id(){return t(D)},get name(){return t(P)},get src(){return t(W)},size:38})}var w=k(_,2),A=b(w),x=b(A),C=b(x,!0);v(x);var T=k(x,2);{var E=D=>{var P=Js(),W=b(P,!0);v(P),oe(ae=>ie(W,ae),[()=>Ln(e.root.author.handle)]),z(D,P)};ue(T,D=>{e.root.author?.handle&&D(E)})}var M=k(T,2),U=b(M,!0);v(M);var F=k(M,2);v(A);var Y=k(A,2);jr(Y,()=>si(e.root.body),!0),v(Y),qa(Y,D=>Xr?.(D));var O=k(Y,2);{var Z=D=>{var P=Qs();Ft(P,21,()=>e.root.attachments,W=>W.id,(W,ae)=>{{let j=ce(()=>dr(t(ae)));oi(W,{get upload(){return t(ae)},get url(){return t(j)},get onOpenImage(){return e.onOpenImage}})}}),v(P),z(D,P)};ue(O,D=>{e.root.attachments?.length&&D(Z)})}v(w),v(f);var N=k(f,2),L=b(N),G=b(L);v(L),v(N);var K=k(N,2);Ft(K,21,()=>e.replies,D=>D.id,(D,P)=>{var W=Bg(),ae=b(W);{let he=ce(()=>t(P).author?.id||t(P).author_id),Re=ce(()=>t(P).author?.display_name),Le=ce(()=>t(P).author?.avatar_url);Pn(ae,{class:"avatar small",get id(){return t(he)},get name(){return t(Re)},get src(){return t(Le)},size:30})}var j=k(ae,2),I=b(j),H=b(I),$=b(H,!0);v(H);var ee=k(H,2);{var Se=he=>{var Re=Js(),Le=b(Re,!0);v(Re),oe(et=>ie(Le,et),[()=>Ln(t(P).author.handle)]),z(he,Re)};ue(ee,he=>{t(P).author?.handle&&he(Se)})}var Te=k(ee,2),Ne=b(Te,!0);v(Te);var Ae=k(Te,2);v(I);var pe=k(I,2);Ho(pe,{get message(){return t(P)},get onJump(){return e.onJumpToQuote}});var Ue=k(pe,2);jr(Ue,()=>si(t(P).body),!0),v(Ue),qa(Ue,he=>Xr?.(he));var we=k(Ue,2);{var Fe=he=>{var Re=Qs();Ft(Re,21,()=>t(P).attachments,Le=>Le.id,(Le,et)=>{{let Ge=ce(()=>dr(t(et)));oi(Le,{get upload(){return t(et)},get url(){return t(Ge)},get onOpenImage(){return e.onOpenImage}})}}),v(Re),z(he,Re)};ue(we,he=>{t(P).attachments?.length&&he(Fe)})}v(j),v(W),oe(he=>{re(W,"data-message-id",t(P).id),ie($,t(P).author?.display_name||"Local User"),ie(Ne,he)},[()=>Ba(t(P).created_at)]),Q("click",Ae,()=>e.onSetReplyTarget(t(P),"thread")),z(D,W)}),v(K),v(m);var q=k(m,2);ko(q,{get value(){return e.replyBody},placeholder:"Reply in thread",ariaLabel:"Reply body",submitLabel:"Reply",formClass:"composer reply-composer",get replyTarget(){return e.replyTarget},get mentionPeople(){return a()},get onValue(){return e.onReplyBody},get onSubmit(){return e.onSubmitReply},get onKeydown(){return e.onReplyKeydown},get onFocus(){return e.onReplyFocus},get onInputRef(){return e.onReplyInputRef},get onClearReply(){return e.onClearReply}}),oe(D=>{ie(d,`${e.threadState?.reply_count??e.replies.length??""} ${(e.threadState?.reply_count??e.replies.length)===1?"reply":"replies"}`),re(f,"data-message-id",e.root.id),ie(C,e.root.author?.display_name||"Local User"),ie(U,D),ie(G,`${e.replies.length??""} ${e.replies.length===1?"reply":"replies"}`)},[()=>Ba(e.root.created_at)]),Q("click",u,function(...D){e.onClose?.apply(this,D)}),Q("pointerdown",m,function(...D){e.onActivateThreadComposer?.apply(this,D)}),Q("pointerup",m,function(...D){e.onInlineImagePointerUp?.apply(this,D)}),Q("click",F,()=>e.onSetReplyTarget(e.root,"thread")),z(n,r),_t()}wt(["click","pointerdown","pointerup"]);var Wg=V('

    '),Gg=V('

    '),Kg=V('

    ClickClack

    '),jg=V(''),Vg=V('

    ');function Yg(n,e){vt(e,!0);var a=Vg(),r=b(a),s=b(r);{var o=M=>{var U=Wg(),F=b(U,!0);v(U),oe(Y=>ie(F,Y),[()=>`@${ta(e.selectedDirect,e.currentUserID)}`]),z(M,U)},c=M=>{var U=Gg(),F=b(U,!0);v(U),oe(()=>ie(F,`#${e.selectedChannel.name}`)),z(M,U)},d=M=>{var U=Kg();z(M,U)};ue(s,M=>{e.selectedDirect?M(o):e.selectedChannel?M(c,1):M(d,-1)})}var u=k(s,4),m=b(u,!0);v(u),v(r);var f=k(r,2),_=k(b(f),2);dn(_);var w=k(_,2);{var A=M=>{var U=jg();Q("click",U,function(...F){e.onResetSearch?.apply(this,F)}),z(M,U)};ue(w,M=>{e.searchQuery&&M(A)})}On(2),v(f);var x=k(f,2),C=b(x);let T;var E=k(C,2);v(x),v(a),oe(()=>{ie(m,e.workspaceName||"no workspace"),Mn(_,e.searchQuery),re(C,"title",e.threadOpen?"Close thread":"Open a message thread"),re(C,"aria-label",e.threadOpen?"Close thread":"Open a message thread"),T=gt(C,1,"",null,T,{active:e.sidePanelOpen})}),an("submit",f,M=>{M.preventDefault(),e.onSearch()}),Q("input",_,M=>e.onSearchQuery(M.currentTarget.value)),Q("click",C,function(...M){e.onToggleThread?.apply(this,M)}),Q("click",E,function(...M){e.onPinnedItems?.apply(this,M)}),z(n,a),_t()}wt(["input","click"]);var Zg=V(''),Xg=V('
    cc
    ClickClack OpenClaw workspace chat

    Welcome.

    Sign in with GitHub to join the guest room.

    Any GitHub account can join.

    '),Jg=V(''),Qg=V(''),$g=V('
    ',1);function lp(n,e){vt(e,!1);const a=se(),r=se(),s=se(),o=se(),c=se(),d=se(),u=se(),m=se(),f=se(),_=se(),w=se(),A=se(),x=se(),C=96,T="clickclack:last-channel:v1:",E="clickclack:browser-notifications-enabled:v1:",M="(max-width: 820px)",U=Date.now();let F=Oe(e,"routeWorkspaceID",8,""),Y=Oe(e,"routeTargetID",8,""),O=se(null),Z=se([]),N=se([]),L=se([]),G=se([]),K=se([]),q=se(""),D=se(""),P=se(""),W=se(null),ae=se(null),j=se(null),I=se([]),H=se([]),$=se([]),ee=se(null),Se=se(""),Te=se(""),Ne=se(""),Ae=se(""),pe=se(""),Ue=se(""),we=se([]),Fe=se(null),he=se(!1),Re=se(!1),Le=se(!1),et=se(!1),Ge=se(""),me=se(""),Be=se(""),pt=se(""),X=se(!1),Ce=se(""),Ie=se(!1),ge=se(!1),Je=se("default"),qe=se(""),ft=se(!1),Ke=se("loading"),kt=se(!1),Dt=se(!1),Ht=null,St=se(null),it=new Map,He=se(new Map),bt=new Set,We=se("idle"),Qe="idle",Mt=!1,Tt=!1,Qt=se(!1),$t=se(!1),wn=se(!1),Wt=se(!1),yt=new Map,kn=0,Pt=se(""),hn=se(void 0),en=se(""),Yt=se(!0),Kn=se(!1),on=se(!1),mt=se(!1),rt=se(null),R=se(null),te=se(null),de=se(null),J=se("message"),ve=se([]),xe,Ee=se([]),st,ot=se(""),dt=0,rn=se(null),lt;uo(()=>{ln(),Nt();const i=window.matchMedia(M),l=()=>{h(mt,!1)};return i.addEventListener("change",l),()=>i.removeEventListener("change",l)}),Ha(()=>{Ht?.close(),Ht=null,h(Dt,!1),nr(),xe&&window.clearInterval(xe),st&&window.clearInterval(st),lt&&clearTimeout(lt)});async function Nt(){try{const i=await nt("/api/me");if(h(O,i.user),ln(),await va(),t(Z).length===0){h(Ke,"create a workspace");return}await Gt(F(),Y()),h(Ke,"ready")}catch(i){if(i instanceof Yr&&(i.status===401||i.status===403)){h(kt,!0),h(Ke,"auth");return}h(Ke,i instanceof Error?i.message:"Could not load ClickClack")}}function gn(){t(O)&&(ln(),h(me,t(O).display_name),h(Be,t(O).handle?`@${t(O).handle}`:""),h(pt,t(O).avatar_url),h(X,t(O).notification_settings?.pushover_enabled??!1),h(Ce,t(O).notification_settings?.pushover_user_key??""),h(qe,""),h(ft,!1),h(Re,!0))}function ln(){h(Ie,typeof Notification<"u"),h(Je,t(Ie)?Notification.permission:"unsupported");const i=Ut();h(ge,t(Je)==="granted"&&i),i&&t(Je)!=="granted"&&sn(!1)}function Ct(){return t(O)?.id?`${E}${t(O).id}`:""}function Ut(){const i=Ct();if(!i)return!1;try{return window.localStorage.getItem(i)==="enabled"}catch{return!1}}function sn(i){const l=Ct();if(!l)return!1;try{return i?window.localStorage.setItem(l,"enabled"):window.localStorage.removeItem(l),!0}catch{return!1}}async function ia(i){if(h(qe,""),h(ft,!1),!i){sn(!1),h(ge,!1),h(qe,"Browser notifications disabled");return}if(typeof Notification>"u"){h(Ie,!1),h(Je,"unsupported"),h(ge,!1),h(qe,"Browser notifications are not supported"),h(ft,!0);return}const l=Notification.permission==="default"?await Notification.requestPermission():Notification.permission;if(h(Ie,!0),h(Je,l),l==="granted"){h(ge,sn(!0)),h(qe,t(ge)?"Browser notifications enabled":"Browser notification preference could not be saved"),h(ft,!t(ge));return}sn(!1),h(ge,!1),h(qe,l==="denied"?"Browser notifications are blocked by this browser":"Browser notifications were not enabled"),h(ft,!0)}async function _r(){h(qe,""),h(ft,!1);try{const i=await nt("/api/me",{method:"PATCH",body:JSON.stringify({display_name:t(me),handle:t(Be),avatar_url:t(pt),notification_settings:{pushover_enabled:t(X),pushover_user_key:t(Ce)}})});h(O,i.user),pn(t(G).map(l=>l.author?.id===t(O)?.id?{...l,author:i.user}:l)),h(K,t(K).map(l=>l.author?.id===t(O)?.id?{...l,author:i.user}:l)),t(W)?.author?.id===t(O).id&&h(W,{...t(W),author:i.user}),h(qe,"Saved"),h(Re,!1)}catch(i){h(qe,i instanceof Error?i.message:"Could not save profile"),h(ft,!0)}}async function va(){const i=await nt("/api/workspaces");h(Z,i.workspaces)}function Jn(i="",l=""){return`${i||""}/${l||""}`}function cn(i=t(q),l=""){const g=jn(i);if(!g)return"/app";const y=`/app/${encodeURIComponent(g)}`,S=fe(l);return S?`${y}/${encodeURIComponent(S)}`:y}function jn(i=t(q)){return i?t(Z).find(l=>l.id===i||l.route_id===i)?.route_id||i:""}function fe(i=""){return i?t(N).find(l=>l.id===i||l.route_id===i)?.route_id||t(L).find(l=>l.id===i||l.route_id===i)?.route_id||t(W)?.id===i&&t(W).route_id||""||t(G).find(l=>l.id===i)?.route_id||i:""}async function p(i=t(q),l="",g=!1){const y=cn(i,l);window.location.pathname!==y&&await gs(y,{replaceState:g,noScroll:!0,keepFocus:!0})}function B(){h(W,null),h(ae,null),h(j,null),h(J,"message"),h(K,[]),h(mt,!1)}function le(i=t(q)){return At(i)||t(N).find(l=>l.name.toLowerCase()==="guest")?.id||t(N)[0]?.id||t(L)[0]?.id||""}function $e(i=t(q)){return t(Z).find(l=>l.id===i||l.route_id===i)}function Pe(i=t(q)){const l=$e(i),g=l?.route_id||l?.id||i;return g?`${T}${g}`:""}function ct(i){try{const l=JSON.parse(i);return{id:typeof l.id=="string"?l.id:"",routeID:typeof l.routeID=="string"?l.routeID:""}}catch{return{id:i}}}function At(i=t(q)){const l=Pe(i);if(!l)return"";let g;try{const S=window.localStorage.getItem(l);if(!S)return"";g=ct(S)}catch{return""}const y=t(N).find(S=>S.id===g.id||S.route_id===g.routeID);if(y)return y.id;try{window.localStorage.removeItem(l)}catch{}return""}function zt(i,l){if(!i||!l)return;const g=t(N).find(S=>S.id===l);if(!g)return;const y=Pe(i);if(y)try{window.localStorage.setItem(y,JSON.stringify({id:g.id,routeID:g.route_id}))}catch{}}async function Gt(i="",l=""){const g=++dt,y=Jn(i,l),S=l.trim()?await It(i,l):null;if(g!==dt)return;const ne=S?t(Z).find(Me=>Me.id===S.workspace_id):t(Z).find(Me=>Me.id===i||Me.route_id===i)||t(Z)[0];if(!ne){qn("",oa({messages:[],oldest_seq:0,newest_seq:0,has_older:!1,has_newer:!1}),"replace"),h(ot,y);return}const _e=S?Jn(S.workspace_route_id,S.target_route_id):Jn(ne.route_id,""),ye=t(q)!==ne.id;if(ye&&(xr(),h(q,ne.id),h(D,""),h(P,""),h(W,null),h(ae,null),h(j,null),h(J,"message"),h(K,[]),Ki(),Va(),h(Yt,!0),Rl()),(ye||t(N).length===0)&&await sa(!1,!1),g!==dt||((ye||t(L).length===0)&&await ka(),ye&&await Promise.all([br(),Go()]),g!==dt))return;if(S){const Me=await _a(S,g);if(g!==dt)return;if(!Me){B(),await p(ne.id,le(),!0);return}}if(S?.canonical_path&&window.location.pathname!==S.canonical_path&&(h(ot,_e),await gs(S.canonical_path,{replaceState:!0,noScroll:!0,keepFocus:!0}),g!==dt))return;if(S?.target_type==="channel"&&t(N).some(Me=>Me.id===S.target_id)){const Me=S.target_id,be=!ye&&t(D)===Me&&!t(P)&&t(Pt)===Me;if(h(D,Me),h(P,""),zt(ne.id,Me),B(),be){h(ot,_e),ya(Me);return}if(await Un(),g!==dt)return;h(ot,_e);return}if(S?.target_type==="direct"&&t(L).some(Me=>Me.id===S.target_id)){const Me=S.target_id,be=!ye&&t(P)===Me&&!t(D)&&t(Pt)===Me;if(h(P,Me),h(D,""),B(),be){h(ot,_e),ya(Me);return}if(await Un(),g!==dt)return;h(ot,_e);return}if(S?.target_type==="thread"){const Me=await Ga(S);if(g!==dt)return;if(Me){h(ot,_e);return}}const je=le();if(B(),!je){h(D,""),h(P,""),await Un(),h(ot,y),(i!==ne.route_id||l)&&await p(ne.id,"",!0);return}await p(ne.id,je,!0)}async function _a(i,l){if(i.target_type==="channel")return t(N).some(g=>g.id===i.target_id)||await sa(!1,!1,!1),l===dt&&t(N).some(g=>g.id===i.target_id);if(i.target_type==="direct"){if(!t(L).some(g=>g.id===i.target_id)&&(await ka(),!t(L).some(g=>g.id===i.target_id))){const g=await nt(`/api/dms/${i.target_id}`);$a(g.conversation)}return l===dt&&t(L).some(g=>g.id===i.target_id)}if(i.parent_type==="channel"&&i.parent_id)return t(N).some(g=>g.id===i.parent_id)||await sa(!1,!1,!1),l===dt&&t(N).some(g=>g.id===i.parent_id);if(i.parent_type==="direct"&&i.parent_id){if(!t(L).some(g=>g.id===i.parent_id)&&(await ka(),!t(L).some(g=>g.id===i.parent_id))){const g=await nt(`/api/dms/${i.parent_id}`);$a(g.conversation)}return l===dt&&t(L).some(g=>g.id===i.parent_id)}return!0}async function It(i,l){try{return(await nt(`/api/routes/${encodeURIComponent(i)}/${encodeURIComponent(l)}`)).route}catch(g){if(g instanceof Yr&&(g.status===403||g.status===404))return null;throw g}}async function Ga(i){if(i.workspace_id!==t(q))return!1;const l=i.parent_type==="channel"&&i.parent_id||"",g=i.parent_type==="direct"&&i.parent_id||"";if(l){if(!t(N).some(S=>S.id===l))return!1;h(D,l),h(P,""),zt(i.workspace_id,l)}else if(g){if(!t(L).some(S=>S.id===g))return!1;h(P,g),h(D,"")}else return!1;const y=t(W)?.id===i.target_id&&t(Pt)===tt();return h(j,null),h(J,"thread"),h(mt,!1),await Qa(i.target_id),!y&&t(W)&&await Ar(t(W)),!0}async function Ka(){if(!t(Ne).trim())return;const i=await nt("/api/workspaces",{method:"POST",body:JSON.stringify({name:t(Ne)})});h(Ne,""),h(Kn,!1),h(Z,[...t(Z),i.workspace]),h(mt,!1),await Gt(i.workspace.route_id||i.workspace.id,""),await p(i.workspace.id),h(Ke,"ready")}async function Wo(i){h(mt,!1),await p(i)}async function sa(i=!0,l=!0,g=!0){if(!t(q))return;const y=await nt(`/api/workspaces/${t(q)}/channels`);h(N,y.channels),l?h(D,t(N).find(S=>S.id===t(D))?.id||t(N)[0]?.id||""):t(D)&&!t(N).some(S=>S.id===t(D))&&h(D,""),g&&(h(W,null),h(j,null),h(J,"message"),h(K,[])),i&&await Un()}async function br(){if(h(I,[]),!(!t(q)||t(r)!=="owner"&&t(r)!=="moderator"))try{const i=await nt(`/api/workspaces/${t(q)}/moderation/members`);h(I,i.members)}catch{h(I,[])}}async function Go(){if(h(H,[]),!!t(q))try{const i=await nt(`/api/workspaces/${t(q)}/slash-commands`);h(H,i.slash_commands)}catch{h(H,[])}}function Ko(i,l,g,y){const S=new Map;for(const ne of g)ne.user.id&&S.set(ne.user.id,ne.user);for(const ne of y?.members||[])ne.id&&S.set(ne.id,ne);for(const ne of l)ne.id&&S.set(ne.id,ne);return i?.id&&S.set(i.id,i),[...S.values()].slice(0,24)}async function ja(i,l){if(!t(q))return;const g=await nt(`/api/workspaces/${t(q)}/moderation/members/${i}`,{method:"PATCH",body:JSON.stringify(l)});h(I,[...t(I).filter(y=>y.user.id!==i),g.member]),await sa(!1,!1,!1),h(Ke,"ready")}async function jo(){if(!t(q)||!t(Ae).trim())return;const i=await nt(`/api/workspaces/${t(q)}/channels`,{method:"POST",body:JSON.stringify({name:t(Ae),kind:"public"})});h(Ae,""),h(N,[...t(N),i.channel]),h(Le,!1),await p(t(q),i.channel.id)}async function Ti(i){h(mt,!1),zt(t(q),i);const l=cn(t(q),i);i===t(D)&&!t(P)&&window.location.pathname===l||await p(t(q),i)}async function Un(){xr();const i=tt(),l=i!==t(Pt);Va(),l&&h(Yt,!0);try{if(!t(P)&&!t(D)){qn("",oa({messages:[],oldest_seq:0,newest_seq:0,has_older:!1,has_newer:!1}),"replace");return}const g=await nt(ba(Vo()));if(tt()!==i)return;qn(i,oa(g),"replace")}finally{tt()===i&&h(Yt,!1)}}async function Si(){const i=tt();if(i){Va(),h(Yt,!0),it.set(i,{atBottom:!0});try{const l=await nt(ba(`limit=${er}`));if(tt()!==i)return;qn(i,oa(l),"replace")}finally{tt()===i&&h(Yt,!1)}}}function Vo(){const i=Yo(),l=i.unread_count||0,g=i.last_read_seq||0;return l>0?`around_seq=${encodeURIComponent(String(g+1))}&limit=${er}`:`limit=${er}`}function Yo(){return t(P)?t(L).find(i=>i.id===t(P))||{}:t(D)?t(N).find(i=>i.id===t(D))||{}:{}}function ba(i){const l=t(P)?`/api/dms/${t(P)}/messages`:`/api/channels/${t(D)}/messages`;return i?`${l}?${i}`:l}function oa(i){return{messages:i.messages,oldest_seq:i.oldest_seq,newest_seq:i.newest_seq,has_older:i.has_older,has_newer:i.has_newer}}function qn(i,l,g){const y=Ei(i,l.messages,g),S=y[0]?.channel_seq||0,ne=y[y.length-1]?.channel_seq||0,_e=S>(l.messages[0]?.channel_seq||S),ye=ne<(l.messages[l.messages.length-1]?.channel_seq||ne),je={messages:y,oldest_seq:S,newest_seq:ne,has_older:l.has_older||_e,has_newer:l.has_newer||ye};yr(i,je),ya(i,je),hl(i,y)}function yr(i,l){i&&(t(He).delete(i),t(He).set(i,l),Zo(i),Xo(i),h(He,new Map(t(He))))}function Zo(i){let l=t(He).size+1;for(;t(He).size>bu&&l>0;){l--;const g=t(He).keys().next().value;if(!g)return;if(g===i){const y=t(He).get(g);t(He).delete(g),y&&t(He).set(g,y);continue}t(He).delete(g)}}function Xo(i){let l=it.size+1;for(;it.size>yu&&l>0;){l--;const g=it.keys().next().value;if(!g)return;if(g===i){const y=it.get(g);it.delete(g),y&&it.set(g,y);continue}it.delete(g)}}function ya(i,l=t(He).get(i)){i===tt()&&(h(Qt,l?.has_older||!1),h($t,l?.has_newer||!1))}function Jo(i){const l=t(He).get(i);!i||!l||(yr(i,{...l,has_newer:!0}),ya(i))}function zn(i,l){i==="older"?(h(We,l),h(wn,l==="loading")):(Qe=l,h(Wt,l==="loading"))}function Va(){bt=new Set,h(We,"idle"),Qe="idle",Mt=!1,Tt=!1,h(wn,!1),h(Wt,!1)}function xi(i,l){const g=new Map;for(const y of[...i,...l])g.set(y.id,y);return[...g.values()].sort((y,S)=>(y.channel_seq||0)-(S.channel_seq||0))}function Qo(i){const l=new Set,g=Ni(i);if(g>=0){const S=wr(i,t(G),g);S&&l.add(S.id)}const y=it.get(i)?.anchorMessageID;y&&l.add(y),t(W)&&Bn(t(W),i)&&l.add(t(W).id),t(rt)&&Bn(t(rt),i)&&l.add(t(rt).id);for(const S of t(G))(S.status==="pending"||S.status==="failed")&&Bn(S,i)&&l.add(S.id);return l}function Ei(i,l,g){return wu(l,g,Qo(i))}function Ai(){if(t(We)!=="idle"){Mt=!0;return}$o()}function Ci(i=!1){if(Qe!=="idle"){i&&(Tt=!0);return}Ii()}async function $o(){const i=tt(),l=t(He).get(i),g=`${i}:older`;if(t(We)!=="idle"){Mt=!0;return}if(!i||!l?.has_older||l.oldest_seq<=0||bt.has(g))return;bt.add(g),Mt=!1,zn("older","loading"),xr();let y=!1;try{const S=await nt(ba(`before_seq=${encodeURIComponent(String(l.oldest_seq))}&limit=${Jr}`));if(tt()!==i)return;const ne=xi(S.messages,t(G));qn(i,{messages:ne,oldest_seq:S.oldest_seq||l.oldest_seq,newest_seq:l.newest_seq,has_older:S.has_older,has_newer:l.has_newer},"prepend"),y=!0,zn("older","settling")}catch(S){tt()===i&&h(Ke,S instanceof Error?S.message:"Could not load older messages")}finally{bt.delete(g),tt()===i&&!y&&zn("older","idle")}}async function Ii(){const i=tt(),l=t(He).get(i),g=`${i}:newer`;if(Qe!=="idle"){Tt=!0;return}if(!i||bt.has(g))return;if(!l||l.newest_seq<=0){await Un();return}bt.add(g),Tt=!1,zn("newer","loading");let y=!1;try{const S=await nt(ba(`after_seq=${encodeURIComponent(String(l.newest_seq))}&limit=${Jr}`));if(tt()!==i)return;if(S.messages.length===0){qn(i,{...l,has_newer:S.has_newer},"append"),y=!0,zn("newer","settling");return}const ne=xi(t(G),S.messages);qn(i,{messages:ne,oldest_seq:l.oldest_seq,newest_seq:S.newest_seq||l.newest_seq,has_older:l.has_older,has_newer:S.has_newer},"append"),y=!0,zn("newer","settling")}catch(S){tt()===i&&h(Ke,S instanceof Error?S.message:"Could not load newer messages")}finally{bt.delete(g),tt()===i&&!y&&zn("newer","idle")}}function el(i){const l=t(We)==="settling"&&Mt&&i.nearOlder&&t(Qt),g=Qe==="settling"&&Tt&&i.nearNewer&&t($t);t(We)==="settling"&&zn("older","idle"),Qe==="settling"&&zn("newer","idle"),Mt=!1,Tt=!1,l&&Ai(),g&&Ci()}function tt(){return t(P)||t(D)||""}function Ri(i,l=t(G)){let g=0;for(const y of l)y.channel_id===i&&(y.parent_message_id||typeof y.channel_seq=="number"&&y.channel_seq>g&&(g=y.channel_seq));return g}function Di(i,l=t(G)){let g=0;for(const y of l)y.direct_conversation_id===i&&typeof y.channel_seq=="number"&&y.channel_seq>g&&(g=y.channel_seq);return g}function Ya(i,l){return i&&l.unread_count||0}async function tl(i,l){const g=t(N).find(y=>y.id===i);if(g&&!(l<=0||l<=(g.last_read_seq||0))){h(N,t(N).map(y=>y.id===i?(()=>{const S=Math.max(y.last_seq||0,l);return{...y,last_seq:S,unread_count:l>=S?0:y.unread_count||0,last_read_seq:l}})():y));try{await nt(`/api/channels/${i}/read`,{method:"POST",body:JSON.stringify({seq:l})})}catch{}}}async function nl(i,l){const g=t(L).find(y=>y.id===i);if(g&&!(l<=0||l<=(g.last_read_seq||0))){h(L,t(L).map(y=>y.id===i?(()=>{const S=Math.max(y.last_seq||0,l);return{...y,last_seq:S,unread_count:l>=S?0:y.unread_count||0,last_read_seq:l}})():y));try{await nt(`/api/dms/${i}/read`,{method:"POST",body:JSON.stringify({seq:l})})}catch{}}}function al(i){const l=t(He).get(i)?.newest_seq||0,g=t(N).find(S=>S.id===i);if(g)return Math.max(g.last_seq||0,(g.last_read_seq||0)+(g.unread_count||0),Ri(i),l);const y=t(L).find(S=>S.id===i);return y?Math.max(y.last_seq||0,(y.last_read_seq||0)+(y.unread_count||0),Di(i),l):0}function rl(i){const l=t(He).get(i);return!l||l.has_newer?0:t(N).find(S=>S.id===i)?Ri(i):t(L).find(S=>S.id===i)?Di(i):0}function wa(i={}){if(!i.all&&Date.now()=0&&!Za(l,S))return}const g=i.all?Math.max(i.seq||0,al(l)):i.seq||rl(l);if(g<=0)return;if(t(L).some(S=>S.id===l)){nl(l,g),i.all&&Mi(l,g);return}t(N).some(S=>S.id===l)&&(tl(l,g),i.all&&Mi(l,g))}function Mi(i,l){yt.delete(i),yt=new Map(yt),h(N,t(N).map(g=>g.id===i?{...g,last_seq:Math.max(g.last_seq||0,l),last_read_seq:Math.max(g.last_read_seq||0,l),unread_count:0}:g)),h(L,t(L).map(g=>g.id===i?{...g,last_seq:Math.max(g.last_seq||0,l),last_read_seq:Math.max(g.last_read_seq||0,l),unread_count:0}:g))}function il(i){const l=t(N).find(y=>y.id===i);return l?l.last_read_seq||0:t(L).find(y=>y.id===i)?.last_read_seq||0}function Ni(i){const l=t(N).find(y=>y.id===i);if(l)return Ya(i,l)>0?l.last_read_seq||0:-1;const g=t(L).find(y=>y.id===i);return g&&Ya(i,g)>0?g.last_read_seq||0:-1}function wr(i,l,g){for(const y of l){if(!Bn(y,i)||y.parent_message_id||y.author?.id===t(O)?.id||y.author_id===t(O)?.id)continue;const S=y.channel_seq;if(typeof S=="number"&&S>g)return y}return null}function sl(i,l){if(!i)return;const g=dl(i);if(Ya(i,g)<=0){yt.delete(i),yt=new Map(yt);return}const S=g.last_read_seq||0,ne=yt.get(i);if(ne?.boundarySeq===S&&ne.since||!Za(i,S))return;const _e=wr(i,l,S);_e&&(yt=new Map(yt).set(i,{boundarySeq:S,since:Sr(_e.created_at)}))}function Oi(i,l,g){if(!i||!g)return;const y=yt.get(i);y?.boundarySeq===l&&y.since||(yt=new Map(yt).set(i,{boundarySeq:l,since:Sr(g)}))}function kr(i){const l=i.payload,g=l.channel_seq??i.seq??l.seq;return typeof g=="number"?g:Number(g)||0}function Tr(i){const l=i.payload;return{channelID:i.channel_id||(typeof l.channel_id=="string"?l.channel_id:""),dmID:typeof l.direct_conversation_id=="string"?l.direct_conversation_id:""}}function ol(i,l){if(i.type!=="message.created"||!t(ge)||typeof Notification>"u"||Notification.permission!=="granted"||document.visibilityState==="visible"&&l)return;const g=i.payload,y=typeof g.author_id=="string"?g.author_id:"";if(y&&y===t(O)?.id)return;const{channelID:S,dmID:ne}=Tr(i),_e=t(N).find(Ve=>Ve.id===S),je=Ji(y)?.display_name||"ClickClack",Me=_e?`#${_e.name}`:"Direct message",be=typeof g.body=="string"?g.body:"New message",De=typeof g.message_id=="string"?g.message_id:`${S||ne}:${i.seq||Date.now()}`;try{const Ve=new Notification(`${je} in ${Me}`,{body:ll(be),tag:`clickclack:${De}`,icon:"/favicon.svg"});Ve.onclick=()=>{window.focus(),Ve.close(),S?Ti(S):ne&&Vi(ne)}}catch{}}function ll(i){const l=i.replace(/!\[[^\]]*]\([^)]+\)/g,"[image]").replace(/\[[^\]]+]\(([^)]+)\)/g,"$1").replace(/[`*_>#|]/g,"").replace(/\s+/g," ").trim();return l?l.length>180?`${l.slice(0,177)}...`:l:"New message"}function cl(i){if(i.type!=="message.created")return!1;const l=kr(i);if(l<=0)return!1;const{channelID:g,dmID:y}=Tr(i);if(g){const S=t(N).find(ne=>ne.id===g);return l<=(S?.last_seq||0)}if(y){const S=t(L).find(ne=>ne.id===y);return l<=(S?.last_seq||0)}return!1}async function ul(i){const l=i.payload,g=typeof l.direct_conversation_id=="string"?l.direct_conversation_id:"";return!g||t(L).some(y=>y.id===g)?!1:(await ka(),t(L).some(y=>y.id===g))}function dl(i){return t(N).find(l=>l.id===i)||t(L).find(l=>l.id===i)||{}}function Za(i,l,g=t(He)){if(!i||l<0)return!1;const y=g.get(i);if(!y||y.messages.length===0)return!1;const S=l+1;return y.oldest_seq<=S&&y.newest_seq>=S}function fl(i,l,g=t(He)){const y=yt.get(i);if(y?.boundarySeq===l)return y.since;if(!Za(i,l,g))return"";const S=wr(i,t(G),l);return S?Sr(S.created_at):""}function Sr(i){const l=new Date(i);return Number.isNaN(l.getTime())?"":new Intl.DateTimeFormat(void 0,{hour:"numeric",minute:"2-digit"}).format(l)}function xr(){if(!t(Pt)||!t(St))return;const i=t(St).captureState();i&&it.set(t(Pt),i)}function hl(i,l){const g=i!==t(Pt);h(hn,it.get(i));const y=t(G).filter(be=>(be.status==="pending"||be.status==="failed")&&Bn(be,i)),S=new Map(y.map(be=>[be.id,be])),ne=new Map(y.filter(be=>be.nonce).map(be=>[be.nonce,be])),_e=l.map(be=>{const De=S.get(be.id)||(be.nonce?ne.get(be.nonce):void 0);return De?be.nonce&&la.has(be.nonce)?{...be,nonce:De.nonce,status:De.status,attachments:De.attachments?.length?De.attachments:be.attachments}:{...be,nonce:De.nonce,attachments:De.attachments?.length?De.attachments:be.attachments}:be}),ye=new Set(_e.map(be=>be.id)),je=new Set(_e.map(be=>be.nonce).filter(Boolean)),Me=t(G).filter(be=>(be.status==="pending"||be.status==="failed")&&be.id.startsWith("tmp_")&&!ye.has(be.id)&&!(be.nonce&&je.has(be.nonce))&&Bn(be,i));h(G,Me.length>0?[..._e,...Me]:_e),h(Pt,i),sl(i,t(G)),g&&(h(ve,[]),h(Ee,[]),nr())}function pn(i,l="append"){const g=tt(),y=g?t(He).get(g):void 0;if(!g||!y){h(G,i);return}const S=i.filter(De=>Bn(De,g)),ne=Ei(g,S,l),_e=ne.filter(De=>(De.channel_seq||0)>0),ye=_e[0]?.channel_seq||y.oldest_seq,je=_e[_e.length-1]?.channel_seq||y.newest_seq,Me=Xa(ne[0])>Xa(S[0]),be=Xa(ne[ne.length-1])0)&&await Si(),await Ja(),wa({all:!0}),await Ja()}catch(i){h(Ke,i instanceof Error?i.message:"Could not jump to latest messages")}}let la=new Map;function Pi(){return typeof crypto<"u"&&typeof crypto.randomUUID=="function"?crypto.randomUUID().replace(/-/g,""):`${Date.now().toString(36)}${Math.random().toString(36).slice(2,10)}`}function pl(i,l,g=`tmp_${i}`){const y=new Date().toISOString();return{id:g,workspace_id:l.workspaceID,channel_id:l.channelID,direct_conversation_id:l.directConversationID,author_id:t(O)?.id||"",thread_root_id:g,body:l.body,body_format:"markdown",created_at:y,author:t(O)||void 0,attachments:l.upload?[l.upload]:[],quoted_message_id:l.quotedMessageID,nonce:i,status:"pending"}}async function Ui(){const i=t(Se).trim();if(!i)return;if(!t(D)&&!t(P)){h(Ke,"pick or create a channel");return}nr();const l=t(P)?"dm":"channel",g=t(rt)&&t(R)===l?t(rt):null,y={body:i,quotedMessageID:g?.id,upload:t(Fe)||void 0,workspaceID:t(q),channelID:t(D)||void 0,directConversationID:t(P)||void 0,viewKey:tt()};h(Se,""),g&&mn(),h(Fe,null),await qi(y)}async function qi(i,l,g){const y=l??Pi(),S=`tmp_${y}`,ne=g??S,_e=!l&&tt()===i.viewKey,ye=_e&&t($t);la.set(y,i);const je=pl(y,i,ne);l?pn(t(G).map(De=>De.id===ne?je:De)):tt()===i.viewKey&&(pn([...t(G),je]),Li());const Me=i.directConversationID?`/api/dms/${i.directConversationID}/messages`:`/api/channels/${i.channelID}/messages`,be={body:i.body,nonce:y};i.quotedMessageID&&(be.quoted_message_id=i.quotedMessageID);try{let Ve=(await nt(Me,{method:"POST",body:JSON.stringify(be)})).message;if(i.upload)try{await nt(`/api/messages/${Ve.id}/attachments`,{method:"POST",body:JSON.stringify({upload_id:i.upload.id})}),Ve={...Ve,attachments:[...Ve.attachments||[],i.upload]}}catch(xt){console.warn("attachment failed",xt);const Tn={...Ve,nonce:y,status:"failed",attachments:i.upload?[...Ve.attachments||[],i.upload]:Ve.attachments};pn(t(G).map(un=>un.id===ne?Tn:un));return}la.delete(y),t(G).findIndex(xt=>xt.id===ne)>=0?pn(t(G).map(xt=>xt.id===ne?Ve:xt)):t(G).some(xt=>xt.id===Ve.id)?pn(t(G).map(xt=>xt.id===Ve.id?Ve:xt)):Bn(Ve,tt())&&!t(G).some(xt=>xt.id===Ve.id)&&pn([...t(G),Ve]),tt()===i.viewKey&&_e&&(ye&&await Si(),await Li(),wa({all:!0,seq:Ve.channel_seq||0}))}catch(De){console.warn("send failed",De),pn(t(G).map(Ve=>Ve.id===ne?{...Ve,status:"failed"}:Ve))}}function ml(i){if(!i.nonce)return;const l=la.get(i.nonce);if(!l){zi(i);return}qi({...l,viewKey:l.viewKey},i.nonce,i.id)}function zi(i){i.nonce&&la.delete(i.nonce),pn(t(G).filter(l=>l.id!==i.id))}async function vl(i){await Qa(i.id,i),t(q)&&t(W)?.route_id&&window.location.pathname!==cn(t(q),t(W).id)&&await p(t(q),t(W).id)}async function Qa(i,l){h(j,null),l&&h(W,l),h(J,"thread");const g=await nt(`/api/messages/${i}/thread`),y={...g.root,thread_state:g.thread_state};h(W,y),pn(t(G).map(S=>S.id===y.id?y:S)),h(K,g.replies),h(ae,g.thread_state)}async function _l(i){const l=await nt(`/api/messages/${i}/thread`),g={...l.root,thread_state:l.thread_state};pn(t(G).map(y=>y.id===g.id?g:y))}function bl(i,l){const g=t(G).find(_e=>_e.id===i);if(!g)return!1;const y=new Date(l.created_at).getTime();if(Number.isFinite(y)&&yne}async function Bi(){const i=t(Te).trim();if(!i||!t(W))return;const l=t(rt)&&t(R)==="thread"?t(rt):null;h(Te,"");const g={body:i,nonce:Pi()};l&&(g.quoted_message_id=l.id);const y=await nt(`/api/messages/${t(W).id}/thread/replies`,{method:"POST",body:JSON.stringify(g)});l&&mn(),t(K).some(S=>S.id===y.message.id)||h(K,[...t(K),y.message]),h(ae,y.thread_state)}function Fi(i,l){h(rt,i),h(R,l),h(J,l==="thread"?"thread":"message")}function Hi(){return t(ee)!==null||t(Re)||t(Le)||t(et)}function yl(){return t(J)==="thread"&&t(W)&&t(de)?t(de):t(te)}function mn(){h(rt,null),h(R,null)}async function Wi(i){const l=i.quoted_message_id;if(!l)return;if(t(St)?.scrollToMessage(l)??!1){await Gi(l);return}const y=await nt(`/api/messages/${l}`);Bn(y.message,tt())&&await Ar(y.message)}async function wl(){kn=Date.now()+1200,!(t(f)&&t(St)?.scrollToDivider(!1))&&await kl()}async function kl(){const i=tt();if(!i)return;kn=Date.now()+1200;const l=il(i),g=yt.get(i),S=(g?.boundarySeq===l?g.boundarySeq:l)+1;S<=0||(await ji(S),await Wn(),t(St)?.scrollToDivider(!1))}async function Gi(i){await Wn();const l=document.querySelector(`[data-message-id="${CSS.escape(i)}"]`);l&&(l.classList.add("highlight"),window.setTimeout(()=>l.classList.remove("highlight"),1500))}async function Tl(){if(!t(q)||!t(Ue).trim()){h(we,[]);return}if(t(P)){h(we,[]);return}const i=new URLSearchParams({workspace_id:t(q),q:t(Ue).trim()});t(D)&&i.set("channel_id",t(D));const l=await nt(`/api/search?${i.toString()}`);h(we,l.results)}function Ki(){h(Ue,""),h(we,[])}async function Sl(i){h(we,[]);const l=i.message.channel_id||i.message.direct_conversation_id||"";!t(q)||!l||(tt()!==l&&(await p(t(q),l),await Gt(t(q),l)),tt()===l&&await Ar(i.message))}async function Ar(i){const l=i.channel_seq||0;if(l<=0){await Un();return}await ji(l,i.id)}async function ji(i,l=""){const g=tt();if(!g)return;l&&it.set(g,{atBottom:!1,anchorMessageID:l,anchorPixelOffset:0});const y=g!==t(Pt);Va(),y&&h(Yt,!0);try{const S=await nt(ba(`around_seq=${encodeURIComponent(String(i))}&limit=${er}`));if(tt()!==g)return;qn(g,oa(S),"around"),await Wn(),l&&(t(St)?.scrollToMessage(l),await Gi(l))}finally{tt()===g&&h(Yt,!1)}}async function xl(i){const l=i.currentTarget,g=l.files?.[0];if(!g||!t(q))return;const y=await gu(g),S=new FormData;S.set("workspace_id",t(q)),S.set("file",g),y.width>0&&S.set("width",String(y.width)),y.height>0&&S.set("height",String(y.height)),y.durationMS>0&&S.set("duration_ms",String(y.durationMS));const ne=await nt("/api/uploads",{method:"POST",body:S});h(Fe,ne.upload),l.value=""}async function ka(){if(!t(q))return;const i=await nt(`/api/dms?workspace_id=${t(q)}`);h(L,i.conversations)}function $a(i){h(L,t(L).some(l=>l.id===i.id)?t(L).map(l=>l.id===i.id?i:l):[...t(L),i])}async function El(i){const l=i.trim();l&&(await Yi(l),h(pe,""),h(et,!1))}async function Vi(i){h(mt,!1);const l=cn(t(q),i);i===t(P)&&!t(D)&&window.location.pathname===l||await p(t(q),i)}async function Yi(i){const l=i.trim();if(!t(q)||!l)return;const g=t(L).find(S=>S.members.some(ne=>ne.id===l));if(g){h(mt,!1),await p(t(q),g.id);return}const y=await nt("/api/dms",{method:"POST",body:JSON.stringify({workspace_id:t(q),member_ids:[l]})});$a(y.conversation),h(mt,!1),await p(t(q),y.conversation.id)}function Zi(){lt&&clearTimeout(lt),lt=void 0,h(rn,null)}function Al(i,l){Zi(),h(rn,{conversation:i,restoreRoute:l,title:ta(i,t(O)?.id)}),lt=setTimeout(()=>{h(rn,null),lt=void 0},8e3)}async function Cl(){const i=t(rn);if(i){Zi();try{const l=await nt(`/api/dms/${i.conversation.id}/open`,{method:"POST"});$a(l.conversation),i.restoreRoute&&await p(i.conversation.workspace_id,l.conversation.id),h(Ke,"direct message restored")}catch(l){h(Ke,l instanceof Error?l.message:"Could not restore direct message")}}}async function Il(i){if(!i)return;const l=t(L).find(y=>y.id===i),g=t(P)===i;if(await nt(`/api/dms/${i}`,{method:"DELETE"}),h(L,t(L).filter(y=>y.id!==i)),l&&Al(l,g),g){B();const y=t(N)[0]?.id||"";h(P,""),h(D,y),y&&zt(t(q),y),await p(t(q),y),await Un()}}function Rl(){Ht?.close(),Ht=null,h(Dt,!1),t(q)&&(Ht=Pu({workspaceID:t(q),onEvent:i=>{Dl(i)},onStatusChange:i=>h(Dt,i)}))}async function Dl(i){if(i.type==="typing.started"||i.type==="typing.stopped"){Nl(i);return}if(i.type==="agent.progress"){Ol(i);return}if(i.type==="channel.read"||i.type==="dm.read"){Ml(i);return}if((i.type==="channel.created"||i.type==="channel.updated")&&i.workspace_id===t(q)){await sa(!1,!1,!1);return}if(i.type==="member.moderation_updated"&&i.workspace_id===t(q)){const y=t(P),S=i.payload.user_id===t(O)?.id;if(await va(),await br(),await sa(!1,S,S),S){if(await ka(),y&&(t(L).some(ne=>ne.id===y)?(h(P,y),h(D,"")):h(P,"")),!t(D)&&!t(P)){qn("",oa({messages:[],oldest_seq:0,newest_seq:0,has_older:!1,has_newer:!1}),"replace");return}await Un()}return}if(cl(i))return;const l=i.channel_id===t(D)||i.payload.direct_conversation_id===t(P);if(ol(i,l),i.type==="message.created"&&!l&&(await ul(i)||Xi(i)),l&&(i.type==="message.created"||i.type==="message.updated"||i.type==="message.deleted")){const y=i.payload.nonce;if(i.type==="message.created"&&y&&la.has(y))return;const S=Er();i.type==="message.created"&&!S?(kn=Date.now()+1200,Jo(tt())):i.type==="message.created"?await Ii():await Un(),i.type==="message.created"&&Xi(i,S),i.type==="message.created"&&S&&(await Ja(),wa({all:!0,seq:kr(i)}))}const g=i.payload.root_message_id||i.payload.message_id;g&&i.type==="thread.state_updated"&&bl(g,i)?t(W)?.id===g?await Qa(g,t(W)):await _l(g):i.type!=="thread.reply_created"&&t(W)&&g===t(W).id&&await Qa(t(W).id,t(W))}function Ml(i){const l=i.payload,g=typeof l.user_id=="string"?l.user_id:"";if(!g||g!==t(O)?.id)return;const y=i.seq??l.last_read_seq??l.seq,S=typeof y=="number"?y:Number(y)||0;if(i.type==="channel.read"){const ne=typeof l.channel_id=="string"?l.channel_id:i.channel_id||"";if(!ne)return;h(N,t(N).map(_e=>{if(_e.id!==ne)return _e;const ye=Math.max(_e.last_read_seq||0,S);return{..._e,last_read_seq:ye,unread_count:ye>=(_e.last_seq||0)?0:_e.unread_count||0}}))}else{const ne=typeof l.direct_conversation_id=="string"?l.direct_conversation_id:"";if(!ne)return;h(L,t(L).map(_e=>{if(_e.id!==ne)return _e;const ye=Math.max(_e.last_read_seq||0,S);return{..._e,last_read_seq:ye,unread_count:ye>=(_e.last_seq||0)?0:_e.unread_count||0}}))}}function Xi(i,l){const g=i.payload,y=typeof g.author_id=="string"?g.author_id:"";if(y&&y===t(O)?.id||g.parent_message_id)return;const S=kr(i),{channelID:ne,dmID:_e}=Tr(i);if(ne){const ye=ne===t(D)&&!t(P),je=ye?l??Er():!1,Me=t(N).find(De=>De.id===ne),be=S>0?S:(Me?.last_seq||0)+1;ye&&!je&&(Me?.unread_count||0)===0&&Oi(ne,Me?.last_read_seq||0,i.created_at),h(N,t(N).map(De=>{if(De.id!==ne)return De;const Ve=Math.max(De.last_seq||0,be),Fn=ye&&!je&&(De.unread_count||0)===0?Math.max(De.last_read_seq||0,be-1):De.last_read_seq||0,xt=je?0:(De.unread_count||0)+1;return{...De,last_seq:Ve,last_read_seq:Fn,unread_count:xt}}))}else if(_e){const ye=_e===t(P),je=ye?l??Er():!1,Me=t(L).find(De=>De.id===_e),be=S>0?S:(Me?.last_seq||0)+1;ye&&!je&&(Me?.unread_count||0)===0&&Oi(_e,Me?.last_read_seq||0,i.created_at),h(L,t(L).map(De=>{if(De.id!==_e)return De;const Ve=Math.max(De.last_seq||0,be),Fn=ye&&!je&&(De.unread_count||0)===0?Math.max(De.last_read_seq||0,be-1):De.last_read_seq||0,xt=je?0:(De.unread_count||0)+1;return{...De,last_seq:Ve,last_read_seq:Fn,unread_count:xt}}))}}function Nl(i){const l=i.payload,g=typeof l.user_id=="string"?l.user_id:"";if(!g||g===t(O)?.id)return;const y=i.channel_id||(typeof l.channel_id=="string"?l.channel_id:""),S=typeof l.direct_conversation_id=="string"?l.direct_conversation_id:"";if(!(t(D)&&y===t(D)||t(P)&&S===t(P)))return;if(i.type==="typing.stopped"){h(ve,t(ve).filter(je=>je.userID!==g));return}const _e=Ji(g),ye=t(ve).filter(je=>je.userID!==g);ye.push({userID:g,user:_e,expiresAt:Date.now()+Ph}),h(ve,ye),Pl()}function Ol(i){const l=i.payload,g=i.channel_id||(typeof l.channel_id=="string"?l.channel_id:""),y=typeof l.direct_conversation_id=="string"?l.direct_conversation_id:"";if(!(t(D)&&g===t(D)||t(P)&&y===t(P)))return;const ne=typeof l.turn_id=="string"?l.turn_id:"",_e=typeof l.op=="string"?l.op:"";if(!ne||!_e)return;if(_e==="clear"){h(Ee,t(Ee).filter(Sn=>Sn.turnId!==ne));return}const ye=l.line,je=ye&&typeof ye.id=="string"?ye.id:"";if(!je)return;const Me=ye&&typeof ye.text=="string"?ye.text:"",be=ye&&typeof ye.title=="string"?ye.title:"",De=Me||be,Ve=ye&&typeof ye.tool_name=="string"?ye.tool_name:typeof ye?.toolName=="string"?ye.toolName:void 0,Fn=ye&&typeof ye.status=="string"?ye.status:void 0,xt=ye&&typeof ye.kind=="string"?ye.kind:void 0,Tn=t(Ee).find(Sn=>Sn.turnId===ne),un=Tn?.lines.find(Sn=>Sn.id===je),Vn={id:je,kind:xt??un?.kind??"lifecycle",text:De||un?.text||"",toolName:Ve??un?.toolName,status:Fn??un?.status,finalized:_e==="finalize"||(un?.finalized??!1)};if(!un&&!Vn.text&&!Vn.toolName)return;const Mr=typeof l.user_id=="string"?l.user_id:"",Yn=Date.now()+zh;if(!Tn)h(Ee,[...t(Ee),{turnId:ne,userId:Mr,lines:[Vn],expiresAt:Yn}]);else{const Sn=Tn.lines.some(xn=>xn.id===je)?Tn.lines.map(xn=>xn.id===je?Vn:xn):[...Tn.lines,Vn];h(Ee,t(Ee).map(xn=>xn.turnId===ne?{...xn,lines:Sn,expiresAt:Yn}:xn))}Ll()}function Ll(){st||(st=window.setInterval(()=>{const i=Date.now(),l=t(Ee).filter(g=>g.expiresAt>i);l.length!==t(Ee).length&&h(Ee,l),l.length===0&&st&&(window.clearInterval(st),st=void 0)},1e3))}function Ji(i){if(t(O)?.id===i)return t(O);const l=t(G).find(g=>g.author?.id===i)?.author;if(l)return l;for(const g of t(L)){const y=g.members.find(S=>S.id===i);if(y)return y}}function Pl(){xe||(xe=window.setInterval(()=>{const i=Date.now(),l=t(ve).filter(g=>g.expiresAt>i);l.length!==t(ve).length&&h(ve,l),l.length===0&&xe&&(window.clearInterval(xe),xe=void 0)},1e3))}function Ul(){t(q)&&(!t(D)&&!t(P)||Hu({workspaceID:t(q),channelID:t(D)||void 0,directConversationID:t(P)||void 0}))}function Qi(i){i&&(h(W,null),h(j,i),(t(r)==="owner"||t(r)==="moderator")&&!t(I).some(l=>l.user.id===i.id)&&br())}function ql(i){if(i.key==="Escape"&&t(rt)&&t(R)!=="thread"){i.preventDefault(),mn();return}i.key==="Enter"&&!i.shiftKey&&(i.preventDefault(),Ui())}function zl(i){if(i.key==="Escape"&&t(rt)&&t(R)==="thread"){i.preventDefault(),mn();return}i.key==="Enter"&&!i.shiftKey&&(i.preventDefault(),Bi())}function Cr(i,l){h(ee,{url:i,title:l})}function $i(i){const l=i.target;l instanceof HTMLImageElement&&l.closest(".markdown")&&(i.preventDefault(),Cr(_u(l),l.alt||"Image"))}function Ir(i){const l=t(Se)&&!t(Se).endsWith(` -`)?` -`:"";h(Se,`${t(Se)}${l}${i}`)}function Bl(i,l=i){Ir(`${i}${i==="```"?` -code -`:"text"}${l}`)}function Fl(i,l){Ir(`![${l}](${i})`),h(he,!1),h(Ge,"")}function Rr(){const i=t(W)!==null,l=tt();t(R)==="thread"&&mn(),h(W,null),h(j,null),h(J,"message"),h(K,[]),i&&t(q)&&l&&p(t(q),l)}function Hl(){t(w)?Rr():h(Ke,"pick a message to open its thread")}function Wl(i){if(i.key==="Escape")if(Hi())Ta();else if(t(mt)){i.preventDefault(),Dr();return}else if(t(rt)){i.preventDefault(),mn();return}else{i.preventDefault(),gl();return}if(t(mt)&&i.key.length===1&&!i.ctrlKey&&!i.metaKey&&!i.altKey&&!i.isComposing){const l=document.activeElement;if(!(l instanceof HTMLInputElement)&&!(l instanceof HTMLTextAreaElement)&&!(l instanceof HTMLSelectElement)&&!(l instanceof HTMLElement&&l.isContentEditable)){i.preventDefault();return}}Lu(i,{authRequired:t(kt),isModalOpen:()=>Hi()||t(mt),messageInput:t(te),replyInput:t(de),target:yl})}function Ta(){h(ee,null),h(Re,!1),h(Le,!1),h(et,!1)}function Dr(){h(mt,!1)}function Gl(){if(t(mt)&&window.matchMedia(M).matches){Dr();return}h(on,!t(on))}Ot(()=>(t(Z),t(q)),()=>{h(a,t(Z).find(i=>i.id===t(q)))}),Ot(()=>t(a),()=>{h(r,t(a)?.role||"")}),Ot(()=>(t(j),t(I)),()=>{h(s,t(j)?t(I).find(i=>i.user.id===t(j)?.id):void 0)}),Ot(()=>(t(N),t(D)),()=>{h(o,t(N).find(i=>i.id===t(D)))}),Ot(()=>(t(L),t(P)),()=>{h(c,t(L).find(i=>i.id===t(P)))}),Ot(()=>(t(P),t(D)),()=>{h(en,t(P)||t(D)||"")}),Ot(()=>(t(P),t(L),t(D),t(N)),()=>{h(d,t(P)?t(L).find(i=>i.id===t(P))||{}:t(D)?t(N).find(i=>i.id===t(D))||{}:{})}),Ot(()=>(t(en),t(d)),()=>{h(u,Ya(t(en),t(d)))}),Ot(()=>(t(u),t(d)),()=>{h(m,t(u)>0&&t(d).last_read_seq||0)}),Ot(()=>(t(u),t(en),t(m),t(He)),()=>{h(f,t(u)>0?Za(t(en),t(m),t(He)):!1)}),Ot(()=>(t(u),t(en),t(m),t(He)),()=>{h(_,t(u)>0?fl(t(en),t(m),t(He)):"")}),Ot(()=>(t(W),t(j)),()=>{h(w,t(W)!==null||t(j)!==null)}),Ot(()=>(t(G),t(L),t(O)),()=>{h(A,xu(t(G),t(L),t(O)?.id||""))}),Ot(()=>(t(O),t(A),t(I),t(c)),()=>{h($,Ko(t(O),t(A),t(I),t(c)))}),Ot(()=>(t(R),t(rt),t(G)),()=>{t(R)==="channel"&&t(rt)&&!t(G).some(i=>i.id===t(rt)?.id)&&mn()}),Ot(()=>(t(R),t(rt),t(G)),()=>{t(R)==="dm"&&t(rt)&&!t(G).some(i=>i.id===t(rt)?.id)&&mn()}),Ot(()=>(t(R),t(rt),t(W),t(K)),()=>{t(R)==="thread"&&t(rt)&&t(W)&&t(rt).id!==t(W).id&&!t(K).some(i=>i.id===t(rt)?.id)&&mn()}),Ot(()=>(t(Ke),t(O),La(F()),La(Y()),t(ot)),()=>{t(Ke)==="ready"&&t(O)&&Jn(F(),Y())!==t(ot)&&Gt(F(),Y())}),Ot(()=>(t(he),t(Ge)),()=>{h(x,t(he)?vu.filter(i=>{const l=t(Ge).trim().toLowerCase();return!l||i.title.toLowerCase().includes(l)||i.tags.some(g=>g.includes(l))}):[])}),Bc(),hu();var es=yn();tu("1oa2eo8",i=>{var l=Zg();z(i,l)}),an("keydown",ds,Wl,!0),an("pointerdown",ds,function(...i){Iu?.apply(this,i)},!0);var Kl=Vt(es);{var jl=i=>{var l=Xg();z(i,l)},Vl=i=>{var l=$g(),g=Vt(l);let y;var S=b(g),ne=b(S);{var _e=ke=>{var Ze=In("×");z(ke,Ze)},ye=ke=>{var Ze=Jg();z(ke,Ze)};ue(ne,ke=>{t(mt)?ke(_e):ke(ye,-1)})}v(S);var je=k(S,2);{var Me=ke=>{var Ze=Qg();Q("click",Ze,Dr),z(ke,Ze)};ue(je,ke=>{t(mt)&&ke(Me)})}var be=k(je,2);eg(be,{get workspaces(){return t(Z)},get selectedWorkspaceID(){return t(q)},get workspaceName(){return t(Ne)},get showWorkspaceCreate(){return t(Kn)},hrefForWorkspace:ke=>cn(ke),onSelectWorkspace:ke=>{Wo(ke)},onToggleWorkspaceCreate:()=>h(Kn,!t(Kn)),onWorkspaceName:ke=>h(Ne,ke),onCreateWorkspace:()=>{Ka()}});var De=k(be,2);{let ke=Kt(()=>(t(a),tn(()=>t(a)?.name))),Ze=Kt(()=>(t(rn),tn(()=>t(rn)?.title)));_g(De,{get workspaceName(){return t(ke)},get status(){return t(Ke)},get connected(){return t(Dt)},get sidebarCollapsed(){return t(on)},get channels(){return t(N)},get directConversations(){return t(L)},get recentPeople(){return t(A)},get currentUser(){return t(O)},get selectedChannelID(){return t(D)},get selectedDirectID(){return t(P)},get selectedProfile(){return t(j)},onToggleCollapse:Gl,hrefForChannel:Ye=>cn(t(q),Ye),hrefForDirect:Ye=>cn(t(q),Ye),onSelectChannel:Ye=>{Ti(Ye)},onCreateChannel:()=>h(Le,!0),onSelectDirect:Ye=>{Vi(Ye)},onCreateDirect:()=>h(et,!0),onHideDirect:Ye=>{Il(Ye)},get hiddenDirectTitle(){return t(Ze)},onUndoHideDirect:()=>{Cl()},onOpenProfile:Qi,onOpenSettings:gn})}var Ve=k(De,2),Fn=b(Ve);{let ke=Kt(()=>(t(a),tn(()=>t(a)?.name))),Ze=Kt(()=>(t(O),tn(()=>t(O)?.id))),Ye=Kt(()=>t(W)!==null);Yg(Fn,{get selectedDirect(){return t(c)},get selectedChannel(){return t(o)},get workspaceName(){return t(ke)},get currentUserID(){return t(Ze)},get searchQuery(){return t(Ue)},get sidePanelOpen(){return t(w)},get threadOpen(){return t(Ye)},onSearchQuery:qt=>h(Ue,qt),onSearch:()=>{Tl()},onResetSearch:Ki,onToggleThread:Hl,onPinnedItems:()=>h(Ke,"no pinned items")})}var xt=k(Fn,2);Ug(xt,{get results(){return t(we)},onClose:()=>h(we,[]),onOpenResult:ke=>{Sl(ke)}});var Tn=k(xt,2);{let ke=Kt(()=>t(We)!=="idle"),Ze=Kt(()=>(t(W),tn(()=>t(W)?.id))),Ye=Kt(()=>(t(O),tn(()=>t(O)?.id)));Lh(Tn,{get messages(){return t(G)},get selectedDirect(){return t(c)},get selectedChannel(){return t(o)},get restoreState(){return t(hn)},get viewKey(){return t(Pt)},get loading(){return t(Yt)},get unreadCount(){return t(u)},get unreadBoundarySeq(){return t(m)},get unreadBoundaryLoaded(){return t(f)},get unreadSince(){return t(_)},get hasOlder(){return t(Qt)},get hasNewer(){return t($t)},get loadingOlder(){return t(wn)},get loadingNewer(){return t(Wt)},get prepending(){return t(ke)},get selectedThreadID(){return t(Ze)},get currentUserID(){return t(Ye)},onListRef:qt=>h(St,qt),onActivateMessageComposer:()=>h(J,"message"),onInlineImagePointerUp:$i,onOpenProfile:Qi,onReply:Fi,onOpenThread:vl,onJumpToQuote:qt=>{Wi(qt)},onOpenImage:Cr,onLoadOlder:Ai,onLoadNewer:qt=>Ci(qt==="wheel"),onJumpToUnread:()=>{wl()},onHistorySettled:el,onReachedBottom:wa,onMarkRead:qt=>{wa({all:!0,seq:qt})},onRetry:ml,onDiscard:zi})}var un=k(Tn,2);Wh(un,{get turns(){return t(Ee)}});var Vn=k(un,2);{let ke=Kt(()=>(t(O),tn(()=>t(O)?.id)));qh(Vn,{get entries(){return t(ve)},get currentUserID(){return t(ke)}})}var Mr=k(Vn,2);{let ke=Kt(()=>(t(c),La(ta),t(O),t(o),tn(()=>t(c)?`Message ${ta(t(c),t(O)?.id)}`:t(o)?`Message #${t(o).name}`:"Pick a channel to start"))),Ze=Kt(()=>t(rt)&&t(R)===(t(P)?"dm":"channel")?t(rt):null),Ye=Kt(()=>t(D)?t(H):[]);ko(Mr,{get value(){return t(Se)},get placeholder(){return t(ke)},ariaLabel:"Message body",submitLabel:"Send",get pendingUpload(){return t(Fe)},get replyTarget(){return t(Ze)},showUpload:!0,showToolbar:!0,get showGifPicker(){return t(he)},get gifQuery(){return t(Ge)},get filteredGifs(){return t(x)},get slashCommands(){return t(Ye)},get mentionPeople(){return t($)},onValue:qt=>{const nc=t(Se);h(Se,qt),qt.trim()&&qt!==nc?Ul():qt.trim()||nr()},onSubmit:()=>{Ui()},onKeydown:ql,onFocus:()=>h(J,"message"),onInputRef:qt=>h(te,qt),onUploadFile:xl,onRemoveUpload:()=>h(Fe,null),onClearReply:mn,onApplyMarkdownWrap:Bl,onAppendToComposer:Ir,onToggleGif:()=>h(he,!t(he)),onGifQuery:qt=>h(Ge,qt),onPickGif:Fl})}v(Ve);var Yn=k(Ve,2);let Sn;var xn=b(Yn);{var Yl=ke=>{{let Ze=Kt(()=>t(rt)&&t(R)==="thread"?t(rt):null);Hg(ke,{get root(){return t(W)},get replies(){return t(K)},get threadState(){return t(ae)},get replyBody(){return t(Te)},get replyTarget(){return t(Ze)},get mentionPeople(){return t($)},onClose:Rr,onReplyBody:Ye=>h(Te,Ye),onSubmitReply:()=>{Bi()},onReplyKeydown:zl,onReplyFocus:()=>h(J,"thread"),onReplyInputRef:Ye=>h(de,Ye),onSetReplyTarget:Fi,onClearReply:mn,onActivateThreadComposer:()=>h(J,"thread"),onInlineImagePointerUp:$i,onJumpToQuote:Ye=>{Wi(Ye)},onOpenImage:Cr})}},Zl=ke=>{{let Ze=Kt(()=>(t(a),tn(()=>t(a)?.name)));Ig(ke,{get profile(){return t(j)},get currentUser(){return t(O)},get workspaceName(){return t(Ze)},get currentUserRole(){return t(r)},get moderation(){return t(s)},onClose:Rr,onEdit:gn,onMessage:Ye=>{Yi(Ye)},onApprove:Ye=>{ja(Ye,{role:"member",clear_timeout:!0,blocked:!1})},onTimeout:Ye=>{ja(Ye,{timeout_minutes:60})},onBlock:Ye=>{ja(Ye,{blocked:!0})},onUnblock:Ye=>{ja(Ye,{blocked:!1,clear_timeout:!0})},onSetStatus:()=>h(Ke,"status messages are coming soon")})}},Xl=ke=>{zg(ke)};ue(xn,ke=>{t(W)?ke(Yl):t(j)?ke(Zl,1):ke(Xl,-1)})}v(Yn),v(g);var ts=k(g,2);{var Jl=ke=>{Og(ke,{get user(){return t(O)},get displayName(){return t(me)},get handle(){return t(Be)},get avatarURL(){return t(pt)},get pushoverEnabled(){return t(X)},get pushoverUserKey(){return t(Ce)},get browserNotificationsSupported(){return t(Ie)},get browserNotificationsEnabled(){return t(ge)},get browserNotificationPermission(){return t(Je)},get status(){return t(qe)},get statusError(){return t(ft)},onDisplayName:Ze=>h(me,Ze),onHandle:Ze=>h(Be,Ze),onAvatarURL:Ze=>h(pt,Ze),onPushoverEnabled:Ze=>h(X,Ze),onPushoverUserKey:Ze=>h(Ce,Ze),onBrowserNotificationsEnabled:Ze=>{ia(Ze)},onClose:Ta,onSave:()=>{_r()}})};ue(ts,ke=>{t(Re)&&t(O)&&ke(Jl)})}var ns=k(ts,2);{var Ql=ke=>{jh(ke,{get channelName(){return t(Ae)},status:"",onChannelName:Ze=>h(Ae,Ze),onClose:Ta,onCreate:()=>{jo()}})};ue(ns,ke=>{t(Le)&&ke(Ql)})}var as=k(ns,2);{var $l=ke=>{{let Ze=Kt(()=>(t(O),tn(()=>t(O)?.id)));Xh(ke,{get people(){return t(A)},get currentUserID(){return t(Ze)},get memberID(){return t(pe)},onMemberID:Ye=>h(pe,Ye),onClose:Ta,onStart:Ye=>{El(Ye)}})}};ue(as,ke=>{t(et)&&ke($l)})}var ec=k(as,2);{var tc=ke=>{dd(ke,{get url(){return t(ee),tn(()=>t(ee).url)},get title(){return t(ee),tn(()=>t(ee).title)},onClose:Ta})};ue(ec,ke=>{t(ee)&&ke(tc)})}oe(()=>{y=gt(g,1,"shell",null,y,{"nav-open":t(mt),"sidebar-collapsed":t(on),"thread-open":t(w)}),re(S,"aria-expanded",t(mt)),Ve.inert=t(mt),Sn=gt(Yn,1,"thread",null,Sn,{open:t(w)}),Yn.inert=t(mt),re(Yn,"aria-label",t(j)?"Profile pane":"Thread pane")}),Q("click",S,()=>h(mt,!t(mt))),z(i,l)};ue(Kl,i=>{t(kt)?i(jl):i(Vl,-1)})}z(n,es),_t()}wt(["click"]);export{lp as C,Jc as a,Ft as e,tu as h,hu as i,re as s}; diff --git a/apps/api/internal/webassets/dist/_app/immutable/entry/app.BOItyeok.js b/apps/api/internal/webassets/dist/_app/immutable/entry/app.Nt0q6qqN.js similarity index 83% rename from apps/api/internal/webassets/dist/_app/immutable/entry/app.BOItyeok.js rename to apps/api/internal/webassets/dist/_app/immutable/entry/app.Nt0q6qqN.js index 5fb9c565..5344df61 100644 --- a/apps/api/internal/webassets/dist/_app/immutable/entry/app.BOItyeok.js +++ b/apps/api/internal/webassets/dist/_app/immutable/entry/app.Nt0q6qqN.js @@ -1,2 +1,2 @@ -const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["../nodes/0.DxH0fKNR.js","../chunks/BQbSjbnU.js","../chunks/Dtg1jxvd.js","../chunks/Cq0K50L1.js","../chunks/CpwnOByv.js","../assets/0.D8lBNawf.css","../nodes/1.DLLaanpR.js","../chunks/D2t05ipP.js","../chunks/01jLas2k.js","../chunks/C__K3_0V.js","../nodes/2.BgcMzLJ9.js","../chunks/D6tJMEHh.js","../chunks/BT2tP07K.js","../assets/ChatApp.CwQVSL7D.css","../assets/2.B2IhzHfA.css","../nodes/3.DWWmaAg4.js","../nodes/4.BRQUM5yE.js","../nodes/5.CW1aX1ge.js"])))=>i.map(i=>d[i]); -import{p as P,i as O,b as D,_ as h}from"../chunks/BT2tP07K.js";import{V as p,a0 as Y,I as u,aC as q,ap as J,aD as K,h as w,B as z,b as Q,E as U,J as W,K as X,D as Z,L,as as $,i as tt,p as et,aE as rt,u as at,aF as st,n as b,v as ot,a as nt,aG as T,o as it,q as ct,t as ut,aH as x}from"../chunks/Dtg1jxvd.js";import{h as mt,m as _t,u as dt,s as lt}from"../chunks/D2t05ipP.js";import{a as v,c as A,f as V,t as ft}from"../chunks/BQbSjbnU.js";import{o as ht}from"../chunks/C__K3_0V.js";import{B as vt}from"../chunks/CpwnOByv.js";const kt={};function gt(s){return class extends yt{constructor(t){super({component:s,...t})}}}class yt{#e;#t;constructor(t){var a=new Map,n=(e,r)=>{var c=K(r,!1,!1);return a.set(e,c),c};const o=new Proxy({...t.props||{},$$events:{}},{get(e,r){return u(a.get(r)??n(r,Reflect.get(e,r)))},has(e,r){return r===Y?!0:(u(a.get(r)??n(r,Reflect.get(e,r))),Reflect.has(e,r))},set(e,r,c){return p(a.get(r)??n(r,c),c),Reflect.set(e,r,c)}});this.#t=(t.hydrate?mt:_t)(t.component,{target:t.target,anchor:t.anchor,props:o,context:t.context,intro:t.intro??!1,recover:t.recover,transformError:t.transformError}),(!t?.props?.$$host||t.sync===!1)&&q(),this.#e=o.$$events;for(const e of Object.keys(this.#t))e==="$set"||e==="$destroy"||e==="$on"||J(this,e,{get(){return this.#t[e]},set(r){this.#t[e]=r},enumerable:!0});this.#t.$set=e=>{Object.assign(o,e)},this.#t.$destroy=()=>{dt(this.#t)}}$set(t){this.#t.$set(t)}$on(t,a){this.#e[t]=this.#e[t]||[];const n=(...o)=>a.call(this,...o);return this.#e[t].push(n),()=>{this.#e[t]=this.#e[t].filter(o=>o!==n)}}$destroy(){this.#t.$destroy()}}function I(s,t,a){var n;w&&(n=tt,z());var o=new vt(s);Q(()=>{var e=t()??null;if(w){var r=W(n),c=r===$,R=e!==null;if(c!==R){var g=X();Z(g),o.anchor=g,L(!1),o.ensure(e,e&&(l=>a(l,e))),L(!0);return}}o.ensure(e,e&&(l=>a(l,e)))},U)}var Et=V('
    '),bt=V(" ",1);function pt(s,t){et(t,!0);let a=P(t,"components",23,()=>[]),n=P(t,"data_0",3,null),o=P(t,"data_1",3,null);rt(()=>t.stores.page.set(t.page)),at(()=>{t.stores,t.page,t.constructors,a(),t.form,n(),o(),t.stores.page.notify()});let e=T(!1),r=T(!1),c=T(null);ht(()=>{const i=t.stores.page.subscribe(()=>{u(e)&&(p(r,!0),st().then(()=>{p(c,document.title||"untitled page",!0)}))});return p(e,!0),i});const R=x(()=>t.constructors[1]);var g=bt(),l=b(g);{var C=i=>{const m=x(()=>t.constructors[0]);var _=A(),y=b(_);I(y,()=>u(m),(d,f)=>{D(f(d,{get data(){return n()},get form(){return t.form},get params(){return t.page.params},children:(E,Pt)=>{var k=A(),M=b(k);I(M,()=>u(R),(N,G)=>{D(G(N,{get data(){return o()},get form(){return t.form},get params(){return t.page.params}}),H=>a()[1]=H,()=>a()?.[1])}),v(E,k)},$$slots:{default:!0}}),E=>a()[0]=E,()=>a()?.[0])}),v(i,_)},S=i=>{const m=x(()=>t.constructors[0]);var _=A(),y=b(_);I(y,()=>u(m),(d,f)=>{D(f(d,{get data(){return n()},get form(){return t.form},get params(){return t.page.params}}),E=>a()[0]=E,()=>a()?.[0])}),v(i,_)};O(l,i=>{t.constructors[1]?i(C):i(S,-1)})}var B=ot(l,2);{var F=i=>{var m=Et(),_=it(m);{var y=d=>{var f=ft();ut(()=>lt(f,u(c))),v(d,f)};O(_,d=>{u(r)&&d(y)})}ct(m),v(i,m)};O(B,i=>{u(e)&&i(F)})}v(s,g),nt()}const wt=gt(pt),Lt=[()=>h(()=>import("../nodes/0.DxH0fKNR.js"),__vite__mapDeps([0,1,2,3,4,5]),import.meta.url),()=>h(()=>import("../nodes/1.DLLaanpR.js"),__vite__mapDeps([6,1,2,7,8,9]),import.meta.url),()=>h(()=>import("../nodes/2.BgcMzLJ9.js"),__vite__mapDeps([10,1,2,11,9,7,12,4,8,3,13,14]),import.meta.url),()=>h(()=>import("../nodes/3.DWWmaAg4.js"),__vite__mapDeps([15,1,2,11,9,7,12,4,8,3,13]),import.meta.url),()=>h(()=>import("../nodes/4.BRQUM5yE.js"),__vite__mapDeps([16,1,2,11,9,7,12,4,8,3,13]),import.meta.url),()=>h(()=>import("../nodes/5.CW1aX1ge.js"),__vite__mapDeps([17,1,2,11,9,7,12,4,8,3,13]),import.meta.url)],Vt=[],jt={"/":[2],"/app":[3],"/app/[workspaceID]":[4],"/app/[workspaceID]/[targetID]":[5]},j={handleError:(({error:s})=>{console.error(s)}),reroute:(()=>{}),transport:{}},Rt=Object.fromEntries(Object.entries(j.transport).map(([s,t])=>[s,t.decode])),Ct=Object.fromEntries(Object.entries(j.transport).map(([s,t])=>[s,t.encode])),St=!1,Bt=(s,t)=>Rt[s](t);export{Bt as decode,Rt as decoders,jt as dictionary,Ct as encoders,St as hash,j as hooks,kt as matchers,Lt as nodes,wt as root,Vt as server_loads}; +const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["../nodes/0.BFe2mANj.js","../chunks/BQbSjbnU.js","../chunks/Dtg1jxvd.js","../chunks/Cq0K50L1.js","../chunks/CpwnOByv.js","../assets/0.BN2BZL1h.css","../nodes/1.DLLaanpR.js","../chunks/D2t05ipP.js","../chunks/01jLas2k.js","../chunks/C__K3_0V.js","../nodes/2.Cen9dSYD.js","../chunks/C-yBSfLe.js","../chunks/BT2tP07K.js","../assets/ChatApp.CwQVSL7D.css","../assets/2.B2IhzHfA.css","../nodes/3.Beyl_vg6.js","../nodes/4.DdHYRc9K.js","../nodes/5.Bjf09aR3.js"])))=>i.map(i=>d[i]); +import{p as P,i as O,b as D,_ as h}from"../chunks/BT2tP07K.js";import{V as p,a0 as Y,I as u,aC as q,ap as J,aD as K,h as w,B as z,b as Q,E as U,J as W,K as X,D as Z,L,as as $,i as tt,p as et,aE as rt,u as at,aF as st,n as b,v as ot,a as nt,aG as T,o as it,q as ct,t as ut,aH as x}from"../chunks/Dtg1jxvd.js";import{h as mt,m as _t,u as dt,s as lt}from"../chunks/D2t05ipP.js";import{a as v,c as A,f as V,t as ft}from"../chunks/BQbSjbnU.js";import{o as ht}from"../chunks/C__K3_0V.js";import{B as vt}from"../chunks/CpwnOByv.js";const kt={};function gt(s){return class extends yt{constructor(t){super({component:s,...t})}}}class yt{#e;#t;constructor(t){var a=new Map,n=(e,r)=>{var c=K(r,!1,!1);return a.set(e,c),c};const o=new Proxy({...t.props||{},$$events:{}},{get(e,r){return u(a.get(r)??n(r,Reflect.get(e,r)))},has(e,r){return r===Y?!0:(u(a.get(r)??n(r,Reflect.get(e,r))),Reflect.has(e,r))},set(e,r,c){return p(a.get(r)??n(r,c),c),Reflect.set(e,r,c)}});this.#t=(t.hydrate?mt:_t)(t.component,{target:t.target,anchor:t.anchor,props:o,context:t.context,intro:t.intro??!1,recover:t.recover,transformError:t.transformError}),(!t?.props?.$$host||t.sync===!1)&&q(),this.#e=o.$$events;for(const e of Object.keys(this.#t))e==="$set"||e==="$destroy"||e==="$on"||J(this,e,{get(){return this.#t[e]},set(r){this.#t[e]=r},enumerable:!0});this.#t.$set=e=>{Object.assign(o,e)},this.#t.$destroy=()=>{dt(this.#t)}}$set(t){this.#t.$set(t)}$on(t,a){this.#e[t]=this.#e[t]||[];const n=(...o)=>a.call(this,...o);return this.#e[t].push(n),()=>{this.#e[t]=this.#e[t].filter(o=>o!==n)}}$destroy(){this.#t.$destroy()}}function I(s,t,a){var n;w&&(n=tt,z());var o=new vt(s);Q(()=>{var e=t()??null;if(w){var r=W(n),c=r===$,R=e!==null;if(c!==R){var g=X();Z(g),o.anchor=g,L(!1),o.ensure(e,e&&(l=>a(l,e))),L(!0);return}}o.ensure(e,e&&(l=>a(l,e)))},U)}var Et=V('
    '),bt=V(" ",1);function pt(s,t){et(t,!0);let a=P(t,"components",23,()=>[]),n=P(t,"data_0",3,null),o=P(t,"data_1",3,null);rt(()=>t.stores.page.set(t.page)),at(()=>{t.stores,t.page,t.constructors,a(),t.form,n(),o(),t.stores.page.notify()});let e=T(!1),r=T(!1),c=T(null);ht(()=>{const i=t.stores.page.subscribe(()=>{u(e)&&(p(r,!0),st().then(()=>{p(c,document.title||"untitled page",!0)}))});return p(e,!0),i});const R=x(()=>t.constructors[1]);var g=bt(),l=b(g);{var C=i=>{const m=x(()=>t.constructors[0]);var _=A(),y=b(_);I(y,()=>u(m),(d,f)=>{D(f(d,{get data(){return n()},get form(){return t.form},get params(){return t.page.params},children:(E,Pt)=>{var k=A(),M=b(k);I(M,()=>u(R),(N,G)=>{D(G(N,{get data(){return o()},get form(){return t.form},get params(){return t.page.params}}),H=>a()[1]=H,()=>a()?.[1])}),v(E,k)},$$slots:{default:!0}}),E=>a()[0]=E,()=>a()?.[0])}),v(i,_)},S=i=>{const m=x(()=>t.constructors[0]);var _=A(),y=b(_);I(y,()=>u(m),(d,f)=>{D(f(d,{get data(){return n()},get form(){return t.form},get params(){return t.page.params}}),E=>a()[0]=E,()=>a()?.[0])}),v(i,_)};O(l,i=>{t.constructors[1]?i(C):i(S,-1)})}var B=ot(l,2);{var F=i=>{var m=Et(),_=it(m);{var y=d=>{var f=ft();ut(()=>lt(f,u(c))),v(d,f)};O(_,d=>{u(r)&&d(y)})}ct(m),v(i,m)};O(B,i=>{u(e)&&i(F)})}v(s,g),nt()}const wt=gt(pt),Lt=[()=>h(()=>import("../nodes/0.BFe2mANj.js"),__vite__mapDeps([0,1,2,3,4,5]),import.meta.url),()=>h(()=>import("../nodes/1.DLLaanpR.js"),__vite__mapDeps([6,1,2,7,8,9]),import.meta.url),()=>h(()=>import("../nodes/2.Cen9dSYD.js"),__vite__mapDeps([10,1,2,11,9,7,12,4,8,3,13,14]),import.meta.url),()=>h(()=>import("../nodes/3.Beyl_vg6.js"),__vite__mapDeps([15,1,2,11,9,7,12,4,8,3,13]),import.meta.url),()=>h(()=>import("../nodes/4.DdHYRc9K.js"),__vite__mapDeps([16,1,2,11,9,7,12,4,8,3,13]),import.meta.url),()=>h(()=>import("../nodes/5.Bjf09aR3.js"),__vite__mapDeps([17,1,2,11,9,7,12,4,8,3,13]),import.meta.url)],Vt=[],jt={"/":[2],"/app":[3],"/app/[workspaceID]":[4],"/app/[workspaceID]/[targetID]":[5]},j={handleError:(({error:s})=>{console.error(s)}),reroute:(()=>{}),transport:{}},Rt=Object.fromEntries(Object.entries(j.transport).map(([s,t])=>[s,t.decode])),Ct=Object.fromEntries(Object.entries(j.transport).map(([s,t])=>[s,t.encode])),St=!1,Bt=(s,t)=>Rt[s](t);export{Bt as decode,Rt as decoders,jt as dictionary,Ct as encoders,St as hash,j as hooks,kt as matchers,Lt as nodes,wt as root,Vt as server_loads}; diff --git a/apps/api/internal/webassets/dist/_app/immutable/nodes/0.DxH0fKNR.js b/apps/api/internal/webassets/dist/_app/immutable/nodes/0.BFe2mANj.js similarity index 100% rename from apps/api/internal/webassets/dist/_app/immutable/nodes/0.DxH0fKNR.js rename to apps/api/internal/webassets/dist/_app/immutable/nodes/0.BFe2mANj.js diff --git a/apps/api/internal/webassets/dist/_app/immutable/nodes/2.BgcMzLJ9.js b/apps/api/internal/webassets/dist/_app/immutable/nodes/2.Cen9dSYD.js similarity index 98% rename from apps/api/internal/webassets/dist/_app/immutable/nodes/2.BgcMzLJ9.js rename to apps/api/internal/webassets/dist/_app/immutable/nodes/2.Cen9dSYD.js index ff60c943..a6dfca50 100644 --- a/apps/api/internal/webassets/dist/_app/immutable/nodes/2.BgcMzLJ9.js +++ b/apps/api/internal/webassets/dist/_app/immutable/nodes/2.Cen9dSYD.js @@ -1,4 +1,4 @@ -import{a as d,f as y,c as K}from"../chunks/BQbSjbnU.js";import{i as N,h as q,s,e as $,a as B,C as J}from"../chunks/D6tJMEHh.js";import{p as V,G as X,H as Y,$ as Z,o as t,v as a,q as e,t as G,a as aa,I as M,n as ea}from"../chunks/Dtg1jxvd.js";import{i as ta}from"../chunks/BT2tP07K.js";import{s as w}from"../chunks/D2t05ipP.js";const sa=!0,ua=Object.freeze(Object.defineProperty({__proto__:null,prerender:sa},Symbol.toStringTag,{value:"Module"})),ca=new Set(["clickclack.chat","www.clickclack.chat"]);function ra(i){return ca.has(i.toLowerCase())?"https://app.clickclack.chat":"/app"}var ia=y(' ',1),na=y("

    "),oa=y(`

    Self-hostable chat. Serious tool. Mild brine.

    ClickClack

    A single-binary chat app for teams, communities, bots, and agents: +import{a as d,f as y,c as K}from"../chunks/BQbSjbnU.js";import{i as N,h as q,s,e as $,a as B,C as J}from"../chunks/C-yBSfLe.js";import{p as V,G as X,H as Y,$ as Z,o as t,v as a,q as e,t as G,a as aa,I as M,n as ea}from"../chunks/Dtg1jxvd.js";import{i as ta}from"../chunks/BT2tP07K.js";import{s as w}from"../chunks/D2t05ipP.js";const sa=!0,ua=Object.freeze(Object.defineProperty({__proto__:null,prerender:sa},Symbol.toStringTag,{value:"Module"})),ca=new Set(["clickclack.chat","www.clickclack.chat"]);function ra(i){return ca.has(i.toLowerCase())?"https://app.clickclack.chat":"/app"}var ia=y(' ',1),na=y("

    "),oa=y(`

    Self-hostable chat. Serious tool. Mild brine.

    ClickClack

    A single-binary chat app for teams, communities, bots, and agents: Slack-style threads, durable realtime, OpenAPI, SQLite, and a CLI that can drive the whole thing from a shell.

    What it is

    Chat infrastructure that stays boring when the socket drops.

    WebSocket is the pipe. The database is the truth. Every durable message, thread reply, reaction, and channel update can be recovered over HTTP with diff --git a/apps/api/internal/webassets/dist/_app/immutable/nodes/3.Beyl_vg6.js b/apps/api/internal/webassets/dist/_app/immutable/nodes/3.Beyl_vg6.js new file mode 100644 index 00000000..81a7ad7d --- /dev/null +++ b/apps/api/internal/webassets/dist/_app/immutable/nodes/3.Beyl_vg6.js @@ -0,0 +1 @@ +import"../chunks/BQbSjbnU.js";import{C as p}from"../chunks/C-yBSfLe.js";function m(o){p(o,{})}export{m as component}; diff --git a/apps/api/internal/webassets/dist/_app/immutable/nodes/3.DWWmaAg4.js b/apps/api/internal/webassets/dist/_app/immutable/nodes/3.DWWmaAg4.js deleted file mode 100644 index 09e4e1be..00000000 --- a/apps/api/internal/webassets/dist/_app/immutable/nodes/3.DWWmaAg4.js +++ /dev/null @@ -1 +0,0 @@ -import"../chunks/BQbSjbnU.js";import{C as p}from"../chunks/D6tJMEHh.js";function m(o){p(o,{})}export{m as component}; diff --git a/apps/api/internal/webassets/dist/_app/immutable/nodes/4.BRQUM5yE.js b/apps/api/internal/webassets/dist/_app/immutable/nodes/4.DdHYRc9K.js similarity index 71% rename from apps/api/internal/webassets/dist/_app/immutable/nodes/4.BRQUM5yE.js rename to apps/api/internal/webassets/dist/_app/immutable/nodes/4.DdHYRc9K.js index 618432bc..b563bf92 100644 --- a/apps/api/internal/webassets/dist/_app/immutable/nodes/4.BRQUM5yE.js +++ b/apps/api/internal/webassets/dist/_app/immutable/nodes/4.DdHYRc9K.js @@ -1 +1 @@ -import"../chunks/BQbSjbnU.js";import{p as r,a}from"../chunks/Dtg1jxvd.js";import{C as t}from"../chunks/D6tJMEHh.js";function n(o,p){r(p,!0),t(o,{get routeWorkspaceID(){return p.params.workspaceID}}),a()}export{n as component}; +import"../chunks/BQbSjbnU.js";import{p as r,a}from"../chunks/Dtg1jxvd.js";import{C as t}from"../chunks/C-yBSfLe.js";function n(o,p){r(p,!0),t(o,{get routeWorkspaceID(){return p.params.workspaceID}}),a()}export{n as component}; diff --git a/apps/api/internal/webassets/dist/_app/immutable/nodes/5.CW1aX1ge.js b/apps/api/internal/webassets/dist/_app/immutable/nodes/5.Bjf09aR3.js similarity index 76% rename from apps/api/internal/webassets/dist/_app/immutable/nodes/5.CW1aX1ge.js rename to apps/api/internal/webassets/dist/_app/immutable/nodes/5.Bjf09aR3.js index 52c56a26..b1fee47a 100644 --- a/apps/api/internal/webassets/dist/_app/immutable/nodes/5.CW1aX1ge.js +++ b/apps/api/internal/webassets/dist/_app/immutable/nodes/5.Bjf09aR3.js @@ -1 +1 @@ -import"../chunks/BQbSjbnU.js";import{p as a,a as e}from"../chunks/Dtg1jxvd.js";import{C as o}from"../chunks/D6tJMEHh.js";function u(t,r){a(r,!0),o(t,{get routeWorkspaceID(){return r.params.workspaceID},get routeTargetID(){return r.params.targetID}}),e()}export{u as component}; +import"../chunks/BQbSjbnU.js";import{p as a,a as e}from"../chunks/Dtg1jxvd.js";import{C as o}from"../chunks/C-yBSfLe.js";function u(t,r){a(r,!0),o(t,{get routeWorkspaceID(){return r.params.workspaceID},get routeTargetID(){return r.params.targetID}}),e()}export{u as component}; diff --git a/apps/api/internal/webassets/dist/index.html b/apps/api/internal/webassets/dist/index.html index 97e29a78..ebb3e1b2 100644 --- a/apps/api/internal/webassets/dist/index.html +++ b/apps/api/internal/webassets/dist/index.html @@ -9,17 +9,17 @@ - + - + - - + + - + @@ -35,7 +35,7 @@ Promise.all([ import("./_app/immutable/entry/start.DptDfE7f.js"), - import("./_app/immutable/entry/app.BOItyeok.js") + import("./_app/immutable/entry/app.Nt0q6qqN.js") ]).then(([kit, app]) => { kit.start(app, element); }); diff --git a/apps/api/internal/webassets/webassets.go b/apps/api/internal/webassets/webassets.go index e16b941d..db886f33 100644 --- a/apps/api/internal/webassets/webassets.go +++ b/apps/api/internal/webassets/webassets.go @@ -4,5 +4,11 @@ import "embed" // Dist is replaced by the root pnpm build script after the Svelte app builds. // -//go:embed dist/* +// The all: prefix is required so files whose names begin with "_" or "." +// are embedded too. SvelteKit/Rollup can emit chunk filenames with a leading +// underscore (e.g. _MajmMwB.js); without all: those are silently dropped from +// the binary and the server returns the SPA fallback HTML for them, which +// breaks module loading with a MIME-type error and a blank screen. +// +//go:embed all:dist var Dist embed.FS diff --git a/apps/web/src/ChatApp.svelte b/apps/web/src/ChatApp.svelte index a5753021..fa2b8d18 100644 --- a/apps/web/src/ChatApp.svelte +++ b/apps/web/src/ChatApp.svelte @@ -14,6 +14,7 @@ type MessageWindowDirection, } from "./lib/chat/messageWindow"; import { collectRecentPeople, dmTitle } from "./lib/chat/people"; + import { coalesceAgentActivity } from "./lib/chat/agent-activity"; import { redirectTypingToComposer, rememberTypeToFocusPointer } from "./lib/chat/typeToFocus"; import { connectRealtime, type RealtimeConnection } from "./lib/realtime.svelte"; import { notifyTyping, stopTyping } from "./lib/typing"; @@ -26,6 +27,7 @@ } from "./components/messages/MessageList.svelte"; import TypingIndicator, { TYPING_TTL_MS, type TypingEntry } from "./components/messages/TypingIndicator.svelte"; import AgentProgress, { AGENT_PROGRESS_TTL_MS, type AgentProgressTurn } from "./components/messages/AgentProgress.svelte"; + import AgentResponding from "./components/messages/AgentResponding.svelte"; import CreateChannelModal from "./components/navigation/CreateChannelModal.svelte"; import CreateDirectModal from "./components/navigation/CreateDirectModal.svelte"; import GuildRail from "./components/navigation/GuildRail.svelte"; @@ -42,6 +44,10 @@ const LAST_CHANNEL_STORAGE_PREFIX = "clickclack:last-channel:v1:"; const BROWSER_NOTIFICATIONS_STORAGE_PREFIX = "clickclack:browser-notifications-enabled:v1:"; const MOBILE_NAV_MEDIA_QUERY = "(max-width: 820px)"; + const SHOW_AGENT_ACTIVITY_STORAGE_KEY = "clickclack:show-agent-activity:v1"; + const HIDE_COMMENTARY_STORAGE_KEY = "clickclack:hide-commentary:v1"; + const HIDE_TOOL_CALLS_STORAGE_KEY = "clickclack:hide-tool-calls:v1"; + const USER_ALIGN_STORAGE_KEY = "clickclack:user-align:v1"; const appSessionStartedAt = Date.now(); export let routeWorkspaceID = ""; @@ -86,6 +92,17 @@ let browserNotificationPermission: NotificationPermission | "unsupported" = "default"; let profileStatus = ""; let profileStatusError = false; + // Client-only preferences for agent activity. Consecutive same-turn + // agent_commentary/agent_tool rows are coalesced into one preamble block; + // these two independent flags drop the commentary prose and/or the tool-call + // sub-items from that block. When both are set the block is omitted entirely. + // Default: show both. Persisted in localStorage like other client prefs. + let hideCommentary = false; + let hideToolCalls = false; + // Self-message alignment: "left" (default, matches the legacy layout) or + // "right". Persisted client-side and applied as a root data attribute so the + // messages.css mirror rules can flip the self group without prop drilling. + let userAlign: "left" | "right" = "left"; let status = "loading"; let authRequired = false; let connected = false; @@ -120,6 +137,8 @@ let typingSweeper: number | undefined; let agentProgressTurns: AgentProgressTurn[] = []; let agentProgressSweeper: number | undefined; + let activityClock = Date.now(); + let activityClockSweeper: number | undefined; let appliedRouteKey = ""; let routeApplySerial = 0; let hiddenDirectUndo: HiddenDirectUndo | null = null; @@ -165,6 +184,20 @@ $: activeUnreadSince = activeUnreadCount > 0 ? unreadSinceForKey(activeConversationKey, activeUnreadBoundarySeq, messageWindows) : ""; + // Coalesce consecutive same-turn agent activity rows into one preamble block + // per turn, applying the two visibility flags. Ordinary messages pass through + // untouched and keep their order. + $: visibleMessages = coalesceAgentActivity( + messages, + { hideCommentary, hideToolCalls }, + activityClock, + ); + // High-level "agent turn is live" signal: any tracked turn that still has an + // unfinalized line. Drives the compact AgentResponding status above the + // composer; clears as soon as every line finalizes or the turn is cleared. + $: agentResponding = agentProgressTurns.some((turn) => + turn.lines.some((line) => !line.finalized), + ); $: sidePanelOpen = selectedThread !== null || selectedProfile !== null; $: recentPeople = collectRecentPeople(messages, directConversations, user?.id || ""); $: mentionPeople = collectMentionPeople(user, recentPeople, moderationMembers, selectedDirect); @@ -182,6 +215,10 @@ : []; onMount(() => { + loadActivityPrefs(); + activityClockSweeper = window.setInterval(() => { + activityClock = Date.now(); + }, 30_000); syncBrowserNotificationState(); void boot(); const mobileNavMedia = window.matchMedia(MOBILE_NAV_MEDIA_QUERY); @@ -192,6 +229,59 @@ return () => mobileNavMedia.removeEventListener("change", handleMobileNavBreakpoint); }); + function loadActivityPrefs() { + try { + // New flags default off (both shown). Migrate the legacy single toggle: + // if the operator had previously hidden all activity, carry that forward + // as both flags hidden. + const legacyHidden = window.localStorage.getItem(SHOW_AGENT_ACTIVITY_STORAGE_KEY) === "0"; + hideCommentary = window.localStorage.getItem(HIDE_COMMENTARY_STORAGE_KEY) === "1" || legacyHidden; + hideToolCalls = window.localStorage.getItem(HIDE_TOOL_CALLS_STORAGE_KEY) === "1" || legacyHidden; + userAlign = window.localStorage.getItem(USER_ALIGN_STORAGE_KEY) === "right" ? "right" : "left"; + } catch { + hideCommentary = false; + hideToolCalls = false; + userAlign = "left"; + } + applyUserAlign(); + } + + function applyUserAlign() { + try { + document.documentElement.setAttribute("data-user-align", userAlign); + } catch { + // Non-DOM context (SSR/tests); the in-memory pref still applies on mount. + } + } + + function setUserAlign(value: "left" | "right") { + userAlign = value; + applyUserAlign(); + try { + window.localStorage.setItem(USER_ALIGN_STORAGE_KEY, value); + } catch { + // Ignore unavailable storage; the in-memory pref still applies this session. + } + } + + function setHideCommentary(value: boolean) { + hideCommentary = value; + try { + window.localStorage.setItem(HIDE_COMMENTARY_STORAGE_KEY, value ? "1" : "0"); + } catch { + // Ignore unavailable storage; the in-memory pref still applies this session. + } + } + + function setHideToolCalls(value: boolean) { + hideToolCalls = value; + try { + window.localStorage.setItem(HIDE_TOOL_CALLS_STORAGE_KEY, value ? "1" : "0"); + } catch { + // Ignore unavailable storage; the in-memory pref still applies this session. + } + } + onDestroy(() => { socket?.close(); socket = null; @@ -199,6 +289,7 @@ stopTyping(); if (typingSweeper) window.clearInterval(typingSweeper); if (agentProgressSweeper) window.clearInterval(agentProgressSweeper); + if (activityClockSweeper) window.clearInterval(activityClockSweeper); if (hiddenDirectUndoTimer) clearTimeout(hiddenDirectUndoTimer); }); @@ -1315,10 +1406,12 @@ function maybeShowBrowserNotification(event: RealtimeEvent, affectsActiveView: boolean) { if (event.type !== "message.created") return; + const payload = event.payload as Record; + const kind = typeof payload.kind === "string" ? payload.kind : ""; + if (kind === "agent_commentary" || kind === "agent_tool") return; if (!browserNotificationsEnabled) return; if (typeof Notification === "undefined" || Notification.permission !== "granted") return; if (document.visibilityState === "visible" && affectsActiveView) return; - const payload = event.payload as Record; const authorID = typeof payload.author_id === "string" ? payload.author_id : ""; if (authorID && authorID === user?.id) return; const { channelID, dmID } = messageEventScope(event); @@ -2146,6 +2239,10 @@ function handleUnreadBump(event: RealtimeEvent, activeWasAtBottom?: boolean) { const payload = event.payload as Record; + // Durable agent activity messages never bump unread counts, mirroring the + // server-side accounting (their rows are excluded from unread subqueries). + const kind = typeof payload.kind === "string" ? payload.kind : ""; + if (kind === "agent_commentary" || kind === "agent_tool") return; // Don't bump for own messages. const authorID = typeof payload.author_id === "string" ? payload.author_id : ""; if (authorID && authorID === user?.id) return; @@ -2586,7 +2683,7 @@ /> +

    + + (gifQuery = value)} onPickGif={pickGif} /> +
    diff --git a/apps/web/src/components/messages/PreambleBlock.svelte b/apps/web/src/components/messages/PreambleBlock.svelte new file mode 100644 index 00000000..bf413052 --- /dev/null +++ b/apps/web/src/components/messages/PreambleBlock.svelte @@ -0,0 +1,111 @@ + + +
    + + {#if preambleOpen} +
    + {#each resolved as entry (entry.item.id)} + {#if entry.item.type === "commentary"} +
    {@html markdown(entry.item.body)}
    + {:else if entry.tool} + {@const open = expandedTools[entry.item.id] === true} +
    + + {#if open} + {@const full = splitFull(entry.item.full)} +
    + {#if full.head} +
    {full.head}
    + {/if} + {#if full.text} +
    {@html markdown(full.text)}
    + {/if} +
    + {/if} +
    + {/if} + {/each} +
    + {/if} +
    diff --git a/apps/web/src/components/profile/ProfileSettingsModal.svelte b/apps/web/src/components/profile/ProfileSettingsModal.svelte index 86c162df..4d535a03 100644 --- a/apps/web/src/components/profile/ProfileSettingsModal.svelte +++ b/apps/web/src/components/profile/ProfileSettingsModal.svelte @@ -10,6 +10,9 @@ avatarURL: string; pushoverEnabled: boolean; pushoverUserKey: string; + hideCommentary: boolean; + hideToolCalls: boolean; + userAlign: "left" | "right"; browserNotificationsSupported: boolean; browserNotificationsEnabled: boolean; browserNotificationPermission: NotificationPermission | "unsupported"; @@ -20,6 +23,9 @@ onAvatarURL: (value: string) => void; onPushoverEnabled: (value: boolean) => void; onPushoverUserKey: (value: string) => void; + onHideCommentary: (value: boolean) => void; + onHideToolCalls: (value: boolean) => void; + onUserAlign: (value: "left" | "right") => void; onBrowserNotificationsEnabled: (value: boolean) => void; onClose: () => void; onSave: () => void; @@ -32,6 +38,9 @@ avatarURL, pushoverEnabled, pushoverUserKey, + hideCommentary, + hideToolCalls, + userAlign, browserNotificationsSupported, browserNotificationsEnabled, browserNotificationPermission, @@ -42,6 +51,9 @@ onAvatarURL, onPushoverEnabled, onPushoverUserKey, + onHideCommentary, + onHideToolCalls, + onUserAlign, onBrowserNotificationsEnabled, onClose, onSave, @@ -132,6 +144,33 @@ /> Pushover notifications + + +