diff --git a/apps/api/internal/httpapi/direct.go b/apps/api/internal/httpapi/direct.go index 0537f59e6..f7d468a91 100644 --- a/apps/api/internal/httpapi/direct.go +++ b/apps/api/internal/httpapi/direct.go @@ -129,18 +129,20 @@ func (s *Server) listDirectMessages(w http.ResponseWriter, r *http.Request) { } func (s *Server) createDirectMessage(w http.ResponseWriter, r *http.Request) { + w.Header().Set(store.QuestionCapabilityHeader, store.QuestionCapabilityHeaderValue) act, err := s.currentActor(r) if err != nil { writeError(w, http.StatusUnauthorized, err) return } var body struct { - Body string `json:"body"` - QuotedMessageID string `json:"quoted_message_id"` - Nonce string `json:"nonce"` - UploadID string `json:"upload_id"` - Kind string `json:"kind"` - TurnID string `json:"turn_id"` + Body string `json:"body"` + QuotedMessageID string `json:"quoted_message_id"` + Nonce string `json:"nonce"` + UploadID string `json:"upload_id"` + Kind string `json:"kind"` + TurnID string `json:"turn_id"` + Question *store.QuestionSpec `json:"question"` } if err := readJSON(w, r, &body); err != nil { writeError(w, http.StatusBadRequest, err) @@ -154,13 +156,16 @@ func (s *Server) createDirectMessage(w http.ResponseWriter, r *http.Request) { if !ok { return } + if !requireQuestionAuthor(w, act, body.Question, kind) { + return + } if !s.requireBotDirectWorkspace(w, r, act, chi.URLParam(r, "conversation_id")) { return } if !s.requireCreateUpload(w, r, act, body.UploadID, body.Nonce, "", 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, UploadID: body.UploadID, Kind: kind, TurnID: turnID}) + 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, UploadID: body.UploadID, Kind: kind, TurnID: turnID, Question: body.Question}) if err == nil && event.ID != "" { s.publishEvent(r.Context(), event) if !store.IsActivityMessageKind(message.Kind) { diff --git a/apps/api/internal/httpapi/messages.go b/apps/api/internal/httpapi/messages.go index e4b5e8868..e7ab337f8 100644 --- a/apps/api/internal/httpapi/messages.go +++ b/apps/api/internal/httpapi/messages.go @@ -42,6 +42,7 @@ func (s *Server) listMessages(w http.ResponseWriter, r *http.Request) { } func (s *Server) createMessage(w http.ResponseWriter, r *http.Request) { + w.Header().Set(store.QuestionCapabilityHeader, store.QuestionCapabilityHeaderValue) act, err := s.currentActor(r) if err != nil { writeError(w, http.StatusUnauthorized, err) @@ -52,13 +53,14 @@ func (s *Server) createMessage(w http.ResponseWriter, r *http.Request) { return } var body struct { - Body string `json:"body"` - QuotedMessageID string `json:"quoted_message_id"` - Nonce string `json:"nonce"` - TopicID string `json:"topic_id"` - UploadID string `json:"upload_id"` - Kind string `json:"kind"` - TurnID string `json:"turn_id"` + Body string `json:"body"` + QuotedMessageID string `json:"quoted_message_id"` + Nonce string `json:"nonce"` + TopicID string `json:"topic_id"` + UploadID string `json:"upload_id"` + Kind string `json:"kind"` + TurnID string `json:"turn_id"` + Question *store.QuestionSpec `json:"question"` } if err := readJSON(w, r, &body); err != nil { writeError(w, http.StatusBadRequest, err) @@ -68,13 +70,16 @@ func (s *Server) createMessage(w http.ResponseWriter, r *http.Request) { if !ok { return } + if !requireQuestionAuthor(w, act, body.Question, kind) { + return + } if !s.requireBotChannelWorkspace(w, r, act, chi.URLParam(r, "channel_id")) { return } if !s.requireCreateUpload(w, r, act, body.UploadID, body.Nonce, 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, UploadID: body.UploadID, Kind: kind, TurnID: turnID}) + 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, UploadID: body.UploadID, Kind: kind, TurnID: turnID, Question: body.Question}) if err == nil && event.ID != "" { s.publishEvent(r.Context(), event) if !store.IsActivityMessageKind(message.Kind) { @@ -245,6 +250,7 @@ func (s *Server) getThread(w http.ResponseWriter, r *http.Request) { } func (s *Server) createThreadReply(w http.ResponseWriter, r *http.Request) { + w.Header().Set(store.QuestionCapabilityHeader, store.QuestionCapabilityHeaderValue) act, err := s.currentActor(r) if err != nil { writeError(w, http.StatusUnauthorized, err) @@ -255,18 +261,22 @@ func (s *Server) createThreadReply(w http.ResponseWriter, r *http.Request) { return } var body struct { - Body string `json:"body"` - QuotedMessageID string `json:"quoted_message_id"` - Nonce string `json:"nonce"` + Body string `json:"body"` + QuotedMessageID string `json:"quoted_message_id"` + Nonce string `json:"nonce"` + Question *store.QuestionSpec `json:"question"` } if err := readJSON(w, r, &body); err != nil { writeError(w, http.StatusBadRequest, err) return } + if !requireQuestionAuthor(w, act, body.Question, "") { + return + } if _, ok := s.requireBotMessageResource(w, r, act, chi.URLParam(r, "message_id"), "dms:write"); !ok { return } - message, state, events, err := s.store.CreateThreadReply(r.Context(), store.CreateThreadReplyInput{RootMessageID: chi.URLParam(r, "message_id"), AuthorID: act.user.ID, Body: body.Body, QuotedMessageID: optionalString(body.QuotedMessageID), Nonce: body.Nonce}) + message, state, events, err := s.store.CreateThreadReply(r.Context(), store.CreateThreadReplyInput{RootMessageID: chi.URLParam(r, "message_id"), AuthorID: act.user.ID, Body: body.Body, QuotedMessageID: optionalString(body.QuotedMessageID), Nonce: body.Nonce, Question: body.Question}) if err == nil && len(events) > 0 { s.publishEvents(r.Context(), events) s.notifyMessageCreated(r.Context(), message, messageEventMentionedUserIDs(events)) diff --git a/apps/api/internal/httpapi/questions.go b/apps/api/internal/httpapi/questions.go new file mode 100644 index 000000000..ca4e278ae --- /dev/null +++ b/apps/api/internal/httpapi/questions.go @@ -0,0 +1,181 @@ +package httpapi + +import ( + "database/sql" + "errors" + "fmt" + "net/http" + "strconv" + "strings" + + "github.com/go-chi/chi/v5" + "github.com/openclaw/clickclack/apps/api/internal/store" +) + +// requireQuestionAuthor admits questions from bot tokens only; people answer them. +// Agent activity rows fold into progress blocks, so they cannot carry one. +func requireQuestionAuthor(w http.ResponseWriter, act actor, question *store.QuestionSpec, kind string) bool { + if question == nil { + return true + } + if act.botTokenID == "" { + writeError(w, http.StatusForbidden, errors.New("questions require a bot token")) + return false + } + if store.IsActivityMessageKind(kind) { + writeError(w, http.StatusBadRequest, errors.New("questions attach only to ordinary messages")) + return false + } + return true +} + +func (s *Server) answerQuestion(w http.ResponseWriter, r *http.Request) { + w.Header().Set(store.QuestionCapabilityHeader, store.QuestionCapabilityHeaderValue) + act, err := s.currentActor(r) + if err != nil { + writeError(w, http.StatusUnauthorized, err) + return + } + if act.botTokenID != "" { + writeError(w, http.StatusForbidden, errors.New("bot tokens cannot answer questions")) + return + } + if err := act.requireScope("messages:write"); err != nil { + writeError(w, http.StatusForbidden, err) + return + } + var body struct { + Answers map[string][]string `json:"answers"` + Skip bool `json:"skip"` + Nonce string `json:"nonce"` + ExpectedVersion *int64 `json:"expected_version"` + } + if err := readJSON(w, r, &body); err != nil { + writeError(w, http.StatusBadRequest, err) + return + } + if body.Skip && len(body.Answers) > 0 { + writeError(w, http.StatusBadRequest, errors.New("send answers or skip, not both")) + return + } + message, events, err := s.store.AnswerQuestion(r.Context(), store.AnswerQuestionInput{ + MessageID: chi.URLParam(r, "message_id"), + UserID: act.user.ID, + Answers: body.Answers, + Skip: body.Skip, + Nonce: body.Nonce, + ExpectedVersion: body.ExpectedVersion, + }) + if err != nil { + writeQuestionError(w, err) + return + } + s.publishEvents(r.Context(), events) + writeJSON(w, http.StatusOK, map[string]any{"message": message, "events": nonNilEvents(events)}) +} + +func (s *Server) resolveQuestion(w http.ResponseWriter, r *http.Request) { + act, err := s.currentActor(r) + if err != nil { + writeError(w, http.StatusUnauthorized, err) + return + } + if act.botTokenID == "" { + writeError(w, http.StatusForbidden, errors.New("only the bot that asked a question can resolve it")) + return + } + if err := act.requireScope("messages:write"); err != nil { + writeError(w, http.StatusForbidden, err) + return + } + var body struct { + Status string `json:"status"` + Note string `json:"note"` + Answers map[string][]string `json:"answers"` + ExpectedVersion *int64 `json:"expected_version"` + } + if err := readJSON(w, r, &body); err != nil { + writeError(w, http.StatusBadRequest, err) + return + } + if _, ok := s.requireBotMessageResource(w, r, act, chi.URLParam(r, "message_id"), "dms:write"); !ok { + return + } + message, event, err := s.store.ResolveQuestion(r.Context(), store.ResolveQuestionInput{ + MessageID: chi.URLParam(r, "message_id"), + BotUserID: act.user.ID, + Status: body.Status, + Note: body.Note, + Answers: body.Answers, + ExpectedVersion: body.ExpectedVersion, + }) + if err != nil { + writeQuestionError(w, err) + return + } + response := map[string]any{"message": message} + if event.ID != "" { + s.publishEvent(r.Context(), event) + response["event"] = event + } + writeJSON(w, http.StatusOK, response) +} + +func (s *Server) listBotQuestions(w http.ResponseWriter, r *http.Request) { + act, err := s.currentActor(r) + if err != nil { + writeError(w, http.StatusUnauthorized, err) + return + } + if act.botTokenID == "" { + writeError(w, http.StatusForbidden, errors.New("bot tokens only")) + return + } + if err := act.requireScope("messages:read"); err != nil { + writeError(w, http.StatusForbidden, err) + return + } + limit := 100 + if raw := strings.TrimSpace(r.URL.Query().Get("limit")); raw != "" { + parsed, err := strconv.Atoi(raw) + if err != nil || parsed < 1 || parsed > store.MaxBotQuestionPageSize { + writeError(w, http.StatusBadRequest, fmt.Errorf("limit must be between 1 and %d", store.MaxBotQuestionPageSize)) + return + } + limit = parsed + } + // Direct-message questions stay behind the same scope as direct messages. + includeDirect := act.requireScope("dms:read") == nil + questions, err := s.store.ListBotUnresolvedQuestions(r.Context(), act.workspaceID, act.user.ID, strings.TrimSpace(r.URL.Query().Get("after")), includeDirect, limit+1) + if err != nil { + writeStoreError(w, err) + return + } + var next *string + if len(questions) > limit { + questions = questions[:limit] + cursor := questions[limit-1].MessageID + next = &cursor + } + writeJSON(w, http.StatusOK, map[string]any{"questions": questions, "next_cursor": next}) +} + +func writeQuestionError(w http.ResponseWriter, err error) { + switch { + case errors.Is(err, sql.ErrNoRows): + writeError(w, http.StatusNotFound, errors.New("question not found")) + case errors.Is(err, store.ErrQuestionClosed), errors.Is(err, store.ErrQuestionConflict): + writeError(w, http.StatusConflict, err) + case errors.Is(err, store.ErrQuestionResponderRequired), errors.Is(err, store.ErrQuestionAuthorRequired): + writeError(w, http.StatusForbidden, err) + default: + writeStoreError(w, err) + } +} + +func nonNilEvents(events []store.Event) []store.Event { + if events == nil { + return []store.Event{} + } + return events +} diff --git a/apps/api/internal/httpapi/questions_test.go b/apps/api/internal/httpapi/questions_test.go new file mode 100644 index 000000000..306519693 --- /dev/null +++ b/apps/api/internal/httpapi/questions_test.go @@ -0,0 +1,270 @@ +package httpapi + +import ( + "bytes" + "context" + "encoding/json" + "fmt" + "net/http" + "net/http/httptest" + "path/filepath" + "strings" + "testing" + "time" + + "github.com/coder/websocket" + "github.com/openclaw/clickclack/apps/api/internal/realtime" + "github.com/openclaw/clickclack/apps/api/internal/store" +) + +func TestQuestionHTTPLifecycle(t *testing.T) { + t.Parallel() + ctx := context.Background() + st := newEmptyHTTPStore(t) + owner, err := st.EnsureBootstrap(ctx, "Owner", "question-http-owner@example.com") + if err != nil { + t.Fatal(err) + } + workspaces, err := st.ListWorkspaces(ctx, owner.ID) + if err != nil { + t.Fatal(err) + } + workspace := workspaces[0] + channels, err := st.ListChannels(ctx, workspace.ID, owner.ID) + if err != nil { + t.Fatal(err) + } + member, err := st.CreateUser(ctx, store.CreateUserInput{DisplayName: "Member", Email: "question-http-member@example.com"}) + if err != nil { + t.Fatal(err) + } + if err := st.AddWorkspaceMember(ctx, workspace.ID, member.ID, store.WorkspaceRoleMember); err != nil { + t.Fatal(err) + } + _, botToken, err := st.CreateBot(ctx, store.CreateBotInput{WorkspaceID: workspace.ID, DisplayName: "Asker", Scopes: []string{"bot:write"}, CreatedBy: owner.ID}) + if err != nil { + t.Fatal(err) + } + _, otherToken, err := st.CreateBot(ctx, store.CreateBotInput{WorkspaceID: workspace.ID, DisplayName: "Other", Scopes: []string{"bot:write"}, CreatedBy: owner.ID}) + if err != nil { + t.Fatal(err) + } + server := httptest.NewServer(New(st, realtime.NewHub(), Options{UploadDir: filepath.Join(t.TempDir(), "uploads")}).Handler()) + t.Cleanup(server.Close) + + question := map[string]any{ + "external_id": "ask_http", + "expires_at": time.Now().Add(10 * time.Minute).UTC().Format(time.RFC3339), + "responder_user_ids": []string{member.ID}, + "items": []map[string]any{ + {"id": "ship_date", "header": "Fecha", "prompt": "¿Qué día?", "options": []map[string]string{{"label": "Lun 15 sep"}, {"label": "Mar 16 sep"}}}, + }, + } + messagesURL := server.URL + "/api/channels/" + channels[0].ID + "/messages" + expectStatusAsUser(t, owner.ID, http.MethodPost, messagesURL, strings.NewReader(`{"body":"human question","question":{"expires_at":"2099-01-01T00:00:00Z","items":[]}}`), http.StatusForbidden) + invalid, status := requestJSONWithBearerStatus[map[string]any](t, botToken.Token, http.MethodPost, messagesURL, map[string]any{"body": "empty", "question": map[string]any{"expires_at": question["expires_at"], "items": []any{}}}) + if status != http.StatusBadRequest || !strings.Contains(invalid["error"].(string), "invalid question") { + t.Fatalf("invalid question status=%d body=%#v", status, invalid) + } + + created, status, headers := requestJSONWithBearerHeaders[struct { + Message store.Message `json:"message"` + }](t, botToken.Token, http.MethodPost, messagesURL, map[string]any{"body": "Agent needs input: ¿Qué día?", "question": question}) + if status != http.StatusCreated || headers.Get(store.QuestionCapabilityHeader) != store.QuestionCapabilityHeaderValue { + t.Fatalf("create status=%d capability=%q", status, headers.Get(store.QuestionCapabilityHeader)) + } + if created.Message.Question == nil || created.Message.Question.Status != store.QuestionStatusOpen { + t.Fatalf("created message question = %#v", created.Message.Question) + } + answersURL := server.URL + "/api/messages/" + created.Message.ID + "/question/answers" + resolutionURL := server.URL + "/api/messages/" + created.Message.ID + "/question/resolution" + + botConn := dialRealtimeWithBotToken(t, server.URL, workspace.ID, botToken.Token) + t.Cleanup(func() { _ = botConn.Close(websocket.StatusNormalClosure, "done") }) + readEventType(t, botConn, "message.created") + + answer := `{"answers":{"ship_date":["Mar 16 sep"]},"nonce":"http-answer"}` + expectStatusWithBearer(t, botToken.Token, http.MethodPost, answersURL, strings.NewReader(answer), http.StatusForbidden) + expectStatusAsUser(t, owner.ID, http.MethodPost, answersURL, strings.NewReader(answer), http.StatusForbidden) + expectStatusAsUser(t, member.ID, http.MethodPost, answersURL, strings.NewReader(`{"answers":{"ship_date":["Mar 16 sep"]},"skip":true}`), http.StatusBadRequest) + expectStatusAsUser(t, member.ID, http.MethodPost, answersURL, strings.NewReader(`{"answers":{"ship_date":["Mar 16 sep"]},"nonce":"stale-view","expected_version":9}`), http.StatusConflict) + answered := postJSONAsUser[struct { + Message store.Message `json:"message"` + Events []store.Event `json:"events"` + }](t, member.ID, answersURL, map[string]any{"answers": map[string][]string{"ship_date": {"Mar 16 sep"}}, "nonce": "http-answer"}) + if answered.Message.Question.Status != store.QuestionStatusSubmitted || len(answered.Events) != 2 { + t.Fatalf("answer response = %#v", answered) + } + submitted := readEventType(t, botConn, "question.submitted") + if payload := submitted.Payload.(map[string]any); payload["message_id"] != created.Message.ID || payload["responder_id"] != member.ID || payload["answers"] != nil { + t.Fatalf("question.submitted payload = %#v", submitted.Payload) + } + expectStatusAsUser(t, member.ID, http.MethodPost, answersURL, strings.NewReader(`{"answers":{"ship_date":["Lun 15 sep"]},"nonce":"late"}`), http.StatusConflict) + + expectStatusWithBearer(t, otherToken.Token, http.MethodPost, resolutionURL, strings.NewReader(`{"status":"answered"}`), http.StatusForbidden) + expectStatusAsUser(t, owner.ID, http.MethodPost, resolutionURL, strings.NewReader(`{"status":"answered"}`), http.StatusForbidden) + expectStatusWithBearer(t, botToken.Token, http.MethodPost, resolutionURL, strings.NewReader(`{"status":"answered","expected_version":1}`), http.StatusConflict) + resolved, status := requestJSONWithBearerStatus[struct { + Message store.Message `json:"message"` + Event *store.Event `json:"event"` + }](t, botToken.Token, http.MethodPost, resolutionURL, map[string]any{"status": "answered", "expected_version": 2}) + if status != http.StatusOK || resolved.Message.Question.Status != store.QuestionStatusAnswered || resolved.Event == nil { + t.Fatalf("resolution status=%d body=%#v", status, resolved) + } + repeated, status := requestJSONWithBearerStatus[struct { + Event *store.Event `json:"event"` + }](t, botToken.Token, http.MethodPost, resolutionURL, map[string]any{"status": "answered"}) + if status != http.StatusOK || repeated.Event != nil { + t.Fatalf("repeated resolution status=%d body=%#v", status, repeated) + } + + pending, status := requestJSONWithBearerStatus[struct { + Message store.Message `json:"message"` + }](t, botToken.Token, http.MethodPost, messagesURL, map[string]any{"body": "still waiting", "question": question}) + if status != http.StatusCreated { + t.Fatalf("second question status=%d", status) + } + latest, status := requestJSONWithBearerStatus[struct { + Message store.Message `json:"message"` + }](t, botToken.Token, http.MethodPost, messagesURL, map[string]any{"body": "one more", "question": question}) + if status != http.StatusCreated { + t.Fatalf("third question status=%d", status) + } + type questionPage struct { + Questions []store.BotQuestion `json:"questions"` + NextCursor *string `json:"next_cursor"` + } + listURL := server.URL + "/api/bots/self/questions" + firstPage, status := getJSONWithBearerStatus[questionPage](t, botToken.Token, listURL+"?limit=1") + if status != http.StatusOK || len(firstPage.Questions) != 1 || firstPage.Questions[0].MessageID != pending.Message.ID || firstPage.NextCursor == nil || *firstPage.NextCursor != pending.Message.ID { + t.Fatalf("first unresolved page status=%d body=%#v", status, firstPage) + } + secondPage, status := getJSONWithBearerStatus[questionPage](t, botToken.Token, listURL+"?limit=1&after="+*firstPage.NextCursor) + if status != http.StatusOK || len(secondPage.Questions) != 1 || secondPage.Questions[0].MessageID != latest.Message.ID || secondPage.NextCursor != nil { + t.Fatalf("second unresolved page status=%d body=%#v", status, secondPage) + } + expectStatusWithBearer(t, botToken.Token, http.MethodGet, listURL+"?limit=0", nil, http.StatusBadRequest) + expectStatusAsUser(t, owner.ID, http.MethodGet, server.URL+"/api/bots/self/questions", nil, http.StatusForbidden) + expectStatusAsUser(t, member.ID, http.MethodPost, server.URL+"/api/messages/msg_missing/question/answers", strings.NewReader(`{"skip":true}`), http.StatusNotFound) +} + +func TestBotQuestionListingKeepsDirectScopesAndPages(t *testing.T) { + t.Parallel() + ctx := context.Background() + st := newEmptyHTTPStore(t) + owner, err := st.EnsureBootstrap(ctx, "Owner", "question-list-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) + } + member, err := st.CreateUser(ctx, store.CreateUserInput{DisplayName: "Member", Email: "question-list-member@example.com"}) + if err != nil { + t.Fatal(err) + } + if err := st.AddWorkspaceMember(ctx, workspace.ID, member.ID, store.WorkspaceRoleMember); err != nil { + t.Fatal(err) + } + bot, fullToken, err := st.CreateBot(ctx, store.CreateBotInput{WorkspaceID: workspace.ID, DisplayName: "Asker", Scopes: []string{"bot:write"}, CreatedBy: owner.ID}) + if err != nil { + t.Fatal(err) + } + readOnlyToken, err := st.CreateBotToken(ctx, store.CreateBotTokenInput{WorkspaceID: workspace.ID, BotUserID: bot.ID, Name: "read only", Scopes: []string{"messages:read"}, CreatedBy: owner.ID}) + if err != nil { + t.Fatal(err) + } + activityToken, err := st.CreateBotToken(ctx, store.CreateBotTokenInput{WorkspaceID: workspace.ID, BotUserID: bot.ID, Name: "activity", Scopes: []string{"bot:write", store.AgentActivityWriteScope}, CreatedBy: owner.ID}) + if err != nil { + t.Fatal(err) + } + server := httptest.NewServer(New(st, realtime.NewHub(), Options{UploadDir: filepath.Join(t.TempDir(), "uploads")}).Handler()) + t.Cleanup(server.Close) + + spec := func() *store.QuestionSpec { + return &store.QuestionSpec{ + ExpiresAt: time.Now().Add(10 * time.Minute).UTC().Format(time.RFC3339), + Items: []store.QuestionItem{{ID: "ok", Header: "OK", Prompt: "Proceed?", Options: []store.QuestionOption{{Label: "Yes"}, {Label: "No"}}}}, + } + } + conversation, err := st.CreateDirectConversation(ctx, store.CreateDirectConversationInput{WorkspaceID: workspace.ID, UserID: bot.ID, MemberIDs: []string{member.ID}}) + if err != nil { + t.Fatal(err) + } + direct, _, err := st.CreateDirectMessage(ctx, store.CreateDirectMessageInput{ConversationID: conversation.ID, AuthorID: bot.ID, Body: "private question", Question: spec()}) + if err != nil { + t.Fatal(err) + } + for index := range store.MaxBotQuestionPageSize { + if _, _, err := st.CreateMessage(ctx, store.CreateMessageInput{ChannelID: channels[0].ID, AuthorID: bot.ID, Body: fmt.Sprintf("question %d", index), Question: spec()}); err != nil { + t.Fatal(err) + } + } + + type page struct { + Questions []store.BotQuestion `json:"questions"` + NextCursor *string `json:"next_cursor"` + } + listURL := server.URL + "/api/bots/self/questions?limit=" + fmt.Sprint(store.MaxBotQuestionPageSize) + first, status := getJSONWithBearerStatus[page](t, fullToken.Token, listURL) + if status != http.StatusOK || len(first.Questions) != store.MaxBotQuestionPageSize || first.NextCursor == nil { + t.Fatalf("full page status=%d questions=%d next=%v", status, len(first.Questions), first.NextCursor) + } + second, status := getJSONWithBearerStatus[page](t, fullToken.Token, listURL+"&after="+*first.NextCursor) + if status != http.StatusOK || len(second.Questions) != 1 || second.NextCursor != nil { + t.Fatalf("remainder status=%d questions=%d next=%v", status, len(second.Questions), second.NextCursor) + } + seenDirect := false + for _, question := range append(first.Questions, second.Questions...) { + seenDirect = seenDirect || question.MessageID == direct.ID + } + if !seenDirect { + t.Fatal("a token with dms:read must reconcile direct-message questions") + } + restricted, status := getJSONWithBearerStatus[page](t, readOnlyToken.Token, listURL) + if status != http.StatusOK || len(restricted.Questions) != store.MaxBotQuestionPageSize || restricted.NextCursor != nil { + t.Fatalf("read-only status=%d questions=%d next=%v", status, len(restricted.Questions), restricted.NextCursor) + } + for _, question := range restricted.Questions { + if question.DirectConversationID != "" { + t.Fatalf("a token without dms:read received direct question %#v", question) + } + } + if _, err := st.RevokeBotToken(ctx, readOnlyToken.ID, owner.ID); err != nil { + t.Fatal(err) + } + expectStatusWithBearer(t, readOnlyToken.Token, http.MethodGet, listURL, nil, http.StatusUnauthorized) + + activity := fmt.Sprintf(`{"body":"running","kind":"agent_tool","turn_id":"turn_question","question":{"expires_at":%q,"items":[{"id":"ok","header":"OK","prompt":"Proceed?"}]}}`, time.Now().Add(10*time.Minute).UTC().Format(time.RFC3339)) + expectStatusWithBearer(t, activityToken.Token, http.MethodPost, server.URL+"/api/channels/"+channels[0].ID+"/messages", strings.NewReader(activity), http.StatusBadRequest) +} + +func requestJSONWithBearerHeaders[T any](t *testing.T, token, method, endpoint string, body any) (T, int, http.Header) { + t.Helper() + encoded, err := json.Marshal(body) + if err != nil { + t.Fatal(err) + } + req, err := http.NewRequest(method, endpoint, bytes.NewReader(encoded)) + if err != nil { + t.Fatal(err) + } + req.Header.Set("Authorization", "Bearer "+token) + req.Header.Set("Content-Type", "application/json") + resp, err := http.DefaultClient.Do(req) + if err != nil { + t.Fatal(err) + } + defer resp.Body.Close() + var out T + if err := json.NewDecoder(resp.Body).Decode(&out); err != nil { + t.Fatalf("%s %s: decode response: %v", method, endpoint, err) + } + return out, resp.StatusCode, resp.Header +} diff --git a/apps/api/internal/httpapi/server.go b/apps/api/internal/httpapi/server.go index 6f1ac2f86..e687ce5db 100644 --- a/apps/api/internal/httpapi/server.go +++ b/apps/api/internal/httpapi/server.go @@ -211,6 +211,7 @@ func (s *Server) Handler() http.Handler { r.Post("/workspaces/{workspace_id}/bots/{bot_user_id}/setup-codes", s.createWorkspaceBotSetupCode) r.Post("/bot-setup-codes/claim", s.claimBotSetupCode) r.Put("/bots/self/commands", s.setBotCommands) + r.Get("/bots/self/questions", s.listBotQuestions) r.Delete("/bots/{bot_user_id}", s.deleteBot) r.Get("/bots/{bot_user_id}/tokens", s.listBotTokens) r.Post("/bots/{bot_user_id}/tokens", s.createBotToken) @@ -247,6 +248,8 @@ func (s *Server) Handler() http.Handler { r.Post("/messages/{message_id}/route", s.ensureMessageRoute) r.Get("/messages/{message_id}/thread", s.getThread) r.Post("/messages/{message_id}/thread/replies", s.createThreadReply) + r.Post("/messages/{message_id}/question/answers", s.answerQuestion) + r.Post("/messages/{message_id}/question/resolution", s.resolveQuestion) r.Post("/messages/{message_id}/reactions", s.addReaction) r.Delete("/messages/{message_id}/reactions/{emoji}", s.removeReaction) r.Get("/realtime/events", s.listEvents) diff --git a/apps/api/internal/store/events.go b/apps/api/internal/store/events.go index 4cc338356..f3fe3c331 100644 --- a/apps/api/internal/store/events.go +++ b/apps/api/internal/store/events.go @@ -15,6 +15,7 @@ var DurableEventTypes = []string{ "message.updated", "pin.added", "pin.removed", + "question.submitted", "reaction.added", "reaction.removed", "thread.reply_created", diff --git a/apps/api/internal/store/postgres/dms.go b/apps/api/internal/store/postgres/dms.go index 7fa602e4f..044d5fc14 100644 --- a/apps/api/internal/store/postgres/dms.go +++ b/apps/api/internal/store/postgres/dms.go @@ -234,6 +234,10 @@ func (s *Store) CreateDirectMessage(ctx context.Context, input store.CreateDirec if err := requireDirectActivePeerTx(ctx, tx, input.ConversationID, input.AuthorID); err != nil { return store.Message{}, store.Event{}, err } + question, err := prepareQuestion(input.Question) + if err != nil { + return store.Message{}, store.Event{}, err + } if err := lockMessageSequenceTx(ctx, tx, "direct", input.ConversationID); err != nil { return store.Message{}, store.Event{}, err } @@ -263,11 +267,19 @@ func (s *Store) CreateDirectMessage(ctx context.Context, input store.CreateDirec 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 } + if matches, err := questionReplayMatchesTx(ctx, tx, existing.ID, question); err != nil { + return store.Message{}, store.Event{}, err + } else if !matches { + return store.Message{}, store.Event{}, store.ErrClientNonceConflict + } existing, err = hydrateMessageCreateReplay(ctx, tx, existing, input.UploadID) return existing, store.Event{}, err } else if !errors.Is(err, sql.ErrNoRows) { return store.Message{}, store.Event{}, err } + if err := validateNewQuestionTx(ctx, tx, workspaceID, "", input.ConversationID, kind, question); err != nil { + return store.Message{}, store.Event{}, err + } if quotedID != "" { snap, authorID, err := resolveQuoteRefTx(ctx, tx, quotedID, quoteScope{kind: "dm", directConversationID: input.ConversationID}) if err != nil { @@ -314,6 +326,10 @@ func (s *Store) CreateDirectMessage(ctx context.Context, input store.CreateDirec } attachedUpload = &upload } + createdQuestion, err := insertMessageQuestionTx(ctx, tx, id, workspaceID, input.AuthorID, createdAt, question) + if err != nil { + return store.Message{}, store.Event{}, err + } if err := qtx.UnhideDirectConversationForMembers(ctx, input.ConversationID); err != nil { return store.Message{}, store.Event{}, err } @@ -328,7 +344,7 @@ func (s *Store) CreateDirectMessage(ctx context.Context, input store.CreateDirec if input.TurnID != "" { dmEventFields["turn_id"] = input.TurnID } - event, err := insertEventWithRecipients(ctx, tx, workspaceID, "", "message.created", &seq, eventPayload(ctx, dmEventFields, nonce), recipients) + event, err := insertEventWithRecipientsAndMentions(ctx, tx, workspaceID, "", "message.created", &seq, eventPayload(ctx, dmEventFields, nonce), recipients, mergeMentionedUserIDs(nil, question)) if err != nil { return store.Message{}, store.Event{}, err } @@ -339,6 +355,7 @@ func (s *Store) CreateDirectMessage(ctx context.Context, input store.CreateDirec if attachedUpload != nil { msg.Attachments = []store.Upload{*attachedUpload} } + msg.Question = createdQuestion return msg, event, tx.Commit() } diff --git a/apps/api/internal/store/postgres/message_pages.go b/apps/api/internal/store/postgres/message_pages.go index 99d6781a1..b1c1a1675 100644 --- a/apps/api/internal/store/postgres/message_pages.go +++ b/apps/api/internal/store/postgres/message_pages.go @@ -81,6 +81,10 @@ func (s *Store) listMessagePage(ctx context.Context, scope messagePageScope, req if err != nil { return store.MessagePage{}, err } + messages, err = s.hydrateQuestions(ctx, messages) + if err != nil { + return store.MessagePage{}, err + } messages, err = s.hydrateThreadStates(ctx, messages) if err != nil { return store.MessagePage{}, err diff --git a/apps/api/internal/store/postgres/migrations/0036_message_questions.sql b/apps/api/internal/store/postgres/migrations/0036_message_questions.sql new file mode 100644 index 000000000..55378ce91 --- /dev/null +++ b/apps/api/internal/store/postgres/migrations/0036_message_questions.sql @@ -0,0 +1,28 @@ +-- Structured questions that bots attach to their messages. The question itself +-- is immutable; the first valid answer and the bot's recorded outcome live on +-- the same row so each transition is one conditional update. +CREATE TABLE IF NOT EXISTS message_questions ( + message_id TEXT PRIMARY KEY REFERENCES messages(id) ON DELETE CASCADE, + workspace_id TEXT NOT NULL REFERENCES workspaces(id) ON DELETE CASCADE, + bot_user_id TEXT NOT NULL REFERENCES users(id), + external_id TEXT NOT NULL DEFAULT '', + spec_json TEXT NOT NULL, + responder_user_ids TEXT NOT NULL DEFAULT '[]', + allow_skip BIGINT NOT NULL DEFAULT 1 CHECK (allow_skip IN (0, 1)), + expires_at TEXT NOT NULL, + status TEXT NOT NULL DEFAULT 'open' + CHECK (status IN ('open', 'submitted', 'answered', 'cancelled', 'expired', 'failed')), + response_json TEXT NOT NULL DEFAULT '', + response_source TEXT NOT NULL DEFAULT '', + responded_by TEXT REFERENCES users(id) ON DELETE SET NULL, + responded_at TEXT, + response_nonce TEXT NOT NULL DEFAULT '', + note TEXT NOT NULL DEFAULT '', + resolved_at TEXT, + version BIGINT NOT NULL DEFAULT 1, + created_at TEXT NOT NULL, + updated_at TEXT NOT NULL +); + +CREATE INDEX IF NOT EXISTS idx_message_questions_bot_status + ON message_questions(workspace_id, bot_user_id, status, message_id); diff --git a/apps/api/internal/store/postgres/pins.go b/apps/api/internal/store/postgres/pins.go index 29f14b1ad..bba7ab709 100644 --- a/apps/api/internal/store/postgres/pins.go +++ b/apps/api/internal/store/postgres/pins.go @@ -160,6 +160,10 @@ func (s *Store) ListPinnedMessages(ctx context.Context, channelID, userID string if err != nil { return nil, err } + messages, err = s.hydrateQuestions(ctx, messages) + if err != nil { + return nil, err + } messages, err = s.hydrateReactions(ctx, userID, messages) if err != nil { return nil, err diff --git a/apps/api/internal/store/postgres/postgres.go b/apps/api/internal/store/postgres/postgres.go index 2ec10f881..a58cd3e5c 100644 --- a/apps/api/internal/store/postgres/postgres.go +++ b/apps/api/internal/store/postgres/postgres.go @@ -595,6 +595,10 @@ func (s *Store) GetMessage(ctx context.Context, messageID, userID string) (store if err != nil { return store.Message{}, err } + messages, err = s.hydrateQuestions(ctx, messages) + if err != nil { + return store.Message{}, err + } return messages[0], nil } @@ -647,6 +651,10 @@ func (s *Store) CreateMessage(ctx context.Context, input store.CreateMessageInpu if err := requireTopicTx(ctx, tx, workspaceID, input.ChannelID, input.TopicID); err != nil { return store.Message{}, store.Event{}, err } + question, err := prepareQuestion(input.Question) + if err != nil { + return store.Message{}, store.Event{}, err + } if err := lockMessageSequenceTx(ctx, tx, "channel", input.ChannelID); err != nil { return store.Message{}, store.Event{}, err } @@ -676,6 +684,11 @@ func (s *Store) CreateMessage(ctx context.Context, input store.CreateMessageInpu 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 matches, err := questionReplayMatchesTx(ctx, tx, existing.ID, question); err != nil { + return store.Message{}, store.Event{}, err + } else if !matches { + return store.Message{}, store.Event{}, store.ErrClientNonceConflict + } if err := requireMessageAccessTx(ctx, tx, existing, input.AuthorID); err != nil { return store.Message{}, store.Event{}, err } @@ -684,6 +697,9 @@ func (s *Store) CreateMessage(ctx context.Context, input store.CreateMessageInpu } else if !errors.Is(err, sql.ErrNoRows) { return store.Message{}, store.Event{}, err } + if err := validateNewQuestionTx(ctx, tx, workspaceID, input.ChannelID, "", kind, question); err != nil { + return store.Message{}, store.Event{}, err + } if err := requireCanPostTx(ctx, tx, workspaceID, input.ChannelID, input.AuthorID); err != nil { return store.Message{}, store.Event{}, err } @@ -737,6 +753,10 @@ func (s *Store) CreateMessage(ctx context.Context, input store.CreateMessageInpu } attachedUpload = &upload } + createdQuestion, err := insertMessageQuestionTx(ctx, tx, id, workspaceID, input.AuthorID, createdAt, question) + if err != nil { + return store.Message{}, store.Event{}, err + } eventFields := map[string]string{"message_id": id, "author_id": input.AuthorID} if input.TopicID != "" { eventFields["topic_id"] = input.TopicID @@ -751,6 +771,7 @@ func (s *Store) CreateMessage(ctx context.Context, input store.CreateMessageInpu if err != nil { return store.Message{}, store.Event{}, err } + mentionedIDs = mergeMentionedUserIDs(mentionedIDs, question) event, err := insertEventWithRecipientsAndMentions(ctx, tx, workspaceID, input.ChannelID, "message.created", &seq, eventPayload(ctx, eventFields, nonce), nil, mentionedIDs) if err != nil { return store.Message{}, store.Event{}, err @@ -762,6 +783,7 @@ func (s *Store) CreateMessage(ctx context.Context, input store.CreateMessageInpu if attachedUpload != nil { msg.Attachments = []store.Upload{*attachedUpload} } + msg.Question = createdQuestion return msg, event, tx.Commit() } @@ -786,6 +808,10 @@ func (s *Store) CreateThreadReply(ctx context.Context, input store.CreateThreadR if err != nil { return store.Message{}, store.ThreadState{}, nil, err } + question, err := prepareQuestion(input.Question) + if err != nil { + return store.Message{}, store.ThreadState{}, nil, err + } if err := lockMessageSequenceTx(ctx, tx, "thread", root.ID); err != nil { return store.Message{}, store.ThreadState{}, nil, err } @@ -811,6 +837,16 @@ func (s *Store) CreateThreadReply(ctx context.Context, input store.CreateThreadR if existing.ThreadRootID != root.ID || existing.ParentMessageID == nil || *existing.ParentMessageID != root.ID || existing.Body != body || !sameQuotedMessageID(existing, quotedID) { return store.Message{}, store.ThreadState{}, nil, store.ErrClientNonceConflict } + if matches, err := questionReplayMatchesTx(ctx, tx, existing.ID, question); err != nil { + return store.Message{}, store.ThreadState{}, nil, err + } else if !matches { + return store.Message{}, store.ThreadState{}, nil, store.ErrClientNonceConflict + } + if hydrated, err := hydrateQuestions(ctx, tx, []store.Message{existing}); err != nil { + return store.Message{}, store.ThreadState{}, nil, err + } else { + existing = hydrated[0] + } stateRow, err := qtx.GetThreadState(ctx, root.ID) if err != nil { return store.Message{}, store.ThreadState{}, nil, err @@ -819,6 +855,9 @@ func (s *Store) CreateThreadReply(ctx context.Context, input store.CreateThreadR } else if !errors.Is(err, sql.ErrNoRows) { return store.Message{}, store.ThreadState{}, nil, err } + if err := validateNewQuestionTx(ctx, tx, root.WorkspaceID, root.ChannelID, root.DirectConversationID, "", question); err != nil { + return store.Message{}, store.ThreadState{}, nil, err + } if root.DirectConversationID != "" { if err := requireCanSendDirectTx(ctx, tx, root.WorkspaceID, input.AuthorID); err != nil { return store.Message{}, store.ThreadState{}, nil, err @@ -876,6 +915,10 @@ func (s *Store) CreateThreadReply(ctx context.Context, input store.CreateThreadR if err != nil { return store.Message{}, store.ThreadState{}, nil, err } + createdQuestion, err := insertMessageQuestionTx(ctx, tx, id, root.WorkspaceID, input.AuthorID, createdAt, question) + if err != nil { + return store.Message{}, store.ThreadState{}, nil, err + } replyPayload := eventPayload(ctx, map[string]string{ "message_id": id, "root_message_id": root.ID, @@ -894,6 +937,7 @@ func (s *Store) CreateThreadReply(ctx context.Context, input store.CreateThreadR if err != nil { return store.Message{}, store.ThreadState{}, nil, err } + mentionedIDs = mergeMentionedUserIDs(mentionedIDs, question) // recipients is a privacy boundary for direct conversations, not a thread // follower list. Mention metadata must never grant a workspace user access // to a DM they are not already participating in. @@ -909,6 +953,7 @@ func (s *Store) CreateThreadReply(ctx context.Context, input store.CreateThreadR if err != nil { return store.Message{}, store.ThreadState{}, nil, err } + msg.Question = createdQuestion return msg, state, []store.Event{replyEvent, stateEvent}, tx.Commit() } diff --git a/apps/api/internal/store/postgres/questions.go b/apps/api/internal/store/postgres/questions.go new file mode 100644 index 000000000..b4dfd0f29 --- /dev/null +++ b/apps/api/internal/store/postgres/questions.go @@ -0,0 +1,527 @@ +package postgres + +import ( + "context" + "database/sql" + "encoding/json" + "errors" + "fmt" + "slices" + "strings" + "time" + "unicode/utf8" + + "github.com/openclaw/clickclack/apps/api/internal/store" + "github.com/openclaw/clickclack/apps/api/internal/store/postgres/storedb" +) + +// questionDocument is the immutable part of a question stored in spec_json. +type questionDocument struct { + Title string `json:"title,omitempty"` + Items []store.QuestionItem `json:"items"` +} + +type storedQuestionResponse struct { + Answers map[string][]string `json:"answers,omitempty"` + Skipped bool `json:"skipped,omitempty"` +} + +// prepareQuestion normalizes a bot's question. It reads nothing, so a nonce +// replay can compare it before any rule that depends on the current time or +// membership. +func prepareQuestion(input *store.QuestionSpec) (*store.QuestionSpec, error) { + if input == nil { + return nil, nil + } + spec, err := store.NormalizeQuestionSpec(*input) + if err != nil { + return nil, err + } + return &spec, nil +} + +// validateNewQuestionTx checks what a newly created question must satisfy now: +// an ordinary message, its deadline, and responders who can read the conversation. +func validateNewQuestionTx(ctx context.Context, tx *sql.Tx, workspaceID, channelID, directConversationID, kind string, spec *store.QuestionSpec) error { + if spec == nil { + return nil + } + if store.IsActivityMessageKind(kind) { + return fmt.Errorf("%w: %s", store.ErrInvalidQuestion, "questions attach only to ordinary messages") + } + if err := store.ValidateQuestionLifetime(*spec, time.Now()); err != nil { + return err + } + for _, userID := range spec.ResponderUserIDs { + var one int + query := ` + SELECT 1 + FROM workspace_members wm + JOIN users u ON u.id = wm.user_id + WHERE wm.workspace_id = $1 AND wm.user_id = $2 AND u.kind = 'human'` + args := []any{workspaceID, userID} + if directConversationID != "" { + query += ` AND EXISTS (SELECT 1 FROM direct_conversation_members dcm WHERE dcm.conversation_id = $3 AND dcm.user_id = wm.user_id)` + args = append(args, directConversationID) + } + err := tx.QueryRowContext(ctx, query, args...).Scan(&one) + if err == nil && directConversationID == "" { + err = requireGuestChannelAccessTx(ctx, tx, workspaceID, channelID, userID) + } + if errors.Is(err, sql.ErrNoRows) || errors.Is(err, store.ErrModerationRestricted) { + return fmt.Errorf("%w: %s", store.ErrInvalidQuestion, "responder_user_ids must be people who can read this conversation") + } else if err != nil { + return err + } + } + return nil +} + +func insertMessageQuestionTx(ctx context.Context, tx *sql.Tx, messageID, workspaceID, botUserID, createdAt string, spec *store.QuestionSpec) (*store.MessageQuestion, error) { + if spec == nil { + return nil, nil + } + document, err := json.Marshal(questionDocument{Title: spec.Title, Items: spec.Items}) + if err != nil { + return nil, err + } + responders, err := json.Marshal(nonNilStrings(spec.ResponderUserIDs)) + if err != nil { + return nil, err + } + allowSkip := int64(0) + if spec.AllowSkip == nil || *spec.AllowSkip { + allowSkip = 1 + } + if err := storedb.New(tx).InsertMessageQuestion(ctx, storedb.InsertMessageQuestionParams{ + MessageID: messageID, + WorkspaceID: workspaceID, + BotUserID: botUserID, + ExternalID: spec.ExternalID, + SpecJson: string(document), + ResponderUserIds: string(responders), + AllowSkip: allowSkip, + ExpiresAt: spec.ExpiresAt, + CreatedAt: createdAt, + }); err != nil { + return nil, err + } + return &store.MessageQuestion{ + Status: store.QuestionStatusOpen, + ExternalID: spec.ExternalID, + Title: spec.Title, + ExpiresAt: spec.ExpiresAt, + AllowSkip: allowSkip == 1, + Items: spec.Items, + ResponderUserIDs: spec.ResponderUserIDs, + Version: 1, + }, nil +} + +// questionReplayMatchesTx reports whether a nonce replay repeats the same question. +func questionReplayMatchesTx(ctx context.Context, tx *sql.Tx, messageID string, spec *store.QuestionSpec) (bool, error) { + row, err := storedb.New(tx).GetMessageQuestion(ctx, messageID) + if errors.Is(err, sql.ErrNoRows) { + return spec == nil, nil + } + if err != nil || spec == nil { + return false, err + } + document, err := json.Marshal(questionDocument{Title: spec.Title, Items: spec.Items}) + if err != nil { + return false, err + } + var responders []string + if err := json.Unmarshal([]byte(row.ResponderUserIds), &responders); err != nil { + return false, err + } + allowSkip := spec.AllowSkip == nil || *spec.AllowSkip + return row.SpecJson == string(document) && row.ExternalID == spec.ExternalID && row.ExpiresAt == spec.ExpiresAt && + (row.AllowSkip == 1) == allowSkip && slices.Equal(responders, nonNilStrings(spec.ResponderUserIDs)), nil +} + +func (s *Store) hydrateQuestions(ctx context.Context, messages []store.Message) ([]store.Message, error) { + return hydrateQuestions(ctx, s.db, messages) +} + +func hydrateQuestions(ctx context.Context, db storedb.DBTX, messages []store.Message) ([]store.Message, error) { + indexByID := make(map[string]int, len(messages)) + args := make([]any, 0, len(messages)) + for index, message := range messages { + if message.DeletedAt != nil { + continue + } + indexByID[message.ID] = index + args = append(args, message.ID) + } + if len(args) == 0 { + return messages, nil + } + rows, err := db.QueryContext(ctx, ` + SELECT q.message_id, q.external_id, q.spec_json, q.responder_user_ids, q.allow_skip, q.expires_at, q.status, + q.response_json, q.response_source, q.responded_at, q.note, q.resolved_at, q.version, + u.id, u.kind, u.owner_user_id, u.display_name, u.handle, u.avatar_url, u.created_at + FROM message_questions q + LEFT JOIN users u ON u.id = q.responded_by + WHERE q.message_id IN (`+pgPlaceholders(len(args), 1)+`)`, args...) + if err != nil { + return nil, err + } + defer rows.Close() + now := time.Now() + for rows.Next() { + var row storedb.MessageQuestion + var responderID, responderKind, responderOwner, responderName, responderHandle, responderAvatar, responderCreated sql.NullString + if err := rows.Scan(&row.MessageID, &row.ExternalID, &row.SpecJson, &row.ResponderUserIds, &row.AllowSkip, &row.ExpiresAt, &row.Status, + &row.ResponseJson, &row.ResponseSource, &row.RespondedAt, &row.Note, &row.ResolvedAt, &row.Version, + &responderID, &responderKind, &responderOwner, &responderName, &responderHandle, &responderAvatar, &responderCreated); err != nil { + return nil, err + } + var responder *store.User + if responderID.Valid { + user := storeUserFromDB(responderID.String, responderKind.String, responderOwner, responderName.String, responderHandle.String, responderAvatar.String, responderCreated.String) + responder = &user + } + question, err := messageQuestionFromRow(row, responder, now) + if err != nil { + return nil, err + } + if index, ok := indexByID[row.MessageID]; ok { + messages[index].Question = &question + } + } + return messages, rows.Err() +} + +func messageQuestionFromRow(row storedb.MessageQuestion, responder *store.User, now time.Time) (store.MessageQuestion, error) { + var document questionDocument + if err := json.Unmarshal([]byte(row.SpecJson), &document); err != nil { + return store.MessageQuestion{}, err + } + question := store.MessageQuestion{ + Status: store.EffectiveQuestionStatus(row.Status, row.ExpiresAt, now), + ExternalID: row.ExternalID, + Title: document.Title, + ExpiresAt: row.ExpiresAt, + AllowSkip: row.AllowSkip == 1, + Items: document.Items, + Note: row.Note, + ResolvedAt: ptrFromNull(row.ResolvedAt), + Version: row.Version, + } + if err := json.Unmarshal([]byte(row.ResponderUserIds), &question.ResponderUserIDs); err != nil { + return store.MessageQuestion{}, err + } + if len(question.ResponderUserIDs) == 0 { + question.ResponderUserIDs = nil + } + if row.ResponseJson != "" { + var response storedQuestionResponse + if err := json.Unmarshal([]byte(row.ResponseJson), &response); err != nil { + return store.MessageQuestion{}, err + } + question.Response = &store.QuestionResponse{ + Answers: response.Answers, + Skipped: response.Skipped, + Source: row.ResponseSource, + Responder: responder, + RespondedAt: row.RespondedAt.String, + } + } + return question, nil +} + +func (s *Store) AnswerQuestion(ctx context.Context, input store.AnswerQuestionInput) (store.Message, []store.Event, error) { + nonce, err := store.NormalizeClientNonce(input.Nonce) + if err != nil { + return store.Message{}, nil, err + } + tx, err := s.db.BeginTx(ctx, nil) + if err != nil { + return store.Message{}, nil, err + } + defer tx.Rollback() + qtx := s.q.WithTx(tx) + msg, err := getMessageTx(ctx, tx, input.MessageID) + if err != nil { + return store.Message{}, nil, err + } + if msg.DeletedAt != nil { + return store.Message{}, nil, sql.ErrNoRows + } + row, err := qtx.GetMessageQuestion(ctx, msg.ID) + if err != nil { + return store.Message{}, nil, err + } + if err := requireMessageAccessTx(ctx, tx, msg, input.UserID); err != nil { + return store.Message{}, nil, err + } + if msg.DirectConversationID != "" { + err = requireCanSendDirectTx(ctx, tx, msg.WorkspaceID, input.UserID) + } else { + err = requireNoModerationBlockTx(ctx, tx, msg.WorkspaceID, input.UserID) + } + if err != nil { + return store.Message{}, nil, err + } + var responders []string + if err := json.Unmarshal([]byte(row.ResponderUserIds), &responders); err != nil { + return store.Message{}, nil, err + } + if len(responders) > 0 && !slices.Contains(responders, input.UserID) { + return store.Message{}, nil, store.ErrQuestionResponderRequired + } + if nonce != "" && row.ResponseNonce == nonce && row.RespondedBy.String == input.UserID { + // Release the transaction first: reads below use the store's connection pool. + if err := tx.Rollback(); err != nil { + return store.Message{}, nil, err + } + message, err := s.hydrateQuestionMessage(ctx, msg, input.UserID) + return message, nil, err + } + if input.ExpectedVersion != nil && *input.ExpectedVersion != row.Version { + return store.Message{}, nil, store.ErrQuestionConflict + } + if store.EffectiveQuestionStatus(row.Status, row.ExpiresAt, time.Now()) != store.QuestionStatusOpen { + return store.Message{}, nil, store.ErrQuestionClosed + } + response := storedQuestionResponse{Skipped: input.Skip} + if input.Skip { + if row.AllowSkip != 1 { + return store.Message{}, nil, fmt.Errorf("%w: %s", store.ErrInvalidQuestion, "this question cannot be skipped") + } + } else { + var document questionDocument + if err := json.Unmarshal([]byte(row.SpecJson), &document); err != nil { + return store.Message{}, nil, err + } + if response.Answers, err = store.NormalizeQuestionAnswers(document.Items, input.Answers); err != nil { + return store.Message{}, nil, err + } + } + responseJSON, err := json.Marshal(response) + if err != nil { + return store.Message{}, nil, err + } + respondedAt := now() + affected, err := qtx.SubmitMessageQuestionResponse(ctx, storedb.SubmitMessageQuestionResponseParams{ + ResponseJson: string(responseJSON), + RespondedBy: sqlText(input.UserID), + RespondedAt: sqlText(respondedAt), + ResponseNonce: nonce, + MessageID: msg.ID, + Version: row.Version, + }) + if err != nil { + return store.Message{}, nil, err + } + if affected == 0 { + return store.Message{}, nil, store.ErrQuestionClosed + } + events, err := insertQuestionEventsTx(ctx, tx, msg, map[string]any{ + "external_id": row.ExternalID, + "responder_id": input.UserID, + "skipped": input.Skip, + "version": row.Version + 1, + }) + if err != nil { + return store.Message{}, nil, err + } + if err := tx.Commit(); err != nil { + return store.Message{}, nil, err + } + message, err := s.hydrateQuestionMessage(ctx, msg, input.UserID) + return message, events, err +} + +func (s *Store) ResolveQuestion(ctx context.Context, input store.ResolveQuestionInput) (store.Message, store.Event, error) { + status := strings.TrimSpace(input.Status) + note := strings.TrimSpace(input.Note) + if utf8.RuneCountInString(note) > store.MaxQuestionNoteLength { + return store.Message{}, store.Event{}, fmt.Errorf("%w: %s", store.ErrInvalidQuestion, "note is too long") + } + tx, err := s.db.BeginTx(ctx, nil) + if err != nil { + return store.Message{}, store.Event{}, err + } + defer tx.Rollback() + qtx := s.q.WithTx(tx) + msg, err := getMessageTx(ctx, tx, input.MessageID) + if err != nil { + return store.Message{}, store.Event{}, err + } + if msg.DeletedAt != nil { + return store.Message{}, store.Event{}, sql.ErrNoRows + } + row, err := qtx.GetMessageQuestion(ctx, msg.ID) + if err != nil { + return store.Message{}, store.Event{}, err + } + if row.BotUserID != input.BotUserID { + return store.Message{}, store.Event{}, store.ErrQuestionAuthorRequired + } + if input.ExpectedVersion != nil && *input.ExpectedVersion != row.Version { + return store.Message{}, store.Event{}, store.ErrQuestionConflict + } + if row.Status == status && store.IsTerminalQuestionStatus(status) { + if err := tx.Rollback(); err != nil { + return store.Message{}, store.Event{}, err + } + message, err := s.hydrateQuestionMessage(ctx, msg, input.BotUserID) + return message, store.Event{}, err + } + if !store.QuestionResolutionAllowed(row.Status, status) { + return store.Message{}, store.Event{}, store.ErrQuestionConflict + } + params := storedb.ResolveMessageQuestionParams{ + Status: status, + Note: note, + ResponseJson: row.ResponseJson, + ResponseSource: row.ResponseSource, + RespondedBy: row.RespondedBy, + RespondedAt: row.RespondedAt, + ResponseNonce: row.ResponseNonce, + UpdatedAt: now(), + MessageID: msg.ID, + Version: row.Version, + } + switch { + case status == store.QuestionStatusOpen: + if note == "" { + return store.Message{}, store.Event{}, fmt.Errorf("%w: %s", store.ErrInvalidQuestion, "reopening a question requires a note") + } + params.ResponseJson, params.ResponseSource, params.ResponseNonce = "", "", "" + params.RespondedBy, params.RespondedAt = sql.NullString{}, sql.NullString{} + case row.Status == store.QuestionStatusOpen && status == store.QuestionStatusAnswered && len(input.Answers) > 0: + var document questionDocument + if err := json.Unmarshal([]byte(row.SpecJson), &document); err != nil { + return store.Message{}, store.Event{}, err + } + answers, err := store.NormalizeQuestionAnswers(document.Items, input.Answers) + if err != nil { + return store.Message{}, store.Event{}, err + } + responseJSON, err := json.Marshal(storedQuestionResponse{Answers: answers}) + if err != nil { + return store.Message{}, store.Event{}, err + } + params.ResponseJson = string(responseJSON) + params.ResponseSource = store.QuestionResponseSourceExternal + params.RespondedAt = sqlText(params.UpdatedAt) + } + if store.IsTerminalQuestionStatus(status) { + params.ResolvedAt = sqlText(params.UpdatedAt) + } + affected, err := qtx.ResolveMessageQuestion(ctx, params) + if err != nil { + return store.Message{}, store.Event{}, err + } + if affected == 0 { + return store.Message{}, store.Event{}, store.ErrQuestionConflict + } + events, err := insertQuestionEventsTx(ctx, tx, msg, nil) + if err != nil { + return store.Message{}, store.Event{}, err + } + if err := tx.Commit(); err != nil { + return store.Message{}, store.Event{}, err + } + message, err := s.hydrateQuestionMessage(ctx, msg, input.BotUserID) + return message, events[0], err +} + +// insertQuestionEventsTx appends message.updated so every client refreshes the +// card and, for a submitted answer, question.submitted for the authoring bot. +// Neither payload carries answer content. +func insertQuestionEventsTx(ctx context.Context, tx *sql.Tx, msg store.Message, submitted map[string]any) ([]store.Event, error) { + recipients, err := eventRecipientsForMessageTx(ctx, tx, msg) + if err != nil { + return nil, err + } + updated, err := insertEventWithRecipients(ctx, tx, msg.WorkspaceID, msg.ChannelID, "message.updated", msg.ChannelSeq, messagePayload(msg), recipients) + if err != nil || submitted == nil { + return []store.Event{updated}, err + } + submitted["message_id"] = msg.ID + submitted["root_message_id"] = msg.ThreadRootID + if msg.DirectConversationID != "" { + submitted["direct_conversation_id"] = msg.DirectConversationID + } + event, err := insertEventWithRecipients(ctx, tx, msg.WorkspaceID, msg.ChannelID, "question.submitted", msg.ChannelSeq, submitted, recipients) + if err != nil { + return nil, err + } + return []store.Event{updated, event}, nil +} + +func (s *Store) hydrateQuestionMessage(ctx context.Context, msg store.Message, userID string) (store.Message, error) { + fresh, err := getMessage(ctx, s.db, msg.ID) + if err != nil { + return store.Message{}, err + } + messages, err := s.hydrateAttachments(ctx, []store.Message{fresh}) + if err != nil { + return store.Message{}, err + } + if messages, err = s.hydrateReactions(ctx, userID, messages); err != nil { + return store.Message{}, err + } + if messages, err = s.hydrateQuestions(ctx, messages); err != nil { + return store.Message{}, err + } + return messages[0], nil +} + +func (s *Store) ListBotUnresolvedQuestions(ctx context.Context, workspaceID, botUserID, afterMessageID string, includeDirect bool, limit int) ([]store.BotQuestion, error) { + // One row past the largest page lets callers detect a next page. + if limit <= 0 || limit > store.MaxBotQuestionPageSize+1 { + limit = store.MaxBotQuestionPageSize + 1 + } + rows, err := s.q.ListBotUnresolvedQuestions(ctx, storedb.ListBotUnresolvedQuestionsParams{ + WorkspaceID: workspaceID, + BotUserID: botUserID, + AfterMessageID: afterMessageID, + IncludeDirect: includeDirect, + RowLimit: int32(limit), + }) + if err != nil { + return nil, err + } + questions := make([]store.BotQuestion, 0, len(rows)) + now := time.Now() + for _, row := range rows { + questions = append(questions, store.BotQuestion{ + MessageID: row.MessageID, + WorkspaceID: row.WorkspaceID, + ChannelID: row.ChannelID, + DirectConversationID: row.DirectConversationID, + ThreadRootID: row.ThreadRootID, + ExternalID: row.ExternalID, + Status: store.EffectiveQuestionStatus(row.Status, row.ExpiresAt, now), + ExpiresAt: row.ExpiresAt, + Version: row.Version, + }) + } + return questions, nil +} + +func nonNilStrings(values []string) []string { + if values == nil { + return []string{} + } + return values +} + +// mergeMentionedUserIDs adds a question's responders to the resolved mentions so +// mention-only channels still alert the people who must answer. +func mergeMentionedUserIDs(mentioned []string, spec *store.QuestionSpec) []string { + if spec == nil { + return mentioned + } + for _, userID := range spec.ResponderUserIDs { + if !slices.Contains(mentioned, userID) { + mentioned = append(mentioned, userID) + } + } + return mentioned +} diff --git a/apps/api/internal/store/postgres/questions_test.go b/apps/api/internal/store/postgres/questions_test.go new file mode 100644 index 000000000..be50b7244 --- /dev/null +++ b/apps/api/internal/store/postgres/questions_test.go @@ -0,0 +1,47 @@ +package postgres + +import ( + "context" + "testing" + "time" + + "github.com/openclaw/clickclack/apps/api/internal/store/questiontest" +) + +func newMigratedQuestionStore(t *testing.T) *Store { + t.Helper() + st := newIsolatedPostgresTestStore(t) + if err := st.Migrate(context.Background()); err != nil { + t.Fatal(err) + } + return st +} + +func TestQuestionLifecycle(t *testing.T) { + questiontest.QuestionLifecycle(t, newMigratedQuestionStore(t)) +} + +func TestQuestionSkipReopenAndExternalAnswers(t *testing.T) { + questiontest.QuestionSkipReopenAndExternalAnswers(t, newMigratedQuestionStore(t)) +} + +func TestQuestionExpiryAndAccess(t *testing.T) { + st := newMigratedQuestionStore(t) + questiontest.QuestionExpiryAndAccess(t, st, questiontest.Hooks{ + ExpireQuestion: func(t *testing.T, messageID string) { + t.Helper() + past := time.Now().Add(-time.Minute).UTC().Format(time.RFC3339Nano) + if _, err := st.db.ExecContext(context.Background(), `UPDATE message_questions SET expires_at = $1 WHERE message_id = $2`, past, messageID); err != nil { + t.Fatal(err) + } + }, + }) +} + +func TestQuestionConcurrentAnswers(t *testing.T) { + questiontest.QuestionConcurrentAnswers(t, newMigratedQuestionStore(t)) +} + +func TestQuestionReplayAndVersionGuards(t *testing.T) { + questiontest.QuestionReplayAndVersionGuards(t, newMigratedQuestionStore(t)) +} diff --git a/apps/api/internal/store/postgres/sqlc/queries.sql b/apps/api/internal/store/postgres/sqlc/queries.sql index 4a2567c3e..a5e4bf937 100644 --- a/apps/api/internal/store/postgres/sqlc/queries.sql +++ b/apps/api/internal/store/postgres/sqlc/queries.sql @@ -1916,3 +1916,65 @@ WHERE user_id = sqlc.arg(user_id) AND token_hash = sqlc.arg(token_hash) AND revoked_at IS NULL FOR UPDATE; + +-- name: InsertMessageQuestion :exec +INSERT INTO message_questions ( + message_id, workspace_id, bot_user_id, external_id, spec_json, responder_user_ids, + allow_skip, expires_at, created_at, updated_at +) VALUES ( + sqlc.arg(message_id), sqlc.arg(workspace_id), sqlc.arg(bot_user_id), sqlc.arg(external_id), + sqlc.arg(spec_json), sqlc.arg(responder_user_ids), sqlc.arg(allow_skip), sqlc.arg(expires_at), + sqlc.arg(created_at), sqlc.arg(created_at) +); + +-- name: GetMessageQuestion :one +SELECT message_id, workspace_id, bot_user_id, external_id, spec_json, responder_user_ids, allow_skip, + expires_at, status, response_json, response_source, responded_by, responded_at, response_nonce, + note, resolved_at, version, created_at, updated_at +FROM message_questions +WHERE message_id = sqlc.arg(message_id); + +-- name: SubmitMessageQuestionResponse :execrows +UPDATE message_questions +SET status = 'submitted', + note = '', + response_json = sqlc.arg(response_json), + response_source = 'clickclack', + responded_by = sqlc.arg(responded_by), + responded_at = sqlc.arg(responded_at), + response_nonce = sqlc.arg(response_nonce), + version = version + 1, + updated_at = sqlc.arg(responded_at) +WHERE message_id = sqlc.arg(message_id) + AND status = 'open' + AND version = sqlc.arg(version); + +-- name: ResolveMessageQuestion :execrows +UPDATE message_questions +SET status = sqlc.arg(status), + note = sqlc.arg(note), + response_json = sqlc.arg(response_json), + response_source = sqlc.arg(response_source), + responded_by = sqlc.narg(responded_by), + responded_at = sqlc.narg(responded_at), + response_nonce = sqlc.arg(response_nonce), + resolved_at = sqlc.narg(resolved_at), + version = version + 1, + updated_at = sqlc.arg(updated_at) +WHERE message_id = sqlc.arg(message_id) + AND version = sqlc.arg(version); + +-- name: ListBotUnresolvedQuestions :many +SELECT q.message_id, q.workspace_id, COALESCE(m.channel_id, '') AS channel_id, + COALESCE(m.direct_conversation_id, '') AS direct_conversation_id, m.thread_root_id, + q.external_id, q.status, q.expires_at, q.version +FROM message_questions q +JOIN messages m ON m.id = q.message_id +WHERE q.workspace_id = sqlc.arg(workspace_id) + AND q.bot_user_id = sqlc.arg(bot_user_id) + AND q.status IN ('open', 'submitted') + AND m.deleted_at IS NULL + AND (sqlc.arg(include_direct)::boolean OR m.direct_conversation_id IS NULL) + AND q.message_id > sqlc.arg(after_message_id) +ORDER BY q.message_id +LIMIT sqlc.arg(row_limit); diff --git a/apps/api/internal/store/postgres/sqlc/schema.sql b/apps/api/internal/store/postgres/sqlc/schema.sql index a55588f63..cdaf31a71 100644 --- a/apps/api/internal/store/postgres/sqlc/schema.sql +++ b/apps/api/internal/store/postgres/sqlc/schema.sql @@ -176,6 +176,32 @@ CREATE INDEX idx_messages_direct_search_fts ON messages CREATE INDEX idx_messages_direct_search_scope ON messages(direct_conversation_id) WHERE direct_conversation_id IS NOT NULL AND deleted_at IS NULL AND kind = 'message'; +CREATE TABLE message_questions ( + message_id TEXT PRIMARY KEY REFERENCES messages(id) ON DELETE CASCADE, + workspace_id TEXT NOT NULL REFERENCES workspaces(id) ON DELETE CASCADE, + bot_user_id TEXT NOT NULL REFERENCES users(id), + external_id TEXT NOT NULL DEFAULT '', + spec_json TEXT NOT NULL, + responder_user_ids TEXT NOT NULL DEFAULT '[]', + allow_skip BIGINT NOT NULL DEFAULT 1 CHECK (allow_skip IN (0, 1)), + expires_at TEXT NOT NULL, + status TEXT NOT NULL DEFAULT 'open' + CHECK (status IN ('open', 'submitted', 'answered', 'cancelled', 'expired', 'failed')), + response_json TEXT NOT NULL DEFAULT '', + response_source TEXT NOT NULL DEFAULT '', + responded_by TEXT REFERENCES users(id) ON DELETE SET NULL, + responded_at TEXT, + response_nonce TEXT NOT NULL DEFAULT '', + note TEXT NOT NULL DEFAULT '', + resolved_at TEXT, + version BIGINT NOT NULL DEFAULT 1, + created_at TEXT NOT NULL, + updated_at TEXT NOT NULL +); + +CREATE INDEX idx_message_questions_bot_status + ON message_questions(workspace_id, bot_user_id, status, message_id); + CREATE TABLE thread_state ( root_message_id TEXT PRIMARY KEY REFERENCES messages(id) ON DELETE CASCADE, reply_count BIGINT NOT NULL DEFAULT 0, diff --git a/apps/api/internal/store/postgres/storedb/models.go b/apps/api/internal/store/postgres/storedb/models.go index d7ab08dbd..dd94eeae9 100644 --- a/apps/api/internal/store/postgres/storedb/models.go +++ b/apps/api/internal/store/postgres/storedb/models.go @@ -277,6 +277,28 @@ type MessageAttachment struct { CreatedAt string `json:"created_at"` } +type MessageQuestion struct { + MessageID string `json:"message_id"` + WorkspaceID string `json:"workspace_id"` + BotUserID string `json:"bot_user_id"` + ExternalID string `json:"external_id"` + SpecJson string `json:"spec_json"` + ResponderUserIds string `json:"responder_user_ids"` + AllowSkip int64 `json:"allow_skip"` + ExpiresAt string `json:"expires_at"` + Status string `json:"status"` + ResponseJson string `json:"response_json"` + ResponseSource string `json:"response_source"` + RespondedBy sql.NullString `json:"responded_by"` + RespondedAt sql.NullString `json:"responded_at"` + ResponseNonce string `json:"response_nonce"` + Note string `json:"note"` + ResolvedAt sql.NullString `json:"resolved_at"` + Version int64 `json:"version"` + CreatedAt string `json:"created_at"` + UpdatedAt string `json:"updated_at"` +} + type OauthTransaction struct { ID string `json:"id"` StateHash string `json:"state_hash"` diff --git a/apps/api/internal/store/postgres/storedb/queries.sql.go b/apps/api/internal/store/postgres/storedb/queries.sql.go index 714bf3581..be965f909 100644 --- a/apps/api/internal/store/postgres/storedb/queries.sql.go +++ b/apps/api/internal/store/postgres/storedb/queries.sql.go @@ -1642,6 +1642,41 @@ func (q *Queries) GetMessageIDByAuthorNonce(ctx context.Context, arg GetMessageI return id, err } +const getMessageQuestion = `-- name: GetMessageQuestion :one +SELECT message_id, workspace_id, bot_user_id, external_id, spec_json, responder_user_ids, allow_skip, + expires_at, status, response_json, response_source, responded_by, responded_at, response_nonce, + note, resolved_at, version, created_at, updated_at +FROM message_questions +WHERE message_id = $1 +` + +func (q *Queries) GetMessageQuestion(ctx context.Context, messageID string) (MessageQuestion, error) { + row := q.db.QueryRowContext(ctx, getMessageQuestion, messageID) + var i MessageQuestion + err := row.Scan( + &i.MessageID, + &i.WorkspaceID, + &i.BotUserID, + &i.ExternalID, + &i.SpecJson, + &i.ResponderUserIds, + &i.AllowSkip, + &i.ExpiresAt, + &i.Status, + &i.ResponseJson, + &i.ResponseSource, + &i.RespondedBy, + &i.RespondedAt, + &i.ResponseNonce, + &i.Note, + &i.ResolvedAt, + &i.Version, + &i.CreatedAt, + &i.UpdatedAt, + ) + return i, err +} + const getNotificationSettings = `-- name: GetNotificationSettings :one SELECT pushover_enabled, pushover_user_key FROM user_notification_settings @@ -2724,6 +2759,44 @@ func (q *Queries) InsertMagicLink(ctx context.Context, arg InsertMagicLinkParams return err } +const insertMessageQuestion = `-- name: InsertMessageQuestion :exec +INSERT INTO message_questions ( + message_id, workspace_id, bot_user_id, external_id, spec_json, responder_user_ids, + allow_skip, expires_at, created_at, updated_at +) VALUES ( + $1, $2, $3, $4, + $5, $6, $7, $8, + $9, $9 +) +` + +type InsertMessageQuestionParams struct { + MessageID string `json:"message_id"` + WorkspaceID string `json:"workspace_id"` + BotUserID string `json:"bot_user_id"` + ExternalID string `json:"external_id"` + SpecJson string `json:"spec_json"` + ResponderUserIds string `json:"responder_user_ids"` + AllowSkip int64 `json:"allow_skip"` + ExpiresAt string `json:"expires_at"` + CreatedAt string `json:"created_at"` +} + +func (q *Queries) InsertMessageQuestion(ctx context.Context, arg InsertMessageQuestionParams) error { + _, err := q.db.ExecContext(ctx, insertMessageQuestion, + arg.MessageID, + arg.WorkspaceID, + arg.BotUserID, + arg.ExternalID, + arg.SpecJson, + arg.ResponderUserIds, + arg.AllowSkip, + arg.ExpiresAt, + arg.CreatedAt, + ) + return err +} + const insertOAuthTransaction = `-- name: InsertOAuthTransaction :exec INSERT INTO oauth_transactions ( id, state_hash, browser_binding_hash, mode, pkce_verifier, desktop_challenge, @@ -3302,6 +3375,81 @@ func (q *Queries) ListBotHistoricalWorkspaces(ctx context.Context, botUserID str return items, nil } +const listBotUnresolvedQuestions = `-- name: ListBotUnresolvedQuestions :many +SELECT q.message_id, q.workspace_id, COALESCE(m.channel_id, '') AS channel_id, + COALESCE(m.direct_conversation_id, '') AS direct_conversation_id, m.thread_root_id, + q.external_id, q.status, q.expires_at, q.version +FROM message_questions q +JOIN messages m ON m.id = q.message_id +WHERE q.workspace_id = $1 + AND q.bot_user_id = $2 + AND q.status IN ('open', 'submitted') + AND m.deleted_at IS NULL + AND ($3::boolean OR m.direct_conversation_id IS NULL) + AND q.message_id > $4 +ORDER BY q.message_id +LIMIT $5 +` + +type ListBotUnresolvedQuestionsParams struct { + WorkspaceID string `json:"workspace_id"` + BotUserID string `json:"bot_user_id"` + IncludeDirect bool `json:"include_direct"` + AfterMessageID string `json:"after_message_id"` + RowLimit int32 `json:"row_limit"` +} + +type ListBotUnresolvedQuestionsRow struct { + MessageID string `json:"message_id"` + WorkspaceID string `json:"workspace_id"` + ChannelID string `json:"channel_id"` + DirectConversationID string `json:"direct_conversation_id"` + ThreadRootID string `json:"thread_root_id"` + ExternalID string `json:"external_id"` + Status string `json:"status"` + ExpiresAt string `json:"expires_at"` + Version int64 `json:"version"` +} + +func (q *Queries) ListBotUnresolvedQuestions(ctx context.Context, arg ListBotUnresolvedQuestionsParams) ([]ListBotUnresolvedQuestionsRow, error) { + rows, err := q.db.QueryContext(ctx, listBotUnresolvedQuestions, + arg.WorkspaceID, + arg.BotUserID, + arg.IncludeDirect, + arg.AfterMessageID, + arg.RowLimit, + ) + if err != nil { + return nil, err + } + defer rows.Close() + var items []ListBotUnresolvedQuestionsRow + for rows.Next() { + var i ListBotUnresolvedQuestionsRow + if err := rows.Scan( + &i.MessageID, + &i.WorkspaceID, + &i.ChannelID, + &i.DirectConversationID, + &i.ThreadRootID, + &i.ExternalID, + &i.Status, + &i.ExpiresAt, + &i.Version, + ); err != nil { + return nil, err + } + items = append(items, i) + } + if err := rows.Close(); err != nil { + return nil, err + } + if err := rows.Err(); err != nil { + return nil, err + } + return items, nil +} + const listBotsOwnedBy = `-- name: ListBotsOwnedBy :many SELECT u.id, @@ -5661,6 +5809,56 @@ func (q *Queries) RequireWorkspaceOwner(ctx context.Context, arg RequireWorkspac return role, err } +const resolveMessageQuestion = `-- name: ResolveMessageQuestion :execrows +UPDATE message_questions +SET status = $1, + note = $2, + response_json = $3, + response_source = $4, + responded_by = $5, + responded_at = $6, + response_nonce = $7, + resolved_at = $8, + version = version + 1, + updated_at = $9 +WHERE message_id = $10 + AND version = $11 +` + +type ResolveMessageQuestionParams struct { + Status string `json:"status"` + Note string `json:"note"` + ResponseJson string `json:"response_json"` + ResponseSource string `json:"response_source"` + RespondedBy sql.NullString `json:"responded_by"` + RespondedAt sql.NullString `json:"responded_at"` + ResponseNonce string `json:"response_nonce"` + ResolvedAt sql.NullString `json:"resolved_at"` + UpdatedAt string `json:"updated_at"` + MessageID string `json:"message_id"` + Version int64 `json:"version"` +} + +func (q *Queries) ResolveMessageQuestion(ctx context.Context, arg ResolveMessageQuestionParams) (int64, error) { + result, err := q.db.ExecContext(ctx, resolveMessageQuestion, + arg.Status, + arg.Note, + arg.ResponseJson, + arg.ResponseSource, + arg.RespondedBy, + arg.RespondedAt, + arg.ResponseNonce, + arg.ResolvedAt, + arg.UpdatedAt, + arg.MessageID, + arg.Version, + ) + if err != nil { + return 0, err + } + return result.RowsAffected() +} + const retireBotUser = `-- name: RetireBotUser :execrows UPDATE users SET handle = '' @@ -5856,6 +6054,46 @@ func (q *Queries) SetUserAvatarIfEmpty(ctx context.Context, arg SetUserAvatarIfE return err } +const submitMessageQuestionResponse = `-- name: SubmitMessageQuestionResponse :execrows +UPDATE message_questions +SET status = 'submitted', + note = '', + response_json = $1, + response_source = 'clickclack', + responded_by = $2, + responded_at = $3, + response_nonce = $4, + version = version + 1, + updated_at = $3 +WHERE message_id = $5 + AND status = 'open' + AND version = $6 +` + +type SubmitMessageQuestionResponseParams struct { + ResponseJson string `json:"response_json"` + RespondedBy sql.NullString `json:"responded_by"` + RespondedAt sql.NullString `json:"responded_at"` + ResponseNonce string `json:"response_nonce"` + MessageID string `json:"message_id"` + Version int64 `json:"version"` +} + +func (q *Queries) SubmitMessageQuestionResponse(ctx context.Context, arg SubmitMessageQuestionResponseParams) (int64, error) { + result, err := q.db.ExecContext(ctx, submitMessageQuestionResponse, + arg.ResponseJson, + arg.RespondedBy, + arg.RespondedAt, + arg.ResponseNonce, + arg.MessageID, + arg.Version, + ) + if err != nil { + return 0, err + } + return result.RowsAffected() +} + const threadNextSeq = `-- name: ThreadNextSeq :one SELECT CAST(COALESCE(MAX(thread_seq), 0) + 1 AS BIGINT) AS next_seq FROM messages diff --git a/apps/api/internal/store/postgres/thread_pages.go b/apps/api/internal/store/postgres/thread_pages.go index 37dd36abb..82affed69 100644 --- a/apps/api/internal/store/postgres/thread_pages.go +++ b/apps/api/internal/store/postgres/thread_pages.go @@ -78,6 +78,10 @@ func (s *Store) GetThreadPage(ctx context.Context, rootMessageID, userID string, if err != nil { return store.ThreadPage{}, err } + messages, err = s.hydrateQuestions(ctx, messages) + if err != nil { + return store.ThreadPage{}, err + } messages, err = s.hydrateReactions(ctx, userID, messages) if err != nil { return store.ThreadPage{}, err diff --git a/apps/api/internal/store/postgres/uploads.go b/apps/api/internal/store/postgres/uploads.go index bff4cb807..646998263 100644 --- a/apps/api/internal/store/postgres/uploads.go +++ b/apps/api/internal/store/postgres/uploads.go @@ -311,6 +311,9 @@ func hydrateMessageCreateReplay(ctx context.Context, tx *sql.Tx, message store.M if err != nil { return store.Message{}, err } + if messages, err = hydrateQuestions(ctx, tx, messages); err != nil { + return store.Message{}, err + } message = messages[0] uploadID = strings.TrimSpace(uploadID) if uploadID == "" { diff --git a/apps/api/internal/store/questions.go b/apps/api/internal/store/questions.go new file mode 100644 index 000000000..e47e7f64b --- /dev/null +++ b/apps/api/internal/store/questions.go @@ -0,0 +1,364 @@ +package store + +import ( + "errors" + "fmt" + "net/url" + "regexp" + "slices" + "strings" + "time" + "unicode/utf8" +) + +// Question lifecycle statuses. A bot posts an open question; the first valid +// answer moves it to submitted; the authoring bot records the outcome. +const ( + QuestionStatusOpen = "open" + QuestionStatusSubmitted = "submitted" + QuestionStatusAnswered = "answered" + QuestionStatusCancelled = "cancelled" + QuestionStatusExpired = "expired" + QuestionStatusFailed = "failed" +) + +const ( + QuestionResponseSourceClickClack = "clickclack" + QuestionResponseSourceExternal = "external" +) + +const ( + MaxQuestionItems = 5 + MaxQuestionOptions = 10 + MaxQuestionResponders = 50 + MaxQuestionTitleLength = 300 + MaxQuestionHeaderLength = 24 + MaxQuestionPromptLength = 1000 + MaxQuestionOptionLabelLength = 80 + MaxQuestionOptionDescription = 200 + MaxQuestionPlaceholderLength = 60 + MaxQuestionFreeTextLength = 2000 + MaxQuestionNoteLength = 200 + MaxQuestionExternalIDLength = 128 + MaxQuestionURLLength = 2048 + MaxBotQuestionPageSize = 200 + MinQuestionLifetime = 10 * time.Second + MaxQuestionLifetime = 7 * 24 * time.Hour + QuestionCapabilityHeader = "X-ClickClack-Questions" + QuestionCapabilityHeaderValue = "supported" +) + +var ( + // ErrInvalidQuestion wraps every question or answer validation failure. + ErrInvalidQuestion = errors.New("invalid question") + // ErrQuestionClosed is returned when a question no longer accepts answers. + ErrQuestionClosed = errors.New("question is no longer open") + // ErrQuestionResponderRequired is returned to people outside the responder list. + ErrQuestionResponderRequired = errors.New("only the listed responders can answer this question") + // ErrQuestionAuthorRequired is returned when a caller other than the authoring bot resolves a question. + ErrQuestionAuthorRequired = errors.New("only the bot that asked this question can resolve it") + // ErrQuestionConflict is returned for stale versions and transitions the current status does not allow. + ErrQuestionConflict = errors.New("question changed; reload it and try again") +) + +var questionItemIDPattern = regexp.MustCompile(`^[a-z][a-z0-9_]{0,63}$`) + +type QuestionOption struct { + Label string `json:"label"` + Description string `json:"description,omitempty"` +} + +type QuestionItem struct { + ID string `json:"id"` + Header string `json:"header"` + Prompt string `json:"prompt"` + URL string `json:"url,omitempty"` + Options []QuestionOption `json:"options,omitempty"` + MultiSelect bool `json:"multi_select,omitempty"` + AllowOther bool `json:"allow_other,omitempty"` + OtherPlaceholder string `json:"other_placeholder,omitempty"` +} + +// QuestionSpec is the question a bot attaches when it creates a message. +type QuestionSpec struct { + ExternalID string `json:"external_id,omitempty"` + Title string `json:"title,omitempty"` + ExpiresAt string `json:"expires_at"` + ResponderUserIDs []string `json:"responder_user_ids,omitempty"` + AllowSkip *bool `json:"allow_skip,omitempty"` + Items []QuestionItem `json:"items"` +} + +type QuestionResponse struct { + Answers map[string][]string `json:"answers,omitempty"` + Skipped bool `json:"skipped,omitempty"` + Source string `json:"source"` + Responder *User `json:"responder,omitempty"` + RespondedAt string `json:"responded_at,omitempty"` +} + +// MessageQuestion is the question facet hydrated on a message. +type MessageQuestion struct { + Status string `json:"status"` + ExternalID string `json:"external_id,omitempty"` + Title string `json:"title,omitempty"` + ExpiresAt string `json:"expires_at"` + AllowSkip bool `json:"allow_skip"` + Items []QuestionItem `json:"items"` + ResponderUserIDs []string `json:"responder_user_ids,omitempty"` + Response *QuestionResponse `json:"response,omitempty"` + Note string `json:"note,omitempty"` + ResolvedAt *string `json:"resolved_at,omitempty"` + Version int64 `json:"version"` +} + +type AnswerQuestionInput struct { + MessageID string + UserID string + Answers map[string][]string + Skip bool + Nonce string + // ExpectedVersion is the question version the person saw. A different + // current version, such as after a reopen, rejects the answer. + ExpectedVersion *int64 +} + +type ResolveQuestionInput struct { + MessageID string + BotUserID string + Status string + Note string + Answers map[string][]string + ExpectedVersion *int64 +} + +// BotQuestion summarizes one of a bot's questions for reconciliation. +type BotQuestion struct { + MessageID string `json:"message_id"` + WorkspaceID string `json:"workspace_id"` + ChannelID string `json:"channel_id,omitempty"` + DirectConversationID string `json:"direct_conversation_id,omitempty"` + ThreadRootID string `json:"thread_root_id"` + ExternalID string `json:"external_id,omitempty"` + Status string `json:"status"` + ExpiresAt string `json:"expires_at"` + Version int64 `json:"version"` +} + +func invalidQuestion(format string, args ...any) error { + return fmt.Errorf("%w: %s", ErrInvalidQuestion, fmt.Sprintf(format, args...)) +} + +// ValidateQuestionLifetime checks the deadline of a question that is about to +// be created. Replaying an existing question skips it, so a retry near the +// deadline still returns the original message. +func ValidateQuestionLifetime(spec QuestionSpec, now time.Time) error { + expiresAt, err := time.Parse(time.RFC3339Nano, spec.ExpiresAt) + if err != nil { + return invalidQuestion("expires_at must be an RFC 3339 timestamp") + } + if lifetime := expiresAt.Sub(now); lifetime < MinQuestionLifetime || lifetime > MaxQuestionLifetime { + return invalidQuestion("expires_at must be between %s and %s from now", MinQuestionLifetime, MaxQuestionLifetime) + } + return nil +} + +// NormalizeQuestionSpec trims and validates the shape of a bot-authored +// question. New questions also need ValidateQuestionLifetime. +func NormalizeQuestionSpec(input QuestionSpec) (QuestionSpec, error) { + spec := QuestionSpec{ + ExternalID: strings.TrimSpace(input.ExternalID), + Title: strings.TrimSpace(input.Title), + ExpiresAt: strings.TrimSpace(input.ExpiresAt), + } + if utf8.RuneCountInString(spec.ExternalID) > MaxQuestionExternalIDLength { + return QuestionSpec{}, invalidQuestion("external_id is longer than %d characters", MaxQuestionExternalIDLength) + } + if utf8.RuneCountInString(spec.Title) > MaxQuestionTitleLength { + return QuestionSpec{}, invalidQuestion("title is longer than %d characters", MaxQuestionTitleLength) + } + expiresAt, err := time.Parse(time.RFC3339, spec.ExpiresAt) + if err != nil { + return QuestionSpec{}, invalidQuestion("expires_at must be an RFC 3339 timestamp") + } + spec.ExpiresAt = expiresAt.UTC().Format(time.RFC3339Nano) + allowSkip := input.AllowSkip == nil || *input.AllowSkip + spec.AllowSkip = &allowSkip + for _, id := range input.ResponderUserIDs { + id = strings.TrimSpace(id) + if id == "" { + return QuestionSpec{}, invalidQuestion("responder_user_ids cannot contain empty IDs") + } + if !slices.Contains(spec.ResponderUserIDs, id) { + spec.ResponderUserIDs = append(spec.ResponderUserIDs, id) + } + } + if len(spec.ResponderUserIDs) > MaxQuestionResponders { + return QuestionSpec{}, invalidQuestion("responder_user_ids has more than %d users", MaxQuestionResponders) + } + if len(input.Items) == 0 || len(input.Items) > MaxQuestionItems { + return QuestionSpec{}, invalidQuestion("items must contain 1 to %d questions", MaxQuestionItems) + } + seenIDs := map[string]bool{} + for index, raw := range input.Items { + item, err := normalizeQuestionItem(raw) + if err != nil { + return QuestionSpec{}, fmt.Errorf("%w (items[%d])", err, index) + } + if seenIDs[item.ID] { + return QuestionSpec{}, invalidQuestion("items[%d].id %q is repeated", index, item.ID) + } + seenIDs[item.ID] = true + spec.Items = append(spec.Items, item) + } + return spec, nil +} + +func normalizeQuestionItem(raw QuestionItem) (QuestionItem, error) { + item := QuestionItem{ + ID: strings.TrimSpace(raw.ID), + Header: strings.TrimSpace(raw.Header), + Prompt: strings.TrimSpace(raw.Prompt), + URL: strings.TrimSpace(raw.URL), + MultiSelect: raw.MultiSelect, + AllowOther: raw.AllowOther, + OtherPlaceholder: strings.TrimSpace(raw.OtherPlaceholder), + } + if !questionItemIDPattern.MatchString(item.ID) { + return QuestionItem{}, invalidQuestion("id must match %s", questionItemIDPattern) + } + if item.Header == "" || utf8.RuneCountInString(item.Header) > MaxQuestionHeaderLength { + return QuestionItem{}, invalidQuestion("header must have 1 to %d characters", MaxQuestionHeaderLength) + } + if item.Prompt == "" || utf8.RuneCountInString(item.Prompt) > MaxQuestionPromptLength { + return QuestionItem{}, invalidQuestion("prompt must have 1 to %d characters", MaxQuestionPromptLength) + } + if item.URL != "" && !safeQuestionURL(item.URL) { + return QuestionItem{}, invalidQuestion("url must be an http or https URL of at most %d characters", MaxQuestionURLLength) + } + if utf8.RuneCountInString(item.OtherPlaceholder) > MaxQuestionPlaceholderLength { + return QuestionItem{}, invalidQuestion("other_placeholder is longer than %d characters", MaxQuestionPlaceholderLength) + } + if len(raw.Options) > MaxQuestionOptions { + return QuestionItem{}, invalidQuestion("options has more than %d choices", MaxQuestionOptions) + } + seenLabels := map[string]bool{} + for _, rawOption := range raw.Options { + option := QuestionOption{Label: strings.TrimSpace(rawOption.Label), Description: strings.TrimSpace(rawOption.Description)} + if option.Label == "" || utf8.RuneCountInString(option.Label) > MaxQuestionOptionLabelLength { + return QuestionItem{}, invalidQuestion("option labels must have 1 to %d characters", MaxQuestionOptionLabelLength) + } + if utf8.RuneCountInString(option.Description) > MaxQuestionOptionDescription { + return QuestionItem{}, invalidQuestion("option descriptions are limited to %d characters", MaxQuestionOptionDescription) + } + key := strings.ToLower(option.Label) + if seenLabels[key] { + return QuestionItem{}, invalidQuestion("option label %q is repeated", option.Label) + } + seenLabels[key] = true + item.Options = append(item.Options, option) + } + if item.MultiSelect && len(item.Options) < 2 { + return QuestionItem{}, invalidQuestion("multi_select needs at least two options") + } + return item, nil +} + +func safeQuestionURL(raw string) bool { + if len(raw) > MaxQuestionURLLength { + return false + } + parsed, err := url.Parse(raw) + return err == nil && (parsed.Scheme == "https" || parsed.Scheme == "http") && parsed.Host != "" +} + +// NormalizeQuestionAnswers validates answers against the question's items and +// returns them keyed by item ID with declared option labels in canonical form. +func NormalizeQuestionAnswers(items []QuestionItem, answers map[string][]string) (map[string][]string, error) { + known := map[string]bool{} + for _, item := range items { + known[item.ID] = true + } + for id := range answers { + if !known[id] { + return nil, invalidQuestion("answers contains unknown question %q", id) + } + } + normalized := make(map[string][]string, len(items)) + for _, item := range items { + values := answers[item.ID] + if len(values) == 0 { + return nil, invalidQuestion("question %q requires an answer", item.ID) + } + if !item.MultiSelect && len(values) > 1 { + return nil, invalidQuestion("question %q allows one answer", item.ID) + } + freeText := 0 + var canonical []string + for _, raw := range values { + value := strings.TrimSpace(raw) + if value == "" { + return nil, invalidQuestion("question %q contains an empty answer", item.ID) + } + if label, ok := declaredQuestionOption(item, value); ok { + value = label + } else { + if len(item.Options) > 0 && !item.AllowOther { + return nil, invalidQuestion("question %q only accepts its listed options", item.ID) + } + freeText++ + if freeText > 1 { + return nil, invalidQuestion("question %q accepts one free-text answer", item.ID) + } + if utf8.RuneCountInString(value) > MaxQuestionFreeTextLength { + return nil, invalidQuestion("answers are limited to %d characters", MaxQuestionFreeTextLength) + } + } + if slices.Contains(canonical, value) { + continue + } + canonical = append(canonical, value) + } + normalized[item.ID] = canonical + } + return normalized, nil +} + +func declaredQuestionOption(item QuestionItem, value string) (string, bool) { + for _, option := range item.Options { + if option.Label == value { + return option.Label, true + } + } + return "", false +} + +// EffectiveQuestionStatus reports an open question past its deadline as expired. +func EffectiveQuestionStatus(status, expiresAt string, now time.Time) string { + if status != QuestionStatusOpen { + return status + } + deadline, err := time.Parse(time.RFC3339Nano, expiresAt) + if err == nil && !now.Before(deadline) { + return QuestionStatusExpired + } + return status +} + +// QuestionResolutionAllowed reports whether the authoring bot may move a +// question from its stored status to the requested one. +func QuestionResolutionAllowed(from, to string) bool { + switch from { + case QuestionStatusOpen: + return to == QuestionStatusAnswered || to == QuestionStatusCancelled || to == QuestionStatusExpired || to == QuestionStatusFailed + case QuestionStatusSubmitted: + return to == QuestionStatusAnswered || to == QuestionStatusCancelled || to == QuestionStatusFailed || to == QuestionStatusOpen + default: + return false + } +} + +// IsTerminalQuestionStatus reports whether the question has a final outcome. +func IsTerminalQuestionStatus(status string) bool { + return status == QuestionStatusAnswered || status == QuestionStatusCancelled || status == QuestionStatusExpired || status == QuestionStatusFailed +} diff --git a/apps/api/internal/store/questions_test.go b/apps/api/internal/store/questions_test.go new file mode 100644 index 000000000..64d4bae73 --- /dev/null +++ b/apps/api/internal/store/questions_test.go @@ -0,0 +1,141 @@ +package store + +import ( + "errors" + "reflect" + "strings" + "testing" + "time" +) + +func validQuestionSpec(now time.Time) QuestionSpec { + return QuestionSpec{ + ExternalID: " ask_1 ", + Title: " Need three details ", + ExpiresAt: now.Add(15 * time.Minute).Format(time.RFC3339), + Items: []QuestionItem{ + {ID: "ship_date", Header: "Fecha", Prompt: "¿Qué día embarcamos?", Options: []QuestionOption{{Label: " Lun 15 sep ", Description: "AA 2231"}, {Label: "Mar 16 sep"}}, AllowOther: true}, + {ID: "boxes", Header: "Cajas", Prompt: "¿Cuántas cajas?"}, + {ID: "extras", Header: "Extras", Prompt: "¿Algo más?", MultiSelect: true, Options: []QuestionOption{{Label: "Capuchón"}, {Label: "UPC"}}}, + }, + } +} + +func TestNormalizeQuestionSpecTrimsAndDefaults(t *testing.T) { + now := time.Date(2026, 9, 12, 15, 0, 0, 0, time.UTC) + spec, err := NormalizeQuestionSpec(validQuestionSpec(now)) + if err != nil { + t.Fatal(err) + } + if spec.ExternalID != "ask_1" || spec.Title != "Need three details" || spec.AllowSkip == nil || !*spec.AllowSkip { + t.Fatalf("unexpected normalized spec: %#v", spec) + } + if spec.ExpiresAt != "2026-09-12T15:15:00Z" || spec.Items[0].Options[0].Label != "Lun 15 sep" { + t.Fatalf("unexpected normalized fields: %#v", spec) + } +} + +func TestNormalizeQuestionSpecRejectsInvalidQuestions(t *testing.T) { + now := time.Date(2026, 9, 12, 15, 0, 0, 0, time.UTC) + for name, mutate := range map[string]func(*QuestionSpec){ + "no items": func(spec *QuestionSpec) { spec.Items = nil }, + "too many items": func(spec *QuestionSpec) { spec.Items = append(spec.Items, spec.Items[1], spec.Items[1], spec.Items[1]) }, + "bad id": func(spec *QuestionSpec) { spec.Items[0].ID = "Ship-Date" }, + "repeated id": func(spec *QuestionSpec) { spec.Items[1].ID = "ship_date" }, + "empty header": func(spec *QuestionSpec) { spec.Items[0].Header = " " }, + "long header": func(spec *QuestionSpec) { spec.Items[0].Header = strings.Repeat("h", MaxQuestionHeaderLength+1) }, + "empty prompt": func(spec *QuestionSpec) { spec.Items[0].Prompt = "" }, + "unsafe url": func(spec *QuestionSpec) { spec.Items[0].URL = "javascript:alert(1)" }, + "repeated option": func(spec *QuestionSpec) { spec.Items[0].Options[1].Label = "lun 15 SEP" }, + "single multi-select": func(spec *QuestionSpec) { spec.Items[2].Options = spec.Items[2].Options[:1] }, + "past deadline": func(spec *QuestionSpec) { spec.ExpiresAt = now.Add(-time.Minute).Format(time.RFC3339) }, + "deadline too far": func(spec *QuestionSpec) { spec.ExpiresAt = now.Add(8 * 24 * time.Hour).Format(time.RFC3339) }, + "bad deadline": func(spec *QuestionSpec) { spec.ExpiresAt = "tomorrow" }, + "empty responder": func(spec *QuestionSpec) { spec.ResponderUserIDs = []string{" "} }, + } { + t.Run(name, func(t *testing.T) { + spec := validQuestionSpec(now) + mutate(&spec) + normalized, err := NormalizeQuestionSpec(spec) + if err == nil { + err = ValidateQuestionLifetime(normalized, now) + } + if !errors.Is(err, ErrInvalidQuestion) { + t.Fatalf("expected invalid question, got %v", err) + } + }) + } +} + +func TestNormalizeQuestionAnswers(t *testing.T) { + now := time.Now() + spec, err := NormalizeQuestionSpec(validQuestionSpec(now)) + if err != nil { + t.Fatal(err) + } + got, err := NormalizeQuestionAnswers(spec.Items, map[string][]string{ + "ship_date": {" Lun 15 sep "}, + "boxes": {" 120 "}, + "extras": {"UPC", "Capuchón", "UPC"}, + }) + if err != nil { + t.Fatal(err) + } + want := map[string][]string{"ship_date": {"Lun 15 sep"}, "boxes": {"120"}, "extras": {"UPC", "Capuchón"}} + if !reflect.DeepEqual(got, want) { + t.Fatalf("answers = %#v, want %#v", got, want) + } + if _, err := NormalizeQuestionAnswers(spec.Items, map[string][]string{"ship_date": {"Jue 18 sep"}, "boxes": {"1"}, "extras": {"UPC"}}); err != nil { + t.Fatalf("free text for a question that allows other: %v", err) + } + withOther := append([]QuestionItem(nil), spec.Items...) + withOther[2].AllowOther = true + if _, err := NormalizeQuestionAnswers(withOther, map[string][]string{"ship_date": {"Mar 16 sep"}, "boxes": {"1"}, "extras": {"UPC", "Comida", "Flores"}}); !errors.Is(err, ErrInvalidQuestion) { + t.Fatalf("expected one free-text answer per question, got %v", err) + } + for name, answers := range map[string]map[string][]string{ + "missing question": {"ship_date": {"Mar 16 sep"}, "boxes": {"1"}}, + "unknown question": {"ship_date": {"Mar 16 sep"}, "boxes": {"1"}, "extras": {"UPC"}, "color": {"red"}}, + "two single-select": {"ship_date": {"Lun 15 sep", "Mar 16 sep"}, "boxes": {"1"}, "extras": {"UPC"}}, + "unlisted option": {"ship_date": {"Mar 16 sep"}, "boxes": {"1"}, "extras": {"Comida"}}, + "empty value": {"ship_date": {"Mar 16 sep"}, "boxes": {" "}, "extras": {"UPC"}}, + "long free text": {"ship_date": {"Mar 16 sep"}, "boxes": {strings.Repeat("x", MaxQuestionFreeTextLength+1)}, "extras": {"UPC"}}, + } { + t.Run(name, func(t *testing.T) { + if _, err := NormalizeQuestionAnswers(spec.Items, answers); !errors.Is(err, ErrInvalidQuestion) { + t.Fatalf("expected invalid answer, got %v", err) + } + }) + } +} + +func TestQuestionStatusRules(t *testing.T) { + now := time.Date(2026, 9, 12, 15, 0, 0, 0, time.UTC) + deadline := now.Format(time.RFC3339Nano) + if EffectiveQuestionStatus(QuestionStatusOpen, deadline, now) != QuestionStatusExpired { + t.Fatal("an open question at its deadline must read as expired") + } + if EffectiveQuestionStatus(QuestionStatusOpen, now.Add(time.Second).Format(time.RFC3339Nano), now) != QuestionStatusOpen { + t.Fatal("an open question before its deadline must stay open") + } + if EffectiveQuestionStatus(QuestionStatusSubmitted, deadline, now) != QuestionStatusSubmitted { + t.Fatal("a submitted question keeps its status after the deadline") + } + for _, tc := range []struct { + from, to string + allowed bool + }{ + {QuestionStatusOpen, QuestionStatusAnswered, true}, + {QuestionStatusOpen, QuestionStatusOpen, false}, + {QuestionStatusSubmitted, QuestionStatusOpen, true}, + {QuestionStatusSubmitted, QuestionStatusExpired, false}, + {QuestionStatusAnswered, QuestionStatusFailed, false}, + } { + if QuestionResolutionAllowed(tc.from, tc.to) != tc.allowed { + t.Fatalf("%s -> %s allowed = %t", tc.from, tc.to, !tc.allowed) + } + } + if !IsTerminalQuestionStatus(QuestionStatusFailed) || IsTerminalQuestionStatus(QuestionStatusSubmitted) { + t.Fatal("unexpected terminal status classification") + } +} diff --git a/apps/api/internal/store/questiontest/questions.go b/apps/api/internal/store/questiontest/questions.go new file mode 100644 index 000000000..e9c9592e5 --- /dev/null +++ b/apps/api/internal/store/questiontest/questions.go @@ -0,0 +1,477 @@ +// Package questiontest checks message questions against each SQL backend. +package questiontest + +import ( + "context" + "database/sql" + "errors" + "reflect" + "testing" + "time" + + "github.com/openclaw/clickclack/apps/api/internal/store" +) + +// Hooks give the shared checks access to backend-specific SQL. +type Hooks struct { + // ExpireQuestion moves a question's deadline into the past. + ExpireQuestion func(t *testing.T, messageID string) +} + +type fixture struct { + owner store.User + member store.User + bot store.User + otherBot store.User + workspace store.Workspace + channel store.Channel +} + +func QuestionLifecycle(t *testing.T, st store.Store) { + t.Helper() + ctx := context.Background() + f := newFixture(t, st) + spec := questionSpec(f.member.ID) + + message, created, err := st.CreateMessage(ctx, store.CreateMessageInput{ + ChannelID: f.channel.ID, + AuthorID: f.bot.ID, + Body: "Agent needs input: which day do we ship?", + Nonce: "question-create-1", + Question: &spec, + }) + if err != nil { + t.Fatal(err) + } + question := message.Question + if question == nil || question.Status != store.QuestionStatusOpen || question.Version != 1 || !question.AllowSkip || len(question.Items) != 2 || question.Items[0].Options[0].Label != "Lun 15 sep" { + t.Fatalf("unexpected created question: %#v", question) + } + if !reflect.DeepEqual(created.MentionedUserIDs, []string{f.member.ID}) { + t.Fatalf("responders must be mentioned, got %#v", created.MentionedUserIDs) + } + replayed, replayEvent, err := st.CreateMessage(ctx, store.CreateMessageInput{ChannelID: f.channel.ID, AuthorID: f.bot.ID, Body: message.Body, Nonce: "question-create-1", Question: &spec}) + if err != nil || replayed.ID != message.ID || replayEvent.ID != "" || replayed.Question == nil { + t.Fatalf("nonce replay = %#v, %#v, %v", replayed, replayEvent, err) + } + changed := questionSpec(f.member.ID) + changed.Items[0].Prompt = "A different question" + if _, _, err := st.CreateMessage(ctx, store.CreateMessageInput{ChannelID: f.channel.ID, AuthorID: f.bot.ID, Body: message.Body, Nonce: "question-create-1", Question: &changed}); !errors.Is(err, store.ErrClientNonceConflict) { + t.Fatalf("replay with a different question error = %v", err) + } + page, err := st.ListMessages(ctx, f.channel.ID, f.member.ID, store.MessagePageRequest{Limit: 20}) + if err != nil { + t.Fatal(err) + } + if listed := messageByID(page.Messages, message.ID); listed == nil || listed.Question == nil || listed.Question.Status != store.QuestionStatusOpen { + t.Fatalf("message page did not hydrate the question: %#v", listed) + } + + answers := map[string][]string{"ship_date": {"Lun 15 sep"}, "boxes": {"120"}} + if _, _, err := st.AnswerQuestion(ctx, store.AnswerQuestionInput{MessageID: message.ID, UserID: f.owner.ID, Answers: answers}); !errors.Is(err, store.ErrQuestionResponderRequired) { + t.Fatalf("non-responder answer error = %v", err) + } + if _, _, err := st.AnswerQuestion(ctx, store.AnswerQuestionInput{MessageID: message.ID, UserID: f.member.ID, Answers: map[string][]string{"ship_date": {"Lun 15 sep"}}}); !errors.Is(err, store.ErrInvalidQuestion) { + t.Fatalf("incomplete answer error = %v", err) + } + answered, events, err := st.AnswerQuestion(ctx, store.AnswerQuestionInput{MessageID: message.ID, UserID: f.member.ID, Answers: answers, Nonce: "answer-1"}) + if err != nil { + t.Fatal(err) + } + response := answered.Question.Response + if answered.Question.Status != store.QuestionStatusSubmitted || answered.Question.Version != 2 || response == nil || response.Responder == nil || response.Responder.ID != f.member.ID || response.Source != store.QuestionResponseSourceClickClack || !reflect.DeepEqual(response.Answers, answers) { + t.Fatalf("unexpected submitted question: %#v", answered.Question) + } + if len(events) != 2 || events[0].Type != "message.updated" || events[1].Type != "question.submitted" { + t.Fatalf("unexpected answer events: %#v", events) + } + if payload, ok := events[1].Payload.(map[string]any); !ok || payload["responder_id"] != f.member.ID || payload["message_id"] != message.ID || payload["external_id"] != "ask_1" || payload["answers"] != nil { + t.Fatalf("question.submitted must carry identifiers only: %#v", events[1].Payload) + } + if again, againEvents, err := st.AnswerQuestion(ctx, store.AnswerQuestionInput{MessageID: message.ID, UserID: f.member.ID, Answers: answers, Nonce: "answer-1"}); err != nil || len(againEvents) != 0 || again.Question.Version != 2 { + t.Fatalf("answer replay = %#v, %#v, %v", again.Question, againEvents, err) + } + if _, _, err := st.AnswerQuestion(ctx, store.AnswerQuestionInput{MessageID: message.ID, UserID: f.member.ID, Answers: answers, Nonce: "answer-2"}); !errors.Is(err, store.ErrQuestionClosed) { + t.Fatalf("second answer error = %v", err) + } + + if _, _, err := st.ResolveQuestion(ctx, store.ResolveQuestionInput{MessageID: message.ID, BotUserID: f.otherBot.ID, Status: store.QuestionStatusAnswered}); !errors.Is(err, store.ErrQuestionAuthorRequired) { + t.Fatalf("foreign bot resolve error = %v", err) + } + stale := int64(1) + if _, _, err := st.ResolveQuestion(ctx, store.ResolveQuestionInput{MessageID: message.ID, BotUserID: f.bot.ID, Status: store.QuestionStatusAnswered, ExpectedVersion: &stale}); !errors.Is(err, store.ErrQuestionConflict) { + t.Fatalf("stale version resolve error = %v", err) + } + current := int64(2) + resolved, resolveEvent, err := st.ResolveQuestion(ctx, store.ResolveQuestionInput{MessageID: message.ID, BotUserID: f.bot.ID, Status: store.QuestionStatusAnswered, ExpectedVersion: ¤t}) + if err != nil { + t.Fatal(err) + } + if resolved.Question.Status != store.QuestionStatusAnswered || resolved.Question.ResolvedAt == nil || resolved.Question.Version != 3 || resolved.Question.Response == nil || resolveEvent.Type != "message.updated" { + t.Fatalf("unexpected resolution: %#v %#v", resolved.Question, resolveEvent) + } + if repeated, repeatedEvent, err := st.ResolveQuestion(ctx, store.ResolveQuestionInput{MessageID: message.ID, BotUserID: f.bot.ID, Status: store.QuestionStatusAnswered}); err != nil || repeatedEvent.ID != "" || repeated.Question.Version != 3 { + t.Fatalf("repeated resolution = %#v, %#v, %v", repeated.Question, repeatedEvent, err) + } + if _, _, err := st.ResolveQuestion(ctx, store.ResolveQuestionInput{MessageID: message.ID, BotUserID: f.bot.ID, Status: store.QuestionStatusFailed}); !errors.Is(err, store.ErrQuestionConflict) { + t.Fatalf("changing a terminal status error = %v", err) + } + unresolved, err := st.ListBotUnresolvedQuestions(ctx, f.workspace.ID, f.bot.ID, "", true, 50) + if err != nil || len(unresolved) != 0 { + t.Fatalf("answered questions must not be listed: %#v, %v", unresolved, err) + } +} + +func QuestionSkipReopenAndExternalAnswers(t *testing.T, st store.Store) { + t.Helper() + ctx := context.Background() + f := newFixture(t, st) + ask := func(body string, mutate func(*store.QuestionSpec)) store.Message { + t.Helper() + spec := questionSpec() + if mutate != nil { + mutate(&spec) + } + message, _, err := st.CreateMessage(ctx, store.CreateMessageInput{ChannelID: f.channel.ID, AuthorID: f.bot.ID, Body: body, Question: &spec}) + if err != nil { + t.Fatal(err) + } + return message + } + + skipped := ask("skip me", nil) + submitted, _, err := st.AnswerQuestion(ctx, store.AnswerQuestionInput{MessageID: skipped.ID, UserID: f.owner.ID, Skip: true}) + if err != nil || !submitted.Question.Response.Skipped || submitted.Question.Status != store.QuestionStatusSubmitted { + t.Fatalf("skip = %#v, %v", submitted.Question, err) + } + if cancelled, _, err := st.ResolveQuestion(ctx, store.ResolveQuestionInput{MessageID: skipped.ID, BotUserID: f.bot.ID, Status: store.QuestionStatusCancelled}); err != nil || cancelled.Question.Status != store.QuestionStatusCancelled || !cancelled.Question.Response.Skipped { + t.Fatalf("cancel after skip = %#v, %v", cancelled.Question, err) + } + + required := ask("no skipping", func(spec *store.QuestionSpec) { + allowSkip := false + spec.AllowSkip = &allowSkip + }) + if _, _, err := st.AnswerQuestion(ctx, store.AnswerQuestionInput{MessageID: required.ID, UserID: f.member.ID, Skip: true}); !errors.Is(err, store.ErrInvalidQuestion) { + t.Fatalf("skipping a required question error = %v", err) + } + + reopened := ask("reopen me", nil) + if _, _, err := st.AnswerQuestion(ctx, store.AnswerQuestionInput{MessageID: reopened.ID, UserID: f.member.ID, Answers: map[string][]string{"ship_date": {"Otra fecha"}, "boxes": {"12"}}}); err != nil { + t.Fatal(err) + } + if _, _, err := st.ResolveQuestion(ctx, store.ResolveQuestionInput{MessageID: reopened.ID, BotUserID: f.bot.ID, Status: store.QuestionStatusOpen}); !errors.Is(err, store.ErrInvalidQuestion) { + t.Fatalf("reopen without a note error = %v", err) + } + open, _, err := st.ResolveQuestion(ctx, store.ResolveQuestionInput{MessageID: reopened.ID, BotUserID: f.bot.ID, Status: store.QuestionStatusOpen, Note: "Pick a listed date"}) + if err != nil || open.Question.Status != store.QuestionStatusOpen || open.Question.Response != nil || open.Question.Note != "Pick a listed date" { + t.Fatalf("reopened question = %#v, %v", open.Question, err) + } + if again, _, err := st.AnswerQuestion(ctx, store.AnswerQuestionInput{MessageID: reopened.ID, UserID: f.owner.ID, Answers: map[string][]string{"ship_date": {"Mar 16 sep"}, "boxes": {"12"}}}); err != nil || again.Question.Response.Responder.ID != f.owner.ID || again.Question.Note != "" { + t.Fatalf("answer after reopen = %#v, %v", again.Question, err) + } + + elsewhere := ask("answered elsewhere", nil) + external, _, err := st.ResolveQuestion(ctx, store.ResolveQuestionInput{MessageID: elsewhere.ID, BotUserID: f.bot.ID, Status: store.QuestionStatusAnswered, Note: "Answered elsewhere", Answers: map[string][]string{"ship_date": {"Mar 16 sep"}, "boxes": {"3"}}}) + if err != nil || external.Question.Response == nil || external.Question.Response.Source != store.QuestionResponseSourceExternal || external.Question.Response.Responder != nil { + t.Fatalf("external answer = %#v, %v", external.Question, err) + } + if _, _, err := st.AnswerQuestion(ctx, store.AnswerQuestionInput{MessageID: elsewhere.ID, UserID: f.member.ID, Answers: map[string][]string{"ship_date": {"Mar 16 sep"}, "boxes": {"3"}}}); !errors.Is(err, store.ErrQuestionClosed) { + t.Fatalf("answering a resolved question error = %v", err) + } + + unresolved, err := st.ListBotUnresolvedQuestions(ctx, f.workspace.ID, f.bot.ID, "", true, 50) + if err != nil { + t.Fatal(err) + } + statuses := map[string]string{} + for _, question := range unresolved { + statuses[question.MessageID] = question.Status + } + if !reflect.DeepEqual(statuses, map[string]string{required.ID: store.QuestionStatusOpen, reopened.ID: store.QuestionStatusSubmitted}) { + t.Fatalf("unexpected unresolved questions: %#v", unresolved) + } +} + +func QuestionExpiryAndAccess(t *testing.T, st store.Store, hooks Hooks) { + t.Helper() + ctx := context.Background() + f := newFixture(t, st) + outsider, err := st.CreateUser(ctx, store.CreateUserInput{DisplayName: "Outsider", Email: "question-outsider@example.com"}) + if err != nil { + t.Fatal(err) + } + invalid := questionSpec(outsider.ID) + if _, _, err := st.CreateMessage(ctx, store.CreateMessageInput{ChannelID: f.channel.ID, AuthorID: f.bot.ID, Body: "who?", Question: &invalid}); !errors.Is(err, store.ErrInvalidQuestion) { + t.Fatalf("responder outside the workspace error = %v", err) + } + guest, err := st.CreateUser(ctx, store.CreateUserInput{DisplayName: "Guest", Email: "question-guest@example.com"}) + if err != nil { + t.Fatal(err) + } + if err := st.AddWorkspaceMember(ctx, f.workspace.ID, guest.ID, store.WorkspaceRoleGuest); err != nil { + t.Fatal(err) + } + guestResponder := questionSpec(guest.ID) + if _, _, err := st.CreateMessage(ctx, store.CreateMessageInput{ChannelID: f.channel.ID, AuthorID: f.bot.ID, Body: "guest?", Question: &guestResponder}); !errors.Is(err, store.ErrInvalidQuestion) { + t.Fatalf("guest responder outside the guest channel error = %v", err) + } + + spec := questionSpec() + expiring, _, err := st.CreateMessage(ctx, store.CreateMessageInput{ChannelID: f.channel.ID, AuthorID: f.bot.ID, Body: "expires", Question: &spec}) + if err != nil { + t.Fatal(err) + } + hooks.ExpireQuestion(t, expiring.ID) + fetched, err := st.GetMessage(ctx, expiring.ID, f.member.ID) + if err != nil || fetched.Question.Status != store.QuestionStatusExpired { + t.Fatalf("expired question reads as %#v, %v", fetched.Question, err) + } + if _, _, err := st.AnswerQuestion(ctx, store.AnswerQuestionInput{MessageID: expiring.ID, UserID: f.member.ID, Skip: true}); !errors.Is(err, store.ErrQuestionClosed) { + t.Fatalf("answering an expired question error = %v", err) + } + if recorded, _, err := st.ResolveQuestion(ctx, store.ResolveQuestionInput{MessageID: expiring.ID, BotUserID: f.bot.ID, Status: store.QuestionStatusExpired}); err != nil || recorded.Question.Status != store.QuestionStatusExpired || recorded.Question.ResolvedAt == nil { + t.Fatalf("recording expiry = %#v, %v", recorded.Question, err) + } + + conversation, err := st.CreateDirectConversation(ctx, store.CreateDirectConversationInput{WorkspaceID: f.workspace.ID, UserID: f.bot.ID, MemberIDs: []string{f.member.ID}}) + if err != nil { + t.Fatal(err) + } + notInDirect := questionSpec(f.owner.ID) + if _, _, err := st.CreateDirectMessage(ctx, store.CreateDirectMessageInput{ConversationID: conversation.ID, AuthorID: f.bot.ID, Body: "private?", Question: ¬InDirect}); !errors.Is(err, store.ErrInvalidQuestion) { + t.Fatalf("responder outside the direct conversation error = %v", err) + } + directSpec := questionSpec() + direct, _, err := st.CreateDirectMessage(ctx, store.CreateDirectMessageInput{ConversationID: conversation.ID, AuthorID: f.bot.ID, Body: "private question", Question: &directSpec}) + if err != nil || direct.Question == nil { + t.Fatalf("direct question = %#v, %v", direct, err) + } + if _, _, err := st.AnswerQuestion(ctx, store.AnswerQuestionInput{MessageID: direct.ID, UserID: f.owner.ID, Skip: true}); err == nil { + t.Fatal("people outside a direct conversation must not answer its questions") + } + if answered, events, err := st.AnswerQuestion(ctx, store.AnswerQuestionInput{MessageID: direct.ID, UserID: f.member.ID, Skip: true}); err != nil || len(events) != 2 || len(events[1].RecipientUserIDs) != 2 { + t.Fatalf("direct answer = %#v, %#v, %v", answered.Question, events, err) + } + + root, _, err := st.CreateMessage(ctx, store.CreateMessageInput{ChannelID: f.channel.ID, AuthorID: f.member.ID, Body: "@bot ship it"}) + if err != nil { + t.Fatal(err) + } + threadSpec := questionSpec() + reply, _, _, err := st.CreateThreadReply(ctx, store.CreateThreadReplyInput{RootMessageID: root.ID, AuthorID: f.bot.ID, Body: "Which day?", Question: &threadSpec}) + if err != nil || reply.Question == nil { + t.Fatalf("thread question = %#v, %v", reply, err) + } + threadPage, err := st.GetThreadPage(ctx, root.ID, f.member.ID, store.ThreadPageRequest{MessagePageRequest: store.MessagePageRequest{Limit: 20}}) + if err != nil || len(threadPage.Replies) != 1 || threadPage.Replies[0].Question == nil { + t.Fatalf("thread page did not hydrate the question: %#v, %v", threadPage.Replies, err) + } + if _, _, err := st.AnswerQuestion(ctx, store.AnswerQuestionInput{MessageID: reply.ID, UserID: f.member.ID, Answers: map[string][]string{"ship_date": {"Lun 15 sep"}, "boxes": {"8"}}}); err != nil { + t.Fatalf("thread answer error = %v", err) + } + + gone, _, err := st.CreateMessage(ctx, store.CreateMessageInput{ChannelID: f.channel.ID, AuthorID: f.bot.ID, Body: "deleted soon", Question: &threadSpec}) + if err != nil { + t.Fatal(err) + } + if _, _, err := st.DeleteMessage(ctx, store.DeleteMessageInput{MessageID: gone.ID, UserID: f.bot.ID}); err != nil { + t.Fatal(err) + } + if _, _, err := st.AnswerQuestion(ctx, store.AnswerQuestionInput{MessageID: gone.ID, UserID: f.member.ID, Skip: true}); !errors.Is(err, sql.ErrNoRows) { + t.Fatalf("answering a deleted message error = %v", err) + } +} + +// QuestionConcurrentAnswers checks that exactly one of several racing answers wins. +func QuestionConcurrentAnswers(t *testing.T, st store.Store) { + t.Helper() + ctx := context.Background() + f := newFixture(t, st) + spec := questionSpec() + message, _, err := st.CreateMessage(ctx, store.CreateMessageInput{ChannelID: f.channel.ID, AuthorID: f.bot.ID, Body: "race", Question: &spec}) + if err != nil { + t.Fatal(err) + } + const racers = 8 + results := make(chan error, racers) + start := make(chan struct{}) + for index := range racers { + userID := f.member.ID + if index%2 == 0 { + userID = f.owner.ID + } + go func() { + <-start + _, _, err := st.AnswerQuestion(ctx, store.AnswerQuestionInput{ + MessageID: message.ID, + UserID: userID, + Answers: map[string][]string{"ship_date": {"Mar 16 sep"}, "boxes": {"1"}}, + Nonce: "race-" + string(rune('a'+index)), + }) + results <- err + }() + } + close(start) + wins := 0 + for range racers { + err := <-results + switch { + case err == nil: + wins++ + case !errors.Is(err, store.ErrQuestionClosed): + t.Fatalf("unexpected racing answer error: %v", err) + } + } + if wins != 1 { + t.Fatalf("expected exactly one winning answer, got %d", wins) + } + final, err := st.GetMessage(ctx, message.ID, f.owner.ID) + if err != nil || final.Question.Status != store.QuestionStatusSubmitted || final.Question.Version != 2 { + t.Fatalf("final question = %#v, %v", final.Question, err) + } +} + +func questionSpec(responders ...string) store.QuestionSpec { + return store.QuestionSpec{ + ExternalID: "ask_1", + ExpiresAt: time.Now().Add(15 * time.Minute).UTC().Format(time.RFC3339), + ResponderUserIDs: responders, + Items: []store.QuestionItem{ + {ID: "ship_date", Header: "Fecha", Prompt: "¿Qué día embarcamos?", Options: []store.QuestionOption{{Label: "Lun 15 sep"}, {Label: "Mar 16 sep"}}, AllowOther: true}, + {ID: "boxes", Header: "Cajas", Prompt: "¿Cuántas cajas?"}, + }, + } +} + +func messageByID(messages []store.Message, id string) *store.Message { + for index := range messages { + if messages[index].ID == id { + return &messages[index] + } + } + return nil +} + +func newFixture(t *testing.T, st store.Store) fixture { + t.Helper() + ctx := context.Background() + var f fixture + var err error + if f.owner, err = st.EnsureBootstrap(ctx, "Owner", "question-owner@example.com"); err != nil { + t.Fatal(err) + } + workspaces, err := st.ListWorkspaces(ctx, f.owner.ID) + if err != nil || len(workspaces) != 1 { + t.Fatalf("bootstrap workspaces = %#v, %v", workspaces, err) + } + f.workspace = workspaces[0] + channels, err := st.ListChannels(ctx, f.workspace.ID, f.owner.ID) + if err != nil || len(channels) == 0 { + t.Fatalf("bootstrap channels = %#v, %v", channels, err) + } + f.channel = channels[0] + if f.member, err = st.CreateUser(ctx, store.CreateUserInput{DisplayName: "Member", Email: "question-member@example.com"}); err != nil { + t.Fatal(err) + } + if err := st.AddWorkspaceMember(ctx, f.workspace.ID, f.member.ID, store.WorkspaceRoleMember); err != nil { + t.Fatal(err) + } + for _, name := range []string{"Question Bot", "Other Bot"} { + bot, _, err := st.CreateBot(ctx, store.CreateBotInput{WorkspaceID: f.workspace.ID, DisplayName: name, Scopes: []string{"bot:write"}, CreatedBy: f.owner.ID}) + if err != nil { + t.Fatal(err) + } + if name == "Question Bot" { + f.bot = bot + } else { + f.otherBot = bot + } + } + return f +} + +// QuestionReplayAndVersionGuards checks retries around deadlines and reopens, +// activity rows, and direct-message visibility in reconciliation. +func QuestionReplayAndVersionGuards(t *testing.T, st store.Store) { + t.Helper() + ctx := context.Background() + f := newFixture(t, st) + + // An identical retry after the deadline window shrinks still finds the original. + nearDeadline := questionSpec() + nearDeadline.ExpiresAt = time.Now().Add(store.MinQuestionLifetime + 1500*time.Millisecond).UTC().Format(time.RFC3339Nano) + original, _, err := st.CreateMessage(ctx, store.CreateMessageInput{ChannelID: f.channel.ID, AuthorID: f.bot.ID, Body: "retry me", Nonce: "question-near-deadline", Question: &nearDeadline}) + if err != nil { + t.Fatal(err) + } + time.Sleep(2 * time.Second) + replayed, _, err := st.CreateMessage(ctx, store.CreateMessageInput{ChannelID: f.channel.ID, AuthorID: f.bot.ID, Body: "retry me", Nonce: "question-near-deadline", Question: &nearDeadline}) + if err != nil || replayed.ID != original.ID { + t.Fatalf("replay near the deadline = %s, %v; want %s", replayed.ID, err, original.ID) + } + fresh := nearDeadline + if _, _, err := st.CreateMessage(ctx, store.CreateMessageInput{ChannelID: f.channel.ID, AuthorID: f.bot.ID, Body: "too late", Nonce: "question-too-late", Question: &fresh}); !errors.Is(err, store.ErrInvalidQuestion) { + t.Fatalf("new question inside the minimum lifetime error = %v", err) + } + + activitySpec := questionSpec() + if _, _, err := st.CreateMessage(ctx, store.CreateMessageInput{ChannelID: f.channel.ID, AuthorID: f.bot.ID, Body: "running a tool", Kind: store.MessageKindAgentTool, TurnID: "turn_question", Question: &activitySpec}); !errors.Is(err, store.ErrInvalidQuestion) { + t.Fatalf("question on an activity row error = %v", err) + } + + spec := questionSpec() + message, _, err := st.CreateMessage(ctx, store.CreateMessageInput{ChannelID: f.channel.ID, AuthorID: f.bot.ID, Body: "versioned", Question: &spec}) + if err != nil { + t.Fatal(err) + } + answers := map[string][]string{"ship_date": {"Otra fecha"}, "boxes": {"12"}} + stale := int64(7) + if _, _, err := st.AnswerQuestion(ctx, store.AnswerQuestionInput{MessageID: message.ID, UserID: f.member.ID, Answers: answers, Nonce: "versioned-answer", ExpectedVersion: &stale}); !errors.Is(err, store.ErrQuestionConflict) { + t.Fatalf("answer to a version the person did not see error = %v", err) + } + seen := int64(1) + if _, _, err := st.AnswerQuestion(ctx, store.AnswerQuestionInput{MessageID: message.ID, UserID: f.member.ID, Answers: answers, Nonce: "versioned-answer", ExpectedVersion: &seen}); err != nil { + t.Fatal(err) + } + if _, _, err := st.ResolveQuestion(ctx, store.ResolveQuestionInput{MessageID: message.ID, BotUserID: f.bot.ID, Status: store.QuestionStatusOpen, Note: "Pick a listed date"}); err != nil { + t.Fatal(err) + } + // The first response was lost and the bot reopened; the retry must not resubmit it. + if _, _, err := st.AnswerQuestion(ctx, store.AnswerQuestionInput{MessageID: message.ID, UserID: f.member.ID, Answers: answers, Nonce: "versioned-answer", ExpectedVersion: &seen}); !errors.Is(err, store.ErrQuestionConflict) { + t.Fatalf("retry after reopen error = %v", err) + } + if current, err := st.GetMessage(ctx, message.ID, f.member.ID); err != nil || current.Question.Status != store.QuestionStatusOpen || current.Question.Response != nil { + t.Fatalf("reopened question after a stale retry = %#v, %v", current.Question, err) + } + + conversation, err := st.CreateDirectConversation(ctx, store.CreateDirectConversationInput{WorkspaceID: f.workspace.ID, UserID: f.bot.ID, MemberIDs: []string{f.member.ID}}) + if err != nil { + t.Fatal(err) + } + directSpec := questionSpec() + direct, _, err := st.CreateDirectMessage(ctx, store.CreateDirectMessageInput{ConversationID: conversation.ID, AuthorID: f.bot.ID, Body: "private", Question: &directSpec}) + if err != nil { + t.Fatal(err) + } + withDirect, err := st.ListBotUnresolvedQuestions(ctx, f.workspace.ID, f.bot.ID, "", true, 50) + if err != nil { + t.Fatal(err) + } + withoutDirect, err := st.ListBotUnresolvedQuestions(ctx, f.workspace.ID, f.bot.ID, "", false, 50) + if err != nil { + t.Fatal(err) + } + if messageInQuestions(withDirect, direct.ID) == nil || messageInQuestions(withoutDirect, direct.ID) != nil || messageInQuestions(withoutDirect, message.ID) == nil { + t.Fatalf("direct questions with scope = %#v, without = %#v", withDirect, withoutDirect) + } +} + +func messageInQuestions(questions []store.BotQuestion, messageID string) *store.BotQuestion { + for index := range questions { + if questions[index].MessageID == messageID { + return &questions[index] + } + } + return nil +} diff --git a/apps/api/internal/store/sqlite/dms.go b/apps/api/internal/store/sqlite/dms.go index df525b062..8c88bd109 100644 --- a/apps/api/internal/store/sqlite/dms.go +++ b/apps/api/internal/store/sqlite/dms.go @@ -237,6 +237,10 @@ func (s *Store) CreateDirectMessage(ctx context.Context, input store.CreateDirec if err := requireDirectActivePeerTx(ctx, tx, input.ConversationID, input.AuthorID); err != nil { return store.Message{}, store.Event{}, err } + question, err := prepareQuestion(input.Question) + if err != nil { + return store.Message{}, store.Event{}, err + } seq, err := qtx.DirectNextSeq(ctx, input.ConversationID) if err != nil { return store.Message{}, store.Event{}, err @@ -263,11 +267,19 @@ func (s *Store) CreateDirectMessage(ctx context.Context, input store.CreateDirec 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 } + if matches, err := questionReplayMatchesTx(ctx, tx, existing.ID, question); err != nil { + return store.Message{}, store.Event{}, err + } else if !matches { + return store.Message{}, store.Event{}, store.ErrClientNonceConflict + } existing, err = hydrateMessageCreateReplay(ctx, tx, existing, input.UploadID) return existing, store.Event{}, err } else if !errors.Is(err, sql.ErrNoRows) { return store.Message{}, store.Event{}, err } + if err := validateNewQuestionTx(ctx, tx, workspaceID, "", input.ConversationID, kind, question); err != nil { + return store.Message{}, store.Event{}, err + } if quotedID != "" { snap, authorID, err := resolveQuoteRefTx(ctx, tx, quotedID, quoteScope{kind: "dm", directConversationID: input.ConversationID}) if err != nil { @@ -314,6 +326,10 @@ func (s *Store) CreateDirectMessage(ctx context.Context, input store.CreateDirec } attachedUpload = &upload } + createdQuestion, err := insertMessageQuestionTx(ctx, tx, id, workspaceID, input.AuthorID, createdAt, question) + if err != nil { + return store.Message{}, store.Event{}, err + } if err := qtx.UnhideDirectConversationForMembers(ctx, input.ConversationID); err != nil { return store.Message{}, store.Event{}, err } @@ -328,7 +344,7 @@ func (s *Store) CreateDirectMessage(ctx context.Context, input store.CreateDirec if input.TurnID != "" { dmEventFields["turn_id"] = input.TurnID } - event, err := insertEventWithRecipients(ctx, tx, workspaceID, "", "message.created", &seq, eventPayload(ctx, dmEventFields, nonce), recipients) + event, err := insertEventWithRecipientsAndMentions(ctx, tx, workspaceID, "", "message.created", &seq, eventPayload(ctx, dmEventFields, nonce), recipients, mergeMentionedUserIDs(nil, question)) if err != nil { return store.Message{}, store.Event{}, err } @@ -339,6 +355,7 @@ func (s *Store) CreateDirectMessage(ctx context.Context, input store.CreateDirec if attachedUpload != nil { msg.Attachments = []store.Upload{*attachedUpload} } + msg.Question = createdQuestion return msg, event, tx.Commit() } diff --git a/apps/api/internal/store/sqlite/message_pages.go b/apps/api/internal/store/sqlite/message_pages.go index e180fe17a..063b17b92 100644 --- a/apps/api/internal/store/sqlite/message_pages.go +++ b/apps/api/internal/store/sqlite/message_pages.go @@ -81,6 +81,10 @@ func (s *Store) listMessagePage(ctx context.Context, scope messagePageScope, req if err != nil { return store.MessagePage{}, err } + messages, err = s.hydrateQuestions(ctx, messages) + if err != nil { + return store.MessagePage{}, err + } messages, err = s.hydrateThreadStates(ctx, messages) if err != nil { return store.MessagePage{}, err diff --git a/apps/api/internal/store/sqlite/migrations/0043_message_questions.sql b/apps/api/internal/store/sqlite/migrations/0043_message_questions.sql new file mode 100644 index 000000000..fd43d6924 --- /dev/null +++ b/apps/api/internal/store/sqlite/migrations/0043_message_questions.sql @@ -0,0 +1,28 @@ +-- Structured questions that bots attach to their messages. The question itself +-- is immutable; the first valid answer and the bot's recorded outcome live on +-- the same row so each transition is one conditional update. +CREATE TABLE IF NOT EXISTS message_questions ( + message_id TEXT PRIMARY KEY REFERENCES messages(id) ON DELETE CASCADE, + workspace_id TEXT NOT NULL REFERENCES workspaces(id) ON DELETE CASCADE, + bot_user_id TEXT NOT NULL REFERENCES users(id), + external_id TEXT NOT NULL DEFAULT '', + spec_json TEXT NOT NULL, + responder_user_ids TEXT NOT NULL DEFAULT '[]', + allow_skip INTEGER NOT NULL DEFAULT 1 CHECK (allow_skip IN (0, 1)), + expires_at TEXT NOT NULL, + status TEXT NOT NULL DEFAULT 'open' + CHECK (status IN ('open', 'submitted', 'answered', 'cancelled', 'expired', 'failed')), + response_json TEXT NOT NULL DEFAULT '', + response_source TEXT NOT NULL DEFAULT '', + responded_by TEXT REFERENCES users(id) ON DELETE SET NULL, + responded_at TEXT, + response_nonce TEXT NOT NULL DEFAULT '', + note TEXT NOT NULL DEFAULT '', + resolved_at TEXT, + version INTEGER NOT NULL DEFAULT 1, + created_at TEXT NOT NULL, + updated_at TEXT NOT NULL +); + +CREATE INDEX IF NOT EXISTS idx_message_questions_bot_status + ON message_questions(workspace_id, bot_user_id, status, message_id); diff --git a/apps/api/internal/store/sqlite/pins.go b/apps/api/internal/store/sqlite/pins.go index 14ba7fd59..2b220547d 100644 --- a/apps/api/internal/store/sqlite/pins.go +++ b/apps/api/internal/store/sqlite/pins.go @@ -183,6 +183,11 @@ func (s *Store) ListPinnedMessages(ctx context.Context, channelID, userID string return nil, err } + msgs, err = s.hydrateQuestions(ctx, msgs) + if err != nil { + return nil, err + } + msgs, err = s.hydrateReactions(ctx, userID, msgs) if err != nil { return nil, err diff --git a/apps/api/internal/store/sqlite/questions.go b/apps/api/internal/store/sqlite/questions.go new file mode 100644 index 000000000..19aecdc90 --- /dev/null +++ b/apps/api/internal/store/sqlite/questions.go @@ -0,0 +1,531 @@ +package sqlite + +import ( + "context" + "database/sql" + "encoding/json" + "errors" + "fmt" + "slices" + "strings" + "time" + "unicode/utf8" + + "github.com/openclaw/clickclack/apps/api/internal/store" + "github.com/openclaw/clickclack/apps/api/internal/store/sqlite/storedb" +) + +// questionDocument is the immutable part of a question stored in spec_json. +type questionDocument struct { + Title string `json:"title,omitempty"` + Items []store.QuestionItem `json:"items"` +} + +type storedQuestionResponse struct { + Answers map[string][]string `json:"answers,omitempty"` + Skipped bool `json:"skipped,omitempty"` +} + +// prepareQuestion normalizes a bot's question. It reads nothing, so a nonce +// replay can compare it before any rule that depends on the current time or +// membership. +func prepareQuestion(input *store.QuestionSpec) (*store.QuestionSpec, error) { + if input == nil { + return nil, nil + } + spec, err := store.NormalizeQuestionSpec(*input) + if err != nil { + return nil, err + } + return &spec, nil +} + +// validateNewQuestionTx checks what a newly created question must satisfy now: +// an ordinary message, its deadline, and responders who can read the conversation. +func validateNewQuestionTx(ctx context.Context, tx *sql.Tx, workspaceID, channelID, directConversationID, kind string, spec *store.QuestionSpec) error { + if spec == nil { + return nil + } + if store.IsActivityMessageKind(kind) { + return fmt.Errorf("%w: %s", store.ErrInvalidQuestion, "questions attach only to ordinary messages") + } + if err := store.ValidateQuestionLifetime(*spec, time.Now()); err != nil { + return err + } + for _, userID := range spec.ResponderUserIDs { + var one int + query := ` + SELECT 1 + FROM workspace_members wm + JOIN users u ON u.id = wm.user_id + WHERE wm.workspace_id = ? AND wm.user_id = ? AND u.kind = 'human'` + args := []any{workspaceID, userID} + if directConversationID != "" { + query += ` AND EXISTS (SELECT 1 FROM direct_conversation_members dcm WHERE dcm.conversation_id = ? AND dcm.user_id = wm.user_id)` + args = append(args, directConversationID) + } + err := tx.QueryRowContext(ctx, query, args...).Scan(&one) + if err == nil && directConversationID == "" { + err = requireGuestChannelAccessTx(ctx, tx, workspaceID, channelID, userID) + } + if errors.Is(err, sql.ErrNoRows) || errors.Is(err, store.ErrModerationRestricted) { + return fmt.Errorf("%w: %s", store.ErrInvalidQuestion, "responder_user_ids must be people who can read this conversation") + } else if err != nil { + return err + } + } + return nil +} + +func insertMessageQuestionTx(ctx context.Context, tx *sql.Tx, messageID, workspaceID, botUserID, createdAt string, spec *store.QuestionSpec) (*store.MessageQuestion, error) { + if spec == nil { + return nil, nil + } + document, err := json.Marshal(questionDocument{Title: spec.Title, Items: spec.Items}) + if err != nil { + return nil, err + } + responders, err := json.Marshal(nonNilStrings(spec.ResponderUserIDs)) + if err != nil { + return nil, err + } + allowSkip := int64(0) + if spec.AllowSkip == nil || *spec.AllowSkip { + allowSkip = 1 + } + if err := storedb.New(tx).InsertMessageQuestion(ctx, storedb.InsertMessageQuestionParams{ + MessageID: messageID, + WorkspaceID: workspaceID, + BotUserID: botUserID, + ExternalID: spec.ExternalID, + SpecJson: string(document), + ResponderUserIds: string(responders), + AllowSkip: allowSkip, + ExpiresAt: spec.ExpiresAt, + CreatedAt: createdAt, + }); err != nil { + return nil, err + } + return &store.MessageQuestion{ + Status: store.QuestionStatusOpen, + ExternalID: spec.ExternalID, + Title: spec.Title, + ExpiresAt: spec.ExpiresAt, + AllowSkip: allowSkip == 1, + Items: spec.Items, + ResponderUserIDs: spec.ResponderUserIDs, + Version: 1, + }, nil +} + +// questionReplayMatchesTx reports whether a nonce replay repeats the same question. +func questionReplayMatchesTx(ctx context.Context, tx *sql.Tx, messageID string, spec *store.QuestionSpec) (bool, error) { + row, err := storedb.New(tx).GetMessageQuestion(ctx, messageID) + if errors.Is(err, sql.ErrNoRows) { + return spec == nil, nil + } + if err != nil || spec == nil { + return false, err + } + document, err := json.Marshal(questionDocument{Title: spec.Title, Items: spec.Items}) + if err != nil { + return false, err + } + var responders []string + if err := json.Unmarshal([]byte(row.ResponderUserIds), &responders); err != nil { + return false, err + } + allowSkip := spec.AllowSkip == nil || *spec.AllowSkip + return row.SpecJson == string(document) && row.ExternalID == spec.ExternalID && row.ExpiresAt == spec.ExpiresAt && + (row.AllowSkip == 1) == allowSkip && slices.Equal(responders, nonNilStrings(spec.ResponderUserIDs)), nil +} + +func (s *Store) hydrateQuestions(ctx context.Context, messages []store.Message) ([]store.Message, error) { + return hydrateQuestions(ctx, s.db, messages) +} + +func hydrateQuestions(ctx context.Context, db storedb.DBTX, messages []store.Message) ([]store.Message, error) { + indexByID := make(map[string]int, len(messages)) + args := make([]any, 0, len(messages)) + for index, message := range messages { + if message.DeletedAt != nil { + continue + } + indexByID[message.ID] = index + args = append(args, message.ID) + } + if len(args) == 0 { + return messages, nil + } + rows, err := db.QueryContext(ctx, ` + SELECT q.message_id, q.external_id, q.spec_json, q.responder_user_ids, q.allow_skip, q.expires_at, q.status, + q.response_json, q.response_source, q.responded_at, q.note, q.resolved_at, q.version, + u.id, u.kind, u.owner_user_id, u.display_name, u.handle, u.avatar_url, u.created_at + FROM message_questions q + LEFT JOIN users u ON u.id = q.responded_by + WHERE q.message_id IN (`+strings.TrimRight(strings.Repeat("?,", len(args)), ",")+`)`, args...) + if err != nil { + return nil, err + } + defer rows.Close() + now := time.Now() + for rows.Next() { + var row storedb.MessageQuestion + var responderID, responderKind, responderOwner, responderName, responderHandle, responderAvatar, responderCreated sql.NullString + if err := rows.Scan(&row.MessageID, &row.ExternalID, &row.SpecJson, &row.ResponderUserIds, &row.AllowSkip, &row.ExpiresAt, &row.Status, + &row.ResponseJson, &row.ResponseSource, &row.RespondedAt, &row.Note, &row.ResolvedAt, &row.Version, + &responderID, &responderKind, &responderOwner, &responderName, &responderHandle, &responderAvatar, &responderCreated); err != nil { + return nil, err + } + var responder *store.User + if responderID.Valid { + user := storeUserFromDB(responderID.String, responderKind.String, responderOwner, responderName.String, responderHandle.String, responderAvatar.String, responderCreated.String) + responder = &user + } + question, err := messageQuestionFromRow(row, responder, now) + if err != nil { + return nil, err + } + if index, ok := indexByID[row.MessageID]; ok { + messages[index].Question = &question + } + } + return messages, rows.Err() +} + +func messageQuestionFromRow(row storedb.MessageQuestion, responder *store.User, now time.Time) (store.MessageQuestion, error) { + var document questionDocument + if err := json.Unmarshal([]byte(row.SpecJson), &document); err != nil { + return store.MessageQuestion{}, err + } + question := store.MessageQuestion{ + Status: store.EffectiveQuestionStatus(row.Status, row.ExpiresAt, now), + ExternalID: row.ExternalID, + Title: document.Title, + ExpiresAt: row.ExpiresAt, + AllowSkip: row.AllowSkip == 1, + Items: document.Items, + Note: row.Note, + ResolvedAt: ptrFromNull(row.ResolvedAt), + Version: row.Version, + } + if err := json.Unmarshal([]byte(row.ResponderUserIds), &question.ResponderUserIDs); err != nil { + return store.MessageQuestion{}, err + } + if len(question.ResponderUserIDs) == 0 { + question.ResponderUserIDs = nil + } + if row.ResponseJson != "" { + var response storedQuestionResponse + if err := json.Unmarshal([]byte(row.ResponseJson), &response); err != nil { + return store.MessageQuestion{}, err + } + question.Response = &store.QuestionResponse{ + Answers: response.Answers, + Skipped: response.Skipped, + Source: row.ResponseSource, + Responder: responder, + RespondedAt: row.RespondedAt.String, + } + } + return question, nil +} + +func (s *Store) AnswerQuestion(ctx context.Context, input store.AnswerQuestionInput) (store.Message, []store.Event, error) { + nonce, err := store.NormalizeClientNonce(input.Nonce) + if err != nil { + return store.Message{}, nil, err + } + tx, err := s.db.BeginTx(ctx, nil) + if err != nil { + return store.Message{}, nil, err + } + defer tx.Rollback() + qtx := s.q.WithTx(tx) + msg, err := getMessageTx(ctx, tx, input.MessageID) + if err != nil { + return store.Message{}, nil, err + } + if msg.DeletedAt != nil { + return store.Message{}, nil, sql.ErrNoRows + } + row, err := qtx.GetMessageQuestion(ctx, msg.ID) + if err != nil { + return store.Message{}, nil, err + } + if err := requireMessageAccessTx(ctx, tx, msg, input.UserID); err != nil { + return store.Message{}, nil, err + } + if msg.DirectConversationID != "" { + err = requireCanSendDirectTx(ctx, tx, msg.WorkspaceID, input.UserID) + } else { + err = requireNoModerationBlockTx(ctx, tx, msg.WorkspaceID, input.UserID) + } + if err != nil { + return store.Message{}, nil, err + } + var responders []string + if err := json.Unmarshal([]byte(row.ResponderUserIds), &responders); err != nil { + return store.Message{}, nil, err + } + if len(responders) > 0 && !slices.Contains(responders, input.UserID) { + return store.Message{}, nil, store.ErrQuestionResponderRequired + } + if nonce != "" && row.ResponseNonce == nonce && row.RespondedBy.String == input.UserID { + // Release the transaction first: reads below use the store's connection pool. + if err := tx.Rollback(); err != nil { + return store.Message{}, nil, err + } + message, err := s.hydrateQuestionMessage(ctx, msg, input.UserID) + return message, nil, err + } + if input.ExpectedVersion != nil && *input.ExpectedVersion != row.Version { + return store.Message{}, nil, store.ErrQuestionConflict + } + if store.EffectiveQuestionStatus(row.Status, row.ExpiresAt, time.Now()) != store.QuestionStatusOpen { + return store.Message{}, nil, store.ErrQuestionClosed + } + response := storedQuestionResponse{Skipped: input.Skip} + if input.Skip { + if row.AllowSkip != 1 { + return store.Message{}, nil, fmt.Errorf("%w: %s", store.ErrInvalidQuestion, "this question cannot be skipped") + } + } else { + var document questionDocument + if err := json.Unmarshal([]byte(row.SpecJson), &document); err != nil { + return store.Message{}, nil, err + } + if response.Answers, err = store.NormalizeQuestionAnswers(document.Items, input.Answers); err != nil { + return store.Message{}, nil, err + } + } + responseJSON, err := json.Marshal(response) + if err != nil { + return store.Message{}, nil, err + } + respondedAt := now() + affected, err := qtx.SubmitMessageQuestionResponse(ctx, storedb.SubmitMessageQuestionResponseParams{ + ResponseJson: string(responseJSON), + RespondedBy: sqlText(input.UserID), + RespondedAt: sqlText(respondedAt), + ResponseNonce: nonce, + MessageID: msg.ID, + Version: row.Version, + }) + if err != nil { + return store.Message{}, nil, err + } + if affected == 0 { + return store.Message{}, nil, store.ErrQuestionClosed + } + events, err := insertQuestionEventsTx(ctx, tx, msg, map[string]any{ + "external_id": row.ExternalID, + "responder_id": input.UserID, + "skipped": input.Skip, + "version": row.Version + 1, + }) + if err != nil { + return store.Message{}, nil, err + } + if err := tx.Commit(); err != nil { + return store.Message{}, nil, err + } + message, err := s.hydrateQuestionMessage(ctx, msg, input.UserID) + return message, events, err +} + +func (s *Store) ResolveQuestion(ctx context.Context, input store.ResolveQuestionInput) (store.Message, store.Event, error) { + status := strings.TrimSpace(input.Status) + note := strings.TrimSpace(input.Note) + if utf8.RuneCountInString(note) > store.MaxQuestionNoteLength { + return store.Message{}, store.Event{}, fmt.Errorf("%w: %s", store.ErrInvalidQuestion, "note is too long") + } + tx, err := s.db.BeginTx(ctx, nil) + if err != nil { + return store.Message{}, store.Event{}, err + } + defer tx.Rollback() + qtx := s.q.WithTx(tx) + msg, err := getMessageTx(ctx, tx, input.MessageID) + if err != nil { + return store.Message{}, store.Event{}, err + } + if msg.DeletedAt != nil { + return store.Message{}, store.Event{}, sql.ErrNoRows + } + row, err := qtx.GetMessageQuestion(ctx, msg.ID) + if err != nil { + return store.Message{}, store.Event{}, err + } + if row.BotUserID != input.BotUserID { + return store.Message{}, store.Event{}, store.ErrQuestionAuthorRequired + } + if input.ExpectedVersion != nil && *input.ExpectedVersion != row.Version { + return store.Message{}, store.Event{}, store.ErrQuestionConflict + } + if row.Status == status && store.IsTerminalQuestionStatus(status) { + if err := tx.Rollback(); err != nil { + return store.Message{}, store.Event{}, err + } + message, err := s.hydrateQuestionMessage(ctx, msg, input.BotUserID) + return message, store.Event{}, err + } + if !store.QuestionResolutionAllowed(row.Status, status) { + return store.Message{}, store.Event{}, store.ErrQuestionConflict + } + params := storedb.ResolveMessageQuestionParams{ + Status: status, + Note: note, + ResponseJson: row.ResponseJson, + ResponseSource: row.ResponseSource, + RespondedBy: row.RespondedBy, + RespondedAt: row.RespondedAt, + ResponseNonce: row.ResponseNonce, + UpdatedAt: now(), + MessageID: msg.ID, + Version: row.Version, + } + switch { + case status == store.QuestionStatusOpen: + if note == "" { + return store.Message{}, store.Event{}, fmt.Errorf("%w: %s", store.ErrInvalidQuestion, "reopening a question requires a note") + } + params.ResponseJson, params.ResponseSource, params.ResponseNonce = "", "", "" + params.RespondedBy, params.RespondedAt = sql.NullString{}, sql.NullString{} + case row.Status == store.QuestionStatusOpen && status == store.QuestionStatusAnswered && len(input.Answers) > 0: + var document questionDocument + if err := json.Unmarshal([]byte(row.SpecJson), &document); err != nil { + return store.Message{}, store.Event{}, err + } + answers, err := store.NormalizeQuestionAnswers(document.Items, input.Answers) + if err != nil { + return store.Message{}, store.Event{}, err + } + responseJSON, err := json.Marshal(storedQuestionResponse{Answers: answers}) + if err != nil { + return store.Message{}, store.Event{}, err + } + params.ResponseJson = string(responseJSON) + params.ResponseSource = store.QuestionResponseSourceExternal + params.RespondedAt = sqlText(params.UpdatedAt) + } + if store.IsTerminalQuestionStatus(status) { + params.ResolvedAt = sqlText(params.UpdatedAt) + } + affected, err := qtx.ResolveMessageQuestion(ctx, params) + if err != nil { + return store.Message{}, store.Event{}, err + } + if affected == 0 { + return store.Message{}, store.Event{}, store.ErrQuestionConflict + } + events, err := insertQuestionEventsTx(ctx, tx, msg, nil) + if err != nil { + return store.Message{}, store.Event{}, err + } + if err := tx.Commit(); err != nil { + return store.Message{}, store.Event{}, err + } + message, err := s.hydrateQuestionMessage(ctx, msg, input.BotUserID) + return message, events[0], err +} + +// insertQuestionEventsTx appends message.updated so every client refreshes the +// card and, for a submitted answer, question.submitted for the authoring bot. +// Neither payload carries answer content. +func insertQuestionEventsTx(ctx context.Context, tx *sql.Tx, msg store.Message, submitted map[string]any) ([]store.Event, error) { + recipients, err := eventRecipientsForMessageTx(ctx, tx, msg) + if err != nil { + return nil, err + } + updated, err := insertEventWithRecipients(ctx, tx, msg.WorkspaceID, msg.ChannelID, "message.updated", msg.ChannelSeq, messagePayload(msg), recipients) + if err != nil || submitted == nil { + return []store.Event{updated}, err + } + submitted["message_id"] = msg.ID + submitted["root_message_id"] = msg.ThreadRootID + if msg.DirectConversationID != "" { + submitted["direct_conversation_id"] = msg.DirectConversationID + } + event, err := insertEventWithRecipients(ctx, tx, msg.WorkspaceID, msg.ChannelID, "question.submitted", msg.ChannelSeq, submitted, recipients) + if err != nil { + return nil, err + } + return []store.Event{updated, event}, nil +} + +func (s *Store) hydrateQuestionMessage(ctx context.Context, msg store.Message, userID string) (store.Message, error) { + fresh, err := getMessage(ctx, s.db, msg.ID) + if err != nil { + return store.Message{}, err + } + messages, err := s.hydrateAttachments(ctx, []store.Message{fresh}) + if err != nil { + return store.Message{}, err + } + if messages, err = s.hydrateReactions(ctx, userID, messages); err != nil { + return store.Message{}, err + } + if messages, err = s.hydrateQuestions(ctx, messages); err != nil { + return store.Message{}, err + } + return messages[0], nil +} + +func (s *Store) ListBotUnresolvedQuestions(ctx context.Context, workspaceID, botUserID, afterMessageID string, includeDirect bool, limit int) ([]store.BotQuestion, error) { + // One row past the largest page lets callers detect a next page. + if limit <= 0 || limit > store.MaxBotQuestionPageSize+1 { + limit = store.MaxBotQuestionPageSize + 1 + } + directFlag := int64(0) + if includeDirect { + directFlag = 1 + } + rows, err := s.q.ListBotUnresolvedQuestions(ctx, storedb.ListBotUnresolvedQuestionsParams{ + WorkspaceID: workspaceID, + BotUserID: botUserID, + AfterMessageID: afterMessageID, + IncludeDirect: directFlag, + RowLimit: int64(limit), + }) + if err != nil { + return nil, err + } + questions := make([]store.BotQuestion, 0, len(rows)) + now := time.Now() + for _, row := range rows { + questions = append(questions, store.BotQuestion{ + MessageID: row.MessageID, + WorkspaceID: row.WorkspaceID, + ChannelID: row.ChannelID, + DirectConversationID: row.DirectConversationID, + ThreadRootID: row.ThreadRootID, + ExternalID: row.ExternalID, + Status: store.EffectiveQuestionStatus(row.Status, row.ExpiresAt, now), + ExpiresAt: row.ExpiresAt, + Version: row.Version, + }) + } + return questions, nil +} + +func nonNilStrings(values []string) []string { + if values == nil { + return []string{} + } + return values +} + +// mergeMentionedUserIDs adds a question's responders to the resolved mentions so +// mention-only channels still alert the people who must answer. +func mergeMentionedUserIDs(mentioned []string, spec *store.QuestionSpec) []string { + if spec == nil { + return mentioned + } + for _, userID := range spec.ResponderUserIDs { + if !slices.Contains(mentioned, userID) { + mentioned = append(mentioned, userID) + } + } + return mentioned +} diff --git a/apps/api/internal/store/sqlite/questions_test.go b/apps/api/internal/store/sqlite/questions_test.go new file mode 100644 index 000000000..1e433e689 --- /dev/null +++ b/apps/api/internal/store/sqlite/questions_test.go @@ -0,0 +1,43 @@ +package sqlite + +import ( + "context" + "testing" + "time" + + "github.com/openclaw/clickclack/apps/api/internal/store/questiontest" +) + +func TestQuestionLifecycle(t *testing.T) { + t.Parallel() + questiontest.QuestionLifecycle(t, newTestStore(t)) +} + +func TestQuestionSkipReopenAndExternalAnswers(t *testing.T) { + t.Parallel() + questiontest.QuestionSkipReopenAndExternalAnswers(t, newTestStore(t)) +} + +func TestQuestionExpiryAndAccess(t *testing.T) { + t.Parallel() + st := newTestStore(t) + questiontest.QuestionExpiryAndAccess(t, st, questiontest.Hooks{ + ExpireQuestion: func(t *testing.T, messageID string) { + t.Helper() + past := time.Now().Add(-time.Minute).UTC().Format(time.RFC3339Nano) + if _, err := st.db.ExecContext(context.Background(), `UPDATE message_questions SET expires_at = ? WHERE message_id = ?`, past, messageID); err != nil { + t.Fatal(err) + } + }, + }) +} + +func TestQuestionConcurrentAnswers(t *testing.T) { + t.Parallel() + questiontest.QuestionConcurrentAnswers(t, newTestStore(t)) +} + +func TestQuestionReplayAndVersionGuards(t *testing.T) { + t.Parallel() + questiontest.QuestionReplayAndVersionGuards(t, newTestStore(t)) +} diff --git a/apps/api/internal/store/sqlite/sqlc/queries.sql b/apps/api/internal/store/sqlite/sqlc/queries.sql index 5f3131b59..107b180d2 100644 --- a/apps/api/internal/store/sqlite/sqlc/queries.sql +++ b/apps/api/internal/store/sqlite/sqlc/queries.sql @@ -1820,3 +1820,65 @@ FROM sessions WHERE user_id = sqlc.arg(user_id) AND token_hash = sqlc.arg(token_hash) AND revoked_at IS NULL; + +-- name: InsertMessageQuestion :exec +INSERT INTO message_questions ( + message_id, workspace_id, bot_user_id, external_id, spec_json, responder_user_ids, + allow_skip, expires_at, created_at, updated_at +) VALUES ( + sqlc.arg(message_id), sqlc.arg(workspace_id), sqlc.arg(bot_user_id), sqlc.arg(external_id), + sqlc.arg(spec_json), sqlc.arg(responder_user_ids), sqlc.arg(allow_skip), sqlc.arg(expires_at), + sqlc.arg(created_at), sqlc.arg(created_at) +); + +-- name: GetMessageQuestion :one +SELECT message_id, workspace_id, bot_user_id, external_id, spec_json, responder_user_ids, allow_skip, + expires_at, status, response_json, response_source, responded_by, responded_at, response_nonce, + note, resolved_at, version, created_at, updated_at +FROM message_questions +WHERE message_id = sqlc.arg(message_id); + +-- name: SubmitMessageQuestionResponse :execrows +UPDATE message_questions +SET status = 'submitted', + note = '', + response_json = sqlc.arg(response_json), + response_source = 'clickclack', + responded_by = sqlc.arg(responded_by), + responded_at = sqlc.arg(responded_at), + response_nonce = sqlc.arg(response_nonce), + version = version + 1, + updated_at = sqlc.arg(responded_at) +WHERE message_id = sqlc.arg(message_id) + AND status = 'open' + AND version = sqlc.arg(version); + +-- name: ResolveMessageQuestion :execrows +UPDATE message_questions +SET status = sqlc.arg(status), + note = sqlc.arg(note), + response_json = sqlc.arg(response_json), + response_source = sqlc.arg(response_source), + responded_by = sqlc.narg(responded_by), + responded_at = sqlc.narg(responded_at), + response_nonce = sqlc.arg(response_nonce), + resolved_at = sqlc.narg(resolved_at), + version = version + 1, + updated_at = sqlc.arg(updated_at) +WHERE message_id = sqlc.arg(message_id) + AND version = sqlc.arg(version); + +-- name: ListBotUnresolvedQuestions :many +SELECT q.message_id, q.workspace_id, COALESCE(m.channel_id, '') AS channel_id, + COALESCE(m.direct_conversation_id, '') AS direct_conversation_id, m.thread_root_id, + q.external_id, q.status, q.expires_at, q.version +FROM message_questions q +JOIN messages m ON m.id = q.message_id +WHERE q.workspace_id = sqlc.arg(workspace_id) + AND q.bot_user_id = sqlc.arg(bot_user_id) + AND q.status IN ('open', 'submitted') + AND m.deleted_at IS NULL + AND (CAST(sqlc.arg(include_direct) AS INTEGER) = 1 OR m.direct_conversation_id IS NULL) + AND q.message_id > sqlc.arg(after_message_id) +ORDER BY q.message_id +LIMIT sqlc.arg(row_limit); diff --git a/apps/api/internal/store/sqlite/sqlc/schema.sql b/apps/api/internal/store/sqlite/sqlc/schema.sql index f517a403d..a5434eca9 100644 --- a/apps/api/internal/store/sqlite/sqlc/schema.sql +++ b/apps/api/internal/store/sqlite/sqlc/schema.sql @@ -168,6 +168,32 @@ CREATE UNIQUE INDEX idx_messages_direct_unique_seq ON messages(direct_conversati CREATE UNIQUE INDEX idx_messages_thread_unique_seq ON messages(thread_root_id, thread_seq) WHERE parent_message_id IS NOT NULL AND thread_seq IS NOT NULL; +CREATE TABLE message_questions ( + message_id TEXT PRIMARY KEY REFERENCES messages(id) ON DELETE CASCADE, + workspace_id TEXT NOT NULL REFERENCES workspaces(id) ON DELETE CASCADE, + bot_user_id TEXT NOT NULL REFERENCES users(id), + external_id TEXT NOT NULL DEFAULT '', + spec_json TEXT NOT NULL, + responder_user_ids TEXT NOT NULL DEFAULT '[]', + allow_skip INTEGER NOT NULL DEFAULT 1 CHECK (allow_skip IN (0, 1)), + expires_at TEXT NOT NULL, + status TEXT NOT NULL DEFAULT 'open' + CHECK (status IN ('open', 'submitted', 'answered', 'cancelled', 'expired', 'failed')), + response_json TEXT NOT NULL DEFAULT '', + response_source TEXT NOT NULL DEFAULT '', + responded_by TEXT REFERENCES users(id) ON DELETE SET NULL, + responded_at TEXT, + response_nonce TEXT NOT NULL DEFAULT '', + note TEXT NOT NULL DEFAULT '', + resolved_at TEXT, + version INTEGER NOT NULL DEFAULT 1, + created_at TEXT NOT NULL, + updated_at TEXT NOT NULL +); + +CREATE INDEX idx_message_questions_bot_status + ON message_questions(workspace_id, bot_user_id, status, message_id); + CREATE TABLE thread_state ( root_message_id TEXT PRIMARY KEY REFERENCES messages(id) ON DELETE CASCADE, reply_count INTEGER NOT NULL DEFAULT 0, diff --git a/apps/api/internal/store/sqlite/sqlite.go b/apps/api/internal/store/sqlite/sqlite.go index cefff3167..c7bce1696 100644 --- a/apps/api/internal/store/sqlite/sqlite.go +++ b/apps/api/internal/store/sqlite/sqlite.go @@ -609,6 +609,10 @@ func (s *Store) GetMessage(ctx context.Context, messageID, userID string) (store if err != nil { return store.Message{}, err } + messages, err = s.hydrateQuestions(ctx, messages) + if err != nil { + return store.Message{}, err + } return messages[0], nil } @@ -664,6 +668,10 @@ func (s *Store) CreateMessage(ctx context.Context, input store.CreateMessageInpu if err := requireTopicTx(ctx, tx, workspaceID, input.ChannelID, input.TopicID); err != nil { return store.Message{}, store.Event{}, err } + question, err := prepareQuestion(input.Question) + if err != nil { + return store.Message{}, store.Event{}, err + } seq, err := qtx.ChannelNextSeq(ctx, input.ChannelID) if err != nil { return store.Message{}, store.Event{}, err @@ -690,6 +698,11 @@ func (s *Store) CreateMessage(ctx context.Context, input store.CreateMessageInpu 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 matches, err := questionReplayMatchesTx(ctx, tx, existing.ID, question); err != nil { + return store.Message{}, store.Event{}, err + } else if !matches { + return store.Message{}, store.Event{}, store.ErrClientNonceConflict + } if err := requireMessageAccessTx(ctx, tx, existing, input.AuthorID); err != nil { return store.Message{}, store.Event{}, err } @@ -698,6 +711,9 @@ func (s *Store) CreateMessage(ctx context.Context, input store.CreateMessageInpu } else if !errors.Is(err, sql.ErrNoRows) { return store.Message{}, store.Event{}, err } + if err := validateNewQuestionTx(ctx, tx, workspaceID, input.ChannelID, "", kind, question); err != nil { + return store.Message{}, store.Event{}, err + } if err := requireCanPostTx(ctx, tx, workspaceID, input.ChannelID, input.AuthorID); err != nil { return store.Message{}, store.Event{}, err } @@ -751,6 +767,10 @@ func (s *Store) CreateMessage(ctx context.Context, input store.CreateMessageInpu } attachedUpload = &upload } + createdQuestion, err := insertMessageQuestionTx(ctx, tx, id, workspaceID, input.AuthorID, createdAt, question) + if err != nil { + return store.Message{}, store.Event{}, err + } eventFields := map[string]string{"message_id": id, "author_id": input.AuthorID} if input.TopicID != "" { eventFields["topic_id"] = input.TopicID @@ -765,6 +785,7 @@ func (s *Store) CreateMessage(ctx context.Context, input store.CreateMessageInpu if err != nil { return store.Message{}, store.Event{}, err } + mentionedIDs = mergeMentionedUserIDs(mentionedIDs, question) event, err := insertEventWithRecipientsAndMentions(ctx, tx, workspaceID, input.ChannelID, "message.created", &seq, eventPayload(ctx, eventFields, nonce), nil, mentionedIDs) if err != nil { return store.Message{}, store.Event{}, err @@ -776,6 +797,7 @@ func (s *Store) CreateMessage(ctx context.Context, input store.CreateMessageInpu if attachedUpload != nil { msg.Attachments = []store.Upload{*attachedUpload} } + msg.Question = createdQuestion return msg, event, tx.Commit() } @@ -803,6 +825,10 @@ func (s *Store) CreateThreadReply(ctx context.Context, input store.CreateThreadR if err != nil { return store.Message{}, store.ThreadState{}, nil, err } + question, err := prepareQuestion(input.Question) + if err != nil { + return store.Message{}, store.ThreadState{}, nil, err + } seq, err := qtx.ThreadNextSeq(ctx, storedb.ThreadNextSeqParams{ThreadRootID: root.ID, ParentMessageID: sqlText(root.ID)}) if err != nil { return store.Message{}, store.ThreadState{}, nil, err @@ -825,6 +851,16 @@ func (s *Store) CreateThreadReply(ctx context.Context, input store.CreateThreadR if existing.ThreadRootID != root.ID || existing.ParentMessageID == nil || *existing.ParentMessageID != root.ID || existing.Body != body || !sameQuotedMessageID(existing, quotedID) { return store.Message{}, store.ThreadState{}, nil, store.ErrClientNonceConflict } + if matches, err := questionReplayMatchesTx(ctx, tx, existing.ID, question); err != nil { + return store.Message{}, store.ThreadState{}, nil, err + } else if !matches { + return store.Message{}, store.ThreadState{}, nil, store.ErrClientNonceConflict + } + if hydrated, err := hydrateQuestions(ctx, tx, []store.Message{existing}); err != nil { + return store.Message{}, store.ThreadState{}, nil, err + } else { + existing = hydrated[0] + } stateRow, err := qtx.GetThreadState(ctx, root.ID) if err != nil { return store.Message{}, store.ThreadState{}, nil, err @@ -833,6 +869,9 @@ func (s *Store) CreateThreadReply(ctx context.Context, input store.CreateThreadR } else if !errors.Is(err, sql.ErrNoRows) { return store.Message{}, store.ThreadState{}, nil, err } + if err := validateNewQuestionTx(ctx, tx, root.WorkspaceID, root.ChannelID, root.DirectConversationID, "", question); err != nil { + return store.Message{}, store.ThreadState{}, nil, err + } if root.DirectConversationID != "" { if err := requireCanSendDirectTx(ctx, tx, root.WorkspaceID, input.AuthorID); err != nil { return store.Message{}, store.ThreadState{}, nil, err @@ -890,6 +929,10 @@ func (s *Store) CreateThreadReply(ctx context.Context, input store.CreateThreadR if err != nil { return store.Message{}, store.ThreadState{}, nil, err } + createdQuestion, err := insertMessageQuestionTx(ctx, tx, id, root.WorkspaceID, input.AuthorID, createdAt, question) + if err != nil { + return store.Message{}, store.ThreadState{}, nil, err + } replyPayload := eventPayload(ctx, map[string]string{ "message_id": id, "root_message_id": root.ID, @@ -908,6 +951,7 @@ func (s *Store) CreateThreadReply(ctx context.Context, input store.CreateThreadR if err != nil { return store.Message{}, store.ThreadState{}, nil, err } + mentionedIDs = mergeMentionedUserIDs(mentionedIDs, question) // recipients is a privacy boundary for direct conversations, not a thread // follower list. Mention metadata must never grant a workspace user access // to a DM they are not already participating in. @@ -923,6 +967,7 @@ func (s *Store) CreateThreadReply(ctx context.Context, input store.CreateThreadR if err != nil { return store.Message{}, store.ThreadState{}, nil, err } + msg.Question = createdQuestion return msg, state, []store.Event{replyEvent, stateEvent}, tx.Commit() } diff --git a/apps/api/internal/store/sqlite/storedb/models.go b/apps/api/internal/store/sqlite/storedb/models.go index 92cf3f499..0d8e7ed68 100644 --- a/apps/api/internal/store/sqlite/storedb/models.go +++ b/apps/api/internal/store/sqlite/storedb/models.go @@ -276,6 +276,28 @@ type MessageAttachment struct { CreatedAt string `json:"created_at"` } +type MessageQuestion struct { + MessageID string `json:"message_id"` + WorkspaceID string `json:"workspace_id"` + BotUserID string `json:"bot_user_id"` + ExternalID string `json:"external_id"` + SpecJson string `json:"spec_json"` + ResponderUserIds string `json:"responder_user_ids"` + AllowSkip int64 `json:"allow_skip"` + ExpiresAt string `json:"expires_at"` + Status string `json:"status"` + ResponseJson string `json:"response_json"` + ResponseSource string `json:"response_source"` + RespondedBy sql.NullString `json:"responded_by"` + RespondedAt sql.NullString `json:"responded_at"` + ResponseNonce string `json:"response_nonce"` + Note string `json:"note"` + ResolvedAt sql.NullString `json:"resolved_at"` + Version int64 `json:"version"` + CreatedAt string `json:"created_at"` + UpdatedAt string `json:"updated_at"` +} + type OauthTransaction struct { ID string `json:"id"` StateHash string `json:"state_hash"` diff --git a/apps/api/internal/store/sqlite/storedb/queries.sql.go b/apps/api/internal/store/sqlite/storedb/queries.sql.go index ef6923470..097cd815c 100644 --- a/apps/api/internal/store/sqlite/storedb/queries.sql.go +++ b/apps/api/internal/store/sqlite/storedb/queries.sql.go @@ -1632,6 +1632,41 @@ func (q *Queries) GetMessageIDByAuthorNonce(ctx context.Context, arg GetMessageI return id, err } +const getMessageQuestion = `-- name: GetMessageQuestion :one +SELECT message_id, workspace_id, bot_user_id, external_id, spec_json, responder_user_ids, allow_skip, + expires_at, status, response_json, response_source, responded_by, responded_at, response_nonce, + note, resolved_at, version, created_at, updated_at +FROM message_questions +WHERE message_id = ?1 +` + +func (q *Queries) GetMessageQuestion(ctx context.Context, messageID string) (MessageQuestion, error) { + row := q.db.QueryRowContext(ctx, getMessageQuestion, messageID) + var i MessageQuestion + err := row.Scan( + &i.MessageID, + &i.WorkspaceID, + &i.BotUserID, + &i.ExternalID, + &i.SpecJson, + &i.ResponderUserIds, + &i.AllowSkip, + &i.ExpiresAt, + &i.Status, + &i.ResponseJson, + &i.ResponseSource, + &i.RespondedBy, + &i.RespondedAt, + &i.ResponseNonce, + &i.Note, + &i.ResolvedAt, + &i.Version, + &i.CreatedAt, + &i.UpdatedAt, + ) + return i, err +} + const getNotificationSettings = `-- name: GetNotificationSettings :one SELECT pushover_enabled, pushover_user_key FROM user_notification_settings @@ -2711,6 +2746,44 @@ func (q *Queries) InsertMagicLink(ctx context.Context, arg InsertMagicLinkParams return err } +const insertMessageQuestion = `-- name: InsertMessageQuestion :exec +INSERT INTO message_questions ( + message_id, workspace_id, bot_user_id, external_id, spec_json, responder_user_ids, + allow_skip, expires_at, created_at, updated_at +) VALUES ( + ?1, ?2, ?3, ?4, + ?5, ?6, ?7, ?8, + ?9, ?9 +) +` + +type InsertMessageQuestionParams struct { + MessageID string `json:"message_id"` + WorkspaceID string `json:"workspace_id"` + BotUserID string `json:"bot_user_id"` + ExternalID string `json:"external_id"` + SpecJson string `json:"spec_json"` + ResponderUserIds string `json:"responder_user_ids"` + AllowSkip int64 `json:"allow_skip"` + ExpiresAt string `json:"expires_at"` + CreatedAt string `json:"created_at"` +} + +func (q *Queries) InsertMessageQuestion(ctx context.Context, arg InsertMessageQuestionParams) error { + _, err := q.db.ExecContext(ctx, insertMessageQuestion, + arg.MessageID, + arg.WorkspaceID, + arg.BotUserID, + arg.ExternalID, + arg.SpecJson, + arg.ResponderUserIds, + arg.AllowSkip, + arg.ExpiresAt, + arg.CreatedAt, + ) + return err +} + const insertOAuthTransaction = `-- name: InsertOAuthTransaction :exec INSERT INTO oauth_transactions ( id, state_hash, browser_binding_hash, mode, pkce_verifier, desktop_challenge, @@ -3286,6 +3359,81 @@ func (q *Queries) ListBotHistoricalWorkspaces(ctx context.Context, botUserID str return items, nil } +const listBotUnresolvedQuestions = `-- name: ListBotUnresolvedQuestions :many +SELECT q.message_id, q.workspace_id, COALESCE(m.channel_id, '') AS channel_id, + COALESCE(m.direct_conversation_id, '') AS direct_conversation_id, m.thread_root_id, + q.external_id, q.status, q.expires_at, q.version +FROM message_questions q +JOIN messages m ON m.id = q.message_id +WHERE q.workspace_id = ?1 + AND q.bot_user_id = ?2 + AND q.status IN ('open', 'submitted') + AND m.deleted_at IS NULL + AND (CAST(?3 AS INTEGER) = 1 OR m.direct_conversation_id IS NULL) + AND q.message_id > ?4 +ORDER BY q.message_id +LIMIT ?5 +` + +type ListBotUnresolvedQuestionsParams struct { + WorkspaceID string `json:"workspace_id"` + BotUserID string `json:"bot_user_id"` + IncludeDirect int64 `json:"include_direct"` + AfterMessageID string `json:"after_message_id"` + RowLimit int64 `json:"row_limit"` +} + +type ListBotUnresolvedQuestionsRow struct { + MessageID string `json:"message_id"` + WorkspaceID string `json:"workspace_id"` + ChannelID string `json:"channel_id"` + DirectConversationID string `json:"direct_conversation_id"` + ThreadRootID string `json:"thread_root_id"` + ExternalID string `json:"external_id"` + Status string `json:"status"` + ExpiresAt string `json:"expires_at"` + Version int64 `json:"version"` +} + +func (q *Queries) ListBotUnresolvedQuestions(ctx context.Context, arg ListBotUnresolvedQuestionsParams) ([]ListBotUnresolvedQuestionsRow, error) { + rows, err := q.db.QueryContext(ctx, listBotUnresolvedQuestions, + arg.WorkspaceID, + arg.BotUserID, + arg.IncludeDirect, + arg.AfterMessageID, + arg.RowLimit, + ) + if err != nil { + return nil, err + } + defer rows.Close() + var items []ListBotUnresolvedQuestionsRow + for rows.Next() { + var i ListBotUnresolvedQuestionsRow + if err := rows.Scan( + &i.MessageID, + &i.WorkspaceID, + &i.ChannelID, + &i.DirectConversationID, + &i.ThreadRootID, + &i.ExternalID, + &i.Status, + &i.ExpiresAt, + &i.Version, + ); err != nil { + return nil, err + } + items = append(items, i) + } + if err := rows.Close(); err != nil { + return nil, err + } + if err := rows.Err(); err != nil { + return nil, err + } + return items, nil +} + const listBotsOwnedBy = `-- name: ListBotsOwnedBy :many SELECT u.id, @@ -5399,6 +5547,56 @@ func (q *Queries) RequireWorkspaceOwner(ctx context.Context, arg RequireWorkspac return role, err } +const resolveMessageQuestion = `-- name: ResolveMessageQuestion :execrows +UPDATE message_questions +SET status = ?1, + note = ?2, + response_json = ?3, + response_source = ?4, + responded_by = ?5, + responded_at = ?6, + response_nonce = ?7, + resolved_at = ?8, + version = version + 1, + updated_at = ?9 +WHERE message_id = ?10 + AND version = ?11 +` + +type ResolveMessageQuestionParams struct { + Status string `json:"status"` + Note string `json:"note"` + ResponseJson string `json:"response_json"` + ResponseSource string `json:"response_source"` + RespondedBy sql.NullString `json:"responded_by"` + RespondedAt sql.NullString `json:"responded_at"` + ResponseNonce string `json:"response_nonce"` + ResolvedAt sql.NullString `json:"resolved_at"` + UpdatedAt string `json:"updated_at"` + MessageID string `json:"message_id"` + Version int64 `json:"version"` +} + +func (q *Queries) ResolveMessageQuestion(ctx context.Context, arg ResolveMessageQuestionParams) (int64, error) { + result, err := q.db.ExecContext(ctx, resolveMessageQuestion, + arg.Status, + arg.Note, + arg.ResponseJson, + arg.ResponseSource, + arg.RespondedBy, + arg.RespondedAt, + arg.ResponseNonce, + arg.ResolvedAt, + arg.UpdatedAt, + arg.MessageID, + arg.Version, + ) + if err != nil { + return 0, err + } + return result.RowsAffected() +} + const retireBotUser = `-- name: RetireBotUser :execrows UPDATE users SET handle = '' @@ -5594,6 +5792,46 @@ func (q *Queries) SetUserAvatarIfEmpty(ctx context.Context, arg SetUserAvatarIfE return err } +const submitMessageQuestionResponse = `-- name: SubmitMessageQuestionResponse :execrows +UPDATE message_questions +SET status = 'submitted', + note = '', + response_json = ?1, + response_source = 'clickclack', + responded_by = ?2, + responded_at = ?3, + response_nonce = ?4, + version = version + 1, + updated_at = ?3 +WHERE message_id = ?5 + AND status = 'open' + AND version = ?6 +` + +type SubmitMessageQuestionResponseParams struct { + ResponseJson string `json:"response_json"` + RespondedBy sql.NullString `json:"responded_by"` + RespondedAt sql.NullString `json:"responded_at"` + ResponseNonce string `json:"response_nonce"` + MessageID string `json:"message_id"` + Version int64 `json:"version"` +} + +func (q *Queries) SubmitMessageQuestionResponse(ctx context.Context, arg SubmitMessageQuestionResponseParams) (int64, error) { + result, err := q.db.ExecContext(ctx, submitMessageQuestionResponse, + arg.ResponseJson, + arg.RespondedBy, + arg.RespondedAt, + arg.ResponseNonce, + arg.MessageID, + arg.Version, + ) + if err != nil { + return 0, err + } + return result.RowsAffected() +} + const threadNextSeq = `-- name: ThreadNextSeq :one SELECT CAST(COALESCE(MAX(thread_seq), 0) + 1 AS INTEGER) AS next_seq FROM messages diff --git a/apps/api/internal/store/sqlite/thread_pages.go b/apps/api/internal/store/sqlite/thread_pages.go index 1d1577daf..5befa06cd 100644 --- a/apps/api/internal/store/sqlite/thread_pages.go +++ b/apps/api/internal/store/sqlite/thread_pages.go @@ -78,6 +78,10 @@ func (s *Store) GetThreadPage(ctx context.Context, rootMessageID, userID string, if err != nil { return store.ThreadPage{}, err } + messages, err = s.hydrateQuestions(ctx, messages) + if err != nil { + return store.ThreadPage{}, err + } messages, err = s.hydrateReactions(ctx, userID, messages) if err != nil { return store.ThreadPage{}, err diff --git a/apps/api/internal/store/sqlite/uploads.go b/apps/api/internal/store/sqlite/uploads.go index be3e0c0ed..c8f4c380f 100644 --- a/apps/api/internal/store/sqlite/uploads.go +++ b/apps/api/internal/store/sqlite/uploads.go @@ -283,6 +283,9 @@ func hydrateMessageCreateReplay(ctx context.Context, tx *sql.Tx, message store.M if err != nil { return store.Message{}, err } + if messages, err = hydrateQuestions(ctx, tx, messages); err != nil { + return store.Message{}, err + } message = messages[0] uploadID = strings.TrimSpace(uploadID) if uploadID == "" { diff --git a/apps/api/internal/store/types.go b/apps/api/internal/store/types.go index 982b618fc..73efacedf 100644 --- a/apps/api/internal/store/types.go +++ b/apps/api/internal/store/types.go @@ -328,6 +328,8 @@ type Message struct { // response. Nonce string `json:"nonce,omitempty"` Reactions []ReactionSummary `json:"reactions,omitempty"` + // Question is the structured question a bot attached to this message. + Question *MessageQuestion `json:"question,omitempty"` } type MessagePageRequest struct { @@ -899,6 +901,8 @@ type CreateMessageInput struct { // API layer by AgentActivityWriteScope. Kind string TurnID string + // Question is only accepted from bot tokens; the API layer enforces that. + Question *QuestionSpec } type UpdateMessageInput struct { @@ -918,6 +922,7 @@ type CreateThreadReplyInput struct { Body string QuotedMessageID *string Nonce string + Question *QuestionSpec } type CreateReactionInput struct { @@ -1064,6 +1069,7 @@ type CreateDirectMessageInput struct { UploadID string Kind string TurnID string + Question *QuestionSpec } type Topic struct { @@ -1295,6 +1301,9 @@ type Store interface { CreateThreadReply(ctx context.Context, input CreateThreadReplyInput) (Message, ThreadState, []Event, error) AddReaction(ctx context.Context, input CreateReactionInput) (Event, error) RemoveReaction(ctx context.Context, input CreateReactionInput) (Event, error) + AnswerQuestion(ctx context.Context, input AnswerQuestionInput) (Message, []Event, error) + ResolveQuestion(ctx context.Context, input ResolveQuestionInput) (Message, Event, error) + ListBotUnresolvedQuestions(ctx context.Context, workspaceID, botUserID, afterMessageID string, includeDirect bool, limit int) ([]BotQuestion, error) PinMessage(ctx context.Context, channelID, messageID, userID string) (PinnedMessage, Event, error) UnpinMessage(ctx context.Context, channelID, messageID, userID string) (Event, error) ListPinnedMessages(ctx context.Context, channelID, userID string, limit int) ([]Message, error) diff --git a/apps/api/internal/webassets/dist/200.html b/apps/api/internal/webassets/dist/200.html index c005b693a..4325f97fc 100644 --- a/apps/api/internal/webassets/dist/200.html +++ b/apps/api/internal/webassets/dist/200.html @@ -103,15 +103,15 @@ - + - + - +
@@ -125,7 +125,7 @@ Promise.all([ import("/_app/immutable/entry/start.W_KKVBz4.js"), - import("/_app/immutable/entry/app.CqYZBsX3.js") + import("/_app/immutable/entry/app.Bp9-ZlMx.js") ]).then(([kit, app]) => { kit.start(app, element); }); diff --git a/apps/api/internal/webassets/dist/_app/immutable/assets/0.C7M1Y4Cy.css b/apps/api/internal/webassets/dist/_app/immutable/assets/0.C7M1Y4Cy.css deleted file mode 100644 index 31e36af39..000000000 --- a/apps/api/internal/webassets/dist/_app/immutable/assets/0.C7M1Y4Cy.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+460-52F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Geist Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(./geist-cyrillic-wght-normal.BEAKL7Jp.woff2)format("woff2-variations");unicode-range:U+301,U+400-45F,U+490-491,U+4B0-4B1,U+2116}@font-face{font-family:Geist Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(./geist-vietnamese-wght-normal.6IgcOCM7.woff2)format("woff2-variations");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+300-301,U+303-304,U+308-309,U+323,U+329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Geist Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(./geist-latin-ext-wght-normal.DC-KSUi6.woff2)format("woff2-variations");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Geist Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(./geist-latin-wght-normal.BgDaEnEv.woff2)format("woff2-variations");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Geist Mono Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(./geist-mono-cyrillic-ext-wght-normal.X_5orZeX.woff2)format("woff2-variations");unicode-range:U+460-52F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Geist Mono Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(./geist-mono-cyrillic-wght-normal.DiZS0aHC.woff2)format("woff2-variations");unicode-range:U+301,U+400-45F,U+490-491,U+4B0-4B1,U+2116}@font-face{font-family:Geist Mono Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(./geist-mono-symbols2-wght-normal.CO5SzqOn.woff2)format("woff2-variations");unicode-range:U+2000-2001,U+2004-2008,U+200A,U+23B8-23BD,U+2500-259F}@font-face{font-family:Geist Mono Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(./geist-mono-vietnamese-wght-normal.DadHysG0.woff2)format("woff2-variations");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+300-301,U+303-304,U+308-309,U+323,U+329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Geist Mono Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(./geist-mono-latin-ext-wght-normal.Bwz-egvJ.woff2)format("woff2-variations");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Geist Mono Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(./geist-mono-latin-wght-normal.XN7g48iV.woff2)format("woff2-variations");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Bricolage Grotesque Variable;font-style:normal;font-display:swap;font-weight:200 800;src:url(./bricolage-grotesque-vietnamese-wght-normal.BUzh504Q.woff2)format("woff2-variations");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+300-301,U+303-304,U+308-309,U+323,U+329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Bricolage Grotesque Variable;font-style:normal;font-display:swap;font-weight:200 800;src:url(./bricolage-grotesque-latin-ext-wght-normal.CcLUaPy7.woff2)format("woff2-variations");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Bricolage Grotesque Variable;font-style:normal;font-display:swap;font-weight:200 800;src:url(./bricolage-grotesque-latin-wght-normal.DLoelf7F.woff2)format("woff2-variations");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}:root{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light dark;font-feature-settings:"ss01", "cv11";--font-display:"Bricolage Grotesque Variable", "Geist Variable", ui-sans-serif, system-ui, sans-serif;--font-mono:"Geist Mono Variable", ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;--rail:var(--lightningcss-light,#e2e5ea)var(--lightningcss-dark,#0b0e14);--bg:var(--lightningcss-light,#edeff2)var(--lightningcss-dark,#0e1219);--panel:var(--lightningcss-light,#f8f9fb)var(--lightningcss-dark,#141926);--panel-2:var(--lightningcss-light,#e8ebef)var(--lightningcss-dark,#1b2232);--panel-3:var(--lightningcss-light,#dde1e7)var(--lightningcss-dark,#232c3f);--surface:var(--panel-2);--hover:var(--lightningcss-light,#10151d0d)var(--lightningcss-dark,#d6e4ff0b);--hover-strong:var(--lightningcss-light,#10151d14)var(--lightningcss-dark,#d6e4ff14);--line:var(--lightningcss-light,#10151d1a)var(--lightningcss-dark,#bed2ff17);--line-strong:var(--lightningcss-light,#10151d2b)var(--lightningcss-dark,#bed2ff29);--text:var(--lightningcss-light,#232a35)var(--lightningcss-dark,#dbe2ec);--text-strong:var(--lightningcss-light,#10151d)var(--lightningcss-dark,#f4f7fb);--muted:var(--lightningcss-light,#5d6878)var(--lightningcss-dark,#8a95a8);--muted-2:var(--lightningcss-light,#8b94a3)var(--lightningcss-dark,#5c6577);--accent:var(--lightningcss-light,#0080c4)var(--lightningcss-dark,#41c6ff);--accent-hover:var(--lightningcss-light,#006aa6)var(--lightningcss-dark,#6ad3ff);--accent-contrast:var(--lightningcss-light,#fff)var(--lightningcss-dark,#061420);--accent-2:var(--lightningcss-light,#f56a1d)var(--lightningcss-dark,#ff9550);--accent-soft:var(--lightningcss-light,#0080c421)var(--lightningcss-dark,#41c6ff26);--brand-a:var(--lightningcss-light,#0072b0)var(--lightningcss-dark,#41c6ff);--brand-b:var(--lightningcss-light,#2653e8)var(--lightningcss-dark,#6d8bff);--brand-contrast:var(--lightningcss-light,#fff)var(--lightningcss-dark,#061420);--activity-accent:var(--lightningcss-light,#c07e0a)var(--lightningcss-dark,#e8b23e);--activity-accent-soft:var(--lightningcss-light,#c07e0a17)var(--lightningcss-dark,#e8b23e1a);--delivery-accent:var(--lightningcss-light,#5558d9)var(--lightningcss-dark,#8b8df2);--delivery-accent-soft:var(--lightningcss-light,#5558d90f)var(--lightningcss-dark,#8b8df214);--tool-call-bg:var(--lightningcss-light,#5558d917)var(--lightningcss-dark,#8b8df21f);--tool-call-bg-hover:var(--lightningcss-light,#5558d924)var(--lightningcss-dark,#8b8df22e);--accent-glow:0 0 0 1px color-mix(in srgb, var(--accent) 32%, transparent), 0 8px 30px -12px color-mix(in srgb, var(--accent) 48%, transparent);--success:var(--lightningcss-light,#14876a)var(--lightningcss-dark,#30c48d);--warn:#e8a33e;--danger:var(--lightningcss-light,#d13438)var(--lightningcss-dark,#ff6d68);--scrollbar:var(--lightningcss-light,#10151d2e)var(--lightningcss-dark,#bed2ff1f);--scrollbar-hover:var(--lightningcss-light,#10151d4d)var(--lightningcss-dark,#bed2ff38);--shadow:0 24px 60px -22px var(--lightningcss-light,#10151d4d)var(--lightningcss-dark,#02050ab3);--tooltip-bg:var(--lightningcss-light,#10151d)var(--lightningcss-dark,#2b3448);--tooltip-fg:var(--lightningcss-light,#f0f4fa)var(--lightningcss-dark,#f4f7fb);--key-edge:0 1px 0 var(--line-strong), 0 2px 0 var(--lightningcss-light,#10151d1a)var(--lightningcss-dark,#00000073);--key-edge-pressed:0 1px 0 var(--line-strong);--radius-sm:4px;--radius:6px;--radius-lg:10px;--radius-xl:14px;--safe-area-top:env(safe-area-inset-top,0px);--safe-area-right:env(safe-area-inset-right,0px);--safe-area-bottom:env(safe-area-inset-bottom,0px);--safe-area-left:env(safe-area-inset-left,0px);background:var(--bg);color:var(--text);font-family:Geist Variable,Inter,SF Pro Text,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif}@media (prefers-color-scheme:dark){:root{--lightningcss-light: ;--lightningcss-dark:initial}}:root[data-color-mode=light]{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light}:root[data-color-mode=dark]{--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark}[data-board=ember]{--rail:var(--lightningcss-light,#e9e1d7)var(--lightningcss-dark,#16110d);--bg:var(--lightningcss-light,#f7f3ed)var(--lightningcss-dark,#1a1511);--panel:var(--lightningcss-light,#fffaf2)var(--lightningcss-dark,#211a15);--panel-2:var(--lightningcss-light,#efe7dc)var(--lightningcss-dark,#29211a);--panel-3:var(--lightningcss-light,#e4dbcf)var(--lightningcss-dark,#322820);--hover:var(--lightningcss-light,#1020270d)var(--lightningcss-dark,#fff4eb0b);--hover-strong:var(--lightningcss-light,#10202714)var(--lightningcss-dark,#fff4eb14);--line:var(--lightningcss-light,#1020271a)var(--lightningcss-dark,#ffece014);--line-strong:var(--lightningcss-light,#10202729)var(--lightningcss-dark,#ffece024);--text:var(--lightningcss-light,#22201d)var(--lightningcss-dark,#ece4da);--text-strong:var(--lightningcss-light,#11100e)var(--lightningcss-dark,#fbf6f0);--muted:var(--lightningcss-light,#6f675f)var(--lightningcss-dark,#a4917f);--muted-2:var(--lightningcss-light,#958b80)var(--lightningcss-dark,#6f6152);--accent:var(--lightningcss-light,#c94a32)var(--lightningcss-dark,#f0714c);--accent-hover:var(--lightningcss-light,#b13c26)var(--lightningcss-dark,#ff8560);--accent-contrast:var(--lightningcss-light,#fff)var(--lightningcss-dark,#241009);--accent-2:var(--lightningcss-light,#006d77)var(--lightningcss-dark,#45b8ac);--accent-soft:var(--lightningcss-light,#c94a3224)var(--lightningcss-dark,#f0714c2b);--brand-a:var(--lightningcss-light,#c64b32)var(--lightningcss-dark,#f0714c);--brand-b:var(--lightningcss-light,#c8425a)var(--lightningcss-dark,#d84a63);--brand-contrast:var(--lightningcss-light,#fff)var(--lightningcss-dark,#11100e);--scrollbar:var(--lightningcss-light,#1020272e)var(--lightningcss-dark,#ffece01a);--scrollbar-hover:var(--lightningcss-light,#1020274d)var(--lightningcss-dark,#ffece033);--shadow:0 24px 60px -22px var(--lightningcss-light,#10202752)var(--lightningcss-dark,#080402a6)}[data-board=moss]{--rail:var(--lightningcss-light,#dfe5e0)var(--lightningcss-dark,#0a100d);--bg:var(--lightningcss-light,#ecf0ed)var(--lightningcss-dark,#0e1512);--panel:var(--lightningcss-light,#f7f9f7)var(--lightningcss-dark,#131b16);--panel-2:var(--lightningcss-light,#e6ebe7)var(--lightningcss-dark,#1a241d);--panel-3:var(--lightningcss-light,#dbe2dc)var(--lightningcss-dark,#223026);--hover:var(--lightningcss-light,#0f17120d)var(--lightningcss-dark,#d6ffe40b);--hover-strong:var(--lightningcss-light,#0f171214)var(--lightningcss-dark,#d6ffe414);--line:var(--lightningcss-light,#0f17121a)var(--lightningcss-dark,#c8ffdc17);--line-strong:var(--lightningcss-light,#0f17122b)var(--lightningcss-dark,#c8ffdc29);--text:var(--lightningcss-light,#212b24)var(--lightningcss-dark,#dbe7de);--text-strong:var(--lightningcss-light,#0f1712)var(--lightningcss-dark,#f3faf4);--muted:var(--lightningcss-light,#5c6b60)var(--lightningcss-dark,#8fa295);--muted-2:var(--lightningcss-light,#8a9a8e)var(--lightningcss-dark,#5d6e62);--accent:var(--lightningcss-light,#177a50)var(--lightningcss-dark,#3ddc97);--accent-hover:var(--lightningcss-light,#0f6a44)var(--lightningcss-dark,#63e6ab);--accent-contrast:var(--lightningcss-light,#fff)var(--lightningcss-dark,#05140c);--accent-2:var(--lightningcss-light,#d97f26)var(--lightningcss-dark,#ffab5e);--accent-soft:var(--lightningcss-light,#177a5021)var(--lightningcss-dark,#3ddc9726);--brand-a:var(--lightningcss-light,#177a50)var(--lightningcss-dark,#3ddc97);--brand-b:var(--lightningcss-light,#0e7490)var(--lightningcss-dark,#2bb3a3);--brand-contrast:var(--lightningcss-light,#fff)var(--lightningcss-dark,#05140c);--scrollbar:var(--lightningcss-light,#0f17122e)var(--lightningcss-dark,#c8ffdc1f);--scrollbar-hover:var(--lightningcss-light,#0f17124d)var(--lightningcss-dark,#c8ffdc38)}[data-board=iris]{--rail:var(--lightningcss-light,#e2e2ea)var(--lightningcss-dark,#0d0c15);--bg:var(--lightningcss-light,#eeeef4)var(--lightningcss-dark,#12111c);--panel:var(--lightningcss-light,#f8f8fb)var(--lightningcss-dark,#181726);--panel-2:var(--lightningcss-light,#e9e9f0)var(--lightningcss-dark,#201e33);--panel-3:var(--lightningcss-light,#dedee8)var(--lightningcss-dark,#2a2742);--hover:var(--lightningcss-light,#1213270d)var(--lightningcss-dark,#e0dcff0b);--hover-strong:var(--lightningcss-light,#12132714)var(--lightningcss-dark,#e0dcff14);--line:var(--lightningcss-light,#1213271a)var(--lightningcss-dark,#d2cdff17);--line-strong:var(--lightningcss-light,#1213272b)var(--lightningcss-dark,#d2cdff29);--text:var(--lightningcss-light,#26283a)var(--lightningcss-dark,#e0dff0);--text-strong:var(--lightningcss-light,#121327)var(--lightningcss-dark,#f6f5fd);--muted:var(--lightningcss-light,#61637a)var(--lightningcss-dark,#918fa9);--muted-2:var(--lightningcss-light,#9092a8)var(--lightningcss-dark,#605e78);--accent:var(--lightningcss-light,#7048d9)var(--lightningcss-dark,#a78bfa);--accent-hover:var(--lightningcss-light,#5f39c2)var(--lightningcss-dark,#bda4ff);--accent-contrast:var(--lightningcss-light,#fff)var(--lightningcss-dark,#150f26);--accent-2:var(--lightningcss-light,#d94f8a)var(--lightningcss-dark,#ff8bb3);--accent-soft:var(--lightningcss-light,#7048d921)var(--lightningcss-dark,#a78bfa29);--brand-a:var(--lightningcss-light,#7048d9)var(--lightningcss-dark,#a78bfa);--brand-b:var(--lightningcss-light,#2653e8)var(--lightningcss-dark,#6d8bff);--brand-contrast:var(--lightningcss-light,#fff)var(--lightningcss-dark,#150f26);--scrollbar:var(--lightningcss-light,#1213272e)var(--lightningcss-dark,#d2cdff1f);--scrollbar-hover:var(--lightningcss-light,#1213274d)var(--lightningcss-dark,#d2cdff38)}[data-board=signal]{--rail:var(--lightningcss-light,#e2e5ea)var(--lightningcss-dark,#0b0e14);--bg:var(--lightningcss-light,#edeff2)var(--lightningcss-dark,#0e1219);--panel:var(--lightningcss-light,#f8f9fb)var(--lightningcss-dark,#141926);--panel-2:var(--lightningcss-light,#e8ebef)var(--lightningcss-dark,#1b2232);--panel-3:var(--lightningcss-light,#dde1e7)var(--lightningcss-dark,#232c3f);--hover:var(--lightningcss-light,#10151d0d)var(--lightningcss-dark,#d6e4ff0b);--hover-strong:var(--lightningcss-light,#10151d14)var(--lightningcss-dark,#d6e4ff14);--line:var(--lightningcss-light,#10151d1a)var(--lightningcss-dark,#bed2ff17);--line-strong:var(--lightningcss-light,#10151d2b)var(--lightningcss-dark,#bed2ff29);--text:var(--lightningcss-light,#232a35)var(--lightningcss-dark,#dbe2ec);--text-strong:var(--lightningcss-light,#10151d)var(--lightningcss-dark,#f4f7fb);--muted:var(--lightningcss-light,#5d6878)var(--lightningcss-dark,#8a95a8);--muted-2:var(--lightningcss-light,#8b94a3)var(--lightningcss-dark,#5c6577);--accent:var(--lightningcss-light,#0080c4)var(--lightningcss-dark,#41c6ff);--accent-hover:var(--lightningcss-light,#006aa6)var(--lightningcss-dark,#6ad3ff);--accent-contrast:var(--lightningcss-light,#fff)var(--lightningcss-dark,#061420);--accent-2:var(--lightningcss-light,#f56a1d)var(--lightningcss-dark,#ff9550);--accent-soft:var(--lightningcss-light,#0080c421)var(--lightningcss-dark,#41c6ff26);--brand-a:var(--lightningcss-light,#0072b0)var(--lightningcss-dark,#41c6ff);--brand-b:var(--lightningcss-light,#2653e8)var(--lightningcss-dark,#6d8bff);--brand-contrast:var(--lightningcss-light,#fff)var(--lightningcss-dark,#061420)}*{box-sizing:border-box}html,body{height:100%;margin:0;padding:0}body{background:radial-gradient(1000px 600px at 0% 0%, color-mix(in srgb, var(--accent) 6%, transparent), transparent 60%), radial-gradient(900px 700px at 100% 100%, color-mix(in srgb, var(--delivery-accent) 5%, transparent), transparent 60%), var(--bg);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}button,input,textarea{font:inherit;color:inherit}code,pre,kbd,samp{font-variant-ligatures:none}button{cursor:pointer}input,textarea{background:0 0;border:0;outline:0}::-webkit-scrollbar{width:10px;height:10px}::-webkit-scrollbar-thumb{background:var(--scrollbar);background-clip:content-box;border:2px solid #0000;border-radius:999px}::-webkit-scrollbar-thumb:hover{background:var(--scrollbar-hover);background-clip:content-box}.auth-shell{min-height:100dvh;padding:calc(32px + var(--safe-area-top)) calc(32px + var(--safe-area-right)) calc(32px + var(--safe-area-bottom)) calc(32px + var(--safe-area-left));background:radial-gradient(color-mix(in srgb, var(--text) 6%, transparent) 1px, transparent 1.5px) 0 0 / 18px 18px, radial-gradient(700px 500px at 30% 20%, color-mix(in srgb, var(--brand-a) 14%, transparent), transparent 60%), radial-gradient(700px 500px at 80% 90%, color-mix(in srgb, var(--brand-b) 10%, transparent), transparent 60%), var(--bg);place-items:center;display:grid}.auth-panel{border:1px solid var(--line-strong);border-radius:var(--radius-xl);background:linear-gradient(180deg, #ffffff0a, #fff0) var(--panel);width:min(100%,440px);box-shadow:var(--key-edge), var(--shadow);gap:22px;padding:36px;display:grid}.auth-brand{align-items:center;gap:12px;display:flex}.auth-brand .mark{box-shadow:inset 0 0 0 1px #bed2ff21, var(--key-edge), 0 10px 24px -8px color-mix(in srgb, var(--brand-b) 65%, transparent)}.auth-brand .brand-text strong{color:var(--text-strong);letter-spacing:-.01em;display:block}.auth-brand .brand-text span{color:var(--muted);font-size:12px;display:block}.auth-copy{gap:8px;margin-top:8px;display:grid}.auth-copy h1{letter-spacing:-.02em;color:var(--text-strong);font-size:28px;font-family:var(--font-display);margin:0;font-weight:700}.auth-copy p{color:var(--muted);margin:0;line-height:1.5}.github-login{color:#fff;background:#0d1117;border:1px solid #2b2f36;border-radius:12px;justify-content:center;align-items:center;gap:10px;min-height:46px;font-weight:600;text-decoration:none;transition:transform 80ms,background .12s,border-color .12s;display:inline-flex}.github-login:hover{background:#161b22;border-color:#3f4750;transform:translateY(-1px)}.openclaw-login{min-height:46px;color:var(--text-strong);border:1px solid var(--muted-2);background:0 0;border-radius:12px;justify-content:center;align-items:center;gap:10px;font-weight:600;text-decoration:none;transition:transform 80ms,background .12s,border-color .12s;display:inline-flex}.openclaw-login:hover{background:color-mix(in srgb, var(--text-strong) 6%, transparent);border-color:var(--muted);transform:translateY(-1px)}.auth-form{gap:14px;display:grid}.auth-submit{border:1px solid color-mix(in srgb, var(--accent) 70%, var(--text-strong));background:var(--accent);min-height:46px;color:var(--accent-contrast);cursor:pointer;border-radius:12px;font-weight:700;transition:transform 80ms,background .12s}.auth-submit:hover:not(:disabled){background:var(--accent-hover);transform:translateY(-1px)}.auth-submit:disabled{cursor:default;opacity:.58;transform:none}.auth-submit-quiet{border-color:var(--line-strong);background:var(--panel-2);min-height:38px;color:var(--text)}.auth-submit-quiet:hover:not(:disabled){background:var(--hover)}.auth-divider{color:var(--muted-2);align-items:center;gap:12px;margin:0;font-size:12px;display:flex}.auth-divider:before,.auth-divider:after{content:"";background:var(--line);flex:1;height:1px}.auth-error{border:1px solid color-mix(in srgb, var(--danger) 45%, var(--line));border-radius:var(--radius-sm);background:color-mix(in srgb, var(--danger) 10%, transparent);color:var(--text);margin:0;padding:10px 12px;font-size:13px}.auth-magic summary{cursor:pointer;color:var(--muted);font-size:12px}.auth-magic[open] summary{margin-bottom:12px}.auth-foot{color:var(--muted-2);text-align:center;margin:0;font-size:12px}.shell{grid-template-rows:minmax(0,1fr);grid-template-columns:72px 260px minmax(0,1fr) 0;height:100dvh;min-height:100dvh;transition:grid-template-columns .22s cubic-bezier(.2,.8,.2,1);display:grid;overflow:clip}.shell.thread-open,.shell.search-open{grid-template-columns:72px 260px minmax(0,1fr) minmax(340px,28vw)}.shell.artifact-open{grid-template-columns:72px 260px minmax(0,1fr) minmax(460px,42vw)}.shell.sidebar-collapsed{grid-template-columns:72px 0 minmax(0,1fr) 0}.shell.sidebar-collapsed.thread-open,.shell.sidebar-collapsed.search-open{grid-template-columns:72px 0 minmax(0,1fr) minmax(340px,28vw)}.shell.sidebar-collapsed.artifact-open{grid-template-columns:72px 0 minmax(0,1fr) minmax(460px,42vw)}.shell>.thread,.shell>.search-results,.shell>.artifact-viewer{grid-area:1/4}.shell.desktop-shell{background:radial-gradient(color-mix(in srgb, var(--text) 7%, transparent) 1px, transparent 1.5px) 0 0 / 14px 14px, var(--rail);grid-template-rows:52px minmax(0,1fr)}.desktop-shell>.guild-rail,.desktop-shell>.sidebar{background:0 0;border-right:0}.desktop-shell>.sidebar{grid-template-rows:minmax(0,1fr) auto}@media (width<=820px){.desktop-shell>.guild-rail{background:radial-gradient(color-mix(in srgb, var(--text) 7%, transparent) 1px, transparent 1.5px) 0 0 / 14px 14px, var(--rail);border-right:1px solid var(--line)}.desktop-shell>.sidebar{background:var(--panel);border-right:1px solid var(--line)}}.desktop-shell>.timeline{border-top:1px solid var(--line);border-left:1px solid var(--line);border-top-left-radius:12px}.desktop-shell:not(.thread-open):not(.search-open):not(.artifact-open)>.timeline{border-top-right-radius:12px}.desktop-shell>.thread,.desktop-shell>.search-results,.desktop-shell>.artifact-viewer{border-top:1px solid var(--line);border-top-right-radius:12px}.desktop-shell>.desktop-titlebar{grid-area:1/1/auto/-1}.desktop-shell>.guild-rail,.desktop-shell>.sidebar,.desktop-shell>.timeline,.desktop-shell>.thread,.desktop-shell>.search-results,.desktop-shell>.artifact-viewer{grid-row:2}.desktop-shell .mobile-nav-toggle{display:none}.desktop-auth-titlebar{z-index:10;-webkit-app-region:drag;height:52px;position:fixed;inset:0 0 auto}.desktop-titlebar{z-index:8;-webkit-app-region:drag;-webkit-user-select:none;user-select:none;background:0 0;align-items:center;min-width:0;height:52px;padding:0;display:flex;position:relative}.desktop-titlebar-safe-area{-webkit-app-region:drag;align-items:center;width:100%;min-width:0;height:100%;padding:0 14px;display:flex;position:relative}.desktop-titlebar[data-platform=darwin] .desktop-titlebar-safe-area{padding-left:78px}.desktop-titlebar[data-platform=win32] .desktop-titlebar-safe-area,.desktop-titlebar[data-platform=linux] .desktop-titlebar-safe-area{left:env(titlebar-area-x,0px);width:env(titlebar-area-width,calc(100% - 148px));position:absolute}.desktop-titlebar-leading{-webkit-app-region:no-drag;align-items:center;gap:9px;min-width:0;max-width:max(150px,50% - 300px);display:flex;overflow:hidden}.desktop-titlebar button,.desktop-external-link{color:var(--muted);background:0 0;border:1px solid #0000;place-items:center;display:grid}.desktop-titlebar button:hover,.desktop-external-link:hover{border-color:var(--line);background:var(--hover-strong);color:var(--text-strong)}.desktop-external-link{border-radius:var(--radius-sm);width:28px;height:28px;color:var(--muted);flex:0 0 28px;place-items:center;text-decoration:none;display:grid}.desktop-titlebar-leading>.desktop-sidebar-toggle{border-radius:8px;width:30px;height:30px}.desktop-titlebar-workspace{min-width:36px;max-width:190px;color:var(--text-strong);font-family:var(--font-display);letter-spacing:-.01em;text-overflow:ellipsis;white-space:nowrap;border-radius:8px;flex:0 auto;padding:5px 9px;font-size:13px;font-weight:650;overflow:hidden}.desktop-titlebar-channel{min-width:30px;max-width:230px;color:var(--text-strong);font-family:var(--font-display);letter-spacing:-.01em;text-overflow:ellipsis;white-space:nowrap;flex:0 auto;margin:0;font-size:13px;font-weight:650;overflow:hidden}.desktop-titlebar-channel.with-glyph:first-letter{color:var(--accent);margin-right:1px}.desktop-titlebar-divider{flex:none}.desktop-titlebar-status{color:var(--muted);white-space:nowrap;flex:none;align-items:center;gap:6px;margin-left:auto;font-size:11px;display:inline-flex}.desktop-titlebar-status:before{content:"";background:var(--muted-2);border-radius:50%;width:7px;height:7px;animation:1.6s ease-in-out infinite presence-pulse}.desktop-titlebar-actions{-webkit-app-region:no-drag;flex:none;align-items:center;margin-left:auto;display:flex}.desktop-titlebar-actions button{border-radius:8px;width:30px;height:30px}.desktop-titlebar-actions button:disabled{cursor:wait;opacity:.55}.desktop-titlebar-actions button.active{background:var(--accent-soft);color:var(--accent)}.desktop-titlebar-actions+.desktop-titlebar-status{margin-left:8px}@media (prefers-reduced-motion:reduce){.desktop-titlebar-status:before{animation:none}}.desktop-titlebar-search.search{border-color:var(--line-strong);background:color-mix(in srgb, var(--panel-2) 84%, transparent);-webkit-app-region:no-drag;width:clamp(220px,100vw - 700px,520px);height:32px;position:absolute;left:50%;transform:translate(-50%);box-shadow:inset 0 1px #ffffff09}.desktop-titlebar-search.search:focus-within{border-color:color-mix(in srgb, var(--accent) 66%, var(--line));background:var(--panel-2);box-shadow:0 0 0 3px color-mix(in srgb, var(--accent) 13%, transparent)}.timeline{background:var(--bg);isolation:isolate;flex-direction:column;min-width:0;display:flex;overflow:hidden}.timeline>*{flex-shrink:0;min-width:0}.timeline>.messages{flex:1 1 0;min-height:0}.topbar{border-bottom:1px solid var(--line);background:linear-gradient(180deg, #ffffff05, transparent), var(--bg);align-items:center;gap:14px;min-height:60px;padding:12px 20px;display:flex}.topbar-title{flex:1;align-items:center;gap:10px;min-width:0;display:flex}.topbar-title h1{letter-spacing:-.01em;color:var(--text-strong);font-size:16px;font-weight:650;font-family:var(--font-display);white-space:nowrap;text-overflow:ellipsis;margin:0;overflow:hidden}.topbar-title h1.with-glyph:first-letter{color:var(--accent);margin-right:1px}.topbar-divider{background:var(--line-strong);width:1px;height:18px;margin:0 6px}.topbar-meta{color:var(--muted);white-space:nowrap;text-overflow:ellipsis;margin:0;font-size:12px;overflow:hidden}.search{border-radius:var(--radius);background:var(--panel);border:1px solid var(--line);width:min(280px,30vw);height:34px;color:var(--muted);align-items:center;gap:8px;padding:0 10px;transition:border-color .12s,background .12s;display:flex}.search:focus-within{border-color:var(--accent);background:var(--panel-2);color:var(--text)}.search input{min-width:0;height:100%;color:var(--text);flex:1}.search input::placeholder{color:var(--muted)}.search-clear{background:var(--panel-3);width:18px;height:18px;color:var(--muted);border:0;border-radius:50%;place-items:center;font-size:14px;line-height:1;display:grid}.search-clear:hover{background:var(--accent);color:var(--accent-contrast)}.search-submit{background:var(--accent-soft);height:22px;color:var(--accent);font-family:var(--font-mono);letter-spacing:.06em;text-transform:uppercase;border:0;border-radius:5px;padding:0 8px;font-size:10px;font-weight:600}.search-submit:hover{background:var(--accent);color:var(--accent-contrast)}.topbar-actions{align-items:center;gap:6px;display:inline-flex}.topbar-actions button,.topbar-actions a{border:1px solid var(--line-strong);border-radius:var(--radius);background:var(--panel);width:32px;height:32px;color:var(--muted);box-shadow:var(--key-edge);place-items:center;text-decoration:none;transition:background .12s,color .12s,border-color .12s,box-shadow .12s,transform 80ms;display:grid}.topbar-actions button:hover,.topbar-actions a:hover,.topbar-actions button.active{background:var(--accent-soft);border-color:color-mix(in srgb, var(--accent) 55%, var(--line-strong));color:var(--accent)}.topbar-actions button:active,.topbar-actions a:active{box-shadow:var(--key-edge-pressed);transform:translateY(1px)}.notif-toggle{width:28px;height:28px;color:var(--muted);cursor:pointer;background:0 0;border:0;border-radius:6px;justify-content:center;align-items:center;margin-left:4px;display:inline-flex}.notif-toggle:hover{background:var(--accent-soft);color:var(--accent)}@keyframes pulse{0%,to{opacity:1}50%{opacity:.5}}.search-results{border-left:1px solid var(--line);background:var(--panel);opacity:1;grid-template-rows:auto auto minmax(0,1fr);min-width:0;transition:opacity .18s,transform .22s cubic-bezier(.2,.8,.2,1);display:grid;overflow:hidden;transform:translate(0)}.search-results.covered{opacity:0;pointer-events:none}.search-results-head{border-bottom:1px solid var(--line);background:linear-gradient(180deg, #ffffff05, transparent), var(--panel);justify-content:space-between;align-items:center;min-height:60px;padding:10px 16px;display:flex}.search-results-head>div{min-width:0}.search-results-head p{color:var(--muted);font-family:var(--font-mono);letter-spacing:0;text-transform:uppercase;margin:0 0 2px;font-size:10px;font-weight:600}.search-results-head strong{color:var(--text-strong);text-overflow:ellipsis;white-space:nowrap;font-size:14px;display:block;overflow:hidden}.search-results-head button{background:var(--panel-2);width:30px;height:30px;color:var(--muted);border:0;border-radius:50%;flex:none;place-items:center;font-size:19px;line-height:1;display:grid}.search-results-head button:hover{background:var(--hover);color:var(--text)}.search-results-summary{color:var(--muted);padding:12px 16px 8px;font-size:12px;font-weight:600}.search-results-scroll{min-height:0;padding:0 8px 16px;overflow-y:auto}.search-result-list{margin:0;padding:0;list-style:none}.search-result{color:var(--text);border-radius:var(--radius);text-align:left;background:0 0;border:0;align-items:flex-start;gap:10px;width:100%;padding:10px 8px;display:flex}.search-result:hover{background:var(--hover)}.search-result.is-active{background:color-mix(in srgb, var(--accent) 10%, transparent)}.search-result:focus-visible,.search-results-head button:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}.search-result .dm-avatar{width:30px;height:30px;font-size:13px}.search-result-body{flex-direction:column;flex:1;gap:2px;min-width:0;display:flex}.search-result-meta{align-items:baseline;gap:8px;min-width:0;display:flex}.search-result-meta strong{color:var(--text-strong);text-overflow:ellipsis;white-space:nowrap;font-size:13px;overflow:hidden}.search-result-handle{color:var(--muted);text-overflow:ellipsis;white-space:nowrap;font-size:11px;overflow:hidden}.search-result-meta time{color:var(--muted);flex:none;margin-left:auto;font-size:11px}.search-result-snippet{color:var(--muted);-webkit-line-clamp:3;-webkit-box-orient:vertical;line-height:1.45;display:-webkit-box;overflow:hidden}.search-result-snippet mark{background:color-mix(in srgb, var(--accent) 22%, transparent);color:var(--text-strong);border-radius:2px;font-weight:650}.search-result-context{min-width:0;color:var(--muted-2);align-items:center;gap:10px;margin-top:1px;font-size:11px;display:flex}.search-result-context:empty{display:none}.search-result-where{text-overflow:ellipsis;white-space:nowrap;font-weight:600;overflow:hidden}.search-result-thread{color:var(--accent);flex:none;align-items:center;gap:4px;font-weight:600;display:inline-flex}.search-load-more{border:1px solid var(--line-strong);border-radius:var(--radius);background:var(--panel-2);width:calc(100% - 16px);color:var(--text);margin:8px auto 0;padding:8px 12px;font-size:12px;font-weight:600;display:block}.search-load-more:hover:not(:disabled){background:var(--hover)}.search-load-more:disabled{color:var(--muted)}.search-load-more:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}.search-end{color:var(--muted-2);text-align:center;padding:14px 8px 4px;font-size:11px}.search-foot-error{border:1px solid color-mix(in srgb, var(--danger) 40%, transparent);border-radius:var(--radius);background:color-mix(in srgb, var(--danger) 8%, transparent);color:var(--text);justify-content:space-between;align-items:center;gap:10px;margin:8px 8px 0;padding:8px 12px;font-size:12px;display:flex}.search-foot-error p{min-width:0;margin:0}.search-foot-error button{border:1px solid var(--line-strong);border-radius:var(--radius);background:var(--panel-2);color:var(--text);flex:none;padding:4px 10px;font-size:12px;font-weight:600}.search-foot-error button:hover{background:var(--hover)}.search-state{color:var(--muted);text-align:center;justify-items:center;padding:56px 24px;display:grid}.search-state-icon{border:1px solid var(--line-strong);background:var(--panel-2);width:44px;height:44px;color:var(--muted-2);border-radius:50%;place-items:center;margin-bottom:14px;font-size:23px;display:grid}.search-state strong{color:var(--text-strong);font-size:14px}.search-state p{margin:5px 0 0;font-size:12px}.search-state-loading{grid-template-columns:repeat(3,7px);justify-content:center;gap:6px}.search-state-loading span{background:var(--accent);border-radius:50%;width:7px;height:7px;animation:1.2s ease-in-out infinite pulse}.search-state-loading span:nth-child(2){animation-delay:.12s}.search-state-loading span:nth-child(3){animation-delay:.24s}.guild-rail{background:radial-gradient(color-mix(in srgb, var(--text) 7%, transparent) 1px, transparent 1.5px) 0 0 / 14px 14px, var(--rail);border-right:1px solid var(--line);flex-direction:column;align-items:center;gap:8px;padding:14px 0;display:flex;position:relative}.guild-rail .guild{background:var(--panel);width:48px;height:48px;color:var(--text);border:1px solid var(--line-strong);letter-spacing:-.02em;box-shadow:var(--key-edge);border-radius:12px;place-items:center;font-size:14px;font-weight:700;text-decoration:none;transition:border-color .12s,background .12s,transform .12s,box-shadow .12s;display:grid;position:relative}.guild-rail .guild:hover{border-color:color-mix(in srgb, var(--accent) 55%, var(--line-strong));color:var(--accent);box-shadow:var(--key-edge), 0 6px 16px -8px color-mix(in srgb, var(--accent) 45%, transparent);transform:translateY(-1px)}.guild-rail .guild:active{box-shadow:var(--key-edge-pressed);transform:translateY(1px)}.guild-rail .guild.home{background:linear-gradient(135deg, var(--brand-a), var(--brand-b));border-color:color-mix(in srgb, var(--brand-b) 55%, var(--line-strong));color:var(--brand-contrast);font-weight:800;font-family:var(--font-display)}.guild-rail .guild.home:hover{color:var(--brand-contrast);transform:translateY(-1px)}.guild-rail .guild.home>span{text-overflow:ellipsis;white-space:nowrap;max-width:100%;padding:0 4px;overflow:hidden}.guild-rail .guild.home.home--mark{border-color:color-mix(in srgb, #41c6ff 35%, var(--line-strong));background:#141926;padding:0}.guild-rail .guild.home.home--mark .keystroke-mark{border-radius:inherit;width:100%;height:100%}.guild-rail .guild.home:active{box-shadow:var(--key-edge-pressed);transform:translateY(1px)}.guild-rail .guild__image{border-radius:inherit;object-fit:cover;width:100%;height:100%;display:block}.guild-rail .guild.add{color:var(--success);border:1px dashed color-mix(in srgb, var(--success) 45%, transparent);background:0 0}.guild-rail .guild.add:hover{background:color-mix(in srgb, var(--success) 14%, transparent);color:var(--success);border-style:solid;border-color:var(--success)}.guild-divider{background:var(--line-strong);width:36px;height:1px;margin:4px 0}.guild-list{flex-direction:column;flex:auto;align-items:center;gap:8px;min-height:0;display:flex;overflow-y:auto}.guild-wrap{position:relative}.guild-wrap:before{content:"";background:var(--accent);opacity:0;border-radius:0 4px 4px 0;width:4px;height:28px;transition:opacity .14s,transform .14s;position:absolute;top:50%;left:-14px;transform:translateY(-50%)scaleY(.2)}.guild-wrap:hover:before{opacity:.6;transform:translateY(-50%)scaleY(.5)}.guild-wrap.active:before{opacity:1;transform:translateY(-50%)scaleY(1)}.guild-wrap.active .guild{background:var(--accent);border-color:color-mix(in srgb, var(--accent) 70%, var(--text-strong));color:var(--accent-contrast)}.guild-create{background:var(--panel);border:1px solid var(--line-strong);border-radius:var(--radius);box-shadow:var(--shadow);z-index:20;margin-left:8px;padding:8px;position:absolute;top:14px;left:100%}.guild-create .profile-status{max-width:200px}.guild-create input{border-radius:var(--radius-sm);background:var(--panel-2);width:200px;height:32px;color:var(--text);padding:0 10px}.sidebar{background:var(--panel);border-right:1px solid var(--line);grid-template-rows:auto minmax(0,1fr) auto;min-width:0;transition:opacity .16s,transform .22s cubic-bezier(.2,.8,.2,1);display:grid;overflow:hidden}.sidebar-collapsed .sidebar{opacity:0;pointer-events:none;transform:translate(-14px)}.workspace-header{border-bottom:1px solid var(--line);justify-content:space-between;align-items:center;gap:6px;min-height:60px;padding:14px 16px;display:flex}.workspace-header-icon{object-fit:cover;background:var(--panel-2);border-radius:8px;flex:none;width:28px;height:28px}.workspace-header-actions{flex-shrink:0;align-items:center;gap:4px;display:flex}.workspace-menu{min-width:0;color:inherit;text-align:left;cursor:pointer;background:0 0;border:0;border-radius:8px;flex:1;align-items:center;gap:10px;margin-left:-8px;padding:5px 8px;transition:background .12s;display:flex}.workspace-menu:hover{background:var(--panel-2)}.workspace-menu-caret{color:var(--muted);flex:none;transition:color .12s}.workspace-menu:hover .workspace-menu-caret{color:var(--text-strong)}.sidebar-collapse{background:var(--panel-2);width:30px;height:30px;color:var(--muted);border:0;border-radius:8px;place-items:center;transition:color .12s,background .12s,transform .12s;display:grid}.sidebar-collapse:hover{background:var(--panel-3);color:var(--text-strong);transform:translate(-1px)}.workspace-name{flex-direction:column;gap:2px;min-width:0;display:flex}.workspace-name strong{min-width:0;color:var(--text-strong);letter-spacing:-.01em;font-size:15px;font-family:var(--font-display);align-items:center;gap:5px;font-weight:650;display:flex}.workspace-name-label{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.workspace-name .presence{color:var(--muted);align-items:center;gap:6px;font-size:11px;display:inline-flex}.workspace-name .presence:before{content:"";background:var(--muted-2);border-radius:50%;width:7px;height:7px;animation:1.6s ease-in-out infinite presence-pulse}@keyframes presence-pulse{0%,to{opacity:.4}50%{opacity:1}}@media (prefers-reduced-motion:reduce){.workspace-name .presence:before{animation:none}}.sidebar-scroll{padding:12px 8px 16px;overflow-y:auto}.nav-section+.nav-section{margin-top:12px}.section-title{border-radius:var(--radius-sm);background:0 0;border:0;align-items:center;gap:4px;width:100%;padding:2px 4px;display:flex}.nav-section.collapsed+.nav-section{margin-top:4px}.section-toggle{border-radius:var(--radius-sm);min-width:0;min-height:28px;color:var(--muted);text-transform:uppercase;font-family:var(--font-mono);letter-spacing:.09em;text-align:left;background:0 0;border:0;flex:1;align-items:center;gap:6px;padding:4px;font-size:10px;font-weight:600;display:flex}.section-toggle:hover{color:var(--text);background:var(--hover)}.section-toggle:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}.section-toggle .caret{opacity:.7;font-size:10px;transition:transform .14s}.section-toggle[aria-expanded=false] .caret{transform:rotate(-90deg)}.section-toggle .label{text-align:left;flex:1}.section-title .add-button{background:var(--hover-strong);width:18px;height:18px;color:var(--text);border:0;border-radius:4px;flex:none;place-items:center;padding:0;font-size:14px;font-weight:700;line-height:1;display:grid}.section-title .add-button:focus-visible{outline:2px solid var(--accent);outline-offset:1px}.section-title:hover .add-button{background:var(--accent);color:var(--accent-contrast)}.nav-list{flex-direction:column;gap:1px;margin-top:4px;display:flex}.nav-list[hidden]{display:none}.channel-subgroup{gap:1px;margin-top:6px;display:grid}.channel-subgroup-toggle{border-radius:var(--radius-sm);width:100%;min-height:26px;color:var(--muted);font-family:var(--font-mono);letter-spacing:.06em;text-align:left;text-transform:uppercase;background:0 0;border:0;align-items:center;gap:6px;padding:4px 9px 4px 28px;font-size:10px;font-weight:600;display:flex}.channel-subgroup-toggle:hover,.channel-subgroup-toggle:focus-visible{background:var(--hover);color:var(--text);outline:none}.channel-subgroup-toggle .caret{opacity:.7;font-size:10px;transition:transform .14s}.channel-subgroup-toggle[aria-expanded=false] .caret{transform:rotate(-90deg)}.channel-subgroup-count{color:var(--muted-2);font-variant-numeric:tabular-nums;margin-left:auto}.channel-subgroup-list{gap:1px;display:grid}.channel-subgroup-list[hidden]{display:none}.archived-channel-group{border-top:1px solid color-mix(in srgb, var(--line) 70%, transparent);margin-top:10px;padding-top:6px}@media (prefers-reduced-motion:reduce){.section-toggle .caret{transition:none}}.sr-only{clip:rect(0, 0, 0, 0);white-space:nowrap;border:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.channel-row{border-radius:var(--radius-sm);align-items:center;display:flex;position:relative}.channel-row .nav-item{flex:1;min-width:0}.channel-row.subdued .nav-item:not(.active){color:var(--muted-2)}.managed-channel-marker{color:var(--muted-2);flex:none;place-items:center;display:inline-grid}.nav-item.active .managed-channel-marker,.nav-item:hover .managed-channel-marker{color:var(--accent)}.channel-row.reorderable .nav-item{padding-left:2px}.channel-drag-handle{border-radius:var(--radius-sm);color:var(--muted-2);cursor:grab;opacity:0;background:0 0;border:0;flex:0 0 24px;align-self:stretch;place-items:center;display:grid}.channel-row:hover .channel-drag-handle,.channel-drag-handle:focus-visible{opacity:1}.channel-drag-handle:hover{color:var(--text);background:var(--hover)}.channel-drag-handle:active{cursor:grabbing}.channel-drag-handle:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}.channel-drag-handle svg{fill:currentColor}.channel-move-menu{z-index:4;border:1px solid var(--line-strong);border-radius:var(--radius-sm);background:var(--panel);min-width:112px;box-shadow:var(--shadow);padding:4px;display:grid;position:absolute;top:calc(100% + 2px);left:0}.channel-move-menu button{color:var(--text);text-align:left;background:0 0;border:0;border-radius:4px;padding:6px 8px}.channel-move-menu button:hover:not(:disabled),.channel-move-menu button:focus-visible{background:var(--hover-strong);outline:none}.channel-move-menu button:disabled{color:var(--muted-2);cursor:default}.channel-row.dragging{opacity:.45}.channel-row.drop-before:before,.channel-row.drop-after:after{content:"";z-index:1;background:var(--accent);pointer-events:none;border-radius:1px;height:2px;position:absolute;left:4px;right:4px}.channel-row.drop-before:before{top:-1px}.channel-row.drop-after:after{bottom:-1px}@media (hover:none){.channel-drag-handle{opacity:1}}@media (prefers-reduced-motion:reduce){.channel-subgroup-toggle .caret{transition:none}}.nav-item{border-radius:var(--radius-sm);width:100%;color:var(--muted);text-align:left;background:0 0;border:0;align-items:center;gap:8px;min-height:30px;padding:6px 10px;text-decoration:none;transition:background .1s,color .1s;display:flex}.nav-item:hover{background:var(--hover);color:var(--text)}.nav-item:focus{outline:none}.nav-item:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}.nav-item.active{background:var(--accent-soft);color:var(--text-strong);box-shadow:inset 0 0 0 1px color-mix(in srgb, var(--accent) 35%, transparent)}.nav-item.has-unread{color:var(--text-strong);font-weight:600}.nav-item.has-unread .hash{color:var(--text-strong)}.unread-badge{background:var(--accent);min-width:18px;height:18px;color:var(--accent-contrast,white);text-align:center;letter-spacing:.01em;border-radius:9px;flex-shrink:0;padding:0 6px;font-size:11px;font-weight:700;line-height:18px}.nav-item .hash{color:var(--muted);text-align:center;width:14px;font-weight:600}.nav-item.active .hash{color:var(--accent)}.nav-label{white-space:nowrap;text-overflow:ellipsis;flex:1;font-size:14px;overflow:hidden}.dm-row{grid-template-columns:minmax(0,1fr) 24px;align-items:center;gap:2px;display:grid;position:relative}.dm-row .nav-item{min-width:0}.dm-actions-trigger{border-radius:var(--radius-sm);width:22px;height:22px;color:var(--muted-2);opacity:0;background:0 0;border:0;place-items:center;font-size:18px;font-weight:700;line-height:1;display:grid}.dm-row:hover .dm-actions-trigger,.dm-row:focus-within .dm-actions-trigger,.dm-row.active .dm-actions-trigger{opacity:1}.dm-actions-trigger:hover,.dm-actions-trigger:focus-visible,.dm-actions-trigger[aria-expanded=true]{background:var(--hover);color:var(--text);outline:none}.dm-actions-menu{z-index:30;border:1px solid var(--line-strong);border-radius:var(--radius-sm);background:var(--panel-2);min-width:164px;box-shadow:var(--shadow);padding:4px;position:absolute;top:28px;right:0}.dm-actions-item{width:100%;min-height:30px;color:var(--text);text-align:left;background:0 0;border:0;border-radius:6px;padding:0 10px;font-size:13px}.dm-actions-item:hover,.dm-actions-item:focus-visible{background:var(--hover);color:var(--text-strong);outline:none}.dm-undo{border:1px solid var(--line);border-radius:var(--radius-sm);background:var(--panel-2);color:var(--muted);align-items:center;gap:8px;margin:6px 8px 2px;padding:6px 8px;font-size:12px;display:flex}.dm-undo span{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}.dm-undo button{background:var(--hover);color:var(--text);border:0;border-radius:6px;padding:4px 8px;font-size:12px;font-weight:700}.dm-undo button:hover,.dm-undo button:focus-visible{background:var(--accent);color:var(--accent-contrast);outline:none}.nav-empty{color:var(--muted-2);margin:4px 8px;font-size:12px}.dm-avatar{color:#fff;background:linear-gradient(135deg, hsl(var(--hue,220deg) 70% 55%), hsl(calc(var(--hue,220deg) + 40deg) 70% 45%));border-radius:50%;flex-shrink:0;place-items:center;width:22px;height:22px;font-size:11px;font-weight:700;display:grid;overflow:hidden}.dm-avatar img,.avatar img{object-fit:cover;width:100%;height:100%;display:block}.presence-dot{background:var(--muted-2);border-radius:50%;flex-shrink:0;width:8px;height:8px}.presence-dot.active{background:var(--success);box-shadow:0 0 0 2px var(--panel)}.inline-create{grid-template-columns:minmax(0,1fr) auto;gap:6px;margin:6px 4px 2px;display:grid}.inline-create input{border-radius:var(--radius-sm);background:var(--panel-2);width:100%;min-width:0;height:30px;color:var(--text);border:1px solid var(--line);padding:0 10px}.inline-create input:focus{border-color:var(--accent);background:var(--panel-3)}.inline-create button.ghost,button.ghost{border-radius:var(--radius-sm);background:var(--panel-3);width:30px;height:30px;color:var(--muted);border:0;place-items:center;padding:0;font-size:14px;font-weight:600;display:grid}.inline-create button.ghost:hover{background:var(--accent);color:var(--accent-contrast)}.user-card{background:var(--panel-2);border-top:1px solid var(--line);width:100%;color:inherit;text-align:left;cursor:pointer;border-bottom:0;border-left:0;border-right:0;align-items:center;gap:10px;padding:10px 12px;transition:background .12s;display:flex}.user-card:hover{background:var(--panel-3)}.user-card .dm-avatar{width:28px;height:28px;font-size:12px}.user-card .user-meta{flex:1;min-width:0}.user-card .user-meta strong{color:var(--text-strong);white-space:nowrap;text-overflow:ellipsis;font-size:13px;display:block;overflow:hidden}.user-card .user-meta span{color:var(--muted);white-space:nowrap;text-overflow:ellipsis;font-size:11px;display:block;overflow:hidden}@media (width<=820px){.workspace-header{min-height:calc(60px + var(--safe-area-top));padding-top:calc(14px + var(--safe-area-top));padding-right:calc(16px + var(--safe-area-right))}.sidebar-scroll{padding-bottom:calc(16px + var(--safe-area-bottom))}.user-card{padding-bottom:calc(10px + var(--safe-area-bottom))}}.messages{flex-direction:column;display:flex;position:relative}.messages-scroll{overflow-anchor:none;opacity:1;isolation:isolate;flex-direction:column;flex:1;min-height:0;padding:0 4px;transition:opacity .14s ease-out;display:flex;overflow-y:auto}.messages-scroll:focus{outline:none}.messages.is-revealing .messages-scroll{opacity:0;pointer-events:none;transition:opacity}.messages-spacer{flex-grow:1}.history-loader{pointer-events:none;gap:14px;margin:4px 0 6px;padding:6px 18px;animation:.22s ease-out both history-loader-fade;display:grid}.history-loader--newer{margin-top:6px;margin-bottom:4px}@keyframes history-loader-fade{0%{opacity:0}to{opacity:1}}.history-loader__row{grid-template-columns:56px minmax(0,1fr);min-height:44px;display:grid}.history-loader__avatar,.history-loader__meta,.history-loader__line,.history-loader__block{background:linear-gradient(90deg, color-mix(in srgb, var(--muted-2) 16%, transparent), color-mix(in srgb, var(--muted-2) 36%, transparent), color-mix(in srgb, var(--muted-2) 16%, transparent));animation:1.4s ease-in-out infinite history-loading;animation-delay:calc(var(--history-row,0) * 80ms);background-size:220% 100%;display:block}.history-loader__avatar{border-radius:10px;width:38px;height:38px}.history-loader__body{align-content:start;gap:8px;min-width:0;padding-top:4px;display:grid}.history-loader__meta{border-radius:999px;width:min(180px,38%);height:11px}.history-loader__line{border-radius:999px;height:10px}.history-loader__line--wide{width:min(540px,72%)}.history-loader__line--mid{width:min(360px,48%)}@keyframes history-loading{0%{background-position:120% 0}to{background-position:-120% 0}}@media (prefers-reduced-motion:reduce){.history-loader{animation:none}.history-loader__avatar,.history-loader__meta,.history-loader__line,.history-loader__block{background:color-mix(in srgb, var(--muted-2) 22%, transparent);animation:none}}.unread-bar{z-index:5;background:color-mix(in srgb, var(--panel) 82%, transparent);-webkit-backdrop-filter:blur(14px)saturate(140%);border:1px solid color-mix(in srgb, var(--accent) 38%, transparent);max-width:calc(100% - 32px);height:30px;color:var(--text);letter-spacing:.005em;box-shadow:inset 0 1px 0 #ffffff14, 0 10px 24px -14px #0000008c, 0 0 0 4px color-mix(in srgb, var(--accent) 10%, transparent);opacity:1;border-radius:999px;align-items:center;gap:6px;padding:0 5px 0 14px;font-size:12px;font-weight:600;transition:opacity .16s ease-out,transform .18s cubic-bezier(.2,.8,.2,1);display:inline-flex;position:absolute;top:10px;left:50%;transform:translate(-50%)}.unread-bar.is-clearing{opacity:0;pointer-events:none;transform:translate(-50%,-6px)}.unread-bar__jump,.unread-bar__mark{color:inherit;font:inherit;cursor:pointer;background:0 0;border:0;align-items:center;gap:8px;transition:background-color .12s ease-out,color .12s ease-out;display:inline-flex}.unread-bar__jump{text-align:left;min-width:0;color:color-mix(in srgb, var(--accent) 92%, var(--text));flex:0 auto;padding:0 6px 0 0}.unread-bar__jump:before{content:"";background:var(--accent);width:7px;height:7px;box-shadow:0 0 0 0 color-mix(in srgb, var(--accent) 55%, transparent);border-radius:50%;flex-shrink:0;animation:1.8s ease-out infinite unread-bar-pulse}@keyframes unread-bar-pulse{0%{box-shadow:0 0 0 0 color-mix(in srgb, var(--accent) 55%, transparent)}70%{box-shadow:0 0 0 7px color-mix(in srgb, var(--accent) 0%, transparent)}to{box-shadow:0 0 0 0 color-mix(in srgb, var(--accent) 0%, transparent)}}@media (prefers-reduced-motion:reduce){.unread-bar__jump:before{animation:none}}.unread-bar__mark{background:color-mix(in srgb, var(--accent) 14%, transparent);height:22px;color:color-mix(in srgb, var(--accent) 90%, var(--text));letter-spacing:.01em;border-radius:999px;flex-shrink:0;padding:0 10px;font-size:11px;font-weight:600}.unread-bar__jump:hover{color:var(--accent)}.unread-bar__mark:hover{background:color-mix(in srgb, var(--accent) 24%, transparent);color:var(--accent)}.unread-bar__jump:focus-visible,.unread-bar__mark:focus-visible{outline:2px solid color-mix(in srgb, var(--accent) 70%, transparent);outline-offset:2px;border-radius:999px}.unread-bar__label{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.typing-indicator{height:0;color:var(--text-muted);opacity:0;pointer-events:none;align-items:center;gap:8px;margin-top:0;padding:0 22px;font-size:12px;transition:height .12s ease-out,margin-top .12s ease-out,opacity .12s ease-out,transform .16s cubic-bezier(.2,.8,.2,1);display:flex;overflow:hidden;transform:translateY(2px)}.typing-indicator.visible{opacity:1;height:20px;margin-top:-4px;transform:translateY(0)}.composer-dock{padding-top:20px;position:relative}.topic-filter{border-bottom:1px solid var(--line);background:color-mix(in srgb, var(--accent) 8%, var(--panel));color:var(--muted);justify-content:space-between;align-items:center;gap:12px;padding:8px 18px;font-size:13px;display:flex}.topic-filter strong{color:var(--text)}.topic-filter button,.message-topic{color:var(--accent);font:inherit;cursor:pointer;background:0 0;border:0}.topic-filter button:hover,.message-topic:hover{text-decoration:underline}.message-topic{background:color-mix(in srgb, var(--accent) 12%, transparent);border-radius:999px;margin:0 0 4px;padding:2px 7px;font-size:11px;font-weight:700;display:inline-flex}.topic-picker{border:1px solid var(--line);background:var(--panel);color:var(--muted);border-bottom:0;border-radius:10px 10px 0 0;align-items:center;gap:8px;margin:0 14px -1px;padding:7px 10px;font-size:12px;display:flex}.topic-picker select{min-width:0;max-width:min(280px,65vw);color:var(--text);font:inherit;background:0 0;border:0}.composer-dock .agent-responding{opacity:0;pointer-events:none;align-items:center;height:20px;margin:0;padding:0 22px;transition:opacity .12s ease-out;display:flex;position:absolute;top:0;left:0;right:0;overflow:hidden;transform:none}.composer-dock .agent-responding.visible{opacity:1;height:20px;margin:0;transform:none}.typing-indicator__dots{align-items:center;gap:3px;display:inline-flex}.typing-indicator__dots i{opacity:.55;background:currentColor;border-radius:50%;width:4px;height:4px;animation:1.1s ease-in-out infinite typing-dot}.typing-indicator__dots i:nth-child(2){animation-delay:.15s}.typing-indicator__dots i:nth-child(3){animation-delay:.3s}@keyframes typing-dot{0%,60%,to{opacity:.35;transform:translateY(0)}30%{opacity:1;transform:translateY(-3px)}}.message-row.is-pending{opacity:.55}.message-row.is-pending .message-content,.message-row.is-pending .markdown{pointer-events:none}.message-row.is-failed{opacity:1}.message-row.is-deleted{color:var(--muted)}.message-failed{background:color-mix(in srgb, var(--danger,#d04848) 14%, transparent);color:var(--danger,#d04848);border-radius:999px;align-items:center;gap:10px;margin-top:6px;padding:4px 10px;font-size:12px;display:inline-flex}.message-failed__label{font-weight:500}.message-failed__action{color:inherit;font:inherit;cursor:pointer;background:0 0;border:1px solid;border-radius:999px;padding:2px 8px;line-height:1}.message-failed__action:hover{background:color-mix(in srgb, currentColor 12%, transparent)}.message-failed__action--ghost{border-color:color-mix(in srgb, currentColor 50%, transparent)}@media (prefers-reduced-motion:reduce){.typing-indicator{transition:opacity 80ms ease-out;transform:none}.typing-indicator.visible{transform:none}.typing-indicator__dots i{opacity:.7;animation:none}}.empty{text-align:center;align-content:center;place-items:center;gap:10px;min-height:50vh;padding:48px 24px;display:grid}.empty-icon{background:linear-gradient(135deg, var(--brand-a), var(--brand-b));border:1px solid color-mix(in srgb, var(--brand-b) 55%, var(--line-strong));width:64px;height:64px;color:var(--brand-contrast);box-shadow:var(--key-edge), 0 18px 40px -16px color-mix(in srgb, var(--brand-b) 60%, transparent);border-radius:16px;place-items:center;font-size:26px;font-weight:800;display:grid}.empty strong{color:var(--text-strong);letter-spacing:-.01em;font-size:19px;font-family:var(--font-display);overflow-wrap:anywhere;font-weight:700}.empty span{color:var(--muted);max-width:380px;line-height:1.5}.day-divider{pointer-events:none;align-items:center;gap:12px;margin:18px 18px 8px;display:flex}.day-divider:before,.day-divider:after{content:"";background:var(--line);flex:1;height:1px}.day-divider span{background:var(--bg);border:1px solid var(--line);font-family:var(--font-mono);color:var(--muted);text-transform:uppercase;letter-spacing:.07em;border-radius:999px;padding:4px 12px;font-size:10px;font-weight:600}.new-messages-divider{pointer-events:none;opacity:1;align-items:center;gap:0;margin:4px 0 2px;padding:0 18px;transition:opacity .16s ease-out,transform .18s cubic-bezier(.2,.8,.2,1);display:flex;position:relative;transform:translateY(0)}.new-messages-divider.is-clearing{opacity:0;transform:translateY(-4px)}.new-messages-divider:before{content:"";background:var(--danger,#ed4245);opacity:.9;flex:1;height:1px}.new-messages-divider span{background:var(--danger,#ed4245);color:#fff;letter-spacing:.04em;text-transform:uppercase;border-radius:3px;align-items:center;height:14px;margin-left:8px;padding:0 5px;font-size:9px;font-weight:700;display:inline-flex}.message-group{grid-template-columns:56px minmax(0,1fr);padding:8px 18px;display:grid;position:relative}.avatar{color:#fff;background:linear-gradient(135deg, hsl(var(--hue,220deg) 70% 55%), hsl(calc(var(--hue,220deg) + 40deg) 70% 45%));border-radius:10px;place-items:center;width:38px;height:38px;margin-top:2px;font-size:14px;font-weight:700;display:grid;overflow:hidden;box-shadow:0 6px 20px -10px #0009}.avatar-button{z-index:2;cursor:pointer;border:0;padding:0;transition:transform .1s,box-shadow .12s,filter .12s;position:relative}.avatar-button:hover{filter:brightness(1.05);transform:translateY(-1px);box-shadow:0 10px 24px -12px #000c}.avatar.small{border-radius:10px;width:30px;height:30px;font-size:12px}.avatar.large{border-radius:16px;width:56px;height:56px;margin:0;font-size:18px}.group-body{min-width:0}.group-body>header{align-items:baseline;gap:8px;margin-bottom:2px;display:flex}.message-group .group-body>header{margin:0 -18px 0 -56px;padding:0 18px 2px 56px}.group-body>header strong{color:var(--text-strong);letter-spacing:-.005em;font-size:14.5px;font-weight:700}.author-name{color:var(--text-strong);letter-spacing:0;background:0 0;border:0;border-radius:4px;padding:0;font-size:14.5px;font-weight:700}.author-name:hover{color:var(--accent);text-underline-offset:2px;text-decoration:underline}.author-name--static:hover{color:var(--text-strong);text-decoration:none}.group-body>header time{color:var(--muted);font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-size:10.5px}.group-body>header span{color:var(--muted);font-size:12px}.bot-chip{border:1px solid color-mix(in srgb, var(--accent) 45%, transparent);height:18px;color:var(--accent);font-family:var(--font-mono);text-transform:uppercase;letter-spacing:.05em;border-radius:4px;align-items:center;padding:0 6px;font-size:9.5px;font-weight:700;line-height:1;display:inline-flex}.bot-chip--deleted{border-color:var(--line-strong);color:var(--muted)}.message-row{border-radius:0;margin-left:-56px;margin-right:-18px;padding:1px 18px 1px 56px;transition:background 80ms;position:relative}.message-row:not(:first-child){margin-top:1px}.message-row:hover,.message-group .group-body>header:hover,.message-group .group-body>header:hover+.message-row{background:var(--hover)}.message-group .group-body>header:has(+.message-row:hover){background:var(--hover)}.message-group .group-body>header:hover+.message-row .message-actions{opacity:1;pointer-events:auto}.message-row.selected{background:var(--accent-soft)}.message-row.can-open-thread{cursor:pointer}.row-stamp{font-family:var(--font-mono);color:var(--muted-2);opacity:0;font-variant-numeric:tabular-nums;font-size:9.5px;position:absolute;top:4px;left:8px}.message-row.is-preamble{background:0 0;margin-bottom:6px;padding-top:4px;padding-bottom:4px}.message-row.is-preamble:not(.before-final-message) .message-content{border:1px solid color-mix(in srgb, var(--activity-accent) 20%, transparent);border-radius:var(--radius-lg);background:var(--activity-accent-soft);box-shadow:0 2px 0 color-mix(in srgb, var(--activity-accent) 14%, transparent);padding:10px 14px}.message-row.is-preamble-collapsed .message-content{padding-top:6px;padding-bottom:6px}.message-row.is-preamble.before-final-message{background:0 0;margin-bottom:0;padding-top:2px;padding-bottom:0}.message-row.after-preamble{margin-top:0;padding-top:0;padding-bottom:2px}.message-row.is-preamble.before-final-message:before{display:none}.message-row.is-preamble.before-final-message .message-content{border:1px solid color-mix(in srgb, var(--activity-accent) 20%, transparent);background:var(--activity-accent-soft);border-top-left-radius:var(--radius-lg);border-top-right-radius:var(--radius-lg);border-bottom:0;padding:10px 14px}.message-row.after-preamble .message-content{border:1px solid color-mix(in srgb, var(--delivery-accent) 20%, transparent);border-bottom-left-radius:var(--radius-lg);border-bottom-right-radius:var(--radius-lg);background:var(--delivery-accent-soft);box-shadow:0 2px 0 color-mix(in srgb, var(--delivery-accent) 14%, transparent);border-top:0;padding:10px 14px}.message-row.is-preamble.before-final-message.is-preamble-collapsed .message-content{background:color-mix(in srgb, var(--activity-accent) 10%, var(--panel));border-bottom:1px solid color-mix(in srgb, var(--activity-accent) 30%, transparent);padding-top:7px;padding-bottom:7px}:root[data-user-align=right] .message-group.is-self,:root[data-other-align=right] .message-group:not(.is-self){grid-template-columns:minmax(0,1fr) 56px}:root[data-user-align=right] .message-group.is-self>.avatar,:root[data-other-align=right] .message-group:not(.is-self)>.avatar{grid-area:1/2;justify-self:end}:root[data-user-align=right] .message-group.is-self>.group-body,:root[data-other-align=right] .message-group:not(.is-self)>.group-body{grid-area:1/1;min-width:0}:root[data-user-align=right] .message-group.is-self .group-body>header,:root[data-other-align=right] .message-group:not(.is-self) .group-body>header{justify-content:flex-end;margin:0 -56px 0 -18px;padding:0 56px 2px 18px}:root[data-user-align=right] .message-group.is-self .message-row,:root[data-other-align=right] .message-group:not(.is-self) .message-row{margin-left:-18px;margin-right:-56px;padding-left:18px;padding-right:56px}:root[data-user-align=right] .message-group.is-self .message-content,:root[data-other-align=right] .message-group:not(.is-self) .message-content{text-align:right;margin-left:auto}:root[data-user-align=right] .message-group.is-self .markdown,:root[data-other-align=right] .message-group:not(.is-self) .markdown{text-align:right}:root:not([data-message-layout=outlined])[data-user-align=right] .message-group.is-self .markdown ul,:root:not([data-message-layout=outlined])[data-user-align=right] .message-group.is-self .markdown ol,:root:not([data-message-layout=outlined])[data-other-align=right] .message-group:not(.is-self) .markdown ul,:root:not([data-message-layout=outlined])[data-other-align=right] .message-group:not(.is-self) .markdown ol{padding-left:0;padding-right:0;list-style-position:inside}:root:not([data-message-layout=outlined])[data-user-align=right] .message-group.is-self .markdown li>ul,:root:not([data-message-layout=outlined])[data-user-align=right] .message-group.is-self .markdown li>ol,:root:not([data-message-layout=outlined])[data-other-align=right] .message-group:not(.is-self) .markdown li>ul,:root:not([data-message-layout=outlined])[data-other-align=right] .message-group:not(.is-self) .markdown li>ol{padding-left:0;padding-right:22px}:root:not([data-message-layout=outlined])[data-user-align=right] .message-group.is-self .markdown li>p:first-child,:root:not([data-message-layout=outlined])[data-other-align=right] .message-group:not(.is-self) .markdown li>p:first-child{display:inline}:root:not([data-message-layout=outlined])[data-user-align=right] .message-group.is-self .markdown blockquote,:root:not([data-message-layout=outlined])[data-other-align=right] .message-group:not(.is-self) .markdown blockquote{border-left:0;border-right:3px solid var(--accent);padding-left:0;padding-right:12px}:root[data-user-align=right] .message-group.is-self .attachment-grid,:root[data-other-align=right] .message-group:not(.is-self) .attachment-grid{margin-left:auto}.preamble-contract{gap:7px;min-width:0;display:grid}.preamble-toggle{width:100%;min-height:20px;color:var(--activity-accent);font:inherit;text-align:left;cursor:pointer;background:0 0;border:0;grid-template-columns:auto auto auto minmax(0,1fr);align-items:center;gap:7px;padding:0;display:grid}.preamble-chevron{color:var(--activity-accent);font-size:10px;transition:transform .12s}.preamble-chevron.open{transform:rotate(90deg)}.preamble-state,.preamble-action{line-height:1}.preamble-state{border:1px solid color-mix(in srgb, var(--activity-accent) 30%, transparent);height:17px;color:var(--activity-accent);text-transform:uppercase;letter-spacing:.03em;border-radius:999px;align-items:center;padding:0 7px;font-size:9.5px;font-weight:750;display:inline-flex}.preamble-state.is-live{border-color:color-mix(in srgb, var(--activity-accent) 55%, transparent);animation:1.6s ease-in-out infinite preamble-live-pulse}@keyframes preamble-live-pulse{0%,to{opacity:1}50%{opacity:.45}}@media (prefers-reduced-motion:reduce){.preamble-state.is-live{animation:none}}.preamble-action{min-width:0;color:var(--muted);text-overflow:ellipsis;white-space:nowrap;font-size:11px;font-weight:600;overflow:hidden}.preamble-body{color:var(--muted);overflow-wrap:anywhere;word-break:break-word;min-width:0}.preamble-flow{gap:7px;min-width:0;padding-left:17px;display:grid}.preamble-tool{--tool-accent:var(--activity-accent);background:var(--tool-call-bg);border-radius:7px;min-width:0;overflow:hidden}.preamble-tool-summary{width:100%;min-width:0;font:inherit;text-align:left;cursor:pointer;background:0 0;border:0;align-items:baseline;gap:7px;padding:4px 9px;line-height:1.5;display:flex}.preamble-tool-summary:hover{background:var(--tool-call-bg-hover)}.preamble-tool-full{color:var(--muted);overflow-wrap:anywhere;word-break:break-word;gap:5px;min-width:0;padding:2px 10px 8px 27px;font-size:12px;display:grid}.preamble-tool-full-head{font-family:var(--font-mono);color:color-mix(in srgb, var(--tool-accent) 45%, var(--muted));font-size:11px;font-weight:600}.preamble-tool-full-body{min-width:0}.preamble-tool-full pre{white-space:pre-wrap;overflow-wrap:anywhere}.tool-line-chevron{color:var(--muted-2);flex-shrink:0;font-size:9px;transition:transform .12s}.tool-line-chevron.open{transform:rotate(90deg)}.tool-line-glyph{filter:saturate(.85);flex-shrink:0;font-size:11px}.tool-line-action{color:color-mix(in srgb, var(--tool-accent) 38%, var(--text));flex-shrink:0;font-size:11.5px;font-weight:600}.tool-line-name{text-overflow:ellipsis;white-space:nowrap;max-width:40%;color:color-mix(in srgb, var(--tool-accent) 55%, var(--muted));font-size:11px;font-weight:500;font-family:var(--font-mono);flex-shrink:0;overflow:hidden}.tool-line-detail{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--muted);font-size:11px;font-weight:400;font-family:var(--font-mono);opacity:.85;flex:auto;overflow:hidden}.message-row:hover .row-stamp{opacity:1}.message-content{min-width:0;display:flow-root}.thread-hint{min-height:22px;color:var(--muted-2);cursor:pointer;background:0 0;border:1px solid #0000;border-radius:8px;align-items:center;gap:6px;margin-top:4px;padding:3px 8px;font-size:12px;font-weight:700;line-height:1;display:inline-flex}.thread-hint:not(.has-replies):not(.is-open){display:none}.thread-hint svg{flex:none}.thread-hint time{color:var(--muted);font-variant-numeric:tabular-nums;font-size:10.5px;font-weight:500}.thread-hint.has-replies,.thread-hint.is-open{color:var(--accent)}.thread-hint.is-open{border-color:color-mix(in srgb, var(--accent) 40%, transparent);background:color-mix(in srgb, var(--accent-soft) 70%, transparent)}.thread-hint:hover{border-color:var(--line-strong);background:var(--panel)}.thread-hint:disabled{cursor:default;opacity:.45}.message-actions{opacity:0;pointer-events:none;background:var(--panel);border:1px solid var(--line-strong);box-shadow:var(--shadow);border-radius:8px;align-items:flex-start;gap:4px;padding:2px;transition:opacity .1s;display:flex;position:absolute;top:-24px;right:8px}.message-row:hover .message-actions,.message-row.selected .message-actions,.message-row.menu-open .message-actions{opacity:1;pointer-events:auto}.message-row:has(:focus-visible) .message-actions{opacity:1;pointer-events:auto}.message-row.actions-flip .message-actions{top:auto;bottom:-24px}.message-row.menu-open{z-index:6}.message-row:hover,.message-row.selected{z-index:5}.message-row:has(:focus-visible){z-index:5}.messages:has(.message-row.menu-open) .message-row:hover:not(.menu-open) .message-actions{opacity:0;pointer-events:none}.messages:has(.message-row.menu-open) .message-group .group-body>header:hover+.message-row:not(.menu-open) .message-actions{opacity:0;pointer-events:none}@media (hover:none),(pointer:coarse){.message-actions{width:1px;height:1px;box-shadow:none;opacity:1;pointer-events:auto;background:0 0;border:0;padding:0;top:1px;bottom:auto;overflow:visible;transform:none}.message-actions>:not(.message-more){display:none}.message-row.actions-flip .message-actions{top:1px;bottom:auto}.message-actions .message-more{position:static}.message-actions .message-actions-trigger{clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.message-actions .message-actions-trigger:focus-visible{clip:auto;clip-path:none;border:1px solid var(--line-strong);background:var(--panel);width:36px;height:36px;box-shadow:var(--shadow);margin:0;top:0;right:0;overflow:visible}.message-row:has(.message-actions-trigger:focus-visible) .message-content{padding-right:44px}}.message-actions button{width:28px;height:28px;color:var(--muted);background:0 0;border:0;border-radius:6px;place-items:center;display:grid}.message-actions button:hover{background:var(--hover-strong);color:var(--text-strong)}.message-actions button:disabled{opacity:.45}.message-copy-status{background:var(--accent-soft);height:24px;color:var(--accent);white-space:nowrap;border-radius:5px;align-self:center;align-items:center;padding:0 6px;font-size:11px;font-weight:700;display:inline-flex}.message-copy-status.is-error{background:color-mix(in srgb, var(--danger) 10%, transparent);color:var(--danger)}.message-sheet-scrim{z-index:60;background:#05080f66;flex-direction:column;justify-content:flex-end;display:flex;position:fixed;inset:0}.message-sheet-backdrop{background:0 0;border:0;padding:0;position:absolute;inset:0}.message-action-sheet{z-index:1;background:var(--panel);border:1px solid var(--line);max-height:calc(100dvh - 16px - env(safe-area-inset-top,0px));padding:8px 12px calc(10px + env(safe-area-inset-bottom,0px));overscroll-behavior:contain;border-bottom:0;border-radius:16px 16px 0 0;animation:.16s ease-out sheet-rise;position:relative;overflow-y:auto}@keyframes sheet-rise{0%{opacity:0;transform:translateY(24px)}to{opacity:1;transform:translateY(0)}}@media (prefers-reduced-motion:reduce){.message-action-sheet{animation:none}}.message-action-sheet .sheet-grabber{background:var(--line-strong);border-radius:999px;width:36px;height:4px;margin:0 auto 8px}.message-action-sheet .sheet-emoji-row{border-bottom:1px solid var(--line);justify-content:space-around;gap:4px;padding-bottom:8px;display:flex}.message-action-sheet .sheet-emoji-row button{background:0 0;border:0;border-radius:10px;place-items:center;width:44px;height:44px;font-size:22px;line-height:1;display:grid}.message-action-sheet .sheet-emoji-row button:active{background:var(--hover-strong)}.message-action-sheet .sheet-actions{flex-direction:column;padding-top:4px;display:flex}.message-action-sheet .sheet-actions button{width:100%;color:var(--text-strong);text-align:left;background:0 0;border:0;border-radius:8px;align-items:center;gap:12px;padding:12px 8px;font-size:15px;display:flex}.message-action-sheet .sheet-actions button:active{background:var(--hover-strong)}.message-action-sheet .sheet-actions button:disabled{opacity:.45}.message-action-sheet .sheet-actions svg{color:var(--muted);flex:none}.message-action-sheet .sheet-danger,.message-action-sheet .sheet-danger svg{color:var(--danger)}.message-action-sheet .sheet-copy-status{background:var(--accent-soft);height:22px;color:var(--accent);white-space:nowrap;border-radius:5px;align-items:center;margin-left:auto;padding:0 6px;font-size:11px;font-weight:700;display:inline-flex}.message-action-sheet .sheet-copy-status.is-error{background:color-mix(in srgb, var(--danger) 10%, transparent);color:var(--danger)}.message-action-sheet .sheet-action-error{color:var(--danger);margin:-4px 12px 4px;font-size:12px;line-height:1.35}.message-actions .message-action-react{font-size:15px;line-height:1}.message-actions .action-sep{background:var(--line);flex:none;align-self:center;width:1px;height:18px;margin:0 3px}.message-actions .picker-wrapper,.message-actions .message-more{position:relative}.message-menu{z-index:30;background:var(--panel);border:1px solid var(--line-strong);min-width:190px;box-shadow:var(--shadow);border-radius:10px;padding:5px;font-size:13px;position:absolute;top:calc(100% + 4px);right:0}.message-menu.above{top:auto;bottom:calc(100% + 4px)}.message-menu button{width:100%;height:auto;color:var(--text);font:inherit;text-align:left;cursor:pointer;background:0 0;border:0;border-radius:7px;align-items:center;gap:9px;padding:7px 10px;font-size:13px;display:flex}.message-menu button:hover{background:var(--hover-strong);color:var(--text-strong)}.message-menu button svg{color:var(--muted);flex:none}.message-menu .menu-sep{border-top:1px solid var(--line);margin:5px 4px}.message-menu .menu-danger,.message-menu .menu-danger svg{color:var(--danger)}.message-menu .menu-danger:hover{background:color-mix(in srgb, var(--danger) 10%, transparent);color:var(--danger)}.message-edit{gap:7px;width:min(100%,760px);padding:5px 0 3px;display:grid}.message-edit__textarea{border:1px solid var(--line-strong);background:color-mix(in srgb, var(--panel) 94%, var(--text) 6%);width:100%;min-height:72px;max-height:240px;color:var(--text);font:inherit;resize:vertical;box-sizing:border-box;box-shadow:inset 0 1px 1px color-mix(in srgb, var(--text) 5%, transparent);border-radius:7px;padding:9px 11px;font-size:14.5px;line-height:1.5;transition:border-color .12s,box-shadow .12s,background .12s}.message-edit__textarea:hover:not(:disabled){border-color:color-mix(in srgb, var(--line-strong) 62%, var(--text) 38%)}.message-edit__textarea:focus{border-color:var(--accent);background:var(--panel);box-shadow:inset 0 1px 1px color-mix(in srgb, var(--text) 4%, transparent), 0 0 0 3px color-mix(in srgb, var(--accent) 18%, transparent);outline:none}.message-edit__textarea:disabled{cursor:progress;opacity:.78}.message-edit__footer{flex-wrap:wrap;align-items:center;gap:6px;min-height:30px;display:flex}.message-edit__footer .message-edit__save{background:var(--accent);min-width:68px;min-height:30px;color:var(--accent-contrast);cursor:pointer;border:0;border-radius:6px;justify-content:center;align-items:center;gap:4px;padding:5px 12px;font-size:13px;font-weight:500;display:inline-flex}.message-edit__footer .message-edit__save:hover{filter:brightness(1.1)}.message-edit__footer .message-edit__save:focus-visible,.message-edit__footer .message-edit__cancel:focus-visible{outline:2px solid var(--accent);outline-offset:2px}.message-edit__footer .message-edit__save:disabled{opacity:.5;cursor:progress}.message-edit__footer .message-edit__cancel{min-height:30px;color:var(--muted);cursor:pointer;background:0 0;border:1px solid #0000;border-radius:6px;justify-content:center;align-items:center;padding:5px 10px;font-size:13px;display:inline-flex}.message-edit__footer .message-edit__cancel:hover{border-color:var(--line);background:var(--hover-strong);color:var(--text-strong)}.message-edit__error{border-left:2px solid var(--danger);background:color-mix(in srgb, var(--danger) 8%, transparent);width:fit-content;max-width:100%;color:var(--danger);border-radius:3px;margin:0;padding:5px 8px;font-size:12.5px;line-height:1.35}.message-edit__indicator{color:var(--muted);align-items:center;gap:3px;margin-left:8px;font-size:11px;display:inline-flex}.message-row.editing .message-actions{display:none}@media (width<=520px){.message-edit__footer .message-edit__save,.message-edit__footer .message-edit__cancel{flex:1 1 0}}.message-deleted{min-height:22px;color:var(--muted);align-items:center;font-size:13px;font-style:italic;display:inline-flex}.markdown{color:var(--text);overflow-wrap:anywhere;word-break:break-word;font-size:14.5px;line-height:1.5}.markdown>:first-child{margin-top:0}.markdown>:last-child{margin-bottom:0}.markdown p{margin:0}.markdown p+p,.markdown ul,.markdown ol,.markdown blockquote,.markdown pre{margin-top:6px}.markdown a{color:var(--accent);text-decoration:none}.markdown a:hover{text-decoration:underline}.message-mention{border:1px solid color-mix(in srgb, currentColor 18%, transparent);background:color-mix(in srgb, currentColor 8%, transparent);color:inherit;border-radius:4px;margin:0 1px;padding:0 3px;font-weight:600}.message-mention.is-current-user{border-color:color-mix(in srgb, var(--accent) 42%, transparent);background:color-mix(in srgb, var(--accent) 20%, transparent);color:var(--accent);font-weight:700}.markdown code{background:var(--panel-2);border:1px solid var(--line);border-radius:4px;padding:1px 5px;font-family:Geist Mono Variable,JetBrains Mono,ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:.9em}.markdown pre{background:var(--panel-2);border:1px solid var(--line);border-radius:var(--radius);padding:12px 14px;overflow-x:auto}.markdown pre code{background:0 0;border:0;padding:0}.markdown blockquote{border-left:3px solid var(--accent);color:var(--muted);margin:0;padding:4px 0 4px 12px}.markdown ul,.markdown ol{padding-left:22px}.markdown img{border-radius:var(--radius);border:1px solid var(--line);object-fit:contain;background:var(--panel);cursor:zoom-in;max-width:100%;max-height:360px;margin-top:6px}.markdown-table-scroll{-webkit-overflow-scrolling:touch;overscroll-behavior-inline:contain;max-width:100%;margin-top:6px;overflow-x:auto}.markdown-table-scroll[data-overflowing]:focus-visible{outline:2px solid var(--accent);outline-offset:2px}.markdown-table-scroll:first-child{margin-top:0}.markdown-table-scroll>table{border-collapse:collapse;border-spacing:0;width:max-content;min-width:100%;font-size:.9em}.markdown thead{background:var(--muted-2)}.markdown th,.markdown td{vertical-align:top;border:1px solid var(--line);padding:8px 12px}.markdown thead th{color:var(--text-strong);font-weight:700}.markdown tbody tr:nth-child(2n){background:color-mix(in srgb, var(--muted-2) 18%, transparent)}.markdown tbody tr:hover{background:color-mix(in srgb, var(--muted-2) 26%, transparent)}.gif-player{vertical-align:top;max-width:100%;display:inline-block;position:relative}.gif-player img{display:block}.gif-badge,.gif-replay{z-index:1;color:#fff;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);border:0;position:absolute}.gif-badge{letter-spacing:.04em;pointer-events:none;background:#0000008a;border-radius:999px;padding:4px 7px;font-size:10px;font-weight:800;bottom:9px;left:9px}.gif-replay{opacity:0;pointer-events:none;background:#0a0c12b8;border-radius:999px;place-items:center;width:30px;height:30px;font-size:16px;line-height:1;transition:opacity .13s,transform .13s,background .12s;display:grid;bottom:9px;right:9px;transform:scale(.88)}.gif-replay:hover{background:var(--accent)}.gif-player.paused .gif-replay{opacity:1;pointer-events:auto;transform:scale(1)}.gif-player.playing .gif-badge{animation:.9s ease-in-out infinite gif-breathe}@keyframes gif-breathe{0%,to{opacity:.85}50%{opacity:.45}}.attachment-grid{grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:8px;max-width:560px;margin-top:8px;display:grid}.attachment-grid.compact{grid-template-columns:minmax(0,1fr);max-width:420px}.media-tile{border:1px solid var(--line);border-radius:var(--radius-lg);isolation:isolate;text-align:left;width:100%;color:inherit;cursor:pointer;background:#0a0c12;margin:0;padding:0;text-decoration:none;transition:border-color .14s,transform .14s,box-shadow .14s;display:block;position:relative;overflow:hidden}.media-tile:hover{border-color:var(--line-strong);box-shadow:0 18px 40px -28px #000000e6}.media-tile:focus-visible{border-color:var(--line-strong);box-shadow:0 0 0 2px color-mix(in srgb, var(--accent) 35%, transparent);outline:none}.media-tile--image{cursor:zoom-in}.media-tile__open{width:100%;color:inherit;cursor:zoom-in;background:0 0;border:0;margin:0;padding:0;display:block}.media-tile__open:focus{outline:0}.media-tile__open:focus-visible+.media-tile__caption .media-tile__name{text-underline-offset:3px;text-decoration:underline;text-decoration-thickness:1px}.media-tile--video{cursor:default}.media-tile img,.media-tile video{object-fit:contain;background:#05070d;width:100%;max-height:360px;display:block}.media-tile--image img{max-height:320px}.media-tile__caption{z-index:3;opacity:0;pointer-events:none;background:linear-gradient(#0000 0%,#00000080 60%,#000000c7 100%);align-items:center;gap:8px;padding:22px 10px 8px;transition:opacity .14s;display:flex;position:absolute;inset:auto 0 0}.media-tile__caption>*{pointer-events:auto}.media-tile:hover .media-tile__caption,.media-tile:focus-within .media-tile__caption{opacity:1}.media-tile--video.is-started .media-tile__caption{display:none}.media-tile__name{color:#fff;white-space:nowrap;text-overflow:ellipsis;text-shadow:0 1px 2px #0009;flex:1;min-width:0;font-size:12px;font-weight:500;overflow:hidden}.media-tile__chip{z-index:4;color:#fff;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);background:#00000080;border:1px solid #ffffff2e;border-radius:8px;flex:none;place-items:center;width:28px;height:28px;text-decoration:none;transition:background .12s,border-color .12s,transform .12s;display:inline-grid;position:relative}.media-tile__chip:hover{background:#000000b3;border-color:#ffffff52;transform:translateY(-1px)}.media-tile__play{cursor:pointer;z-index:1;background:0 0;border:0;place-items:center;width:100%;height:auto;margin:0;padding:0;display:grid;position:absolute;inset:0 0 48px}.media-tile__play:before{content:"";opacity:.7;pointer-events:none;background:radial-gradient(#0000002e 0%,#0000000d 45%,#0000 70%);transition:opacity .16s;position:absolute;inset:0}.media-tile__play:hover:before{opacity:.9}.media-tile__play-icon{color:#fff;-webkit-backdrop-filter:blur(10px);background:#0000008c;border-radius:999px;place-items:center;width:46px;height:46px;padding-left:3px;transition:transform .2s cubic-bezier(.2,.8,.2,1),background .18s,box-shadow .2s;display:grid;position:relative;box-shadow:0 6px 20px -8px #0000008c}.media-tile__play-icon svg{filter:drop-shadow(0 1px 2px #0006)}.media-tile__play:hover .media-tile__play-icon{background:#000000b3;transform:scale(1.06);box-shadow:0 10px 28px -10px #000000a6}.media-tile__play:active .media-tile__play-icon{transition-duration:80ms;transform:scale(.97)}.media-tile__play:focus-visible{outline:none}.media-tile__play:focus-visible .media-tile__play-icon{box-shadow:0 0 0 2px #fff9,0 10px 28px -10px #000000a6}.media-tile__duration{z-index:2;color:#fff;font-variant-numeric:tabular-nums;letter-spacing:.02em;pointer-events:none;background:#000000b8;border-radius:4px;padding:2px 6px;font-size:11px;font-weight:600;position:absolute;bottom:8px;left:8px}.file-attachment{border:1px solid var(--line);border-radius:var(--radius);background:var(--panel);align-items:center;gap:10px;max-width:360px;padding:10px;display:flex}.file-attachment:hover{border-color:var(--line-strong);background:var(--panel-2)}.file-icon{background:var(--accent-soft);width:34px;height:34px;color:var(--accent);border-radius:8px;place-items:center;font-weight:800;display:grid}.file-attachment strong,.file-attachment small{display:block}.file-attachment strong{color:var(--text-strong);font-size:13px}.file-attachment small{color:var(--muted);font-size:11px}.audio-attachment,.document-attachment{border:1px solid var(--line);border-radius:var(--radius);background:var(--panel);width:min(100%,420px);overflow:hidden}.audio-attachment{gap:10px;padding:10px;display:grid}.audio-attachment__meta{align-items:center;gap:10px;min-width:0;display:flex}.audio-attachment audio{width:100%;height:36px}.document-attachment{grid-template-columns:64px minmax(0,1fr) auto;align-items:center;gap:12px;padding:10px;display:grid}.document-attachment__thumbnail{border:1px solid var(--line);background:linear-gradient(135deg, transparent 0 76%, var(--panel-3) 76% 100%), linear-gradient(180deg, #fff 0%, #f0f2f7 100%);width:64px;height:82px;color:var(--accent);letter-spacing:0;cursor:pointer;border-radius:6px;place-items:center;font-size:13px;font-weight:800;text-decoration:none;display:inline-grid;position:relative;overflow:hidden;box-shadow:0 8px 18px -16px #0009}.document-attachment__thumbnail:before,.document-attachment__thumbnail:after{content:"";background:color-mix(in srgb, var(--muted) 36%, transparent);border-radius:999px;height:2px;position:absolute;left:14px;right:14px}.document-attachment__thumbnail:before{top:48px}.document-attachment__thumbnail:after{top:56px}.document-attachment__meta{gap:5px;min-width:0;display:grid}.document-attachment__title{width:100%;min-width:0;color:var(--text-strong);white-space:nowrap;text-overflow:ellipsis;text-align:left;cursor:pointer;background:0 0;border:0;padding:0;font-size:13px;font-weight:700;text-decoration:none;overflow:hidden}.document-attachment__title:hover{text-underline-offset:3px;text-decoration:underline}.document-attachment__meta small{color:var(--muted);white-space:nowrap;font-size:11px}.document-attachment__download{width:30px;height:30px;color:var(--muted);border-radius:8px;place-items:center;text-decoration:none;transition:background .12s,color .12s;display:inline-grid}.document-attachment__download:hover{background:var(--panel-2);color:var(--text-strong)}@media (width<=520px){.message-group{grid-template-columns:44px minmax(0,1fr);padding:7px 12px}:root[data-user-align=right] .message-group.is-self,:root[data-other-align=right] .message-group:not(.is-self){grid-template-columns:minmax(0,1fr) 44px}.message-row{margin-left:-44px;margin-right:-12px;padding-left:44px;padding-right:12px}:root[data-user-align=right] .message-group.is-self .message-row,:root[data-other-align=right] .message-group:not(.is-self) .message-row{margin-left:-12px;margin-right:-44px;padding-left:12px;padding-right:44px}.message-group .group-body>header{margin-left:-44px;margin-right:-12px;padding-left:44px;padding-right:12px}:root[data-user-align=right] .message-group.is-self .group-body>header,:root[data-other-align=right] .message-group:not(.is-self) .group-body>header{margin-left:-12px;margin-right:-44px;padding-left:12px;padding-right:44px}.row-stamp{display:none}.attachment-grid,.attachment-grid.compact{grid-template-columns:minmax(0,1fr);max-width:100%}}:root[data-message-layout=outlined] .message-group .group-body{width:100%}:root[data-message-layout=outlined] .message-group .message-row{margin-left:0;margin-right:0;padding:0}:root[data-message-layout=outlined] .message-group .group-body>header{margin-left:0;margin-right:0;padding-left:0;padding-right:0}:root[data-message-layout=outlined][data-user-align=right] .message-group.is-self .message-content,:root[data-message-layout=outlined][data-other-align=right] .message-group:not(.is-self) .message-content,:root[data-message-layout=outlined][data-user-align=right] .message-group.is-self .markdown,:root[data-message-layout=outlined][data-other-align=right] .message-group:not(.is-self) .markdown{text-align:start}:root[data-message-layout=outlined][data-user-align=right] .message-group.is-self .thread-hint,:root[data-message-layout=outlined][data-other-align=right] .message-group:not(.is-self) .thread-hint{width:fit-content;margin-left:auto;display:flex}:root[data-message-layout=outlined] .message-group .row-stamp{left:-48px}:root[data-message-layout=outlined][data-user-align=right] .message-group.is-self .row-stamp,:root[data-message-layout=outlined][data-other-align=right] .message-group:not(.is-self) .row-stamp{left:auto;right:-48px}:root[data-message-layout=outlined] .message-group .message-row:not(:first-child){margin-top:4px}:root[data-message-layout=outlined] .message-group .message-content{border-radius:var(--radius-lg);width:fit-content;max-width:min(96%,1100px);margin-top:2px;padding:10px 14px;position:relative}:root[data-message-layout=outlined] .message-group .message-row:not(.is-preamble):not(.after-preamble) .message-content{border:1px solid var(--line-strong)}:root[data-message-layout=outlined] .message-group.is-agent .message-content{width:96%;max-width:1100px}:root[data-message-layout=outlined] .message-group .message-row.before-final-message+.message-row.after-preamble{margin-top:-1px}:root[data-message-layout=outlined] .message-group.is-agent .message-row.before-final-message .message-content{border-bottom-right-radius:0;border-bottom-left-radius:0}:root[data-message-layout=outlined] .message-group.is-agent .message-row.after-preamble .message-content{border-top-left-radius:0;border-top-right-radius:0}:root[data-density=compact] .message-group{grid-template-columns:42px minmax(0,1fr);padding:2px 18px}:root[data-density=compact][data-user-align=right] .message-group.is-self,:root[data-density=compact][data-other-align=right] .message-group:not(.is-self){grid-template-columns:minmax(0,1fr) 42px}:root[data-density=compact] .message-group>.avatar{border-radius:7px;width:26px;height:26px;font-size:11px}:root[data-density=compact] .group-body>header{gap:6px;margin-bottom:0}:root[data-density=compact] .message-group .group-body>header{margin-left:-42px;padding-left:42px}:root[data-density=compact][data-user-align=right] .message-group.is-self .group-body>header,:root[data-density=compact][data-other-align=right] .message-group:not(.is-self) .group-body>header{margin-left:-18px;margin-right:-42px;padding-left:18px;padding-right:42px}:root[data-density=compact] .group-body>header strong,:root[data-density=compact] .author-name{font-size:13px}:root[data-density=compact] .group-body>header time{font-size:10px}:root[data-density=compact] .message-row{margin-left:-42px;padding-left:42px}:root[data-density=compact][data-user-align=right] .message-group.is-self .message-row,:root[data-density=compact][data-other-align=right] .message-group:not(.is-self) .message-row{margin-left:-18px;margin-right:-42px;padding-left:18px;padding-right:42px}:root[data-density=compact] .markdown{font-size:13.5px;line-height:1.42}:root[data-density=compact] .reactions-bar{margin-top:2px}:root[data-density=compact][data-message-layout=outlined] .message-group .message-row{margin-left:0;padding-left:0}:root[data-density=compact][data-message-layout=outlined] .message-group .row-stamp{left:-34px}:root[data-density=compact][data-message-layout=outlined][data-user-align=right] .message-group.is-self .row-stamp,:root[data-density=compact][data-message-layout=outlined][data-other-align=right] .message-group:not(.is-self) .row-stamp{left:auto;right:-34px}@media (width<=520px){:root[data-density=compact] .message-group{padding-left:12px;padding-right:12px}}:root[data-message-layout=outlined][data-user-align=right] .message-group.is-self .message-row,:root[data-message-layout=outlined][data-other-align=right] .message-group:not(.is-self) .message-row,:root[data-message-layout=outlined][data-user-align=right] .message-group.is-self .group-body>header,:root[data-message-layout=outlined][data-other-align=right] .message-group:not(.is-self) .group-body>header{margin-left:0;margin-right:0;padding-left:0;padding-right:0}.composer{--composer-card-top:8px;--composer-overlay-gap:8px;--composer-overlay-inset-x:18px;background:var(--bg);gap:0;padding:8px 18px 6px;display:grid;position:relative}.composer-card{background:var(--panel);border:1px solid var(--line-strong);border-radius:var(--radius-lg);box-shadow:var(--key-edge);flex-direction:column;transition:border-color .12s,box-shadow .12s;display:flex;overflow:hidden}.composer:focus-within .composer-card{border-color:color-mix(in srgb, var(--accent) 55%, var(--line-strong));box-shadow:var(--key-edge), 0 0 0 3px color-mix(in srgb, var(--accent) 14%, transparent)}.composer-suggestions{left:var(--composer-overlay-inset-x);bottom:calc(100% - var(--composer-card-top) + var(--composer-overlay-gap));z-index:40;width:min(560px, calc(100% - (var(--composer-overlay-inset-x) * 2)));border:1px solid var(--line-strong);background:color-mix(in srgb, var(--panel) 97%, transparent);max-height:min(320px,45vh);box-shadow:var(--shadow);border-radius:12px;margin:0;position:absolute;overflow:hidden auto}.composer-suggestions button{border:0;border-bottom:1px solid var(--line);width:100%;min-height:48px;color:var(--text);text-align:left;background:0 0;border-radius:0;grid-template-columns:30px minmax(0,1fr) auto;align-items:center;gap:10px;padding:8px 10px;display:grid}.composer-suggestions button:last-child{border-bottom:0}.composer-suggestions button:hover,.composer-suggestions button.active{background:var(--hover-strong)}.suggestion-mark{background:var(--accent-soft);width:30px;height:30px;color:var(--accent);border-radius:8px;place-items:center;font-size:13px;font-weight:800;display:grid}.suggestion-copy{gap:2px;min-width:0;display:grid}.suggestion-copy strong,.suggestion-copy span{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.suggestion-copy strong{color:var(--text-strong);font-size:13px}.suggestion-copy span{color:var(--muted);font-size:12px}.suggestion-kind{color:var(--muted-2);text-transform:uppercase;font-size:11px;font-weight:700}.suggestion-hint{color:var(--muted);font-size:12px;font-style:normal;font-weight:500}.composer-notice{margin:0 var(--composer-overlay-inset-x,0) 6px;border:1px solid var(--line-strong);background:color-mix(in srgb, var(--panel) 97%, transparent);border-radius:10px;align-items:baseline;gap:8px;padding:7px 10px;font-size:13px;display:flex}.composer-notice__label{color:var(--muted-2);text-transform:uppercase;flex:none;font-size:11px;font-weight:700}.composer-notice--error .composer-notice__label{color:var(--danger)}.composer-notice__text{min-width:0;color:var(--text);overflow-wrap:anywhere;flex:1}.composer-notice__dismiss{width:22px;height:22px;color:var(--muted);cursor:pointer;background:0 0;border:0;border-radius:6px;flex:none;align-self:center;place-items:center;font-size:15px;line-height:1;display:grid}.composer-notice__dismiss:hover{background:var(--hover-strong);color:var(--text-strong)}.composer-toolbar{border:0;border-top:1px solid var(--line);background:color-mix(in srgb, var(--panel-2) 35%, transparent);width:100%;min-width:0;box-shadow:none;scrollbar-width:none;-webkit-overflow-scrolling:touch;border-radius:0;align-items:center;gap:2px;margin:0;padding:4px 6px;display:inline-flex;overflow:auto hidden}.composer-toolbar::-webkit-scrollbar{display:none}.composer-toolbar button{min-width:28px;height:26px;color:var(--text);opacity:.78;background:0 0;border:0;border-radius:6px;flex:none;place-items:center;font-size:11.5px;font-weight:700;transition:background .1s,color .1s,opacity .1s,transform 80ms;display:grid}.composer-toolbar button:hover{background:var(--hover-strong);color:var(--text-strong);opacity:1}.composer-toolbar button.active{background:var(--accent-soft);color:var(--accent);opacity:1}.composer-toolbar button:active{transform:translateY(1px)}.gif-picker{border:1px solid var(--line-strong);background:color-mix(in srgb, var(--panel) 96%, transparent);width:min(520px,100%);max-height:40dvh;box-shadow:var(--shadow);border-radius:16px;margin-top:8px;margin-bottom:8px;padding:10px;animation:.16s cubic-bezier(.2,.8,.2,1) picker-in;overflow-y:auto}.gif-picker-head{grid-template-columns:auto minmax(0,1fr);align-items:center;gap:10px;padding:2px 2px 10px;display:grid}.gif-picker-head strong{color:var(--text-strong);font-size:13px}.gif-picker-head input{border:1px solid var(--line);border-radius:var(--radius);background:var(--panel-2);min-width:0;height:32px;padding:0 10px}.gif-grid{grid-template-columns:repeat(3,minmax(0,1fr));gap:8px;max-height:240px;display:grid;overflow-y:auto}.gif-grid button{aspect-ratio:4/3;background:var(--panel-2);color:#fff;box-shadow:inset 0 0 0 1px var(--line);border:0;border-radius:12px;padding:0;transition:transform .12s,box-shadow .12s;position:relative;overflow:hidden}.gif-grid button:hover{box-shadow:inset 0 0 0 2px var(--accent), 0 14px 30px -22px #000c;transform:translateY(-2px)}.gif-grid img{object-fit:cover;width:100%;height:100%;display:block}.gif-grid span{text-overflow:ellipsis;white-space:nowrap;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);background:#0000008f;border-radius:999px;padding:4px 7px;font-size:10.5px;font-weight:700;position:absolute;bottom:6px;left:6px;right:6px;overflow:hidden}@keyframes picker-in{0%{opacity:0;transform:translateY(8px)scale(.98)}to{opacity:1;transform:translateY(0)scale(1)}}.composer-row{--composer-control-size:36px;--composer-line-height:22px;--composer-text-padding-block:7px;background:0 0;border:0;border-radius:0;grid-template-columns:minmax(0,1fr) auto;align-items:start;gap:4px;padding:8px 8px 4px 10px;display:grid}.composer-row:has(.composer-icon){grid-template-columns:auto minmax(0,1fr) auto}.composer:focus-within .composer-toolbar,.composer-row:focus-within{border-color:#0000}.composer-row:focus-within{box-shadow:none}.composer-icon{width:var(--composer-control-size);height:var(--composer-control-size);margin-top:calc(var(--composer-text-padding-block) + (var(--composer-line-height) - var(--composer-control-size)) / 2);color:var(--muted);cursor:pointer;border-radius:10px;align-self:start;place-items:center;transition:background .12s,color .12s;display:grid}.composer-icon:hover{background:var(--hover-strong);color:var(--text-strong)}.composer-icon input[type=file]{opacity:0;pointer-events:none;block-size:1px;inline-size:1px;position:absolute}.composer textarea,.reply-composer textarea{width:100%;height:auto;min-height:44px;max-height:50vh;padding:var(--composer-text-padding-block) 4px;resize:none;color:var(--text);line-height:var(--composer-line-height);box-sizing:border-box;align-self:start;font-size:14.5px;overflow-y:auto}.composer textarea::placeholder,.reply-composer textarea::placeholder{color:var(--muted)}.send{width:var(--composer-control-size);height:var(--composer-control-size);margin-top:calc(var(--composer-text-padding-block) + (var(--composer-line-height) - var(--composer-control-size)) / 2);border:1px solid color-mix(in srgb, var(--accent) 70%, var(--text-strong));border-radius:var(--radius);background:var(--accent);color:var(--accent-contrast);box-shadow:var(--key-edge);align-self:start;place-items:center;transition:background .12s,transform 80ms,box-shadow 80ms,opacity .12s;display:grid}.send:hover:not(:disabled){background:var(--accent-hover);transform:translateY(-1px)}.send:active:not(:disabled){box-shadow:var(--key-edge-pressed);transform:translateY(1px)}.send:disabled{background:var(--panel-3);border-color:var(--line-strong);color:var(--muted-2);cursor:not-allowed;box-shadow:none}.composer-attachment{background:var(--panel);border:1px solid var(--line);border-radius:var(--radius);color:var(--text);align-items:center;gap:8px;width:fit-content;margin-top:8px;margin-bottom:8px;padding:6px 10px;font-size:13px;display:inline-flex}.attachment-icon{background:var(--accent-soft);width:20px;height:20px;color:var(--accent);border-radius:6px;place-items:center;display:grid}.pending-image{object-fit:cover;border:1px solid var(--line);background:var(--panel-2);border-radius:7px;width:42px;height:32px}.attachment-name{text-overflow:ellipsis;white-space:nowrap;max-width:240px;overflow:hidden}.attachment-remove{width:18px;height:18px;color:var(--muted);background:0 0;border:0;border-radius:50%;font-size:14px;line-height:1}.attachment-remove:hover{background:var(--danger);color:#fff}.composer-hint{color:var(--muted-2);padding:7px 4px 0;font-size:11px}.composer-hint kbd{background:var(--panel-2);border:1px solid var(--line-strong);font-family:var(--font-mono);color:var(--text);box-shadow:0 1px 0 var(--line-strong);border-radius:4px;padding:0 5px;font-size:10.5px;display:inline-block}@media (width<=820px){.composer{padding:8px calc(14px + var(--safe-area-right)) calc(6px + var(--safe-area-bottom)) calc(14px + var(--safe-area-left))}.composer textarea,.reply-composer textarea{font-size:16px}.composer-suggestions{max-height:min(320px,42dvh)}}.thread{background:var(--panel);border-left:1px solid var(--line);opacity:0;pointer-events:none;grid-template-rows:auto minmax(0,1fr) auto;grid-template-columns:minmax(0,1fr);min-width:0;transition:opacity .18s,transform .22s cubic-bezier(.2,.8,.2,1);display:grid;overflow:hidden;transform:translate(28px)}.thread.open{opacity:1;pointer-events:auto;transform:translate(0)}.thread.covered{opacity:0;pointer-events:none}.thread>header{border-bottom:1px solid var(--line);background:linear-gradient(180deg, #ffffff05, transparent), var(--panel);align-items:center;gap:10px;min-height:60px;padding:12px 16px;display:flex}.thread>header>div{flex:1;min-width:0}.thread>header p,.thread>header strong{margin:0}.thread>header p{color:var(--muted);font-family:var(--font-mono);text-transform:uppercase;letter-spacing:.08em;text-overflow:ellipsis;white-space:nowrap;font-size:10px;font-weight:600;overflow:hidden}.thread>header strong{color:var(--text-strong);font-size:14px;display:block}.thread .thread-pin-error{color:var(--danger);margin-top:3px;font-size:11px;line-height:1.35;display:block}.thread .close{background:var(--panel-2);width:28px;height:28px;color:var(--muted);border:0;border-radius:50%;font-size:18px;line-height:1}.thread .close:hover{background:var(--panel-3);color:var(--text-strong)}.thread .thread-open-link{color:var(--accent);font-family:var(--font-mono);white-space:nowrap;flex:none;font-size:11px;font-weight:700;text-decoration:none}.thread .thread-open-link:hover{color:var(--accent-hover);text-decoration:underline}.thread .thread-open-link:focus-visible{outline:2px solid var(--accent);outline-offset:3px;border-radius:3px}.thread .thread-back{background:var(--panel-2);width:28px;height:28px;color:var(--muted);border:0;border-radius:50%;flex:none;place-items:center;display:grid}.thread .thread-back:hover{background:var(--panel-3);color:var(--text-strong)}.thread .thread-back:focus-visible,.thread .close:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}.thread-scroll{padding:12px 16px;overflow-y:auto}.thread-root{border-bottom:1px solid var(--line);grid-template-columns:38px minmax(0,1fr);gap:12px;padding-bottom:12px;display:grid}.thread-divider{align-items:center;gap:10px;margin:14px 0 10px;display:flex}.thread-divider:before,.thread-divider:after{content:"";background:var(--line);flex:1;height:1px}.thread-divider span{font-family:var(--font-mono);color:var(--muted);text-transform:uppercase;letter-spacing:.08em;font-size:10px;font-weight:600}.reply-list{flex-direction:column;gap:10px;display:flex}.reply{border-radius:var(--radius-sm);grid-template-columns:30px minmax(0,1fr);gap:10px;padding:6px;display:grid}.reply:hover{background:var(--hover)}.thread .reply-quote-btn,.thread .thread-action-btn{width:26px;height:26px;color:var(--muted);background:0 0;border:0;border-radius:6px;place-items:center;display:inline-grid}.thread .reply-quote-btn:hover,.thread .thread-action-btn:hover{background:var(--hover-strong);color:var(--text-strong)}.thread .reply-quote-btn:disabled,.thread .thread-action-btn:disabled{cursor:default;opacity:.45}.thread .thread-action-btn--danger{color:var(--danger)}.thread .thread-action-btn--danger:hover{background:color-mix(in srgb, var(--danger) 12%, transparent);color:var(--danger)}.thread .thread-more-actions{display:none}@media (hover:none),(pointer:coarse){.thread .group-body>header{min-height:28px;padding-right:32px;position:relative}.thread .reply-quote-btn,.thread .thread-action-btn:not(.thread-more-actions){display:none}.thread .thread-more-actions{clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap;width:1px;height:1px;margin:-1px;padding:0;display:inline-grid;position:absolute;top:0;right:0;overflow:hidden}.thread .thread-more-actions:focus-visible{clip:auto;clip-path:none;border:1px solid var(--line-strong);background:var(--panel);width:28px;height:28px;box-shadow:var(--shadow);margin:0;overflow:visible}}.reply-composer{--composer-card-top:10px;--composer-overlay-inset-x:14px;background:var(--panel);border-top:1px solid var(--line);padding:10px 14px 14px}.reply-composer .composer-row{border-radius:0}.thread-empty{text-align:center;grid-row:span 3;align-content:center;place-items:center;gap:8px;padding:32px 24px;display:grid}.thread-icon{background:var(--panel-2);width:56px;height:56px;color:var(--muted);border-radius:16px;place-items:center;display:grid}.thread-empty strong{color:var(--text-strong);font-size:15px}.thread-empty span{color:var(--muted);max-width:260px;font-size:13px;line-height:1.5}.profile-pane{overflow-y:auto}.profile-hero{background:linear-gradient(180deg, transparent, #0000003d), linear-gradient(135deg, hsl(var(--hue,220deg) 76% 58%), hsl(calc(var(--hue,220deg) + 54deg) 74% 38%));border-bottom:1px solid var(--line);place-items:end center;min-height:210px;padding:28px 20px;display:grid}.profile-avatar{aspect-ratio:1;color:#fff;background:#ffffff2e;border-radius:16px;place-items:center;width:min(240px,70%);font-size:clamp(48px,12vw,88px);font-weight:800;display:grid;overflow:hidden;box-shadow:0 26px 60px -30px #000000e6}.profile-avatar img{object-fit:cover;width:100%;height:100%}.profile-pane-body{gap:18px;padding:18px 16px 22px;display:grid}.profile-pane-title{justify-content:space-between;align-items:flex-start;gap:12px;display:flex}.profile-pane-title h2{color:var(--text-strong);letter-spacing:0;margin:0;font-size:22px}.profile-pane-title span{color:var(--muted);margin-top:3px;font-size:13px;display:block}.profile-pane-title .bot-badge{border:1px solid color-mix(in srgb, var(--accent) 45%, transparent);min-height:20px;color:var(--accent);border-radius:999px;align-items:center;margin-top:6px;padding:0 8px;font-size:11px;font-weight:800;line-height:1;display:inline-flex}.text-action{color:var(--accent);background:0 0;border:0;border-radius:6px;padding:4px 6px;font-size:13px;font-weight:700}.text-action:hover{background:var(--accent-soft)}.profile-presence{color:var(--text);align-items:center;gap:8px;font-size:14px;display:inline-flex}.profile-actions-row{grid-template-columns:repeat(auto-fit,minmax(132px,1fr));gap:10px;display:grid}.profile-actions-row .primary-action,.profile-actions-row .ghost-action{border-radius:var(--radius);white-space:nowrap;justify-content:center;align-items:center;width:100%;min-width:0;height:48px;padding:0 16px;font-size:14px;font-weight:800;line-height:1;display:inline-flex}.moderation-actions{grid-template-columns:repeat(auto-fit,minmax(108px,1fr));gap:8px;display:grid}.moderation-actions .primary-action,.moderation-actions .ghost-action,.moderation-actions .danger-action{border-radius:var(--radius);min-height:40px;font-size:13px;font-weight:800}.danger-action{border:1px solid color-mix(in srgb, var(--danger), transparent 35%);background:color-mix(in srgb, var(--danger), transparent 86%);color:var(--danger)}.role-pill{background:var(--panel-2);color:var(--muted);text-transform:uppercase;border-radius:999px;padding:4px 8px;font-size:11px;font-weight:800}.profile-info{border-top:1px solid var(--line);gap:12px;padding-top:18px;display:grid}.profile-info header{justify-content:space-between;align-items:center;gap:10px;display:flex}.profile-info header strong{color:var(--text-strong);font-size:14px}.profile-info-row{grid-template-columns:48px minmax(0,1fr);align-items:center;gap:14px;min-height:48px;display:grid}.info-icon{background:var(--panel-2);width:48px;height:48px;color:var(--muted);border-radius:12px;justify-content:center;align-items:center;line-height:1;display:inline-flex}.info-icon svg{flex:none;display:block}.profile-info-row>div>small,.profile-info-row>div>span{display:block}.profile-info-row>div>small{color:var(--muted);font-size:12px;line-height:1.2}.profile-info-row>div>span{color:var(--text);overflow-wrap:anywhere;font-size:14px;line-height:1.3}.profile-note{color:var(--muted);margin:0;font-size:13px;line-height:1.5}@media (width<=820px){.thread{min-height:100dvh}.thread>header{min-height:calc(60px + var(--safe-area-top));padding-top:calc(12px + var(--safe-area-top));padding-right:calc(16px + var(--safe-area-right));padding-left:calc(16px + var(--safe-area-left))}.thread-scroll{padding-right:calc(16px + var(--safe-area-right));padding-left:calc(16px + var(--safe-area-left))}.reply-composer{padding-right:calc(14px + var(--safe-area-right));padding-bottom:calc(14px + var(--safe-area-bottom));padding-left:calc(14px + var(--safe-area-left))}}.thread-scroll{overflow-anchor:none}.thread-history{text-align:center;padding:8px 16px}.thread-history p{color:var(--danger);font-size:12px}.thread-history--latest{border-top:1px solid var(--line)}.thread-target{outline:2px solid var(--accent);outline-offset:-2px;border-radius:var(--radius)}.artifact-viewer{z-index:2;border-left:1px solid var(--line);background:var(--panel);opacity:0;pointer-events:none;grid-template-rows:auto minmax(0,1fr);min-width:0;transition:opacity .18s,transform .22s cubic-bezier(.2,.8,.2,1);display:grid;overflow:hidden;transform:translate(28px)}.artifact-viewer.open{opacity:1;pointer-events:auto;transform:translate(0)}.artifact-viewer__header{border-bottom:1px solid var(--line);background:color-mix(in srgb, var(--panel) 92%, var(--bg));justify-content:space-between;align-items:center;gap:16px;min-height:64px;padding:10px 12px 10px 16px;display:flex}.artifact-viewer__identity{grid-template-columns:auto minmax(0,1fr) auto;align-items:baseline;gap:5px 10px;min-width:0;display:grid}.artifact-viewer__identity span{color:var(--muted);letter-spacing:.04em;text-transform:uppercase;grid-column:1/-1;font-size:11px;font-weight:700}.artifact-viewer__identity strong{min-width:0;color:var(--text-strong);text-overflow:ellipsis;white-space:nowrap;font-size:14px;overflow:hidden}.artifact-viewer__identity small{color:var(--muted);font-variant-numeric:tabular-nums;white-space:nowrap;font-size:11px}.artifact-viewer__actions,.artifact-viewer__segmented{align-items:center;gap:4px;display:inline-flex}.artifact-viewer__actions>a,.artifact-viewer__actions>button,.artifact-viewer__segmented button,.artifact-viewer__pdf-toolbar button{border-radius:var(--radius-sm);min-width:32px;height:32px;color:var(--muted);background:0 0;border:1px solid #0000;place-items:center;padding:0 9px;text-decoration:none;display:inline-grid}.artifact-viewer__office-toolbar button,.artifact-viewer__sheet-tabs button{border-radius:var(--radius-sm);min-height:30px;color:var(--muted);background:0 0;border:1px solid #0000;padding:0 10px;font-size:11px}.artifact-viewer__actions>button{font-size:20px;line-height:1}.artifact-viewer__actions>a:hover,.artifact-viewer__actions>button:hover,.artifact-viewer__segmented button:hover,.artifact-viewer__pdf-toolbar button:hover:not(:disabled){border-color:var(--line);background:var(--hover-strong);color:var(--text-strong)}.artifact-viewer__actions :focus-visible,.artifact-viewer__pdf-toolbar button:focus-visible{outline:2px solid var(--accent);outline-offset:2px}.artifact-viewer__segmented{border:1px solid var(--line);border-radius:var(--radius);background:var(--panel-2);padding:2px}.artifact-viewer__segmented button{min-width:58px;height:28px;font-size:11px;font-weight:650}.artifact-viewer__segmented button.active{border-color:var(--line);background:var(--panel);color:var(--text-strong)}.artifact-viewer__body{background:var(--bg);min-height:0;overflow:auto}.artifact-viewer__state{min-height:100%;color:var(--muted);text-align:center;align-content:center;justify-items:center;gap:10px;padding:32px 24px;display:grid}.artifact-viewer__state strong{color:var(--text-strong);font-size:15px}.artifact-viewer__state p{max-width:34ch;margin:0;font-size:13px;line-height:1.5}.artifact-viewer__state a{border:1px solid var(--line-strong);border-radius:var(--radius-sm);background:var(--panel);min-height:36px;color:var(--text-strong);margin-top:4px;padding:8px 12px;font-size:13px;font-weight:650;text-decoration:none}.artifact-viewer__state--error svg{color:var(--danger)}.artifact-viewer__spinner{border:2px solid var(--line-strong);border-top-color:var(--accent);border-radius:50%;width:26px;height:26px;animation:.7s linear infinite artifact-spin}@keyframes artifact-spin{to{transform:rotate(360deg)}}.artifact-viewer__source{background:color-mix(in srgb, var(--bg) 90%, #090b10);width:max-content;min-width:100%;min-height:100%;color:var(--text);font-family:var(--font-mono);tab-size:2;white-space:pre;margin:0;padding:20px;font-size:12px;line-height:1.65}.artifact-viewer__source code{font:inherit}.artifact-viewer__document{border:1px solid var(--line);border-radius:var(--radius);background:var(--panel);width:min(100%,760px);min-height:calc(100% - 32px);color:var(--text);overflow-wrap:anywhere;margin:16px auto;padding:clamp(24px,5vw,56px);font-size:15px;line-height:1.65}.artifact-viewer__document>:first-child{margin-top:0}.artifact-viewer__document>:last-child{margin-bottom:0}.artifact-viewer__document h1,.artifact-viewer__document h2,.artifact-viewer__document h3{color:var(--text-strong);line-height:1.25}.artifact-viewer__document h1{font-size:28px}.artifact-viewer__document h2{margin-top:1.75em;font-size:21px}.artifact-viewer__document h3{margin-top:1.5em;font-size:17px}.artifact-viewer__document pre{border-radius:var(--radius);background:var(--panel-2);padding:14px;overflow:auto}.artifact-viewer__document code{font-family:var(--font-mono)}.artifact-viewer__document table{border-collapse:collapse;width:100%}.artifact-viewer__document th,.artifact-viewer__document td{border:1px solid var(--line-strong);text-align:left;padding:8px 10px}.artifact-viewer__document img{max-width:100%;height:auto}.artifact-viewer__document a{color:var(--accent)}.artifact-viewer__body.is-pdf{grid-template-rows:auto minmax(0,1fr);display:grid;overflow:hidden}.artifact-viewer__body.is-office{grid-template-rows:auto minmax(0,1fr) auto;display:grid;overflow:hidden}.artifact-viewer__office-toolbar,.artifact-viewer__sheet-tabs{border-bottom:1px solid var(--line);background:var(--panel);min-height:44px;color:var(--muted);font-variant-numeric:tabular-nums;justify-content:center;align-items:center;gap:4px;padding:6px 10px;font-size:11px;display:flex}.artifact-viewer__office-toolbar button:disabled{cursor:not-allowed;opacity:.4}.artifact-viewer__office-toolbar button:hover:not(:disabled),.artifact-viewer__sheet-tabs button:hover,.artifact-viewer__sheet-tabs button.active{border-color:var(--line);background:var(--hover-strong);color:var(--text-strong)}.artifact-viewer__office-toolbar button:focus-visible,.artifact-viewer__sheet-tabs button:focus-visible{outline:2px solid var(--accent);outline-offset:2px}.artifact-viewer__office-toolbar{flex-wrap:wrap}.artifact-viewer__spreadsheet{background:var(--panel);min-height:0;overflow:auto}.artifact-viewer__spreadsheet table{table-layout:fixed;border-spacing:0;border-collapse:separate;width:max-content;color:var(--text);font-size:12px}.artifact-viewer__spreadsheet th,.artifact-viewer__spreadsheet td{box-sizing:border-box;border-right:1px solid var(--line);border-bottom:1px solid var(--line);background:var(--panel);text-align:left;text-overflow:ellipsis;white-space:nowrap;width:160px;min-width:160px;max-width:160px;height:30px;padding:5px 8px;overflow:hidden}.artifact-viewer__spreadsheet thead th{z-index:2;background:var(--panel-2);color:var(--muted);text-align:center;position:sticky;top:0}.artifact-viewer__spreadsheet .row-heading{z-index:1;background:var(--panel-2);width:44px;min-width:44px;color:var(--muted);text-align:right;font-variant-numeric:tabular-nums;position:sticky;left:0}.artifact-viewer__spreadsheet thead .row-heading{z-index:3}.artifact-viewer__grid-note{border:1px solid var(--line);border-radius:var(--radius-sm);background:var(--panel-2);width:max-content;max-width:min(480px,100vw - 48px);color:var(--muted);white-space:normal;margin:16px;padding:8px 10px;font-size:12px;line-height:1.45;position:sticky;left:0}.artifact-viewer__sheet-tabs{border-top:1px solid var(--line);border-bottom:0;justify-content:flex-start;overflow-x:auto}.artifact-viewer__sheet-tabs button{flex:none}.artifact-viewer__slide-stage{align-content:center;place-items:center;gap:12px;min-height:0;padding:24px;display:grid;overflow:auto}.artifact-viewer__slide{aspect-ratio:16/9;color:#172033;background:#fff;flex-direction:column;justify-content:safe center;width:min(100%,860px);padding:48px;display:flex;overflow:auto;box-shadow:0 16px 48px -24px #000000a6}.artifact-viewer__slide h2{letter-spacing:0;margin:0 0 .7em;font-size:36px;line-height:1.15}.artifact-viewer__slide p{margin:.35em 0;font-size:20px;line-height:1.4}.artifact-viewer__office-note{color:var(--muted);margin:0;font-size:12px}@media (width<=640px){.artifact-viewer__slide{padding:28px}.artifact-viewer__slide h2{font-size:24px}.artifact-viewer__slide p{font-size:15px}}.artifact-viewer__pdf-toolbar{border-bottom:1px solid var(--line);background:var(--panel);min-height:44px;color:var(--muted);font-variant-numeric:tabular-nums;justify-content:center;align-items:center;gap:4px;padding:6px 10px;font-size:11px;display:flex}.artifact-viewer__pdf-toolbar button{min-width:30px;height:30px;font-size:11px}.artifact-viewer__pdf-toolbar button:disabled{cursor:not-allowed;opacity:.4}.artifact-viewer__toolbar-divider{background:var(--line);width:1px;height:18px;margin:0 4px}.artifact-viewer__pdf-stage{text-align:center;min-height:0;padding:24px;overflow:auto}.artifact-viewer__pdf-stage canvas{background:#fff;max-width:none;transition:opacity .12s;display:inline-block;box-shadow:0 16px 48px -24px #000000a6}.artifact-viewer__pdf-text{clip:rect(0, 0, 0, 0);white-space:nowrap;border:0;width:1px;height:1px;padding:0;position:absolute;overflow:hidden}.artifact-viewer__pdf-stage.is-rendering canvas{opacity:.55}.hljs-comment,.hljs-quote{color:var(--muted);font-style:italic}.hljs-keyword,.hljs-selector-tag,.hljs-literal,.hljs-section,.hljs-link{color:var(--accent)}.hljs-string,.hljs-title,.hljs-name,.hljs-type,.hljs-attribute,.hljs-symbol,.hljs-bullet,.hljs-addition{color:var(--success)}.hljs-number,.hljs-meta,.hljs-built_in,.hljs-builtin-name,.hljs-params{color:var(--activity-accent)}.hljs-deletion{color:var(--danger)}@media (width<=820px){.artifact-viewer{z-index:40;border-left:0;min-height:100dvh;position:fixed;inset:0}.artifact-viewer__header{min-height:calc(64px + var(--safe-area-top));padding-top:calc(10px + var(--safe-area-top));padding-right:calc(12px + var(--safe-area-right));padding-left:calc(16px + var(--safe-area-left))}.artifact-viewer__identity small{display:none}.artifact-viewer__document{border:0;border-radius:0;min-height:100%;margin:0}}@media (prefers-reduced-motion:reduce){.artifact-viewer{transition:none}.artifact-viewer__spinner{animation-duration:1.4s}}.modal-scrim{z-index:50;-webkit-backdrop-filter:blur(14px);backdrop-filter:blur(14px);background:#05080f8a;place-items:center;padding:24px;display:grid;position:fixed;inset:0}.modal-backdrop{background:0 0;border:0;position:absolute;inset:0}.modal-backdrop:focus{outline:0}.profile-modal{z-index:1;background:var(--panel);border:1px solid var(--line-strong);border-radius:var(--radius-xl);width:min(480px,100%);box-shadow:var(--key-edge), var(--shadow);animation:.15s ease-out settings-modal-fade;position:relative;overflow:hidden}.profile-modal>header{justify-content:space-between;align-items:flex-start;gap:12px;padding:18px 20px 4px;display:flex}.profile-modal>header p{color:var(--muted);font-family:var(--font-mono);text-transform:uppercase;letter-spacing:.08em;margin:0 0 4px;font-size:10px;font-weight:600}.profile-modal>header h2{color:var(--text-strong);font-family:var(--font-display);letter-spacing:-.01em;margin:0;font-size:20px;font-weight:700}.profile-modal>header>button{border:1px solid var(--line);border-radius:var(--radius-sm);background:var(--panel-2);width:28px;height:28px;color:var(--muted);flex:none;place-items:center;font-size:16px;line-height:1;display:grid}.profile-modal>header>button:hover{background:var(--panel-3);color:var(--text-strong)}.create-modal{width:min(420px,100%)}.profile-form{gap:14px;padding:20px;display:grid}.field{gap:6px;display:grid}.field span{color:var(--muted);font-size:12px;font-weight:700}.field input,.field select{border:1px solid var(--line);border-radius:var(--radius-sm);background:var(--panel-2);width:100%;height:38px;color:var(--text);padding:0 12px}.field select{cursor:pointer}.field input:focus,.field select:focus{border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-soft);outline:0}.profile-status{color:var(--success);font-size:12px}.profile-status.error{color:var(--danger)}.profile-actions{justify-content:flex-end;gap:8px;padding-top:4px;display:flex}.person-picker{border:1px solid var(--line);border-radius:var(--radius);background:var(--panel-2);gap:4px;max-height:240px;padding:4px;display:grid;overflow-y:auto}.person-choice{border-radius:var(--radius-sm);width:100%;min-height:44px;color:var(--text);text-align:left;background:0 0;border:0;grid-template-columns:32px minmax(0,1fr);align-items:center;gap:10px;padding:6px 8px;display:grid}.person-choice:hover{background:var(--hover-strong)}.person-choice .dm-avatar{width:32px;height:32px}.person-choice strong,.person-choice small{text-overflow:ellipsis;white-space:nowrap;min-width:0;display:block;overflow:hidden}.person-choice strong{color:var(--text-strong);font-size:13px}.person-choice small{color:var(--muted);font-size:12px}.person-empty{color:var(--muted);padding:10px 8px;font-size:12px}.profile-actions .ghost-action,.profile-actions .primary-action,.profile-actions .danger-action{box-sizing:border-box;border-radius:var(--radius);white-space:nowrap;min-height:44px;box-shadow:var(--key-edge);flex:none;justify-content:center;align-items:center;padding:0 14px;font-weight:700;line-height:1;transition:background .12s,box-shadow 80ms,transform 80ms;display:inline-flex}.ghost-action{border:1px solid var(--line-strong);background:var(--panel);color:var(--text)}.primary-action{border:1px solid color-mix(in srgb, var(--accent) 70%, var(--text-strong));background:var(--accent);color:var(--accent-contrast)}.profile-actions .danger-action{border:1px solid color-mix(in srgb, var(--danger) 76%, var(--text-strong));background:var(--danger);color:#fff}.ghost-action:hover{background:var(--hover)}.primary-action:hover{background:var(--accent-hover)}.profile-actions .danger-action:hover:not(:disabled){background:color-mix(in srgb, var(--danger) 86%, #000)}.profile-actions .ghost-action:disabled,.profile-actions .primary-action:disabled,.profile-actions .danger-action:disabled{cursor:default;opacity:.58}.profile-actions .ghost-action:active,.profile-actions .primary-action:active,.profile-actions .danger-action:active{box-shadow:var(--key-edge-pressed);transform:translateY(1px)}.delete-message-scrim{padding:20px}.delete-message-modal{width:min(520px,100%)}.delete-message-modal>header{padding-bottom:10px}.delete-message-content{gap:18px;padding:4px 20px 20px;display:grid}.delete-message-content>p{color:var(--text);margin:0;font-size:14px;line-height:1.5}.delete-message-preview{border:1px solid var(--line-strong);border-radius:var(--radius);background:var(--panel-2);grid-template-columns:36px minmax(0,1fr);align-items:start;gap:12px;padding:14px;display:grid}.delete-message-preview__content{min-width:0}.delete-message-preview>.avatar{border-radius:9px;width:36px;height:36px;margin:0}.delete-message-preview__meta{align-items:baseline;gap:8px;min-width:0;display:flex}.delete-message-preview__meta strong{color:var(--text-strong);text-overflow:ellipsis;white-space:nowrap;font-size:14px;overflow:hidden}.delete-message-preview__meta time{color:var(--muted);flex:none;font-size:11px}.delete-message-preview__body{max-height:128px;color:var(--text);overflow-wrap:anywhere;white-space:pre-wrap;margin-top:4px;font-size:14px;line-height:1.45;overflow:auto}.delete-message-actions{grid-template-columns:repeat(2,minmax(0,1fr));gap:10px;padding-top:0;display:grid}.delete-message-actions button{width:100%}@media (width<=520px){.delete-message-modal{width:100%}.delete-message-content,.delete-message-modal>header{padding-inline:16px}}.channel-settings-scrim{padding:20px}.channel-settings-modal{width:min(460px,100%)}.channel-settings-content{gap:18px;padding:14px 20px 20px;display:grid}.channel-settings-name{color:var(--text-strong);font-family:var(--font-display);font-size:16px;display:block}.channel-settings-content p{color:var(--muted);margin:6px 0 0;font-size:13px;line-height:1.5}.channel-settings-content .channel-settings-warning{border-left:3px solid var(--danger);background:color-mix(in srgb, var(--danger) 8%, var(--panel-2));color:var(--text);margin:0;padding:12px}.channel-settings-actions{grid-template-columns:repeat(2,minmax(0,1fr));gap:10px;padding-top:0;display:grid}.channel-settings-actions button{width:100%}@media (width<=520px){.channel-settings-content,.channel-settings-modal>header{padding-inline:16px}}.image-viewer-scrim{-webkit-backdrop-filter:blur(18px);backdrop-filter:blur(18px);background:#000000c7;padding:28px}.image-viewer{z-index:1;color:#fff;background:#07090f;border:1px solid #ffffff1f;border-radius:14px;grid-template-rows:auto minmax(0,1fr);width:min(1280px,100%);height:min(900px,100dvh - 56px);max-height:100%;animation:.15s cubic-bezier(.2,.8,.2,1) picker-in;display:grid;position:relative;overflow:hidden;box-shadow:0 34px 90px -34px #000000f2}.image-viewer>header{background:#ffffff0a;border-bottom:1px solid #ffffff1a;justify-content:space-between;align-items:center;gap:16px;min-height:52px;padding:10px 12px 10px 16px;display:flex}.image-viewer>header strong{color:#fff;text-overflow:ellipsis;white-space:nowrap;min-width:0;font-size:13px;overflow:hidden}.image-viewer>header div{flex-shrink:0;align-items:center;gap:8px;display:inline-flex}.image-viewer>header a{color:#fff;background:#ffffff14;border-radius:7px;align-items:center;height:30px;padding:0 10px;font-size:12px;font-weight:700;text-decoration:none;display:inline-flex}.image-viewer>header a:hover{background:#ffffff24}.image-viewer>header a:focus-visible,.image-viewer>header button:focus-visible{outline-offset:2px;outline:2px solid #fff}.image-viewer>header button{color:#ffffffc7;background:0 0;border:0;border-radius:7px;place-items:center;width:30px;height:30px;font-size:22px;line-height:1;display:grid}.image-viewer>header button:hover{color:#fff;background:#ffffff1f}.image-viewer-stage{place-items:center;min-height:0;padding:18px;display:grid}.image-viewer-stage img{object-fit:contain;background:#ffffff0a;border-radius:8px;max-width:100%;max-height:100%;display:block}@media (width<=720px),(height<=520px) and (orientation:landscape){.image-viewer-scrim{padding:0}.image-viewer{border:0;border-radius:0;width:100%;height:100dvh}.image-viewer>header{padding-top:calc(10px + var(--safe-area-top));padding-right:calc(12px + var(--safe-area-right));padding-left:calc(16px + var(--safe-area-left))}.image-viewer-stage{padding-right:calc(12px + var(--safe-area-right));padding-bottom:calc(12px + var(--safe-area-bottom));padding-left:calc(12px + var(--safe-area-left))}}.mobile-nav-toggle{top:calc(14px + var(--safe-area-top));left:calc(14px + var(--safe-area-left));z-index:30;border:1px solid var(--line-strong);background:var(--panel);width:38px;height:38px;color:var(--text);border-radius:10px;font-size:22px;line-height:1;display:none;position:fixed}.mobile-nav-toggle .bars{gap:3px;display:grid}.mobile-nav-toggle .bars i{background:currentColor;border-radius:2px;width:16px;height:2px;display:block}.mobile-nav-backdrop{display:none}@media (width<=1180px){.shell{grid-template-columns:72px 240px minmax(0,1fr)}.shell.sidebar-collapsed,.shell.sidebar-collapsed.thread-open,.shell.sidebar-collapsed.search-open{grid-template-columns:72px 0 minmax(0,1fr)}.thread,.search-results{width:min(420px,100vw);box-shadow:var(--shadow);z-index:4;border-left:1px solid var(--line-strong);transition:transform .18s;position:fixed;inset:0 0 0 auto;transform:translate(100%)}.thread.open,.search-results{transform:translate(0)}.desktop-shell .thread,.desktop-shell .search-results{top:52px;bottom:0}}@media (width<=820px){.mobile-nav-toggle{place-items:center;display:grid}.shell,.shell.thread-open,.shell.search-open,.shell.sidebar-collapsed,.shell.sidebar-collapsed.thread-open,.shell.sidebar-collapsed.search-open{grid-template-columns:1fr}.sidebar-collapsed .sidebar{opacity:1;pointer-events:none;transform:translate(calc(-100% - 72px))}.guild-rail,.sidebar{z-index:20;pointer-events:none;height:100dvh;transition:transform .18s;position:fixed;inset:0 auto 0 0;transform:translate(-100%)}.guild-rail{width:72px;padding-top:calc(14px + var(--safe-area-top));padding-bottom:calc(14px + var(--safe-area-bottom))}.sidebar{width:min(260px,100vw - 72px);left:72px;transform:translate(calc(-100% - 72px))}.nav-open .guild-rail,.nav-open .sidebar{pointer-events:auto;transform:translate(0,0)}.nav-open .guild-rail{padding-top:calc(62px + var(--safe-area-top))}.desktop-shell .guild-rail,.desktop-shell .sidebar{height:calc(100dvh - 52px);top:52px}.desktop-shell.nav-open .guild-rail{padding-top:calc(14px + var(--safe-area-top))}.desktop-shell .mobile-nav-backdrop{top:52px}.mobile-nav-backdrop{z-index:15;background:#05081075;border:0;padding:0;display:block;position:fixed;inset:0 0 0 min(332px,100vw)}.topbar{min-height:calc(60px + var(--safe-area-top));padding-top:calc(12px + var(--safe-area-top));padding-right:calc(20px + var(--safe-area-right));padding-left:calc(64px + var(--safe-area-left))}.thread>header,.search-results-head{padding-top:calc(12px + var(--safe-area-top));padding-left:calc(64px + var(--safe-area-left))}.search{width:180px}}@media (width<=520px){.search,.topbar-meta,.topbar-divider{display:none}}.message-row.highlight,.thread-root.highlight,.reply.highlight{animation:1.4s ease-out quote-flash}@keyframes quote-flash{0%{background:color-mix(in srgb, var(--accent) 22%, transparent)}to{background:0 0}}.quote-block{color:inherit;cursor:pointer;text-align:left;max-width:100%;font:inherit;background:0 0;border:0;border-radius:6px;align-items:stretch;gap:.5rem;margin:0 0 .35rem;padding:.25rem .5rem .25rem 0;display:inline-flex}.quote-block:hover:not(:disabled){background:color-mix(in srgb, var(--accent) 8%, transparent)}.quote-block:disabled{cursor:default;opacity:.75}.quote-block .quote-bar{background:var(--accent);border-radius:2px;flex:0 0 3px;align-self:stretch;width:3px}.quote-block .quote-content{flex-direction:column;gap:.1rem;min-width:0;display:flex}.quote-block .quote-author{color:var(--accent);font-size:.78rem;font-weight:600}.quote-block .quote-snippet{color:var(--muted);white-space:nowrap;text-overflow:ellipsis;max-width:56ch;font-size:.85rem;overflow:hidden}.quote-block .quote-snippet.muted{opacity:.75;font-style:italic}.quote-preview{background:color-mix(in srgb, var(--accent) 5%, transparent);border:0;border-bottom:1px solid var(--line);color:var(--muted);border-radius:0;align-items:center;gap:.5rem;margin:0;padding:6px 10px 6px 12px;font-size:12.5px;display:flex}.quote-preview .quote-bar{display:none}.quote-preview-body{flex:1;align-items:baseline;gap:.4rem;min-width:0;display:flex;overflow:hidden}.quote-preview-label{color:color-mix(in srgb, var(--accent) 85%, var(--text));white-space:nowrap;font-size:12px}.quote-preview-label strong{color:var(--text-strong);font-weight:600}.quote-preview-snippet{white-space:nowrap;text-overflow:ellipsis;color:var(--muted);flex:1;min-width:0;font-size:12px;overflow:hidden}.quote-preview-clear{color:var(--muted);cursor:pointer;background:0 0;border:0;border-radius:6px;padding:2px 6px;font-size:16px;line-height:1;transition:background .1s,color .1s}.quote-preview-clear:hover{color:var(--text-strong);background:var(--hover-strong)}.reply-quote-btn{color:var(--muted);cursor:pointer;opacity:0;background:0 0;border:0;margin-left:auto;padding:0 .3rem;font-size:.95rem;transition:opacity .15s;position:relative}.reply:hover .reply-quote-btn,.thread-root:hover .reply-quote-btn,.reply-quote-btn:focus-visible{opacity:1}.reply-quote-btn:hover{color:var(--accent)}.tooltip{position:relative}.tooltip:before,.reply-quote-btn:before{content:attr(data-tooltip);z-index:20;background:var(--tooltip-bg);color:var(--tooltip-fg);white-space:nowrap;opacity:0;pointer-events:none;border-radius:9px;padding:.42rem .62rem;font-size:.78rem;font-weight:700;line-height:1;transition:opacity .12s,transform .12s;position:absolute;bottom:calc(100% + 12px);left:50%;transform:translate(-50%,4px)scale(.96);box-shadow:0 10px 28px #00000047}.tooltip:after,.reply-quote-btn:after{content:"";z-index:20;background:var(--tooltip-bg);opacity:0;pointer-events:none;border-radius:2px;width:12px;height:12px;transition:opacity .12s,transform .12s;position:absolute;bottom:calc(100% + 5px);left:50%;transform:translate(-50%,4px)rotate(45deg)scale(.9)}.tooltip:hover:before,.tooltip:focus-visible:before,.reply-quote-btn:hover:before,.reply-quote-btn:focus-visible:before,.tooltip:hover:after,.tooltip:focus-visible:after,.reply-quote-btn:hover:after,.reply-quote-btn:focus-visible:after{opacity:1;transform:translate(-50%)scale(1)}.tooltip:hover:after,.tooltip:focus-visible:after,.reply-quote-btn:hover:after,.reply-quote-btn:focus-visible:after{transform:translate(-50%)rotate(45deg)scale(1)}.tooltip-align-end:before{transform-origin:100% 100%;left:auto;right:0;transform:translateY(4px)scale(.96)}.tooltip-align-end:hover:before,.tooltip-align-end:focus-visible:before{transform:translateY(0)scale(1)}.settings-modal-scrim{z-index:1000;color:var(--text);-webkit-font-smoothing:antialiased;background:var(--lightningcss-light,#080a0e6b)var(--lightningcss-dark,#0000008c);place-items:center;font-size:14px;line-height:1.5;animation:.15s ease-out settings-modal-fade;display:grid;position:fixed;inset:0}@keyframes settings-modal-fade{0%{opacity:0}to{opacity:1}}.settings-modal{background:var(--panel);border:1px solid var(--line);border-radius:var(--radius-lg);width:min(1100px,96vw);height:min(760px,92vh);box-shadow:var(--shadow);grid-template-columns:232px minmax(0,1fr);display:grid;position:relative;overflow:hidden}.settings-modal__close{z-index:6;width:28px;height:28px;color:var(--muted);cursor:pointer;border-radius:var(--radius-sm);background:0 0;border:0;place-items:center;transition:background .12s,color .12s;display:grid;position:absolute;top:14px;right:14px}.settings-modal__close:hover{background:var(--hover);color:var(--text-strong)}.settings-modal__rail{background:var(--panel-2);border-right:1px solid var(--line);flex-direction:column;padding:16px 10px;display:flex;overflow-y:auto}.settings-modal__rail-group+.settings-modal__rail-group{margin-top:14px}.settings-modal__rail-heading{font-family:var(--font-mono);text-transform:uppercase;letter-spacing:.09em;color:var(--muted);margin:0;padding:6px 8px 4px;font-size:10px;font-weight:600}.settings-modal__rail ul{margin:0;padding:0;list-style:none}.settings-modal__rail-item{border-radius:var(--radius-sm);cursor:pointer;width:100%;font:inherit;color:var(--text);text-align:left;background:0 0;border:0;align-items:center;gap:10px;margin:1px 0;padding:6px 10px;font-size:13.5px;line-height:1.4;transition:background .1s,color .1s;display:flex}.settings-modal__rail-item:hover{background:var(--hover)}.settings-modal__rail-item.is-active{background:var(--hover-strong);color:var(--text-strong);font-weight:600}.settings-modal__rail-icon{width:16px;height:16px;color:var(--muted);flex-shrink:0;place-items:center;display:grid}.settings-modal__rail-icon svg{width:16px;height:16px;display:block}.settings-modal__rail-item.is-active .settings-modal__rail-icon{color:var(--text-strong)}.settings-modal__rail-avatar{color:#fff;background:linear-gradient(135deg, hsl(var(--hue,220deg) 70% 55%), hsl(calc(var(--hue,220deg) + 40deg) 70% 45%));border-radius:4px;flex-shrink:0;place-items:center;width:18px;height:18px;font-size:9px;font-weight:700;display:grid;overflow:hidden}.settings-modal__rail-avatar img{object-fit:cover;width:100%;height:100%;display:block}.settings-modal__rail-label{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.settings-modal__content{background:var(--panel);color:var(--text);padding:40px 56px 56px;overflow-y:auto}.settings-modal__content .settings-page__header{margin-bottom:32px}.settings-modal__content .settings-page__eyebrow{font-family:var(--font-mono);text-transform:uppercase;letter-spacing:.09em;color:var(--muted);margin:0 0 6px;font-size:10px;font-weight:600}.settings-modal__content .settings-page__h1{letter-spacing:-.01em;color:var(--text-strong);font-size:26px;font-weight:700;line-height:1.2;font-family:var(--font-display);margin:0 0 6px}.settings-modal__content .settings-page__lead{color:var(--muted);margin:0;font-size:14px;line-height:1.5}.settings-modal__content .settings-form{flex-direction:column;gap:24px;max-width:640px;display:flex}.settings-modal__content .settings-footer{border-top:1px solid var(--line);justify-content:space-between;align-items:center;gap:12px;margin-top:8px;padding-top:20px;display:flex}.settings-modal__content .settings-footer__spacer{flex:1}.settings-modal__content .settings-section{flex-direction:column;gap:20px;display:flex}.settings-modal__content .settings-section__h{text-transform:uppercase;letter-spacing:.06em;color:var(--muted);margin:0 0 4px;font-size:12px;font-weight:600}.settings-modal__content .settings-field{flex-direction:column;gap:6px;display:flex}.settings-modal__content .settings-field__label{color:var(--text-strong);font-size:13px;font-weight:600}.settings-modal__content .settings-field__hint{color:var(--muted);margin:0;font-size:12.5px;line-height:1.5}.settings-modal__content .settings-field__hint.is-error{color:var(--danger)}.settings-modal__content .settings-identity{background:var(--panel-2);border:1px solid var(--line);border-radius:var(--radius);align-items:center;gap:14px;padding:14px 16px;display:flex}.settings-modal__content .settings-identity__meta{flex-direction:column;flex:1;gap:2px;min-width:0;display:flex}.settings-modal__content .settings-identity__name{color:var(--text-strong);white-space:nowrap;text-overflow:ellipsis;font-size:15px;font-weight:700;line-height:1.25;overflow:hidden}.settings-modal__content .settings-identity__handle{color:var(--muted);white-space:nowrap;text-overflow:ellipsis;font-size:13px;line-height:1.3;overflow:hidden}.settings-modal__content .settings-identity__tag{text-transform:uppercase;letter-spacing:.08em;color:var(--muted);background:var(--panel);border:1px solid var(--line);border-radius:999px;flex-shrink:0;padding:3px 8px;font-size:10px;font-weight:600}.settings-modal__content .settings-rows{flex-direction:column;display:flex}.settings-modal__content .settings-rows--sectioned .settings-row2{border-top:0;align-items:center;padding:12px 0}.settings-modal__content .settings-row2{border-top:1px solid var(--line);grid-template-columns:minmax(0,220px) minmax(0,1fr);gap:32px;padding:20px 0;display:grid}.settings-modal__content .settings-row2--toggle{grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:24px}.settings-modal__content .settings-row2:first-child{border-top:0;padding-top:4px}.settings-modal__content .settings-row2__desc{min-width:0}.settings-modal__content .settings-row2__label{color:var(--text-strong);margin-bottom:4px;font-size:13.5px;font-weight:600;display:block}.settings-modal__content .settings-row2__hint{color:var(--muted);margin:0;font-size:12.5px;line-height:1.5}.settings-modal__content .settings-row2__control{flex-direction:column;align-items:flex-start;gap:8px;min-width:0;max-width:380px;display:flex}.settings-modal__content .settings-row2__control--end{flex-direction:row;justify-content:center;align-items:flex-end;max-width:none}.settings-modal__content .settings-rows__head{border-top:1px solid var(--line);text-transform:uppercase;letter-spacing:.08em;color:var(--muted);margin:0;padding:24px 0 12px;font-size:11px;font-weight:600}.settings-modal__content .settings-rows__head:first-child{border-top:0;padding-top:4px}.settings-modal__content .settings-rows__head+.settings-row2{border-top:0;padding-top:0}.settings-modal__content .settings-input-group{background:var(--bg);border:1px solid var(--line);border-radius:var(--radius-sm);align-items:stretch;width:100%;transition:border-color .12s,box-shadow .12s,background .12s;display:flex}.settings-modal__content .settings-input-group:hover{border-color:var(--line-strong)}.settings-modal__content .settings-input-group:focus-within{border-color:var(--accent);background:var(--panel);box-shadow:0 0 0 3px var(--accent-soft)}.settings-modal__content .settings-input-group__prefix{color:var(--muted);border-right:1px solid var(--line);background:var(--panel-2);border-radius:var(--radius-sm) 0 0 var(--radius-sm);place-items:center;padding:0 10px;font-size:14px;font-weight:500;display:grid}.settings-modal__content .settings-input--in-group{box-shadow:none!important;border-radius:0 var(--radius-sm) var(--radius-sm) 0!important;background:0 0!important;border:0!important;max-width:none!important}.settings-modal__content .settings-input--in-group:focus{box-shadow:none!important;background:0 0!important;border:0!important}.settings-modal__content .settings-linklike{color:var(--muted);cursor:pointer;font:inherit;text-underline-offset:2px;background:0 0;border:0;padding:2px 0;font-size:12.5px;text-decoration:underline;transition:color .12s}.settings-modal__content .settings-linklike:hover{color:var(--text-strong)}.settings-modal__content .settings-row{grid-template-columns:1fr auto;align-items:center;gap:24px;display:grid}.settings-modal__content .settings-row__main{min-width:0}.settings-modal__content .settings-row__label{color:var(--text-strong);margin-bottom:2px;font-size:13.5px;font-weight:600}.settings-modal__content .settings-row__hint{color:var(--muted);font-size:12.5px;line-height:1.5}.settings-modal__content .settings-row__hint.is-error{color:var(--danger)}.settings-modal__content .settings-input{background:var(--bg);border:1px solid var(--line);border-radius:var(--radius-sm);width:100%;max-width:420px;height:36px;color:var(--text);font:inherit;padding:0 12px;font-size:14px;transition:border-color .12s,box-shadow .12s,background .12s}.settings-modal__content .settings-input:hover{border-color:var(--line-strong)}.settings-modal__content .settings-input:focus{border-color:var(--accent);background:var(--panel);box-shadow:0 0 0 3px var(--accent-soft);outline:0}.settings-modal__content .settings-input--wide{max-width:560px}.settings-modal__content .settings-row .settings-input{width:auto;min-width:240px;max-width:320px}.settings-modal__content .settings-button{background:var(--panel-2);height:34px;color:var(--text);border:1px solid var(--line-strong);border-radius:var(--radius);font:inherit;cursor:pointer;white-space:nowrap;box-shadow:var(--key-edge);justify-content:center;align-items:center;gap:6px;padding:0 14px;font-size:13.5px;font-weight:600;transition:background .1s,border-color .1s,box-shadow 80ms,transform 80ms;display:inline-flex}.settings-modal__content .settings-button:hover{background:var(--panel-3);border-color:var(--line-strong)}.settings-modal__content .settings-button:active:not(:disabled){box-shadow:var(--key-edge-pressed);transform:translateY(1px)}.settings-modal__content .settings-button:focus-visible{box-shadow:0 0 0 3px var(--accent-soft);outline:0}.settings-modal__content .settings-button:disabled{opacity:.55;cursor:not-allowed}.settings-modal__content .settings-button--primary{background:var(--accent);color:var(--accent-contrast);border-color:color-mix(in srgb, var(--accent) 70%, var(--text-strong))}.settings-modal__content .settings-button--primary:hover{background:var(--accent-hover);border-color:var(--accent-hover)}.settings-modal__content .settings-switch{appearance:none;background:var(--line-strong);cursor:pointer;border:0;border-radius:9px;flex-shrink:0;width:32px;height:18px;margin:0;transition:background .15s;position:relative}.settings-modal__content .settings-switch:checked{background:var(--accent)}.settings-modal__content .settings-switch:disabled{opacity:.5;cursor:not-allowed}.settings-modal__content .settings-switch:after{content:"";background:#fff;border-radius:50%;width:14px;height:14px;transition:transform .15s;position:absolute;top:2px;left:2px;box-shadow:0 1px 2px #00000040}.settings-modal__content .settings-switch:checked:after{transform:translate(14px)}.settings-modal__content .settings-switch:focus-visible{box-shadow:0 0 0 3px var(--accent-soft);outline:0}.settings-modal__content .settings-actions{justify-content:flex-end;align-items:center;gap:12px;margin-top:4px;display:flex}.settings-modal__content .settings-status{color:var(--muted);margin:0;font-size:13px}.settings-modal__content .settings-status.is-error{color:var(--danger)}@media (width<=720px){.settings-modal{border-radius:0;grid-template-rows:auto 1fr;grid-template-columns:1fr;width:100vw;height:100dvh}.settings-modal__rail{border-right:0;border-bottom:1px solid var(--line);flex-direction:row;padding:8px;overflow-x:auto}.settings-modal__content{padding:24px 20px 60px}.settings-modal__content .settings-row2{grid-template-columns:1fr;gap:10px}.settings-modal__content .settings-row2__control{max-width:none}}.ws-settings{color:var(--text);z-index:50;background:var(--lightningcss-light,#0f0f0f38)var(--lightningcss-dark,#00000059);place-items:center;padding:28px 80px 28px 28px;font-size:14px;line-height:1.5;display:grid;position:fixed;inset:0}.ws-settings__panel{background:var(--panel);border:1px solid var(--line);width:100%;max-width:1400px;height:100%;box-shadow:var(--shadow);grid-template-columns:260px minmax(0,1fr);display:grid;overflow:hidden}.ws-settings__rail{background:var(--panel-2);border-right:1px solid var(--line);flex-direction:column;padding:14px 10px 18px;display:flex;overflow-y:auto}.ws-settings__rail-search{margin:2px 4px 12px;position:relative}.ws-settings__rail-search-icon{color:var(--muted);pointer-events:none;position:absolute;top:50%;left:10px;transform:translateY(-50%)}.ws-settings__rail-search-icon svg{width:14px;height:14px;display:block}.ws-settings__rail-search-input{background:var(--panel);border:1px solid var(--line);border-radius:var(--radius-sm);width:100%;height:32px;color:var(--text);font:inherit;padding:0 12px 0 32px;font-size:13px}.ws-settings__rail-search-input::placeholder{color:var(--muted)}.ws-settings__rail-search-input:disabled{cursor:not-allowed;opacity:.65}.ws-settings__rail-group{margin-top:6px}.ws-settings__rail-heading{color:var(--muted);letter-spacing:.02em;margin:0;padding:8px 10px 6px;font-size:11.5px;font-weight:600}.ws-settings__rail-heading-name{color:var(--text-strong);font-weight:700}.ws-settings__rail-list{margin:0;padding:0;list-style:none}.ws-settings__rail-item{border-radius:var(--radius-sm);cursor:pointer;width:100%;font:inherit;color:var(--text);text-align:left;background:0 0;border:0;align-items:center;gap:10px;margin:1px 0;padding:6px 10px;font-size:14px;line-height:1.4;transition:background .1s,color .1s;display:flex}.ws-settings__rail-item:hover{background:var(--hover)}.ws-settings__rail-item.is-active{background:var(--hover-strong);color:var(--text-strong);font-weight:600}.ws-settings__rail-item-icon{width:16px;height:16px;color:var(--muted);flex-shrink:0;place-items:center;display:grid}.ws-settings__rail-item-icon svg{width:16px;height:16px;display:block}.ws-settings__rail-item.is-active .ws-settings__rail-item-icon{color:var(--text-strong)}.ws-settings__rail-item-label{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.ws-settings__content{background:var(--bg);position:relative;overflow-y:auto}.ws-settings__content-inner{max-width:740px;padding:56px 80px 80px}.ws-settings__close{border:1px solid var(--line-strong);background:var(--panel);width:36px;height:36px;color:var(--text-strong);cursor:pointer;z-index:60;border-radius:50%;place-items:center;transition:background .12s,color .12s,border-color .12s;display:grid;position:fixed;top:28px;right:22px;box-shadow:0 1px 3px #00000026}@media (width<=760px){.ws-settings{padding:0}.ws-settings__panel{border:0;border-radius:0;max-width:none}}.ws-settings__close:hover{background:var(--panel-2);color:var(--text-strong);border-color:var(--line-strong)}.ws-settings__error{background:var(--panel-2);border:1px solid var(--line);border-radius:var(--radius);color:var(--danger);margin:0 0 20px;padding:14px 16px;font-size:13.5px}.ws-settings .ws-page__header{margin-bottom:32px}.ws-settings .ws-page__h1{letter-spacing:-.01em;color:var(--text-strong);font-size:28px;font-weight:700;line-height:1.2;font-family:var(--font-display);margin:0 0 8px}.ws-settings .ws-page__lead{color:var(--muted);margin:0;font-size:14px;line-height:1.5}.workspace-settings-empty{background:var(--panel-2);border:1px dashed var(--line);border-radius:var(--radius);color:var(--muted);padding:24px;font-size:14px;line-height:1.6}.workspace-settings-empty p{margin:0}.ws-section{border-top:1px solid var(--line);flex-direction:column;margin-top:24px;display:flex}.ws-section__h{color:var(--text-strong);margin:0;padding:18px 0 6px;font-size:14px;font-weight:700}.ws-row{border-top:1px solid var(--line);grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:24px;padding:18px 0;display:grid}.ws-section>.ws-row:first-child,.ws-section>.ws-section__h+.ws-row{border-top:0}.ws-row__main{min-width:0}.ws-row__label{color:var(--text-strong);margin-bottom:4px;font-size:14px;font-weight:600}.ws-row__hint{color:var(--muted);font-size:13px;line-height:1.5}.ws-row__hint b{color:var(--text-strong);font-weight:600}.ws-row__value{color:var(--text-strong);text-align:right;word-break:break-word;max-width:320px;font-size:14px;font-weight:500}.ws-row__control{flex-wrap:wrap;justify-content:flex-end;align-items:center;gap:8px;min-width:0;max-width:420px;display:flex}.ws-strip{background:var(--panel-2);border:1px solid var(--line);border-radius:var(--radius);align-items:center;gap:12px;margin-bottom:8px;padding:10px 14px;font-size:14px;display:flex}.ws-strip__avatar{background:linear-gradient(135deg, var(--brand-a), var(--brand-b));width:28px;height:28px;color:var(--brand-contrast);border-radius:6px;flex-shrink:0;place-items:center;font-size:12px;font-weight:700;display:grid;overflow:hidden}.ws-strip__avatar img{object-fit:cover;width:100%;height:100%;display:block}.ws-strip__name{color:var(--text-strong);font-weight:600}.ws-strip__pill{letter-spacing:.01em;border-radius:999px;margin-left:auto;padding:2px 10px;font-size:12px;font-weight:600}.ws-strip__pill--owner{background:color-mix(in srgb, var(--success) 15%, transparent);color:var(--success);border:1px solid color-mix(in srgb, var(--success) 32%, transparent)}.ws-strip__pill--moderator{background:color-mix(in srgb, var(--delivery-accent) 15%, transparent);color:var(--delivery-accent);border:1px solid color-mix(in srgb, var(--delivery-accent) 32%, transparent)}.ws-strip__pill--member,.ws-strip__pill--guest,.ws-strip__pill--bot{background:var(--panel-3,var(--hover));color:var(--text);border:1px solid var(--line)}.ws-input{background:var(--panel-2);border:1px solid var(--line);border-radius:var(--radius-sm);width:220px;max-width:100%;height:34px;color:var(--text-strong);font:inherit;padding:0 12px;font-size:14px}.ws-input:focus{border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-soft);outline:0}.ws-input:disabled{opacity:.65;cursor:not-allowed}.ws-select{background:var(--panel-2);border:1px solid var(--line);border-radius:var(--radius-sm);width:220px;max-width:100%;height:34px;color:var(--text-strong);font:inherit;padding:0 34px 0 10px;font-size:13.5px}.ws-select:focus{border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-soft);outline:0}.ws-select:disabled{opacity:.65;cursor:not-allowed}.ws-file{display:none}.ws-actions{border-top:1px solid var(--line);justify-content:flex-end;align-items:center;gap:12px;padding:14px 0 0;display:flex}.ws-status{min-height:20px;color:var(--muted);flex:1;margin:0;font-size:13px}.ws-status.is-error{color:var(--danger)}.ws-input[readonly]{cursor:default;color:var(--text)}.ws-btn{background:var(--panel-2);border:1px solid var(--line-strong);border-radius:var(--radius);height:34px;color:var(--text-strong);font:inherit;cursor:pointer;box-shadow:var(--key-edge);padding:0 14px;font-size:13.5px;font-weight:500;transition:background .12s,color .12s,border-color .12s,box-shadow 80ms,transform 80ms}.ws-btn:active:not(:disabled){box-shadow:var(--key-edge-pressed);transform:translateY(1px)}.ws-btn:hover:not(:disabled){background:var(--panel-3,var(--hover-strong));border-color:var(--line-strong)}.ws-btn:disabled{opacity:.55;cursor:not-allowed}.ws-btn--danger{color:var(--danger);border-color:var(--line)}.ws-btn--danger:hover:not(:disabled){background:color-mix(in srgb, var(--danger) 9%, transparent);border-color:var(--danger)}.ws-btn--primary{background:var(--accent);border-color:color-mix(in srgb, var(--accent) 70%, var(--text-strong));color:var(--accent-contrast);align-items:center;gap:6px;display:inline-flex}.ws-btn--primary:hover:not(:disabled){background:var(--accent-hover);border-color:var(--accent-hover)}.ws-btn--primary svg{width:14px;height:14px}.ws-settings__content:has(.ws-members-page){overflow:hidden}.ws-settings__content-inner:has(.ws-members-page){flex-direction:column;max-width:none;height:100%;min-height:0;padding:56px 80px 28px;display:flex}.ws-members-page{flex-direction:column;flex:1;min-height:0;display:flex}.ws-members-page__header{flex:none}.ws-members__toolbar{background:var(--bg);border-bottom:1px solid var(--line);flex-wrap:wrap;flex:none;justify-content:space-between;align-items:center;gap:16px;margin:4px 0 12px;padding:14px 0 12px;display:flex}.ws-members__count{color:var(--muted);text-transform:uppercase;letter-spacing:.06em;font-size:12.5px;font-weight:600}.ws-members__controls{flex-wrap:wrap;align-items:center;gap:8px;display:flex}.ws-members__search{align-items:center;display:flex;position:relative}.ws-members__search-icon{width:14px;height:14px;color:var(--muted);pointer-events:none;display:inline-flex;position:absolute;left:10px}.ws-members__search-icon svg{width:100%;height:100%}.ws-members__search-input{width:220px;height:34px;color:var(--text);background:var(--panel-2);border:1px solid var(--line);border-radius:6px;outline:none;padding:0 12px 0 32px;font-size:13px}.ws-members__search-input::-webkit-search-cancel-button{appearance:none}.ws-members__search-input:focus{border-color:var(--accent)}.ws-members__role-select{height:34px;color:var(--text);background:var(--panel-2);border:1px solid var(--line);cursor:pointer;border-radius:6px;outline:none;padding:0 28px 0 10px;font-size:13px}.ws-members__list{border:1px solid var(--line);background:var(--panel);border-radius:6px;flex:auto;min-height:0;overflow:hidden auto}.ws-members__row{border-bottom:1px solid var(--line);box-sizing:border-box;grid-template-columns:36px 1fr auto auto;align-items:center;gap:14px;padding:0 16px;display:grid}.ws-members__avatar{letter-spacing:-.02em;background:var(--accent-soft);width:36px;height:36px;color:var(--accent);border-radius:7px;flex-shrink:0;justify-content:center;align-items:center;font-size:13px;font-weight:600;display:inline-flex;overflow:hidden}.ws-members__avatar--bot{background:color-mix(in srgb, var(--warn) 18%, transparent);color:color-mix(in srgb, var(--warn) 72%, var(--text))}.ws-members__avatar img{object-fit:cover;width:100%;height:100%}.ws-members__main{flex-direction:column;gap:2px;min-width:0;display:flex}.ws-members__name{color:var(--text-strong,var(--text));white-space:nowrap;text-overflow:ellipsis;font-size:14px;font-weight:600;overflow:hidden}.ws-members__meta{color:var(--muted);white-space:nowrap;text-overflow:ellipsis;align-items:center;gap:6px;font-size:12.5px;display:flex;overflow:hidden}.ws-members__handle{font-family:var(--font-mono);color:var(--text);background:var(--bg);border:1px solid var(--line);border-radius:4px;padding:1px 6px;font-size:12px}.ws-members__dot{opacity:.6}.ws-members__pill{text-transform:capitalize;color:var(--text);white-space:nowrap;background:#7f7f7f24;border-radius:999px;padding:3px 10px;font-size:11.5px;font-weight:600}.ws-members__pill--owner{background:color-mix(in srgb, var(--success) 16%, transparent);color:var(--success)}.ws-members__pill--moderator{background:color-mix(in srgb, var(--delivery-accent) 16%, transparent);color:var(--delivery-accent)}.ws-members__pill--bot{background:var(--accent-soft);color:var(--accent)}.ws-members__pill--guest{background:color-mix(in srgb, var(--warn) 18%, transparent);color:color-mix(in srgb, var(--warn) 72%, var(--text))}.ws-members__actions{width:28px;height:28px;color:var(--muted);cursor:pointer;background:0 0;border:1px solid #0000;border-radius:6px;justify-content:center;align-items:center;display:inline-flex}.ws-members__actions:hover:not(:disabled){background:var(--bg);border-color:var(--line);color:var(--text)}.ws-members__actions:disabled{opacity:.45;cursor:not-allowed}.ws-members__empty{text-align:center;border:1px dashed var(--line);color:var(--muted);background:var(--panel);border-radius:8px;margin-top:24px;padding:36px 20px;font-size:13.5px}.ws-members__loading{color:var(--muted);text-align:center;border-top:1px solid var(--line);padding:10px 16px;font-size:12.5px}.ws-members__row--skeleton{height:64px}.ws-members__skeleton{background:linear-gradient(90deg,#7f7f7f14,#7f7f7f2e,#7f7f7f14) 0 0/200% 100%;border-radius:6px;animation:1.4s ease-in-out infinite ws-members-shimmer}.ws-members__skeleton--line{height:10px;margin:4px 0}.ws-members__skeleton--pill{border-radius:999px;width:64px;height:18px}@keyframes ws-members-shimmer{0%{background-position:200% 0}to{background-position:-200% 0}}@media (width<=760px){.ws-settings__panel{grid-template-rows:auto 1fr;grid-template-columns:1fr}.ws-settings__rail{border-right:0;border-bottom:1px solid var(--line);padding:10px}.ws-settings__content-inner{padding:32px 20px 60px}.ws-settings__close{top:10px;right:12px}}.ws-bots-page{flex-direction:column;gap:0;display:flex}.ws-bots__toolbar{background:var(--bg);border-bottom:1px solid var(--line);flex-wrap:wrap;justify-content:space-between;align-items:center;gap:16px;margin:4px 0 12px;padding:14px 0 12px;display:flex}.ws-bots__count{color:var(--muted);text-transform:uppercase;letter-spacing:.06em;font-size:12.5px;font-weight:600}.ws-bots__toolbar-actions{align-items:center;gap:8px;display:flex}.ws-bots__panel{background:var(--surface);border:1px solid var(--line);border-radius:8px;margin:8px 0 16px;padding:18px 20px}.ws-bots__empty{text-align:center;border:1px dashed var(--line);color:var(--muted);background:var(--surface);border-radius:8px;margin-top:16px;padding:36px 20px;font-size:13.5px}.ws-bots__list{flex-direction:column;margin-bottom:60px;display:flex}.ws-bots__row{border-bottom:1px solid var(--line)}.ws-bots__row:last-child{border-bottom:0}.ws-bots__row.is-expanded{background:var(--surface)}.ws-bots__row-main{text-align:left;cursor:pointer;width:100%;color:inherit;background:0 0;border:0;grid-template-columns:36px 1fr auto auto;align-items:center;gap:14px;padding:14px 16px;display:grid}.ws-bots__row-main:hover{background:var(--hover,#7f7f7f0f)}.ws-bots__row-text{flex-direction:column;gap:2px;min-width:0;display:flex}.ws-bots__row-name{color:var(--text-strong,var(--text));white-space:nowrap;text-overflow:ellipsis;font-size:14px;font-weight:600;overflow:hidden}.ws-bots__row-meta{color:var(--muted);white-space:nowrap;text-overflow:ellipsis;align-items:center;gap:6px;font-size:12.5px;display:flex;overflow:hidden}.ws-bots__owner-pill{color:var(--text);white-space:nowrap;background:#7f7f7f24;border-radius:999px;padding:3px 10px;font-size:11.5px;font-weight:600}.ws-bots__owner-pill--service{background:color-mix(in srgb, var(--delivery-accent) 16%, transparent);color:var(--delivery-accent)}.ws-bots__owner-pill--user{background:color-mix(in srgb, var(--warn) 18%, transparent);color:color-mix(in srgb, var(--warn) 72%, var(--text))}.ws-bots__chevron{width:20px;height:20px;color:var(--muted);justify-content:center;align-items:center;display:inline-flex}.ws-bots__detail{border-top:1px dashed var(--line);flex-direction:column;gap:12px;padding:4px 16px 18px;display:flex}.ws-bots__detail-header{flex-wrap:wrap;justify-content:space-between;align-items:flex-start;gap:16px;padding-top:14px;display:flex}.ws-bots__detail-title{color:var(--text-strong,var(--text));margin:0 0 4px;font-size:13.5px;font-weight:600}.ws-bots__detail-hint{color:var(--muted);max-width:60ch;margin:0;font-size:12.5px}.ws-bots__detail-actions{flex-wrap:wrap;gap:8px;display:flex}.ws-bots__detail-empty{color:var(--muted);background:var(--bg);border:1px dashed var(--line);border-radius:6px;margin:0;padding:16px;font-size:13px}.ws-bots__token-list{flex-direction:column;gap:8px;margin:0;padding:0;list-style:none;display:flex}.ws-bots__token-row{background:var(--bg);border:1px solid var(--line);border-radius:6px;flex-wrap:wrap;justify-content:space-between;align-items:flex-start;gap:10px 16px;padding:12px 14px;display:flex}.ws-bots__token-row>.ws-btn{flex-shrink:0}.ws-bots__token-main{flex-direction:column;flex:240px;gap:4px;min-width:0;display:flex}.ws-bots__token-name{color:var(--text-strong,var(--text));font-size:13.5px;font-weight:600}.ws-bots__token-meta{color:var(--muted);font-size:12.5px}.ws-bots__scope-row{flex-wrap:wrap;gap:6px;margin-top:2px;display:flex}.ws-bots__scope-chip{font-family:var(--font-mono);background:var(--bg);border:1px solid var(--line);color:var(--text);border-radius:999px;padding:2px 8px;font-size:11.5px}.ws-bots__scope-chip--bundle{color:var(--accent);background:color-mix(in srgb, var(--accent) 10%, transparent);border-color:color-mix(in srgb, var(--accent) 35%, transparent);font-family:inherit;font-weight:600}.ws-bots__scope-toggle{color:var(--muted);text-underline-offset:2px;cursor:pointer;background:0 0;border:none;padding:2px 4px;font-size:11.5px;text-decoration:underline}.ws-bots__scope-toggle:hover{color:var(--text)}.ws-bots__scope-details{margin-top:6px}.ws-bots__scope-details>summary{color:var(--muted);cursor:pointer;width:fit-content;font-size:11.5px}.ws-bots__scope-details[open]>summary{margin-bottom:6px}.ws-bots__form{flex-direction:column;gap:16px;display:flex}.ws-bots__form-header{flex-direction:column;gap:4px;display:flex}.ws-bots__form-title{color:var(--text-strong,var(--text));margin:0;font-size:16px;font-weight:600}.ws-bots__form-hint{color:var(--muted);max-width:60ch;margin:0;font-size:13px}.ws-bots__form-grid{grid-template-columns:1fr 1fr;gap:12px;display:grid}@media (width<=640px){.ws-bots__form-grid{grid-template-columns:1fr}}.ws-bots__form-field{border:0;flex-direction:column;gap:6px;min-width:0;margin:0;padding:0;display:flex}.ws-bots__form-label{color:var(--muted);text-transform:uppercase;letter-spacing:.04em;font-size:12px;font-weight:600}.ws-bots__form-input{height:34px;color:var(--text);background:var(--surface);border:1px solid var(--line);border-radius:6px;outline:none;padding:0 12px;font-size:13.5px}.ws-bots__form-input:focus{border-color:var(--accent)}.ws-bots__form-handle{background:var(--surface);border:1px solid var(--line);border-radius:6px;align-items:center;gap:6px;padding:0 10px;display:flex}.ws-bots__form-handle span{color:var(--muted);font-family:var(--font-mono);font-size:13px}.ws-bots__form-handle .ws-bots__form-input{background:0 0;border:0;flex:1;padding-left:0}.ws-bots__choices{flex-direction:column;gap:8px;display:flex}.ws-bots__choice{border:1px solid var(--line);background:var(--surface);cursor:pointer;border-radius:6px;grid-template-rows:auto auto;grid-template-columns:18px 1fr;gap:2px 10px;padding:10px 12px;display:grid}.ws-bots__choice.is-active{border-color:var(--accent);background:color-mix(in srgb, var(--accent) 7%, transparent)}.ws-bots__choice input{accent-color:var(--accent);grid-row:1/span 2;align-self:center}.ws-bots__choice-title{color:var(--text-strong,var(--text));font-size:13.5px;font-weight:600}.ws-bots__choice-hint{color:var(--muted);font-size:12.5px}.ws-bots__form-error{background:color-mix(in srgb, var(--danger) 9%, transparent);color:var(--danger);border:1px solid color-mix(in srgb, var(--danger) 32%, transparent);border-radius:6px;margin:0;padding:10px 12px;font-size:13px}.ws-bots__form-actions{justify-content:flex-end;gap:8px;display:flex}.ws-bots__token-form-panel{background:var(--bg);border:1px solid var(--line);border-radius:6px;padding:14px}.ws-bots__token-form .ws-bots__choices{grid-template-columns:repeat(3,minmax(0,1fr));display:grid}@media (width<=720px){.ws-bots__token-form .ws-bots__choices{grid-template-columns:1fr}}.ws-bots__reveal{background:var(--surface);border:1px solid var(--accent);border-radius:8px;flex-direction:column;gap:14px;margin:8px 0 16px;padding:18px 20px;display:flex}.ws-bots__reveal-header{flex-direction:column;gap:4px;display:flex}.ws-bots__reveal-title{color:var(--text-strong,var(--text));margin:0;font-size:16px;font-weight:600}.ws-bots__reveal-hint{color:var(--muted);max-width:60ch;margin:0;font-size:13px}.ws-bots__reveal-hint code{background:var(--bg);border:1px solid var(--line);font-family:var(--font-mono);color:var(--text);white-space:nowrap;border-radius:4px;padding:1px 6px;font-size:12px}.ws-bots__reveal-field{flex-direction:column;gap:6px;display:flex}.ws-bots__reveal-label{color:var(--muted);text-transform:uppercase;letter-spacing:.04em;font-size:12px;font-weight:600}.ws-bots__reveal-row{align-items:center;gap:8px;display:flex}.ws-bots__reveal-input{height:34px;font-family:var(--font-mono);color:var(--text);background:var(--bg);border:1px solid var(--line);border-radius:6px;flex:1;padding:0 12px;font-size:13px}.ws-bots__reveal-snippet-header{justify-content:space-between;align-items:center;gap:8px;display:flex}.ws-bots__reveal-details{border:1px solid var(--line);background:var(--bg);border-radius:6px}.ws-bots__reveal-summary{color:var(--muted);text-transform:uppercase;letter-spacing:.04em;cursor:pointer;-webkit-user-select:none;user-select:none;padding:10px 14px;font-size:11px;font-weight:600}.ws-bots__reveal-summary:hover{color:var(--text)}.ws-bots__reveal-details-body{gap:8px;padding:0 14px 12px;display:grid}.ws-bots__reveal-details-body .ws-bots__reveal-hint{margin:0}.ws-bots__setup-mode{background:var(--bg);border:1px solid var(--line);border-radius:6px;grid-template-columns:repeat(2,minmax(0,1fr));width:min(320px,100%);padding:3px;display:inline-grid}.ws-bots__setup-mode button{min-height:30px;color:var(--muted);font:inherit;cursor:pointer;background:0 0;border:0;border-radius:4px;padding:0 12px;font-size:12.5px;font-weight:600}.ws-bots__setup-mode button.is-active{background:var(--surface);color:var(--text);box-shadow:0 0 0 1px var(--line)}.ws-bots__reveal-snippet{background:var(--bg);border:1px solid var(--line);font-family:var(--font-mono);color:var(--text);white-space:pre-wrap;border-radius:6px;margin:0;padding:12px 14px;font-size:12.5px;overflow-x:auto}.ws-bots__reveal-ack{color:var(--text);align-items:center;gap:8px;font-size:13px;display:flex}.ws-bots__reveal-actions{justify-content:flex-end;display:flex}.ws-bots__my-list{flex-direction:column;gap:18px;display:flex}.ws-bots__my-group{flex-direction:column;gap:8px;display:flex}.ws-bots__my-group-header{justify-content:space-between;align-items:center;gap:12px;display:flex}.ws-bots__my-group-title{color:var(--muted);text-transform:uppercase;letter-spacing:.06em;margin:0;font-size:13px;font-weight:600}.ws-bots__my-rows{border:1px solid var(--line);background:var(--surface);border-radius:6px;flex-direction:column;margin:0;padding:0;list-style:none;display:flex}.ws-bots__my-row{border-bottom:1px solid var(--line);grid-template-columns:36px 1fr auto;align-items:center;gap:14px;padding:12px 14px;display:grid}.ws-bots__my-row:last-child{border-bottom:0}.ws-bots__my-row-text{flex-direction:column;gap:2px;min-width:0;display:flex}.ws-bots__my-row-name{color:var(--text-strong,var(--text));font-size:14px;font-weight:600}.ws-bots__my-row-meta{color:var(--muted);align-items:center;gap:6px;font-size:12.5px;display:flex}.appearance-preview{border:1px solid var(--line-strong);border-radius:var(--radius-lg);background:var(--bg);overflow:hidden}.appearance-preview__bar{border-bottom:1px solid var(--line);background:var(--panel);color:var(--text-strong);align-items:baseline;gap:8px;padding:9px 14px;font-size:12px;font-weight:700;display:flex}.appearance-preview__hash{color:var(--accent)}.appearance-preview__topic{color:var(--muted);font-size:11.5px;font-weight:500}.appearance-preview__chat{gap:14px;padding:14px 16px 16px;display:grid}.appearance-preview[data-density=compact] .appearance-preview__chat{gap:7px;padding:10px 14px 12px}.appearance-preview__msg{grid-template-columns:34px minmax(0,1fr);gap:10px;display:grid}.appearance-preview[data-density=compact] .appearance-preview__msg{grid-template-columns:24px minmax(0,1fr);gap:8px}.appearance-preview__avatar{background:var(--accent);width:34px;height:34px;color:var(--accent-contrast);border-radius:9px;place-items:center;font-size:14px;font-weight:700;display:grid}.appearance-preview[data-density=compact] .appearance-preview__avatar{border-radius:7px;width:24px;height:24px;font-size:11px}.appearance-preview__avatar.is-agent{background:var(--accent-2)}.appearance-preview__body{gap:3px;min-width:0;display:grid}.appearance-preview[data-density=compact] .appearance-preview__body{gap:1px}.appearance-preview__head{align-items:baseline;gap:7px;display:flex}.appearance-preview__who{color:var(--text-strong);font-size:13px;font-weight:700}.appearance-preview[data-density=compact] .appearance-preview__who{font-size:12px}.appearance-preview__when{color:var(--muted);font-size:10px}.appearance-preview__text{font-size:13px;line-height:1.5}.appearance-preview[data-density=compact] .appearance-preview__text{font-size:12.5px;line-height:1.4}.appearance-preview__activity{background:color-mix(in srgb, var(--accent-2) 9%, var(--panel));color:var(--muted);border-radius:7px 7px 0 0;margin-top:3px;padding:6px 10px;font-size:11.5px}.appearance-preview__activity code{color:var(--text-strong);font-family:var(--font-mono,ui-monospace, monospace);font-size:10.5px}.appearance-preview__answer{background:color-mix(in srgb, var(--accent) 7%, var(--panel));border-radius:0 0 7px 7px;padding:7px 10px 8px;font-size:13px;line-height:1.5}.appearance-preview[data-density=compact] .appearance-preview__activity{padding:4px 8px;font-size:11px}.appearance-preview[data-density=compact] .appearance-preview__answer{padding:5px 8px 6px;font-size:12.5px}.appearance-preview[data-layout=outlined] .appearance-preview__activity{border:1px solid color-mix(in srgb, var(--accent-2) 45%, var(--line));background:0 0;border-bottom:0}.appearance-preview[data-layout=outlined] .appearance-preview__answer{border:1px solid color-mix(in srgb, var(--accent) 40%, var(--line));background:0 0}.appearance-preview__reactions{gap:5px;margin-top:5px;display:flex}.appearance-preview[data-density=compact] .appearance-preview__reactions{margin-top:2px}.appearance-preview__reaction{border:1px solid var(--line);background:var(--panel);color:var(--muted);border-radius:999px;padding:2px 8px;font-size:11px}.appearance-preview__reaction.is-mine{border-color:var(--accent);background:color-mix(in srgb, var(--accent) 12%, var(--panel));color:var(--text-strong)}.appearance-preview__caption{color:var(--muted-2);text-align:right;margin:-14px 2px 0;font-size:11px}.appearance-rows{display:grid}.appearance-row{grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:24px;padding:14px 0;display:grid}.appearance-row+.appearance-row{border-top:1px solid var(--line)}.appearance-row__meta{gap:2px;display:grid}.appearance-row__label{color:var(--text-strong);font-size:13.5px;font-weight:650}.appearance-row__desc{color:var(--muted);font-size:12px}.appearance-row__control{align-items:center;gap:12px;display:inline-flex}.appearance-seg{border:1px solid var(--line);border-radius:var(--radius-lg);background:var(--panel-2);gap:2px;padding:2px;display:inline-flex}.appearance-seg__btn{color:var(--muted);cursor:pointer;background:0 0;border:1px solid #0000;border-radius:8px;padding:5px 12px;font-size:12.5px;font-weight:600}.appearance-seg__btn:hover{color:var(--text-strong)}.appearance-seg__btn:focus-visible{outline:2px solid var(--accent);outline-offset:1px}.appearance-seg__btn.is-active{border-color:var(--line-strong);background:var(--panel);color:var(--text-strong);box-shadow:0 1px 2px #10151d1a}.board-chips__name{min-width:44px;color:var(--muted);text-align:right;font-size:12px}.board-chips{align-items:center;gap:10px;display:inline-flex}.board-chip{border:1px solid var(--line-strong);background:linear-gradient(135deg, var(--panel) 52%, var(--accent) 52%);cursor:pointer;border-radius:8px;width:26px;height:26px;padding:0;position:relative}.board-chip:focus-visible{outline:2px solid var(--accent);outline-offset:4px}.board-chip.is-active:after{content:"";border:2px solid var(--accent);border-radius:11px;position:absolute;inset:-5px}@media (width<=640px){.appearance-row{grid-template-columns:1fr;gap:10px}.appearance-row__control,.board-chips__name{text-align:left;justify-self:start}}.ws-intg-page{padding-bottom:60px}.ws-intg__app-icon{background:var(--surface);border:1px solid var(--line);width:36px;height:36px;color:var(--text);border-radius:8px;flex-shrink:0;justify-content:center;align-items:center;display:inline-flex}.ws-intg__wizard{background:var(--surface);border:1px solid var(--line);border-radius:8px;flex-direction:column;gap:16px;margin:8px 0 16px;padding:18px 20px;display:flex}.ws-intg__wizard-header{justify-content:space-between;align-items:flex-start;gap:16px;display:flex}.ws-intg__wizard-step{color:var(--muted);white-space:nowrap;padding-top:2px;font-size:11.5px;font-weight:600}.ws-intg__wizard-body{flex-direction:column;gap:14px;display:flex}.ws-intg__catalog{grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:12px;display:grid}.ws-intg__catalog-card{border:1px solid var(--line);text-align:left;cursor:pointer;color:inherit;background:0 0;border-radius:8px;flex-direction:column;align-items:flex-start;gap:8px;padding:16px;transition:border-color .12s,background .12s;display:flex}.ws-intg__catalog-card:hover{border-color:var(--accent);background:var(--hover,#7f7f7f0f)}.ws-intg__catalog-name{color:var(--text-strong,var(--text));font-size:14px;font-weight:600}.ws-intg__catalog-desc{color:var(--muted);font-size:12.5px;line-height:1.45}.ws-intg__chips{flex-wrap:wrap;gap:6px;margin-bottom:8px;display:flex}.ws-intg__chip{background:color-mix(in srgb, var(--accent) 14%, transparent);color:var(--text);border-radius:999px;align-items:center;gap:6px;padding:3px 6px 3px 10px;font-size:12px;font-weight:600;display:inline-flex}.ws-intg__chip-remove{width:16px;height:16px;color:var(--muted);cursor:pointer;background:0 0;border:0;border-radius:50%;justify-content:center;align-items:center;font-size:13px;line-height:1;display:inline-flex}.ws-intg__chip-remove:hover{color:var(--text);background:#7f7f7f2e}.ws-intg__member-results{border:1px solid var(--line);background:var(--surface);border-radius:8px;flex-direction:column;gap:2px;max-height:220px;margin:6px 0 0;padding:4px;list-style:none;display:flex;overflow-y:auto}.ws-intg__member-result{text-align:left;cursor:pointer;width:100%;color:inherit;background:0 0;border:0;border-radius:6px;align-items:center;gap:8px;padding:7px 10px;font-size:13px;display:flex}.ws-intg__member-result:hover{background:var(--hover,#7f7f7f14)}.ws-intg__toggle{cursor:pointer;align-items:flex-start;gap:10px;display:flex}.ws-intg__toggle input[type=checkbox]{flex-shrink:0;margin-top:3px}.ws-intg__toggle>span{flex-direction:column;gap:2px;display:flex}.ws-intg__panel{border:1px solid var(--line);background:var(--surface);border-radius:8px;flex-direction:column;gap:12px;padding:14px 16px;display:flex}.ws-intg__panel-header{flex-wrap:wrap;justify-content:space-between;align-items:flex-start;gap:16px;display:flex}.ws-intg__panel-title{color:var(--text-strong,var(--text));margin:0 0 3px;font-size:13px;font-weight:600}.ws-intg__panel-hint{color:var(--muted);max-width:560px;margin:0;font-size:12.5px;line-height:1.45}.ws-intg__panel-empty{color:var(--muted);margin:0;font-size:12.5px}.ws-intg__inline-form{border:1px dashed var(--line);border-radius:8px;flex-direction:column;gap:12px;padding:14px;display:flex}.ws-intg__item-list{flex-direction:column;margin:0;padding:0;list-style:none;display:flex}.ws-intg__item-row{border-bottom:1px solid var(--line);justify-content:space-between;align-items:flex-start;gap:14px;padding:11px 0;display:flex}.ws-intg__item-row:last-child{border-bottom:0}.ws-intg__item-row--stacked{flex-direction:column;align-items:stretch}.ws-intg__item-top{justify-content:space-between;align-items:flex-start;gap:14px;display:flex}.ws-intg__item-main{flex-direction:column;gap:4px;min-width:0;display:flex}.ws-intg__item-name{color:var(--text-strong,var(--text));font-size:13.5px;font-weight:600}.ws-intg__item-meta{color:var(--muted);overflow-wrap:anywhere;font-size:12px}.ws-intg__url{font-family:var(--mono,ui-monospace, monospace);font-size:11.5px}.ws-intg__item-actions{flex-wrap:wrap;flex-shrink:0;justify-content:flex-end;align-items:center;gap:8px;display:flex}.ws-intg__type-chips{flex-wrap:wrap;gap:5px;display:flex}.ws-intg__secret{border:1px solid color-mix(in srgb, var(--warn) 45%, var(--line));background:color-mix(in srgb, var(--warn) 7%, transparent);border-radius:8px;flex-direction:column;gap:6px;margin-top:6px;padding:10px 12px;display:flex}.ws-intg__secret-label{text-transform:uppercase;letter-spacing:.05em;color:var(--muted);font-size:11px;font-weight:700}.ws-intg__secret-row{align-items:center;gap:8px;display:flex}.ws-intg__secret-row .ws-bots__reveal-input{flex:1;min-width:0}.ws-intg__confirm{border:1px solid color-mix(in srgb, var(--danger,#d33) 40%, var(--line));background:color-mix(in srgb, var(--danger,#d33) 6%, transparent);border-radius:8px;flex-direction:column;gap:12px;padding:14px 16px;display:flex}.ws-intg__confirm-text{color:var(--text);margin:0;font-size:13px;line-height:1.5}.ws-intg__event-grid{grid-template-columns:repeat(auto-fill,minmax(230px,1fr));gap:6px;margin-top:10px;display:grid}.ws-intg__event-option{border:1px solid var(--line);cursor:pointer;border-radius:6px;align-items:center;gap:8px;padding:7px 10px;font-size:12px;display:flex}.ws-intg__event-option.is-active{border-color:var(--accent);background:color-mix(in srgb, var(--accent) 8%, transparent)}.ws-intg__deliveries{border-top:1px dashed var(--line);flex-direction:column;gap:8px;padding-top:10px;display:flex}.ws-intg__deliveries-scroll{border:1px solid var(--line);border-radius:8px;max-height:420px;overflow-y:auto}.ws-intg__delivery{border-bottom:1px solid var(--line)}.ws-intg__delivery:last-child{border-bottom:0}.ws-intg__delivery-row{text-align:left;cursor:pointer;width:100%;color:inherit;background:0 0;border:0;grid-template-columns:84px 1fr auto auto;align-items:center;gap:12px;padding:10px 12px;font-size:12.5px;display:grid}.ws-intg__delivery-row:hover{background:var(--hover,#7f7f7f0f)}.ws-intg__delivery-status{text-align:center;white-space:nowrap;border-radius:999px;padding:2px 8px;font-size:11px;font-weight:700}.ws-intg__delivery-status--ok{background:color-mix(in srgb, var(--delivery-accent,#2a9d5c) 16%, transparent);color:var(--delivery-accent,#2a9d5c)}.ws-intg__delivery-status--fail{background:color-mix(in srgb, var(--danger,#d33) 14%, transparent);color:var(--danger,#d33)}.ws-intg__delivery-type{text-overflow:ellipsis;white-space:nowrap;font-size:11.5px;overflow:hidden}.ws-intg__delivery-attempt,.ws-intg__delivery-time{color:var(--muted);white-space:nowrap;font-size:11.5px}.ws-intg__delivery-detail{flex-direction:column;gap:10px;padding:4px 12px 14px;display:flex}.ws-intg__delivery-block{flex-direction:column;gap:4px;display:flex}.ws-intg__delivery-block .ws-bots__reveal-snippet{max-height:260px;overflow:auto}.ws-intg__deliveries-more{justify-content:center;display:flex}.ws-intg__deliveries-retry{justify-content:space-between;align-items:center;gap:12px;display:flex}.ws-intg__section{flex-direction:column;gap:12px;margin-top:28px;display:flex}.ws-intg__section-title{color:var(--text-strong,var(--text));margin:0;font-size:15px;font-weight:600}.ws-intg__section-hint{color:var(--muted);margin:-6px 0 0;font-size:12.5px}.ws-bots__choice.is-disabled{opacity:.55;cursor:not-allowed}.settings-signout{border-top:1px solid var(--line);flex-wrap:wrap;justify-content:space-between;align-items:center;gap:16px;margin-top:24px;padding-top:20px;display:flex}.settings-signout strong{color:var(--text-strong);display:block}.settings-signout p{color:var(--muted);margin:2px 0 0;font-size:12.5px}.settings-signout .profile-actions{padding-top:0}.settings-password{border-top:1px solid var(--line);margin-top:24px;padding-top:20px}.settings-password__intro strong{color:var(--text-strong);display:block}.settings-password__intro p{color:var(--muted);margin:2px 0 0;font-size:12.5px} diff --git a/apps/api/internal/webassets/dist/_app/immutable/assets/0.CxCYe6Mo.css b/apps/api/internal/webassets/dist/_app/immutable/assets/0.CxCYe6Mo.css new file mode 100644 index 000000000..2899df124 --- /dev/null +++ b/apps/api/internal/webassets/dist/_app/immutable/assets/0.CxCYe6Mo.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+460-52F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Geist Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(./geist-cyrillic-wght-normal.BEAKL7Jp.woff2)format("woff2-variations");unicode-range:U+301,U+400-45F,U+490-491,U+4B0-4B1,U+2116}@font-face{font-family:Geist Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(./geist-vietnamese-wght-normal.6IgcOCM7.woff2)format("woff2-variations");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+300-301,U+303-304,U+308-309,U+323,U+329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Geist Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(./geist-latin-ext-wght-normal.DC-KSUi6.woff2)format("woff2-variations");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Geist Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(./geist-latin-wght-normal.BgDaEnEv.woff2)format("woff2-variations");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Geist Mono Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(./geist-mono-cyrillic-ext-wght-normal.X_5orZeX.woff2)format("woff2-variations");unicode-range:U+460-52F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Geist Mono Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(./geist-mono-cyrillic-wght-normal.DiZS0aHC.woff2)format("woff2-variations");unicode-range:U+301,U+400-45F,U+490-491,U+4B0-4B1,U+2116}@font-face{font-family:Geist Mono Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(./geist-mono-symbols2-wght-normal.CO5SzqOn.woff2)format("woff2-variations");unicode-range:U+2000-2001,U+2004-2008,U+200A,U+23B8-23BD,U+2500-259F}@font-face{font-family:Geist Mono Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(./geist-mono-vietnamese-wght-normal.DadHysG0.woff2)format("woff2-variations");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+300-301,U+303-304,U+308-309,U+323,U+329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Geist Mono Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(./geist-mono-latin-ext-wght-normal.Bwz-egvJ.woff2)format("woff2-variations");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Geist Mono Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(./geist-mono-latin-wght-normal.XN7g48iV.woff2)format("woff2-variations");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Bricolage Grotesque Variable;font-style:normal;font-display:swap;font-weight:200 800;src:url(./bricolage-grotesque-vietnamese-wght-normal.BUzh504Q.woff2)format("woff2-variations");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+300-301,U+303-304,U+308-309,U+323,U+329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Bricolage Grotesque Variable;font-style:normal;font-display:swap;font-weight:200 800;src:url(./bricolage-grotesque-latin-ext-wght-normal.CcLUaPy7.woff2)format("woff2-variations");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Bricolage Grotesque Variable;font-style:normal;font-display:swap;font-weight:200 800;src:url(./bricolage-grotesque-latin-wght-normal.DLoelf7F.woff2)format("woff2-variations");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}:root{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light dark;font-feature-settings:"ss01", "cv11";--font-display:"Bricolage Grotesque Variable", "Geist Variable", ui-sans-serif, system-ui, sans-serif;--font-mono:"Geist Mono Variable", ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;--rail:var(--lightningcss-light,#e2e5ea)var(--lightningcss-dark,#0b0e14);--bg:var(--lightningcss-light,#edeff2)var(--lightningcss-dark,#0e1219);--panel:var(--lightningcss-light,#f8f9fb)var(--lightningcss-dark,#141926);--panel-2:var(--lightningcss-light,#e8ebef)var(--lightningcss-dark,#1b2232);--panel-3:var(--lightningcss-light,#dde1e7)var(--lightningcss-dark,#232c3f);--surface:var(--panel-2);--hover:var(--lightningcss-light,#10151d0d)var(--lightningcss-dark,#d6e4ff0b);--hover-strong:var(--lightningcss-light,#10151d14)var(--lightningcss-dark,#d6e4ff14);--line:var(--lightningcss-light,#10151d1a)var(--lightningcss-dark,#bed2ff17);--line-strong:var(--lightningcss-light,#10151d2b)var(--lightningcss-dark,#bed2ff29);--text:var(--lightningcss-light,#232a35)var(--lightningcss-dark,#dbe2ec);--text-strong:var(--lightningcss-light,#10151d)var(--lightningcss-dark,#f4f7fb);--muted:var(--lightningcss-light,#5d6878)var(--lightningcss-dark,#8a95a8);--muted-2:var(--lightningcss-light,#8b94a3)var(--lightningcss-dark,#5c6577);--accent:var(--lightningcss-light,#0080c4)var(--lightningcss-dark,#41c6ff);--accent-hover:var(--lightningcss-light,#006aa6)var(--lightningcss-dark,#6ad3ff);--accent-contrast:var(--lightningcss-light,#fff)var(--lightningcss-dark,#061420);--accent-2:var(--lightningcss-light,#f56a1d)var(--lightningcss-dark,#ff9550);--accent-soft:var(--lightningcss-light,#0080c421)var(--lightningcss-dark,#41c6ff26);--brand-a:var(--lightningcss-light,#0072b0)var(--lightningcss-dark,#41c6ff);--brand-b:var(--lightningcss-light,#2653e8)var(--lightningcss-dark,#6d8bff);--brand-contrast:var(--lightningcss-light,#fff)var(--lightningcss-dark,#061420);--activity-accent:var(--lightningcss-light,#c07e0a)var(--lightningcss-dark,#e8b23e);--activity-accent-soft:var(--lightningcss-light,#c07e0a17)var(--lightningcss-dark,#e8b23e1a);--delivery-accent:var(--lightningcss-light,#5558d9)var(--lightningcss-dark,#8b8df2);--delivery-accent-soft:var(--lightningcss-light,#5558d90f)var(--lightningcss-dark,#8b8df214);--tool-call-bg:var(--lightningcss-light,#5558d917)var(--lightningcss-dark,#8b8df21f);--tool-call-bg-hover:var(--lightningcss-light,#5558d924)var(--lightningcss-dark,#8b8df22e);--accent-glow:0 0 0 1px color-mix(in srgb, var(--accent) 32%, transparent), 0 8px 30px -12px color-mix(in srgb, var(--accent) 48%, transparent);--success:var(--lightningcss-light,#14876a)var(--lightningcss-dark,#30c48d);--warn:#e8a33e;--danger:var(--lightningcss-light,#d13438)var(--lightningcss-dark,#ff6d68);--scrollbar:var(--lightningcss-light,#10151d2e)var(--lightningcss-dark,#bed2ff1f);--scrollbar-hover:var(--lightningcss-light,#10151d4d)var(--lightningcss-dark,#bed2ff38);--shadow:0 24px 60px -22px var(--lightningcss-light,#10151d4d)var(--lightningcss-dark,#02050ab3);--tooltip-bg:var(--lightningcss-light,#10151d)var(--lightningcss-dark,#2b3448);--tooltip-fg:var(--lightningcss-light,#f0f4fa)var(--lightningcss-dark,#f4f7fb);--key-edge:0 1px 0 var(--line-strong), 0 2px 0 var(--lightningcss-light,#10151d1a)var(--lightningcss-dark,#00000073);--key-edge-pressed:0 1px 0 var(--line-strong);--radius-sm:4px;--radius:6px;--radius-lg:10px;--radius-xl:14px;--safe-area-top:env(safe-area-inset-top,0px);--safe-area-right:env(safe-area-inset-right,0px);--safe-area-bottom:env(safe-area-inset-bottom,0px);--safe-area-left:env(safe-area-inset-left,0px);background:var(--bg);color:var(--text);font-family:Geist Variable,Inter,SF Pro Text,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif}@media (prefers-color-scheme:dark){:root{--lightningcss-light: ;--lightningcss-dark:initial}}:root[data-color-mode=light]{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light}:root[data-color-mode=dark]{--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark}[data-board=ember]{--rail:var(--lightningcss-light,#e9e1d7)var(--lightningcss-dark,#16110d);--bg:var(--lightningcss-light,#f7f3ed)var(--lightningcss-dark,#1a1511);--panel:var(--lightningcss-light,#fffaf2)var(--lightningcss-dark,#211a15);--panel-2:var(--lightningcss-light,#efe7dc)var(--lightningcss-dark,#29211a);--panel-3:var(--lightningcss-light,#e4dbcf)var(--lightningcss-dark,#322820);--hover:var(--lightningcss-light,#1020270d)var(--lightningcss-dark,#fff4eb0b);--hover-strong:var(--lightningcss-light,#10202714)var(--lightningcss-dark,#fff4eb14);--line:var(--lightningcss-light,#1020271a)var(--lightningcss-dark,#ffece014);--line-strong:var(--lightningcss-light,#10202729)var(--lightningcss-dark,#ffece024);--text:var(--lightningcss-light,#22201d)var(--lightningcss-dark,#ece4da);--text-strong:var(--lightningcss-light,#11100e)var(--lightningcss-dark,#fbf6f0);--muted:var(--lightningcss-light,#6f675f)var(--lightningcss-dark,#a4917f);--muted-2:var(--lightningcss-light,#958b80)var(--lightningcss-dark,#6f6152);--accent:var(--lightningcss-light,#c94a32)var(--lightningcss-dark,#f0714c);--accent-hover:var(--lightningcss-light,#b13c26)var(--lightningcss-dark,#ff8560);--accent-contrast:var(--lightningcss-light,#fff)var(--lightningcss-dark,#241009);--accent-2:var(--lightningcss-light,#006d77)var(--lightningcss-dark,#45b8ac);--accent-soft:var(--lightningcss-light,#c94a3224)var(--lightningcss-dark,#f0714c2b);--brand-a:var(--lightningcss-light,#c64b32)var(--lightningcss-dark,#f0714c);--brand-b:var(--lightningcss-light,#c8425a)var(--lightningcss-dark,#d84a63);--brand-contrast:var(--lightningcss-light,#fff)var(--lightningcss-dark,#11100e);--scrollbar:var(--lightningcss-light,#1020272e)var(--lightningcss-dark,#ffece01a);--scrollbar-hover:var(--lightningcss-light,#1020274d)var(--lightningcss-dark,#ffece033);--shadow:0 24px 60px -22px var(--lightningcss-light,#10202752)var(--lightningcss-dark,#080402a6)}[data-board=moss]{--rail:var(--lightningcss-light,#dfe5e0)var(--lightningcss-dark,#0a100d);--bg:var(--lightningcss-light,#ecf0ed)var(--lightningcss-dark,#0e1512);--panel:var(--lightningcss-light,#f7f9f7)var(--lightningcss-dark,#131b16);--panel-2:var(--lightningcss-light,#e6ebe7)var(--lightningcss-dark,#1a241d);--panel-3:var(--lightningcss-light,#dbe2dc)var(--lightningcss-dark,#223026);--hover:var(--lightningcss-light,#0f17120d)var(--lightningcss-dark,#d6ffe40b);--hover-strong:var(--lightningcss-light,#0f171214)var(--lightningcss-dark,#d6ffe414);--line:var(--lightningcss-light,#0f17121a)var(--lightningcss-dark,#c8ffdc17);--line-strong:var(--lightningcss-light,#0f17122b)var(--lightningcss-dark,#c8ffdc29);--text:var(--lightningcss-light,#212b24)var(--lightningcss-dark,#dbe7de);--text-strong:var(--lightningcss-light,#0f1712)var(--lightningcss-dark,#f3faf4);--muted:var(--lightningcss-light,#5c6b60)var(--lightningcss-dark,#8fa295);--muted-2:var(--lightningcss-light,#8a9a8e)var(--lightningcss-dark,#5d6e62);--accent:var(--lightningcss-light,#177a50)var(--lightningcss-dark,#3ddc97);--accent-hover:var(--lightningcss-light,#0f6a44)var(--lightningcss-dark,#63e6ab);--accent-contrast:var(--lightningcss-light,#fff)var(--lightningcss-dark,#05140c);--accent-2:var(--lightningcss-light,#d97f26)var(--lightningcss-dark,#ffab5e);--accent-soft:var(--lightningcss-light,#177a5021)var(--lightningcss-dark,#3ddc9726);--brand-a:var(--lightningcss-light,#177a50)var(--lightningcss-dark,#3ddc97);--brand-b:var(--lightningcss-light,#0e7490)var(--lightningcss-dark,#2bb3a3);--brand-contrast:var(--lightningcss-light,#fff)var(--lightningcss-dark,#05140c);--scrollbar:var(--lightningcss-light,#0f17122e)var(--lightningcss-dark,#c8ffdc1f);--scrollbar-hover:var(--lightningcss-light,#0f17124d)var(--lightningcss-dark,#c8ffdc38)}[data-board=iris]{--rail:var(--lightningcss-light,#e2e2ea)var(--lightningcss-dark,#0d0c15);--bg:var(--lightningcss-light,#eeeef4)var(--lightningcss-dark,#12111c);--panel:var(--lightningcss-light,#f8f8fb)var(--lightningcss-dark,#181726);--panel-2:var(--lightningcss-light,#e9e9f0)var(--lightningcss-dark,#201e33);--panel-3:var(--lightningcss-light,#dedee8)var(--lightningcss-dark,#2a2742);--hover:var(--lightningcss-light,#1213270d)var(--lightningcss-dark,#e0dcff0b);--hover-strong:var(--lightningcss-light,#12132714)var(--lightningcss-dark,#e0dcff14);--line:var(--lightningcss-light,#1213271a)var(--lightningcss-dark,#d2cdff17);--line-strong:var(--lightningcss-light,#1213272b)var(--lightningcss-dark,#d2cdff29);--text:var(--lightningcss-light,#26283a)var(--lightningcss-dark,#e0dff0);--text-strong:var(--lightningcss-light,#121327)var(--lightningcss-dark,#f6f5fd);--muted:var(--lightningcss-light,#61637a)var(--lightningcss-dark,#918fa9);--muted-2:var(--lightningcss-light,#9092a8)var(--lightningcss-dark,#605e78);--accent:var(--lightningcss-light,#7048d9)var(--lightningcss-dark,#a78bfa);--accent-hover:var(--lightningcss-light,#5f39c2)var(--lightningcss-dark,#bda4ff);--accent-contrast:var(--lightningcss-light,#fff)var(--lightningcss-dark,#150f26);--accent-2:var(--lightningcss-light,#d94f8a)var(--lightningcss-dark,#ff8bb3);--accent-soft:var(--lightningcss-light,#7048d921)var(--lightningcss-dark,#a78bfa29);--brand-a:var(--lightningcss-light,#7048d9)var(--lightningcss-dark,#a78bfa);--brand-b:var(--lightningcss-light,#2653e8)var(--lightningcss-dark,#6d8bff);--brand-contrast:var(--lightningcss-light,#fff)var(--lightningcss-dark,#150f26);--scrollbar:var(--lightningcss-light,#1213272e)var(--lightningcss-dark,#d2cdff1f);--scrollbar-hover:var(--lightningcss-light,#1213274d)var(--lightningcss-dark,#d2cdff38)}[data-board=signal]{--rail:var(--lightningcss-light,#e2e5ea)var(--lightningcss-dark,#0b0e14);--bg:var(--lightningcss-light,#edeff2)var(--lightningcss-dark,#0e1219);--panel:var(--lightningcss-light,#f8f9fb)var(--lightningcss-dark,#141926);--panel-2:var(--lightningcss-light,#e8ebef)var(--lightningcss-dark,#1b2232);--panel-3:var(--lightningcss-light,#dde1e7)var(--lightningcss-dark,#232c3f);--hover:var(--lightningcss-light,#10151d0d)var(--lightningcss-dark,#d6e4ff0b);--hover-strong:var(--lightningcss-light,#10151d14)var(--lightningcss-dark,#d6e4ff14);--line:var(--lightningcss-light,#10151d1a)var(--lightningcss-dark,#bed2ff17);--line-strong:var(--lightningcss-light,#10151d2b)var(--lightningcss-dark,#bed2ff29);--text:var(--lightningcss-light,#232a35)var(--lightningcss-dark,#dbe2ec);--text-strong:var(--lightningcss-light,#10151d)var(--lightningcss-dark,#f4f7fb);--muted:var(--lightningcss-light,#5d6878)var(--lightningcss-dark,#8a95a8);--muted-2:var(--lightningcss-light,#8b94a3)var(--lightningcss-dark,#5c6577);--accent:var(--lightningcss-light,#0080c4)var(--lightningcss-dark,#41c6ff);--accent-hover:var(--lightningcss-light,#006aa6)var(--lightningcss-dark,#6ad3ff);--accent-contrast:var(--lightningcss-light,#fff)var(--lightningcss-dark,#061420);--accent-2:var(--lightningcss-light,#f56a1d)var(--lightningcss-dark,#ff9550);--accent-soft:var(--lightningcss-light,#0080c421)var(--lightningcss-dark,#41c6ff26);--brand-a:var(--lightningcss-light,#0072b0)var(--lightningcss-dark,#41c6ff);--brand-b:var(--lightningcss-light,#2653e8)var(--lightningcss-dark,#6d8bff);--brand-contrast:var(--lightningcss-light,#fff)var(--lightningcss-dark,#061420)}*{box-sizing:border-box}html,body{height:100%;margin:0;padding:0}body{background:radial-gradient(1000px 600px at 0% 0%, color-mix(in srgb, var(--accent) 6%, transparent), transparent 60%), radial-gradient(900px 700px at 100% 100%, color-mix(in srgb, var(--delivery-accent) 5%, transparent), transparent 60%), var(--bg);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}button,input,textarea{font:inherit;color:inherit}code,pre,kbd,samp{font-variant-ligatures:none}button{cursor:pointer}input,textarea{background:0 0;border:0;outline:0}::-webkit-scrollbar{width:10px;height:10px}::-webkit-scrollbar-thumb{background:var(--scrollbar);background-clip:content-box;border:2px solid #0000;border-radius:999px}::-webkit-scrollbar-thumb:hover{background:var(--scrollbar-hover);background-clip:content-box}.auth-shell{min-height:100dvh;padding:calc(32px + var(--safe-area-top)) calc(32px + var(--safe-area-right)) calc(32px + var(--safe-area-bottom)) calc(32px + var(--safe-area-left));background:radial-gradient(color-mix(in srgb, var(--text) 6%, transparent) 1px, transparent 1.5px) 0 0 / 18px 18px, radial-gradient(700px 500px at 30% 20%, color-mix(in srgb, var(--brand-a) 14%, transparent), transparent 60%), radial-gradient(700px 500px at 80% 90%, color-mix(in srgb, var(--brand-b) 10%, transparent), transparent 60%), var(--bg);place-items:center;display:grid}.auth-panel{border:1px solid var(--line-strong);border-radius:var(--radius-xl);background:linear-gradient(180deg, #ffffff0a, #fff0) var(--panel);width:min(100%,440px);box-shadow:var(--key-edge), var(--shadow);gap:22px;padding:36px;display:grid}.auth-brand{align-items:center;gap:12px;display:flex}.auth-brand .mark{box-shadow:inset 0 0 0 1px #bed2ff21, var(--key-edge), 0 10px 24px -8px color-mix(in srgb, var(--brand-b) 65%, transparent)}.auth-brand .brand-text strong{color:var(--text-strong);letter-spacing:-.01em;display:block}.auth-brand .brand-text span{color:var(--muted);font-size:12px;display:block}.auth-copy{gap:8px;margin-top:8px;display:grid}.auth-copy h1{letter-spacing:-.02em;color:var(--text-strong);font-size:28px;font-family:var(--font-display);margin:0;font-weight:700}.auth-copy p{color:var(--muted);margin:0;line-height:1.5}.github-login{color:#fff;background:#0d1117;border:1px solid #2b2f36;border-radius:12px;justify-content:center;align-items:center;gap:10px;min-height:46px;font-weight:600;text-decoration:none;transition:transform 80ms,background .12s,border-color .12s;display:inline-flex}.github-login:hover{background:#161b22;border-color:#3f4750;transform:translateY(-1px)}.openclaw-login{min-height:46px;color:var(--text-strong);border:1px solid var(--muted-2);background:0 0;border-radius:12px;justify-content:center;align-items:center;gap:10px;font-weight:600;text-decoration:none;transition:transform 80ms,background .12s,border-color .12s;display:inline-flex}.openclaw-login:hover{background:color-mix(in srgb, var(--text-strong) 6%, transparent);border-color:var(--muted);transform:translateY(-1px)}.auth-form{gap:14px;display:grid}.auth-submit{border:1px solid color-mix(in srgb, var(--accent) 70%, var(--text-strong));background:var(--accent);min-height:46px;color:var(--accent-contrast);cursor:pointer;border-radius:12px;font-weight:700;transition:transform 80ms,background .12s}.auth-submit:hover:not(:disabled){background:var(--accent-hover);transform:translateY(-1px)}.auth-submit:disabled{cursor:default;opacity:.58;transform:none}.auth-submit-quiet{border-color:var(--line-strong);background:var(--panel-2);min-height:38px;color:var(--text)}.auth-submit-quiet:hover:not(:disabled){background:var(--hover)}.auth-divider{color:var(--muted-2);align-items:center;gap:12px;margin:0;font-size:12px;display:flex}.auth-divider:before,.auth-divider:after{content:"";background:var(--line);flex:1;height:1px}.auth-error{border:1px solid color-mix(in srgb, var(--danger) 45%, var(--line));border-radius:var(--radius-sm);background:color-mix(in srgb, var(--danger) 10%, transparent);color:var(--text);margin:0;padding:10px 12px;font-size:13px}.auth-magic summary{cursor:pointer;color:var(--muted);font-size:12px}.auth-magic[open] summary{margin-bottom:12px}.auth-foot{color:var(--muted-2);text-align:center;margin:0;font-size:12px}.shell{grid-template-rows:minmax(0,1fr);grid-template-columns:72px 260px minmax(0,1fr) 0;height:100dvh;min-height:100dvh;transition:grid-template-columns .22s cubic-bezier(.2,.8,.2,1);display:grid;overflow:clip}.shell.thread-open,.shell.search-open{grid-template-columns:72px 260px minmax(0,1fr) minmax(340px,28vw)}.shell.artifact-open{grid-template-columns:72px 260px minmax(0,1fr) minmax(460px,42vw)}.shell.sidebar-collapsed{grid-template-columns:72px 0 minmax(0,1fr) 0}.shell.sidebar-collapsed.thread-open,.shell.sidebar-collapsed.search-open{grid-template-columns:72px 0 minmax(0,1fr) minmax(340px,28vw)}.shell.sidebar-collapsed.artifact-open{grid-template-columns:72px 0 minmax(0,1fr) minmax(460px,42vw)}.shell>.thread,.shell>.search-results,.shell>.artifact-viewer{grid-area:1/4}.shell.desktop-shell{background:radial-gradient(color-mix(in srgb, var(--text) 7%, transparent) 1px, transparent 1.5px) 0 0 / 14px 14px, var(--rail);grid-template-rows:52px minmax(0,1fr)}.desktop-shell>.guild-rail,.desktop-shell>.sidebar{background:0 0;border-right:0}.desktop-shell>.sidebar{grid-template-rows:minmax(0,1fr) auto}@media (width<=820px){.desktop-shell>.guild-rail{background:radial-gradient(color-mix(in srgb, var(--text) 7%, transparent) 1px, transparent 1.5px) 0 0 / 14px 14px, var(--rail);border-right:1px solid var(--line)}.desktop-shell>.sidebar{background:var(--panel);border-right:1px solid var(--line)}}.desktop-shell>.timeline{border-top:1px solid var(--line);border-left:1px solid var(--line);border-top-left-radius:12px}.desktop-shell:not(.thread-open):not(.search-open):not(.artifact-open)>.timeline{border-top-right-radius:12px}.desktop-shell>.thread,.desktop-shell>.search-results,.desktop-shell>.artifact-viewer{border-top:1px solid var(--line);border-top-right-radius:12px}.desktop-shell>.desktop-titlebar{grid-area:1/1/auto/-1}.desktop-shell>.guild-rail,.desktop-shell>.sidebar,.desktop-shell>.timeline,.desktop-shell>.thread,.desktop-shell>.search-results,.desktop-shell>.artifact-viewer{grid-row:2}.desktop-shell .mobile-nav-toggle{display:none}.desktop-auth-titlebar{z-index:10;-webkit-app-region:drag;height:52px;position:fixed;inset:0 0 auto}.desktop-titlebar{z-index:8;-webkit-app-region:drag;-webkit-user-select:none;user-select:none;background:0 0;align-items:center;min-width:0;height:52px;padding:0;display:flex;position:relative}.desktop-titlebar-safe-area{-webkit-app-region:drag;align-items:center;width:100%;min-width:0;height:100%;padding:0 14px;display:flex;position:relative}.desktop-titlebar[data-platform=darwin] .desktop-titlebar-safe-area{padding-left:78px}.desktop-titlebar[data-platform=win32] .desktop-titlebar-safe-area,.desktop-titlebar[data-platform=linux] .desktop-titlebar-safe-area{left:env(titlebar-area-x,0px);width:env(titlebar-area-width,calc(100% - 148px));position:absolute}.desktop-titlebar-leading{-webkit-app-region:no-drag;align-items:center;gap:9px;min-width:0;max-width:max(150px,50% - 300px);display:flex;overflow:hidden}.desktop-titlebar button,.desktop-external-link{color:var(--muted);background:0 0;border:1px solid #0000;place-items:center;display:grid}.desktop-titlebar button:hover,.desktop-external-link:hover{border-color:var(--line);background:var(--hover-strong);color:var(--text-strong)}.desktop-external-link{border-radius:var(--radius-sm);width:28px;height:28px;color:var(--muted);flex:0 0 28px;place-items:center;text-decoration:none;display:grid}.desktop-titlebar-leading>.desktop-sidebar-toggle{border-radius:8px;width:30px;height:30px}.desktop-titlebar-workspace{min-width:36px;max-width:190px;color:var(--text-strong);font-family:var(--font-display);letter-spacing:-.01em;text-overflow:ellipsis;white-space:nowrap;border-radius:8px;flex:0 auto;padding:5px 9px;font-size:13px;font-weight:650;overflow:hidden}.desktop-titlebar-channel{min-width:30px;max-width:230px;color:var(--text-strong);font-family:var(--font-display);letter-spacing:-.01em;text-overflow:ellipsis;white-space:nowrap;flex:0 auto;margin:0;font-size:13px;font-weight:650;overflow:hidden}.desktop-titlebar-channel.with-glyph:first-letter{color:var(--accent);margin-right:1px}.desktop-titlebar-divider{flex:none}.desktop-titlebar-status{color:var(--muted);white-space:nowrap;flex:none;align-items:center;gap:6px;margin-left:auto;font-size:11px;display:inline-flex}.desktop-titlebar-status:before{content:"";background:var(--muted-2);border-radius:50%;width:7px;height:7px;animation:1.6s ease-in-out infinite presence-pulse}.desktop-titlebar-actions{-webkit-app-region:no-drag;flex:none;align-items:center;margin-left:auto;display:flex}.desktop-titlebar-actions button{border-radius:8px;width:30px;height:30px}.desktop-titlebar-actions button:disabled{cursor:wait;opacity:.55}.desktop-titlebar-actions button.active{background:var(--accent-soft);color:var(--accent)}.desktop-titlebar-actions+.desktop-titlebar-status{margin-left:8px}@media (prefers-reduced-motion:reduce){.desktop-titlebar-status:before{animation:none}}.desktop-titlebar-search.search{border-color:var(--line-strong);background:color-mix(in srgb, var(--panel-2) 84%, transparent);-webkit-app-region:no-drag;width:clamp(220px,100vw - 700px,520px);height:32px;position:absolute;left:50%;transform:translate(-50%);box-shadow:inset 0 1px #ffffff09}.desktop-titlebar-search.search:focus-within{border-color:color-mix(in srgb, var(--accent) 66%, var(--line));background:var(--panel-2);box-shadow:0 0 0 3px color-mix(in srgb, var(--accent) 13%, transparent)}.timeline{background:var(--bg);isolation:isolate;flex-direction:column;min-width:0;display:flex;overflow:hidden}.timeline>*{flex-shrink:0;min-width:0}.timeline>.messages{flex:1 1 0;min-height:0}.topbar{border-bottom:1px solid var(--line);background:linear-gradient(180deg, #ffffff05, transparent), var(--bg);align-items:center;gap:14px;min-height:60px;padding:12px 20px;display:flex}.topbar-title{flex:1;align-items:center;gap:10px;min-width:0;display:flex}.topbar-title h1{letter-spacing:-.01em;color:var(--text-strong);font-size:16px;font-weight:650;font-family:var(--font-display);white-space:nowrap;text-overflow:ellipsis;margin:0;overflow:hidden}.topbar-title h1.with-glyph:first-letter{color:var(--accent);margin-right:1px}.topbar-divider{background:var(--line-strong);width:1px;height:18px;margin:0 6px}.topbar-meta{color:var(--muted);white-space:nowrap;text-overflow:ellipsis;margin:0;font-size:12px;overflow:hidden}.search{border-radius:var(--radius);background:var(--panel);border:1px solid var(--line);width:min(280px,30vw);height:34px;color:var(--muted);align-items:center;gap:8px;padding:0 10px;transition:border-color .12s,background .12s;display:flex}.search:focus-within{border-color:var(--accent);background:var(--panel-2);color:var(--text)}.search input{min-width:0;height:100%;color:var(--text);flex:1}.search input::placeholder{color:var(--muted)}.search-clear{background:var(--panel-3);width:18px;height:18px;color:var(--muted);border:0;border-radius:50%;place-items:center;font-size:14px;line-height:1;display:grid}.search-clear:hover{background:var(--accent);color:var(--accent-contrast)}.search-submit{background:var(--accent-soft);height:22px;color:var(--accent);font-family:var(--font-mono);letter-spacing:.06em;text-transform:uppercase;border:0;border-radius:5px;padding:0 8px;font-size:10px;font-weight:600}.search-submit:hover{background:var(--accent);color:var(--accent-contrast)}.topbar-actions{align-items:center;gap:6px;display:inline-flex}.topbar-actions button,.topbar-actions a{border:1px solid var(--line-strong);border-radius:var(--radius);background:var(--panel);width:32px;height:32px;color:var(--muted);box-shadow:var(--key-edge);place-items:center;text-decoration:none;transition:background .12s,color .12s,border-color .12s,box-shadow .12s,transform 80ms;display:grid}.topbar-actions button:hover,.topbar-actions a:hover,.topbar-actions button.active{background:var(--accent-soft);border-color:color-mix(in srgb, var(--accent) 55%, var(--line-strong));color:var(--accent)}.topbar-actions button:active,.topbar-actions a:active{box-shadow:var(--key-edge-pressed);transform:translateY(1px)}.notif-toggle{width:28px;height:28px;color:var(--muted);cursor:pointer;background:0 0;border:0;border-radius:6px;justify-content:center;align-items:center;margin-left:4px;display:inline-flex}.notif-toggle:hover{background:var(--accent-soft);color:var(--accent)}@keyframes pulse{0%,to{opacity:1}50%{opacity:.5}}.search-results{border-left:1px solid var(--line);background:var(--panel);opacity:1;grid-template-rows:auto auto minmax(0,1fr);min-width:0;transition:opacity .18s,transform .22s cubic-bezier(.2,.8,.2,1);display:grid;overflow:hidden;transform:translate(0)}.search-results.covered{opacity:0;pointer-events:none}.search-results-head{border-bottom:1px solid var(--line);background:linear-gradient(180deg, #ffffff05, transparent), var(--panel);justify-content:space-between;align-items:center;min-height:60px;padding:10px 16px;display:flex}.search-results-head>div{min-width:0}.search-results-head p{color:var(--muted);font-family:var(--font-mono);letter-spacing:0;text-transform:uppercase;margin:0 0 2px;font-size:10px;font-weight:600}.search-results-head strong{color:var(--text-strong);text-overflow:ellipsis;white-space:nowrap;font-size:14px;display:block;overflow:hidden}.search-results-head button{background:var(--panel-2);width:30px;height:30px;color:var(--muted);border:0;border-radius:50%;flex:none;place-items:center;font-size:19px;line-height:1;display:grid}.search-results-head button:hover{background:var(--hover);color:var(--text)}.search-results-summary{color:var(--muted);padding:12px 16px 8px;font-size:12px;font-weight:600}.search-results-scroll{min-height:0;padding:0 8px 16px;overflow-y:auto}.search-result-list{margin:0;padding:0;list-style:none}.search-result{color:var(--text);border-radius:var(--radius);text-align:left;background:0 0;border:0;align-items:flex-start;gap:10px;width:100%;padding:10px 8px;display:flex}.search-result:hover{background:var(--hover)}.search-result.is-active{background:color-mix(in srgb, var(--accent) 10%, transparent)}.search-result:focus-visible,.search-results-head button:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}.search-result .dm-avatar{width:30px;height:30px;font-size:13px}.search-result-body{flex-direction:column;flex:1;gap:2px;min-width:0;display:flex}.search-result-meta{align-items:baseline;gap:8px;min-width:0;display:flex}.search-result-meta strong{color:var(--text-strong);text-overflow:ellipsis;white-space:nowrap;font-size:13px;overflow:hidden}.search-result-handle{color:var(--muted);text-overflow:ellipsis;white-space:nowrap;font-size:11px;overflow:hidden}.search-result-meta time{color:var(--muted);flex:none;margin-left:auto;font-size:11px}.search-result-snippet{color:var(--muted);-webkit-line-clamp:3;-webkit-box-orient:vertical;line-height:1.45;display:-webkit-box;overflow:hidden}.search-result-snippet mark{background:color-mix(in srgb, var(--accent) 22%, transparent);color:var(--text-strong);border-radius:2px;font-weight:650}.search-result-context{min-width:0;color:var(--muted-2);align-items:center;gap:10px;margin-top:1px;font-size:11px;display:flex}.search-result-context:empty{display:none}.search-result-where{text-overflow:ellipsis;white-space:nowrap;font-weight:600;overflow:hidden}.search-result-thread{color:var(--accent);flex:none;align-items:center;gap:4px;font-weight:600;display:inline-flex}.search-load-more{border:1px solid var(--line-strong);border-radius:var(--radius);background:var(--panel-2);width:calc(100% - 16px);color:var(--text);margin:8px auto 0;padding:8px 12px;font-size:12px;font-weight:600;display:block}.search-load-more:hover:not(:disabled){background:var(--hover)}.search-load-more:disabled{color:var(--muted)}.search-load-more:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}.search-end{color:var(--muted-2);text-align:center;padding:14px 8px 4px;font-size:11px}.search-foot-error{border:1px solid color-mix(in srgb, var(--danger) 40%, transparent);border-radius:var(--radius);background:color-mix(in srgb, var(--danger) 8%, transparent);color:var(--text);justify-content:space-between;align-items:center;gap:10px;margin:8px 8px 0;padding:8px 12px;font-size:12px;display:flex}.search-foot-error p{min-width:0;margin:0}.search-foot-error button{border:1px solid var(--line-strong);border-radius:var(--radius);background:var(--panel-2);color:var(--text);flex:none;padding:4px 10px;font-size:12px;font-weight:600}.search-foot-error button:hover{background:var(--hover)}.search-state{color:var(--muted);text-align:center;justify-items:center;padding:56px 24px;display:grid}.search-state-icon{border:1px solid var(--line-strong);background:var(--panel-2);width:44px;height:44px;color:var(--muted-2);border-radius:50%;place-items:center;margin-bottom:14px;font-size:23px;display:grid}.search-state strong{color:var(--text-strong);font-size:14px}.search-state p{margin:5px 0 0;font-size:12px}.search-state-loading{grid-template-columns:repeat(3,7px);justify-content:center;gap:6px}.search-state-loading span{background:var(--accent);border-radius:50%;width:7px;height:7px;animation:1.2s ease-in-out infinite pulse}.search-state-loading span:nth-child(2){animation-delay:.12s}.search-state-loading span:nth-child(3){animation-delay:.24s}.guild-rail{background:radial-gradient(color-mix(in srgb, var(--text) 7%, transparent) 1px, transparent 1.5px) 0 0 / 14px 14px, var(--rail);border-right:1px solid var(--line);flex-direction:column;align-items:center;gap:8px;padding:14px 0;display:flex;position:relative}.guild-rail .guild{background:var(--panel);width:48px;height:48px;color:var(--text);border:1px solid var(--line-strong);letter-spacing:-.02em;box-shadow:var(--key-edge);border-radius:12px;place-items:center;font-size:14px;font-weight:700;text-decoration:none;transition:border-color .12s,background .12s,transform .12s,box-shadow .12s;display:grid;position:relative}.guild-rail .guild:hover{border-color:color-mix(in srgb, var(--accent) 55%, var(--line-strong));color:var(--accent);box-shadow:var(--key-edge), 0 6px 16px -8px color-mix(in srgb, var(--accent) 45%, transparent);transform:translateY(-1px)}.guild-rail .guild:active{box-shadow:var(--key-edge-pressed);transform:translateY(1px)}.guild-rail .guild.home{background:linear-gradient(135deg, var(--brand-a), var(--brand-b));border-color:color-mix(in srgb, var(--brand-b) 55%, var(--line-strong));color:var(--brand-contrast);font-weight:800;font-family:var(--font-display)}.guild-rail .guild.home:hover{color:var(--brand-contrast);transform:translateY(-1px)}.guild-rail .guild.home>span{text-overflow:ellipsis;white-space:nowrap;max-width:100%;padding:0 4px;overflow:hidden}.guild-rail .guild.home.home--mark{border-color:color-mix(in srgb, #41c6ff 35%, var(--line-strong));background:#141926;padding:0}.guild-rail .guild.home.home--mark .keystroke-mark{border-radius:inherit;width:100%;height:100%}.guild-rail .guild.home:active{box-shadow:var(--key-edge-pressed);transform:translateY(1px)}.guild-rail .guild__image{border-radius:inherit;object-fit:cover;width:100%;height:100%;display:block}.guild-rail .guild.add{color:var(--success);border:1px dashed color-mix(in srgb, var(--success) 45%, transparent);background:0 0}.guild-rail .guild.add:hover{background:color-mix(in srgb, var(--success) 14%, transparent);color:var(--success);border-style:solid;border-color:var(--success)}.guild-divider{background:var(--line-strong);width:36px;height:1px;margin:4px 0}.guild-list{flex-direction:column;flex:auto;align-items:center;gap:8px;min-height:0;display:flex;overflow-y:auto}.guild-wrap{position:relative}.guild-wrap:before{content:"";background:var(--accent);opacity:0;border-radius:0 4px 4px 0;width:4px;height:28px;transition:opacity .14s,transform .14s;position:absolute;top:50%;left:-14px;transform:translateY(-50%)scaleY(.2)}.guild-wrap:hover:before{opacity:.6;transform:translateY(-50%)scaleY(.5)}.guild-wrap.active:before{opacity:1;transform:translateY(-50%)scaleY(1)}.guild-wrap.active .guild{background:var(--accent);border-color:color-mix(in srgb, var(--accent) 70%, var(--text-strong));color:var(--accent-contrast)}.guild-create{background:var(--panel);border:1px solid var(--line-strong);border-radius:var(--radius);box-shadow:var(--shadow);z-index:20;margin-left:8px;padding:8px;position:absolute;top:14px;left:100%}.guild-create .profile-status{max-width:200px}.guild-create input{border-radius:var(--radius-sm);background:var(--panel-2);width:200px;height:32px;color:var(--text);padding:0 10px}.sidebar{background:var(--panel);border-right:1px solid var(--line);grid-template-rows:auto minmax(0,1fr) auto;min-width:0;transition:opacity .16s,transform .22s cubic-bezier(.2,.8,.2,1);display:grid;overflow:hidden}.sidebar-collapsed .sidebar{opacity:0;pointer-events:none;transform:translate(-14px)}.workspace-header{border-bottom:1px solid var(--line);justify-content:space-between;align-items:center;gap:6px;min-height:60px;padding:14px 16px;display:flex}.workspace-header-icon{object-fit:cover;background:var(--panel-2);border-radius:8px;flex:none;width:28px;height:28px}.workspace-header-actions{flex-shrink:0;align-items:center;gap:4px;display:flex}.workspace-menu{min-width:0;color:inherit;text-align:left;cursor:pointer;background:0 0;border:0;border-radius:8px;flex:1;align-items:center;gap:10px;margin-left:-8px;padding:5px 8px;transition:background .12s;display:flex}.workspace-menu:hover{background:var(--panel-2)}.workspace-menu-caret{color:var(--muted);flex:none;transition:color .12s}.workspace-menu:hover .workspace-menu-caret{color:var(--text-strong)}.sidebar-collapse{background:var(--panel-2);width:30px;height:30px;color:var(--muted);border:0;border-radius:8px;place-items:center;transition:color .12s,background .12s,transform .12s;display:grid}.sidebar-collapse:hover{background:var(--panel-3);color:var(--text-strong);transform:translate(-1px)}.workspace-name{flex-direction:column;gap:2px;min-width:0;display:flex}.workspace-name strong{min-width:0;color:var(--text-strong);letter-spacing:-.01em;font-size:15px;font-family:var(--font-display);align-items:center;gap:5px;font-weight:650;display:flex}.workspace-name-label{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.workspace-name .presence{color:var(--muted);align-items:center;gap:6px;font-size:11px;display:inline-flex}.workspace-name .presence:before{content:"";background:var(--muted-2);border-radius:50%;width:7px;height:7px;animation:1.6s ease-in-out infinite presence-pulse}@keyframes presence-pulse{0%,to{opacity:.4}50%{opacity:1}}@media (prefers-reduced-motion:reduce){.workspace-name .presence:before{animation:none}}.sidebar-scroll{padding:12px 8px 16px;overflow-y:auto}.nav-section+.nav-section{margin-top:12px}.section-title{border-radius:var(--radius-sm);background:0 0;border:0;align-items:center;gap:4px;width:100%;padding:2px 4px;display:flex}.nav-section.collapsed+.nav-section{margin-top:4px}.section-toggle{border-radius:var(--radius-sm);min-width:0;min-height:28px;color:var(--muted);text-transform:uppercase;font-family:var(--font-mono);letter-spacing:.09em;text-align:left;background:0 0;border:0;flex:1;align-items:center;gap:6px;padding:4px;font-size:10px;font-weight:600;display:flex}.section-toggle:hover{color:var(--text);background:var(--hover)}.section-toggle:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}.section-toggle .caret{opacity:.7;font-size:10px;transition:transform .14s}.section-toggle[aria-expanded=false] .caret{transform:rotate(-90deg)}.section-toggle .label{text-align:left;flex:1}.section-title .add-button{background:var(--hover-strong);width:18px;height:18px;color:var(--text);border:0;border-radius:4px;flex:none;place-items:center;padding:0;font-size:14px;font-weight:700;line-height:1;display:grid}.section-title .add-button:focus-visible{outline:2px solid var(--accent);outline-offset:1px}.section-title:hover .add-button{background:var(--accent);color:var(--accent-contrast)}.nav-list{flex-direction:column;gap:1px;margin-top:4px;display:flex}.nav-list[hidden]{display:none}.channel-subgroup{gap:1px;margin-top:6px;display:grid}.channel-subgroup-toggle{border-radius:var(--radius-sm);width:100%;min-height:26px;color:var(--muted);font-family:var(--font-mono);letter-spacing:.06em;text-align:left;text-transform:uppercase;background:0 0;border:0;align-items:center;gap:6px;padding:4px 9px 4px 28px;font-size:10px;font-weight:600;display:flex}.channel-subgroup-toggle:hover,.channel-subgroup-toggle:focus-visible{background:var(--hover);color:var(--text);outline:none}.channel-subgroup-toggle .caret{opacity:.7;font-size:10px;transition:transform .14s}.channel-subgroup-toggle[aria-expanded=false] .caret{transform:rotate(-90deg)}.channel-subgroup-count{color:var(--muted-2);font-variant-numeric:tabular-nums;margin-left:auto}.channel-subgroup-list{gap:1px;display:grid}.channel-subgroup-list[hidden]{display:none}.archived-channel-group{border-top:1px solid color-mix(in srgb, var(--line) 70%, transparent);margin-top:10px;padding-top:6px}@media (prefers-reduced-motion:reduce){.section-toggle .caret{transition:none}}.sr-only{clip:rect(0, 0, 0, 0);white-space:nowrap;border:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.channel-row{border-radius:var(--radius-sm);align-items:center;display:flex;position:relative}.channel-row .nav-item{flex:1;min-width:0}.channel-row.subdued .nav-item:not(.active){color:var(--muted-2)}.managed-channel-marker{color:var(--muted-2);flex:none;place-items:center;display:inline-grid}.nav-item.active .managed-channel-marker,.nav-item:hover .managed-channel-marker{color:var(--accent)}.channel-row.reorderable .nav-item{padding-left:2px}.channel-drag-handle{border-radius:var(--radius-sm);color:var(--muted-2);cursor:grab;opacity:0;background:0 0;border:0;flex:0 0 24px;align-self:stretch;place-items:center;display:grid}.channel-row:hover .channel-drag-handle,.channel-drag-handle:focus-visible{opacity:1}.channel-drag-handle:hover{color:var(--text);background:var(--hover)}.channel-drag-handle:active{cursor:grabbing}.channel-drag-handle:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}.channel-drag-handle svg{fill:currentColor}.channel-move-menu{z-index:4;border:1px solid var(--line-strong);border-radius:var(--radius-sm);background:var(--panel);min-width:112px;box-shadow:var(--shadow);padding:4px;display:grid;position:absolute;top:calc(100% + 2px);left:0}.channel-move-menu button{color:var(--text);text-align:left;background:0 0;border:0;border-radius:4px;padding:6px 8px}.channel-move-menu button:hover:not(:disabled),.channel-move-menu button:focus-visible{background:var(--hover-strong);outline:none}.channel-move-menu button:disabled{color:var(--muted-2);cursor:default}.channel-row.dragging{opacity:.45}.channel-row.drop-before:before,.channel-row.drop-after:after{content:"";z-index:1;background:var(--accent);pointer-events:none;border-radius:1px;height:2px;position:absolute;left:4px;right:4px}.channel-row.drop-before:before{top:-1px}.channel-row.drop-after:after{bottom:-1px}@media (hover:none){.channel-drag-handle{opacity:1}}@media (prefers-reduced-motion:reduce){.channel-subgroup-toggle .caret{transition:none}}.nav-item{border-radius:var(--radius-sm);width:100%;color:var(--muted);text-align:left;background:0 0;border:0;align-items:center;gap:8px;min-height:30px;padding:6px 10px;text-decoration:none;transition:background .1s,color .1s;display:flex}.nav-item:hover{background:var(--hover);color:var(--text)}.nav-item:focus{outline:none}.nav-item:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}.nav-item.active{background:var(--accent-soft);color:var(--text-strong);box-shadow:inset 0 0 0 1px color-mix(in srgb, var(--accent) 35%, transparent)}.nav-item.has-unread{color:var(--text-strong);font-weight:600}.nav-item.has-unread .hash{color:var(--text-strong)}.unread-badge{background:var(--accent);min-width:18px;height:18px;color:var(--accent-contrast,white);text-align:center;letter-spacing:.01em;border-radius:9px;flex-shrink:0;padding:0 6px;font-size:11px;font-weight:700;line-height:18px}.nav-item .hash{color:var(--muted);text-align:center;width:14px;font-weight:600}.nav-item.active .hash{color:var(--accent)}.nav-label{white-space:nowrap;text-overflow:ellipsis;flex:1;font-size:14px;overflow:hidden}.dm-row{grid-template-columns:minmax(0,1fr) 24px;align-items:center;gap:2px;display:grid;position:relative}.dm-row .nav-item{min-width:0}.dm-actions-trigger{border-radius:var(--radius-sm);width:22px;height:22px;color:var(--muted-2);opacity:0;background:0 0;border:0;place-items:center;font-size:18px;font-weight:700;line-height:1;display:grid}.dm-row:hover .dm-actions-trigger,.dm-row:focus-within .dm-actions-trigger,.dm-row.active .dm-actions-trigger{opacity:1}.dm-actions-trigger:hover,.dm-actions-trigger:focus-visible,.dm-actions-trigger[aria-expanded=true]{background:var(--hover);color:var(--text);outline:none}.dm-actions-menu{z-index:30;border:1px solid var(--line-strong);border-radius:var(--radius-sm);background:var(--panel-2);min-width:164px;box-shadow:var(--shadow);padding:4px;position:absolute;top:28px;right:0}.dm-actions-item{width:100%;min-height:30px;color:var(--text);text-align:left;background:0 0;border:0;border-radius:6px;padding:0 10px;font-size:13px}.dm-actions-item:hover,.dm-actions-item:focus-visible{background:var(--hover);color:var(--text-strong);outline:none}.dm-undo{border:1px solid var(--line);border-radius:var(--radius-sm);background:var(--panel-2);color:var(--muted);align-items:center;gap:8px;margin:6px 8px 2px;padding:6px 8px;font-size:12px;display:flex}.dm-undo span{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;overflow:hidden}.dm-undo button{background:var(--hover);color:var(--text);border:0;border-radius:6px;padding:4px 8px;font-size:12px;font-weight:700}.dm-undo button:hover,.dm-undo button:focus-visible{background:var(--accent);color:var(--accent-contrast);outline:none}.nav-empty{color:var(--muted-2);margin:4px 8px;font-size:12px}.dm-avatar{color:#fff;background:linear-gradient(135deg, hsl(var(--hue,220deg) 70% 55%), hsl(calc(var(--hue,220deg) + 40deg) 70% 45%));border-radius:50%;flex-shrink:0;place-items:center;width:22px;height:22px;font-size:11px;font-weight:700;display:grid;overflow:hidden}.dm-avatar img,.avatar img{object-fit:cover;width:100%;height:100%;display:block}.presence-dot{background:var(--muted-2);border-radius:50%;flex-shrink:0;width:8px;height:8px}.presence-dot.active{background:var(--success);box-shadow:0 0 0 2px var(--panel)}.inline-create{grid-template-columns:minmax(0,1fr) auto;gap:6px;margin:6px 4px 2px;display:grid}.inline-create input{border-radius:var(--radius-sm);background:var(--panel-2);width:100%;min-width:0;height:30px;color:var(--text);border:1px solid var(--line);padding:0 10px}.inline-create input:focus{border-color:var(--accent);background:var(--panel-3)}.inline-create button.ghost,button.ghost{border-radius:var(--radius-sm);background:var(--panel-3);width:30px;height:30px;color:var(--muted);border:0;place-items:center;padding:0;font-size:14px;font-weight:600;display:grid}.inline-create button.ghost:hover{background:var(--accent);color:var(--accent-contrast)}.user-card{background:var(--panel-2);border-top:1px solid var(--line);width:100%;color:inherit;text-align:left;cursor:pointer;border-bottom:0;border-left:0;border-right:0;align-items:center;gap:10px;padding:10px 12px;transition:background .12s;display:flex}.user-card:hover{background:var(--panel-3)}.user-card .dm-avatar{width:28px;height:28px;font-size:12px}.user-card .user-meta{flex:1;min-width:0}.user-card .user-meta strong{color:var(--text-strong);white-space:nowrap;text-overflow:ellipsis;font-size:13px;display:block;overflow:hidden}.user-card .user-meta span{color:var(--muted);white-space:nowrap;text-overflow:ellipsis;font-size:11px;display:block;overflow:hidden}@media (width<=820px){.workspace-header{min-height:calc(60px + var(--safe-area-top));padding-top:calc(14px + var(--safe-area-top));padding-right:calc(16px + var(--safe-area-right))}.sidebar-scroll{padding-bottom:calc(16px + var(--safe-area-bottom))}.user-card{padding-bottom:calc(10px + var(--safe-area-bottom))}}.messages{flex-direction:column;display:flex;position:relative}.messages-scroll{overflow-anchor:none;opacity:1;isolation:isolate;flex-direction:column;flex:1;min-height:0;padding:0 4px;transition:opacity .14s ease-out;display:flex;overflow-y:auto}.messages-scroll:focus{outline:none}.messages.is-revealing .messages-scroll{opacity:0;pointer-events:none;transition:opacity}.messages-spacer{flex-grow:1}.history-loader{pointer-events:none;gap:14px;margin:4px 0 6px;padding:6px 18px;animation:.22s ease-out both history-loader-fade;display:grid}.history-loader--newer{margin-top:6px;margin-bottom:4px}@keyframes history-loader-fade{0%{opacity:0}to{opacity:1}}.history-loader__row{grid-template-columns:56px minmax(0,1fr);min-height:44px;display:grid}.history-loader__avatar,.history-loader__meta,.history-loader__line,.history-loader__block{background:linear-gradient(90deg, color-mix(in srgb, var(--muted-2) 16%, transparent), color-mix(in srgb, var(--muted-2) 36%, transparent), color-mix(in srgb, var(--muted-2) 16%, transparent));animation:1.4s ease-in-out infinite history-loading;animation-delay:calc(var(--history-row,0) * 80ms);background-size:220% 100%;display:block}.history-loader__avatar{border-radius:10px;width:38px;height:38px}.history-loader__body{align-content:start;gap:8px;min-width:0;padding-top:4px;display:grid}.history-loader__meta{border-radius:999px;width:min(180px,38%);height:11px}.history-loader__line{border-radius:999px;height:10px}.history-loader__line--wide{width:min(540px,72%)}.history-loader__line--mid{width:min(360px,48%)}@keyframes history-loading{0%{background-position:120% 0}to{background-position:-120% 0}}@media (prefers-reduced-motion:reduce){.history-loader{animation:none}.history-loader__avatar,.history-loader__meta,.history-loader__line,.history-loader__block{background:color-mix(in srgb, var(--muted-2) 22%, transparent);animation:none}}.unread-bar{z-index:5;background:color-mix(in srgb, var(--panel) 82%, transparent);-webkit-backdrop-filter:blur(14px)saturate(140%);border:1px solid color-mix(in srgb, var(--accent) 38%, transparent);max-width:calc(100% - 32px);height:30px;color:var(--text);letter-spacing:.005em;box-shadow:inset 0 1px 0 #ffffff14, 0 10px 24px -14px #0000008c, 0 0 0 4px color-mix(in srgb, var(--accent) 10%, transparent);opacity:1;border-radius:999px;align-items:center;gap:6px;padding:0 5px 0 14px;font-size:12px;font-weight:600;transition:opacity .16s ease-out,transform .18s cubic-bezier(.2,.8,.2,1);display:inline-flex;position:absolute;top:10px;left:50%;transform:translate(-50%)}.unread-bar.is-clearing{opacity:0;pointer-events:none;transform:translate(-50%,-6px)}.unread-bar__jump,.unread-bar__mark{color:inherit;font:inherit;cursor:pointer;background:0 0;border:0;align-items:center;gap:8px;transition:background-color .12s ease-out,color .12s ease-out;display:inline-flex}.unread-bar__jump{text-align:left;min-width:0;color:color-mix(in srgb, var(--accent) 92%, var(--text));flex:0 auto;padding:0 6px 0 0}.unread-bar__jump:before{content:"";background:var(--accent);width:7px;height:7px;box-shadow:0 0 0 0 color-mix(in srgb, var(--accent) 55%, transparent);border-radius:50%;flex-shrink:0;animation:1.8s ease-out infinite unread-bar-pulse}@keyframes unread-bar-pulse{0%{box-shadow:0 0 0 0 color-mix(in srgb, var(--accent) 55%, transparent)}70%{box-shadow:0 0 0 7px color-mix(in srgb, var(--accent) 0%, transparent)}to{box-shadow:0 0 0 0 color-mix(in srgb, var(--accent) 0%, transparent)}}@media (prefers-reduced-motion:reduce){.unread-bar__jump:before{animation:none}}.unread-bar__mark{background:color-mix(in srgb, var(--accent) 14%, transparent);height:22px;color:color-mix(in srgb, var(--accent) 90%, var(--text));letter-spacing:.01em;border-radius:999px;flex-shrink:0;padding:0 10px;font-size:11px;font-weight:600}.unread-bar__jump:hover{color:var(--accent)}.unread-bar__mark:hover{background:color-mix(in srgb, var(--accent) 24%, transparent);color:var(--accent)}.unread-bar__jump:focus-visible,.unread-bar__mark:focus-visible{outline:2px solid color-mix(in srgb, var(--accent) 70%, transparent);outline-offset:2px;border-radius:999px}.unread-bar__label{white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.typing-indicator{height:0;color:var(--text-muted);opacity:0;pointer-events:none;align-items:center;gap:8px;margin-top:0;padding:0 22px;font-size:12px;transition:height .12s ease-out,margin-top .12s ease-out,opacity .12s ease-out,transform .16s cubic-bezier(.2,.8,.2,1);display:flex;overflow:hidden;transform:translateY(2px)}.typing-indicator.visible{opacity:1;height:20px;margin-top:-4px;transform:translateY(0)}.composer-dock{padding-top:20px;position:relative}.topic-filter{border-bottom:1px solid var(--line);background:color-mix(in srgb, var(--accent) 8%, var(--panel));color:var(--muted);justify-content:space-between;align-items:center;gap:12px;padding:8px 18px;font-size:13px;display:flex}.topic-filter strong{color:var(--text)}.topic-filter button,.message-topic{color:var(--accent);font:inherit;cursor:pointer;background:0 0;border:0}.topic-filter button:hover,.message-topic:hover{text-decoration:underline}.message-topic{background:color-mix(in srgb, var(--accent) 12%, transparent);border-radius:999px;margin:0 0 4px;padding:2px 7px;font-size:11px;font-weight:700;display:inline-flex}.topic-picker{border:1px solid var(--line);background:var(--panel);color:var(--muted);border-bottom:0;border-radius:10px 10px 0 0;align-items:center;gap:8px;margin:0 14px -1px;padding:7px 10px;font-size:12px;display:flex}.topic-picker select{min-width:0;max-width:min(280px,65vw);color:var(--text);font:inherit;background:0 0;border:0}.composer-dock .agent-responding{opacity:0;pointer-events:none;align-items:center;height:20px;margin:0;padding:0 22px;transition:opacity .12s ease-out;display:flex;position:absolute;top:0;left:0;right:0;overflow:hidden;transform:none}.composer-dock .agent-responding.visible{opacity:1;height:20px;margin:0;transform:none}.typing-indicator__dots{align-items:center;gap:3px;display:inline-flex}.typing-indicator__dots i{opacity:.55;background:currentColor;border-radius:50%;width:4px;height:4px;animation:1.1s ease-in-out infinite typing-dot}.typing-indicator__dots i:nth-child(2){animation-delay:.15s}.typing-indicator__dots i:nth-child(3){animation-delay:.3s}@keyframes typing-dot{0%,60%,to{opacity:.35;transform:translateY(0)}30%{opacity:1;transform:translateY(-3px)}}.message-row.is-pending{opacity:.55}.message-row.is-pending .message-content,.message-row.is-pending .markdown{pointer-events:none}.message-row.is-failed{opacity:1}.message-row.is-deleted{color:var(--muted)}.message-failed{background:color-mix(in srgb, var(--danger,#d04848) 14%, transparent);color:var(--danger,#d04848);border-radius:999px;align-items:center;gap:10px;margin-top:6px;padding:4px 10px;font-size:12px;display:inline-flex}.message-failed__label{font-weight:500}.message-failed__action{color:inherit;font:inherit;cursor:pointer;background:0 0;border:1px solid;border-radius:999px;padding:2px 8px;line-height:1}.message-failed__action:hover{background:color-mix(in srgb, currentColor 12%, transparent)}.message-failed__action--ghost{border-color:color-mix(in srgb, currentColor 50%, transparent)}@media (prefers-reduced-motion:reduce){.typing-indicator{transition:opacity 80ms ease-out;transform:none}.typing-indicator.visible{transform:none}.typing-indicator__dots i{opacity:.7;animation:none}}.empty{text-align:center;align-content:center;place-items:center;gap:10px;min-height:50vh;padding:48px 24px;display:grid}.empty-icon{background:linear-gradient(135deg, var(--brand-a), var(--brand-b));border:1px solid color-mix(in srgb, var(--brand-b) 55%, var(--line-strong));width:64px;height:64px;color:var(--brand-contrast);box-shadow:var(--key-edge), 0 18px 40px -16px color-mix(in srgb, var(--brand-b) 60%, transparent);border-radius:16px;place-items:center;font-size:26px;font-weight:800;display:grid}.empty strong{color:var(--text-strong);letter-spacing:-.01em;font-size:19px;font-family:var(--font-display);overflow-wrap:anywhere;font-weight:700}.empty span{color:var(--muted);max-width:380px;line-height:1.5}.day-divider{pointer-events:none;align-items:center;gap:12px;margin:18px 18px 8px;display:flex}.day-divider:before,.day-divider:after{content:"";background:var(--line);flex:1;height:1px}.day-divider span{background:var(--bg);border:1px solid var(--line);font-family:var(--font-mono);color:var(--muted);text-transform:uppercase;letter-spacing:.07em;border-radius:999px;padding:4px 12px;font-size:10px;font-weight:600}.new-messages-divider{pointer-events:none;opacity:1;align-items:center;gap:0;margin:4px 0 2px;padding:0 18px;transition:opacity .16s ease-out,transform .18s cubic-bezier(.2,.8,.2,1);display:flex;position:relative;transform:translateY(0)}.new-messages-divider.is-clearing{opacity:0;transform:translateY(-4px)}.new-messages-divider:before{content:"";background:var(--danger,#ed4245);opacity:.9;flex:1;height:1px}.new-messages-divider span{background:var(--danger,#ed4245);color:#fff;letter-spacing:.04em;text-transform:uppercase;border-radius:3px;align-items:center;height:14px;margin-left:8px;padding:0 5px;font-size:9px;font-weight:700;display:inline-flex}.message-group{grid-template-columns:56px minmax(0,1fr);padding:8px 18px;display:grid;position:relative}.avatar{color:#fff;background:linear-gradient(135deg, hsl(var(--hue,220deg) 70% 55%), hsl(calc(var(--hue,220deg) + 40deg) 70% 45%));border-radius:10px;place-items:center;width:38px;height:38px;margin-top:2px;font-size:14px;font-weight:700;display:grid;overflow:hidden;box-shadow:0 6px 20px -10px #0009}.avatar-button{z-index:2;cursor:pointer;border:0;padding:0;transition:transform .1s,box-shadow .12s,filter .12s;position:relative}.avatar-button:hover{filter:brightness(1.05);transform:translateY(-1px);box-shadow:0 10px 24px -12px #000c}.avatar.small{border-radius:10px;width:30px;height:30px;font-size:12px}.avatar.large{border-radius:16px;width:56px;height:56px;margin:0;font-size:18px}.group-body{min-width:0}.group-body>header{align-items:baseline;gap:8px;margin-bottom:2px;display:flex}.message-group .group-body>header{margin:0 -18px 0 -56px;padding:0 18px 2px 56px}.group-body>header strong{color:var(--text-strong);letter-spacing:-.005em;font-size:14.5px;font-weight:700}.author-name{color:var(--text-strong);letter-spacing:0;background:0 0;border:0;border-radius:4px;padding:0;font-size:14.5px;font-weight:700}.author-name:hover{color:var(--accent);text-underline-offset:2px;text-decoration:underline}.author-name--static:hover{color:var(--text-strong);text-decoration:none}.group-body>header time{color:var(--muted);font-family:var(--font-mono);font-variant-numeric:tabular-nums;font-size:10.5px}.group-body>header span{color:var(--muted);font-size:12px}.bot-chip{border:1px solid color-mix(in srgb, var(--accent) 45%, transparent);height:18px;color:var(--accent);font-family:var(--font-mono);text-transform:uppercase;letter-spacing:.05em;border-radius:4px;align-items:center;padding:0 6px;font-size:9.5px;font-weight:700;line-height:1;display:inline-flex}.bot-chip--deleted{border-color:var(--line-strong);color:var(--muted)}.message-row{border-radius:0;margin-left:-56px;margin-right:-18px;padding:1px 18px 1px 56px;transition:background 80ms;position:relative}.message-row:not(:first-child){margin-top:1px}.message-row:hover,.message-group .group-body>header:hover,.message-group .group-body>header:hover+.message-row{background:var(--hover)}.message-group .group-body>header:has(+.message-row:hover){background:var(--hover)}.message-group .group-body>header:hover+.message-row .message-actions{opacity:1;pointer-events:auto}.message-row.selected{background:var(--accent-soft)}.message-row.can-open-thread{cursor:pointer}.row-stamp{font-family:var(--font-mono);color:var(--muted-2);opacity:0;font-variant-numeric:tabular-nums;font-size:9.5px;position:absolute;top:4px;left:8px}.message-row.is-preamble{background:0 0;margin-bottom:6px;padding-top:4px;padding-bottom:4px}.message-row.is-preamble:not(.before-final-message) .message-content{border:1px solid color-mix(in srgb, var(--activity-accent) 20%, transparent);border-radius:var(--radius-lg);background:var(--activity-accent-soft);box-shadow:0 2px 0 color-mix(in srgb, var(--activity-accent) 14%, transparent);padding:10px 14px}.message-row.is-preamble-collapsed .message-content{padding-top:6px;padding-bottom:6px}.message-row.is-preamble.before-final-message{background:0 0;margin-bottom:0;padding-top:2px;padding-bottom:0}.message-row.after-preamble{margin-top:0;padding-top:0;padding-bottom:2px}.message-row.is-preamble.before-final-message:before{display:none}.message-row.is-preamble.before-final-message .message-content{border:1px solid color-mix(in srgb, var(--activity-accent) 20%, transparent);background:var(--activity-accent-soft);border-top-left-radius:var(--radius-lg);border-top-right-radius:var(--radius-lg);border-bottom:0;padding:10px 14px}.message-row.after-preamble .message-content{border:1px solid color-mix(in srgb, var(--delivery-accent) 20%, transparent);border-bottom-left-radius:var(--radius-lg);border-bottom-right-radius:var(--radius-lg);background:var(--delivery-accent-soft);box-shadow:0 2px 0 color-mix(in srgb, var(--delivery-accent) 14%, transparent);border-top:0;padding:10px 14px}.message-row.is-preamble.before-final-message.is-preamble-collapsed .message-content{background:color-mix(in srgb, var(--activity-accent) 10%, var(--panel));border-bottom:1px solid color-mix(in srgb, var(--activity-accent) 30%, transparent);padding-top:7px;padding-bottom:7px}:root[data-user-align=right] .message-group.is-self,:root[data-other-align=right] .message-group:not(.is-self){grid-template-columns:minmax(0,1fr) 56px}:root[data-user-align=right] .message-group.is-self>.avatar,:root[data-other-align=right] .message-group:not(.is-self)>.avatar{grid-area:1/2;justify-self:end}:root[data-user-align=right] .message-group.is-self>.group-body,:root[data-other-align=right] .message-group:not(.is-self)>.group-body{grid-area:1/1;min-width:0}:root[data-user-align=right] .message-group.is-self .group-body>header,:root[data-other-align=right] .message-group:not(.is-self) .group-body>header{justify-content:flex-end;margin:0 -56px 0 -18px;padding:0 56px 2px 18px}:root[data-user-align=right] .message-group.is-self .message-row,:root[data-other-align=right] .message-group:not(.is-self) .message-row{margin-left:-18px;margin-right:-56px;padding-left:18px;padding-right:56px}:root[data-user-align=right] .message-group.is-self .message-content,:root[data-other-align=right] .message-group:not(.is-self) .message-content{text-align:right;margin-left:auto}:root[data-user-align=right] .message-group.is-self .markdown,:root[data-other-align=right] .message-group:not(.is-self) .markdown{text-align:right}:root:not([data-message-layout=outlined])[data-user-align=right] .message-group.is-self .markdown ul,:root:not([data-message-layout=outlined])[data-user-align=right] .message-group.is-self .markdown ol,:root:not([data-message-layout=outlined])[data-other-align=right] .message-group:not(.is-self) .markdown ul,:root:not([data-message-layout=outlined])[data-other-align=right] .message-group:not(.is-self) .markdown ol{padding-left:0;padding-right:0;list-style-position:inside}:root:not([data-message-layout=outlined])[data-user-align=right] .message-group.is-self .markdown li>ul,:root:not([data-message-layout=outlined])[data-user-align=right] .message-group.is-self .markdown li>ol,:root:not([data-message-layout=outlined])[data-other-align=right] .message-group:not(.is-self) .markdown li>ul,:root:not([data-message-layout=outlined])[data-other-align=right] .message-group:not(.is-self) .markdown li>ol{padding-left:0;padding-right:22px}:root:not([data-message-layout=outlined])[data-user-align=right] .message-group.is-self .markdown li>p:first-child,:root:not([data-message-layout=outlined])[data-other-align=right] .message-group:not(.is-self) .markdown li>p:first-child{display:inline}:root:not([data-message-layout=outlined])[data-user-align=right] .message-group.is-self .markdown blockquote,:root:not([data-message-layout=outlined])[data-other-align=right] .message-group:not(.is-self) .markdown blockquote{border-left:0;border-right:3px solid var(--accent);padding-left:0;padding-right:12px}:root[data-user-align=right] .message-group.is-self .attachment-grid,:root[data-other-align=right] .message-group:not(.is-self) .attachment-grid{margin-left:auto}.preamble-contract{gap:7px;min-width:0;display:grid}.preamble-toggle{width:100%;min-height:20px;color:var(--activity-accent);font:inherit;text-align:left;cursor:pointer;background:0 0;border:0;grid-template-columns:auto auto auto minmax(0,1fr);align-items:center;gap:7px;padding:0;display:grid}.preamble-chevron{color:var(--activity-accent);font-size:10px;transition:transform .12s}.preamble-chevron.open{transform:rotate(90deg)}.preamble-state,.preamble-action{line-height:1}.preamble-state{border:1px solid color-mix(in srgb, var(--activity-accent) 30%, transparent);height:17px;color:var(--activity-accent);text-transform:uppercase;letter-spacing:.03em;border-radius:999px;align-items:center;padding:0 7px;font-size:9.5px;font-weight:750;display:inline-flex}.preamble-state.is-live{border-color:color-mix(in srgb, var(--activity-accent) 55%, transparent);animation:1.6s ease-in-out infinite preamble-live-pulse}@keyframes preamble-live-pulse{0%,to{opacity:1}50%{opacity:.45}}@media (prefers-reduced-motion:reduce){.preamble-state.is-live{animation:none}}.preamble-action{min-width:0;color:var(--muted);text-overflow:ellipsis;white-space:nowrap;font-size:11px;font-weight:600;overflow:hidden}.preamble-body{color:var(--muted);overflow-wrap:anywhere;word-break:break-word;min-width:0}.preamble-flow{gap:7px;min-width:0;padding-left:17px;display:grid}.preamble-tool{--tool-accent:var(--activity-accent);background:var(--tool-call-bg);border-radius:7px;min-width:0;overflow:hidden}.preamble-tool-summary{width:100%;min-width:0;font:inherit;text-align:left;cursor:pointer;background:0 0;border:0;align-items:baseline;gap:7px;padding:4px 9px;line-height:1.5;display:flex}.preamble-tool-summary:hover{background:var(--tool-call-bg-hover)}.preamble-tool-full{color:var(--muted);overflow-wrap:anywhere;word-break:break-word;gap:5px;min-width:0;padding:2px 10px 8px 27px;font-size:12px;display:grid}.preamble-tool-full-head{font-family:var(--font-mono);color:color-mix(in srgb, var(--tool-accent) 45%, var(--muted));font-size:11px;font-weight:600}.preamble-tool-full-body{min-width:0}.preamble-tool-full pre{white-space:pre-wrap;overflow-wrap:anywhere}.tool-line-chevron{color:var(--muted-2);flex-shrink:0;font-size:9px;transition:transform .12s}.tool-line-chevron.open{transform:rotate(90deg)}.tool-line-glyph{filter:saturate(.85);flex-shrink:0;font-size:11px}.tool-line-action{color:color-mix(in srgb, var(--tool-accent) 38%, var(--text));flex-shrink:0;font-size:11.5px;font-weight:600}.tool-line-name{text-overflow:ellipsis;white-space:nowrap;max-width:40%;color:color-mix(in srgb, var(--tool-accent) 55%, var(--muted));font-size:11px;font-weight:500;font-family:var(--font-mono);flex-shrink:0;overflow:hidden}.tool-line-detail{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--muted);font-size:11px;font-weight:400;font-family:var(--font-mono);opacity:.85;flex:auto;overflow:hidden}.message-row:hover .row-stamp{opacity:1}.message-content{min-width:0;display:flow-root}.thread-hint{min-height:22px;color:var(--muted-2);cursor:pointer;background:0 0;border:1px solid #0000;border-radius:8px;align-items:center;gap:6px;margin-top:4px;padding:3px 8px;font-size:12px;font-weight:700;line-height:1;display:inline-flex}.thread-hint:not(.has-replies):not(.is-open){display:none}.thread-hint svg{flex:none}.thread-hint time{color:var(--muted);font-variant-numeric:tabular-nums;font-size:10.5px;font-weight:500}.thread-hint.has-replies,.thread-hint.is-open{color:var(--accent)}.thread-hint.is-open{border-color:color-mix(in srgb, var(--accent) 40%, transparent);background:color-mix(in srgb, var(--accent-soft) 70%, transparent)}.thread-hint:hover{border-color:var(--line-strong);background:var(--panel)}.thread-hint:disabled{cursor:default;opacity:.45}.message-actions{opacity:0;pointer-events:none;background:var(--panel);border:1px solid var(--line-strong);box-shadow:var(--shadow);border-radius:8px;align-items:flex-start;gap:4px;padding:2px;transition:opacity .1s;display:flex;position:absolute;top:-24px;right:8px}.message-row:hover .message-actions,.message-row.selected .message-actions,.message-row.menu-open .message-actions{opacity:1;pointer-events:auto}.message-row:has(:focus-visible) .message-actions{opacity:1;pointer-events:auto}.message-row.actions-flip .message-actions{top:auto;bottom:-24px}.message-row.menu-open{z-index:6}.message-row:hover,.message-row.selected{z-index:5}.message-row:has(:focus-visible){z-index:5}.messages:has(.message-row.menu-open) .message-row:hover:not(.menu-open) .message-actions{opacity:0;pointer-events:none}.messages:has(.message-row.menu-open) .message-group .group-body>header:hover+.message-row:not(.menu-open) .message-actions{opacity:0;pointer-events:none}@media (hover:none),(pointer:coarse){.message-actions{width:1px;height:1px;box-shadow:none;opacity:1;pointer-events:auto;background:0 0;border:0;padding:0;top:1px;bottom:auto;overflow:visible;transform:none}.message-actions>:not(.message-more){display:none}.message-row.actions-flip .message-actions{top:1px;bottom:auto}.message-actions .message-more{position:static}.message-actions .message-actions-trigger{clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.message-actions .message-actions-trigger:focus-visible{clip:auto;clip-path:none;border:1px solid var(--line-strong);background:var(--panel);width:36px;height:36px;box-shadow:var(--shadow);margin:0;top:0;right:0;overflow:visible}.message-row:has(.message-actions-trigger:focus-visible) .message-content{padding-right:44px}}.message-actions button{width:28px;height:28px;color:var(--muted);background:0 0;border:0;border-radius:6px;place-items:center;display:grid}.message-actions button:hover{background:var(--hover-strong);color:var(--text-strong)}.message-actions button:disabled{opacity:.45}.message-copy-status{background:var(--accent-soft);height:24px;color:var(--accent);white-space:nowrap;border-radius:5px;align-self:center;align-items:center;padding:0 6px;font-size:11px;font-weight:700;display:inline-flex}.message-copy-status.is-error{background:color-mix(in srgb, var(--danger) 10%, transparent);color:var(--danger)}.message-sheet-scrim{z-index:60;background:#05080f66;flex-direction:column;justify-content:flex-end;display:flex;position:fixed;inset:0}.message-sheet-backdrop{background:0 0;border:0;padding:0;position:absolute;inset:0}.message-action-sheet{z-index:1;background:var(--panel);border:1px solid var(--line);max-height:calc(100dvh - 16px - env(safe-area-inset-top,0px));padding:8px 12px calc(10px + env(safe-area-inset-bottom,0px));overscroll-behavior:contain;border-bottom:0;border-radius:16px 16px 0 0;animation:.16s ease-out sheet-rise;position:relative;overflow-y:auto}@keyframes sheet-rise{0%{opacity:0;transform:translateY(24px)}to{opacity:1;transform:translateY(0)}}@media (prefers-reduced-motion:reduce){.message-action-sheet{animation:none}}.message-action-sheet .sheet-grabber{background:var(--line-strong);border-radius:999px;width:36px;height:4px;margin:0 auto 8px}.message-action-sheet .sheet-emoji-row{border-bottom:1px solid var(--line);justify-content:space-around;gap:4px;padding-bottom:8px;display:flex}.message-action-sheet .sheet-emoji-row button{background:0 0;border:0;border-radius:10px;place-items:center;width:44px;height:44px;font-size:22px;line-height:1;display:grid}.message-action-sheet .sheet-emoji-row button:active{background:var(--hover-strong)}.message-action-sheet .sheet-actions{flex-direction:column;padding-top:4px;display:flex}.message-action-sheet .sheet-actions button{width:100%;color:var(--text-strong);text-align:left;background:0 0;border:0;border-radius:8px;align-items:center;gap:12px;padding:12px 8px;font-size:15px;display:flex}.message-action-sheet .sheet-actions button:active{background:var(--hover-strong)}.message-action-sheet .sheet-actions button:disabled{opacity:.45}.message-action-sheet .sheet-actions svg{color:var(--muted);flex:none}.message-action-sheet .sheet-danger,.message-action-sheet .sheet-danger svg{color:var(--danger)}.message-action-sheet .sheet-copy-status{background:var(--accent-soft);height:22px;color:var(--accent);white-space:nowrap;border-radius:5px;align-items:center;margin-left:auto;padding:0 6px;font-size:11px;font-weight:700;display:inline-flex}.message-action-sheet .sheet-copy-status.is-error{background:color-mix(in srgb, var(--danger) 10%, transparent);color:var(--danger)}.message-action-sheet .sheet-action-error{color:var(--danger);margin:-4px 12px 4px;font-size:12px;line-height:1.35}.message-actions .message-action-react{font-size:15px;line-height:1}.message-actions .action-sep{background:var(--line);flex:none;align-self:center;width:1px;height:18px;margin:0 3px}.message-actions .picker-wrapper,.message-actions .message-more{position:relative}.message-menu{z-index:30;background:var(--panel);border:1px solid var(--line-strong);min-width:190px;box-shadow:var(--shadow);border-radius:10px;padding:5px;font-size:13px;position:absolute;top:calc(100% + 4px);right:0}.message-menu.above{top:auto;bottom:calc(100% + 4px)}.message-menu button{width:100%;height:auto;color:var(--text);font:inherit;text-align:left;cursor:pointer;background:0 0;border:0;border-radius:7px;align-items:center;gap:9px;padding:7px 10px;font-size:13px;display:flex}.message-menu button:hover{background:var(--hover-strong);color:var(--text-strong)}.message-menu button svg{color:var(--muted);flex:none}.message-menu .menu-sep{border-top:1px solid var(--line);margin:5px 4px}.message-menu .menu-danger,.message-menu .menu-danger svg{color:var(--danger)}.message-menu .menu-danger:hover{background:color-mix(in srgb, var(--danger) 10%, transparent);color:var(--danger)}.message-edit{gap:7px;width:min(100%,760px);padding:5px 0 3px;display:grid}.message-edit__textarea{border:1px solid var(--line-strong);background:color-mix(in srgb, var(--panel) 94%, var(--text) 6%);width:100%;min-height:72px;max-height:240px;color:var(--text);font:inherit;resize:vertical;box-sizing:border-box;box-shadow:inset 0 1px 1px color-mix(in srgb, var(--text) 5%, transparent);border-radius:7px;padding:9px 11px;font-size:14.5px;line-height:1.5;transition:border-color .12s,box-shadow .12s,background .12s}.message-edit__textarea:hover:not(:disabled){border-color:color-mix(in srgb, var(--line-strong) 62%, var(--text) 38%)}.message-edit__textarea:focus{border-color:var(--accent);background:var(--panel);box-shadow:inset 0 1px 1px color-mix(in srgb, var(--text) 4%, transparent), 0 0 0 3px color-mix(in srgb, var(--accent) 18%, transparent);outline:none}.message-edit__textarea:disabled{cursor:progress;opacity:.78}.message-edit__footer{flex-wrap:wrap;align-items:center;gap:6px;min-height:30px;display:flex}.message-edit__footer .message-edit__save{background:var(--accent);min-width:68px;min-height:30px;color:var(--accent-contrast);cursor:pointer;border:0;border-radius:6px;justify-content:center;align-items:center;gap:4px;padding:5px 12px;font-size:13px;font-weight:500;display:inline-flex}.message-edit__footer .message-edit__save:hover{filter:brightness(1.1)}.message-edit__footer .message-edit__save:focus-visible,.message-edit__footer .message-edit__cancel:focus-visible{outline:2px solid var(--accent);outline-offset:2px}.message-edit__footer .message-edit__save:disabled{opacity:.5;cursor:progress}.message-edit__footer .message-edit__cancel{min-height:30px;color:var(--muted);cursor:pointer;background:0 0;border:1px solid #0000;border-radius:6px;justify-content:center;align-items:center;padding:5px 10px;font-size:13px;display:inline-flex}.message-edit__footer .message-edit__cancel:hover{border-color:var(--line);background:var(--hover-strong);color:var(--text-strong)}.message-edit__error{border-left:2px solid var(--danger);background:color-mix(in srgb, var(--danger) 8%, transparent);width:fit-content;max-width:100%;color:var(--danger);border-radius:3px;margin:0;padding:5px 8px;font-size:12.5px;line-height:1.35}.message-edit__indicator{color:var(--muted);align-items:center;gap:3px;margin-left:8px;font-size:11px;display:inline-flex}.message-row.editing .message-actions{display:none}@media (width<=520px){.message-edit__footer .message-edit__save,.message-edit__footer .message-edit__cancel{flex:1 1 0}}.message-deleted{min-height:22px;color:var(--muted);align-items:center;font-size:13px;font-style:italic;display:inline-flex}.markdown{color:var(--text);overflow-wrap:anywhere;word-break:break-word;font-size:14.5px;line-height:1.5}.markdown>:first-child{margin-top:0}.markdown>:last-child{margin-bottom:0}.markdown p{margin:0}.markdown p+p,.markdown ul,.markdown ol,.markdown blockquote,.markdown pre{margin-top:6px}.markdown a{color:var(--accent);text-decoration:none}.markdown a:hover{text-decoration:underline}.message-mention{border:1px solid color-mix(in srgb, currentColor 18%, transparent);background:color-mix(in srgb, currentColor 8%, transparent);color:inherit;border-radius:4px;margin:0 1px;padding:0 3px;font-weight:600}.message-mention.is-current-user{border-color:color-mix(in srgb, var(--accent) 42%, transparent);background:color-mix(in srgb, var(--accent) 20%, transparent);color:var(--accent);font-weight:700}.markdown code{background:var(--panel-2);border:1px solid var(--line);border-radius:4px;padding:1px 5px;font-family:Geist Mono Variable,JetBrains Mono,ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:.9em}.markdown pre{background:var(--panel-2);border:1px solid var(--line);border-radius:var(--radius);padding:12px 14px;overflow-x:auto}.markdown pre code{background:0 0;border:0;padding:0}.markdown blockquote{border-left:3px solid var(--accent);color:var(--muted);margin:0;padding:4px 0 4px 12px}.markdown ul,.markdown ol{padding-left:22px}.markdown img{border-radius:var(--radius);border:1px solid var(--line);object-fit:contain;background:var(--panel);cursor:zoom-in;max-width:100%;max-height:360px;margin-top:6px}.markdown-table-scroll{-webkit-overflow-scrolling:touch;overscroll-behavior-inline:contain;max-width:100%;margin-top:6px;overflow-x:auto}.markdown-table-scroll[data-overflowing]:focus-visible{outline:2px solid var(--accent);outline-offset:2px}.markdown-table-scroll:first-child{margin-top:0}.markdown-table-scroll>table{border-collapse:collapse;border-spacing:0;width:max-content;min-width:100%;font-size:.9em}.markdown thead{background:var(--muted-2)}.markdown th,.markdown td{vertical-align:top;border:1px solid var(--line);padding:8px 12px}.markdown thead th{color:var(--text-strong);font-weight:700}.markdown tbody tr:nth-child(2n){background:color-mix(in srgb, var(--muted-2) 18%, transparent)}.markdown tbody tr:hover{background:color-mix(in srgb, var(--muted-2) 26%, transparent)}.gif-player{vertical-align:top;max-width:100%;display:inline-block;position:relative}.gif-player img{display:block}.gif-badge,.gif-replay{z-index:1;color:#fff;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);border:0;position:absolute}.gif-badge{letter-spacing:.04em;pointer-events:none;background:#0000008a;border-radius:999px;padding:4px 7px;font-size:10px;font-weight:800;bottom:9px;left:9px}.gif-replay{opacity:0;pointer-events:none;background:#0a0c12b8;border-radius:999px;place-items:center;width:30px;height:30px;font-size:16px;line-height:1;transition:opacity .13s,transform .13s,background .12s;display:grid;bottom:9px;right:9px;transform:scale(.88)}.gif-replay:hover{background:var(--accent)}.gif-player.paused .gif-replay{opacity:1;pointer-events:auto;transform:scale(1)}.gif-player.playing .gif-badge{animation:.9s ease-in-out infinite gif-breathe}@keyframes gif-breathe{0%,to{opacity:.85}50%{opacity:.45}}.attachment-grid{grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:8px;max-width:560px;margin-top:8px;display:grid}.attachment-grid.compact{grid-template-columns:minmax(0,1fr);max-width:420px}.media-tile{border:1px solid var(--line);border-radius:var(--radius-lg);isolation:isolate;text-align:left;width:100%;color:inherit;cursor:pointer;background:#0a0c12;margin:0;padding:0;text-decoration:none;transition:border-color .14s,transform .14s,box-shadow .14s;display:block;position:relative;overflow:hidden}.media-tile:hover{border-color:var(--line-strong);box-shadow:0 18px 40px -28px #000000e6}.media-tile:focus-visible{border-color:var(--line-strong);box-shadow:0 0 0 2px color-mix(in srgb, var(--accent) 35%, transparent);outline:none}.media-tile--image{cursor:zoom-in}.media-tile__open{width:100%;color:inherit;cursor:zoom-in;background:0 0;border:0;margin:0;padding:0;display:block}.media-tile__open:focus{outline:0}.media-tile__open:focus-visible+.media-tile__caption .media-tile__name{text-underline-offset:3px;text-decoration:underline;text-decoration-thickness:1px}.media-tile--video{cursor:default}.media-tile img,.media-tile video{object-fit:contain;background:#05070d;width:100%;max-height:360px;display:block}.media-tile--image img{max-height:320px}.media-tile__caption{z-index:3;opacity:0;pointer-events:none;background:linear-gradient(#0000 0%,#00000080 60%,#000000c7 100%);align-items:center;gap:8px;padding:22px 10px 8px;transition:opacity .14s;display:flex;position:absolute;inset:auto 0 0}.media-tile__caption>*{pointer-events:auto}.media-tile:hover .media-tile__caption,.media-tile:focus-within .media-tile__caption{opacity:1}.media-tile--video.is-started .media-tile__caption{display:none}.media-tile__name{color:#fff;white-space:nowrap;text-overflow:ellipsis;text-shadow:0 1px 2px #0009;flex:1;min-width:0;font-size:12px;font-weight:500;overflow:hidden}.media-tile__chip{z-index:4;color:#fff;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);background:#00000080;border:1px solid #ffffff2e;border-radius:8px;flex:none;place-items:center;width:28px;height:28px;text-decoration:none;transition:background .12s,border-color .12s,transform .12s;display:inline-grid;position:relative}.media-tile__chip:hover{background:#000000b3;border-color:#ffffff52;transform:translateY(-1px)}.media-tile__play{cursor:pointer;z-index:1;background:0 0;border:0;place-items:center;width:100%;height:auto;margin:0;padding:0;display:grid;position:absolute;inset:0 0 48px}.media-tile__play:before{content:"";opacity:.7;pointer-events:none;background:radial-gradient(#0000002e 0%,#0000000d 45%,#0000 70%);transition:opacity .16s;position:absolute;inset:0}.media-tile__play:hover:before{opacity:.9}.media-tile__play-icon{color:#fff;-webkit-backdrop-filter:blur(10px);background:#0000008c;border-radius:999px;place-items:center;width:46px;height:46px;padding-left:3px;transition:transform .2s cubic-bezier(.2,.8,.2,1),background .18s,box-shadow .2s;display:grid;position:relative;box-shadow:0 6px 20px -8px #0000008c}.media-tile__play-icon svg{filter:drop-shadow(0 1px 2px #0006)}.media-tile__play:hover .media-tile__play-icon{background:#000000b3;transform:scale(1.06);box-shadow:0 10px 28px -10px #000000a6}.media-tile__play:active .media-tile__play-icon{transition-duration:80ms;transform:scale(.97)}.media-tile__play:focus-visible{outline:none}.media-tile__play:focus-visible .media-tile__play-icon{box-shadow:0 0 0 2px #fff9,0 10px 28px -10px #000000a6}.media-tile__duration{z-index:2;color:#fff;font-variant-numeric:tabular-nums;letter-spacing:.02em;pointer-events:none;background:#000000b8;border-radius:4px;padding:2px 6px;font-size:11px;font-weight:600;position:absolute;bottom:8px;left:8px}.file-attachment{border:1px solid var(--line);border-radius:var(--radius);background:var(--panel);align-items:center;gap:10px;max-width:360px;padding:10px;display:flex}.file-attachment:hover{border-color:var(--line-strong);background:var(--panel-2)}.file-icon{background:var(--accent-soft);width:34px;height:34px;color:var(--accent);border-radius:8px;place-items:center;font-weight:800;display:grid}.file-attachment strong,.file-attachment small{display:block}.file-attachment strong{color:var(--text-strong);font-size:13px}.file-attachment small{color:var(--muted);font-size:11px}.audio-attachment,.document-attachment{border:1px solid var(--line);border-radius:var(--radius);background:var(--panel);width:min(100%,420px);overflow:hidden}.audio-attachment{gap:10px;padding:10px;display:grid}.audio-attachment__meta{align-items:center;gap:10px;min-width:0;display:flex}.audio-attachment audio{width:100%;height:36px}.document-attachment{grid-template-columns:64px minmax(0,1fr) auto;align-items:center;gap:12px;padding:10px;display:grid}.document-attachment__thumbnail{border:1px solid var(--line);background:linear-gradient(135deg, transparent 0 76%, var(--panel-3) 76% 100%), linear-gradient(180deg, #fff 0%, #f0f2f7 100%);width:64px;height:82px;color:var(--accent);letter-spacing:0;cursor:pointer;border-radius:6px;place-items:center;font-size:13px;font-weight:800;text-decoration:none;display:inline-grid;position:relative;overflow:hidden;box-shadow:0 8px 18px -16px #0009}.document-attachment__thumbnail:before,.document-attachment__thumbnail:after{content:"";background:color-mix(in srgb, var(--muted) 36%, transparent);border-radius:999px;height:2px;position:absolute;left:14px;right:14px}.document-attachment__thumbnail:before{top:48px}.document-attachment__thumbnail:after{top:56px}.document-attachment__meta{gap:5px;min-width:0;display:grid}.document-attachment__title{width:100%;min-width:0;color:var(--text-strong);white-space:nowrap;text-overflow:ellipsis;text-align:left;cursor:pointer;background:0 0;border:0;padding:0;font-size:13px;font-weight:700;text-decoration:none;overflow:hidden}.document-attachment__title:hover{text-underline-offset:3px;text-decoration:underline}.document-attachment__meta small{color:var(--muted);white-space:nowrap;font-size:11px}.document-attachment__download{width:30px;height:30px;color:var(--muted);border-radius:8px;place-items:center;text-decoration:none;transition:background .12s,color .12s;display:inline-grid}.document-attachment__download:hover{background:var(--panel-2);color:var(--text-strong)}@media (width<=520px){.message-group{grid-template-columns:44px minmax(0,1fr);padding:7px 12px}:root[data-user-align=right] .message-group.is-self,:root[data-other-align=right] .message-group:not(.is-self){grid-template-columns:minmax(0,1fr) 44px}.message-row{margin-left:-44px;margin-right:-12px;padding-left:44px;padding-right:12px}:root[data-user-align=right] .message-group.is-self .message-row,:root[data-other-align=right] .message-group:not(.is-self) .message-row{margin-left:-12px;margin-right:-44px;padding-left:12px;padding-right:44px}.message-group .group-body>header{margin-left:-44px;margin-right:-12px;padding-left:44px;padding-right:12px}:root[data-user-align=right] .message-group.is-self .group-body>header,:root[data-other-align=right] .message-group:not(.is-self) .group-body>header{margin-left:-12px;margin-right:-44px;padding-left:12px;padding-right:44px}.row-stamp{display:none}.attachment-grid,.attachment-grid.compact{grid-template-columns:minmax(0,1fr);max-width:100%}}:root[data-message-layout=outlined] .message-group .group-body{width:100%}:root[data-message-layout=outlined] .message-group .message-row{margin-left:0;margin-right:0;padding:0}:root[data-message-layout=outlined] .message-group .group-body>header{margin-left:0;margin-right:0;padding-left:0;padding-right:0}:root[data-message-layout=outlined][data-user-align=right] .message-group.is-self .message-content,:root[data-message-layout=outlined][data-other-align=right] .message-group:not(.is-self) .message-content,:root[data-message-layout=outlined][data-user-align=right] .message-group.is-self .markdown,:root[data-message-layout=outlined][data-other-align=right] .message-group:not(.is-self) .markdown{text-align:start}:root[data-message-layout=outlined][data-user-align=right] .message-group.is-self .thread-hint,:root[data-message-layout=outlined][data-other-align=right] .message-group:not(.is-self) .thread-hint{width:fit-content;margin-left:auto;display:flex}:root[data-message-layout=outlined] .message-group .row-stamp{left:-48px}:root[data-message-layout=outlined][data-user-align=right] .message-group.is-self .row-stamp,:root[data-message-layout=outlined][data-other-align=right] .message-group:not(.is-self) .row-stamp{left:auto;right:-48px}:root[data-message-layout=outlined] .message-group .message-row:not(:first-child){margin-top:4px}:root[data-message-layout=outlined] .message-group .message-content{border-radius:var(--radius-lg);width:fit-content;max-width:min(96%,1100px);margin-top:2px;padding:10px 14px;position:relative}:root[data-message-layout=outlined] .message-group .message-row:not(.is-preamble):not(.after-preamble) .message-content{border:1px solid var(--line-strong)}:root[data-message-layout=outlined] .message-group.is-agent .message-content{width:96%;max-width:1100px}:root[data-message-layout=outlined] .message-group .message-row.before-final-message+.message-row.after-preamble{margin-top:-1px}:root[data-message-layout=outlined] .message-group.is-agent .message-row.before-final-message .message-content{border-bottom-right-radius:0;border-bottom-left-radius:0}:root[data-message-layout=outlined] .message-group.is-agent .message-row.after-preamble .message-content{border-top-left-radius:0;border-top-right-radius:0}:root[data-density=compact] .message-group{grid-template-columns:42px minmax(0,1fr);padding:2px 18px}:root[data-density=compact][data-user-align=right] .message-group.is-self,:root[data-density=compact][data-other-align=right] .message-group:not(.is-self){grid-template-columns:minmax(0,1fr) 42px}:root[data-density=compact] .message-group>.avatar{border-radius:7px;width:26px;height:26px;font-size:11px}:root[data-density=compact] .group-body>header{gap:6px;margin-bottom:0}:root[data-density=compact] .message-group .group-body>header{margin-left:-42px;padding-left:42px}:root[data-density=compact][data-user-align=right] .message-group.is-self .group-body>header,:root[data-density=compact][data-other-align=right] .message-group:not(.is-self) .group-body>header{margin-left:-18px;margin-right:-42px;padding-left:18px;padding-right:42px}:root[data-density=compact] .group-body>header strong,:root[data-density=compact] .author-name{font-size:13px}:root[data-density=compact] .group-body>header time{font-size:10px}:root[data-density=compact] .message-row{margin-left:-42px;padding-left:42px}:root[data-density=compact][data-user-align=right] .message-group.is-self .message-row,:root[data-density=compact][data-other-align=right] .message-group:not(.is-self) .message-row{margin-left:-18px;margin-right:-42px;padding-left:18px;padding-right:42px}:root[data-density=compact] .markdown{font-size:13.5px;line-height:1.42}:root[data-density=compact] .reactions-bar{margin-top:2px}:root[data-density=compact][data-message-layout=outlined] .message-group .message-row{margin-left:0;padding-left:0}:root[data-density=compact][data-message-layout=outlined] .message-group .row-stamp{left:-34px}:root[data-density=compact][data-message-layout=outlined][data-user-align=right] .message-group.is-self .row-stamp,:root[data-density=compact][data-message-layout=outlined][data-other-align=right] .message-group:not(.is-self) .row-stamp{left:auto;right:-34px}@media (width<=520px){:root[data-density=compact] .message-group{padding-left:12px;padding-right:12px}}:root[data-message-layout=outlined][data-user-align=right] .message-group.is-self .message-row,:root[data-message-layout=outlined][data-other-align=right] .message-group:not(.is-self) .message-row,:root[data-message-layout=outlined][data-user-align=right] .message-group.is-self .group-body>header,:root[data-message-layout=outlined][data-other-align=right] .message-group:not(.is-self) .group-body>header{margin-left:0;margin-right:0;padding-left:0;padding-right:0}.question-card{--question-rail:var(--accent);border:1px solid color-mix(in srgb, var(--question-rail) 30%, var(--line));border-radius:var(--radius-lg);background:radial-gradient(120% 120% at 0% 0%, color-mix(in srgb, var(--question-rail) 10%, transparent), transparent 52%), var(--panel);max-width:min(660px,100%);box-shadow:0 18px 44px -30px color-mix(in srgb, var(--question-rail) 70%, transparent);color:var(--text);gap:10px;margin-top:2px;padding:13px 16px 13px 20px;display:grid;position:relative;overflow:hidden}.question-card:before{content:"";background:var(--question-rail);width:4px;position:absolute;inset:0 auto 0 0}.question-card--waiting{--question-rail:var(--delivery-accent)}.question-card--answered{--question-rail:var(--success)}.question-card--muted{--question-rail:var(--muted-2);box-shadow:none}.question-card--failed{--question-rail:var(--danger)}:root[data-user-align=right] .message-group.is-self .question-card,:root[data-other-align=right] .message-group:not(.is-self) .question-card{margin-left:auto}.question-card__head{flex-wrap:wrap;align-items:center;gap:10px;display:flex}.question-eyebrow{color:var(--question-rail);font-family:var(--font-mono);letter-spacing:.1em;text-transform:uppercase;align-items:center;gap:7px;font-size:10.5px;font-weight:700;display:inline-flex}.question-eyebrow__dot{background:var(--question-rail);width:7px;height:7px;box-shadow:0 0 0 3px color-mix(in srgb, var(--question-rail) 25%, transparent);border-radius:50%}.question-card--waiting .question-eyebrow__dot{animation:1.6s ease-in-out infinite preamble-live-pulse}@media (prefers-reduced-motion:reduce){.question-card--waiting .question-eyebrow__dot{animation:none}}.question-card__meta,.question-card__hint,.question-card__note,.question-card__detail,.question-item__hint{color:var(--muted);font-size:12.5px}.question-card__detail{margin:0}.question-card__note{margin-left:auto}.question-timer{border:1px solid var(--line-strong);background:var(--panel-2);color:var(--text);font-family:var(--font-mono);border-radius:999px;align-items:center;gap:6px;margin-left:auto;padding:2px 9px;font-size:11.5px;display:inline-flex}.question-timer--urgent{border-color:color-mix(in srgb, var(--warn) 50%, transparent);color:var(--warn)}.question-card__title{color:var(--text-strong);margin:0;font-size:15px;font-weight:650}.question-item{gap:8px;min-width:0;display:grid}.question-item+.question-item{border-top:1px dashed var(--line-strong);padding-top:12px}.question-item__label{align-items:center;gap:8px;display:flex}.question-item__number{border:1px solid var(--line-strong);width:18px;height:18px;color:var(--muted);font-family:var(--font-mono);border-radius:5px;place-items:center;font-size:10.5px;font-weight:700;display:grid}.question-item.is-answered .question-item__number{background:var(--success);color:var(--accent-contrast);border-color:#0000}.question-chip{border-radius:var(--radius-sm);background:var(--panel-3);color:var(--text);font-family:var(--font-mono);letter-spacing:.08em;text-transform:uppercase;padding:2px 6px;font-size:10px;font-weight:700}.question-item__prompt{color:var(--text-strong);font-size:14.5px}.question-options{grid-template-columns:repeat(auto-fill,minmax(170px,1fr));gap:8px;display:grid}.question-options--stack{grid-template-columns:minmax(0,1fr)}.question-key{border:1px solid var(--line-strong);background:linear-gradient(180deg, color-mix(in srgb, var(--panel-3) 65%, var(--panel-2)), var(--panel-2));min-height:44px;box-shadow:var(--key-edge);color:var(--text-strong);font:inherit;text-align:left;cursor:pointer;border-radius:9px;grid-template-columns:auto minmax(0,1fr) auto;align-items:center;column-gap:10px;padding:7px 11px 7px 8px;font-weight:650;transition:border-color .12s,background .12s,transform 80ms;display:grid;position:relative}.question-key:hover:not(:disabled){border-color:color-mix(in srgb, var(--accent) 50%, var(--line-strong))}.question-key:active:not(:disabled){box-shadow:var(--key-edge-pressed);transform:translateY(1px)}.question-key:focus-visible{outline:2px solid var(--accent);outline-offset:2px}.question-key:disabled{cursor:default}.question-key:disabled:not(.is-selected){opacity:.55}.question-key kbd,.question-other kbd{border:1px solid var(--line-strong);background:var(--bg);width:24px;height:24px;box-shadow:0 1px 0 var(--line-strong);color:var(--muted);font-family:var(--font-mono);border-radius:6px;place-items:center;font-size:11.5px;font-weight:700;display:grid}.question-key__label{overflow-wrap:anywhere;grid-column:2;min-width:0}.question-key small{color:var(--muted);grid-column:2;font-size:12px;font-weight:500;line-height:1.25}.question-key__mark{border:1.5px solid var(--line-strong);border-radius:50%;grid-area:1/3/span 2;width:18px;height:18px}.question-key__mark--box{border-radius:5px}.question-key.is-selected{border-color:var(--accent);background:color-mix(in srgb, var(--accent) 15%, var(--panel-2));box-shadow:0 0 0 1px color-mix(in srgb, var(--accent) 45%, transparent), 0 1px 0 color-mix(in srgb, var(--accent) 60%, transparent)}.question-key.is-selected kbd{background:var(--accent);box-shadow:none;color:var(--accent-contrast);border-color:#0000}.question-key.is-selected .question-key__mark{border-color:var(--accent);background:var(--accent);box-shadow:inset 0 0 0 3px var(--panel)}.question-key.is-selected .question-key__mark--box{box-shadow:none}.question-key.is-pending .question-key__mark{border-color:color-mix(in srgb, var(--accent) 30%, transparent);border-top-color:var(--accent);box-shadow:none;background:0 0;animation:.8s linear infinite question-spin}@keyframes question-spin{to{transform:rotate(360deg)}}@media (prefers-reduced-motion:reduce){.question-key.is-pending .question-key__mark{animation:none}}.question-key--other{min-height:38px;box-shadow:none;color:var(--muted);background:0 0;border-style:dashed;grid-column:1/-1;font-weight:600}.question-other{border:1px solid var(--accent);background:var(--bg);box-shadow:0 0 0 3px var(--accent-soft);border-radius:9px;grid-column:1/-1;align-items:center;gap:8px;padding:6px 8px;display:flex}.question-other kbd{background:var(--accent);box-shadow:none;color:var(--accent-contrast);border-color:#0000}.question-other input,.question-free{min-width:0;color:var(--text-strong);font:inherit;background:0 0;border:0;flex:1;font-size:14px}.question-other input:focus{outline:none}.question-free{border:1px solid var(--line-strong);background:var(--bg);border-radius:9px;padding:9px 12px}.question-free:focus{border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-soft);outline:none}.question-link{color:var(--accent);justify-self:start;font-size:13px;font-weight:650}.question-lock,.question-error,.question-reopened{border:1px solid var(--line);border-radius:var(--radius);background:var(--panel-2);color:var(--muted);margin:0;padding:7px 10px;font-size:12.5px}.question-reopened{border-color:color-mix(in srgb, var(--warn) 45%, transparent);background:color-mix(in srgb, var(--warn) 9%, var(--panel-2));color:var(--text-strong)}.question-error{border-color:color-mix(in srgb, var(--danger) 40%, transparent);color:var(--danger)}.question-card__foot{border-top:1px solid var(--line);flex-wrap:wrap;align-items:center;gap:10px;padding-top:12px;display:flex}.question-send,.question-skip{border:1px solid var(--line-strong);border-radius:var(--radius);min-height:36px;font:inherit;cursor:pointer;padding:0 14px;font-weight:700}.question-send{border-color:color-mix(in srgb, var(--accent) 70%, var(--text-strong));background:var(--accent);box-shadow:var(--key-edge);color:var(--accent-contrast)}.question-send:disabled,.question-skip:disabled{cursor:default;opacity:.5}.question-skip{color:var(--muted);background:0 0;border-color:#0000}.question-skip:hover:not(:disabled){color:var(--text-strong)}.question-progress{gap:4px;display:inline-flex}.question-progress i{background:var(--line-strong);border-radius:2px;width:18px;height:4px}.question-progress i.is-on{background:var(--success)}.question-summary{grid-template-columns:max-content minmax(0,1fr);align-items:baseline;gap:7px 14px;margin:0;display:grid}.question-summary dt{color:var(--muted);font-family:var(--font-mono);letter-spacing:.08em;text-transform:uppercase;font-size:10px}.question-summary dd{flex-wrap:wrap;gap:6px;margin:0;display:flex}.question-answer{border:1px solid color-mix(in srgb, var(--question-rail) 38%, var(--line));background:color-mix(in srgb, var(--question-rail) 11%, transparent);color:var(--text-strong);overflow-wrap:anywhere;border-radius:999px;padding:2px 10px;font-size:13px}.question-answer--typed{font-style:italic}@media (width<=560px){.question-options{grid-template-columns:minmax(0,1fr)}.question-card__note{margin-left:0}}.composer{--composer-card-top:8px;--composer-overlay-gap:8px;--composer-overlay-inset-x:18px;background:var(--bg);gap:0;padding:8px 18px 6px;display:grid;position:relative}.composer-card{background:var(--panel);border:1px solid var(--line-strong);border-radius:var(--radius-lg);box-shadow:var(--key-edge);flex-direction:column;transition:border-color .12s,box-shadow .12s;display:flex;overflow:hidden}.composer:focus-within .composer-card{border-color:color-mix(in srgb, var(--accent) 55%, var(--line-strong));box-shadow:var(--key-edge), 0 0 0 3px color-mix(in srgb, var(--accent) 14%, transparent)}.composer-suggestions{left:var(--composer-overlay-inset-x);bottom:calc(100% - var(--composer-card-top) + var(--composer-overlay-gap));z-index:40;width:min(560px, calc(100% - (var(--composer-overlay-inset-x) * 2)));border:1px solid var(--line-strong);background:color-mix(in srgb, var(--panel) 97%, transparent);max-height:min(320px,45vh);box-shadow:var(--shadow);border-radius:12px;margin:0;position:absolute;overflow:hidden auto}.composer-suggestions button{border:0;border-bottom:1px solid var(--line);width:100%;min-height:48px;color:var(--text);text-align:left;background:0 0;border-radius:0;grid-template-columns:30px minmax(0,1fr) auto;align-items:center;gap:10px;padding:8px 10px;display:grid}.composer-suggestions button:last-child{border-bottom:0}.composer-suggestions button:hover,.composer-suggestions button.active{background:var(--hover-strong)}.suggestion-mark{background:var(--accent-soft);width:30px;height:30px;color:var(--accent);border-radius:8px;place-items:center;font-size:13px;font-weight:800;display:grid}.suggestion-copy{gap:2px;min-width:0;display:grid}.suggestion-copy strong,.suggestion-copy span{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.suggestion-copy strong{color:var(--text-strong);font-size:13px}.suggestion-copy span{color:var(--muted);font-size:12px}.suggestion-kind{color:var(--muted-2);text-transform:uppercase;font-size:11px;font-weight:700}.suggestion-hint{color:var(--muted);font-size:12px;font-style:normal;font-weight:500}.composer-notice{margin:0 var(--composer-overlay-inset-x,0) 6px;border:1px solid var(--line-strong);background:color-mix(in srgb, var(--panel) 97%, transparent);border-radius:10px;align-items:baseline;gap:8px;padding:7px 10px;font-size:13px;display:flex}.composer-notice__label{color:var(--muted-2);text-transform:uppercase;flex:none;font-size:11px;font-weight:700}.composer-notice--error .composer-notice__label{color:var(--danger)}.composer-notice__text{min-width:0;color:var(--text);overflow-wrap:anywhere;flex:1}.composer-notice__dismiss{width:22px;height:22px;color:var(--muted);cursor:pointer;background:0 0;border:0;border-radius:6px;flex:none;align-self:center;place-items:center;font-size:15px;line-height:1;display:grid}.composer-notice__dismiss:hover{background:var(--hover-strong);color:var(--text-strong)}.composer-toolbar{border:0;border-top:1px solid var(--line);background:color-mix(in srgb, var(--panel-2) 35%, transparent);width:100%;min-width:0;box-shadow:none;scrollbar-width:none;-webkit-overflow-scrolling:touch;border-radius:0;align-items:center;gap:2px;margin:0;padding:4px 6px;display:inline-flex;overflow:auto hidden}.composer-toolbar::-webkit-scrollbar{display:none}.composer-toolbar button{min-width:28px;height:26px;color:var(--text);opacity:.78;background:0 0;border:0;border-radius:6px;flex:none;place-items:center;font-size:11.5px;font-weight:700;transition:background .1s,color .1s,opacity .1s,transform 80ms;display:grid}.composer-toolbar button:hover{background:var(--hover-strong);color:var(--text-strong);opacity:1}.composer-toolbar button.active{background:var(--accent-soft);color:var(--accent);opacity:1}.composer-toolbar button:active{transform:translateY(1px)}.gif-picker{border:1px solid var(--line-strong);background:color-mix(in srgb, var(--panel) 96%, transparent);width:min(520px,100%);max-height:40dvh;box-shadow:var(--shadow);border-radius:16px;margin-top:8px;margin-bottom:8px;padding:10px;animation:.16s cubic-bezier(.2,.8,.2,1) picker-in;overflow-y:auto}.gif-picker-head{grid-template-columns:auto minmax(0,1fr);align-items:center;gap:10px;padding:2px 2px 10px;display:grid}.gif-picker-head strong{color:var(--text-strong);font-size:13px}.gif-picker-head input{border:1px solid var(--line);border-radius:var(--radius);background:var(--panel-2);min-width:0;height:32px;padding:0 10px}.gif-grid{grid-template-columns:repeat(3,minmax(0,1fr));gap:8px;max-height:240px;display:grid;overflow-y:auto}.gif-grid button{aspect-ratio:4/3;background:var(--panel-2);color:#fff;box-shadow:inset 0 0 0 1px var(--line);border:0;border-radius:12px;padding:0;transition:transform .12s,box-shadow .12s;position:relative;overflow:hidden}.gif-grid button:hover{box-shadow:inset 0 0 0 2px var(--accent), 0 14px 30px -22px #000c;transform:translateY(-2px)}.gif-grid img{object-fit:cover;width:100%;height:100%;display:block}.gif-grid span{text-overflow:ellipsis;white-space:nowrap;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);background:#0000008f;border-radius:999px;padding:4px 7px;font-size:10.5px;font-weight:700;position:absolute;bottom:6px;left:6px;right:6px;overflow:hidden}@keyframes picker-in{0%{opacity:0;transform:translateY(8px)scale(.98)}to{opacity:1;transform:translateY(0)scale(1)}}.composer-row{--composer-control-size:36px;--composer-line-height:22px;--composer-text-padding-block:7px;background:0 0;border:0;border-radius:0;grid-template-columns:minmax(0,1fr) auto;align-items:start;gap:4px;padding:8px 8px 4px 10px;display:grid}.composer-row:has(.composer-icon){grid-template-columns:auto minmax(0,1fr) auto}.composer:focus-within .composer-toolbar,.composer-row:focus-within{border-color:#0000}.composer-row:focus-within{box-shadow:none}.composer-icon{width:var(--composer-control-size);height:var(--composer-control-size);margin-top:calc(var(--composer-text-padding-block) + (var(--composer-line-height) - var(--composer-control-size)) / 2);color:var(--muted);cursor:pointer;border-radius:10px;align-self:start;place-items:center;transition:background .12s,color .12s;display:grid}.composer-icon:hover{background:var(--hover-strong);color:var(--text-strong)}.composer-icon input[type=file]{opacity:0;pointer-events:none;block-size:1px;inline-size:1px;position:absolute}.composer textarea,.reply-composer textarea{width:100%;height:auto;min-height:44px;max-height:50vh;padding:var(--composer-text-padding-block) 4px;resize:none;color:var(--text);line-height:var(--composer-line-height);box-sizing:border-box;align-self:start;font-size:14.5px;overflow-y:auto}.composer textarea::placeholder,.reply-composer textarea::placeholder{color:var(--muted)}.send{width:var(--composer-control-size);height:var(--composer-control-size);margin-top:calc(var(--composer-text-padding-block) + (var(--composer-line-height) - var(--composer-control-size)) / 2);border:1px solid color-mix(in srgb, var(--accent) 70%, var(--text-strong));border-radius:var(--radius);background:var(--accent);color:var(--accent-contrast);box-shadow:var(--key-edge);align-self:start;place-items:center;transition:background .12s,transform 80ms,box-shadow 80ms,opacity .12s;display:grid}.send:hover:not(:disabled){background:var(--accent-hover);transform:translateY(-1px)}.send:active:not(:disabled){box-shadow:var(--key-edge-pressed);transform:translateY(1px)}.send:disabled{background:var(--panel-3);border-color:var(--line-strong);color:var(--muted-2);cursor:not-allowed;box-shadow:none}.composer-attachment{background:var(--panel);border:1px solid var(--line);border-radius:var(--radius);color:var(--text);align-items:center;gap:8px;width:fit-content;margin-top:8px;margin-bottom:8px;padding:6px 10px;font-size:13px;display:inline-flex}.attachment-icon{background:var(--accent-soft);width:20px;height:20px;color:var(--accent);border-radius:6px;place-items:center;display:grid}.pending-image{object-fit:cover;border:1px solid var(--line);background:var(--panel-2);border-radius:7px;width:42px;height:32px}.attachment-name{text-overflow:ellipsis;white-space:nowrap;max-width:240px;overflow:hidden}.attachment-remove{width:18px;height:18px;color:var(--muted);background:0 0;border:0;border-radius:50%;font-size:14px;line-height:1}.attachment-remove:hover{background:var(--danger);color:#fff}.composer-hint{color:var(--muted-2);padding:7px 4px 0;font-size:11px}.composer-hint kbd{background:var(--panel-2);border:1px solid var(--line-strong);font-family:var(--font-mono);color:var(--text);box-shadow:0 1px 0 var(--line-strong);border-radius:4px;padding:0 5px;font-size:10.5px;display:inline-block}@media (width<=820px){.composer{padding:8px calc(14px + var(--safe-area-right)) calc(6px + var(--safe-area-bottom)) calc(14px + var(--safe-area-left))}.composer textarea,.reply-composer textarea{font-size:16px}.composer-suggestions{max-height:min(320px,42dvh)}}.thread{background:var(--panel);border-left:1px solid var(--line);opacity:0;pointer-events:none;grid-template-rows:auto minmax(0,1fr) auto;grid-template-columns:minmax(0,1fr);min-width:0;transition:opacity .18s,transform .22s cubic-bezier(.2,.8,.2,1);display:grid;overflow:hidden;transform:translate(28px)}.thread.open{opacity:1;pointer-events:auto;transform:translate(0)}.thread.covered{opacity:0;pointer-events:none}.thread>header{border-bottom:1px solid var(--line);background:linear-gradient(180deg, #ffffff05, transparent), var(--panel);align-items:center;gap:10px;min-height:60px;padding:12px 16px;display:flex}.thread>header>div{flex:1;min-width:0}.thread>header p,.thread>header strong{margin:0}.thread>header p{color:var(--muted);font-family:var(--font-mono);text-transform:uppercase;letter-spacing:.08em;text-overflow:ellipsis;white-space:nowrap;font-size:10px;font-weight:600;overflow:hidden}.thread>header strong{color:var(--text-strong);font-size:14px;display:block}.thread .thread-pin-error{color:var(--danger);margin-top:3px;font-size:11px;line-height:1.35;display:block}.thread .close{background:var(--panel-2);width:28px;height:28px;color:var(--muted);border:0;border-radius:50%;font-size:18px;line-height:1}.thread .close:hover{background:var(--panel-3);color:var(--text-strong)}.thread .thread-open-link{color:var(--accent);font-family:var(--font-mono);white-space:nowrap;flex:none;font-size:11px;font-weight:700;text-decoration:none}.thread .thread-open-link:hover{color:var(--accent-hover);text-decoration:underline}.thread .thread-open-link:focus-visible{outline:2px solid var(--accent);outline-offset:3px;border-radius:3px}.thread .thread-back{background:var(--panel-2);width:28px;height:28px;color:var(--muted);border:0;border-radius:50%;flex:none;place-items:center;display:grid}.thread .thread-back:hover{background:var(--panel-3);color:var(--text-strong)}.thread .thread-back:focus-visible,.thread .close:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}.thread-scroll{padding:12px 16px;overflow-y:auto}.thread-root{border-bottom:1px solid var(--line);grid-template-columns:38px minmax(0,1fr);gap:12px;padding-bottom:12px;display:grid}.thread-divider{align-items:center;gap:10px;margin:14px 0 10px;display:flex}.thread-divider:before,.thread-divider:after{content:"";background:var(--line);flex:1;height:1px}.thread-divider span{font-family:var(--font-mono);color:var(--muted);text-transform:uppercase;letter-spacing:.08em;font-size:10px;font-weight:600}.reply-list{flex-direction:column;gap:10px;display:flex}.reply{border-radius:var(--radius-sm);grid-template-columns:30px minmax(0,1fr);gap:10px;padding:6px;display:grid}.reply:hover{background:var(--hover)}.thread .reply-quote-btn,.thread .thread-action-btn{width:26px;height:26px;color:var(--muted);background:0 0;border:0;border-radius:6px;place-items:center;display:inline-grid}.thread .reply-quote-btn:hover,.thread .thread-action-btn:hover{background:var(--hover-strong);color:var(--text-strong)}.thread .reply-quote-btn:disabled,.thread .thread-action-btn:disabled{cursor:default;opacity:.45}.thread .thread-action-btn--danger{color:var(--danger)}.thread .thread-action-btn--danger:hover{background:color-mix(in srgb, var(--danger) 12%, transparent);color:var(--danger)}.thread .thread-more-actions{display:none}@media (hover:none),(pointer:coarse){.thread .group-body>header{min-height:28px;padding-right:32px;position:relative}.thread .reply-quote-btn,.thread .thread-action-btn:not(.thread-more-actions){display:none}.thread .thread-more-actions{clip:rect(0 0 0 0);clip-path:inset(50%);white-space:nowrap;width:1px;height:1px;margin:-1px;padding:0;display:inline-grid;position:absolute;top:0;right:0;overflow:hidden}.thread .thread-more-actions:focus-visible{clip:auto;clip-path:none;border:1px solid var(--line-strong);background:var(--panel);width:28px;height:28px;box-shadow:var(--shadow);margin:0;overflow:visible}}.reply-composer{--composer-card-top:10px;--composer-overlay-inset-x:14px;background:var(--panel);border-top:1px solid var(--line);padding:10px 14px 14px}.reply-composer .composer-row{border-radius:0}.thread-empty{text-align:center;grid-row:span 3;align-content:center;place-items:center;gap:8px;padding:32px 24px;display:grid}.thread-icon{background:var(--panel-2);width:56px;height:56px;color:var(--muted);border-radius:16px;place-items:center;display:grid}.thread-empty strong{color:var(--text-strong);font-size:15px}.thread-empty span{color:var(--muted);max-width:260px;font-size:13px;line-height:1.5}.profile-pane{overflow-y:auto}.profile-hero{background:linear-gradient(180deg, transparent, #0000003d), linear-gradient(135deg, hsl(var(--hue,220deg) 76% 58%), hsl(calc(var(--hue,220deg) + 54deg) 74% 38%));border-bottom:1px solid var(--line);place-items:end center;min-height:210px;padding:28px 20px;display:grid}.profile-avatar{aspect-ratio:1;color:#fff;background:#ffffff2e;border-radius:16px;place-items:center;width:min(240px,70%);font-size:clamp(48px,12vw,88px);font-weight:800;display:grid;overflow:hidden;box-shadow:0 26px 60px -30px #000000e6}.profile-avatar img{object-fit:cover;width:100%;height:100%}.profile-pane-body{gap:18px;padding:18px 16px 22px;display:grid}.profile-pane-title{justify-content:space-between;align-items:flex-start;gap:12px;display:flex}.profile-pane-title h2{color:var(--text-strong);letter-spacing:0;margin:0;font-size:22px}.profile-pane-title span{color:var(--muted);margin-top:3px;font-size:13px;display:block}.profile-pane-title .bot-badge{border:1px solid color-mix(in srgb, var(--accent) 45%, transparent);min-height:20px;color:var(--accent);border-radius:999px;align-items:center;margin-top:6px;padding:0 8px;font-size:11px;font-weight:800;line-height:1;display:inline-flex}.text-action{color:var(--accent);background:0 0;border:0;border-radius:6px;padding:4px 6px;font-size:13px;font-weight:700}.text-action:hover{background:var(--accent-soft)}.profile-presence{color:var(--text);align-items:center;gap:8px;font-size:14px;display:inline-flex}.profile-actions-row{grid-template-columns:repeat(auto-fit,minmax(132px,1fr));gap:10px;display:grid}.profile-actions-row .primary-action,.profile-actions-row .ghost-action{border-radius:var(--radius);white-space:nowrap;justify-content:center;align-items:center;width:100%;min-width:0;height:48px;padding:0 16px;font-size:14px;font-weight:800;line-height:1;display:inline-flex}.moderation-actions{grid-template-columns:repeat(auto-fit,minmax(108px,1fr));gap:8px;display:grid}.moderation-actions .primary-action,.moderation-actions .ghost-action,.moderation-actions .danger-action{border-radius:var(--radius);min-height:40px;font-size:13px;font-weight:800}.danger-action{border:1px solid color-mix(in srgb, var(--danger), transparent 35%);background:color-mix(in srgb, var(--danger), transparent 86%);color:var(--danger)}.role-pill{background:var(--panel-2);color:var(--muted);text-transform:uppercase;border-radius:999px;padding:4px 8px;font-size:11px;font-weight:800}.profile-info{border-top:1px solid var(--line);gap:12px;padding-top:18px;display:grid}.profile-info header{justify-content:space-between;align-items:center;gap:10px;display:flex}.profile-info header strong{color:var(--text-strong);font-size:14px}.profile-info-row{grid-template-columns:48px minmax(0,1fr);align-items:center;gap:14px;min-height:48px;display:grid}.info-icon{background:var(--panel-2);width:48px;height:48px;color:var(--muted);border-radius:12px;justify-content:center;align-items:center;line-height:1;display:inline-flex}.info-icon svg{flex:none;display:block}.profile-info-row>div>small,.profile-info-row>div>span{display:block}.profile-info-row>div>small{color:var(--muted);font-size:12px;line-height:1.2}.profile-info-row>div>span{color:var(--text);overflow-wrap:anywhere;font-size:14px;line-height:1.3}.profile-note{color:var(--muted);margin:0;font-size:13px;line-height:1.5}@media (width<=820px){.thread{min-height:100dvh}.thread>header{min-height:calc(60px + var(--safe-area-top));padding-top:calc(12px + var(--safe-area-top));padding-right:calc(16px + var(--safe-area-right));padding-left:calc(16px + var(--safe-area-left))}.thread-scroll{padding-right:calc(16px + var(--safe-area-right));padding-left:calc(16px + var(--safe-area-left))}.reply-composer{padding-right:calc(14px + var(--safe-area-right));padding-bottom:calc(14px + var(--safe-area-bottom));padding-left:calc(14px + var(--safe-area-left))}}.thread-scroll{overflow-anchor:none}.thread-history{text-align:center;padding:8px 16px}.thread-history p{color:var(--danger);font-size:12px}.thread-history--latest{border-top:1px solid var(--line)}.thread-target{outline:2px solid var(--accent);outline-offset:-2px;border-radius:var(--radius)}.artifact-viewer{z-index:2;border-left:1px solid var(--line);background:var(--panel);opacity:0;pointer-events:none;grid-template-rows:auto minmax(0,1fr);min-width:0;transition:opacity .18s,transform .22s cubic-bezier(.2,.8,.2,1);display:grid;overflow:hidden;transform:translate(28px)}.artifact-viewer.open{opacity:1;pointer-events:auto;transform:translate(0)}.artifact-viewer__header{border-bottom:1px solid var(--line);background:color-mix(in srgb, var(--panel) 92%, var(--bg));justify-content:space-between;align-items:center;gap:16px;min-height:64px;padding:10px 12px 10px 16px;display:flex}.artifact-viewer__identity{grid-template-columns:auto minmax(0,1fr) auto;align-items:baseline;gap:5px 10px;min-width:0;display:grid}.artifact-viewer__identity span{color:var(--muted);letter-spacing:.04em;text-transform:uppercase;grid-column:1/-1;font-size:11px;font-weight:700}.artifact-viewer__identity strong{min-width:0;color:var(--text-strong);text-overflow:ellipsis;white-space:nowrap;font-size:14px;overflow:hidden}.artifact-viewer__identity small{color:var(--muted);font-variant-numeric:tabular-nums;white-space:nowrap;font-size:11px}.artifact-viewer__actions,.artifact-viewer__segmented{align-items:center;gap:4px;display:inline-flex}.artifact-viewer__actions>a,.artifact-viewer__actions>button,.artifact-viewer__segmented button,.artifact-viewer__pdf-toolbar button{border-radius:var(--radius-sm);min-width:32px;height:32px;color:var(--muted);background:0 0;border:1px solid #0000;place-items:center;padding:0 9px;text-decoration:none;display:inline-grid}.artifact-viewer__office-toolbar button,.artifact-viewer__sheet-tabs button{border-radius:var(--radius-sm);min-height:30px;color:var(--muted);background:0 0;border:1px solid #0000;padding:0 10px;font-size:11px}.artifact-viewer__actions>button{font-size:20px;line-height:1}.artifact-viewer__actions>a:hover,.artifact-viewer__actions>button:hover,.artifact-viewer__segmented button:hover,.artifact-viewer__pdf-toolbar button:hover:not(:disabled){border-color:var(--line);background:var(--hover-strong);color:var(--text-strong)}.artifact-viewer__actions :focus-visible,.artifact-viewer__pdf-toolbar button:focus-visible{outline:2px solid var(--accent);outline-offset:2px}.artifact-viewer__segmented{border:1px solid var(--line);border-radius:var(--radius);background:var(--panel-2);padding:2px}.artifact-viewer__segmented button{min-width:58px;height:28px;font-size:11px;font-weight:650}.artifact-viewer__segmented button.active{border-color:var(--line);background:var(--panel);color:var(--text-strong)}.artifact-viewer__body{background:var(--bg);min-height:0;overflow:auto}.artifact-viewer__state{min-height:100%;color:var(--muted);text-align:center;align-content:center;justify-items:center;gap:10px;padding:32px 24px;display:grid}.artifact-viewer__state strong{color:var(--text-strong);font-size:15px}.artifact-viewer__state p{max-width:34ch;margin:0;font-size:13px;line-height:1.5}.artifact-viewer__state a{border:1px solid var(--line-strong);border-radius:var(--radius-sm);background:var(--panel);min-height:36px;color:var(--text-strong);margin-top:4px;padding:8px 12px;font-size:13px;font-weight:650;text-decoration:none}.artifact-viewer__state--error svg{color:var(--danger)}.artifact-viewer__spinner{border:2px solid var(--line-strong);border-top-color:var(--accent);border-radius:50%;width:26px;height:26px;animation:.7s linear infinite artifact-spin}@keyframes artifact-spin{to{transform:rotate(360deg)}}.artifact-viewer__source{background:color-mix(in srgb, var(--bg) 90%, #090b10);width:max-content;min-width:100%;min-height:100%;color:var(--text);font-family:var(--font-mono);tab-size:2;white-space:pre;margin:0;padding:20px;font-size:12px;line-height:1.65}.artifact-viewer__source code{font:inherit}.artifact-viewer__document{border:1px solid var(--line);border-radius:var(--radius);background:var(--panel);width:min(100%,760px);min-height:calc(100% - 32px);color:var(--text);overflow-wrap:anywhere;margin:16px auto;padding:clamp(24px,5vw,56px);font-size:15px;line-height:1.65}.artifact-viewer__document>:first-child{margin-top:0}.artifact-viewer__document>:last-child{margin-bottom:0}.artifact-viewer__document h1,.artifact-viewer__document h2,.artifact-viewer__document h3{color:var(--text-strong);line-height:1.25}.artifact-viewer__document h1{font-size:28px}.artifact-viewer__document h2{margin-top:1.75em;font-size:21px}.artifact-viewer__document h3{margin-top:1.5em;font-size:17px}.artifact-viewer__document pre{border-radius:var(--radius);background:var(--panel-2);padding:14px;overflow:auto}.artifact-viewer__document code{font-family:var(--font-mono)}.artifact-viewer__document table{border-collapse:collapse;width:100%}.artifact-viewer__document th,.artifact-viewer__document td{border:1px solid var(--line-strong);text-align:left;padding:8px 10px}.artifact-viewer__document img{max-width:100%;height:auto}.artifact-viewer__document a{color:var(--accent)}.artifact-viewer__body.is-pdf{grid-template-rows:auto minmax(0,1fr);display:grid;overflow:hidden}.artifact-viewer__body.is-office{grid-template-rows:auto minmax(0,1fr) auto;display:grid;overflow:hidden}.artifact-viewer__office-toolbar,.artifact-viewer__sheet-tabs{border-bottom:1px solid var(--line);background:var(--panel);min-height:44px;color:var(--muted);font-variant-numeric:tabular-nums;justify-content:center;align-items:center;gap:4px;padding:6px 10px;font-size:11px;display:flex}.artifact-viewer__office-toolbar button:disabled{cursor:not-allowed;opacity:.4}.artifact-viewer__office-toolbar button:hover:not(:disabled),.artifact-viewer__sheet-tabs button:hover,.artifact-viewer__sheet-tabs button.active{border-color:var(--line);background:var(--hover-strong);color:var(--text-strong)}.artifact-viewer__office-toolbar button:focus-visible,.artifact-viewer__sheet-tabs button:focus-visible{outline:2px solid var(--accent);outline-offset:2px}.artifact-viewer__office-toolbar{flex-wrap:wrap}.artifact-viewer__spreadsheet{background:var(--panel);min-height:0;overflow:auto}.artifact-viewer__spreadsheet table{table-layout:fixed;border-spacing:0;border-collapse:separate;width:max-content;color:var(--text);font-size:12px}.artifact-viewer__spreadsheet th,.artifact-viewer__spreadsheet td{box-sizing:border-box;border-right:1px solid var(--line);border-bottom:1px solid var(--line);background:var(--panel);text-align:left;text-overflow:ellipsis;white-space:nowrap;width:160px;min-width:160px;max-width:160px;height:30px;padding:5px 8px;overflow:hidden}.artifact-viewer__spreadsheet thead th{z-index:2;background:var(--panel-2);color:var(--muted);text-align:center;position:sticky;top:0}.artifact-viewer__spreadsheet .row-heading{z-index:1;background:var(--panel-2);width:44px;min-width:44px;color:var(--muted);text-align:right;font-variant-numeric:tabular-nums;position:sticky;left:0}.artifact-viewer__spreadsheet thead .row-heading{z-index:3}.artifact-viewer__grid-note{border:1px solid var(--line);border-radius:var(--radius-sm);background:var(--panel-2);width:max-content;max-width:min(480px,100vw - 48px);color:var(--muted);white-space:normal;margin:16px;padding:8px 10px;font-size:12px;line-height:1.45;position:sticky;left:0}.artifact-viewer__sheet-tabs{border-top:1px solid var(--line);border-bottom:0;justify-content:flex-start;overflow-x:auto}.artifact-viewer__sheet-tabs button{flex:none}.artifact-viewer__slide-stage{align-content:center;place-items:center;gap:12px;min-height:0;padding:24px;display:grid;overflow:auto}.artifact-viewer__slide{aspect-ratio:16/9;color:#172033;background:#fff;flex-direction:column;justify-content:safe center;width:min(100%,860px);padding:48px;display:flex;overflow:auto;box-shadow:0 16px 48px -24px #000000a6}.artifact-viewer__slide h2{letter-spacing:0;margin:0 0 .7em;font-size:36px;line-height:1.15}.artifact-viewer__slide p{margin:.35em 0;font-size:20px;line-height:1.4}.artifact-viewer__office-note{color:var(--muted);margin:0;font-size:12px}@media (width<=640px){.artifact-viewer__slide{padding:28px}.artifact-viewer__slide h2{font-size:24px}.artifact-viewer__slide p{font-size:15px}}.artifact-viewer__pdf-toolbar{border-bottom:1px solid var(--line);background:var(--panel);min-height:44px;color:var(--muted);font-variant-numeric:tabular-nums;justify-content:center;align-items:center;gap:4px;padding:6px 10px;font-size:11px;display:flex}.artifact-viewer__pdf-toolbar button{min-width:30px;height:30px;font-size:11px}.artifact-viewer__pdf-toolbar button:disabled{cursor:not-allowed;opacity:.4}.artifact-viewer__toolbar-divider{background:var(--line);width:1px;height:18px;margin:0 4px}.artifact-viewer__pdf-stage{text-align:center;min-height:0;padding:24px;overflow:auto}.artifact-viewer__pdf-stage canvas{background:#fff;max-width:none;transition:opacity .12s;display:inline-block;box-shadow:0 16px 48px -24px #000000a6}.artifact-viewer__pdf-text{clip:rect(0, 0, 0, 0);white-space:nowrap;border:0;width:1px;height:1px;padding:0;position:absolute;overflow:hidden}.artifact-viewer__pdf-stage.is-rendering canvas{opacity:.55}.hljs-comment,.hljs-quote{color:var(--muted);font-style:italic}.hljs-keyword,.hljs-selector-tag,.hljs-literal,.hljs-section,.hljs-link{color:var(--accent)}.hljs-string,.hljs-title,.hljs-name,.hljs-type,.hljs-attribute,.hljs-symbol,.hljs-bullet,.hljs-addition{color:var(--success)}.hljs-number,.hljs-meta,.hljs-built_in,.hljs-builtin-name,.hljs-params{color:var(--activity-accent)}.hljs-deletion{color:var(--danger)}@media (width<=820px){.artifact-viewer{z-index:40;border-left:0;min-height:100dvh;position:fixed;inset:0}.artifact-viewer__header{min-height:calc(64px + var(--safe-area-top));padding-top:calc(10px + var(--safe-area-top));padding-right:calc(12px + var(--safe-area-right));padding-left:calc(16px + var(--safe-area-left))}.artifact-viewer__identity small{display:none}.artifact-viewer__document{border:0;border-radius:0;min-height:100%;margin:0}}@media (prefers-reduced-motion:reduce){.artifact-viewer{transition:none}.artifact-viewer__spinner{animation-duration:1.4s}}.modal-scrim{z-index:50;-webkit-backdrop-filter:blur(14px);backdrop-filter:blur(14px);background:#05080f8a;place-items:center;padding:24px;display:grid;position:fixed;inset:0}.modal-backdrop{background:0 0;border:0;position:absolute;inset:0}.modal-backdrop:focus{outline:0}.profile-modal{z-index:1;background:var(--panel);border:1px solid var(--line-strong);border-radius:var(--radius-xl);width:min(480px,100%);box-shadow:var(--key-edge), var(--shadow);animation:.15s ease-out settings-modal-fade;position:relative;overflow:hidden}.profile-modal>header{justify-content:space-between;align-items:flex-start;gap:12px;padding:18px 20px 4px;display:flex}.profile-modal>header p{color:var(--muted);font-family:var(--font-mono);text-transform:uppercase;letter-spacing:.08em;margin:0 0 4px;font-size:10px;font-weight:600}.profile-modal>header h2{color:var(--text-strong);font-family:var(--font-display);letter-spacing:-.01em;margin:0;font-size:20px;font-weight:700}.profile-modal>header>button{border:1px solid var(--line);border-radius:var(--radius-sm);background:var(--panel-2);width:28px;height:28px;color:var(--muted);flex:none;place-items:center;font-size:16px;line-height:1;display:grid}.profile-modal>header>button:hover{background:var(--panel-3);color:var(--text-strong)}.create-modal{width:min(420px,100%)}.profile-form{gap:14px;padding:20px;display:grid}.field{gap:6px;display:grid}.field span{color:var(--muted);font-size:12px;font-weight:700}.field input,.field select{border:1px solid var(--line);border-radius:var(--radius-sm);background:var(--panel-2);width:100%;height:38px;color:var(--text);padding:0 12px}.field select{cursor:pointer}.field input:focus,.field select:focus{border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-soft);outline:0}.profile-status{color:var(--success);font-size:12px}.profile-status.error{color:var(--danger)}.profile-actions{justify-content:flex-end;gap:8px;padding-top:4px;display:flex}.person-picker{border:1px solid var(--line);border-radius:var(--radius);background:var(--panel-2);gap:4px;max-height:240px;padding:4px;display:grid;overflow-y:auto}.person-choice{border-radius:var(--radius-sm);width:100%;min-height:44px;color:var(--text);text-align:left;background:0 0;border:0;grid-template-columns:32px minmax(0,1fr);align-items:center;gap:10px;padding:6px 8px;display:grid}.person-choice:hover{background:var(--hover-strong)}.person-choice .dm-avatar{width:32px;height:32px}.person-choice strong,.person-choice small{text-overflow:ellipsis;white-space:nowrap;min-width:0;display:block;overflow:hidden}.person-choice strong{color:var(--text-strong);font-size:13px}.person-choice small{color:var(--muted);font-size:12px}.person-empty{color:var(--muted);padding:10px 8px;font-size:12px}.profile-actions .ghost-action,.profile-actions .primary-action,.profile-actions .danger-action{box-sizing:border-box;border-radius:var(--radius);white-space:nowrap;min-height:44px;box-shadow:var(--key-edge);flex:none;justify-content:center;align-items:center;padding:0 14px;font-weight:700;line-height:1;transition:background .12s,box-shadow 80ms,transform 80ms;display:inline-flex}.ghost-action{border:1px solid var(--line-strong);background:var(--panel);color:var(--text)}.primary-action{border:1px solid color-mix(in srgb, var(--accent) 70%, var(--text-strong));background:var(--accent);color:var(--accent-contrast)}.profile-actions .danger-action{border:1px solid color-mix(in srgb, var(--danger) 76%, var(--text-strong));background:var(--danger);color:#fff}.ghost-action:hover{background:var(--hover)}.primary-action:hover{background:var(--accent-hover)}.profile-actions .danger-action:hover:not(:disabled){background:color-mix(in srgb, var(--danger) 86%, #000)}.profile-actions .ghost-action:disabled,.profile-actions .primary-action:disabled,.profile-actions .danger-action:disabled{cursor:default;opacity:.58}.profile-actions .ghost-action:active,.profile-actions .primary-action:active,.profile-actions .danger-action:active{box-shadow:var(--key-edge-pressed);transform:translateY(1px)}.delete-message-scrim{padding:20px}.delete-message-modal{width:min(520px,100%)}.delete-message-modal>header{padding-bottom:10px}.delete-message-content{gap:18px;padding:4px 20px 20px;display:grid}.delete-message-content>p{color:var(--text);margin:0;font-size:14px;line-height:1.5}.delete-message-preview{border:1px solid var(--line-strong);border-radius:var(--radius);background:var(--panel-2);grid-template-columns:36px minmax(0,1fr);align-items:start;gap:12px;padding:14px;display:grid}.delete-message-preview__content{min-width:0}.delete-message-preview>.avatar{border-radius:9px;width:36px;height:36px;margin:0}.delete-message-preview__meta{align-items:baseline;gap:8px;min-width:0;display:flex}.delete-message-preview__meta strong{color:var(--text-strong);text-overflow:ellipsis;white-space:nowrap;font-size:14px;overflow:hidden}.delete-message-preview__meta time{color:var(--muted);flex:none;font-size:11px}.delete-message-preview__body{max-height:128px;color:var(--text);overflow-wrap:anywhere;white-space:pre-wrap;margin-top:4px;font-size:14px;line-height:1.45;overflow:auto}.delete-message-actions{grid-template-columns:repeat(2,minmax(0,1fr));gap:10px;padding-top:0;display:grid}.delete-message-actions button{width:100%}@media (width<=520px){.delete-message-modal{width:100%}.delete-message-content,.delete-message-modal>header{padding-inline:16px}}.channel-settings-scrim{padding:20px}.channel-settings-modal{width:min(460px,100%)}.channel-settings-content{gap:18px;padding:14px 20px 20px;display:grid}.channel-settings-name{color:var(--text-strong);font-family:var(--font-display);font-size:16px;display:block}.channel-settings-content p{color:var(--muted);margin:6px 0 0;font-size:13px;line-height:1.5}.channel-settings-content .channel-settings-warning{border-left:3px solid var(--danger);background:color-mix(in srgb, var(--danger) 8%, var(--panel-2));color:var(--text);margin:0;padding:12px}.channel-settings-actions{grid-template-columns:repeat(2,minmax(0,1fr));gap:10px;padding-top:0;display:grid}.channel-settings-actions button{width:100%}@media (width<=520px){.channel-settings-content,.channel-settings-modal>header{padding-inline:16px}}.image-viewer-scrim{-webkit-backdrop-filter:blur(18px);backdrop-filter:blur(18px);background:#000000c7;padding:28px}.image-viewer{z-index:1;color:#fff;background:#07090f;border:1px solid #ffffff1f;border-radius:14px;grid-template-rows:auto minmax(0,1fr);width:min(1280px,100%);height:min(900px,100dvh - 56px);max-height:100%;animation:.15s cubic-bezier(.2,.8,.2,1) picker-in;display:grid;position:relative;overflow:hidden;box-shadow:0 34px 90px -34px #000000f2}.image-viewer>header{background:#ffffff0a;border-bottom:1px solid #ffffff1a;justify-content:space-between;align-items:center;gap:16px;min-height:52px;padding:10px 12px 10px 16px;display:flex}.image-viewer>header strong{color:#fff;text-overflow:ellipsis;white-space:nowrap;min-width:0;font-size:13px;overflow:hidden}.image-viewer>header div{flex-shrink:0;align-items:center;gap:8px;display:inline-flex}.image-viewer>header a{color:#fff;background:#ffffff14;border-radius:7px;align-items:center;height:30px;padding:0 10px;font-size:12px;font-weight:700;text-decoration:none;display:inline-flex}.image-viewer>header a:hover{background:#ffffff24}.image-viewer>header a:focus-visible,.image-viewer>header button:focus-visible{outline-offset:2px;outline:2px solid #fff}.image-viewer>header button{color:#ffffffc7;background:0 0;border:0;border-radius:7px;place-items:center;width:30px;height:30px;font-size:22px;line-height:1;display:grid}.image-viewer>header button:hover{color:#fff;background:#ffffff1f}.image-viewer-stage{place-items:center;min-height:0;padding:18px;display:grid}.image-viewer-stage img{object-fit:contain;background:#ffffff0a;border-radius:8px;max-width:100%;max-height:100%;display:block}@media (width<=720px),(height<=520px) and (orientation:landscape){.image-viewer-scrim{padding:0}.image-viewer{border:0;border-radius:0;width:100%;height:100dvh}.image-viewer>header{padding-top:calc(10px + var(--safe-area-top));padding-right:calc(12px + var(--safe-area-right));padding-left:calc(16px + var(--safe-area-left))}.image-viewer-stage{padding-right:calc(12px + var(--safe-area-right));padding-bottom:calc(12px + var(--safe-area-bottom));padding-left:calc(12px + var(--safe-area-left))}}.mobile-nav-toggle{top:calc(14px + var(--safe-area-top));left:calc(14px + var(--safe-area-left));z-index:30;border:1px solid var(--line-strong);background:var(--panel);width:38px;height:38px;color:var(--text);border-radius:10px;font-size:22px;line-height:1;display:none;position:fixed}.mobile-nav-toggle .bars{gap:3px;display:grid}.mobile-nav-toggle .bars i{background:currentColor;border-radius:2px;width:16px;height:2px;display:block}.mobile-nav-backdrop{display:none}@media (width<=1180px){.shell{grid-template-columns:72px 240px minmax(0,1fr)}.shell.sidebar-collapsed,.shell.sidebar-collapsed.thread-open,.shell.sidebar-collapsed.search-open{grid-template-columns:72px 0 minmax(0,1fr)}.thread,.search-results{width:min(420px,100vw);box-shadow:var(--shadow);z-index:4;border-left:1px solid var(--line-strong);transition:transform .18s;position:fixed;inset:0 0 0 auto;transform:translate(100%)}.thread.open,.search-results{transform:translate(0)}.desktop-shell .thread,.desktop-shell .search-results{top:52px;bottom:0}}@media (width<=820px){.mobile-nav-toggle{place-items:center;display:grid}.shell,.shell.thread-open,.shell.search-open,.shell.sidebar-collapsed,.shell.sidebar-collapsed.thread-open,.shell.sidebar-collapsed.search-open{grid-template-columns:1fr}.sidebar-collapsed .sidebar{opacity:1;pointer-events:none;transform:translate(calc(-100% - 72px))}.guild-rail,.sidebar{z-index:20;pointer-events:none;height:100dvh;transition:transform .18s;position:fixed;inset:0 auto 0 0;transform:translate(-100%)}.guild-rail{width:72px;padding-top:calc(14px + var(--safe-area-top));padding-bottom:calc(14px + var(--safe-area-bottom))}.sidebar{width:min(260px,100vw - 72px);left:72px;transform:translate(calc(-100% - 72px))}.nav-open .guild-rail,.nav-open .sidebar{pointer-events:auto;transform:translate(0,0)}.nav-open .guild-rail{padding-top:calc(62px + var(--safe-area-top))}.desktop-shell .guild-rail,.desktop-shell .sidebar{height:calc(100dvh - 52px);top:52px}.desktop-shell.nav-open .guild-rail{padding-top:calc(14px + var(--safe-area-top))}.desktop-shell .mobile-nav-backdrop{top:52px}.mobile-nav-backdrop{z-index:15;background:#05081075;border:0;padding:0;display:block;position:fixed;inset:0 0 0 min(332px,100vw)}.topbar{min-height:calc(60px + var(--safe-area-top));padding-top:calc(12px + var(--safe-area-top));padding-right:calc(20px + var(--safe-area-right));padding-left:calc(64px + var(--safe-area-left))}.thread>header,.search-results-head{padding-top:calc(12px + var(--safe-area-top));padding-left:calc(64px + var(--safe-area-left))}.search{width:180px}}@media (width<=520px){.search,.topbar-meta,.topbar-divider{display:none}}.message-row.highlight,.thread-root.highlight,.reply.highlight{animation:1.4s ease-out quote-flash}@keyframes quote-flash{0%{background:color-mix(in srgb, var(--accent) 22%, transparent)}to{background:0 0}}.quote-block{color:inherit;cursor:pointer;text-align:left;max-width:100%;font:inherit;background:0 0;border:0;border-radius:6px;align-items:stretch;gap:.5rem;margin:0 0 .35rem;padding:.25rem .5rem .25rem 0;display:inline-flex}.quote-block:hover:not(:disabled){background:color-mix(in srgb, var(--accent) 8%, transparent)}.quote-block:disabled{cursor:default;opacity:.75}.quote-block .quote-bar{background:var(--accent);border-radius:2px;flex:0 0 3px;align-self:stretch;width:3px}.quote-block .quote-content{flex-direction:column;gap:.1rem;min-width:0;display:flex}.quote-block .quote-author{color:var(--accent);font-size:.78rem;font-weight:600}.quote-block .quote-snippet{color:var(--muted);white-space:nowrap;text-overflow:ellipsis;max-width:56ch;font-size:.85rem;overflow:hidden}.quote-block .quote-snippet.muted{opacity:.75;font-style:italic}.quote-preview{background:color-mix(in srgb, var(--accent) 5%, transparent);border:0;border-bottom:1px solid var(--line);color:var(--muted);border-radius:0;align-items:center;gap:.5rem;margin:0;padding:6px 10px 6px 12px;font-size:12.5px;display:flex}.quote-preview .quote-bar{display:none}.quote-preview-body{flex:1;align-items:baseline;gap:.4rem;min-width:0;display:flex;overflow:hidden}.quote-preview-label{color:color-mix(in srgb, var(--accent) 85%, var(--text));white-space:nowrap;font-size:12px}.quote-preview-label strong{color:var(--text-strong);font-weight:600}.quote-preview-snippet{white-space:nowrap;text-overflow:ellipsis;color:var(--muted);flex:1;min-width:0;font-size:12px;overflow:hidden}.quote-preview-clear{color:var(--muted);cursor:pointer;background:0 0;border:0;border-radius:6px;padding:2px 6px;font-size:16px;line-height:1;transition:background .1s,color .1s}.quote-preview-clear:hover{color:var(--text-strong);background:var(--hover-strong)}.reply-quote-btn{color:var(--muted);cursor:pointer;opacity:0;background:0 0;border:0;margin-left:auto;padding:0 .3rem;font-size:.95rem;transition:opacity .15s;position:relative}.reply:hover .reply-quote-btn,.thread-root:hover .reply-quote-btn,.reply-quote-btn:focus-visible{opacity:1}.reply-quote-btn:hover{color:var(--accent)}.tooltip{position:relative}.tooltip:before,.reply-quote-btn:before{content:attr(data-tooltip);z-index:20;background:var(--tooltip-bg);color:var(--tooltip-fg);white-space:nowrap;opacity:0;pointer-events:none;border-radius:9px;padding:.42rem .62rem;font-size:.78rem;font-weight:700;line-height:1;transition:opacity .12s,transform .12s;position:absolute;bottom:calc(100% + 12px);left:50%;transform:translate(-50%,4px)scale(.96);box-shadow:0 10px 28px #00000047}.tooltip:after,.reply-quote-btn:after{content:"";z-index:20;background:var(--tooltip-bg);opacity:0;pointer-events:none;border-radius:2px;width:12px;height:12px;transition:opacity .12s,transform .12s;position:absolute;bottom:calc(100% + 5px);left:50%;transform:translate(-50%,4px)rotate(45deg)scale(.9)}.tooltip:hover:before,.tooltip:focus-visible:before,.reply-quote-btn:hover:before,.reply-quote-btn:focus-visible:before,.tooltip:hover:after,.tooltip:focus-visible:after,.reply-quote-btn:hover:after,.reply-quote-btn:focus-visible:after{opacity:1;transform:translate(-50%)scale(1)}.tooltip:hover:after,.tooltip:focus-visible:after,.reply-quote-btn:hover:after,.reply-quote-btn:focus-visible:after{transform:translate(-50%)rotate(45deg)scale(1)}.tooltip-align-end:before{transform-origin:100% 100%;left:auto;right:0;transform:translateY(4px)scale(.96)}.tooltip-align-end:hover:before,.tooltip-align-end:focus-visible:before{transform:translateY(0)scale(1)}.settings-modal-scrim{z-index:1000;color:var(--text);-webkit-font-smoothing:antialiased;background:var(--lightningcss-light,#080a0e6b)var(--lightningcss-dark,#0000008c);place-items:center;font-size:14px;line-height:1.5;animation:.15s ease-out settings-modal-fade;display:grid;position:fixed;inset:0}@keyframes settings-modal-fade{0%{opacity:0}to{opacity:1}}.settings-modal{background:var(--panel);border:1px solid var(--line);border-radius:var(--radius-lg);width:min(1100px,96vw);height:min(760px,92vh);box-shadow:var(--shadow);grid-template-columns:232px minmax(0,1fr);display:grid;position:relative;overflow:hidden}.settings-modal__close{z-index:6;width:28px;height:28px;color:var(--muted);cursor:pointer;border-radius:var(--radius-sm);background:0 0;border:0;place-items:center;transition:background .12s,color .12s;display:grid;position:absolute;top:14px;right:14px}.settings-modal__close:hover{background:var(--hover);color:var(--text-strong)}.settings-modal__rail{background:var(--panel-2);border-right:1px solid var(--line);flex-direction:column;padding:16px 10px;display:flex;overflow-y:auto}.settings-modal__rail-group+.settings-modal__rail-group{margin-top:14px}.settings-modal__rail-heading{font-family:var(--font-mono);text-transform:uppercase;letter-spacing:.09em;color:var(--muted);margin:0;padding:6px 8px 4px;font-size:10px;font-weight:600}.settings-modal__rail ul{margin:0;padding:0;list-style:none}.settings-modal__rail-item{border-radius:var(--radius-sm);cursor:pointer;width:100%;font:inherit;color:var(--text);text-align:left;background:0 0;border:0;align-items:center;gap:10px;margin:1px 0;padding:6px 10px;font-size:13.5px;line-height:1.4;transition:background .1s,color .1s;display:flex}.settings-modal__rail-item:hover{background:var(--hover)}.settings-modal__rail-item.is-active{background:var(--hover-strong);color:var(--text-strong);font-weight:600}.settings-modal__rail-icon{width:16px;height:16px;color:var(--muted);flex-shrink:0;place-items:center;display:grid}.settings-modal__rail-icon svg{width:16px;height:16px;display:block}.settings-modal__rail-item.is-active .settings-modal__rail-icon{color:var(--text-strong)}.settings-modal__rail-avatar{color:#fff;background:linear-gradient(135deg, hsl(var(--hue,220deg) 70% 55%), hsl(calc(var(--hue,220deg) + 40deg) 70% 45%));border-radius:4px;flex-shrink:0;place-items:center;width:18px;height:18px;font-size:9px;font-weight:700;display:grid;overflow:hidden}.settings-modal__rail-avatar img{object-fit:cover;width:100%;height:100%;display:block}.settings-modal__rail-label{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.settings-modal__content{background:var(--panel);color:var(--text);padding:40px 56px 56px;overflow-y:auto}.settings-modal__content .settings-page__header{margin-bottom:32px}.settings-modal__content .settings-page__eyebrow{font-family:var(--font-mono);text-transform:uppercase;letter-spacing:.09em;color:var(--muted);margin:0 0 6px;font-size:10px;font-weight:600}.settings-modal__content .settings-page__h1{letter-spacing:-.01em;color:var(--text-strong);font-size:26px;font-weight:700;line-height:1.2;font-family:var(--font-display);margin:0 0 6px}.settings-modal__content .settings-page__lead{color:var(--muted);margin:0;font-size:14px;line-height:1.5}.settings-modal__content .settings-form{flex-direction:column;gap:24px;max-width:640px;display:flex}.settings-modal__content .settings-footer{border-top:1px solid var(--line);justify-content:space-between;align-items:center;gap:12px;margin-top:8px;padding-top:20px;display:flex}.settings-modal__content .settings-footer__spacer{flex:1}.settings-modal__content .settings-section{flex-direction:column;gap:20px;display:flex}.settings-modal__content .settings-section__h{text-transform:uppercase;letter-spacing:.06em;color:var(--muted);margin:0 0 4px;font-size:12px;font-weight:600}.settings-modal__content .settings-field{flex-direction:column;gap:6px;display:flex}.settings-modal__content .settings-field__label{color:var(--text-strong);font-size:13px;font-weight:600}.settings-modal__content .settings-field__hint{color:var(--muted);margin:0;font-size:12.5px;line-height:1.5}.settings-modal__content .settings-field__hint.is-error{color:var(--danger)}.settings-modal__content .settings-identity{background:var(--panel-2);border:1px solid var(--line);border-radius:var(--radius);align-items:center;gap:14px;padding:14px 16px;display:flex}.settings-modal__content .settings-identity__meta{flex-direction:column;flex:1;gap:2px;min-width:0;display:flex}.settings-modal__content .settings-identity__name{color:var(--text-strong);white-space:nowrap;text-overflow:ellipsis;font-size:15px;font-weight:700;line-height:1.25;overflow:hidden}.settings-modal__content .settings-identity__handle{color:var(--muted);white-space:nowrap;text-overflow:ellipsis;font-size:13px;line-height:1.3;overflow:hidden}.settings-modal__content .settings-identity__tag{text-transform:uppercase;letter-spacing:.08em;color:var(--muted);background:var(--panel);border:1px solid var(--line);border-radius:999px;flex-shrink:0;padding:3px 8px;font-size:10px;font-weight:600}.settings-modal__content .settings-rows{flex-direction:column;display:flex}.settings-modal__content .settings-rows--sectioned .settings-row2{border-top:0;align-items:center;padding:12px 0}.settings-modal__content .settings-row2{border-top:1px solid var(--line);grid-template-columns:minmax(0,220px) minmax(0,1fr);gap:32px;padding:20px 0;display:grid}.settings-modal__content .settings-row2--toggle{grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:24px}.settings-modal__content .settings-row2:first-child{border-top:0;padding-top:4px}.settings-modal__content .settings-row2__desc{min-width:0}.settings-modal__content .settings-row2__label{color:var(--text-strong);margin-bottom:4px;font-size:13.5px;font-weight:600;display:block}.settings-modal__content .settings-row2__hint{color:var(--muted);margin:0;font-size:12.5px;line-height:1.5}.settings-modal__content .settings-row2__control{flex-direction:column;align-items:flex-start;gap:8px;min-width:0;max-width:380px;display:flex}.settings-modal__content .settings-row2__control--end{flex-direction:row;justify-content:center;align-items:flex-end;max-width:none}.settings-modal__content .settings-rows__head{border-top:1px solid var(--line);text-transform:uppercase;letter-spacing:.08em;color:var(--muted);margin:0;padding:24px 0 12px;font-size:11px;font-weight:600}.settings-modal__content .settings-rows__head:first-child{border-top:0;padding-top:4px}.settings-modal__content .settings-rows__head+.settings-row2{border-top:0;padding-top:0}.settings-modal__content .settings-input-group{background:var(--bg);border:1px solid var(--line);border-radius:var(--radius-sm);align-items:stretch;width:100%;transition:border-color .12s,box-shadow .12s,background .12s;display:flex}.settings-modal__content .settings-input-group:hover{border-color:var(--line-strong)}.settings-modal__content .settings-input-group:focus-within{border-color:var(--accent);background:var(--panel);box-shadow:0 0 0 3px var(--accent-soft)}.settings-modal__content .settings-input-group__prefix{color:var(--muted);border-right:1px solid var(--line);background:var(--panel-2);border-radius:var(--radius-sm) 0 0 var(--radius-sm);place-items:center;padding:0 10px;font-size:14px;font-weight:500;display:grid}.settings-modal__content .settings-input--in-group{box-shadow:none!important;border-radius:0 var(--radius-sm) var(--radius-sm) 0!important;background:0 0!important;border:0!important;max-width:none!important}.settings-modal__content .settings-input--in-group:focus{box-shadow:none!important;background:0 0!important;border:0!important}.settings-modal__content .settings-linklike{color:var(--muted);cursor:pointer;font:inherit;text-underline-offset:2px;background:0 0;border:0;padding:2px 0;font-size:12.5px;text-decoration:underline;transition:color .12s}.settings-modal__content .settings-linklike:hover{color:var(--text-strong)}.settings-modal__content .settings-row{grid-template-columns:1fr auto;align-items:center;gap:24px;display:grid}.settings-modal__content .settings-row__main{min-width:0}.settings-modal__content .settings-row__label{color:var(--text-strong);margin-bottom:2px;font-size:13.5px;font-weight:600}.settings-modal__content .settings-row__hint{color:var(--muted);font-size:12.5px;line-height:1.5}.settings-modal__content .settings-row__hint.is-error{color:var(--danger)}.settings-modal__content .settings-input{background:var(--bg);border:1px solid var(--line);border-radius:var(--radius-sm);width:100%;max-width:420px;height:36px;color:var(--text);font:inherit;padding:0 12px;font-size:14px;transition:border-color .12s,box-shadow .12s,background .12s}.settings-modal__content .settings-input:hover{border-color:var(--line-strong)}.settings-modal__content .settings-input:focus{border-color:var(--accent);background:var(--panel);box-shadow:0 0 0 3px var(--accent-soft);outline:0}.settings-modal__content .settings-input--wide{max-width:560px}.settings-modal__content .settings-row .settings-input{width:auto;min-width:240px;max-width:320px}.settings-modal__content .settings-button{background:var(--panel-2);height:34px;color:var(--text);border:1px solid var(--line-strong);border-radius:var(--radius);font:inherit;cursor:pointer;white-space:nowrap;box-shadow:var(--key-edge);justify-content:center;align-items:center;gap:6px;padding:0 14px;font-size:13.5px;font-weight:600;transition:background .1s,border-color .1s,box-shadow 80ms,transform 80ms;display:inline-flex}.settings-modal__content .settings-button:hover{background:var(--panel-3);border-color:var(--line-strong)}.settings-modal__content .settings-button:active:not(:disabled){box-shadow:var(--key-edge-pressed);transform:translateY(1px)}.settings-modal__content .settings-button:focus-visible{box-shadow:0 0 0 3px var(--accent-soft);outline:0}.settings-modal__content .settings-button:disabled{opacity:.55;cursor:not-allowed}.settings-modal__content .settings-button--primary{background:var(--accent);color:var(--accent-contrast);border-color:color-mix(in srgb, var(--accent) 70%, var(--text-strong))}.settings-modal__content .settings-button--primary:hover{background:var(--accent-hover);border-color:var(--accent-hover)}.settings-modal__content .settings-switch{appearance:none;background:var(--line-strong);cursor:pointer;border:0;border-radius:9px;flex-shrink:0;width:32px;height:18px;margin:0;transition:background .15s;position:relative}.settings-modal__content .settings-switch:checked{background:var(--accent)}.settings-modal__content .settings-switch:disabled{opacity:.5;cursor:not-allowed}.settings-modal__content .settings-switch:after{content:"";background:#fff;border-radius:50%;width:14px;height:14px;transition:transform .15s;position:absolute;top:2px;left:2px;box-shadow:0 1px 2px #00000040}.settings-modal__content .settings-switch:checked:after{transform:translate(14px)}.settings-modal__content .settings-switch:focus-visible{box-shadow:0 0 0 3px var(--accent-soft);outline:0}.settings-modal__content .settings-actions{justify-content:flex-end;align-items:center;gap:12px;margin-top:4px;display:flex}.settings-modal__content .settings-status{color:var(--muted);margin:0;font-size:13px}.settings-modal__content .settings-status.is-error{color:var(--danger)}@media (width<=720px){.settings-modal{border-radius:0;grid-template-rows:auto 1fr;grid-template-columns:1fr;width:100vw;height:100dvh}.settings-modal__rail{border-right:0;border-bottom:1px solid var(--line);flex-direction:row;padding:8px;overflow-x:auto}.settings-modal__content{padding:24px 20px 60px}.settings-modal__content .settings-row2{grid-template-columns:1fr;gap:10px}.settings-modal__content .settings-row2__control{max-width:none}}.ws-settings{color:var(--text);z-index:50;background:var(--lightningcss-light,#0f0f0f38)var(--lightningcss-dark,#00000059);place-items:center;padding:28px 80px 28px 28px;font-size:14px;line-height:1.5;display:grid;position:fixed;inset:0}.ws-settings__panel{background:var(--panel);border:1px solid var(--line);width:100%;max-width:1400px;height:100%;box-shadow:var(--shadow);grid-template-columns:260px minmax(0,1fr);display:grid;overflow:hidden}.ws-settings__rail{background:var(--panel-2);border-right:1px solid var(--line);flex-direction:column;padding:14px 10px 18px;display:flex;overflow-y:auto}.ws-settings__rail-search{margin:2px 4px 12px;position:relative}.ws-settings__rail-search-icon{color:var(--muted);pointer-events:none;position:absolute;top:50%;left:10px;transform:translateY(-50%)}.ws-settings__rail-search-icon svg{width:14px;height:14px;display:block}.ws-settings__rail-search-input{background:var(--panel);border:1px solid var(--line);border-radius:var(--radius-sm);width:100%;height:32px;color:var(--text);font:inherit;padding:0 12px 0 32px;font-size:13px}.ws-settings__rail-search-input::placeholder{color:var(--muted)}.ws-settings__rail-search-input:disabled{cursor:not-allowed;opacity:.65}.ws-settings__rail-group{margin-top:6px}.ws-settings__rail-heading{color:var(--muted);letter-spacing:.02em;margin:0;padding:8px 10px 6px;font-size:11.5px;font-weight:600}.ws-settings__rail-heading-name{color:var(--text-strong);font-weight:700}.ws-settings__rail-list{margin:0;padding:0;list-style:none}.ws-settings__rail-item{border-radius:var(--radius-sm);cursor:pointer;width:100%;font:inherit;color:var(--text);text-align:left;background:0 0;border:0;align-items:center;gap:10px;margin:1px 0;padding:6px 10px;font-size:14px;line-height:1.4;transition:background .1s,color .1s;display:flex}.ws-settings__rail-item:hover{background:var(--hover)}.ws-settings__rail-item.is-active{background:var(--hover-strong);color:var(--text-strong);font-weight:600}.ws-settings__rail-item-icon{width:16px;height:16px;color:var(--muted);flex-shrink:0;place-items:center;display:grid}.ws-settings__rail-item-icon svg{width:16px;height:16px;display:block}.ws-settings__rail-item.is-active .ws-settings__rail-item-icon{color:var(--text-strong)}.ws-settings__rail-item-label{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.ws-settings__content{background:var(--bg);position:relative;overflow-y:auto}.ws-settings__content-inner{max-width:740px;padding:56px 80px 80px}.ws-settings__close{border:1px solid var(--line-strong);background:var(--panel);width:36px;height:36px;color:var(--text-strong);cursor:pointer;z-index:60;border-radius:50%;place-items:center;transition:background .12s,color .12s,border-color .12s;display:grid;position:fixed;top:28px;right:22px;box-shadow:0 1px 3px #00000026}@media (width<=760px){.ws-settings{padding:0}.ws-settings__panel{border:0;border-radius:0;max-width:none}}.ws-settings__close:hover{background:var(--panel-2);color:var(--text-strong);border-color:var(--line-strong)}.ws-settings__error{background:var(--panel-2);border:1px solid var(--line);border-radius:var(--radius);color:var(--danger);margin:0 0 20px;padding:14px 16px;font-size:13.5px}.ws-settings .ws-page__header{margin-bottom:32px}.ws-settings .ws-page__h1{letter-spacing:-.01em;color:var(--text-strong);font-size:28px;font-weight:700;line-height:1.2;font-family:var(--font-display);margin:0 0 8px}.ws-settings .ws-page__lead{color:var(--muted);margin:0;font-size:14px;line-height:1.5}.workspace-settings-empty{background:var(--panel-2);border:1px dashed var(--line);border-radius:var(--radius);color:var(--muted);padding:24px;font-size:14px;line-height:1.6}.workspace-settings-empty p{margin:0}.ws-section{border-top:1px solid var(--line);flex-direction:column;margin-top:24px;display:flex}.ws-section__h{color:var(--text-strong);margin:0;padding:18px 0 6px;font-size:14px;font-weight:700}.ws-row{border-top:1px solid var(--line);grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:24px;padding:18px 0;display:grid}.ws-section>.ws-row:first-child,.ws-section>.ws-section__h+.ws-row{border-top:0}.ws-row__main{min-width:0}.ws-row__label{color:var(--text-strong);margin-bottom:4px;font-size:14px;font-weight:600}.ws-row__hint{color:var(--muted);font-size:13px;line-height:1.5}.ws-row__hint b{color:var(--text-strong);font-weight:600}.ws-row__value{color:var(--text-strong);text-align:right;word-break:break-word;max-width:320px;font-size:14px;font-weight:500}.ws-row__control{flex-wrap:wrap;justify-content:flex-end;align-items:center;gap:8px;min-width:0;max-width:420px;display:flex}.ws-strip{background:var(--panel-2);border:1px solid var(--line);border-radius:var(--radius);align-items:center;gap:12px;margin-bottom:8px;padding:10px 14px;font-size:14px;display:flex}.ws-strip__avatar{background:linear-gradient(135deg, var(--brand-a), var(--brand-b));width:28px;height:28px;color:var(--brand-contrast);border-radius:6px;flex-shrink:0;place-items:center;font-size:12px;font-weight:700;display:grid;overflow:hidden}.ws-strip__avatar img{object-fit:cover;width:100%;height:100%;display:block}.ws-strip__name{color:var(--text-strong);font-weight:600}.ws-strip__pill{letter-spacing:.01em;border-radius:999px;margin-left:auto;padding:2px 10px;font-size:12px;font-weight:600}.ws-strip__pill--owner{background:color-mix(in srgb, var(--success) 15%, transparent);color:var(--success);border:1px solid color-mix(in srgb, var(--success) 32%, transparent)}.ws-strip__pill--moderator{background:color-mix(in srgb, var(--delivery-accent) 15%, transparent);color:var(--delivery-accent);border:1px solid color-mix(in srgb, var(--delivery-accent) 32%, transparent)}.ws-strip__pill--member,.ws-strip__pill--guest,.ws-strip__pill--bot{background:var(--panel-3,var(--hover));color:var(--text);border:1px solid var(--line)}.ws-input{background:var(--panel-2);border:1px solid var(--line);border-radius:var(--radius-sm);width:220px;max-width:100%;height:34px;color:var(--text-strong);font:inherit;padding:0 12px;font-size:14px}.ws-input:focus{border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-soft);outline:0}.ws-input:disabled{opacity:.65;cursor:not-allowed}.ws-select{background:var(--panel-2);border:1px solid var(--line);border-radius:var(--radius-sm);width:220px;max-width:100%;height:34px;color:var(--text-strong);font:inherit;padding:0 34px 0 10px;font-size:13.5px}.ws-select:focus{border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-soft);outline:0}.ws-select:disabled{opacity:.65;cursor:not-allowed}.ws-file{display:none}.ws-actions{border-top:1px solid var(--line);justify-content:flex-end;align-items:center;gap:12px;padding:14px 0 0;display:flex}.ws-status{min-height:20px;color:var(--muted);flex:1;margin:0;font-size:13px}.ws-status.is-error{color:var(--danger)}.ws-input[readonly]{cursor:default;color:var(--text)}.ws-btn{background:var(--panel-2);border:1px solid var(--line-strong);border-radius:var(--radius);height:34px;color:var(--text-strong);font:inherit;cursor:pointer;box-shadow:var(--key-edge);padding:0 14px;font-size:13.5px;font-weight:500;transition:background .12s,color .12s,border-color .12s,box-shadow 80ms,transform 80ms}.ws-btn:active:not(:disabled){box-shadow:var(--key-edge-pressed);transform:translateY(1px)}.ws-btn:hover:not(:disabled){background:var(--panel-3,var(--hover-strong));border-color:var(--line-strong)}.ws-btn:disabled{opacity:.55;cursor:not-allowed}.ws-btn--danger{color:var(--danger);border-color:var(--line)}.ws-btn--danger:hover:not(:disabled){background:color-mix(in srgb, var(--danger) 9%, transparent);border-color:var(--danger)}.ws-btn--primary{background:var(--accent);border-color:color-mix(in srgb, var(--accent) 70%, var(--text-strong));color:var(--accent-contrast);align-items:center;gap:6px;display:inline-flex}.ws-btn--primary:hover:not(:disabled){background:var(--accent-hover);border-color:var(--accent-hover)}.ws-btn--primary svg{width:14px;height:14px}.ws-settings__content:has(.ws-members-page){overflow:hidden}.ws-settings__content-inner:has(.ws-members-page){flex-direction:column;max-width:none;height:100%;min-height:0;padding:56px 80px 28px;display:flex}.ws-members-page{flex-direction:column;flex:1;min-height:0;display:flex}.ws-members-page__header{flex:none}.ws-members__toolbar{background:var(--bg);border-bottom:1px solid var(--line);flex-wrap:wrap;flex:none;justify-content:space-between;align-items:center;gap:16px;margin:4px 0 12px;padding:14px 0 12px;display:flex}.ws-members__count{color:var(--muted);text-transform:uppercase;letter-spacing:.06em;font-size:12.5px;font-weight:600}.ws-members__controls{flex-wrap:wrap;align-items:center;gap:8px;display:flex}.ws-members__search{align-items:center;display:flex;position:relative}.ws-members__search-icon{width:14px;height:14px;color:var(--muted);pointer-events:none;display:inline-flex;position:absolute;left:10px}.ws-members__search-icon svg{width:100%;height:100%}.ws-members__search-input{width:220px;height:34px;color:var(--text);background:var(--panel-2);border:1px solid var(--line);border-radius:6px;outline:none;padding:0 12px 0 32px;font-size:13px}.ws-members__search-input::-webkit-search-cancel-button{appearance:none}.ws-members__search-input:focus{border-color:var(--accent)}.ws-members__role-select{height:34px;color:var(--text);background:var(--panel-2);border:1px solid var(--line);cursor:pointer;border-radius:6px;outline:none;padding:0 28px 0 10px;font-size:13px}.ws-members__list{border:1px solid var(--line);background:var(--panel);border-radius:6px;flex:auto;min-height:0;overflow:hidden auto}.ws-members__row{border-bottom:1px solid var(--line);box-sizing:border-box;grid-template-columns:36px 1fr auto auto;align-items:center;gap:14px;padding:0 16px;display:grid}.ws-members__avatar{letter-spacing:-.02em;background:var(--accent-soft);width:36px;height:36px;color:var(--accent);border-radius:7px;flex-shrink:0;justify-content:center;align-items:center;font-size:13px;font-weight:600;display:inline-flex;overflow:hidden}.ws-members__avatar--bot{background:color-mix(in srgb, var(--warn) 18%, transparent);color:color-mix(in srgb, var(--warn) 72%, var(--text))}.ws-members__avatar img{object-fit:cover;width:100%;height:100%}.ws-members__main{flex-direction:column;gap:2px;min-width:0;display:flex}.ws-members__name{color:var(--text-strong,var(--text));white-space:nowrap;text-overflow:ellipsis;font-size:14px;font-weight:600;overflow:hidden}.ws-members__meta{color:var(--muted);white-space:nowrap;text-overflow:ellipsis;align-items:center;gap:6px;font-size:12.5px;display:flex;overflow:hidden}.ws-members__handle{font-family:var(--font-mono);color:var(--text);background:var(--bg);border:1px solid var(--line);border-radius:4px;padding:1px 6px;font-size:12px}.ws-members__dot{opacity:.6}.ws-members__pill{text-transform:capitalize;color:var(--text);white-space:nowrap;background:#7f7f7f24;border-radius:999px;padding:3px 10px;font-size:11.5px;font-weight:600}.ws-members__pill--owner{background:color-mix(in srgb, var(--success) 16%, transparent);color:var(--success)}.ws-members__pill--moderator{background:color-mix(in srgb, var(--delivery-accent) 16%, transparent);color:var(--delivery-accent)}.ws-members__pill--bot{background:var(--accent-soft);color:var(--accent)}.ws-members__pill--guest{background:color-mix(in srgb, var(--warn) 18%, transparent);color:color-mix(in srgb, var(--warn) 72%, var(--text))}.ws-members__actions{width:28px;height:28px;color:var(--muted);cursor:pointer;background:0 0;border:1px solid #0000;border-radius:6px;justify-content:center;align-items:center;display:inline-flex}.ws-members__actions:hover:not(:disabled){background:var(--bg);border-color:var(--line);color:var(--text)}.ws-members__actions:disabled{opacity:.45;cursor:not-allowed}.ws-members__empty{text-align:center;border:1px dashed var(--line);color:var(--muted);background:var(--panel);border-radius:8px;margin-top:24px;padding:36px 20px;font-size:13.5px}.ws-members__loading{color:var(--muted);text-align:center;border-top:1px solid var(--line);padding:10px 16px;font-size:12.5px}.ws-members__row--skeleton{height:64px}.ws-members__skeleton{background:linear-gradient(90deg,#7f7f7f14,#7f7f7f2e,#7f7f7f14) 0 0/200% 100%;border-radius:6px;animation:1.4s ease-in-out infinite ws-members-shimmer}.ws-members__skeleton--line{height:10px;margin:4px 0}.ws-members__skeleton--pill{border-radius:999px;width:64px;height:18px}@keyframes ws-members-shimmer{0%{background-position:200% 0}to{background-position:-200% 0}}@media (width<=760px){.ws-settings__panel{grid-template-rows:auto 1fr;grid-template-columns:1fr}.ws-settings__rail{border-right:0;border-bottom:1px solid var(--line);padding:10px}.ws-settings__content-inner{padding:32px 20px 60px}.ws-settings__close{top:10px;right:12px}}.ws-bots-page{flex-direction:column;gap:0;display:flex}.ws-bots__toolbar{background:var(--bg);border-bottom:1px solid var(--line);flex-wrap:wrap;justify-content:space-between;align-items:center;gap:16px;margin:4px 0 12px;padding:14px 0 12px;display:flex}.ws-bots__count{color:var(--muted);text-transform:uppercase;letter-spacing:.06em;font-size:12.5px;font-weight:600}.ws-bots__toolbar-actions{align-items:center;gap:8px;display:flex}.ws-bots__panel{background:var(--surface);border:1px solid var(--line);border-radius:8px;margin:8px 0 16px;padding:18px 20px}.ws-bots__empty{text-align:center;border:1px dashed var(--line);color:var(--muted);background:var(--surface);border-radius:8px;margin-top:16px;padding:36px 20px;font-size:13.5px}.ws-bots__list{flex-direction:column;margin-bottom:60px;display:flex}.ws-bots__row{border-bottom:1px solid var(--line)}.ws-bots__row:last-child{border-bottom:0}.ws-bots__row.is-expanded{background:var(--surface)}.ws-bots__row-main{text-align:left;cursor:pointer;width:100%;color:inherit;background:0 0;border:0;grid-template-columns:36px 1fr auto auto;align-items:center;gap:14px;padding:14px 16px;display:grid}.ws-bots__row-main:hover{background:var(--hover,#7f7f7f0f)}.ws-bots__row-text{flex-direction:column;gap:2px;min-width:0;display:flex}.ws-bots__row-name{color:var(--text-strong,var(--text));white-space:nowrap;text-overflow:ellipsis;font-size:14px;font-weight:600;overflow:hidden}.ws-bots__row-meta{color:var(--muted);white-space:nowrap;text-overflow:ellipsis;align-items:center;gap:6px;font-size:12.5px;display:flex;overflow:hidden}.ws-bots__owner-pill{color:var(--text);white-space:nowrap;background:#7f7f7f24;border-radius:999px;padding:3px 10px;font-size:11.5px;font-weight:600}.ws-bots__owner-pill--service{background:color-mix(in srgb, var(--delivery-accent) 16%, transparent);color:var(--delivery-accent)}.ws-bots__owner-pill--user{background:color-mix(in srgb, var(--warn) 18%, transparent);color:color-mix(in srgb, var(--warn) 72%, var(--text))}.ws-bots__chevron{width:20px;height:20px;color:var(--muted);justify-content:center;align-items:center;display:inline-flex}.ws-bots__detail{border-top:1px dashed var(--line);flex-direction:column;gap:12px;padding:4px 16px 18px;display:flex}.ws-bots__detail-header{flex-wrap:wrap;justify-content:space-between;align-items:flex-start;gap:16px;padding-top:14px;display:flex}.ws-bots__detail-title{color:var(--text-strong,var(--text));margin:0 0 4px;font-size:13.5px;font-weight:600}.ws-bots__detail-hint{color:var(--muted);max-width:60ch;margin:0;font-size:12.5px}.ws-bots__detail-actions{flex-wrap:wrap;gap:8px;display:flex}.ws-bots__detail-empty{color:var(--muted);background:var(--bg);border:1px dashed var(--line);border-radius:6px;margin:0;padding:16px;font-size:13px}.ws-bots__token-list{flex-direction:column;gap:8px;margin:0;padding:0;list-style:none;display:flex}.ws-bots__token-row{background:var(--bg);border:1px solid var(--line);border-radius:6px;flex-wrap:wrap;justify-content:space-between;align-items:flex-start;gap:10px 16px;padding:12px 14px;display:flex}.ws-bots__token-row>.ws-btn{flex-shrink:0}.ws-bots__token-main{flex-direction:column;flex:240px;gap:4px;min-width:0;display:flex}.ws-bots__token-name{color:var(--text-strong,var(--text));font-size:13.5px;font-weight:600}.ws-bots__token-meta{color:var(--muted);font-size:12.5px}.ws-bots__scope-row{flex-wrap:wrap;gap:6px;margin-top:2px;display:flex}.ws-bots__scope-chip{font-family:var(--font-mono);background:var(--bg);border:1px solid var(--line);color:var(--text);border-radius:999px;padding:2px 8px;font-size:11.5px}.ws-bots__scope-chip--bundle{color:var(--accent);background:color-mix(in srgb, var(--accent) 10%, transparent);border-color:color-mix(in srgb, var(--accent) 35%, transparent);font-family:inherit;font-weight:600}.ws-bots__scope-toggle{color:var(--muted);text-underline-offset:2px;cursor:pointer;background:0 0;border:none;padding:2px 4px;font-size:11.5px;text-decoration:underline}.ws-bots__scope-toggle:hover{color:var(--text)}.ws-bots__scope-details{margin-top:6px}.ws-bots__scope-details>summary{color:var(--muted);cursor:pointer;width:fit-content;font-size:11.5px}.ws-bots__scope-details[open]>summary{margin-bottom:6px}.ws-bots__form{flex-direction:column;gap:16px;display:flex}.ws-bots__form-header{flex-direction:column;gap:4px;display:flex}.ws-bots__form-title{color:var(--text-strong,var(--text));margin:0;font-size:16px;font-weight:600}.ws-bots__form-hint{color:var(--muted);max-width:60ch;margin:0;font-size:13px}.ws-bots__form-grid{grid-template-columns:1fr 1fr;gap:12px;display:grid}@media (width<=640px){.ws-bots__form-grid{grid-template-columns:1fr}}.ws-bots__form-field{border:0;flex-direction:column;gap:6px;min-width:0;margin:0;padding:0;display:flex}.ws-bots__form-label{color:var(--muted);text-transform:uppercase;letter-spacing:.04em;font-size:12px;font-weight:600}.ws-bots__form-input{height:34px;color:var(--text);background:var(--surface);border:1px solid var(--line);border-radius:6px;outline:none;padding:0 12px;font-size:13.5px}.ws-bots__form-input:focus{border-color:var(--accent)}.ws-bots__form-handle{background:var(--surface);border:1px solid var(--line);border-radius:6px;align-items:center;gap:6px;padding:0 10px;display:flex}.ws-bots__form-handle span{color:var(--muted);font-family:var(--font-mono);font-size:13px}.ws-bots__form-handle .ws-bots__form-input{background:0 0;border:0;flex:1;padding-left:0}.ws-bots__choices{flex-direction:column;gap:8px;display:flex}.ws-bots__choice{border:1px solid var(--line);background:var(--surface);cursor:pointer;border-radius:6px;grid-template-rows:auto auto;grid-template-columns:18px 1fr;gap:2px 10px;padding:10px 12px;display:grid}.ws-bots__choice.is-active{border-color:var(--accent);background:color-mix(in srgb, var(--accent) 7%, transparent)}.ws-bots__choice input{accent-color:var(--accent);grid-row:1/span 2;align-self:center}.ws-bots__choice-title{color:var(--text-strong,var(--text));font-size:13.5px;font-weight:600}.ws-bots__choice-hint{color:var(--muted);font-size:12.5px}.ws-bots__form-error{background:color-mix(in srgb, var(--danger) 9%, transparent);color:var(--danger);border:1px solid color-mix(in srgb, var(--danger) 32%, transparent);border-radius:6px;margin:0;padding:10px 12px;font-size:13px}.ws-bots__form-actions{justify-content:flex-end;gap:8px;display:flex}.ws-bots__token-form-panel{background:var(--bg);border:1px solid var(--line);border-radius:6px;padding:14px}.ws-bots__token-form .ws-bots__choices{grid-template-columns:repeat(3,minmax(0,1fr));display:grid}@media (width<=720px){.ws-bots__token-form .ws-bots__choices{grid-template-columns:1fr}}.ws-bots__reveal{background:var(--surface);border:1px solid var(--accent);border-radius:8px;flex-direction:column;gap:14px;margin:8px 0 16px;padding:18px 20px;display:flex}.ws-bots__reveal-header{flex-direction:column;gap:4px;display:flex}.ws-bots__reveal-title{color:var(--text-strong,var(--text));margin:0;font-size:16px;font-weight:600}.ws-bots__reveal-hint{color:var(--muted);max-width:60ch;margin:0;font-size:13px}.ws-bots__reveal-hint code{background:var(--bg);border:1px solid var(--line);font-family:var(--font-mono);color:var(--text);white-space:nowrap;border-radius:4px;padding:1px 6px;font-size:12px}.ws-bots__reveal-field{flex-direction:column;gap:6px;display:flex}.ws-bots__reveal-label{color:var(--muted);text-transform:uppercase;letter-spacing:.04em;font-size:12px;font-weight:600}.ws-bots__reveal-row{align-items:center;gap:8px;display:flex}.ws-bots__reveal-input{height:34px;font-family:var(--font-mono);color:var(--text);background:var(--bg);border:1px solid var(--line);border-radius:6px;flex:1;padding:0 12px;font-size:13px}.ws-bots__reveal-snippet-header{justify-content:space-between;align-items:center;gap:8px;display:flex}.ws-bots__reveal-details{border:1px solid var(--line);background:var(--bg);border-radius:6px}.ws-bots__reveal-summary{color:var(--muted);text-transform:uppercase;letter-spacing:.04em;cursor:pointer;-webkit-user-select:none;user-select:none;padding:10px 14px;font-size:11px;font-weight:600}.ws-bots__reveal-summary:hover{color:var(--text)}.ws-bots__reveal-details-body{gap:8px;padding:0 14px 12px;display:grid}.ws-bots__reveal-details-body .ws-bots__reveal-hint{margin:0}.ws-bots__setup-mode{background:var(--bg);border:1px solid var(--line);border-radius:6px;grid-template-columns:repeat(2,minmax(0,1fr));width:min(320px,100%);padding:3px;display:inline-grid}.ws-bots__setup-mode button{min-height:30px;color:var(--muted);font:inherit;cursor:pointer;background:0 0;border:0;border-radius:4px;padding:0 12px;font-size:12.5px;font-weight:600}.ws-bots__setup-mode button.is-active{background:var(--surface);color:var(--text);box-shadow:0 0 0 1px var(--line)}.ws-bots__reveal-snippet{background:var(--bg);border:1px solid var(--line);font-family:var(--font-mono);color:var(--text);white-space:pre-wrap;border-radius:6px;margin:0;padding:12px 14px;font-size:12.5px;overflow-x:auto}.ws-bots__reveal-ack{color:var(--text);align-items:center;gap:8px;font-size:13px;display:flex}.ws-bots__reveal-actions{justify-content:flex-end;display:flex}.ws-bots__my-list{flex-direction:column;gap:18px;display:flex}.ws-bots__my-group{flex-direction:column;gap:8px;display:flex}.ws-bots__my-group-header{justify-content:space-between;align-items:center;gap:12px;display:flex}.ws-bots__my-group-title{color:var(--muted);text-transform:uppercase;letter-spacing:.06em;margin:0;font-size:13px;font-weight:600}.ws-bots__my-rows{border:1px solid var(--line);background:var(--surface);border-radius:6px;flex-direction:column;margin:0;padding:0;list-style:none;display:flex}.ws-bots__my-row{border-bottom:1px solid var(--line);grid-template-columns:36px 1fr auto;align-items:center;gap:14px;padding:12px 14px;display:grid}.ws-bots__my-row:last-child{border-bottom:0}.ws-bots__my-row-text{flex-direction:column;gap:2px;min-width:0;display:flex}.ws-bots__my-row-name{color:var(--text-strong,var(--text));font-size:14px;font-weight:600}.ws-bots__my-row-meta{color:var(--muted);align-items:center;gap:6px;font-size:12.5px;display:flex}.appearance-preview{border:1px solid var(--line-strong);border-radius:var(--radius-lg);background:var(--bg);overflow:hidden}.appearance-preview__bar{border-bottom:1px solid var(--line);background:var(--panel);color:var(--text-strong);align-items:baseline;gap:8px;padding:9px 14px;font-size:12px;font-weight:700;display:flex}.appearance-preview__hash{color:var(--accent)}.appearance-preview__topic{color:var(--muted);font-size:11.5px;font-weight:500}.appearance-preview__chat{gap:14px;padding:14px 16px 16px;display:grid}.appearance-preview[data-density=compact] .appearance-preview__chat{gap:7px;padding:10px 14px 12px}.appearance-preview__msg{grid-template-columns:34px minmax(0,1fr);gap:10px;display:grid}.appearance-preview[data-density=compact] .appearance-preview__msg{grid-template-columns:24px minmax(0,1fr);gap:8px}.appearance-preview__avatar{background:var(--accent);width:34px;height:34px;color:var(--accent-contrast);border-radius:9px;place-items:center;font-size:14px;font-weight:700;display:grid}.appearance-preview[data-density=compact] .appearance-preview__avatar{border-radius:7px;width:24px;height:24px;font-size:11px}.appearance-preview__avatar.is-agent{background:var(--accent-2)}.appearance-preview__body{gap:3px;min-width:0;display:grid}.appearance-preview[data-density=compact] .appearance-preview__body{gap:1px}.appearance-preview__head{align-items:baseline;gap:7px;display:flex}.appearance-preview__who{color:var(--text-strong);font-size:13px;font-weight:700}.appearance-preview[data-density=compact] .appearance-preview__who{font-size:12px}.appearance-preview__when{color:var(--muted);font-size:10px}.appearance-preview__text{font-size:13px;line-height:1.5}.appearance-preview[data-density=compact] .appearance-preview__text{font-size:12.5px;line-height:1.4}.appearance-preview__activity{background:color-mix(in srgb, var(--accent-2) 9%, var(--panel));color:var(--muted);border-radius:7px 7px 0 0;margin-top:3px;padding:6px 10px;font-size:11.5px}.appearance-preview__activity code{color:var(--text-strong);font-family:var(--font-mono,ui-monospace, monospace);font-size:10.5px}.appearance-preview__answer{background:color-mix(in srgb, var(--accent) 7%, var(--panel));border-radius:0 0 7px 7px;padding:7px 10px 8px;font-size:13px;line-height:1.5}.appearance-preview[data-density=compact] .appearance-preview__activity{padding:4px 8px;font-size:11px}.appearance-preview[data-density=compact] .appearance-preview__answer{padding:5px 8px 6px;font-size:12.5px}.appearance-preview[data-layout=outlined] .appearance-preview__activity{border:1px solid color-mix(in srgb, var(--accent-2) 45%, var(--line));background:0 0;border-bottom:0}.appearance-preview[data-layout=outlined] .appearance-preview__answer{border:1px solid color-mix(in srgb, var(--accent) 40%, var(--line));background:0 0}.appearance-preview__reactions{gap:5px;margin-top:5px;display:flex}.appearance-preview[data-density=compact] .appearance-preview__reactions{margin-top:2px}.appearance-preview__reaction{border:1px solid var(--line);background:var(--panel);color:var(--muted);border-radius:999px;padding:2px 8px;font-size:11px}.appearance-preview__reaction.is-mine{border-color:var(--accent);background:color-mix(in srgb, var(--accent) 12%, var(--panel));color:var(--text-strong)}.appearance-preview__caption{color:var(--muted-2);text-align:right;margin:-14px 2px 0;font-size:11px}.appearance-rows{display:grid}.appearance-row{grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:24px;padding:14px 0;display:grid}.appearance-row+.appearance-row{border-top:1px solid var(--line)}.appearance-row__meta{gap:2px;display:grid}.appearance-row__label{color:var(--text-strong);font-size:13.5px;font-weight:650}.appearance-row__desc{color:var(--muted);font-size:12px}.appearance-row__control{align-items:center;gap:12px;display:inline-flex}.appearance-seg{border:1px solid var(--line);border-radius:var(--radius-lg);background:var(--panel-2);gap:2px;padding:2px;display:inline-flex}.appearance-seg__btn{color:var(--muted);cursor:pointer;background:0 0;border:1px solid #0000;border-radius:8px;padding:5px 12px;font-size:12.5px;font-weight:600}.appearance-seg__btn:hover{color:var(--text-strong)}.appearance-seg__btn:focus-visible{outline:2px solid var(--accent);outline-offset:1px}.appearance-seg__btn.is-active{border-color:var(--line-strong);background:var(--panel);color:var(--text-strong);box-shadow:0 1px 2px #10151d1a}.board-chips__name{min-width:44px;color:var(--muted);text-align:right;font-size:12px}.board-chips{align-items:center;gap:10px;display:inline-flex}.board-chip{border:1px solid var(--line-strong);background:linear-gradient(135deg, var(--panel) 52%, var(--accent) 52%);cursor:pointer;border-radius:8px;width:26px;height:26px;padding:0;position:relative}.board-chip:focus-visible{outline:2px solid var(--accent);outline-offset:4px}.board-chip.is-active:after{content:"";border:2px solid var(--accent);border-radius:11px;position:absolute;inset:-5px}@media (width<=640px){.appearance-row{grid-template-columns:1fr;gap:10px}.appearance-row__control,.board-chips__name{text-align:left;justify-self:start}}.ws-intg-page{padding-bottom:60px}.ws-intg__app-icon{background:var(--surface);border:1px solid var(--line);width:36px;height:36px;color:var(--text);border-radius:8px;flex-shrink:0;justify-content:center;align-items:center;display:inline-flex}.ws-intg__wizard{background:var(--surface);border:1px solid var(--line);border-radius:8px;flex-direction:column;gap:16px;margin:8px 0 16px;padding:18px 20px;display:flex}.ws-intg__wizard-header{justify-content:space-between;align-items:flex-start;gap:16px;display:flex}.ws-intg__wizard-step{color:var(--muted);white-space:nowrap;padding-top:2px;font-size:11.5px;font-weight:600}.ws-intg__wizard-body{flex-direction:column;gap:14px;display:flex}.ws-intg__catalog{grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:12px;display:grid}.ws-intg__catalog-card{border:1px solid var(--line);text-align:left;cursor:pointer;color:inherit;background:0 0;border-radius:8px;flex-direction:column;align-items:flex-start;gap:8px;padding:16px;transition:border-color .12s,background .12s;display:flex}.ws-intg__catalog-card:hover{border-color:var(--accent);background:var(--hover,#7f7f7f0f)}.ws-intg__catalog-name{color:var(--text-strong,var(--text));font-size:14px;font-weight:600}.ws-intg__catalog-desc{color:var(--muted);font-size:12.5px;line-height:1.45}.ws-intg__chips{flex-wrap:wrap;gap:6px;margin-bottom:8px;display:flex}.ws-intg__chip{background:color-mix(in srgb, var(--accent) 14%, transparent);color:var(--text);border-radius:999px;align-items:center;gap:6px;padding:3px 6px 3px 10px;font-size:12px;font-weight:600;display:inline-flex}.ws-intg__chip-remove{width:16px;height:16px;color:var(--muted);cursor:pointer;background:0 0;border:0;border-radius:50%;justify-content:center;align-items:center;font-size:13px;line-height:1;display:inline-flex}.ws-intg__chip-remove:hover{color:var(--text);background:#7f7f7f2e}.ws-intg__member-results{border:1px solid var(--line);background:var(--surface);border-radius:8px;flex-direction:column;gap:2px;max-height:220px;margin:6px 0 0;padding:4px;list-style:none;display:flex;overflow-y:auto}.ws-intg__member-result{text-align:left;cursor:pointer;width:100%;color:inherit;background:0 0;border:0;border-radius:6px;align-items:center;gap:8px;padding:7px 10px;font-size:13px;display:flex}.ws-intg__member-result:hover{background:var(--hover,#7f7f7f14)}.ws-intg__toggle{cursor:pointer;align-items:flex-start;gap:10px;display:flex}.ws-intg__toggle input[type=checkbox]{flex-shrink:0;margin-top:3px}.ws-intg__toggle>span{flex-direction:column;gap:2px;display:flex}.ws-intg__panel{border:1px solid var(--line);background:var(--surface);border-radius:8px;flex-direction:column;gap:12px;padding:14px 16px;display:flex}.ws-intg__panel-header{flex-wrap:wrap;justify-content:space-between;align-items:flex-start;gap:16px;display:flex}.ws-intg__panel-title{color:var(--text-strong,var(--text));margin:0 0 3px;font-size:13px;font-weight:600}.ws-intg__panel-hint{color:var(--muted);max-width:560px;margin:0;font-size:12.5px;line-height:1.45}.ws-intg__panel-empty{color:var(--muted);margin:0;font-size:12.5px}.ws-intg__inline-form{border:1px dashed var(--line);border-radius:8px;flex-direction:column;gap:12px;padding:14px;display:flex}.ws-intg__item-list{flex-direction:column;margin:0;padding:0;list-style:none;display:flex}.ws-intg__item-row{border-bottom:1px solid var(--line);justify-content:space-between;align-items:flex-start;gap:14px;padding:11px 0;display:flex}.ws-intg__item-row:last-child{border-bottom:0}.ws-intg__item-row--stacked{flex-direction:column;align-items:stretch}.ws-intg__item-top{justify-content:space-between;align-items:flex-start;gap:14px;display:flex}.ws-intg__item-main{flex-direction:column;gap:4px;min-width:0;display:flex}.ws-intg__item-name{color:var(--text-strong,var(--text));font-size:13.5px;font-weight:600}.ws-intg__item-meta{color:var(--muted);overflow-wrap:anywhere;font-size:12px}.ws-intg__url{font-family:var(--mono,ui-monospace, monospace);font-size:11.5px}.ws-intg__item-actions{flex-wrap:wrap;flex-shrink:0;justify-content:flex-end;align-items:center;gap:8px;display:flex}.ws-intg__type-chips{flex-wrap:wrap;gap:5px;display:flex}.ws-intg__secret{border:1px solid color-mix(in srgb, var(--warn) 45%, var(--line));background:color-mix(in srgb, var(--warn) 7%, transparent);border-radius:8px;flex-direction:column;gap:6px;margin-top:6px;padding:10px 12px;display:flex}.ws-intg__secret-label{text-transform:uppercase;letter-spacing:.05em;color:var(--muted);font-size:11px;font-weight:700}.ws-intg__secret-row{align-items:center;gap:8px;display:flex}.ws-intg__secret-row .ws-bots__reveal-input{flex:1;min-width:0}.ws-intg__confirm{border:1px solid color-mix(in srgb, var(--danger,#d33) 40%, var(--line));background:color-mix(in srgb, var(--danger,#d33) 6%, transparent);border-radius:8px;flex-direction:column;gap:12px;padding:14px 16px;display:flex}.ws-intg__confirm-text{color:var(--text);margin:0;font-size:13px;line-height:1.5}.ws-intg__event-grid{grid-template-columns:repeat(auto-fill,minmax(230px,1fr));gap:6px;margin-top:10px;display:grid}.ws-intg__event-option{border:1px solid var(--line);cursor:pointer;border-radius:6px;align-items:center;gap:8px;padding:7px 10px;font-size:12px;display:flex}.ws-intg__event-option.is-active{border-color:var(--accent);background:color-mix(in srgb, var(--accent) 8%, transparent)}.ws-intg__deliveries{border-top:1px dashed var(--line);flex-direction:column;gap:8px;padding-top:10px;display:flex}.ws-intg__deliveries-scroll{border:1px solid var(--line);border-radius:8px;max-height:420px;overflow-y:auto}.ws-intg__delivery{border-bottom:1px solid var(--line)}.ws-intg__delivery:last-child{border-bottom:0}.ws-intg__delivery-row{text-align:left;cursor:pointer;width:100%;color:inherit;background:0 0;border:0;grid-template-columns:84px 1fr auto auto;align-items:center;gap:12px;padding:10px 12px;font-size:12.5px;display:grid}.ws-intg__delivery-row:hover{background:var(--hover,#7f7f7f0f)}.ws-intg__delivery-status{text-align:center;white-space:nowrap;border-radius:999px;padding:2px 8px;font-size:11px;font-weight:700}.ws-intg__delivery-status--ok{background:color-mix(in srgb, var(--delivery-accent,#2a9d5c) 16%, transparent);color:var(--delivery-accent,#2a9d5c)}.ws-intg__delivery-status--fail{background:color-mix(in srgb, var(--danger,#d33) 14%, transparent);color:var(--danger,#d33)}.ws-intg__delivery-type{text-overflow:ellipsis;white-space:nowrap;font-size:11.5px;overflow:hidden}.ws-intg__delivery-attempt,.ws-intg__delivery-time{color:var(--muted);white-space:nowrap;font-size:11.5px}.ws-intg__delivery-detail{flex-direction:column;gap:10px;padding:4px 12px 14px;display:flex}.ws-intg__delivery-block{flex-direction:column;gap:4px;display:flex}.ws-intg__delivery-block .ws-bots__reveal-snippet{max-height:260px;overflow:auto}.ws-intg__deliveries-more{justify-content:center;display:flex}.ws-intg__deliveries-retry{justify-content:space-between;align-items:center;gap:12px;display:flex}.ws-intg__section{flex-direction:column;gap:12px;margin-top:28px;display:flex}.ws-intg__section-title{color:var(--text-strong,var(--text));margin:0;font-size:15px;font-weight:600}.ws-intg__section-hint{color:var(--muted);margin:-6px 0 0;font-size:12.5px}.ws-bots__choice.is-disabled{opacity:.55;cursor:not-allowed}.settings-signout{border-top:1px solid var(--line);flex-wrap:wrap;justify-content:space-between;align-items:center;gap:16px;margin-top:24px;padding-top:20px;display:flex}.settings-signout strong{color:var(--text-strong);display:block}.settings-signout p{color:var(--muted);margin:2px 0 0;font-size:12.5px}.settings-signout .profile-actions{padding-top:0}.settings-password{border-top:1px solid var(--line);margin-top:24px;padding-top:20px}.settings-password__intro strong{color:var(--text-strong);display:block}.settings-password__intro p{color:var(--muted);margin:2px 0 0;font-size:12.5px} diff --git a/apps/api/internal/webassets/dist/_app/immutable/assets/QuoteBlock.Bmfc9wvU.css b/apps/api/internal/webassets/dist/_app/immutable/assets/QuestionCard.Bmfc9wvU.css similarity index 100% rename from apps/api/internal/webassets/dist/_app/immutable/assets/QuoteBlock.Bmfc9wvU.css rename to apps/api/internal/webassets/dist/_app/immutable/assets/QuestionCard.Bmfc9wvU.css diff --git a/apps/api/internal/webassets/dist/_app/immutable/chunks/TM-oTWC2.js b/apps/api/internal/webassets/dist/_app/immutable/chunks/2-3ayDfx.js similarity index 54% rename from apps/api/internal/webassets/dist/_app/immutable/chunks/TM-oTWC2.js rename to apps/api/internal/webassets/dist/_app/immutable/chunks/2-3ayDfx.js index f50c14fb1..cdc7d78d1 100644 --- a/apps/api/internal/webassets/dist/_app/immutable/chunks/TM-oTWC2.js +++ b/apps/api/internal/webassets/dist/_app/immutable/chunks/2-3ayDfx.js @@ -1,4 +1,4 @@ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./DhPY4Pzy.js","./uBIymjUX.js"])))=>i.map(i=>d[i]); -import{t as e}from"./DK3Fl9T5.js";import{At as t,B as n,C as r,D as i,E as a,Et as o,F as s,G as c,I as l,K as u,N as d,O as f,P as p,R as m,S as h,St as g,Tt as _,V as v,X as y,Z as b,_ as x,a as S,at as C,b as w,c as T,ct as E,dt as D,f as O,ft as k,gt as A,h as j,ht as M,it as N,j as P,jt as F,k as ee,kt as te,lt as I,m as L,mt as R,n as ne,nt as re,o as ie,p as z,pt as B,r as ae,s as oe,tt as V,u as se,ut as ce,v as le,vt as H,xt as ue,yt as U,z as W}from"./CxKeDCcw.js";import{c as de,n as fe,t as pe}from"./ChC1oWd7.js";import{t as me}from"./uBIymjUX.js";import"./xihTtKlq.js";import"./qQG-ipvL.js";import{a as he,c as ge,i as _e,l as ve,n as G,s as ye,t as be,u as xe}from"./DEPNME54.js";import{c as Se,d as Ce,f as we,h as Te,i as Ee,l as De,m as Oe,n as ke,p as Ae,r as je,s as Me,t as Ne,u as Pe}from"./Dqjw8vaP.js";import{a as Fe,i as K,n as Ie,t as Le}from"./Qo16U5GS.js";import{t as Re}from"./OQjxVT6U.js";import"./CYM1xkwL.js";import{C as q,D as ze,E as Be,I as Ve,L as He,R as Ue,S as We,T as Ge,_ as Ke,b as qe,f as Je,g as J,h as Ye,j as Xe,k as Ze,m as Y,p as Qe,r as X,u as Z,v as Q,w as $e,x as et,y as tt}from"./BqBbEnKW.js";import{a as nt,c as rt,f as it,i as at,l as ot,o as st,p as ct,s as lt,t as ut,u as dt}from"./C7NZ0SeM.js";import{i as ft,n as pt,r as mt,t as ht}from"./CyT438p0.js";import{n as gt,t as _t}from"./DlGnnCJo.js";import{n as vt,r as yt,t as bt}from"./Cht-DoaS.js";import{p as xt,r as St}from"./CVdgRPye.js";import{r as Ct,t as wt}from"./BIhzYFGW.js";var Tt={url:`/`,label:`cc`};function Et(e){if(e.startsWith(`//`))return!1;try{if(e.startsWith(`/`)){let t=`https://clickclack.invalid`;return new URL(e,t).origin===t}let t=new URL(e);return(t.protocol===`http:`||t.protocol===`https:`)&&t.host!==``&&!t.username&&!t.password}catch{return!1}}function Dt(e){if(!e||typeof e!=`object`)return Tt;let t=e,n=typeof t.url==`string`?t.url:``,r=n.trim(),i=typeof t.label==`string`?t.label.trim():``,a=/[\u0000-\u001f\u007f\\]/u.test(n);return{url:r&&!a&&Et(r)?r:Tt.url,label:i&&Array.from(i).length<=32?i:Tt.label}}function Ot(e){return e===Tt.label}function kt(e){return Ot(e.label)?`ClickClack home`:`${e.label} home`}async function At(e){try{return Dt(await e(`/api/home-link`))}catch{return Tt}}var jt=`clickclack:browser-notifications-enabled:v1:`;function Mt(e){return`${jt}${e}`}function Nt(e){if(!e)return!1;try{return window.localStorage.getItem(Mt(e))===`enabled`}catch{return!1}}function Pt(e,t){if(!e)return!1;try{return t?window.localStorage.setItem(Mt(e),`enabled`):window.localStorage.removeItem(Mt(e)),!0}catch{return!1}}var Ft=typeof window>`u`?void 0:window.clickclackDesktop;function It(e,t){let n={width:0,height:0,durationMS:0},r=e.type.startsWith(`image/`);return t.aborted||!r&&!e.type.startsWith(`video/`)?Promise.resolve(n):new Promise(i=>{let a=URL.createObjectURL(e),o=r?new Image:document.createElement(`video`),s=r?`load`:`loadedmetadata`;function c(e=n){o.removeEventListener(s,u),o.removeEventListener(`error`,l),t.removeEventListener(`abort`,l),o.removeAttribute(`src`),o instanceof HTMLVideoElement&&o.load(),URL.revokeObjectURL(a),i(e)}function l(){c()}function u(){c(o instanceof HTMLImageElement?{width:o.naturalWidth,height:o.naturalHeight,durationMS:0}:{width:o.videoWidth,height:o.videoHeight,durationMS:Number.isFinite(o.duration)&&o.duration>0?Math.round(o.duration*1e3):0})}o instanceof HTMLVideoElement&&(o.preload=`metadata`,o.muted=!0),o.addEventListener(s,u),o.addEventListener(`error`,l),t.addEventListener(`abort`,l,{once:!0}),o.src=a})}var Lt=new Set([`agent_commentary`,`agent_tool`]),Rt=18e4;function zt(e){return e.kind!==void 0&&Lt.has(e.kind)}function Bt(e){return e.kind===void 0||e.kind===`message`}function Vt(e){return e.author?.id||e.author_id||``}function Ht(e){return`${e.channel_id?`channel:${e.channel_id}`:`direct:${e.direct_conversation_id||``}`}\u0000${Vt(e)}\u0000${e.turn_id||e.id}`}function Ut(e){let t=e.trim(),n=``,r=``,i=t.match(/^\*\*([^*]+)\*\*\s*\n+([\s\S]+)$/),a=t.match(/^\*\*([^*]+)\*\*$/);if(i)n=i[1].trim(),r=Gt(i[2]);else if(a)n=a[1].trim();else return Wt(t.replace(/\*\*/g,``).trim(),``);return Wt(n,r)}function Wt(e,t){let n=Gt(e),r=n.indexOf(` `),i,a;r===-1?(i=n,a=``):(i=n.slice(0,r),a=n.slice(r+1).trim());let o=[a,t].filter(e=>e.length>0).join(` · `);return{name:i,detail:o||void 0}}function Gt(e){return e.replace(/\s+/g,` `).trim()}function Kt(e,t,n,r){let i=[];for(let e of t)if(e.kind===`agent_tool`){if(r.hideToolCalls)continue;let t=Ut(e.body);i.push({type:`tool`,id:e.id,name:t.name,detail:t.detail,full:e.body.trim()})}else{if(r.hideCommentary)continue;let t=e.body.trim();t&&i.push({type:`commentary`,id:e.id,body:t})}return i.length===0?null:{turnId:e,items:i,final:n}}function qt(e,t,n=Date.now()){let r=new Map,i=new Map;for(let t=0;to.firstIndex;if(!r){let e=Date.parse(o.rows[o.rows.length-1].created_at);Number.isFinite(e)&&n-e>Rt&&(r=!0)}a.set(t,r)}let o=[];for(let n=0;n=gn)&&(_n.active=!0,_n.lastPingAt=t,bn(e,`typing.started`)),_n.idleTimer&&window.clearTimeout(_n.idleTimer),_n.idleTimer=window.setTimeout(()=>{_n&&=(Sn(_n),null)},hn)}async function Sn(e){e.idleTimer&&window.clearTimeout(e.idleTimer),e.active&&await bn(e.scope,`typing.stopped`)}function Cn(){_n&&=(Sn(_n),null)}var wn=2e3,Tn=2097152;function En(e){let t=document.createElement(`span`);return t.textContent=e,t.innerHTML}function Dn(e,t,n){return!t||e.length>262144?Promise.resolve(En(e)):new Promise((r,i)=>{let a=new Worker(new URL(new URL(`../workers/highlight.worker-B65U9hWZ.js`,import.meta.url).href,``+import.meta.url),{type:`module`}),o=!1,s=e=>{o||(o=!0,clearTimeout(l),n.removeEventListener(`abort`,c),a.terminate(),e())},c=()=>s(()=>i(new DOMException(`Syntax highlighting was aborted.`,`AbortError`))),l=window.setTimeout(()=>s(()=>r(En(e))),wn);if(a.onmessage=t=>{let n=t.data;`error`in n?s(()=>r(En(e))):s(()=>r(n.html))},a.onerror=()=>s(()=>r(En(e))),n.addEventListener(`abort`,c,{once:!0}),n.aborted){c();return}a.postMessage({source:e,language:t,outputLimit:Tn})})}var On=5e3;function kn(e,t,n){return new Promise((r,i)=>{let a=new Worker(new URL(new URL(`../workers/office.worker-BdyMEpKK.js`,import.meta.url).href,``+import.meta.url),{type:`module`}),o=!1,s=e=>{o||(o=!0,clearTimeout(l),n.removeEventListener(`abort`,c),a.terminate(),e())},c=()=>s(()=>i(new DOMException(`Office preview was aborted.`,`AbortError`))),l=window.setTimeout(()=>s(()=>i(Error(`Office preview took too long and was stopped.`))),On);if(a.onmessage=t=>{let n=t.data;if(`error`in n){s(()=>i(Error(n.error)));return}if(n.kind!==e){s(()=>i(Error(`Office preview returned an unexpected result.`)));return}s(()=>r(n.preview))},a.onerror=()=>s(()=>i(Error(`Could not parse this Office file safely.`))),n.addEventListener(`abort`,c,{once:!0}),n.aborted){c();return}let u=t.byteOffset===0&&t.buffer instanceof ArrayBuffer&&t.byteLength===t.buffer.byteLength?t:t.slice(),d={kind:e,bytes:u};a.postMessage(d,[u.buffer])})}var An=16777216,jn=1e4,Mn=1e4,Nn=`This PDF page is too large to preview safely. Download the original to open it locally.`;function Pn(e,t){if(!Number.isSafeInteger(e)||!Number.isSafeInteger(t)||e<1||t<1||e>8192||t>8192||e*t>16777216)throw Error(Nn)}var Fn=new URL(`../assets/pdf.worker.TGcf_-kp.mjs`,import.meta.url).href,In=l(`
`),Ln=l(`

Preparing a safe preview.

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

You can still download the original file.

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

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

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

`),Yn=l(`

`),Xn=l(`

`),Zn=l(`

Some slide content was omitted by preview limits.

`),Qn=l(`

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

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

or

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

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

Welcome.

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

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

Creating workspace…

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

No pinned messages

Pin important messages to keep them easily accessible.

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

Pinned Messages

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

`),ki=l(`
No messages found

Try another word or phrase.

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

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

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

      Browser notifications are not supported on this device.

      `),ea=l(`

      Browser notifications are blocked by this browser.

      `),ta=l(`

      `),na=l(`

      Show alerts when ClickClack is in the background.

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

      Shown in messages, mentions, and your profile card.

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

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

      Conversation display

      Keep agent reasoning summaries out of the message timeline.

      Hide tool execution details while keeping ordinary messages visible.

      Choose which side of the timeline shows your messages.

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

      Notifications

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

      Desktop

      Mobile push

      Send push notifications to your phone via Pushover.

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

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

      Loading…

      `),ua=l(`

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

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

        Account

        My bots

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

        `,1);function _a(e,r){o(r,!0);let i=A(B([])),a=A(`loading`),s=A(``);ae(()=>{c()});async function c(){M(a,`loading`);try{M(i,await xt(),!0),M(a,`ready`)}catch(e){M(a,`error`),M(s,St(e),!0)}}function l(e){r.onClose(),fe(Fe(e.workspace.route_id||e.workspace.id,`bots`))}function h(e){return e.startsWith(`@`)?e:`@${e}`}function g(e){let t=e.trim().split(/\s+/).filter(Boolean);return t.length>=2?(t[0][0]+t[1][0]).toUpperCase():e.slice(0,2).toUpperCase()}let v=U(()=>{let e=new Map;for(let t of u(i)){let n=t.workspace.id,r=e.get(n);r?r.entries.push(t):e.set(n,{workspace:t.workspace,entries:[t]})}return[...e.values()].sort((e,t)=>e.workspace.name.localeCompare(t.workspace.name))});var y=ga(),b=k(ce(y),2),x=e=>{var t=la();p(e,t)},S=e=>{var t=ua(),n=D(t,!0);N(()=>d(n,u(s))),p(e,t)},C=e=>{var t=da();p(e,t)},w=e=>{var r=ha();f(r,21,()=>u(v),e=>e.workspace.id,(e,r)=>{var i=ma(),a=I(i),o=I(a),s=D(o,!0),c=k(o,2);t(a);var _=k(a,2);f(_,21,()=>u(r).entries,e=>e.bot.id,(e,r)=>{var i=pa(),a=I(i),o=I(a),s=e=>{var t=fa();N(()=>z(t,`src`,u(r).bot.avatar_url)),p(e,t)},c=e=>{var t=m();N(e=>d(t,e),[()=>g(u(r).bot.display_name||u(r).bot.handle||`?`)]),p(e,t)};P(o,e=>{u(r).bot.avatar_url?e(s):e(c,-1)}),t(a);var f=k(a,2),_=I(f),v=D(_,!0),y=k(_,2),b=I(y),x=D(b,!0),S=k(b,4),C=D(S);t(y),t(f);var w=k(f,2);t(i),N(e=>{d(v,u(r).bot.display_name||u(r).bot.handle),d(x,e),d(C,`${u(r).active_token_count??``} - active ${u(r).active_token_count===1?`token`:`tokens`}`)},[()=>h(u(r).bot.handle)]),n(`click`,w,()=>l(u(r))),p(e,i)}),t(_),t(i),N(()=>d(s,u(r).workspace.name)),n(`click`,c,()=>l(u(r).entries[0])),p(e,i)}),t(r),p(e,r)};P(b,e=>{u(a)===`loading`?e(x):u(a)===`error`?e(S,1):u(i).length===0?e(C,2):e(w,-1)}),p(e,y),_()}W([`click`]);function va(e,t){return t.includes(`password`)&&e.password_enrolled===!0}function ya(e,t,n){return e?t?[...t].length<8?`New password must be at least 8 characters.`:t===n?``:`New passwords do not match.`:`Enter a new password.`:`Enter your current password.`}var ba=l(`

        `),xa=l(``),Sa=l(`
        Change password

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

        The password you signed in with.

        At least 8 characters. Longer is better than clever.

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

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

        Account

        Appearance

        Changes apply instantly and follow your account on every device.

        Live preview — updates as you pick

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

          `),Pa=l(`

          Loading...

          `),Fa=l(`

          `),Ia=l(`

          `),La=l(`

          Account

          Profile settings

          How you appear across ClickClack.

          Sign out

          End this session on this device.

          `,1),Ra=l(`

          Account

          Notifications

          Decide when and how ClickClack should reach you.

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

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

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

          `,1),co=l(`

          ClickClack

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

          `);function ho(e,r){o(r,!0);function i(e){return e===`muted`?`Channel muted - click to change`:e===`mentions`?`Notifications for @mentions only - click to change`:`All notifications enabled - click to change`}let a=S(r,`pinnedOpen`,3,!1),s=S(r,`channelNotifPreference`,3,void 0),c=S(r,`channelNotifSaving`,3,!1),l=S(r,`channelSettingsAvailable`,3,!1),f=S(r,`onOpenChannelSettings`,3,()=>{}),m=S(r,`onToggleChannelNotifications`,3,()=>{}),h=U(()=>r.selectedDirect?void 0:gt(r.selectedChannel?.external_url));var g=mo(),y=I(g),b=I(y),x=e=>{var t=no(),n=D(t,!0);N(e=>d(n,e),[()=>`@${rt(r.selectedDirect,r.currentUserID)}`]),p(e,t)},C=e=>{var a=so(),o=ce(a),l=D(o,!0),u=k(o,2),f=e=>{var r=oo(),a=I(r),o=e=>{var t=ro();p(e,t)},l=e=>{var t=io();p(e,t)},u=e=>{var t=ao();p(e,t)};P(a,e=>{s()===`muted`?e(o):s()===`mentions`?e(l,1):e(u,-1)}),t(r),N((e,t)=>{z(r,`title`,e),z(r,`aria-label`,t),z(r,`aria-busy`,c()),r.disabled=c()},[()=>i(s()),()=>i(s())]),n(`click`,r,function(...e){m()?.apply(this,e)}),p(e,r)};P(u,e=>{s()&&e(f)}),N(e=>d(l,e),[()=>`#${_t(r.selectedChannel)}`]),p(e,a)},T=e=>{var t=co();p(e,t)};P(b,e=>{r.selectedDirect?e(x):r.selectedChannel?e(C,1):e(T,-1)});var E=k(b,4),A=D(E,!0);t(y);var M=k(y,2),F=k(I(M),2);O(F);var ee=k(F,2),L=e=>{var t=lo();n(`click`,t,function(...e){r.onResetSearch?.apply(this,e)}),p(e,t)};P(ee,e=>{r.searchQuery&&e(L)}),te(2),t(M);var R=k(M,2),ne=I(R),re=e=>{var t=uo();N(()=>z(t,`href`,u(h))),p(e,t)};P(ne,e=>{u(h)&&e(re)});var ie=k(ne,2);let B;var ae=k(ie,2),oe=e=>{var t=fo();let i;N(()=>{z(t,`title`,a()?`Close pinned items`:`Pinned items`),z(t,`aria-label`,a()?`Close pinned items`:`Pinned items`),i=w(t,1,``,null,i,{active:a()})}),n(`click`,t,function(...e){r.onPinnedItems?.apply(this,e)}),p(e,t)};P(ae,e=>{r.selectedChannel&&e(oe)});var V=k(ae,2),se=e=>{var t=po();n(`click`,t,function(...e){f()?.apply(this,e)}),p(e,t)};P(V,e=>{r.selectedChannel&&l()&&e(se)}),t(R),t(g),N(()=>{d(A,r.workspaceName||`no workspace`),j(F,r.searchQuery),z(ie,`title`,r.threadOpen?`Close thread`:`Open a message thread`),z(ie,`aria-label`,r.threadOpen?`Close thread`:`Open a message thread`),B=w(ie,1,``,null,B,{active:r.threadOpen})}),v(`submit`,M,e=>{e.preventDefault(),r.onSearch()}),n(`input`,F,e=>r.onSearchQuery(e.currentTarget.value)),n(`click`,ie,function(...e){r.onToggleThread?.apply(this,e)}),p(e,g),_()}W([`click`,`input`]);function go(e,t,n){let r=t.find(t=>t.bot.id===e)?.bot??n(e);return r?.display_name?.trim()||(r?.handle?`@${r.handle}`:``)}function _o(e,t,n){let r=new Set,i=[];for(let a of e){if(!a.lines.some(e=>!e.finalized)||a.userId&&r.has(a.userId))continue;a.userId&&r.add(a.userId);let e=go(a.userId,t,n);e&&i.push(e)}return i}async function vo(e){return(await G(`/api/workspaces/${e}/bot-commands`)).bot_commands??[]}function yo(e){let t=e.trim().toLowerCase();return t?t.startsWith(`/`)?t:`/${t}`:``}function bo(e){let t=/^(\/\S+)\s*([\s\S]*)$/.exec(e);return t?{command:yo(t[1]),text:t[2].trim()}:null}function xo(e,t){return e.find(e=>!e.revoked_at&&yo(e.command)===t)}async function So(e,t,n){let r=new URLSearchParams;r.set(`command`,t),r.set(`text`,n);let i=await fetch(he(`/api/hooks/slash/${e}`),ye({method:`POST`,credentials:`include`,headers:{Accept:`application/json`,"Content-Type":`application/x-www-form-urlencoded`,"X-ClickClack-CSRF":`1`},body:r.toString()})),a=await i.text();if(!i.ok)throw new be(i.status,a);let o=a?JSON.parse(a):{};return{response_type:o.response_type||`in_channel`,text:(o.text||``).trim()}}var Co=e({default:()=>Ro}),wo=l(``),To=l(``),Eo=l(``),Do=l(`
          Showing topic
          `),Oo=l(`

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

          Loading thread…

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

          Preparing a safe preview.

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

          You can still download the original file.

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

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

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

          `),Xn=l(`

          `),Zn=l(`

          `),Qn=l(`

          Some slide content was omitted by preview limits.

          `),$n=l(`

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

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

          or

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

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

          Welcome.

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

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

          Creating workspace…

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

          No pinned messages

          Pin important messages to keep them easily accessible.

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

          Pinned Messages

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

          `),Ai=l(`
          No messages found

          Try another word or phrase.

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

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

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

            Browser notifications are not supported on this device.

            `),ta=l(`

            Browser notifications are blocked by this browser.

            `),na=l(`

            `),ra=l(`

            Show alerts when ClickClack is in the background.

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

            Shown in messages, mentions, and your profile card.

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

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

            Conversation display

            Keep agent reasoning summaries out of the message timeline.

            Hide tool execution details while keeping ordinary messages visible.

            Choose which side of the timeline shows your messages.

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

            Notifications

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

            Desktop

            Mobile push

            Send push notifications to your phone via Pushover.

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

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

            Loading…

            `),da=l(`

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

              `),ga=l(`
              `),_a=l(`

              Account

              My bots

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

              `,1);function va(e,r){o(r,!0);let i=A(B([])),a=A(`loading`),s=A(``);ae(()=>{c()});async function c(){M(a,`loading`);try{M(i,await xt(),!0),M(a,`ready`)}catch(e){M(a,`error`),M(s,St(e),!0)}}function l(e){r.onClose(),fe(Fe(e.workspace.route_id||e.workspace.id,`bots`))}function h(e){return e.startsWith(`@`)?e:`@${e}`}function g(e){let t=e.trim().split(/\s+/).filter(Boolean);return t.length>=2?(t[0][0]+t[1][0]).toUpperCase():e.slice(0,2).toUpperCase()}let v=U(()=>{let e=new Map;for(let t of u(i)){let n=t.workspace.id,r=e.get(n);r?r.entries.push(t):e.set(n,{workspace:t.workspace,entries:[t]})}return[...e.values()].sort((e,t)=>e.workspace.name.localeCompare(t.workspace.name))});var y=_a(),b=k(ce(y),2),x=e=>{var t=ua();p(e,t)},S=e=>{var t=da(),n=D(t,!0);N(()=>d(n,u(s))),p(e,t)},C=e=>{var t=fa();p(e,t)},w=e=>{var r=ga();f(r,21,()=>u(v),e=>e.workspace.id,(e,r)=>{var i=ha(),a=I(i),o=I(a),s=D(o,!0),c=k(o,2);t(a);var _=k(a,2);f(_,21,()=>u(r).entries,e=>e.bot.id,(e,r)=>{var i=ma(),a=I(i),o=I(a),s=e=>{var t=pa();N(()=>z(t,`src`,u(r).bot.avatar_url)),p(e,t)},c=e=>{var t=m();N(e=>d(t,e),[()=>g(u(r).bot.display_name||u(r).bot.handle||`?`)]),p(e,t)};P(o,e=>{u(r).bot.avatar_url?e(s):e(c,-1)}),t(a);var f=k(a,2),_=I(f),v=D(_,!0),y=k(_,2),b=I(y),x=D(b,!0),S=k(b,4),C=D(S);t(y),t(f);var w=k(f,2);t(i),N(e=>{d(v,u(r).bot.display_name||u(r).bot.handle),d(x,e),d(C,`${u(r).active_token_count??``} + active ${u(r).active_token_count===1?`token`:`tokens`}`)},[()=>h(u(r).bot.handle)]),n(`click`,w,()=>l(u(r))),p(e,i)}),t(_),t(i),N(()=>d(s,u(r).workspace.name)),n(`click`,c,()=>l(u(r).entries[0])),p(e,i)}),t(r),p(e,r)};P(b,e=>{u(a)===`loading`?e(x):u(a)===`error`?e(S,1):u(i).length===0?e(C,2):e(w,-1)}),p(e,y),_()}W([`click`]);function ya(e,t){return t.includes(`password`)&&e.password_enrolled===!0}function ba(e,t,n){return e?t?[...t].length<8?`New password must be at least 8 characters.`:t===n?``:`New passwords do not match.`:`Enter a new password.`:`Enter your current password.`}var xa=l(`

              `),Sa=l(``),Ca=l(`
              Change password

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

              The password you signed in with.

              At least 8 characters. Longer is better than clever.

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

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

              Account

              Appearance

              Changes apply instantly and follow your account on every device.

              Live preview — updates as you pick

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

                `),Fa=l(`

                Loading...

                `),Ia=l(`

                `),La=l(`

                `),Ra=l(`

                Account

                Profile settings

                How you appear across ClickClack.

                Sign out

                End this session on this device.

                `,1),za=l(`

                Account

                Notifications

                Decide when and how ClickClack should reach you.

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

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

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

                `,1),lo=l(`

                ClickClack

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

                `);function go(e,r){o(r,!0);function i(e){return e===`muted`?`Channel muted - click to change`:e===`mentions`?`Notifications for @mentions only - click to change`:`All notifications enabled - click to change`}let a=S(r,`pinnedOpen`,3,!1),s=S(r,`channelNotifPreference`,3,void 0),c=S(r,`channelNotifSaving`,3,!1),l=S(r,`channelSettingsAvailable`,3,!1),f=S(r,`onOpenChannelSettings`,3,()=>{}),m=S(r,`onToggleChannelNotifications`,3,()=>{}),h=U(()=>r.selectedDirect?void 0:gt(r.selectedChannel?.external_url));var g=ho(),y=I(g),b=I(y),x=e=>{var t=ro(),n=D(t,!0);N(e=>d(n,e),[()=>`@${rt(r.selectedDirect,r.currentUserID)}`]),p(e,t)},C=e=>{var a=co(),o=ce(a),l=D(o,!0),u=k(o,2),f=e=>{var r=so(),a=I(r),o=e=>{var t=io();p(e,t)},l=e=>{var t=ao();p(e,t)},u=e=>{var t=oo();p(e,t)};P(a,e=>{s()===`muted`?e(o):s()===`mentions`?e(l,1):e(u,-1)}),t(r),N((e,t)=>{z(r,`title`,e),z(r,`aria-label`,t),z(r,`aria-busy`,c()),r.disabled=c()},[()=>i(s()),()=>i(s())]),n(`click`,r,function(...e){m()?.apply(this,e)}),p(e,r)};P(u,e=>{s()&&e(f)}),N(e=>d(l,e),[()=>`#${_t(r.selectedChannel)}`]),p(e,a)},T=e=>{var t=lo();p(e,t)};P(b,e=>{r.selectedDirect?e(x):r.selectedChannel?e(C,1):e(T,-1)});var E=k(b,4),A=D(E,!0);t(y);var M=k(y,2),F=k(I(M),2);O(F);var ee=k(F,2),L=e=>{var t=uo();n(`click`,t,function(...e){r.onResetSearch?.apply(this,e)}),p(e,t)};P(ee,e=>{r.searchQuery&&e(L)}),te(2),t(M);var R=k(M,2),ne=I(R),re=e=>{var t=fo();N(()=>z(t,`href`,u(h))),p(e,t)};P(ne,e=>{u(h)&&e(re)});var ie=k(ne,2);let B;var ae=k(ie,2),oe=e=>{var t=po();let i;N(()=>{z(t,`title`,a()?`Close pinned items`:`Pinned items`),z(t,`aria-label`,a()?`Close pinned items`:`Pinned items`),i=w(t,1,``,null,i,{active:a()})}),n(`click`,t,function(...e){r.onPinnedItems?.apply(this,e)}),p(e,t)};P(ae,e=>{r.selectedChannel&&e(oe)});var V=k(ae,2),se=e=>{var t=mo();n(`click`,t,function(...e){f()?.apply(this,e)}),p(e,t)};P(V,e=>{r.selectedChannel&&l()&&e(se)}),t(R),t(g),N(()=>{d(A,r.workspaceName||`no workspace`),j(F,r.searchQuery),z(ie,`title`,r.threadOpen?`Close thread`:`Open a message thread`),z(ie,`aria-label`,r.threadOpen?`Close thread`:`Open a message thread`),B=w(ie,1,``,null,B,{active:r.threadOpen})}),v(`submit`,M,e=>{e.preventDefault(),r.onSearch()}),n(`input`,F,e=>r.onSearchQuery(e.currentTarget.value)),n(`click`,ie,function(...e){r.onToggleThread?.apply(this,e)}),p(e,g),_()}W([`click`,`input`]);function _o(e,t,n){let r=t.find(t=>t.bot.id===e)?.bot??n(e);return r?.display_name?.trim()||(r?.handle?`@${r.handle}`:``)}function vo(e,t,n){let r=new Set,i=[];for(let a of e){if(!a.lines.some(e=>!e.finalized)||a.userId&&r.has(a.userId))continue;a.userId&&r.add(a.userId);let e=_o(a.userId,t,n);e&&i.push(e)}return i}async function yo(e){return(await G(`/api/workspaces/${e}/bot-commands`)).bot_commands??[]}function bo(e){let t=e.trim().toLowerCase();return t?t.startsWith(`/`)?t:`/${t}`:``}function xo(e){let t=/^(\/\S+)\s*([\s\S]*)$/.exec(e);return t?{command:bo(t[1]),text:t[2].trim()}:null}function So(e,t){return e.find(e=>!e.revoked_at&&bo(e.command)===t)}async function Co(e,t,n){let r=new URLSearchParams;r.set(`command`,t),r.set(`text`,n);let i=await fetch(he(`/api/hooks/slash/${e}`),ye({method:`POST`,credentials:`include`,headers:{Accept:`application/json`,"Content-Type":`application/x-www-form-urlencoded`,"X-ClickClack-CSRF":`1`},body:r.toString()})),a=await i.text();if(!i.ok)throw new be(i.status,a);let o=a?JSON.parse(a):{};return{response_type:o.response_type||`in_channel`,text:(o.text||``).trim()}}var wo=e({default:()=>zo}),To=l(``),Eo=l(``),Do=l(``),Oo=l(`
                Showing topic
                `),ko=l(`

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

                Loading thread…

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

                `),Ge=o(`
                `),Ke=o(` `,1),qe=o(` `,1),Je=o(`
                `),Ye=o(`
                `),Xe=o(``),Ze=o(`

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

                `),Q=o(`

                Blocked.

                `),xt=o(``),St=o(``),Ct=o(``),wt=o(``),Tt=o(`
                Moderation
                `),Et=o(`

                Profile

                Active
                Contact information
                Handle
                User ID
                About

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

                No GIFs found

                `),tt=i(``);function nt(r,i){n(i,!0);let l=x(void 0);ee(()=>a(l)?.focus());var u=tt(),f=O(u),p=b(O(f),2);y(p),te(p,e=>C(l,e),()=>a(l)),e(f);var m=b(f,2);s(m,21,()=>i.gifs,e=>e.url,(n,r)=>{var s=$e(),l=O(s),u=b(l,2),d=v(u,!0);e(s),w(()=>{A(l,`src`,a(r).url),A(l,`alt`,a(r).title),o(d,a(r).title)}),t(`click`,s,()=>i.onPick(a(r).url,a(r).title)),c(n,s)}),e(m);var h=b(m,2),g=e=>{var t=et();c(e,t)};T(h,e=>{i.gifs.length===0&&e(g)}),e(u),w(()=>S(p,i.query)),t(`keydown`,u,e=>{e.isComposing||e.keyCode===229||e.key===`Escape`&&(e.preventDefault(),i.onClose())}),t(`input`,p,e=>i.onQuery(e.currentTarget.value)),c(r,u),d()}N([`keydown`,`input`,`click`]);var rt=i(`
                Replying to
                `);function it(r,i){n(i,!0);var a=rt(),s=b(O(a),2),l=O(s),u=b(O(l)),f=v(u,!0);e(l);var p=b(l,2),m=v(p,!0);e(s);var h=b(s,2);e(a),w((e,t)=>{o(f,e),o(m,t)},[()=>se(i.target.author),()=>ge(i.target.body)]),t(`click`,h,function(...e){i.onClear?.apply(this,e)}),c(r,a),d()}N([`click`]);var at=i(` `),ot=i(``),st=i(`
                `),ct=i(``),lt=i(`
                `),ut=i(``),dt=i(`
                `);function ft(r,i){n(i,!0);let y=m(i,`formClass`,3,`composer`),E=m(i,`pendingUpload`,3,null),k=m(i,`replyTarget`,3,null),j=m(i,`showUpload`,3,!1),ee=m(i,`showToolbar`,3,!1),ne=m(i,`slashCommands`,19,()=>[]),ie=m(i,`botCommands`,19,()=>[]),N=m(i,`mentionPeople`,19,()=>[]),P=m(i,`disabled`,3,!1),F=m(i,`onUploadFile`,3,()=>{}),ae=m(i,`onRemoveUpload`,3,()=>{}),oe=m(i,`onClearReply`,3,()=>{}),I=x(null),se=x(0),ce=x(``),L=x(0),R=x(!1),z=x(``),de=M(()=>{let e=a(z).trim().toLowerCase();return Ze.filter(t=>!e||t.title.toLowerCase().includes(e)||t.tags.some(t=>t.includes(e)))}),B=M(()=>H(i.value,a(se))),V=M(()=>!a(B)||fe(a(B))===a(ce)?[]:a(B).kind===`slash`?he(a(B)):_e(a(B)));h(()=>(i.onInputRef(a(I)),()=>i.onInputRef(null))),h(()=>{if(a(V).length===0){C(L,0);return}a(L)>=a(V).length&&C(L,0)});function H(e,t){let n=e.slice(0,t),r=/(^|\s)([/@][^\s]*)$/.exec(n);if(!r)return null;let i=r[2],a=n.length-i.length;return i.startsWith(`/`)&&a!==0?null:{kind:i.startsWith(`/`)?`slash`:`mention`,start:a,end:n.length,query:i.slice(1).toLowerCase(),raw:i}}function fe(e){return`${e.kind}:${e.start}:${e.raw}`}function pe(e=a(I)){C(se,e?.selectionStart??i.value.length,!0)}function me(e){return e.startsWith(`/`)?e:`/${e}`}function he(e){let t=e.query,n=ne().filter(e=>!e.revoked_at).map(e=>{let t=me(e.command);return{id:e.id,kind:`slash`,label:t,detail:e.description||`Slash command`,insertText:`${t} `,sortText:t.slice(1).toLowerCase()}}),r=new Set(n.map(e=>e.label)),i=ie().filter(e=>!r.has(me(e.command))).map(e=>{let t=me(e.command);return{id:e.id,kind:`slash`,label:t,detail:e.description,insertText:`${t} `,sortText:t.slice(1).toLowerCase(),hint:e.args_hint||void 0,source:e.bot.handle?`@${e.bot.handle}`:e.bot.display_name}});return[...n,...i].filter(e=>!t||e.sortText.includes(t)).sort((e,n)=>Number(!e.sortText.startsWith(t))-Number(!n.sortText.startsWith(t))||e.sortText.localeCompare(n.sortText)).slice(0,6)}function ge(e){return le(e.handle||e.display_name.replace(/\s+/g,``))}function _e(e){let t=e.query,n=new Set;return N().filter(e=>!e.id||!e.handle?.trim()||n.has(e.id)?!1:(n.add(e.id),!0)).map(e=>{let t=ge(e),n=`${e.handle||``} ${e.display_name}`.trim().toLowerCase();return{id:e.id,kind:`mention`,label:t,detail:e.kind===`bot`?`${e.display_name} · bot`:e.display_name,insertText:`${t} `,sortText:n}}).filter(e=>!t||e.sortText.includes(t)).sort((e,n)=>Number(!e.sortText.startsWith(t))-Number(!n.sortText.startsWith(t))||e.sortText.localeCompare(n.sortText)).slice(0,6)}function ve(e){a(B)&&ye(`${i.value.slice(0,a(B).start)}${e.insertText}${i.value.slice(a(B).end)}`,a(B).start+e.insertText.length)}async function ye(e,t=e.length,n=t){P()||(i.onValue(e),await p(),!P()&&(a(I)?.focus(),a(I)?.setSelectionRange(t,n),C(se,t,!0)))}function be(e,t=e,n=`text`){let r=a(I)?.selectionStart??i.value.length,o=a(I)?.selectionEnd??r,s=i.value.slice(r,o)||n;ye(`${i.value.slice(0,r)}${e}${s}${t}${i.value.slice(o)}`,r+e.length,r+e.length+s.length)}function xe(){a(R)&&(C(R,!1),C(z,``),a(I)?.focus())}function Se(e,t){let n=i.value&&!i.value.endsWith(` -`)?` -`:``;ye(`${i.value}${n}![${t}](${e})`),xe()}function Ce(e){let t=e.currentTarget;i.onValue(t.value),pe(t)}function we(){pe(),i.onFocus()}function Te(e){if(!(e.defaultPrevented||e.isComposing||e.keyCode===229)){if(e.key===`Escape`&&a(V).length>0&&a(B)){e.preventDefault(),C(ce,fe(a(B)),!0),a(I)?.focus();return}if(e.target===a(I)){if(a(V).length>0&&!e.shiftKey&&!e.ctrlKey&&!e.metaKey&&!e.altKey){if(e.key===`ArrowDown`||e.key===`ArrowUp`){e.preventDefault();let t=e.key===`ArrowDown`?1:-1;C(L,(a(L)+t+a(V).length)%a(V).length);return}if(e.key===`Enter`||e.key===`Tab`){e.preventDefault(),ve(a(V)[a(L)]);return}}i.onKeydown(e)}}}var Ee=dt(),De=O(Ee),Oe=e=>{nt(e,{get gifs(){return a(de)},get query(){return a(z)},onQuery:e=>C(z,e,!0),onPick:Se,onClose:xe})};T(De,e=>{ee()&&a(R)&&!P()&&e(Oe)});var ke=b(De,2),Ae=n=>{var r=st();s(r,23,()=>a(V),e=>e.id,(n,r,i)=>{var s=ot();let u;var d=O(s),f=O(d),p=e=>{var t=l(`/`);c(e,t)},m=e=>{var t=l();w(e=>o(t,e),[()=>ue(a(r).detail)]),c(e,t)};T(f,e=>{a(r).kind===`slash`?e(p):e(m,-1)}),e(d);var h=b(d,2),_=O(h),y=O(_,!0),x=b(y),S=e=>{var t=at(),n=v(t,!0);w(()=>o(n,a(r).hint)),c(e,t)};T(x,e=>{a(r).hint&&e(S)}),e(_);var C=b(_,2),E=v(C,!0);e(h);var D=b(h,2),k=v(D,!0);e(s),w(()=>{A(s,`aria-selected`,a(i)===a(L)),u=g(s,1,``,null,u,{active:a(i)===a(L)}),o(y,a(r).label),o(E,a(r).detail),o(k,a(r).source??(a(r).kind===`slash`?`command`:`mention`))}),t(`mousedown`,s,e=>e.preventDefault()),t(`click`,s,()=>ve(a(r))),c(n,s)}),e(r),w(()=>A(r,`aria-label`,a(B)?.kind===`slash`?`Slash command suggestions`:`Mention suggestions`)),c(n,r)};T(ke,e=>{a(V).length>0&&e(Ae)});var je=b(ke,2),Me=O(je),Ne=n=>{var r=lt(),i=b(O(r),2),s=e=>{var t=ct();w(e=>{A(t,`src`,e),A(t,`alt`,E().filename)},[()=>Je(E())]),c(e,t)},l=M(()=>Ye(E()));T(i,e=>{a(l)&&e(s)});var u=b(i,2),d=v(u),f=b(u,2);e(r),w(e=>o(d,`${E().filename??``} · ${e??``}`),[()=>Xe(E().byte_size)]),t(`click`,f,function(...e){ae()?.apply(this,e)}),c(n,r)};T(Me,e=>{E()&&e(Ne)});var Pe=b(Me,2),Fe=e=>{it(e,{get target(){return k()},get onClear(){return oe()}})};T(Pe,e=>{k()&&e(Fe)});var Ie=b(Pe,2),Le=O(Ie),Re=n=>{var r=ut(),i=O(r);D(2),e(r),w(()=>i.disabled=P()),t(`change`,i,function(...e){F()?.apply(this,e)}),c(n,r)};T(Le,e=>{j()&&e(Re)});var U=b(Le,2);_(U),te(U,e=>C(I,e),()=>a(I)),u(U,(e,t)=>qe?.(e,t),()=>i.value);var ze=b(U,2);e(Ie);var Be=b(Ie,2),Ve=e=>{G(e,{get showGifPicker(){return a(R)},get disabled(){return P()},onWrap:be,onToggleGif:()=>{a(R)?xe():C(R,!0)}})};T(Be,e=>{ee()&&e(Ve)}),e(je),e(Ee),w(e=>{g(Ee,1,re(y())),A(Ee,`data-handles-escape`,a(V).length>0?``:void 0),S(U,i.value),A(U,`placeholder`,i.placeholder),A(U,`aria-label`,i.ariaLabel),U.disabled=P(),A(ze,`aria-label`,i.submitLabel),ze.disabled=e},[()=>P()||!i.value.trim()]),t(`keydown`,Ee,Te),f(`submit`,je,e=>{e.preventDefault(),!P()&&(xe(),i.onSubmit())}),t(`input`,U,Ce),f(`focus`,U,we),t(`keyup`,U,()=>pe()),t(`mouseup`,U,()=>pe()),f(`select`,U,()=>pe()),c(r,Ee),d()}N([`keydown`,`mousedown`,`click`,`change`,`input`,`keyup`,`mouseup`]);function pt(e,t){(t==null||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n`u`?null:Y(BigInt.prototype.toString),Ut=typeof Symbol>`u`?null:Y(Symbol.prototype.toString),Wt=Y(Object.prototype.hasOwnProperty),Gt=Y(Object.prototype.toString),J=Y(RegExp.prototype.test),Kt=qt(TypeError);function Y(e){return function(t){t instanceof RegExp&&(t.lastIndex=0);var n=[...arguments].slice(1);return Et(e,t,n)}}function qt(e){return function(){return Dt(e,[...arguments])}}function X(e,t){let n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:Pt;if(bt&&bt(e,null),!Nt(t))return e;let r=t.length;for(;r--;){let i=t[r];if(typeof i==`string`){let e=n(i);e!==i&&(xt(t)||(t[r]=e),i=e)}e[i]=!0}return e}function Jt(e){for(let t=0;t/g),pn=q(/\${[\w\W]*/g),mn=q(/^data-[\-\w.\u00B7-\uFFFF]+$/),hn=q(/^aria-[\-\w]+$/),gn=q(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp|matrix):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i),_n=q(/^(?:\w+script|data):/i),vn=q(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g),yn=q(/^html$/i),bn=q(/^[a-z][.\w]*(-[.\w]+)+$/i),xn=q(/<[/\w!]/g),Sn=q(/<[/\w]/g),Cn=q(/<\/no(script|embed|frames)/i),wn=q(/\/>/i),Tn={element:1,attribute:2,text:3,cdataSection:4,entityReference:5,entityNode:6,processingInstruction:7,comment:8,document:9,documentType:10,documentFragment:11,notation:12},En=[`style`,`script`,`xmp`,`iframe`,`noembed`,`noframes`,`plaintext`,`noscript`],Dn=K(X({},En)),On=function(){let e={};return Ot(En,t=>{e[t]=q(RegExp(`])`,`i`))}),K(e)}(),kn=function(){return typeof window>`u`?null:window},An=function(e,t){if(typeof e!=`object`||typeof e.createPolicy!=`function`)return null;let n=null,r=`data-tt-policy-suffix`;t&&t.hasAttribute(r)&&(n=t.getAttribute(r));let i=`dompurify`+(n?`#`+n:``);try{return e.createPolicy(i,{createHTML(e){return e},createScriptURL(e){return e}})}catch{return console.warn(`TrustedTypes policy `+i+` could not be created.`),null}},jn=function(){return{afterSanitizeAttributes:[],afterSanitizeElements:[],afterSanitizeShadowDOM:[],beforeSanitizeAttributes:[],beforeSanitizeElements:[],beforeSanitizeShadowDOM:[],uponSanitizeAttribute:[],uponSanitizeElement:[],uponSanitizeShadowNode:[]}},Mn=function(e,t,n,r){return Wt(e,t)&&Nt(e[t])?X(r.base?Yt(r.base):{},e[t],r.transform):n},Nn=function(e,t,n){let r=Wt(e,t)?e[t]:void 0;return r&&typeof r==`object`?Yt(r):n()};function Pn(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:kn(),t=e=>Pn(e);if(t.version=`3.4.15`,t.removed=[],!e||!e.document||e.document.nodeType!==Tn.document||!e.Element)return t.isSupported=!1,t;let n=e.document,r=n,i=r.currentScript;e.DocumentFragment;let a=e.HTMLTemplateElement,o=e.Node,s=e.Element,c=e.NodeFilter;e.NamedNodeMap===void 0&&(e.NamedNodeMap||e.MozNamedAttrMap),e.HTMLFormElement;let l=e.DOMParser,u=e.trustedTypes,d=s.prototype,f=Zt(d,`cloneNode`),p=Zt(d,`remove`),m=Zt(d,`removeAttributeNode`),h=Zt(d,`nextSibling`),g=Zt(d,`childNodes`),_=Zt(d,`parentNode`),v=Zt(d,`shadowRoot`),y=Zt(d,`attributes`),b=o&&o.prototype?Zt(o.prototype,`nodeType`):null,x=o&&o.prototype?Zt(o.prototype,`nodeName`):null,S=o&&o.prototype?Zt(o.prototype,`ownerDocument`):null,C=function(e){return b?b(e):e.nodeType},w=function(e){return x?x(e):e.nodeName};if(typeof a==`function`){let e=n.createElement(`template`);e.content&&e.content.ownerDocument&&(n=e.content.ownerDocument)}let T,E=``,D,O=!1,k=0,A=function(){if(k>0)throw Kt(`A configured TRUSTED_TYPES_POLICY callback (createHTML or createScriptURL) must not call DOMPurify.sanitize, as that causes infinite recursion. Do not pass a policy whose callbacks wrap DOMPurify as TRUSTED_TYPES_POLICY; see the "DOMPurify and Trusted Types" section of the README.`)},j=function(e){A(),k++;try{return T.createHTML(e)}finally{k--}},ee=function(e){A(),k++;try{return T.createScriptURL(e)}finally{k--}},te=function(){return O||=(D=An(u,i),!0),D},ne=n,re=ne.implementation,ie=ne.createNodeIterator,M=ne.createDocumentFragment,N=ne.getElementsByTagName,P=r.importNode,F=jn();t.isSupported=typeof yt==`function`&&typeof _==`function`&&re&&re.createHTMLDocument!==void 0;let ae=dn,oe=fn,I=pn,se=mn,ce=hn,le=_n,ue=vn,L=bn,R=gn,z=null,de=X({},[...$t,...en,...tn,...rn,...on]),B=null,V=X({},[...sn,...cn,...ln,...un]),H=Object.seal(wt(null,{tagNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},allowCustomizedBuiltInElements:{writable:!0,configurable:!1,enumerable:!0,value:!1}})),fe=null,pe=null,me=Object.seal(wt(null,{tagCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeCheck:{writable:!0,configurable:!1,enumerable:!0,value:null}})),he=!0,ge=!0,_e=!1,ve=!0,ye=!1,be=!0,xe=!1,Se=!1,Ce=null,we=null,Te=!1,Ee=!1,De=!1,Oe=!1,ke=!0,Ae=!1,je=`user-content-`,Me=!0,Ne=!1,Pe={},Fe=null,Ie=X({},`annotation-xml.audio.colgroup.desc.foreignobject.head.iframe.math.mi.mn.mo.ms.mtext.noembed.noframes.noscript.plaintext.script.selectedcontent.style.svg.template.thead.title.video.xmp`.split(`.`)),Le=null,Re=X({},[`audio`,`video`,`img`,`source`,`image`,`track`]),U=null,ze=X({},[`alt`,`class`,`for`,`id`,`label`,`name`,`pattern`,`placeholder`,`role`,`summary`,`title`,`value`,`style`,`xmlns`]),Be=`http://www.w3.org/1998/Math/MathML`,Ve=`http://www.w3.org/2000/svg`,W=`http://www.w3.org/1999/xhtml`,He=W,Ue=!1,We=null,Ge=X({},[Be,Ve,W],Ft),Ke=K([`mi`,`mo`,`mn`,`ms`,`mtext`]),qe=X({},Ke),Je=K([`annotation-xml`]),Ye=X({},Je),Xe=X({},[`title`,`style`,`font`,`a`,`script`]),Ze=null,Qe=[`application/xhtml+xml`,`text/html`],G=null,$e=null,et=n.createElement(`form`),tt=function(e){return e instanceof RegExp||e instanceof Function},nt=function(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};if($e&&$e===e)return;(!e||typeof e!=`object`)&&(e={}),e=Yt(e),Ze=Qe.indexOf(e.PARSER_MEDIA_TYPE)===-1?`text/html`:e.PARSER_MEDIA_TYPE,G=Ze===`application/xhtml+xml`?Ft:Pt,z=Mn(e,`ALLOWED_TAGS`,de,{transform:G}),B=Mn(e,`ALLOWED_ATTR`,V,{transform:G}),We=Mn(e,`ALLOWED_NAMESPACES`,Ge,{transform:Ft}),U=Mn(e,`ADD_URI_SAFE_ATTR`,ze,{transform:G,base:ze}),Le=Mn(e,`ADD_DATA_URI_TAGS`,Re,{transform:G,base:Re}),Fe=Mn(e,`FORBID_CONTENTS`,Ie,{transform:G}),fe=Mn(e,`FORBID_TAGS`,Yt({}),{transform:G}),pe=Mn(e,`FORBID_ATTR`,Yt({}),{transform:G}),Pe=Wt(e,`USE_PROFILES`)?e.USE_PROFILES&&typeof e.USE_PROFILES==`object`?Yt(e.USE_PROFILES):e.USE_PROFILES:!1,he=e.ALLOW_ARIA_ATTR!==!1,ge=e.ALLOW_DATA_ATTR!==!1,_e=e.ALLOW_UNKNOWN_PROTOCOLS||!1,ve=e.ALLOW_SELF_CLOSE_IN_ATTR!==!1,ye=e.SAFE_FOR_TEMPLATES||!1,be=e.SAFE_FOR_XML!==!1,xe=e.WHOLE_DOCUMENT||!1,Ee=e.RETURN_DOM||!1,De=e.RETURN_DOM_FRAGMENT||!1,Oe=e.RETURN_TRUSTED_TYPE||!1,Te=e.FORCE_BODY||!1,ke=e.SANITIZE_DOM!==!1,Ae=e.SANITIZE_NAMED_PROPS||!1,Me=e.KEEP_CONTENT!==!1,Ne=e.IN_PLACE||!1,R=Qt(e.ALLOWED_URI_REGEXP)?e.ALLOWED_URI_REGEXP:gn,He=typeof e.NAMESPACE==`string`?e.NAMESPACE:W,qe=Nn(e,`MATHML_TEXT_INTEGRATION_POINTS`,()=>X({},Ke)),Ye=Nn(e,`HTML_INTEGRATION_POINTS`,()=>X({},Je));let t=Nn(e,`CUSTOM_ELEMENT_HANDLING`,()=>wt(null));if(H=wt(null),Wt(t,`tagNameCheck`)&&tt(t.tagNameCheck)&&(H.tagNameCheck=t.tagNameCheck),Wt(t,`attributeNameCheck`)&&tt(t.attributeNameCheck)&&(H.attributeNameCheck=t.attributeNameCheck),Wt(t,`allowCustomizedBuiltInElements`)&&typeof t.allowCustomizedBuiltInElements==`boolean`&&(H.allowCustomizedBuiltInElements=t.allowCustomizedBuiltInElements),q(H),ye&&(ge=!1),De&&(Ee=!0),Pe&&(z=X({},on),B=wt(null),Pe.html===!0&&(X(z,$t),X(B,sn)),Pe.svg===!0&&(X(z,en),X(B,cn),X(B,un)),Pe.svgFilters===!0&&(X(z,tn),X(B,cn),X(B,un)),Pe.mathMl===!0&&(X(z,rn),X(B,ln),X(B,un))),me.tagCheck=null,me.attributeCheck=null,Wt(e,`ADD_TAGS`)&&(typeof e.ADD_TAGS==`function`?me.tagCheck=e.ADD_TAGS:Nt(e.ADD_TAGS)&&(z===de&&(z=Yt(z)),X(z,e.ADD_TAGS,G))),Wt(e,`ADD_ATTR`)&&(typeof e.ADD_ATTR==`function`?me.attributeCheck=e.ADD_ATTR:Nt(e.ADD_ATTR)&&(B===V&&(B=Yt(B)),X(B,e.ADD_ATTR,G))),Wt(e,`ADD_FORBID_CONTENTS`)&&Nt(e.ADD_FORBID_CONTENTS)&&(Fe===Ie&&(Fe=Yt(Fe)),X(Fe,e.ADD_FORBID_CONTENTS,G)),Me&&(z[`#text`]=!0),xe&&X(z,[`html`,`head`,`body`]),z.table&&(X(z,[`tbody`]),delete fe.tbody),e.TRUSTED_TYPES_POLICY){if(typeof e.TRUSTED_TYPES_POLICY.createHTML!=`function`)throw Kt(`TRUSTED_TYPES_POLICY configuration option must provide a "createHTML" hook.`);if(typeof e.TRUSTED_TYPES_POLICY.createScriptURL!=`function`)throw Kt(`TRUSTED_TYPES_POLICY configuration option must provide a "createScriptURL" hook.`);let t=T;T=e.TRUSTED_TYPES_POLICY;try{E=j(``)}catch(e){throw T=t,e}}else e.TRUSTED_TYPES_POLICY===null?(T=void 0,E=``):(T===void 0&&(T=te()),T&&typeof E==`string`&&(E=j(``)));K&&K(e),$e=e},rt=X({},[...en,...tn,...nn]),it=X({},[...rn,...an]),at=function(e,t,n){return t.namespaceURI===W?e===`svg`:t.namespaceURI===Be?e===`svg`&&(n===`annotation-xml`||qe[n]):!!rt[e]},ot=function(e,t,n){return t.namespaceURI===W?e===`math`:t.namespaceURI===Ve?e===`math`&&Ye[n]:!!it[e]},st=function(e,t,n){return t.namespaceURI===Ve&&!Ye[n]||t.namespaceURI===Be&&!qe[n]?!1:!it[e]&&(Xe[e]||!rt[e])},ct=function(e){let t=_(e);(!t||!t.tagName)&&(t={namespaceURI:He,tagName:`template`});let n=Pt(e.tagName),r=Pt(t.tagName);return We[e.namespaceURI]?e.namespaceURI===Ve?at(n,t,r):e.namespaceURI===Be?ot(n,t,r):e.namespaceURI===W?st(n,t,r):!!(Ze===`application/xhtml+xml`&&We[e.namespaceURI]):!1},lt=function(e){jt(t.removed,{element:e});try{_(e).removeChild(e)}catch{if(p(e),!_(e))throw Kt(`a node selected for removal could not be detached from its tree and cannot be safely returned; refusing to sanitize in place`)}},ut=function(e,t,n){try{m(e,t)}catch{try{e.removeAttribute(n)}catch{}}},dt=function(e){mt(e);let t=g(e);if(t){let e=[];Ot(t,t=>{jt(e,t)}),Ot(e,e=>{try{p(e)}catch{}})}let n=y(e);if(n)for(let t=n.length-1;t>=0;--t){let r=n[t],i=r&&r.name;typeof i==`string`&&ut(e,r,i)}},ft=function(e,n,r){if(!r)try{r=n.getAttributeNode(e)}catch{r=null}jt(t.removed,{attribute:r||null,from:n});try{r?m(n,r):n.removeAttribute(e)}catch{try{n.removeAttribute(e)}catch{}}if(e===`is`){if(Ee||De)try{lt(n)}catch{}else try{n.setAttribute(e,``)}catch{}}},pt=function(e){let t=y(e);if(t)for(let n=t.length-1;n>=0;--n){let r=t[n],i=r&&r.name;typeof i!=`string`||B[G(i)]||ut(e,r,i)}},mt=function(e){let t=[e];for(;t.length>0;){let e=t.pop();C(e)===Tn.element&&pt(e);let n=g(e);if(n)for(let e=n.length-1;e>=0;--e)t.push(n[e])}},ht=function(e,t){return be?e===`patchsrc`||e===`for`&&t!==`label`&&t!==`output`:!1},gt=function(e){if(!be)return;let t=[e];for(;t.length>0;){let e=t.pop(),n=C(e);if(n===Tn.processingInstruction||n===Tn.comment&&J(Sn,e.data)){try{p(e)}catch{}continue}if(n===Tn.element){let t=e,n=G(w(e));try{t.hasAttribute&&t.hasAttribute(`patchsrc`)&&t.removeAttribute(`patchsrc`),t.hasAttribute&&t.hasAttribute(`for`)&&ht(`for`,n)&&t.removeAttribute(`for`)}catch{}}let r=g(e);if(r)for(let e=r.length-1;e>=0;--e)t.push(r[e])}},_t=function(e){let t=null,r=null;if(Te)e=``+e;else{let t=It(e,/^[\r\n\t ]+/);r=t&&t[0]}Ze===`application/xhtml+xml`&&He===W&&(e=``+e+``);let i=T?j(e):e;if(He===W)try{t=new l().parseFromString(i,Ze)}catch{}if(!t||!t.documentElement){t=re.createDocument(He,`template`,null);try{t.documentElement.innerHTML=Ue?E:i}catch{}}let a=t.body||t.documentElement;return e&&r&&a.insertBefore(n.createTextNode(r),a.childNodes[0]||null),He===W?N.call(t,xe?`html`:`body`)[0]:xe?t.documentElement:a},vt=function(e){let t=S?S(e):e.ownerDocument;return ie.call(t||e,e,c.SHOW_ELEMENT|c.SHOW_COMMENT|c.SHOW_TEXT|c.SHOW_PROCESSING_INSTRUCTION|c.SHOW_CDATA_SECTION,null)},bt=function(e){return e=Lt(e,ae,` `),e=Lt(e,oe,` `),e=Lt(e,I,` `),e},xt=function(e){e.normalize();let t=S?S(e):e.ownerDocument,n=ie.call(t||e,e,c.SHOW_TEXT|c.SHOW_COMMENT|c.SHOW_CDATA_SECTION|c.SHOW_PROCESSING_INSTRUCTION,null),r=n.nextNode();for(;r;)r.data=bt(r.data),r=n.nextNode();let i=e.querySelectorAll?.call(e,`template`);i&&Ot(i,e=>{Ct(e.content)&&xt(e.content)})},St=function(e){let t=x?x(e):null;return typeof t!=`string`||G(t)!==`form`?!1:typeof e.nodeName!=`string`||typeof e.textContent!=`string`||typeof e.removeChild!=`function`||e.attributes!==y(e)||typeof e.removeAttribute!=`function`||typeof e.removeAttributeNode!=`function`||typeof e.getAttributeNode!=`function`||typeof e.setAttribute!=`function`||typeof e.namespaceURI!=`string`||typeof e.insertBefore!=`function`||typeof e.hasChildNodes!=`function`||e.nodeType!==b(e)||e.childNodes!==g(e)},Ct=function(e){if(!b||typeof e!=`object`||!e)return!1;try{return b(e)===Tn.documentFragment}catch{return!1}},Tt=function(e){if(!b||typeof e!=`object`||!e)return!1;try{return typeof b(e)==`number`}catch{return!1}};function Et(e,n,r){e.length!==0&&Ot(e,e=>{e.call(t,n,r,$e)})}let Dt=function(e,t){return!!(be&&e.hasChildNodes()&&!Tt(e.firstElementChild)&&J(xn,e.textContent)&&J(xn,e.innerHTML)||be&&e.namespaceURI===W&&Dn[t]&&(Tt(e.firstElementChild)||typeof e.textContent==`string`&&J(On[t],e.textContent))||e.nodeType===Tn.processingInstruction||be&&e.nodeType===Tn.comment&&J(Sn,e.data))},Bt=function(e,t){return e instanceof RegExp?J(e,t):e instanceof Function&&!!e(t,...[...arguments].slice(2))},Vt=function(e,t,n){if(!fe[t]&&Jt(t)&&Bt(H.tagNameCheck,t))return!1;if(Me&&!Fe[t]){let t=_(e),r=g(e);if(r&&t){let i=r.length;for(let a=i-1;a>=0;--a){let i=e===n?f(r[a],!0):r[a];t.insertBefore(i,h(e))}}}return lt(e),!0},Ht=function(e,t,n,r){return e.length===0?t:t===n||t===r?Yt(t):t},Ut=function(e,t){return e===t||_(e)!==null?!1:(Ne&&mt(e),!0)},Gt=function(e,n){if(Et(F.beforeSanitizeElements,e,null),Ut(e,n))return!0;if(St(e))return lt(e),!0;let r=G(w(e));if(z=Ht(F.uponSanitizeElement,z,de,Ce),Et(F.uponSanitizeElement,e,{tagName:r,allowedTags:z}),Ut(e,n))return!0;if(Dt(e,r))return lt(e),!0;if(fe[r]||!(me.tagCheck instanceof Function&&me.tagCheck(r))&&!z[r]){let t=Vt(e,r,n);return t===!1&&Et(F.afterSanitizeElements,e,null),t}if(C(e)===Tn.element&&!ct(e)||(r===`noscript`||r===`noembed`||r===`noframes`)&&J(Cn,e.innerHTML))return lt(e),!0;if(ye&&e.nodeType===Tn.text){let n=bt(e.textContent);e.textContent!==n&&(jt(t.removed,{element:e.cloneNode()}),e.textContent=n)}return Et(F.afterSanitizeElements,e,null),!1},Y=function(e,t,r){if(pe[t]||ht(t,e)||ke&&(t===`id`||t===`name`)&&(r in n||r in et))return!1;let i=B[t]||me.attributeCheck instanceof Function&&me.attributeCheck(t,e);return ge&&J(se,t)||he&&J(ce,t)?!0:i?U[t]||J(R,Lt(r,ue,``))||(t===`src`||t===`xlink:href`||t===`href`)&&e!==`script`&&Rt(r,`data:`)===0&&Le[e]||_e&&!J(le,Lt(r,ue,``))?!0:!r:Jt(e)&&Bt(H.tagNameCheck,e)&&Bt(H.attributeNameCheck,t,e)||t===`is`&&H.allowCustomizedBuiltInElements&&Bt(H.tagNameCheck,r)},qt=X({},[`annotation-xml`,`color-profile`,`font-face`,`font-face-format`,`font-face-name`,`font-face-src`,`font-face-uri`,`missing-glyph`]),Jt=function(e){return!qt[Pt(e)]&&J(L,e)},En=function(e,t,n,r){if(T&&typeof u==`object`&&typeof u.getAttributeType==`function`&&!n)switch(u.getAttributeType(e,t)){case`TrustedHTML`:return j(r);case`TrustedScriptURL`:return ee(r)}return r},Fn=function(e,t,n,r){try{return n?e.setAttributeNS(n,t,r):e.setAttribute(t,r),!St(e)||(lt(e),!1)}catch{return ft(t,e),!1}},In=function(e){Et(F.beforeSanitizeAttributes,e,null);let n=e.attributes;if(!n||St(e))return;B=Ht(F.uponSanitizeAttribute,B,V,we);let r={attrName:``,attrValue:``,keepAttr:!0,allowedAttributes:B,forceKeepAttr:void 0},i=n.length,a=G(e.nodeName);for(;i--;){let o=n[i],s=o.name,c=o.namespaceURI,l=o.value,u=G(s),d=l,f=s===`value`?d:zt(d),p=!1;if(r.attrName=u,r.attrValue=f,r.keepAttr=!0,r.forceKeepAttr=void 0,Et(F.uponSanitizeAttribute,e,r),f=r.attrValue,Ae&&(u===`id`||u===`name`)&&Rt(f,je)!==0&&(ft(s,e,o),f=je+f,p=!0),be&&J(/((--!?|])>)|<\/(style|script|title|xmp|textarea|noscript|iframe|noembed|noframes)/i,f)){ft(s,e,o);continue}if(u===`attributename`&&It(f,`href`)){ft(s,e,o);continue}if(!r.forceKeepAttr){if(!r.keepAttr){ft(s,e,o);continue}if(!ve&&J(wn,f)){ft(s,e,o);continue}if(ye&&(f=bt(f)),!Y(a,u,f)){ft(s,e,o);continue}f=En(a,u,c,f),f!==d&&Fn(e,s,c,f)&&p&&At(t.removed)}}Et(F.afterSanitizeAttributes,e,null)},Ln=function(e){let t=null,n=vt(e);for(Et(F.beforeSanitizeShadowDOM,e,null);t=n.nextNode();)if(Et(F.uponSanitizeShadowNode,t,null),Gt(t,e),In(t),Ct(t.content)&&Ln(t.content),C(t)===Tn.element){let e=v(t);Ct(e)&&(Rn(e),Ln(e))}Et(F.afterSanitizeShadowDOM,e,null)},Rn=function(e){let t=[{node:e,shadow:null}];for(;t.length>0;){let e=t.pop();if(e.shadow){Ln(e.shadow);continue}let n=e.node,r=C(n)===Tn.element,i=g(n);if(i)for(let e=i.length-1;e>=0;--e)t.push({node:i[e],shadow:null});if(r){let e=x?x(n):null;if(typeof e==`string`&&G(e)===`template`){let e=n.content;Ct(e)&&t.push({node:e,shadow:null})}}if(r){let e=v(n);Ct(e)&&t.push({node:null,shadow:e},{node:e,shadow:null})}}};return t.sanitize=function(e){let n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},i=null,a=null,o=null,s=null;if(Ue=!e,Ue&&(e=``),typeof e!=`string`&&!Tt(e)&&(e=Xt(e),typeof e!=`string`))throw Kt(`dirty is not a string, aborting`);if(!t.isSupported)return e;Se?(z=Ce,B=we):nt(n),(F.uponSanitizeElement.length>0||F.uponSanitizeAttribute.length>0)&&(z=Yt(z)),F.uponSanitizeAttribute.length>0&&(B=Yt(B)),t.removed=[];let c=Ne&&typeof e!=`string`&&Tt(e);if(c){gt(e);let t=w(e);if(typeof t==`string`){let n=G(t);if(!z[n]||fe[n])throw dt(e),Kt(`root node is forbidden and cannot be sanitized in-place`)}if(St(e))throw dt(e),Kt(`root node is clobbered and cannot be sanitized in-place`);try{Rn(e)}catch(t){throw dt(e),t}}else if(Tt(e))i=_t(``),a=i.ownerDocument.importNode(e,!0),a.nodeType===Tn.element&&a.nodeName===`BODY`||a.nodeName===`HTML`?i=a:i.appendChild(a),Rn(i);else{if(!Ee&&!ye&&!xe&&e.indexOf(`<`)===-1)return T&&Oe?j(e):e;if(i=_t(e),!i)return Ee?null:Oe?E:``}i&&Te&<(i.firstChild);let l=c?e:i;try{let e=vt(l);for(;o=e.nextNode();)Gt(o,l),In(o),Ct(o.content)&&Ln(o.content)}catch(n){throw c&&(dt(e),Ot(t.removed,e=>{e.element&&mt(e.element)})),n}if(c)return Ot(t.removed,e=>{e.element&&mt(e.element)}),ye&&xt(e),e;if(Ee){if(ye&&xt(i),De)for(s=M.call(i.ownerDocument);i.firstChild;)s.appendChild(i.firstChild);else s=i;return(B.shadowroot||B.shadowrootmode)&&(s=P.call(r,s,!0)),s}let u=xe?i.outerHTML:i.innerHTML;return xe&&z[`!doctype`]&&i.ownerDocument&&i.ownerDocument.doctype&&i.ownerDocument.doctype.name&&J(yn,i.ownerDocument.doctype.name)&&(u=` -`+u),ye&&(u=bt(u)),T&&Oe?j(u):u},t.setConfig=function(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};nt(e),Se=!0,Ce=z,we=B},t.clearConfig=function(){$e=null,Se=!1,Ce=null,we=null,T=D,E=``},t.isValidAttribute=function(e,t,n){$e||nt({});let r=G(e),i=G(t);return Y(r,i,n)},t.addHook=function(e,t){typeof t==`function`&&Wt(F,e)&&jt(F[e],t)},t.removeHook=function(e,t){if(Wt(F,e)){if(t!==void 0){let n=kt(F[e],t);return n===-1?void 0:Mt(F[e],n,1)[0]}return At(F[e])}},t.removeHooks=function(e){Wt(F,e)&&(F[e]=[])},t.removeAllHooks=function(){F=jn()},t}var Fn=Pn(),In=2097152,Ln=67108864,Rn=25165824,zn={bash:`bash`,c:`c`,cc:`cpp`,cpp:`cpp`,css:`css`,go:`go`,h:`c`,hpp:`cpp`,java:`java`,js:`javascript`,json:`json`,jsx:`javascript`,mjs:`javascript`,py:`python`,rb:`ruby`,rs:`rust`,sh:`bash`,sql:`sql`,toml:`ini`,ts:`typescript`,tsx:`typescript`,xml:`xml`,yaml:`yaml`,yml:`yaml`,zsh:`bash`},Bn=new Set([`application/javascript`,`application/json`,`application/ld+json`,`application/sql`,`application/toml`,`application/typescript`,`application/xml`,`application/x-httpd-php`,`application/x-javascript`,`application/x-sh`,`application/x-yaml`,`text/css`,`text/csv`,`text/javascript`,`text/typescript`,`text/x-python`,`text/x-shellscript`,`text/xml`,`text/yaml`]),Vn=new Set([`application/vnd.ms-excel.sheet.macroenabled.12`,`application/vnd.ms-excel.template.macroenabled.12`,`application/vnd.openxmlformats-officedocument.spreadsheetml.sheet`,`application/vnd.openxmlformats-officedocument.spreadsheetml.template`]),Hn=new Set([`application/vnd.ms-powerpoint.presentation.macroenabled.12`,`application/vnd.ms-powerpoint.slideshow.macroenabled.12`,`application/vnd.ms-powerpoint.template.macroenabled.12`,`application/vnd.openxmlformats-officedocument.presentationml.presentation`,`application/vnd.openxmlformats-officedocument.presentationml.slideshow`,`application/vnd.openxmlformats-officedocument.presentationml.template`]);function Un(e){let t=e.toLowerCase().split(/[\\/]/).pop()||``,n=t.lastIndexOf(`.`);return n>0?t.slice(n+1):``}function Wn(e){return(e.content_type||``).split(`;`,1)[0].trim().toLowerCase()}function Gn(e){let t=Un(e.filename),n=Wn(e);return t===`docx`||n===`application/vnd.openxmlformats-officedocument.wordprocessingml.document`?`docx`:[`xlsx`,`xlsm`,`xltx`,`xltm`].includes(t)||Vn.has(n)?`spreadsheet`:[`pptx`,`pptm`,`potx`,`potm`,`ppsx`,`ppsm`].includes(t)||Hn.has(n)?`presentation`:t===`md`||t===`markdown`||n===`text/markdown`?`markdown`:t===`html`||t===`htm`||n===`text/html`?`html`:t===`pdf`||n===`application/pdf`?`pdf`:zn[t]||Bn.has(n)?`code`:t===`txt`||t===`log`||n===`text/plain`||n.startsWith(`text/`)?`text`:`unsupported`}function Kn(e){let t=Un(e.filename);if(zn[t])return zn[t];let n=Wn(e);if(n.includes(`json`))return`json`;if(n.includes(`javascript`))return`javascript`;if(n.includes(`typescript`))return`typescript`;if(n.includes(`yaml`))return`yaml`;if(n.includes(`xml`))return`xml`;if(n.includes(`sql`))return`sql`}function qn(e){switch(e){case`code`:return`Code`;case`text`:return`Text`;case`markdown`:return`Markdown`;case`pdf`:return`PDF`;case`docx`:return`Word document`;case`spreadsheet`:return`Spreadsheet`;case`presentation`:return`Slide text outline`;case`html`:return`Web page`;default:return`File`}}function Jn(e){if(e===`pdf`)return Ln;if(e===`spreadsheet`||e===`presentation`)return Rn;if(e===`code`||e===`text`||e===`markdown`||e===`html`)return In}function Yn(){return{async:!1,breaks:!1,extensions:null,gfm:!0,hooks:null,pedantic:!1,renderer:null,silent:!1,tokenizer:null,walkTokens:null}}var Xn=Yn();function Zn(e){Xn=e}var Qn={exec:()=>null};function $n(e){let t=[];return n=>{let r=Math.max(0,Math.min(3,n-1)),i=t[r];return i||(i=e(r),t[r]=i),i}}function Z(e,t=``){let n=typeof e==`string`?e:e.source,r={replace:(e,t)=>{let i=typeof t==`string`?t:t.source;return i=i.replace(Q.caret,`$1`),n=n.replace(e,i),r},getRegex:()=>new RegExp(n,t)};return r}var er=((e=``)=>{try{return!!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:e=>RegExp(`^( {0,3}${e})((?:[ ][^\\n]*)?(?:\\n|$))`),nextBulletRegex:$n(e=>RegExp(`^ {0,${e}}(?:[*+-]|\\d{1,9}[.)])((?:[ ][^\\n]*)?(?:\\n|$))`)),hrRegex:$n(e=>RegExp(`^ {0,${e}}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)`)),fencesBeginRegex:$n(e=>RegExp(`^ {0,${e}}(?:\`\`\`|~~~)`)),headingBeginRegex:$n(e=>RegExp(`^ {0,${e}}#`)),htmlBeginRegex:$n(e=>RegExp(`^ {0,${e}}<(?:[a-z].*>|!--)`,`i`)),blockquoteBeginRegex:$n(e=>RegExp(`^ {0,${e}}>`))},tr=/^(?:[ \t]*(?:\n|$))+/,nr=/^((?: {4}| {0,3}\t)[^\n]+(?:\n(?:[ \t]*(?:\n|$))*)?)+/,rr=/^ {0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?: {0,3}\1[~`]* *(?=\n|$)|$)/,ir=/^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/,ar=/^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/,or=/ {0,3}(?:[*+-]|\d{1,9}[.)])/,sr=/^(?!bull |blockCode|fences|blockquote|heading|html|table)((?:.|\n(?!\s*?\n|bull |blockCode|fences|blockquote|heading|html|table))+?)\n {0,3}(=+|-+) *(?:\n+|$)/,cr=Z(sr).replace(/bull/g,or).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}(?:\s|$)/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).replace(/\|table/g,``).getRegex(),lr=Z(sr).replace(/bull/g,or).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}(?:\s|$)/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).replace(/table/g,/ {0,3}\|?(?:[:\- ]*\|)+[\:\- ]*\n/).getRegex(),ur=/^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table|[ \t]+\n)[^\n]+)*)/,dr=/^[^\n]+/,fr=/(?!\s*\])(?:\\[\s\S]|[^\[\]\\])+/,pr=Z(/^ {0,3}\[(label)\]: *(?:\n[ \t]*)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n[ \t]*)?| *\n[ \t]*)(title))? *(?:\n+|$)/).replace(`label`,fr).replace(`title`,/(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/).getRegex(),mr=Z(/^(bull)([ \t][^\n]*?)?(?:\n|$)/).replace(/bull/g,or).getRegex(),hr=`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`,gr=/|$))/,_r=Z(`^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:[^\\n]*\\n*|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>[^\\n]*\\n*|$)|[^\\n]*\\n*|$)|[^\\n]*\\n*|$)|)[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|<(?!script|pre|style|textarea)([a-z][a-z0-9-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$))`,`i`).replace(`comment`,gr).replace(`tag`,hr).replace(`attribute`,/ +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(),vr=e=>Z(ur).replace(`hr`,ir).replace(`heading`,` {0,3}#{1,6}(?:\\s|$)`).replace(`|lheading`,``).replace(`|table`,``).replace(`blockquote`,` {0,3}>`).replace(`fences`," {0,3}(?:`{3,}(?=[^`\\n]*(?:\\n|$))|~~~)[^\\n]*(?:\\n|$)").replace(`list`,e).replace(`html`,`)|<(?:script|pre|style|textarea|!--)`).replace(`tag`,hr).getRegex(),yr=vr(/ {0,3}(?:[*+-]|1[.)])[ \t]+[^ \t\n]/),br=vr(/ {0,3}(?:[*+-]|\d{1,9}[.)])(?:[ \t]|\n|$)/),xr={blockquote:Z(/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/).replace(`paragraph`,br).getRegex(),code:nr,def:pr,fences:rr,heading:ar,hr:ir,html:_r,lheading:cr,list:mr,newline:tr,paragraph:yr,table:Qn,text:dr},Sr=Z(`^ *([^\\n ].*)\\n {0,3}((?:\\| *)?:?-+:? *(?:\\| *:?-+:? *)*(?:\\| *)?)(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)`).replace(`hr`,ir).replace(`heading`,` {0,3}#{1,6}(?:\\s|$)`).replace(`blockquote`,` {0,3}>`).replace(`code`,`(?: {4}| {0,3} )[^\\n]`).replace(`fences`," {0,3}(?:`{3,}(?=[^`\\n]*(?:\\n|$))|~~~)[^\\n]*(?:\\n|$)").replace(`list`,` {0,3}(?:[*+-]|1[.)])[ \\t]`).replace(`html`,`)|<(?:script|pre|style|textarea|!--)`).replace(`tag`,hr).getRegex(),Cr={...xr,lheading:lr,table:Sr,paragraph:Z(ur).replace(`hr`,ir).replace(`heading`,` {0,3}#{1,6}(?:\\s|$)`).replace(`|lheading`,``).replace(`table`,Sr).replace(`blockquote`,` {0,3}>`).replace(`fences`," {0,3}(?:`{3,}(?=[^`\\n]*(?:\\n|$))|~~~)[^\\n]*(?:\\n|$)").replace(`list`,` {0,3}(?:[*+-]|1[.)])[ \\t]+[^ \\t\\n]`).replace(`html`,`)|<(?:script|pre|style|textarea|!--)`).replace(`tag`,hr).getRegex()},wr={...xr,html:Z(`^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+? *(?:\\n{2,}|\\s*$)|\\s]*)*?/?> *(?:\\n{2,}|\\s*$))`).replace(`comment`,gr).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:Qn,lheading:/^(.+?)\n {0,3}(=+|-+) *(?:\n+|$)/,paragraph:Z(ur).replace(`hr`,ir).replace(`heading`,` *#{1,6} *[^ -]`).replace(`lheading`,cr).replace(`|table`,``).replace(`blockquote`,` {0,3}>`).replace(`|fences`,``).replace(`|list`,``).replace(`|html`,``).replace(`|tag`,``).getRegex()},Tr=/^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,Er=/^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,Dr=/^( {2,}|\\)\n(?!\s*$)/,Or=/^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\`+)[^`]+\k(?!`))*?\]\((?:\\[\s\S]|[^\\\(\)]|\((?:\\[\s\S]|[^\\\(\)])*\))*\)/).replace(`precode-`,er?"(?`+)[^`]+\k(?!`)/).replace(`html`,/<(?! )[^<>]*?>/).getRegex(),Rr=/^(?:\*+(?:((?!\*)punct)|([^\s*]))?)|^_+(?:((?!_)punct)|([^\s_]))?/,zr=Z(Rr,`u`).replace(/punct/g,kr).getRegex(),Br=Z(Rr,`u`).replace(/punct/g,Pr).getRegex(),Vr=Z(/^(?:\*+(?:((?!\*)(?!openQuote)punct)|([^\s*]))?)|^_+(?:((?!_)(?!openQuote)punct)|([^\s_]))?/,`u`).replace(/openQuote/g,Nr).replace(/punct/g,kr).getRegex(),Hr=`^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\*)punct(\\*+)(?=[\\s]|$)|notPunctSpace(\\*+)(?!\\*)(?=punctSpace|$)|(?!\\*)punctSpace(\\*+)(?=notPunctSpace)|[\\s](\\*+)(?!\\*)(?=punct)|(?!\\*)punct(\\*+)(?!\\*)(?=punct)|notPunctSpace(\\*+)(?=notPunctSpace)`,Ur=Z(Hr,`gu`).replace(/notPunctSpace/g,jr).replace(/punctSpace/g,Ar).replace(/punct/g,kr).getRegex(),Wr=Z(Hr,`gu`).replace(/notPunctSpace/g,Ir).replace(/punctSpace/g,Fr).replace(/punct/g,Pr).getRegex(),Gr=Z(`^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\*)punct(\\*+)(?=[\\s]|$)|notPunctSpace(\\*+)(?!\\*)(?=punctSpace|$)|(?!\\*)[\\s](\\*+)(?=notPunctSpace)|[\\s](\\*+)(?!\\*)(?=punct)|(?!\\*)punct(\\*+)(?!\\*)(?=punct)|(?:(?!\\*)punct|notPunctSpace)(\\*+)(?!\\*)(?=notPunctSpace)`,`gu`).replace(/notPunctSpace/g,jr).replace(/punctSpace/g,Ar).replace(/punct/g,kr).getRegex(),Kr=Z(`^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)punctSpace(_+)(?=notPunctSpace)|[\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)`,`gu`).replace(/notPunctSpace/g,jr).replace(/punctSpace/g,Ar).replace(/punct/g,kr).getRegex(),qr=Z(`^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)[\\s](_+)(?=notPunctSpace)|[\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)|(?:(?!_)punct|notPunctSpace)(_+)(?!_)(?=notPunctSpace)`,`gu`).replace(/notPunctSpace/g,jr).replace(/punctSpace/g,Ar).replace(/punct/g,kr).getRegex(),Jr=Z(/^~~?(?:((?!~)punct)|[^\s~])/,`u`).replace(/punct/g,kr).getRegex(),Yr=Z(`^[^~]+(?=[^~])|(?!~)punct(~~?)(?=[\\s]|$)|notPunctSpace(~~?)(?!~)(?=punctSpace|$)|(?!~)punctSpace(~~?)(?=notPunctSpace)|[\\s](~~?)(?!~)(?=punct)|(?!~)punct(~~?)(?!~)(?=punct)|notPunctSpace(~~?)(?=notPunctSpace)`,`gu`).replace(/notPunctSpace/g,jr).replace(/punctSpace/g,Ar).replace(/punct/g,kr).getRegex(),Xr=Z(/\\(punct)/,`gu`).replace(/punct/g,kr).getRegex(),Zr=Z(/^<(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(),Qr=Z(gr).replace(`(?:-->|$)`,`-->`).getRegex(),$r=Z(`^comment|^|^<[a-zA-Z][a-zA-Z0-9-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^|^`).replace(`comment`,Qr).replace(`attribute`,/\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/).getRegex(),ei=Z(/(?:\[(?:brackets|\\[\s\S]|[^\[\]\\])*\]|\\[\s\S]|`+(?!`)[^`]*?`+(?!`)|``+(?=\])|[^\[\]\\`])*?/).replace(`brackets`,/\[(?:\\[\s\S]|[^\[\]\\])*\]/).getRegex(),ti=Z(/^!?\[(label)\]\(\s*(href)(?:(?:[ \t]+(?:\n[ \t]*)?|\n[ \t]*)(title))?\s*\)/).replace(`label`,ei).replace(`href`,/<(?:\\.|[^\n<>\\])+>|[^ \t\n\x00-\x1f]+|(?=\))/).replace(`title`,/"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/).getRegex(),ni=Z(/^!?\[(label)\]\[(ref)\]/).replace(`label`,ei).replace(`ref`,fr).getRegex(),ri=Z(/^!?\[(ref)\](?:\[\])?/).replace(`ref`,fr).getRegex(),ii=Z(`reflink|nolink(?!\\()`,`g`).replace(`reflink`,ni).replace(`nolink`,ri).getRegex(),ai=/[hH][tT][tT][pP][sS]?|[fF][tT][pP]/,oi={_backpedal:Qn,anyPunctuation:Xr,autolink:Zr,blockSkip:Lr,br:Dr,code:Er,del:Qn,delLDelim:Qn,delRDelim:Qn,emStrongLDelim:zr,emStrongRDelimAst:Ur,emStrongRDelimUnd:Kr,escape:Tr,link:ti,nolink:ri,punctuation:Mr,reflink:ni,reflinkSearch:ii,tag:$r,text:Or,url:Qn},si={...oi,emStrongLDelim:Vr,emStrongRDelimAst:Gr,emStrongRDelimUnd:qr,link:Z(/^!?\[(label)\]\((.*?)\)/).replace(`label`,ei).getRegex(),reflink:Z(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace(`label`,ei).getRegex()},ci={...oi,emStrongRDelimAst:Wr,emStrongLDelim:Br,delLDelim:Jr,delRDelim:Yr,url:Z(/^((?:protocol):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/).replace(`protocol`,ai).replace(`email`,/[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![\w-])/).getRegex(),_backpedal:/(?:[^?!.,:;*_'"~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'"~)]+(?!$))+/,del:/^(~~?)(?=[^\s~])((?:\\[\s\S]|[^\\])*?(?:\\[\s\S]|[^\s~\\]))\1(?=[^~]|$)/,text:Z(/^(`+|~+|[^`~])(?:(?=[`~])|(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\":`>`,'"':`"`,"'":`'`},pi=e=>fi[e];function mi(e,t){if(t){if(Q.escapeTest.test(e))return e.replace(Q.escapeReplace,pi)}else if(Q.escapeTestNoEncode.test(e))return e.replace(Q.escapeReplaceNoEncode,pi);return e}function hi(e){try{e=encodeURI(e).replace(Q.percentDecode,`%`)}catch{return null}return e}function gi(e,t){let n=e.replace(Q.findPipe,(e,t,n)=>{let r=!1,i=t;for(;--i>=0&&n[i]===`\\`;)r=!r;return r?`|`:` |`}).split(Q.splitPipe),r=0;if(n[0].trim()||n.shift(),n.length>0&&!n.at(-1)?.trim()&&n.pop(),t){if(n.length>t)n.splice(t);else for(;n.length=0&&Q.blankLine.test(t[n]);)n--;return t.length-n<=2?e:t.slice(0,n+1).join(` -`)}function yi(e,t){if(e.indexOf(t[1])===-1)return-1;let n=0;for(let r=0;r0?-2:-1}function bi(e,t=0){let n=t,r=``;for(let t of e)if(t===` `){let e=4-n%4;r+=` `.repeat(e),n+=e}else r+=t,n++;return r}function xi(e,t,n,r,i){let a=t.href,o=t.title||null,s=e[1].replace(i.other.outputLinkReplace,`$1`),c=e[0].charAt(0)===`!`;r.state.inLink=!0;let l=r.state.linkEmitted,u=r.state.inRawBlock;r.state.linkEmitted=!1;let d=r.inlineTokens(s),f=r.state.linkEmitted;if(r.state.linkEmitted=l,r.state.inLink=!1,!c){if(f){r.state.inRawBlock=u;return}r.state.linkEmitted=!0}return{type:c?`image`:`link`,raw:n,href:a,title:o,text:s,tokens:d}}function Si(e,t,n){let r=e.match(n.other.indentCodeCompensation);if(r===null)return t;let i=r[1];return t.split(` -`).map(e=>{let t=e.match(n.other.beginningSpace);if(t===null)return e;let[r]=t;return e.slice(Math.min(r.length,i.length))}).join(` -`)}var Ci=class{options;rules;lexer;constructor(e){this.options=e||Xn}space(e){let t=this.rules.block.newline.exec(e);if(t&&t[0].length>0)return{type:`space`,raw:t[0]}}code(e){let t=this.rules.block.code.exec(e);if(t){let e=this.options.pedantic?t[0]:vi(t[0]);return{type:`code`,raw:e,codeBlockStyle:`indented`,text:e.replace(this.rules.other.codeRemoveIndent,``)}}}fences(e){let t=this.rules.block.fences.exec(e);if(t){let e=t[0],n=Si(e,t[3]||``,this.rules);return{type:`code`,raw:e,lang:t[2]?t[2].trim().replace(this.rules.inline.anyPunctuation,`$1`):t[2],text:n}}}heading(e){let t=this.rules.block.heading.exec(e);if(t){let e=t[2].trim();if(this.rules.other.endingHash.test(e)){let t=_i(e,`#`);(this.options.pedantic||!t||this.rules.other.endingSpaceTabChar.test(t))&&(e=t.trim())}return{type:`heading`,raw:_i(t[0],` -`),depth:t[1].length,text:e,tokens:this.lexer.inline(e)}}}hr(e){let t=this.rules.block.hr.exec(e);if(t)return{type:`hr`,raw:_i(t[0],` -`)}}blockquote(e){let t=this.rules.block.blockquote.exec(e);if(t){let e=_i(t[0],` -`).split(` -`),n=``,r=``,i=[];for(;e.length>0;){let t=!1,a=[],o;for(o=0;o1,i={type:`list`,raw:``,ordered:r,start:r?+n.slice(0,-1):``,loose:!1,items:[]};n=r?`\\d{1,9}\\${n.slice(-1)}`:`\\${n}`,this.options.pedantic&&(n=r?n:`[*+-]`);let a=this.rules.other.listItemRegex(n),o=!1;for(;e;){let n=!1,r=``,s=``;if(!(t=a.exec(e))||this.rules.block.hr.test(e))break;r=t[0],e=e.substring(r.length);let c=bi(t[2].split(` -`,1)[0],t[1].length),l=e.split(` -`,1)[0],u=!c.trim(),d=0;if(this.options.pedantic?(d=2,s=c.trimStart()):u?d=t[1].length+1:(d=c.search(this.rules.other.nonSpaceChar),d=d>4?1:d,s=c.slice(d),d+=t[1].length),u&&this.rules.other.blankLine.test(l)&&(r+=l+` -`,e=e.substring(l.length+1),n=!0),!n){let t=this.rules.other.nextBulletRegex(d),n=this.rules.other.hrRegex(d),i=this.rules.other.fencesBeginRegex(d),a=this.rules.other.headingBeginRegex(d),o=this.rules.other.htmlBeginRegex(d),f=this.rules.other.blockquoteBeginRegex(d);for(;e;){let p=e.split(` -`,1)[0],m;if(l=p,this.options.pedantic?(l=l.replace(this.rules.other.listReplaceNesting,` `),m=l):m=l.replace(this.rules.other.tabCharGlobal,` `),i.test(l)||a.test(l)||o.test(l)||f.test(l)||t.test(l)||n.test(l))break;if(m.search(this.rules.other.nonSpaceChar)>=d||!l.trim())s+=` -`+m.slice(d);else{if(u||c.replace(this.rules.other.tabCharGlobal,` `).search(this.rules.other.nonSpaceChar)>=4||i.test(c)||a.test(c)||n.test(c))break;s+=` -`+l}u=!l.trim(),r+=p+` -`,e=e.substring(p.length+1),c=m.slice(d)}}i.loose||(o?i.loose=!0:this.rules.other.doubleBlankLine.test(r)&&(o=!0)),i.items.push({type:`list_item`,raw:r,task:!!this.options.gfm&&this.rules.other.listIsTask.test(s),loose:!1,text:s,tokens:[]}),i.raw+=r}let s=i.items.at(-1);if(s)s.raw=s.raw.trimEnd(),s.text=s.text.trimEnd();else return;i.raw=i.raw.trimEnd();for(let e of i.items)if(this.lexer.state.top=!1,e.tokens=this.lexer.blockTokens(e.text,[]),!i.loose){let t=e.tokens.filter(e=>e.type===`space`);i.loose=t.length>0&&t.some(e=>this.rules.other.anyLine.test(e.raw))}for(let e of i.items){let t=e.tokens[0];if(e.task&&(t?.type===`text`||t?.type===`paragraph`)){e.text=e.text.replace(this.rules.other.listReplaceTask,``),t.raw=t.raw.replace(this.rules.other.listReplaceTask,``),t.text=t.text.replace(this.rules.other.listReplaceTask,``);for(let e=this.lexer.inlineQueue.length-1;e>=0;e--)if(this.rules.other.listIsTask.test(this.lexer.inlineQueue[e].src)){this.lexer.inlineQueue[e].src=this.lexer.inlineQueue[e].src.replace(this.rules.other.listReplaceTask,``);break}let n=this.rules.other.listTaskCheckbox.exec(e.raw);if(n){let t={type:`checkbox`,raw:n[0]+` `,checked:n[0]!==`[ ]`};e.checked=t.checked,i.loose?e.tokens[0]&&[`paragraph`,`text`].includes(e.tokens[0].type)&&`tokens`in e.tokens[0]&&e.tokens[0].tokens?(e.tokens[0].raw=t.raw+e.tokens[0].raw,e.tokens[0].text=t.raw+e.tokens[0].text,e.tokens[0].tokens.unshift(t)):e.tokens.unshift({type:`paragraph`,raw:t.raw,text:t.raw,tokens:[t]}):e.tokens.unshift(t)}}else e.task&&=!1}if(i.loose)for(let e of i.items){e.loose=!0;for(let t of e.tokens)t.type===`text`&&(t.type=`paragraph`)}return i}}html(e){let t=this.rules.block.html.exec(e);if(t){let e=vi(t[0]);return{type:`html`,block:!0,raw:e,pre:t[1]===`pre`||t[1]===`script`||t[1]===`style`,text:e}}}def(e){let t=this.rules.block.def.exec(e);if(t){let e=t[1].toLowerCase().replace(this.rules.other.multipleSpaceGlobal,` `),n=t[2]?t[2].replace(this.rules.other.hrefBrackets,`$1`).replace(this.rules.inline.anyPunctuation,`$1`):``,r=t[3]?t[3].substring(1,t[3].length-1).replace(this.rules.inline.anyPunctuation,`$1`):t[3];return{type:`def`,tag:e,raw:_i(t[0],` -`),href:n,title:r}}}table(e){let t=this.rules.block.table.exec(e);if(!t||!this.rules.other.tableDelimiter.test(t[2]))return;let n=gi(t[1]),r=t[2].replace(this.rules.other.tableAlignChars,``).split(`|`),i=t[3]?.trim()?t[3].replace(this.rules.other.tableRowBlankLine,``).split(` -`):[],a={type:`table`,raw:_i(t[0],` -`),header:[],align:[],rows:[]};if(n.length===r.length){for(let e of r)this.rules.other.tableAlignRight.test(e)?a.align.push(`right`):this.rules.other.tableAlignCenter.test(e)?a.align.push(`center`):this.rules.other.tableAlignLeft.test(e)?a.align.push(`left`):a.align.push(null);for(let e=0;e({text:e,tokens:this.lexer.inline(e),header:!1,align:a.align[t]})));return a}}lheading(e){let t=this.rules.block.lheading.exec(e);if(t){let e=t[1].trim();return{type:`heading`,raw:_i(t[0],` -`),depth:t[2].charAt(0)===`=`?1:2,text:e,tokens:this.lexer.inline(e)}}}paragraph(e){let t=this.rules.block.paragraph.exec(e);if(t){let e=t[1].charAt(t[1].length-1)===` -`?t[1].slice(0,-1):t[1];return{type:`paragraph`,raw:t[0],text:e,tokens:this.lexer.inline(e)}}}text(e){let t=this.rules.block.text.exec(e);if(t)return{type:`text`,raw:t[0],text:t[0],tokens:this.lexer.inline(t[0])}}escape(e){let t=this.rules.inline.escape.exec(e);if(t)return{type:`escape`,raw:t[0],text:t[1]}}tag(e){let t=this.rules.inline.tag.exec(e);if(t)return!this.lexer.state.inLink&&this.rules.other.startATag.test(t[0])?this.lexer.state.inLink=!0:this.lexer.state.inLink&&this.rules.other.endATag.test(t[0])&&(this.lexer.state.inLink=!1),!this.lexer.state.inRawBlock&&this.rules.other.startPreScriptTag.test(t[0])?this.lexer.state.inRawBlock=!0:this.lexer.state.inRawBlock&&this.rules.other.endPreScriptTag.test(t[0])&&(this.lexer.state.inRawBlock=!1),{type:`html`,raw:t[0],inLink:this.lexer.state.inLink,inRawBlock:this.lexer.state.inRawBlock,block:!1,text:t[0]}}link(e){let t=this.rules.inline.link.exec(e);if(t){let e=t[2].trim();if(!this.options.pedantic&&this.rules.other.startAngleBracket.test(e)){if(!this.rules.other.endAngleBracket.test(e))return;let t=_i(e.slice(0,-1),`\\`);if((e.length-t.length)%2==0)return}else{let e=yi(t[2],`()`);if(e===-2)return;if(e>-1){let n=(t[0].indexOf(`!`)===0?5:4)+t[1].length+e;t[2]=t[2].substring(0,e),t[0]=t[0].substring(0,n).trim(),t[3]=``}}let n=t[2],r=``;if(this.options.pedantic){let e=this.rules.other.pedanticHrefTitle.exec(n);e&&(n=e[1],r=e[3])}else r=t[3]?t[3].slice(1,-1):``;return n=n.trim(),this.rules.other.startAngleBracket.test(n)&&(n=this.options.pedantic&&!this.rules.other.endAngleBracket.test(e)?n.slice(1):n.slice(1,-1)),xi(t,{href:n&&n.replace(this.rules.inline.anyPunctuation,`$1`),title:r&&r.replace(this.rules.inline.anyPunctuation,`$1`)},t[0],this.lexer,this.rules)}}reflink(e,t){let n;if((n=this.rules.inline.reflink.exec(e))||(n=this.rules.inline.nolink.exec(e))){let e=t[(n[2]||n[1]).replace(this.rules.other.multipleSpaceGlobal,` `).toLowerCase()];if(!e){let e=n[0].charAt(0);return{type:`text`,raw:e,text:e}}return xi(n,e,n[0],this.lexer,this.rules)}}emStrong(e,t,n=``){let r=this.rules.inline.emStrongLDelim.exec(e);if(!(!r||!r[1]&&!r[2]&&!r[3]&&!r[4]||r[4]&&n.match(this.rules.other.unicodeAlphaNumeric))&&(!(r[1]||r[3])||!n||this.rules.inline.punctuation.exec(n))){let i=[...r[0]].length-1,a,o,s=i,c=0,l=r[0][0],u=n===l,d=l===`*`?this.rules.inline.emStrongRDelimAst:this.rules.inline.emStrongRDelimUnd;for(d.lastIndex=0,t=t.slice(-1*e.length+i);(r=d.exec(t))!==null;){if(a=r[1]||r[2]||r[3]||r[4]||r[5]||r[6],!a)continue;if(o=[...a].length,r[3]||r[4]){s+=o;continue}if(r[5]||r[6]){if(i%3&&!((i+o)%3)){c+=o;continue}if(u)break}if(s-=o,s>0)continue;o=Math.min(o,o+s+c);let t=[...r[0]][0].length,n=e.slice(0,i+r.index+t+o);if(Math.min(i,o)%2){let e=n.slice(1,-1);return{type:`em`,raw:n,text:e,tokens:this.lexer.inlineTokens(e)}}let l=n.slice(2,-2);return{type:`strong`,raw:n,text:l,tokens:this.lexer.inlineTokens(l)}}}}codespan(e){let t=this.rules.inline.code.exec(e);if(t){let e=t[2].replace(this.rules.other.newLineCharGlobal,` `),n=this.rules.other.nonSpaceChar.test(e),r=this.rules.other.startingSpaceChar.test(e)&&this.rules.other.endingSpaceChar.test(e);return n&&r&&(e=e.substring(1,e.length-1)),{type:`codespan`,raw:t[0],text:e}}}br(e){let t=this.rules.inline.br.exec(e);if(t)return{type:`br`,raw:t[0]}}del(e,t,n=``){let r=this.rules.inline.delLDelim.exec(e);if(r&&(!r[1]||!n||this.rules.inline.punctuation.exec(n))){let n=[...r[0]].length-1,i,a,o=n,s=this.rules.inline.delRDelim;for(s.lastIndex=0,t=t.slice(-1*e.length+n);(r=s.exec(t))!==null;){if(i=r[1]||r[2]||r[3]||r[4]||r[5]||r[6],!i||(a=[...i].length,a!==n))continue;if(r[3]||r[4]){o+=a;continue}if(o-=a,o>0)continue;a=Math.min(a,a+o);let t=[...r[0]][0].length,s=e.slice(0,n+r.index+t+a),c=s.slice(n,-n);return{type:`del`,raw:s,text:c,tokens:this.lexer.inlineTokens(c)}}}}autolink(e){let t=this.rules.inline.autolink.exec(e);if(t){let e,n;return t[2]===`@`?(e=t[1],n=`mailto:`+e):(e=t[1],n=e),{type:`link`,raw:t[0],text:e,href:n,autolink:!0,tokens:[{type:`text`,raw:e,text:e}]}}}url(e){let t;if(t=this.rules.inline.url.exec(e)){let e,n;if(t[2]===`@`)e=t[0],n=`mailto:`+e;else{let r;do r=t[0],t[0]=this.rules.inline._backpedal.exec(t[0])?.[0]??``;while(r!==t[0]);e=t[0],n=t[1]===`www.`?`http://`+t[0]:t[0]}return{type:`link`,raw:t[0],text:e,href:n,autolink:!0,tokens:[{type:`text`,raw:e,text:e}]}}}inlineText(e){let t=this.rules.inline.text.exec(e);if(t){let e=this.lexer.state.inRawBlock;return{type:`text`,raw:t[0],text:t[0],escaped:e}}}},wi=class e{tokens;options;state;inlineQueue;tokenizer;constructor(e){this.tokens=[],this.tokens.links=Object.create(null),this.options=e||Xn,this.options.tokenizer=this.options.tokenizer||new Ci,this.tokenizer=this.options.tokenizer,this.tokenizer.options=this.options,this.tokenizer.lexer=this,this.inlineQueue=[],this.state={inLink:!1,inRawBlock:!1,linkEmitted:!1,top:!0};let t={other:Q,block:ui.normal,inline:di.normal};this.options.pedantic?(t.block=ui.pedantic,t.inline=di.pedantic):this.options.gfm&&(t.block=ui.gfm,t.inline=this.options.breaks?di.breaks:di.gfm),this.tokenizer.rules=t}static get rules(){return{block:ui,inline:di}}static lex(t,n){return new e(n).lex(t)}static lexInline(t,n){return new e(n).inlineTokens(t)}lex(e){e=e.replace(Q.carriageReturn,` -`),this.blockTokens(e,this.tokens);for(let e=0;e(i=n.call({lexer:this},e,t))?(e=e.substring(i.raw.length),t.push(i),!0):!1))continue;if(i=this.tokenizer.space(e)){e=e.substring(i.raw.length);let n=t.at(-1);i.raw.length===1&&n!==void 0?n.raw+=` -`:t.push(i);continue}if(i=this.tokenizer.code(e)){e=e.substring(i.raw.length);let n=t.at(-1);n?.type===`paragraph`||n?.type===`text`?(n.raw+=(n.raw.endsWith(` -`)?``:` -`)+i.raw,n.text+=` -`+i.text,this.inlineQueue.at(-1).src=n.text):t.push(i);continue}if(i=this.tokenizer.fences(e)){e=e.substring(i.raw.length),t.push(i);continue}if(i=this.tokenizer.heading(e)){e=e.substring(i.raw.length),t.push(i);continue}if(i=this.tokenizer.hr(e)){e=e.substring(i.raw.length),t.push(i);continue}if(i=this.tokenizer.blockquote(e)){e=e.substring(i.raw.length),t.push(i);continue}if(i=this.tokenizer.list(e)){e=e.substring(i.raw.length),t.push(i);continue}if(i=this.tokenizer.html(e)){e=e.substring(i.raw.length),t.push(i);continue}if(i=this.tokenizer.def(e)){e=e.substring(i.raw.length);let n=t.at(-1);n?.type===`paragraph`||n?.type===`text`?(n.raw+=(n.raw.endsWith(` -`)?``:` -`)+i.raw,n.text+=` -`+i.raw,this.inlineQueue.at(-1).src=n.text):this.tokens.links[i.tag]||(this.tokens.links[i.tag]={href:i.href,title:i.title},t.push(i));continue}if(i=this.tokenizer.table(e)){e=e.substring(i.raw.length),t.push(i);continue}if(i=this.tokenizer.lheading(e)){e=e.substring(i.raw.length),t.push(i);continue}let a=e;if(this.options.extensions?.startBlock){let t=1/0,n=e.slice(1),r;this.options.extensions.startBlock.forEach(e=>{r=e.call({lexer:this},n),typeof r==`number`&&r>=0&&(t=Math.min(t,r))}),t<1/0&&t>=0&&(a=e.substring(0,t+1))}if(this.state.top&&(i=this.tokenizer.paragraph(a))){let r=t.at(-1);n&&r?.type===`paragraph`?(r.raw+=(r.raw.endsWith(` -`)?``:` -`)+i.raw,r.text+=` -`+i.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=r.text):t.push(i),n=a.length!==e.length,e=e.substring(i.raw.length);continue}if(i=this.tokenizer.text(e)){e=e.substring(i.raw.length);let n=t.at(-1);n?.type===`text`?(n.raw+=(n.raw.endsWith(` -`)?``:` -`)+i.raw,n.text+=` -`+i.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=n.text):t.push(i);continue}if(e){this.infiniteLoopError(e.charCodeAt(0));break}}return this.state.top=!0,t}inline(e,t=[]){return this.inlineQueue.push({src:e,tokens:t}),t}linkInText(e){if(!e.includes(`[`))return!1;let t=this.tokenizer.rules.inline.link;for(let n of e.matchAll(this.tokenizer.rules.inline.blockSkip))if(t.test(n[0])&&e.charAt(n.index-1)!==`!`)return!0;for(let t of e.matchAll(this.tokenizer.rules.inline.reflinkSearch)){let e=t[0],n=e.lastIndexOf(`[`);if(!(e.charAt(0)===`!`||!Object.hasOwn(this.tokens.links,e.slice(n+1,-1)))&&!(n>1&&this.linkInText(e.slice(1,n-1))))return!0}return!1}inlineTokens(e,t=[]){this.tokenizer.lexer=this;let n=e;if(this.tokens.links&&e.includes(`[`)){let e=this.tokenizer.rules.inline.reflinkSearch,t=n=>{let r=n.lastIndexOf(`[`);if(!Object.hasOwn(this.tokens.links,n.slice(r+1,-1)))return n;if(r>1&&n.charAt(0)!==`!`){let i=n.slice(1,r-1);if(this.linkInText(i))return`[`+i.replace(e,t)+`][`+`a`.repeat(n.length-r-2)+`]`}return`[`+`a`.repeat(n.length-2)+`]`};n=n.replace(e,t)}n=n.replace(this.tokenizer.rules.inline.anyPunctuation,e=>`+`.repeat(e.length)),n=n.replace(this.tokenizer.rules.inline.blockSkip,(e,t,n)=>{let r=n?n.length:0;return e.slice(0,r)+`[`+`a`.repeat(e.length-r-2)+`]`}),n=this.options.hooks?.emStrongMask?.call({lexer:this},n)??n;let r=!1,i=``,a=1/0;for(;e;){if(e.length(o=n.call({lexer:this},e,t))?(e=e.substring(o.raw.length),t.push(o),!0):!1))continue;if(o=this.tokenizer.escape(e)){e=e.substring(o.raw.length),t.push(o);continue}if(o=this.tokenizer.tag(e)){e=e.substring(o.raw.length),t.push(o);continue}if(o=this.tokenizer.link(e)){e=e.substring(o.raw.length),t.push(o);continue}if(o=this.tokenizer.reflink(e,this.tokens.links)){e=e.substring(o.raw.length);let n=t.at(-1);o.type===`text`&&n?.type===`text`?(n.raw+=o.raw,n.text+=o.text):t.push(o);continue}if(o=this.tokenizer.emStrong(e,n,i)){e=e.substring(o.raw.length),t.push(o);continue}if(o=this.tokenizer.codespan(e)){e=e.substring(o.raw.length),t.push(o);continue}if(o=this.tokenizer.br(e)){e=e.substring(o.raw.length),t.push(o);continue}if(o=this.tokenizer.del(e,n,i)){e=e.substring(o.raw.length),t.push(o);continue}if(o=this.tokenizer.autolink(e)){e=e.substring(o.raw.length),t.push(o);continue}if(!this.state.inLink&&(o=this.tokenizer.url(e))){e=e.substring(o.raw.length),t.push(o);continue}let s=e;if(this.options.extensions?.startInline){let t=1/0,n=e.slice(1),r;this.options.extensions.startInline.forEach(e=>{r=e.call({lexer:this},n),typeof r==`number`&&r>=0&&(t=Math.min(t,r))}),t<1/0&&t>=0&&(s=e.substring(0,t+1))}if(o=this.tokenizer.inlineText(s)){e=e.substring(o.raw.length),o.raw.slice(-1)!==`_`&&(i=o.raw.slice(-1)),r=!0;let n=t.at(-1);n?.type===`text`?(n.raw+=o.raw,n.text+=o.text):t.push(o);continue}if(e){this.infiniteLoopError(e.charCodeAt(0));break}}return t}infiniteLoopError(e){let t=`Infinite loop on byte: `+e;if(this.options.silent)console.error(t);else throw Error(t)}},Ti=class{options;parser;constructor(e){this.options=e||Xn}space(e){return``}code({text:e,lang:t,escaped:n}){let r=(t||``).match(Q.notSpaceStart)?.[0],i=e?e.replace(Q.endingNewline,``)+` -`:``;return r?`
                `+(n?i:mi(i,!0))+`
                -`:`
                `+(n?i:mi(i,!0))+`
                -`}blockquote({tokens:e}){return`
                -${this.parser.parse(e)}
                -`}html({text:e}){return e}def(e){return``}heading({tokens:e,depth:t}){return`${this.parser.parseInline(e)} -`}hr(e){return`
                -`}list(e){let t=e.ordered,n=e.start,r=``;for(let t=0;t -`+r+` -`}listitem(e){return`
              • ${this.parser.parse(e.tokens)}
              • -`}checkbox({checked:e}){return` `}paragraph({tokens:e}){return`

                ${this.parser.parseInline(e)}

                -`}table(e){let t=``,n=``;for(let t=0;t${r}`,` - -`+t+` -`+r+`
                -`}tablerow({text:e}){return` -${e} -`}tablecell(e){let t=this.parser.parseInline(e.tokens),n=e.header?`th`:`td`;return(e.align?`<${n} align="${e.align}">`:`<${n}>`)+t+` -`}strong({tokens:e}){return`${this.parser.parseInline(e)}`}em({tokens:e}){return`${this.parser.parseInline(e)}`}codespan({text:e}){return`${mi(e,!0)}`}br(e){return`
                `}del({tokens:e}){return`${this.parser.parseInline(e)}`}link({href:e,title:t,text:n,tokens:r,autolink:i}){let a=i?mi(n,!0):this.parser.parseInline(r),o=hi(e);if(o===null)return a;e=mi(o,i);let s=`
                `+a+``,s}image({href:e,title:t,text:n,tokens:r}){r&&(n=this.parser.parseInline(r,this.parser.textRenderer));let i=hi(e);if(i===null)return mi(n);e=i;let a=`${mi(n)}`,a}text(e){return`tokens`in e&&e.tokens?this.parser.parseInline(e.tokens):`escaped`in e&&e.escaped?e.text:mi(e.text)}},Ei=class{strong({text:e}){return e}em({text:e}){return e}codespan({text:e}){return e}del({text:e}){return e}html({text:e}){return e}text({text:e}){return e}link({text:e}){return``+e}image({text:e}){return``+e}br(){return``}checkbox({raw:e}){return e}},Di=class e{options;renderer;textRenderer;constructor(e){this.options=e||Xn,this.options.renderer=this.options.renderer||new Ti,this.renderer=this.options.renderer,this.renderer.options=this.options,this.renderer.parser=this,this.textRenderer=new Ei}static parse(t,n){return new e(n).parse(t)}static parseInline(t,n){return new e(n).parseInline(t)}parse(e){this.renderer.parser=this;let t=``;for(let n=0;n{let i=e[r].flat(1/0);n=n.concat(this.walkTokens(i,t))}):e.tokens&&(n=n.concat(this.walkTokens(e.tokens,t)))}}return n}use(...e){let t=this.defaults.extensions||{renderers:{},childTokens:{}};return e.forEach(e=>{let n={...e};if(n.async=this.defaults.async||n.async||!1,e.extensions&&(e.extensions.forEach(e=>{if(!e.name)throw Error(`extension name required`);if(`renderer`in e){let n=t.renderers[e.name];n?t.renderers[e.name]=function(...t){let r=e.renderer.apply(this,t);return r===!1&&(r=n.apply(this,t)),r}:t.renderers[e.name]=e.renderer}if(`tokenizer`in e){if(!e.level||e.level!==`block`&&e.level!==`inline`)throw Error(`extension level must be 'block' or 'inline'`);let n=t[e.level];n?n.unshift(e.tokenizer):t[e.level]=[e.tokenizer],e.start&&(e.level===`block`?t.startBlock?t.startBlock.push(e.start):t.startBlock=[e.start]:e.level===`inline`&&(t.startInline?t.startInline.push(e.start):t.startInline=[e.start]))}`childTokens`in e&&e.childTokens&&(t.childTokens[e.name]=e.childTokens)}),n.extensions=t),e.renderer){let t=this.defaults.renderer||new Ti(this.defaults);for(let n in e.renderer){if(!(n in t))throw Error(`renderer '${n}' does not exist`);if([`options`,`parser`].includes(n))continue;let r=n,i=e.renderer[r],a=t[r];t[r]=(...e)=>{let n=i.apply(t,e);return n===!1&&(n=a.apply(t,e)),n||``}}n.renderer=t}if(e.tokenizer){let t=this.defaults.tokenizer||new Ci(this.defaults);for(let n in e.tokenizer){if(!(n in t))throw Error(`tokenizer '${n}' does not exist`);if([`options`,`rules`,`lexer`].includes(n))continue;let r=n,i=e.tokenizer[r],a=t[r];t[r]=(...e)=>{let n=i.apply(t,e);return n===!1&&(n=a.apply(t,e)),n}}n.tokenizer=t}if(e.hooks){let t=this.defaults.hooks||new Oi;for(let n in e.hooks){if(!(n in t))throw Error(`hook '${n}' does not exist`);if([`options`,`block`].includes(n))continue;let r=n,i=e.hooks[r],a=t[r];t[r]=Oi.passThroughHooks.has(n)?e=>{if(this.defaults.async&&Oi.passThroughHooksRespectAsync.has(n))return(async()=>{let n=await i.call(t,e);return a.call(t,n)})();let r=i.call(t,e);return a.call(t,r)}:(...e)=>{if(this.defaults.async)return(async()=>{let n=await i.apply(t,e);return n===!1&&(n=await a.apply(t,e)),n})();let n=i.apply(t,e);return n===!1&&(n=a.apply(t,e)),n}}n.hooks=t}if(e.walkTokens){let t=this.defaults.walkTokens,r=e.walkTokens;n.walkTokens=function(e){let n=[];return n.push(r.call(this,e)),t&&(n=n.concat(t.call(this,e))),n}}this.defaults={...this.defaults,...n}}),this}setOptions(e){return this.defaults={...this.defaults,...e},this}lexer(e,t){return wi.lex(e,t??this.defaults)}parser(e,t){return Di.parse(e,t??this.defaults)}parseMarkdown(e){return(t,n)=>{let r={...n},i={...this.defaults,...r},a=this.onError(!!i.silent,!!i.async);if(this.defaults.async===!0&&r.async===!1)return a(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 t>`u`||t===null)return a(Error(`marked(): input parameter is undefined or null`));if(typeof t!=`string`)return a(Error(`marked(): input parameter is of type `+Object.prototype.toString.call(t)+`, string expected`));if(i.hooks&&(i.hooks.options=i,i.hooks.block=e),i.async)return(async()=>{let n=i.hooks?await i.hooks.preprocess(t):t,r=await(i.hooks?await i.hooks.provideLexer(e):e?wi.lex:wi.lexInline)(n,i),a=i.hooks?await i.hooks.processAllTokens(r):r;i.walkTokens&&await Promise.all(this.walkTokens(a,i.walkTokens));let o=await(i.hooks?await i.hooks.provideParser(e):e?Di.parse:Di.parseInline)(a,i);return i.hooks?await i.hooks.postprocess(o):o})().catch(a);try{i.hooks&&(t=i.hooks.preprocess(t));let n=(i.hooks?i.hooks.provideLexer(e):e?wi.lex:wi.lexInline)(t,i);i.hooks&&(n=i.hooks.processAllTokens(n)),i.walkTokens&&this.walkTokens(n,i.walkTokens);let r=(i.hooks?i.hooks.provideParser(e):e?Di.parse:Di.parseInline)(n,i);return i.hooks&&(r=i.hooks.postprocess(r)),r}catch(e){return a(e)}}}onError(e,t){return n=>{if(n.message+=` -Please report this to https://github.com/markedjs/marked.`,e){let e=`

                An error occurred:

                `+mi(n.message+``,!0)+`
                `;return t?Promise.resolve(e):e}if(t)return Promise.reject(n);throw n}}};function $(e,t){return ki.parse(e,t)}$.options=$.setOptions=function(e){return ki.setOptions(e),$.defaults=ki.defaults,Zn($.defaults),$},$.getDefaults=Yn,$.defaults=Xn;function Ai(...e){return ki.use(...e),$.defaults=ki.defaults,Zn($.defaults),$}$.use=Ai,$.walkTokens=function(e,t){return ki.walkTokens(e,t)},$.parseInline=ki.parseInline,$.Parser=Di,$.parser=Di.parse,$.Renderer=Ti,$.TextRenderer=Ei,$.Lexer=wi,$.lexer=wi.lex,$.Tokenizer=Ci,$.Hooks=Oi,$.parse=$,$.options,$.setOptions,$.walkTokens,$.parseInline,Di.parse,wi.lex;function ji(e){return Fn.sanitize($.parse(e,{async:!1,breaks:!0,gfm:!0}))}function Mi(e){return new Intl.DateTimeFormat(void 0,{hour:`2-digit`,minute:`2-digit`}).format(new Date(e))}var Ni=i(``);function Pi(r,i){n(i,!0);let s=x(null),l=x(null),u=x(null),f=typeof document<`u`&&document.activeElement instanceof HTMLElement?document.activeElement:null,p=f?.closest(`.thread`),m=f?.closest(`.timeline`),h=p?.querySelector(`[aria-label="Reply body"]:not(:disabled)`)??p?.querySelector(`[aria-label="Close thread"]`)??m?.querySelector(`[aria-label="Message body"]:not(:disabled)`)??m?.querySelector(`[aria-label="Search messages"]`)??(typeof document<`u`?document.querySelector(`[aria-label="Reply body"]:not(:disabled)`)??document.querySelector(`[aria-label="Message body"]:not(:disabled)`)??document.querySelector(`[aria-label="Close thread"]`)??document.querySelector(`[aria-label="Search messages"]`):null),g=new Set;ee(()=>{let e=a(s)?.parentElement;if(e)for(let t of e.children)!(t instanceof HTMLElement)||t===a(s)||t.inert||(t.inert=!0,g.add(t));a(u)?.focus({preventScroll:!0})}),k(()=>{for(let e of g)e.inert=!1;g.clear(),!(f?.isConnected&&f!==document.body&&(f.focus({preventScroll:!0}),document.activeElement===f))&&h?.isConnected&&h.focus({preventScroll:!0})});function _(e){if(e.key===`Escape`){e.preventDefault(),e.stopPropagation(),i.onClose();return}if(e.key!==`Tab`||!a(l))return;let t=Array.from(a(l).querySelectorAll(`a[href], button:not([disabled]), [tabindex]:not([tabindex="-1"])`)).filter(e=>!e.inert&&e.getClientRects().length>0);if(t.length===0){e.preventDefault(),a(l).focus();return}let n=t[0],r=t[t.length-1];e.shiftKey&&(document.activeElement===n||!a(l).contains(document.activeElement))?(e.preventDefault(),r.focus()):!e.shiftKey&&(document.activeElement===r||!a(l).contains(document.activeElement))&&(e.preventDefault(),n.focus())}var y=Ni(),S=O(y),T=b(S,2),E=O(T),D=O(E),j=v(D,!0),ne=b(D,2),re=O(ne),ie=b(re,2);te(ie,e=>C(u,e),()=>a(u)),e(ne),e(E);var M=b(E,2),N=v(M);e(T),te(T,e=>C(l,e),()=>a(l)),e(y),te(y,e=>C(s,e),()=>a(s)),w(()=>{A(T,`aria-label`,`Image viewer: ${i.title}`),o(j,i.title),A(re,`href`,i.url),A(N,`src`,i.url),A(N,`alt`,i.title)}),t(`click`,S,function(...e){i.onClose?.apply(this,e)}),t(`keydown`,T,_),t(`click`,ie,function(...e){i.onClose?.apply(this,e)}),c(r,y),d()}N([`click`,`keydown`]);var Fi=i(``);function Ii(e,t){let n=m(t,`size`,3,44),r=m(t,`class`,3,``);var i=Fi();w(()=>{g(i,1,`keystroke-mark ${r()??``}`,`svelte-1bx7eka`),ie(i,`--keystroke-size: ${n()??``}px`)}),c(e,i)}var Li=i(`
                `),Ri=i(`
                `);function zi(t,n){let r=m(n,`rows`,3,3);var i=Ri();s(i,21,()=>Array.from({length:r()}),E,(e,t,n)=>{var r=Li();ie(r,`--history-row: ${n}`),c(e,r)}),e(i),w(()=>{g(i,1,`history-loader history-loader--${n.direction}`),A(i,`aria-label`,n.direction===`older`?`Loading older messages`:`Loading newer messages`)}),c(t,i)}var Bi=/(^|[^A-Za-z0-9_@-])(@[A-Za-z0-9][A-Za-z0-9_-]{0,31})/gu;function Vi(e){let t=new Map;for(let n of e){let e=n.handle?.trim().toLowerCase();e&&!n.deleted_at&&t.set(e,n)}return t}function Hi(e,t){let n=[];for(let r of e.matchAll(Bi)){let i=r[1]??``,a=r[2]??``,o=a.slice(1).toLowerCase(),s=r.index+i.length;!t.has(o)||Ui(e,s)||n.push({start:s,end:s+a.length,handle:o})}return n}function Ui(e,t){let n=Math.max(e.lastIndexOf(` `,t-1),e.lastIndexOf(` -`,t-1))+1,r=e.slice(n,t);return/^(?:www\.[^\s/]+|[A-Za-z][A-Za-z0-9+.-]*:\/\/[^\s/]+)\//u.test(r)||/(?:^|\/)[^\s/]*\/$/u.test(r)}function Wi(e){for(let t of e.querySelectorAll(`[data-clickclack-mention]`))t.replaceWith(e.ownerDocument.createTextNode(t.textContent??``))}function Gi(e){return!!e.parentElement?.closest(`a, code, pre, script, style, textarea`)}function Ki(e,t,n){if(Wi(e),t.size===0)return;let r=e.ownerDocument.createTreeWalker(e,4),i=[],a;for(;a=r.nextNode();)a instanceof Text&&!Gi(a)&&i.push(a);for(let r of i){let i=Hi(r.data,new Set(t.keys()));if(i.length===0)continue;let a=e.ownerDocument.createDocumentFragment(),o=0;for(let s of i){a.append(r.data.slice(o,s.start));let i=t.get(s.handle),c=e.ownerDocument.createElement(`mark`);c.className=`message-mention`,c.dataset.clickclackMention=`true`,c.dataset.mentionHandle=s.handle,i?.id&&(c.dataset.mentionUserId=i.id),i?.id&&i.id===n&&(c.classList.add(`is-current-user`),c.dataset.mentionAttention=`true`),c.title=i?.display_name||`@${s.handle}`,c.textContent=r.data.slice(s.start,s.end),a.append(c),o=s.end}a.append(r.data.slice(o)),r.replaceWith(a)}}function qi(e,t={}){let n=Vi(t.people??[]),r=t.attentionUserID??``,i,a=()=>{i?.disconnect(),Ki(e,n,r),i?.observe(e,{childList:!0,subtree:!0})};return i=new MutationObserver(()=>a()),a(),{update(e={}){n=Vi(e.people??[]),r=e.attentionUserID??``,a()},destroy(){i?.disconnect()}}}var Ji=[`👍`,`❤️`,`😂`,`😮`,`😢`,`🙏`,`🎉`,`🔥`,`💯`,`👀`,`🚀`,`✅`],Yi=[`👍`,`✅`,`👀`],Xi=[...Yi,...Ji.filter(e=>!Yi.includes(e))].slice(0,6),Zi=i(``),Qi=i(`
                `);function $i(r,i){n(i,!0);let l=m(i,`placement`,3,`above`),u=m(i,`disabled`,3,!1),f=x(void 0);function _(e){e.key===`Escape`&&(e.preventDefault(),i.onEscape())}h(()=>{(async()=>{await p(),a(f)?.querySelector(`.emoji-option`)?.focus()})()});var y=Qi();let b;s(y,21,()=>Ji,E,(e,n)=>{var r=Zi(),s=v(r,!0);w(()=>{A(r,`aria-label`,`React with ${a(n)}`),A(r,`title`,a(n)),r.disabled=u(),o(s,a(n))}),t(`click`,r,()=>i.onPick(a(n))),t(`keydown`,r,_),c(e,r)}),e(y),te(y,e=>C(f,e),()=>a(f)),w(()=>{b=g(y,1,`emoji-grid svelte-1caswp`,null,b,{below:l()===`below`,"above-right":l()===`above-right`}),A(y,`id`,i.id)}),c(r,y),d()}N([`click`,`keydown`]);var ea=i(` `),ta=i(``),na=i(`
                `),ra=i(` `),ia=i(`
                `);function aa(i,l){n(l,!0);let u=m(l,`reactions`,19,()=>[]),f=m(l,`pending`,3,!1),p=m(l,`error`,3,``),_=m(l,`disabled`,3,!1),y=M(()=>[...u()].sort((e,t)=>t.count-e.count||e.emoji.localeCompare(t.emoji))),S=x(!1),D=x(void 0),k=x(void 0),j=M(()=>`reaction-picker-${l.messageId}`);function ee(){_()||f()||C(S,!a(S))}function re(e){_()||f()||(l.onToggle(e),C(S,!1))}function ie(){C(S,!1),a(k)?.focus()}function N(e){a(D)&&!a(D).contains(e.target)&&C(S,!1)}h(()=>{if(a(S))return document.addEventListener(`click`,N),()=>document.removeEventListener(`click`,N)}),h(()=>{(_()||f())&&C(S,!1)});var P=r(),F=ne(P),ae=n=>{var r=ia(),i=O(r);s(i,17,()=>a(y),E,(n,r)=>{let i=()=>a(r).emoji,s=()=>a(r).count,u=()=>a(r).reacted_by_me;var d=ta();let p;var m=O(d),h=v(m,!0),y=b(m,2),x=e=>{var t=ea(),n=v(t,!0);w(()=>o(n,s())),c(e,t)};T(y,e=>{s()>1&&e(x)}),e(d),w(()=>{p=g(d,1,`reaction-btn svelte-nxju2c`,null,p,{me:u()}),d.disabled=_()||f(),A(d,`aria-pressed`,u()),A(d,`aria-label`,`${i()??``} — ${s()??``} reaction${s()===1?``:`s`}`),A(d,`title`,i()),o(h,i())}),t(`click`,d,()=>l.onToggle(i())),c(n,d)});var u=b(i,2),d=n=>{var r=na(),i=O(r);te(i,e=>C(k,e),()=>a(k));var o=b(i,2),s=e=>{{let t=M(()=>_()||f());$i(e,{get id(){return a(j)},get disabled(){return a(t)},onPick:re,onEscape:ie})}};T(o,e=>{a(S)&&e(s)}),e(r),te(r,e=>C(D,e),()=>a(D)),w(()=>{A(i,`aria-controls`,a(j)),A(i,`aria-expanded`,a(S)),i.disabled=_()||f()}),t(`click`,i,ee),c(n,r)};T(u,e=>{a(y).length>0&&!_()&&e(d)});var m=b(u,2),h=e=>{var t=ra(),n=v(t,!0);w(()=>o(n,p())),c(e,t)};T(m,e=>{p()&&e(h)}),e(r),c(n,r)};T(F,e=>{(a(y).length>0||p())&&e(ae)}),c(i,P),d()}N([`click`]);function oa(e){return document.body.appendChild(e),{destroy(){e.remove()}}}var sa=i(``),ca=i(``),la=i(` `),ua=i(`Couldn't create link`),da=i(``),fa=i(`

                `),pa=i(` `,1),ma=i(``),ha=i(``),ga=i(``);function _a(r,i){n(i,!0);let l=m(i,`canReact`,3,!1),f=m(i,`canReply`,3,!1),p=m(i,`showOpenThread`,3,!0),h=m(i,`canOpenThread`,3,!1),_=m(i,`canEdit`,3,!1),y=m(i,`canPin`,3,!1),S=m(i,`pinned`,3,!1),D=m(i,`pinning`,3,!1),j=m(i,`pinError`,3,``),re=m(i,`canDelete`,3,!1),ie=m(i,`deleting`,3,!1),M=m(i,`copyStatus`,3,``),N=m(i,`canCopyLink`,3,!1),P=m(i,`copyLinkStatus`,3,``),F=x(void 0),ae=x(void 0),oe=!0,I=new Set;function se(e){if(e.key===`Escape`){e.preventDefault(),e.stopPropagation(),i.onClose();return}if(e.key!==`Tab`||!a(ae))return;let t=[...a(ae).querySelectorAll(`a[href], button:not([disabled]), [tabindex]:not([tabindex="-1"])`)].filter(e=>!e.inert&&e.getClientRects().length>0);if(t.length===0){e.preventDefault(),a(ae).focus();return}let n=t[0],r=t[t.length-1];e.shiftKey&&(document.activeElement===n||!a(ae).contains(document.activeElement))?(e.preventDefault(),r.focus()):!e.shiftKey&&(document.activeElement===r||!a(ae).contains(document.activeElement))&&(e.preventDefault(),n.focus())}function ce(e,t=!1){oe=t,e()}ee(()=>{let e=a(F)?.parentElement;if(e)for(let t of e.children)!(t instanceof HTMLElement)||t===a(F)||t.inert||(t.inert=!0,I.add(t));a(ae)?.querySelector(`button:not(:disabled)`)?.focus({preventScroll:!0})}),k(()=>{for(let e of I)e.inert=!1;I.clear(),oe&&i.returnFocus?.isConnected&&i.returnFocus.focus({preventScroll:!0})});var le=ga(),ue=O(le),L=b(ue,2),R=b(O(L),2);s(R,21,()=>Xi,E,(e,n)=>{var r=sa(),s=v(r,!0);w(()=>{A(r,`aria-label`,`React with ${a(n)}`),r.disabled=!l(),o(s,a(n))}),t(`click`,r,()=>ce(()=>i.onReact(a(n)),!0)),c(e,r)}),e(R);var z=b(R,2),de=O(z),B=e=>{var n=ca();w(()=>n.disabled=!h()),t(`click`,n,()=>ce(i.onOpenThread)),c(e,n)};T(de,e=>{p()&&e(B)});var V=b(de,2),H=b(V,2),fe=b(O(H),2),pe=e=>{var t=la();let n;var r=v(t,!0);w(()=>{n=g(t,1,`sheet-copy-status`,null,n,{"is-error":M()===`failed`}),o(r,M()===`copied`?`Copied`:`Couldn't copy`)}),c(e,t)};T(fe,e=>{M()&&e(pe)}),e(H);var me=b(H,2),he=n=>{var r=da(),a=b(O(r)),s=b(a),l=e=>{var t=ua();c(e,t)};T(s,e=>{P()===`failed`&&e(l)}),e(r),w(()=>{r.disabled=P()===`pending`,o(a,` ${P()===`pending`?`Creating link…`:`Copy link`} `)}),t(`click`,r,function(...e){i.onCopyLink?.apply(this,e)}),c(n,r)};T(me,e=>{N()&&i.onCopyLink&&e(he)});var ge=b(me,2),_e=n=>{var r=pa(),a=ne(r),s=b(O(a));e(a);var l=b(a,2),u=e=>{var t=fa(),n=v(t,!0);w(()=>o(n,j())),c(e,t)};T(l,e=>{j()&&e(u)}),w(()=>{a.disabled=D(),o(s,` ${S()?`Unpin message`:`Pin message`}`)}),t(`click`,a,function(...e){i.onTogglePin?.apply(this,e)}),c(n,r)};T(ge,e=>{y()&&i.onTogglePin&&e(_e)});var ve=b(ge,2),ye=e=>{var n=ma();t(`click`,n,()=>ce(i.onEdit)),c(e,n)};T(ve,e=>{_()&&e(ye)});var be=b(ve,2),xe=e=>{var n=ha();w(()=>n.disabled=ie()),t(`click`,n,()=>ce(i.onDelete)),c(e,n)};T(be,e=>{re()&&e(xe)}),e(z),e(L),te(L,e=>C(ae,e),()=>a(ae)),e(le),te(le,e=>C(F,e),()=>a(F)),u(le,e=>oa?.(e)),w(()=>{A(L,`id`,i.id),V.disabled=!f()}),t(`keydown`,le,se),t(`click`,ue,function(...e){i.onClose?.apply(this,e)}),t(`click`,V,()=>ce(i.onReply)),t(`click`,H,function(...e){i.onCopy?.apply(this,e)}),c(r,le),d()}N([`keydown`,`click`]);var va=i(``);function ya(r,i){n(i,!0);let o=x(void 0),s=x(void 0),l=new Set;function f(e){e.key===`Escape`&&(e.preventDefault(),i.onClose())}function p(){a(s)?.focus({preventScroll:!0}),a(s)?.select()}ee(()=>{let e=a(o)?.parentElement;if(e)for(let t of e.children)!(t instanceof HTMLElement)||t===a(o)||t.inert||(t.inert=!0,l.add(t));p()}),k(()=>{for(let e of l)e.inert=!1;l.clear(),i.returnFocus?.isConnected&&i.returnFocus.focus({preventScroll:!0})});var m=va(),h=O(m),g=b(h,2),_=b(O(g),4);y(_),te(_,e=>C(s,e),()=>a(s));var v=b(_,2);e(g),e(m),te(m,e=>C(o,e),()=>a(o)),u(m,e=>oa?.(e)),w(()=>S(_,i.url)),t(`keydown`,m,f),t(`click`,h,function(...e){i.onClose?.apply(this,e)}),t(`click`,_,p),t(`click`,v,function(...e){i.onClose?.apply(this,e)}),c(r,m),d()}N([`keydown`,`click`]);function ba(e,t){if(!e)return!1;let n=window.innerHeight,r=e.parentElement;for(;r;){let e=getComputedStyle(r).overflowY;if(e===`auto`||e===`scroll`||e===`hidden`){n=r.getBoundingClientRect().bottom;break}r=r.parentElement}let i=e.getBoundingClientRect();return n-i.bottomt}var xa=i(`
                `),Sa=i(``),Ca=i(` `,1),wa=i(`
                `,2),Ta=i(`
                `),Ea=i(`
                `),Da=i(` `);function Oa(i,s){n(s,!0);let l=m(s,`onOpenImage`,3,()=>{}),u=m(s,`onOpenArtifact`,3,()=>{}),p=x(null),h=x(!1),_=x(``),y=M(()=>a(_)||P(s.upload.duration_ms??0)),S=M(()=>Wn(s.upload)),E=M(()=>Gn(s.upload)),D=M(()=>a(E)===`unsupported`&&a(S).startsWith(`image/`)),k=M(()=>a(E)===`unsupported`&&a(S).startsWith(`video/`)),j=M(()=>a(E)===`unsupported`&&a(S).startsWith(`audio/`)),ee=M(()=>Jn(a(E))!==void 0),re=M(()=>qn(a(E))),N=M(()=>{let e=s.upload.width??0,t=s.upload.height??0;if(e<=0||t<=0)return``;let n=a(D)?320:360;return`aspect-ratio: ${e} / ${t}; max-height: ${Math.min(n,Math.max(120,t))}px;`});function P(e){if(!e||e<=0)return``;let t=Math.floor(e/1e3);return`${Math.floor(t/60)}:${(t%60).toString().padStart(2,`0`)}`}function F(){C(h,!0)}function ae(){!a(p)||!isFinite(a(p).duration)||C(_,P(a(p).duration*1e3),!0)}function oe(){a(p)&&(C(h,!0),a(p).play())}var I=r(),se=ne(I),ce=n=>{var r=xa(),i=O(r),u=v(i),d=b(i,2),f=O(d),p=v(f,!0),m=b(f,2);e(d),e(r),w(()=>{A(i,`aria-label`,`Open image ${s.upload.filename}`),A(u,`src`,s.url),A(u,`alt`,s.upload.filename),A(u,`width`,s.upload.width||void 0),A(u,`height`,s.upload.height||void 0),ie(u,a(N)),o(p,s.upload.filename),A(m,`href`,s.url),A(m,`download`,s.upload.filename),A(m,`aria-label`,`Download ${s.upload.filename}`)}),t(`click`,i,()=>l()(s.url,s.upload.filename)),t(`click`,m,e=>e.stopPropagation()),c(n,r)},le=n=>{var r=wa();let i;var l=O(r),u=v(l);te(l,e=>C(p,e),()=>a(p));var d=b(l,2),m=e=>{var n=Ca(),r=ne(n),i=b(r,2),l=e=>{var t=Sa(),n=v(t,!0);w(()=>o(n,a(y))),c(e,t)};T(i,e=>{a(y)&&e(l)}),w(()=>A(r,`aria-label`,`Play ${s.upload.filename}`)),t(`click`,r,oe),c(e,n)};T(d,e=>{a(h)||e(m)});var _=b(d,2),x=O(_),E=v(x,!0),D=b(x,2);e(_),e(r),w(()=>{i=g(r,1,`media-tile media-tile--video`,null,i,{"is-started":a(h)}),l.controls=a(h),A(l,`aria-label`,s.upload.filename),A(l,`width`,s.upload.width||void 0),A(l,`height`,s.upload.height||void 0),ie(l,a(N)),A(u,`src`,s.url),A(u,`type`,a(S)),o(E,s.upload.filename),A(D,`href`,s.url),A(D,`download`,s.upload.filename),A(D,`aria-label`,`Download ${s.upload.filename}`)}),f(`play`,l,F),f(`loadedmetadata`,l,ae),t(`click`,D,e=>e.stopPropagation()),c(n,r)},ue=t=>{var n=Ta(),r=O(n),i=b(O(r),2),a=O(i),l=v(a,!0),u=b(a,2),d=v(u,!0);e(i),e(r);var f=b(r,2),p=O(f),m=v(p,!0);e(f),e(n),w(e=>{o(l,s.upload.filename),o(d,e),A(f,`src`,s.url),A(p,`href`,s.url),o(m,s.upload.filename)},[()=>Xe(s.upload.byte_size)]),c(t,n)},L=n=>{var r=Ea(),i=O(r),l=O(i),d=v(l,!0);e(i);var f=b(i,2),p=O(f),m=v(p,!0),h=b(p,2),g=v(h,!0);e(f);var _=b(f,2);e(r),w(e=>{A(i,`data-artifact-upload-id`,s.upload.id),A(i,`aria-label`,`Open ${s.upload.filename}`),o(d,a(re)),A(p,`data-artifact-upload-id`,s.upload.id),o(m,s.upload.filename),o(g,e),A(_,`href`,s.url),A(_,`download`,s.upload.filename),A(_,`aria-label`,`Download ${s.upload.filename}`)},[()=>Xe(s.upload.byte_size)]),t(`click`,i,()=>u()(s.upload)),t(`click`,p,()=>u()(s.upload)),c(n,r)},R=t=>{var n=Da(),r=b(O(n),2),i=O(r),a=v(i,!0),l=b(i,2),u=v(l,!0);e(r),e(n),w(e=>{A(n,`href`,s.url),A(n,`download`,s.upload.filename),A(n,`aria-label`,`Download ${s.upload.filename}`),o(a,s.upload.filename),o(u,e)},[()=>Xe(s.upload.byte_size)]),c(t,n)};T(se,e=>{a(D)?e(ce):a(k)?e(le,1):a(j)?e(ue,2):a(ee)?e(L,3):e(R,-1)}),c(i,I),d()}N([`click`]);var ka=i(``),Aa=i(`
                `);function ja(r,i){n(i,!0);let s=x(void 0);ee(async()=>{await p(),a(s)?.focus(),a(s)?.setSelectionRange(a(s).value.length,a(s).value.length)});function u(e){if(!(e.isComposing||e.keyCode===229)){if(e.key===`Escape`){e.preventDefault(),e.stopPropagation(),i.onCancel();return}e.target===a(s)&&e.key===`Enter`&&(e.metaKey||e.ctrlKey)&&(e.preventDefault(),i.onSave())}}var f=Aa(),m=O(f);_(m),te(m,e=>C(s,e),()=>a(s));var h=b(m,2),g=O(h),y=O(g),E=e=>{var t=l(`Saving…`);c(e,t)},D=e=>{var t=l(`Save`);c(e,t)};T(y,e=>{i.saving?e(E):e(D,-1)}),e(g);var k=b(g,2);e(h);var j=b(h,2),ne=e=>{var t=ka(),n=v(t,!0);w(()=>o(n,i.errorMessage)),c(e,t)};T(j,e=>{i.errorMessage&&e(ne)}),e(f),w(e=>{A(f,`aria-busy`,i.saving),S(m,i.body),m.disabled=i.saving,A(m,`aria-invalid`,i.errorMessage?`true`:void 0),A(m,`aria-describedby`,i.errorMessage?`message-edit-error`:void 0),g.disabled=e,k.disabled=i.saving},[()=>i.saving||!Oe(i.body)]),t(`keydown`,f,u),t(`input`,m,e=>i.onBody(e.currentTarget.value)),t(`click`,g,function(...e){i.onSave?.apply(this,e)}),t(`click`,k,function(...e){i.onCancel?.apply(this,e)}),c(r,f),d()}N([`keydown`,`input`,`click`]);var Ma=i(` `),Na=i(` `),Pa=i(``);function Fa(i,a){n(a,!0);var s=r(),l=ne(s),u=n=>{var r=Pa();let i;var s=b(O(r),2),l=O(s),u=v(l,!0),d=b(l,2),f=e=>{var t=Ma(),n=v(t,!0);w(e=>o(n,e),[()=>ge(a.message.quoted_body_snapshot)]),c(e,t)},p=e=>{var t=Na(),n=v(t);w(e=>o(n,`[original deleted] ${e??``}`),[()=>ge(a.message.quoted_body_snapshot)]),c(e,t)};T(d,e=>{a.message.quoted_message_id?e(f):e(p,-1)}),e(s),e(r),w((e,t)=>{i=g(r,1,`quote-block`,null,i,{dangling:!a.message.quoted_message_id}),r.disabled=!a.message.quoted_message_id,A(r,`aria-label`,e),o(u,t)},[()=>a.message.quoted_message_id?`Jump to quoted message from ${_e(a.message)}`:`Original message was deleted`,()=>_e(a.message)]),t(`click`,r,()=>a.onJump(a.message)),c(n,r)};T(l,e=>{(a.message.quoted_message_id||a.message.quoted_body_snapshot)&&e(u)}),c(i,s),d()}N([`click`]);export{Ce as A,Je as C,ke as D,Le as E,fe as F,pe as I,H as L,ye as M,be as N,Ee as O,ve as P,V as R,Xe as S,Fe as T,Kn as _,ya as a,Fn as b,$i as c,zi as d,Ii as f,qn as g,Mi as h,ba as i,we as j,Te as k,Yi as l,ji as m,ja as n,_a as o,Pi as p,Oa as r,aa as s,Fa as t,qi as u,Jn as v,ze as w,ft as x,Gn as y}; \ No newline at end of file diff --git a/apps/api/internal/webassets/dist/_app/immutable/chunks/CdcQtYSQ.js b/apps/api/internal/webassets/dist/_app/immutable/chunks/CdcQtYSQ.js new file mode 100644 index 000000000..4acec9052 --- /dev/null +++ b/apps/api/internal/webassets/dist/_app/immutable/chunks/CdcQtYSQ.js @@ -0,0 +1,70 @@ +import{At as e,B as t,D as n,Et as r,F as i,I as a,K as o,N as s,O as c,P as l,R as u,S as d,Tt as f,V as p,X as m,Z as h,a as g,at as _,b as v,bt as y,dt as b,f as x,ft as S,gt as C,h as w,ht as T,it as E,j as D,k as O,kt as k,lt as A,n as j,p as M,pt as ee,r as N,s as P,ut as te,x as ne,y as F,yt as I,z as L}from"./CxKeDCcw.js";import"./xihTtKlq.js";import{a as R,n as re,o as z,t as ie,u as ae}from"./DEPNME54.js";import{d as B,f as oe,l as se,r as ce,u as V}from"./C7NZ0SeM.js";var le=Symbol(`clickclackAnimatedURL`),H=new WeakMap;function U(e){let t=e.scrollWidth-e.clientWidth>1;if(e.toggleAttribute(`data-overflowing`,t),t){e.tabIndex=0,e.setAttribute(`role`,`group`),e.setAttribute(`aria-label`,`Scrollable table`);return}e.removeAttribute(`tabindex`),e.removeAttribute(`role`),e.removeAttribute(`aria-label`)}var W=typeof ResizeObserver>`u`?null:new ResizeObserver(e=>{let t=new Set;for(let n of e){let e=H.get(n.target);e&&t.add(e)}for(let e of t)U(e)});function ue(e){return e[le]||e.currentSrc||e.src}function de(e){let t=new Map,n=new Map,r=new Map,i=new Map,a=!1,o=e=>{let t=r.get(e);t&&(W?.unobserve(e),W?.unobserve(t),r.delete(e))},s=()=>{for(let t of r.keys())e.contains(t)||o(t);for(let t of e.querySelectorAll(`table`)){let e=t.parentElement?.classList.contains(`markdown-table-scroll`)===!0?t.parentElement:null;e&&r.has(e)||(e||(e=document.createElement(`div`),e.className=`markdown-table-scroll`,t.before(e),e.append(t)),r.set(e,t),H.set(e,e),H.set(t,e),W?.observe(e),W?.observe(t),U(e))}},c=e=>{try{let t=new URL(e,window.location.href);if(t.hostname!==`giphy.com`&&!t.hostname.endsWith(`.giphy.com`))return``;let n=t.pathname.match(/\/media\/(?:v1\.[^/]+\/)?([^/]+)\/giphy\.gif$/);if(n)return`${t.origin}/media/${n[1]}/giphy_s.gif`}catch{return``}return``},l=e=>`${e}${e.includes(`?`)?`&`:`?`}cc_replay=${Date.now()}`,u=(e,r,i,o,s,c=!1)=>{let u=t.get(r);u&&window.clearTimeout(u);let d=(n.get(r)||0)+1;n.set(r,d),e.classList.add(`playing`),e.classList.remove(`paused`),i.disabled=!0,i.tabIndex=-1,i.ariaHidden=`true`;let f=!1,p=()=>{if(f||(f=!0,a||n.get(r)!==d))return;let o=window.setTimeout(()=>{a||n.get(r)!==d||(e.classList.remove(`playing`),e.classList.add(`paused`),i.disabled=!1,i.tabIndex=0,i.ariaHidden=`false`,s&&(r.src=s))},2600);t.set(r,o)},m=()=>{r.decode().catch(()=>{}).then(p)};r.addEventListener(`load`,m,{once:!0}),c&&(r.src=l(o)),r.complete&&r.naturalWidth>0&&m()},d=()=>{s();for(let t of e.querySelectorAll(`img`)){if(t.closest(`.gif-player`)||t.closest(`a`))continue;let e=t.getAttribute(`src`)||t.src;if(!/\.gif(?:$|[?#])/i.test(e))continue;let n=c(e);if(!n)continue;let r=document.createElement(`span`);r.className=`gif-player`;let a=document.createElement(`span`);a.className=`gif-badge`,a.textContent=`GIF`;let o=document.createElement(`button`);o.type=`button`,o.className=`gif-replay`,o.disabled=!0,o.tabIndex=-1,o.ariaHidden=`true`,o.ariaLabel=`Replay GIF ${t.alt||`image`}`,o.title=`Replay GIF`,o.textContent=`↻`;let s=t.parentNode,l=t.nextSibling,d=t.getAttribute(`src`)||t.src;t[le]=e,s?.insertBefore(r,t),r.append(t,a,o);let f=i=>{i.preventDefault(),i.stopPropagation(),u(r,t,o,e,n,!0)};i.set(t,{wrapper:r,replay:o,originalSrc:d,originalParent:s,originalNextSibling:l,onReplay:f}),o.addEventListener(`click`,f),u(r,t,o,e,n)}},f=new MutationObserver(d);return f.observe(e,{childList:!0,subtree:!0}),d(),{destroy(){a=!0,f.disconnect();for(let e of r.keys())o(e);for(let e of t.values())window.clearTimeout(e);for(let[e,t]of i)t.replay.removeEventListener(`click`,t.onReplay),delete e[le],e.src=t.originalSrc,t.wrapper.parentNode?t.wrapper.replaceWith(e):t.originalParent&&e.parentNode!==t.originalParent&&t.originalParent.insertBefore(e,t.originalNextSibling);i.clear(),t.clear(),n.clear()}}}var G=1e3;function fe(e,t,n){if(e.length<=900)return e;let r=pe(e,n);if(t===`prepend`)return me(e,0,700,r,`start`);if(t===`append`)return me(e,Math.max(0,e.length-700),e.length,r,`end`);if(t===`around`){let t=r?.first??-1,n=t>=0?t:Math.floor(e.length/2),i=Math.max(0,n-350),a=Math.min(e.length,i+700);return i=Math.max(0,a-700),me(e,i,a,r,`start`)}return me(e,Math.max(0,e.length-700),e.length,r,`end`)}function pe(e,t){if(t.size===0)return null;let n=-1,r=-1;for(let i=0;i1e3&&(i===`start`?(a=t,o=Math.min(e.length,a+G)):(o=n,a=Math.max(0,o-G))),e.slice(a,o)}function he(e,t=120){if(!e||t<=0)return``;let n=e.replace(/\s+/g,` `).trim();return n.length<=t?n:t<=3?`.`.repeat(t):`${n.slice(0,t-3)}...`}function K(e){return B(e.quoted_author,`Unknown`)}function ge(e,t){if(t===e.id)return`Open`;let n=e.thread_state?.reply_count||0;return n===0?`No replies yet`:`${n} ${n===1?`reply`:`replies`}`}function _e(e){let t=e.thread_state?.reply_count||0;return t===0?`Thread`:`${t} ${t===1?`reply`:`replies`}`}function ve(e){let t=e.thread_state?.last_reply_at;return t?ye(t):``}function ye(e){let t=new Date(e).getTime();if(!Number.isFinite(t))return``;let n=Math.max(0,Date.now()-t),r=Math.floor(n/6e4);if(r<1)return`now`;if(r<60)return`${r}m`;let i=Math.floor(r/60);return i<24?`${i}h`:`${Math.floor(i/24)}d`}function be(e){let t=new Date(e),n=new Date,r=new Date;r.setDate(n.getDate()-1);let i=(e,t)=>e.getFullYear()===t.getFullYear()&&e.getMonth()===t.getMonth()&&e.getDate()===t.getDate();return i(t,n)?`Today`:i(t,r)?`Yesterday`:new Intl.DateTimeFormat(void 0,{weekday:`long`,month:`long`,day:`numeric`}).format(t)}function xe(e){let t=[],n=``,r=``,i=0;for(let a of e){let e=new Date(a.created_at),o=e.toDateString(),s=a.author?.id||a.author_id||`local`,c=o!==n,l=s!==r,u=e.getTime()-i>3e5;c||l||u||t.length===0?t.push({key:a.id,dayLabel:c?be(a.created_at):null,messages:[a],authorName:a.author?.display_name||`Local User`,authorHandle:oe(a.author),authorAvatarURL:V(a.author)?``:a.author?.avatar_url||``,authorID:s,authorDeleted:V(a.author),timestamp:a.created_at}):t[t.length-1].messages.push(a),n=o,r=s,i=e.getTime()}return t}function Se(){return typeof crypto<`u`&&typeof crypto.randomUUID==`function`?crypto.randomUUID().replace(/-/g,``):`${Date.now().toString(36)}${Math.random().toString(36).slice(2,10)}`}function Ce(e,t){let n={...e,...t,thread_state:t.thread_state?we(e.thread_state??null,t.thread_state):e.thread_state};return(e.deleted_at||!t.deleted_at&&(e.edited_at?.replace(/Z$/,``)??``)>(t.edited_at?.replace(/Z$/,``)??``))&&(n.body=e.body,n.edited_at=e.edited_at,n.deleted_at=e.deleted_at,e.deleted_at&&(n.attachments=e.attachments)),n}function we(e,t){return e?.root_message_id===t.root_message_id&&e.reply_count>t.reply_count?e:t}var Te=12;function Ee(e){return e.replace(/^\p{White_Space}+/u,``).replace(/\p{White_Space}+$/u,``)}var De=class{reveal;#e=C(ee(new Map));get sessions(){return o(this.#e)}set sessions(e){T(this.#e,e,!0)}generation=0;touchSequence=0;constructor(e){this.reveal=e}session(e){return e?this.sessions.get(e):void 0}isEditing(e,t,n){let r=this.session(e);return r?.messageID===t&&r.surface===n}start(e,t,n){if(!e||!t.id||t.deleted_at||t.status===`pending`||t.status===`failed`)return`invalid`;let r=this.sessions.get(e);if(r){if(r.messageID===t.id&&r.surface===n)return this.cancel(e)?`cancelled`:`blocked`;let i=this.touched(r);return this.setSession(e,i),this.reveal?.(e,i),`blocked`}let i={messageID:t.id,surface:n,threadRootID:n===`thread`?t.thread_root_id:void 0,threadSeq:t.thread_seq,originalBody:t.body,draft:t.body,error:``,saving:!1,generation:++this.generation,touchedAt:++this.touchSequence};return this.setSession(e,i),this.trimSessions(e),`started`}updateDraft(e,t){let n=this.sessions.get(e);!n||n.saving||this.setSession(e,this.touched({...n,draft:t,error:``}))}cancel(e,t){let n=this.sessions.get(e);return!n||n.saving||t&&n.surface!==t?!1:(this.deleteSession(e),!0)}cancelMessage(e,t){let n=this.sessions.get(e);return!n||n.messageID!==t?!1:this.cancel(e)}clear(){this.generation+=1,this.sessions=new Map}reconcile(e,t){let n=this.sessions.get(e);if(!n||n.saving)return;let r=t.find(e=>e.id===n.messageID);if(r){if(r.deleted_at){this.deleteSession(e);return}if(r.body!==n.originalBody){if(n.draft===n.originalBody){this.setSession(e,this.touched({...n,originalBody:r.body,draft:r.body,error:``}));return}this.setSession(e,this.touched({...n,originalBody:r.body,error:`This message changed elsewhere. Review your draft before saving.`}))}}}async save(e,t,n){let r=this.sessions.get(e);if(!r||r.messageID!==t.id||r.saving)return`invalid`;let i=Ee(r.draft);if(!i)return this.setSession(e,this.touched({...r,error:`Message body is required`})),`invalid`;if(i===t.body)return this.deleteSession(e),`cancelled`;this.setSession(e,this.touched({...r,error:``,saving:!0}));let a=r.generation;try{let i=await re(`/api/messages/${t.id}`,{method:`PATCH`,body:JSON.stringify({body:r.draft})});if(this.sessions.get(e)?.generation!==a)return`invalid`;let{id:o,thread_root_id:s,body:c,edited_at:l}=i.message;return n({id:o,thread_root_id:s,body:c,edited_at:l}),this.deleteSession(e),`saved`}catch(t){let n=this.sessions.get(e);return n?.generation===a?(this.setSession(e,this.touched({...n,error:ae(t,`Could not edit message`)})),`failed`):`invalid`}finally{let t=this.sessions.get(e);t?.generation===a&&this.setSession(e,this.touched({...t,saving:!1}))}}touched(e){return{...e,touchedAt:++this.touchSequence}}setSession(e,t){let n=new Map(this.sessions);n.delete(e),n.set(e,t),this.sessions=n}deleteSession(e){if(!this.sessions.has(e))return;let t=new Map(this.sessions);t.delete(e),this.sessions=t}trimSessions(e){if(this.sessions.size<=Te)return;let t=[...this.sessions.entries()].filter(([t,n])=>t!==e&&!n.saving).sort((e,t)=>e[1].touchedAt-t[1].touchedAt),n=this.sessions.size-Te,r=new Map(this.sessions);for(let[e]of t.slice(0,n))r.delete(e);this.sessions=r}},Oe=4001;function ke(e){return e===Oe}async function Ae(e){let t=e.readCursor();if(!e.isActive())return{active:!1};let n=await e.fetchTailCursor();return e.isActive()?{active:!0,cursor:t||n,persistAfterOpen:!t}:{active:!1}}var je=8192;function Me(e){let t=e.isActive??(()=>!0),n=e.maxPendingEvents??je,r=[],i=[],a=!1,o=!1;function s(){if(a)return!1;try{return t()}catch{return!1}}function c(){if(!(o||r.length>0))for(let e of i.splice(0))e()}function l(t){if(s()){a=!0,r.length=0;try{e.onError?.(t)}catch{}try{e.onFailure?.()}catch{}c()}}async function u(){if(!o){for(o=!0;s()&&r.length>0;){let t=r.shift();try{if(await e.onEvent(t),!s()){r.length=0;break}t.cursor&&e.persistCursor(t.cursor)}catch(e){l(e);break}}o=!1,c()}}return{enqueue(e){if(s()){if(r.length>=n){l(Error(`Realtime event queue overflowed; reconnecting to recover`));return}r.push(e),u()}},stop(){a=!0,r.length=0,c()},whenIdle(){return!o&&r.length===0?Promise.resolve():new Promise(e=>i.push(e))}}}var Ne=class extends Error{},Pe=e=>`clickclack:${e}:cursor`;function Fe(e){let{workspaceID:t,onEvent:n,onOpen:r,onError:i,onStatusChange:a}=e,o=e.reconnectDelayMs??1200,s=null,c=null,l,u=0,d=null,f=!1,p=!0,m=!1,h=null,g=!1,_=!1;function v(e){_!==e&&(_=e,a?.(e))}function y(e){try{i?.(e)}catch{}}function b(){if(m)return null;if(d!==null||f)return d;f=!0;try{d=localStorage.getItem(Pe(t))}catch{p=!1}return d}function x(e){if(d=e,p)try{localStorage.setItem(Pe(t),e)}catch{p=!1}}function S(e){return!g&&u===e}function C(e){if(!S(e)||l!==void 0)return;let t=++u;c?.abort(),c=null,v(!1),l=window.setTimeout(()=>{l=void 0,!g&&u===t&&E()},o)}async function w(e){let n=new URLSearchParams({workspace_id:t,limit:`1`,include_tail:`true`}),r=await z(`/api/realtime/events?${n.toString()}`,{signal:e}).catch(async n=>{if(n instanceof ie&&[400,403].includes(n.status)){let{workspaces:n}=await z(`/api/workspaces`,{signal:e});if(!n.some(e=>e.id===t))throw new Ne(`You no longer have access to this workspace.`)}throw n});if(typeof r.tail_cursor!=`string`)throw Error(`Realtime bootstrap response did not include a tail cursor`);return m?h??=r.tail_cursor:r.tail_cursor}async function T(e,i){let a=await Ae({readCursor:b,fetchTailCursor:()=>w(i),isActive:()=>S(e)});if(!a.active||!S(e))return;let o=new URL(R(`/api/realtime/ws`),window.location.href);o.protocol=o.protocol===`https:`?`wss:`:`ws:`,o.searchParams.set(`workspace_id`,t),a.cursor&&o.searchParams.set(`after_cursor`,a.cursor);let c=new WebSocket(o);s=c;let l=()=>S(e)&&s===c,u=Promise.resolve(),d=!1,f=t=>{l()&&(d||y(t),d=!0,C(e),c.close())},p=Me({async onEvent(e){await u,l()&&await n(e,l)},persistCursor(e){x(e)},onError:f,isActive:l});c.addEventListener(`open`,()=>{l()&&(u=Promise.resolve().then(()=>r?.(l,a.persistAfterOpen)).then(()=>{a.persistAfterOpen&&l()&&(x(a.cursor),m=!1,h=null)}),u.then(()=>{l()&&v(!0)},f))}),c.addEventListener(`message`,e=>{if(!l())return;let t;try{t=JSON.parse(String(e.data))}catch{return}Ie(t)&&p.enqueue(t)}),c.addEventListener(`close`,t=>{p.stop(),l()&&(ke(t.code)&&(m=!0,h=null),s=null,v(!1),C(e))})}function E(){if(g)return;let e=++u,t=new AbortController;c=t,T(e,t.signal).catch(t=>{S(e)&&(y(t instanceof ie&&t.status!==401?Error(t.message,{cause:t}):t),C(e))}).finally(()=>{c===t&&(c=null)})}return E(),{get connected(){return _},close(){g=!0,u+=1,c?.abort(),c=null,v(!1),l&&window.clearTimeout(l),l=void 0,s?.close(),s=null}}}function Ie(e){return typeof e==`object`&&!!e&&typeof e.type==`string`}var Le=G+50,Re=class{currentUserID;#e=C(ee(new Map));get entries(){return o(this.#e)}set entries(e){T(this.#e,e,!0)}revision=0;generation=0;constructor(e){this.currentUserID=e}clear(){this.generation+=1,this.revision=0,this.entries=new Map}seedMessages(e){if(e.length===0)return;let t=new Map(this.entries),n=!1;for(let r of e){let e=ze(r.reactions??[]),i=t.get(r.id);if(!i){t.set(r.id,this.newEntry(e,!0)),n=!0;continue}if(i.complete)continue;let a=Be(e,i.confirmed,i.partialEmojis);t.set(r.id,{...i,confirmed:a,displayed:Ve(a,i.pendingIntent),complete:!0,partialEmojis:new Map,revision:++this.revision}),n=!0}n&&(this.entries=Ke(t))}reactionsFor(e){return this.entries.get(e.id)?.displayed??e.reactions??[]}pending(e){return!!this.entries.get(e)?.pendingIntent}error(e){return this.entries.get(e)?.error??``}applyEvent(e){if(e.type!==`reaction.added`&&e.type!==`reaction.removed`)return;let t=e.payload.message_id,n=e.payload.emoji,r=e.payload.count;if(!t||!n||typeof r!=`number`)return;let i=this.entries.get(t);if(i?.lastEventCursor&&e.cursor&&e.cursor<=i.lastEventCursor)return;let a=e.payload.user_id===this.currentUserID(),o=new Map(i?.partialEmojis);i?.complete||o.set(n,r<=0?!1:a?e.type===`reaction.added`:o.get(n));let s=He(i?.confirmed??[],n,Math.max(0,r),e.type===`reaction.added`,a),c=i?.pendingIntent,l=a&&c?.emoji===n;this.setEntry(t,{confirmed:s,displayed:l?s:Ve(s,c),complete:i?.complete??!1,partialEmojis:o,revision:++this.revision,lastEventCursor:e.cursor||i?.lastEventCursor||``,pendingIntent:c,error:``})}async toggle(e,t){if(!this.currentUserID()||!t)return;let n=this.ensureEntry(e);if(n.pendingIntent)return;let r=Ue(n.displayed,t)?`remove`:`add`,i=this.generation,a=n.revision,o={emoji:t,intent:r};this.setEntry(e.id,{...n,displayed:Ve(n.confirmed,o),pendingIntent:o,error:``});try{let n=r===`remove`?await re(`/api/messages/${e.id}/reactions/${encodeURIComponent(t)}`,{method:`DELETE`}):await re(`/api/messages/${e.id}/reactions`,{method:`POST`,body:JSON.stringify({emoji:t})});if(i!==this.generation)return;let o=this.entries.get(e.id);if(!o)return;let s=n.event?.cursor??``;if(o.revision===a||s&&(!o.lastEventCursor||s>=o.lastEventCursor)){let t=ze(n.reactions);this.setEntry(e.id,{...o,confirmed:t,displayed:Ve(t,o.pendingIntent),complete:!0,partialEmojis:new Map,revision:++this.revision})}}catch(t){if(i!==this.generation)return;let n=this.entries.get(e.id)?.revision;try{let t=await re(`/api/messages/${e.id}`);if(i===this.generation&&this.entries.get(e.id)?.revision===n){let n=ze(t.message.reactions??[]),r=this.entries.get(e.id);r&&this.setEntry(e.id,{...r,confirmed:n,displayed:Ve(n,r.pendingIntent),complete:!0,partialEmojis:new Map,revision:++this.revision})}}catch{}let r=this.entries.get(e.id);i===this.generation&&r&&this.setEntry(e.id,{...r,error:We(r.confirmed,o)?``:ae(t,`Could not update reaction`)})}finally{if(i===this.generation){let t=this.entries.get(e.id);t?.pendingIntent===o&&this.setEntry(e.id,{...t,displayed:t.confirmed,pendingIntent:void 0})}}}ensureEntry(e){let t=this.entries.get(e.id);if(t)return t;let n=this.newEntry(ze(e.reactions??[]),!0);return this.setEntry(e.id,n),n}newEntry(e,t){return{confirmed:e,displayed:e,complete:t,partialEmojis:new Map,revision:++this.revision,lastEventCursor:``,error:``}}setEntry(e,t){let n=new Map(this.entries);n.delete(e),n.set(e,t),this.entries=Ke(n)}};function ze(e){let t=new Map;for(let n of e)!n.emoji||n.count<=0||t.set(n.emoji,{emoji:n.emoji,count:n.count,reacted_by_me:n.reacted_by_me});return Ge([...t.values()])}function Be(e,t,n){let r=new Map(e.map(e=>[e.emoji,e])),i=new Map(t.map(e=>[e.emoji,e]));for(let[e,t]of n){let n=i.get(e);n?r.set(e,{...n,reacted_by_me:t??r.get(e)?.reacted_by_me??!1}):r.delete(e)}return Ge([...r.values()])}function Ve(e,t){if(!t)return e;let n=e.map(e=>({...e})),r=n.findIndex(e=>e.emoji===t.emoji);if(t.intent===`remove`){if(r<0||!n[r].reacted_by_me)return n;n[r].count<=1?n.splice(r,1):n[r]={...n[r],count:n[r].count-1,reacted_by_me:!1}}else r<0?n.push({emoji:t.emoji,count:1,reacted_by_me:!0}):n[r].reacted_by_me||(n[r]={...n[r],count:n[r].count+1,reacted_by_me:!0});return Ge(n)}function He(e,t,n,r,i){let a=e.map(e=>({...e})),o=a.findIndex(e=>e.emoji===t);if(n===0)return o>=0&&a.splice(o,1),Ge(a);let s={emoji:t,count:n,reacted_by_me:i?r:o>=0&&a[o].reacted_by_me};return o>=0?a[o]=s:a.push(s),Ge(a)}function Ue(e,t){return e.some(e=>e.emoji===t&&e.reacted_by_me)}function We(e,t){return Ue(e,t.emoji)===(t.intent===`add`)}function Ge(e){return e.sort((e,t)=>t.count-e.count||e.emoji.localeCompare(t.emoji))}function Ke(e){let t=e.size;for(;e.size>Le&&t>0;){--t;let n=e.keys().next().value;if(!n)break;let r=e.get(n);e.delete(n),r?.pendingIntent&&e.set(n,r)}return e}function qe(e,t){let n=()=>{let t=e.style.height;e.style.height=`auto`;let n=`${e.scrollHeight}px`;t===n?e.style.height=t:e.style.height=n},r=()=>n(),i=()=>n();return requestAnimationFrame(n),e.addEventListener(`input`,r),window.addEventListener(`resize`,i),{update(){requestAnimationFrame(n)},destroy(){e.removeEventListener(`input`,r),window.removeEventListener(`resize`,i)}}}function Je(e){return R(`/api/uploads/${encodeURIComponent(e.id)}`)}function Ye(e){return e.content_type.startsWith(`image/`)}function Xe(e){return e<1024?`${e} B`:e<1048576?`${Math.round(e/1024)} KB`:`${(e/1048576).toFixed(1)} MB`}var q=[{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`]}],Ze=a(`
                `);function Qe(n,i){r(i,!0);let a=g(i,`disabled`,3,!1);var o=Ze(),s=A(o),c=S(s,2),u=S(c,2),d=A(u);d.textContent=`<>`,e(u);var p=S(u,2),m=A(p);m.textContent=`{}`,e(p);var h=S(p,2),_=S(h,2);let y;e(o),E(()=>{s.disabled=a(),c.disabled=a(),u.disabled=a(),p.disabled=a(),h.disabled=a(),M(_,`aria-expanded`,i.showGifPicker),_.disabled=a(),y=v(_,1,``,null,y,{active:i.showGifPicker})}),t(`click`,s,()=>i.onWrap(`**`)),t(`click`,c,()=>i.onWrap(`_`)),t(`click`,u,()=>i.onWrap("`")),t(`click`,p,()=>i.onWrap("\n```\n","\n```\n",`code`)),t(`click`,h,()=>i.onWrap(`[`,`](https://)`,`label`)),t(`click`,_,function(...e){i.onToggleGif?.apply(this,e)}),l(n,o),f()}L([`click`]);var $e=a(``),et=a(`

                No GIFs found

                `),tt=a(``);function nt(n,i){r(i,!0);let a=C(void 0);N(()=>o(a)?.focus());var u=tt(),d=A(u),p=S(A(d),2);x(p),P(p,e=>T(a,e),()=>o(a)),e(d);var m=S(d,2);c(m,21,()=>i.gifs,e=>e.url,(n,r)=>{var a=$e(),c=A(a),u=S(c,2),d=b(u,!0);e(a),E(()=>{M(c,`src`,o(r).url),M(c,`alt`,o(r).title),s(d,o(r).title)}),t(`click`,a,()=>i.onPick(o(r).url,o(r).title)),l(n,a)}),e(m);var h=S(m,2),g=e=>{var t=et();l(e,t)};D(h,e=>{i.gifs.length===0&&e(g)}),e(u),E(()=>w(p,i.query)),t(`keydown`,u,e=>{e.isComposing||e.keyCode===229||e.key===`Escape`&&(e.preventDefault(),i.onClose())}),t(`input`,p,e=>i.onQuery(e.currentTarget.value)),l(n,u),f()}L([`keydown`,`input`,`click`]);var rt=a(`
                Replying to
                `);function it(n,i){r(i,!0);var a=rt(),o=S(A(a),2),c=A(o),u=S(A(c)),d=b(u,!0);e(c);var p=S(c,2),m=b(p,!0);e(o);var h=S(o,2);e(a),E((e,t)=>{s(d,e),s(m,t)},[()=>B(i.target.author),()=>he(i.target.body)]),t(`click`,h,function(...e){i.onClear?.apply(this,e)}),l(n,a),f()}L([`click`]);var at=a(` `),ot=a(``),st=a(`
                `),ct=a(``),lt=a(`
                `),ut=a(``),dt=a(`
                `);function ft(n,i){r(i,!0);let a=g(i,`formClass`,3,`composer`),h=g(i,`pendingUpload`,3,null),x=g(i,`replyTarget`,3,null),O=g(i,`showUpload`,3,!1),j=g(i,`showToolbar`,3,!1),ee=g(i,`slashCommands`,19,()=>[]),N=g(i,`botCommands`,19,()=>[]),te=g(i,`mentionPeople`,19,()=>[]),F=g(i,`disabled`,3,!1),L=g(i,`onUploadFile`,3,()=>{}),R=g(i,`onRemoveUpload`,3,()=>{}),re=g(i,`onClearReply`,3,()=>{}),z=C(null),ie=C(0),ae=C(``),B=C(0),oe=C(!1),V=C(``),le=I(()=>{let e=o(V).trim().toLowerCase();return q.filter(t=>!e||t.title.toLowerCase().includes(e)||t.tags.some(t=>t.includes(e)))}),H=I(()=>W(i.value,o(ie))),U=I(()=>!o(H)||ue(o(H))===o(ae)?[]:o(H).kind===`slash`?fe(o(H)):me(o(H)));_(()=>(i.onInputRef(o(z)),()=>i.onInputRef(null))),_(()=>{if(o(U).length===0){T(B,0);return}o(B)>=o(U).length&&T(B,0)});function W(e,t){let n=e.slice(0,t),r=/(^|\s)([/@][^\s]*)$/.exec(n);if(!r)return null;let i=r[2],a=n.length-i.length;return i.startsWith(`/`)&&a!==0?null:{kind:i.startsWith(`/`)?`slash`:`mention`,start:a,end:n.length,query:i.slice(1).toLowerCase(),raw:i}}function ue(e){return`${e.kind}:${e.start}:${e.raw}`}function de(e=o(z)){T(ie,e?.selectionStart??i.value.length,!0)}function G(e){return e.startsWith(`/`)?e:`/${e}`}function fe(e){let t=e.query,n=ee().filter(e=>!e.revoked_at).map(e=>{let t=G(e.command);return{id:e.id,kind:`slash`,label:t,detail:e.description||`Slash command`,insertText:`${t} `,sortText:t.slice(1).toLowerCase()}}),r=new Set(n.map(e=>e.label)),i=N().filter(e=>!r.has(G(e.command))).map(e=>{let t=G(e.command);return{id:e.id,kind:`slash`,label:t,detail:e.description,insertText:`${t} `,sortText:t.slice(1).toLowerCase(),hint:e.args_hint||void 0,source:e.bot.handle?`@${e.bot.handle}`:e.bot.display_name}});return[...n,...i].filter(e=>!t||e.sortText.includes(t)).sort((e,n)=>Number(!e.sortText.startsWith(t))-Number(!n.sortText.startsWith(t))||e.sortText.localeCompare(n.sortText)).slice(0,6)}function pe(e){return se(e.handle||e.display_name.replace(/\s+/g,``))}function me(e){let t=e.query,n=new Set;return te().filter(e=>!e.id||!e.handle?.trim()||n.has(e.id)?!1:(n.add(e.id),!0)).map(e=>{let t=pe(e),n=`${e.handle||``} ${e.display_name}`.trim().toLowerCase();return{id:e.id,kind:`mention`,label:t,detail:e.kind===`bot`?`${e.display_name} · bot`:e.display_name,insertText:`${t} `,sortText:n}}).filter(e=>!t||e.sortText.includes(t)).sort((e,n)=>Number(!e.sortText.startsWith(t))-Number(!n.sortText.startsWith(t))||e.sortText.localeCompare(n.sortText)).slice(0,6)}function he(e){o(H)&&K(`${i.value.slice(0,o(H).start)}${e.insertText}${i.value.slice(o(H).end)}`,o(H).start+e.insertText.length)}async function K(e,t=e.length,n=t){F()||(i.onValue(e),await m(),!F()&&(o(z)?.focus(),o(z)?.setSelectionRange(t,n),T(ie,t,!0)))}function ge(e,t=e,n=`text`){let r=o(z)?.selectionStart??i.value.length,a=o(z)?.selectionEnd??r,s=i.value.slice(r,a)||n;K(`${i.value.slice(0,r)}${e}${s}${t}${i.value.slice(a)}`,r+e.length,r+e.length+s.length)}function _e(){o(oe)&&(T(oe,!1),T(V,``),o(z)?.focus())}function ve(e,t){let n=i.value&&!i.value.endsWith(` +`)?` +`:``;K(`${i.value}${n}![${t}](${e})`),_e()}function ye(e){let t=e.currentTarget;i.onValue(t.value),de(t)}function be(){de(),i.onFocus()}function xe(e){if(!(e.defaultPrevented||e.isComposing||e.keyCode===229)){if(e.key===`Escape`&&o(U).length>0&&o(H)){e.preventDefault(),T(ae,ue(o(H)),!0),o(z)?.focus();return}if(e.target===o(z)){if(o(U).length>0&&!e.shiftKey&&!e.ctrlKey&&!e.metaKey&&!e.altKey){if(e.key===`ArrowDown`||e.key===`ArrowUp`){e.preventDefault();let t=e.key===`ArrowDown`?1:-1;T(B,(o(B)+t+o(U).length)%o(U).length);return}if(e.key===`Enter`||e.key===`Tab`){e.preventDefault(),he(o(U)[o(B)]);return}}i.onKeydown(e)}}}var Se=dt(),Ce=A(Se),we=e=>{nt(e,{get gifs(){return o(le)},get query(){return o(V)},onQuery:e=>T(V,e,!0),onPick:ve,onClose:_e})};D(Ce,e=>{j()&&o(oe)&&!F()&&e(we)});var Te=S(Ce,2),Ee=n=>{var r=st();c(r,23,()=>o(U),e=>e.id,(n,r,i)=>{var a=ot();let c;var d=A(a),f=A(d),p=e=>{var t=u(`/`);l(e,t)},m=e=>{var t=u();E(e=>s(t,e),[()=>ce(o(r).detail)]),l(e,t)};D(f,e=>{o(r).kind===`slash`?e(p):e(m,-1)}),e(d);var h=S(d,2),g=A(h),_=A(g,!0),y=S(_),x=e=>{var t=at(),n=b(t,!0);E(()=>s(n,o(r).hint)),l(e,t)};D(y,e=>{o(r).hint&&e(x)}),e(g);var C=S(g,2),w=b(C,!0);e(h);var T=S(h,2),O=b(T,!0);e(a),E(()=>{M(a,`aria-selected`,o(i)===o(B)),c=v(a,1,``,null,c,{active:o(i)===o(B)}),s(_,o(r).label),s(w,o(r).detail),s(O,o(r).source??(o(r).kind===`slash`?`command`:`mention`))}),t(`mousedown`,a,e=>e.preventDefault()),t(`click`,a,()=>he(o(r))),l(n,a)}),e(r),E(()=>M(r,`aria-label`,o(H)?.kind===`slash`?`Slash command suggestions`:`Mention suggestions`)),l(n,r)};D(Te,e=>{o(U).length>0&&e(Ee)});var De=S(Te,2),Oe=A(De),ke=n=>{var r=lt(),i=S(A(r),2),a=e=>{var t=ct();E(e=>{M(t,`src`,e),M(t,`alt`,h().filename)},[()=>Je(h())]),l(e,t)},c=I(()=>Ye(h()));D(i,e=>{o(c)&&e(a)});var u=S(i,2),d=b(u),f=S(u,2);e(r),E(e=>s(d,`${h().filename??``} · ${e??``}`),[()=>Xe(h().byte_size)]),t(`click`,f,function(...e){R()?.apply(this,e)}),l(n,r)};D(Oe,e=>{h()&&e(ke)});var Ae=S(Oe,2),je=e=>{it(e,{get target(){return x()},get onClear(){return re()}})};D(Ae,e=>{x()&&e(je)});var Me=S(Ae,2),Ne=A(Me),Pe=n=>{var r=ut(),i=A(r);k(2),e(r),E(()=>i.disabled=F()),t(`change`,i,function(...e){L()?.apply(this,e)}),l(n,r)};D(Ne,e=>{O()&&e(Pe)});var Fe=S(Ne,2);y(Fe),P(Fe,e=>T(z,e),()=>o(z)),d(Fe,(e,t)=>qe?.(e,t),()=>i.value);var Ie=S(Fe,2);e(Me);var Le=S(Me,2),Re=e=>{Qe(e,{get showGifPicker(){return o(oe)},get disabled(){return F()},onWrap:ge,onToggleGif:()=>{o(oe)?_e():T(oe,!0)}})};D(Le,e=>{j()&&e(Re)}),e(De),e(Se),E(e=>{v(Se,1,ne(a())),M(Se,`data-handles-escape`,o(U).length>0?``:void 0),w(Fe,i.value),M(Fe,`placeholder`,i.placeholder),M(Fe,`aria-label`,i.ariaLabel),Fe.disabled=F(),M(Ie,`aria-label`,i.submitLabel),Ie.disabled=e},[()=>F()||!i.value.trim()]),t(`keydown`,Se,xe),p(`submit`,De,e=>{e.preventDefault(),!F()&&(_e(),i.onSubmit())}),t(`input`,Fe,ye),p(`focus`,Fe,be),t(`keyup`,Fe,()=>de()),t(`mouseup`,Fe,()=>de()),p(`select`,Fe,()=>de()),l(n,Se),f()}L([`keydown`,`mousedown`,`click`,`change`,`input`,`keyup`,`mouseup`]);function pt(e,t){(t==null||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n`u`?null:X(BigInt.prototype.toString),Ut=typeof Symbol>`u`?null:X(Symbol.prototype.toString),Wt=X(Object.prototype.hasOwnProperty),Gt=X(Object.prototype.toString),Kt=X(RegExp.prototype.test),qt=Jt(TypeError);function X(e){return function(t){t instanceof RegExp&&(t.lastIndex=0);var n=[...arguments].slice(1);return Et(e,t,n)}}function Jt(e){return function(){return Dt(e,[...arguments])}}function Z(e,t){let n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:Pt;if(bt&&bt(e,null),!Nt(t))return e;let r=t.length;for(;r--;){let i=t[r];if(typeof i==`string`){let e=n(i);e!==i&&(xt(t)||(t[r]=e),i=e)}e[i]=!0}return e}function Yt(e){for(let t=0;t/g),mn=Y(/\${[\w\W]*/g),hn=Y(/^data-[\-\w.\u00B7-\uFFFF]+$/),gn=Y(/^aria-[\-\w]+$/),_n=Y(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp|matrix):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i),vn=Y(/^(?:\w+script|data):/i),yn=Y(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g),bn=Y(/^html$/i),xn=Y(/^[a-z][.\w]*(-[.\w]+)+$/i),Sn=Y(/<[/\w!]/g),Cn=Y(/<[/\w]/g),wn=Y(/<\/no(script|embed|frames)/i),Tn=Y(/\/>/i),En={element:1,attribute:2,text:3,cdataSection:4,entityReference:5,entityNode:6,processingInstruction:7,comment:8,document:9,documentType:10,documentFragment:11,notation:12},Dn=[`style`,`script`,`xmp`,`iframe`,`noembed`,`noframes`,`plaintext`,`noscript`],On=J(Z({},Dn)),kn=function(){let e={};return Ot(Dn,t=>{e[t]=Y(RegExp(`])`,`i`))}),J(e)}(),An=function(){return typeof window>`u`?null:window},jn=function(e,t){if(typeof e!=`object`||typeof e.createPolicy!=`function`)return null;let n=null,r=`data-tt-policy-suffix`;t&&t.hasAttribute(r)&&(n=t.getAttribute(r));let i=`dompurify`+(n?`#`+n:``);try{return e.createPolicy(i,{createHTML(e){return e},createScriptURL(e){return e}})}catch{return console.warn(`TrustedTypes policy `+i+` could not be created.`),null}},Mn=function(){return{afterSanitizeAttributes:[],afterSanitizeElements:[],afterSanitizeShadowDOM:[],beforeSanitizeAttributes:[],beforeSanitizeElements:[],beforeSanitizeShadowDOM:[],uponSanitizeAttribute:[],uponSanitizeElement:[],uponSanitizeShadowNode:[]}},Nn=function(e,t,n,r){return Wt(e,t)&&Nt(e[t])?Z(r.base?Xt(r.base):{},e[t],r.transform):n},Pn=function(e,t,n){let r=Wt(e,t)?e[t]:void 0;return r&&typeof r==`object`?Xt(r):n()};function Fn(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:An(),t=e=>Fn(e);if(t.version=`3.4.15`,t.removed=[],!e||!e.document||e.document.nodeType!==En.document||!e.Element)return t.isSupported=!1,t;let n=e.document,r=n,i=r.currentScript;e.DocumentFragment;let a=e.HTMLTemplateElement,o=e.Node,s=e.Element,c=e.NodeFilter;e.NamedNodeMap===void 0&&(e.NamedNodeMap||e.MozNamedAttrMap),e.HTMLFormElement;let l=e.DOMParser,u=e.trustedTypes,d=s.prototype,f=Qt(d,`cloneNode`),p=Qt(d,`remove`),m=Qt(d,`removeAttributeNode`),h=Qt(d,`nextSibling`),g=Qt(d,`childNodes`),_=Qt(d,`parentNode`),v=Qt(d,`shadowRoot`),y=Qt(d,`attributes`),b=o&&o.prototype?Qt(o.prototype,`nodeType`):null,x=o&&o.prototype?Qt(o.prototype,`nodeName`):null,S=o&&o.prototype?Qt(o.prototype,`ownerDocument`):null,C=function(e){return b?b(e):e.nodeType},w=function(e){return x?x(e):e.nodeName};if(typeof a==`function`){let e=n.createElement(`template`);e.content&&e.content.ownerDocument&&(n=e.content.ownerDocument)}let T,E=``,D,O=!1,k=0,A=function(){if(k>0)throw qt(`A configured TRUSTED_TYPES_POLICY callback (createHTML or createScriptURL) must not call DOMPurify.sanitize, as that causes infinite recursion. Do not pass a policy whose callbacks wrap DOMPurify as TRUSTED_TYPES_POLICY; see the "DOMPurify and Trusted Types" section of the README.`)},j=function(e){A(),k++;try{return T.createHTML(e)}finally{k--}},M=function(e){A(),k++;try{return T.createScriptURL(e)}finally{k--}},ee=function(){return O||=(D=jn(u,i),!0),D},N=n,P=N.implementation,te=N.createNodeIterator,ne=N.createDocumentFragment,F=N.getElementsByTagName,I=r.importNode,L=Mn();t.isSupported=typeof yt==`function`&&typeof _==`function`&&P&&P.createHTMLDocument!==void 0;let R=fn,re=pn,z=mn,ie=hn,ae=gn,B=vn,oe=yn,se=xn,ce=_n,V=null,le=Z({},[...en,...tn,...nn,...an,...sn]),H=null,U=Z({},[...cn,...ln,...un,...dn]),W=Object.seal(wt(null,{tagNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},allowCustomizedBuiltInElements:{writable:!0,configurable:!1,enumerable:!0,value:!1}})),ue=null,de=null,G=Object.seal(wt(null,{tagCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeCheck:{writable:!0,configurable:!1,enumerable:!0,value:null}})),fe=!0,pe=!0,me=!1,he=!0,K=!1,ge=!0,_e=!1,ve=!1,ye=null,be=null,xe=!1,Se=!1,Ce=!1,we=!1,Te=!0,Ee=!1,De=`user-content-`,Oe=!0,ke=!1,Ae={},je=null,Me=Z({},`annotation-xml.audio.colgroup.desc.foreignobject.head.iframe.math.mi.mn.mo.ms.mtext.noembed.noframes.noscript.plaintext.script.selectedcontent.style.svg.template.thead.title.video.xmp`.split(`.`)),Ne=null,Pe=Z({},[`audio`,`video`,`img`,`source`,`image`,`track`]),Fe=null,Ie=Z({},[`alt`,`class`,`for`,`id`,`label`,`name`,`pattern`,`placeholder`,`role`,`summary`,`title`,`value`,`style`,`xmlns`]),Le=`http://www.w3.org/1998/Math/MathML`,Re=`http://www.w3.org/2000/svg`,ze=`http://www.w3.org/1999/xhtml`,Be=ze,Ve=!1,He=null,Ue=Z({},[Le,Re,ze],Ft),We=J([`mi`,`mo`,`mn`,`ms`,`mtext`]),Ge=Z({},We),Ke=J([`annotation-xml`]),qe=Z({},Ke),Je=Z({},[`title`,`style`,`font`,`a`,`script`]),Ye=null,Xe=[`application/xhtml+xml`,`text/html`],q=null,Ze=null,Qe=n.createElement(`form`),$e=function(e){return e instanceof RegExp||e instanceof Function},et=function(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};if(Ze&&Ze===e)return;(!e||typeof e!=`object`)&&(e={}),e=Xt(e),Ye=Xe.indexOf(e.PARSER_MEDIA_TYPE)===-1?`text/html`:e.PARSER_MEDIA_TYPE,q=Ye===`application/xhtml+xml`?Ft:Pt,V=Nn(e,`ALLOWED_TAGS`,le,{transform:q}),H=Nn(e,`ALLOWED_ATTR`,U,{transform:q}),He=Nn(e,`ALLOWED_NAMESPACES`,Ue,{transform:Ft}),Fe=Nn(e,`ADD_URI_SAFE_ATTR`,Ie,{transform:q,base:Ie}),Ne=Nn(e,`ADD_DATA_URI_TAGS`,Pe,{transform:q,base:Pe}),je=Nn(e,`FORBID_CONTENTS`,Me,{transform:q}),ue=Nn(e,`FORBID_TAGS`,Xt({}),{transform:q}),de=Nn(e,`FORBID_ATTR`,Xt({}),{transform:q}),Ae=Wt(e,`USE_PROFILES`)?e.USE_PROFILES&&typeof e.USE_PROFILES==`object`?Xt(e.USE_PROFILES):e.USE_PROFILES:!1,fe=e.ALLOW_ARIA_ATTR!==!1,pe=e.ALLOW_DATA_ATTR!==!1,me=e.ALLOW_UNKNOWN_PROTOCOLS||!1,he=e.ALLOW_SELF_CLOSE_IN_ATTR!==!1,K=e.SAFE_FOR_TEMPLATES||!1,ge=e.SAFE_FOR_XML!==!1,_e=e.WHOLE_DOCUMENT||!1,Se=e.RETURN_DOM||!1,Ce=e.RETURN_DOM_FRAGMENT||!1,we=e.RETURN_TRUSTED_TYPE||!1,xe=e.FORCE_BODY||!1,Te=e.SANITIZE_DOM!==!1,Ee=e.SANITIZE_NAMED_PROPS||!1,Oe=e.KEEP_CONTENT!==!1,ke=e.IN_PLACE||!1,ce=$t(e.ALLOWED_URI_REGEXP)?e.ALLOWED_URI_REGEXP:_n,Be=typeof e.NAMESPACE==`string`?e.NAMESPACE:ze,Ge=Pn(e,`MATHML_TEXT_INTEGRATION_POINTS`,()=>Z({},We)),qe=Pn(e,`HTML_INTEGRATION_POINTS`,()=>Z({},Ke));let t=Pn(e,`CUSTOM_ELEMENT_HANDLING`,()=>wt(null));if(W=wt(null),Wt(t,`tagNameCheck`)&&$e(t.tagNameCheck)&&(W.tagNameCheck=t.tagNameCheck),Wt(t,`attributeNameCheck`)&&$e(t.attributeNameCheck)&&(W.attributeNameCheck=t.attributeNameCheck),Wt(t,`allowCustomizedBuiltInElements`)&&typeof t.allowCustomizedBuiltInElements==`boolean`&&(W.allowCustomizedBuiltInElements=t.allowCustomizedBuiltInElements),Y(W),K&&(pe=!1),Ce&&(Se=!0),Ae&&(V=Z({},sn),H=wt(null),Ae.html===!0&&(Z(V,en),Z(H,cn)),Ae.svg===!0&&(Z(V,tn),Z(H,ln),Z(H,dn)),Ae.svgFilters===!0&&(Z(V,nn),Z(H,ln),Z(H,dn)),Ae.mathMl===!0&&(Z(V,an),Z(H,un),Z(H,dn))),G.tagCheck=null,G.attributeCheck=null,Wt(e,`ADD_TAGS`)&&(typeof e.ADD_TAGS==`function`?G.tagCheck=e.ADD_TAGS:Nt(e.ADD_TAGS)&&(V===le&&(V=Xt(V)),Z(V,e.ADD_TAGS,q))),Wt(e,`ADD_ATTR`)&&(typeof e.ADD_ATTR==`function`?G.attributeCheck=e.ADD_ATTR:Nt(e.ADD_ATTR)&&(H===U&&(H=Xt(H)),Z(H,e.ADD_ATTR,q))),Wt(e,`ADD_FORBID_CONTENTS`)&&Nt(e.ADD_FORBID_CONTENTS)&&(je===Me&&(je=Xt(je)),Z(je,e.ADD_FORBID_CONTENTS,q)),Oe&&(V[`#text`]=!0),_e&&Z(V,[`html`,`head`,`body`]),V.table&&(Z(V,[`tbody`]),delete ue.tbody),e.TRUSTED_TYPES_POLICY){if(typeof e.TRUSTED_TYPES_POLICY.createHTML!=`function`)throw qt(`TRUSTED_TYPES_POLICY configuration option must provide a "createHTML" hook.`);if(typeof e.TRUSTED_TYPES_POLICY.createScriptURL!=`function`)throw qt(`TRUSTED_TYPES_POLICY configuration option must provide a "createScriptURL" hook.`);let t=T;T=e.TRUSTED_TYPES_POLICY;try{E=j(``)}catch(e){throw T=t,e}}else e.TRUSTED_TYPES_POLICY===null?(T=void 0,E=``):(T===void 0&&(T=ee()),T&&typeof E==`string`&&(E=j(``)));J&&J(e),Ze=e},tt=Z({},[...tn,...nn,...rn]),nt=Z({},[...an,...on]),rt=function(e,t,n){return t.namespaceURI===ze?e===`svg`:t.namespaceURI===Le?e===`svg`&&(n===`annotation-xml`||Ge[n]):!!tt[e]},it=function(e,t,n){return t.namespaceURI===ze?e===`math`:t.namespaceURI===Re?e===`math`&&qe[n]:!!nt[e]},at=function(e,t,n){return t.namespaceURI===Re&&!qe[n]||t.namespaceURI===Le&&!Ge[n]?!1:!nt[e]&&(Je[e]||!tt[e])},ot=function(e){let t=_(e);(!t||!t.tagName)&&(t={namespaceURI:Be,tagName:`template`});let n=Pt(e.tagName),r=Pt(t.tagName);return He[e.namespaceURI]?e.namespaceURI===Re?rt(n,t,r):e.namespaceURI===Le?it(n,t,r):e.namespaceURI===ze?at(n,t,r):!!(Ye===`application/xhtml+xml`&&He[e.namespaceURI]):!1},st=function(e){jt(t.removed,{element:e});try{_(e).removeChild(e)}catch{if(p(e),!_(e))throw qt(`a node selected for removal could not be detached from its tree and cannot be safely returned; refusing to sanitize in place`)}},ct=function(e,t,n){try{m(e,t)}catch{try{e.removeAttribute(n)}catch{}}},lt=function(e){ft(e);let t=g(e);if(t){let e=[];Ot(t,t=>{jt(e,t)}),Ot(e,e=>{try{p(e)}catch{}})}let n=y(e);if(n)for(let t=n.length-1;t>=0;--t){let r=n[t],i=r&&r.name;typeof i==`string`&&ct(e,r,i)}},ut=function(e,n,r){if(!r)try{r=n.getAttributeNode(e)}catch{r=null}jt(t.removed,{attribute:r||null,from:n});try{r?m(n,r):n.removeAttribute(e)}catch{try{n.removeAttribute(e)}catch{}}if(e===`is`){if(Se||Ce)try{st(n)}catch{}else try{n.setAttribute(e,``)}catch{}}},dt=function(e){let t=y(e);if(t)for(let n=t.length-1;n>=0;--n){let r=t[n],i=r&&r.name;typeof i!=`string`||H[q(i)]||ct(e,r,i)}},ft=function(e){let t=[e];for(;t.length>0;){let e=t.pop();C(e)===En.element&&dt(e);let n=g(e);if(n)for(let e=n.length-1;e>=0;--e)t.push(n[e])}},pt=function(e,t){return ge?e===`patchsrc`||e===`for`&&t!==`label`&&t!==`output`:!1},mt=function(e){if(!ge)return;let t=[e];for(;t.length>0;){let e=t.pop(),n=C(e);if(n===En.processingInstruction||n===En.comment&&Kt(Cn,e.data)){try{p(e)}catch{}continue}if(n===En.element){let t=e,n=q(w(e));try{t.hasAttribute&&t.hasAttribute(`patchsrc`)&&t.removeAttribute(`patchsrc`),t.hasAttribute&&t.hasAttribute(`for`)&&pt(`for`,n)&&t.removeAttribute(`for`)}catch{}}let r=g(e);if(r)for(let e=r.length-1;e>=0;--e)t.push(r[e])}},ht=function(e){let t=null,r=null;if(xe)e=``+e;else{let t=It(e,/^[\r\n\t ]+/);r=t&&t[0]}Ye===`application/xhtml+xml`&&Be===ze&&(e=``+e+``);let i=T?j(e):e;if(Be===ze)try{t=new l().parseFromString(i,Ye)}catch{}if(!t||!t.documentElement){t=P.createDocument(Be,`template`,null);try{t.documentElement.innerHTML=Ve?E:i}catch{}}let a=t.body||t.documentElement;return e&&r&&a.insertBefore(n.createTextNode(r),a.childNodes[0]||null),Be===ze?F.call(t,_e?`html`:`body`)[0]:_e?t.documentElement:a},gt=function(e){let t=S?S(e):e.ownerDocument;return te.call(t||e,e,c.SHOW_ELEMENT|c.SHOW_COMMENT|c.SHOW_TEXT|c.SHOW_PROCESSING_INSTRUCTION|c.SHOW_CDATA_SECTION,null)},_t=function(e){return e=Lt(e,R,` `),e=Lt(e,re,` `),e=Lt(e,z,` `),e},vt=function(e){e.normalize();let t=S?S(e):e.ownerDocument,n=te.call(t||e,e,c.SHOW_TEXT|c.SHOW_COMMENT|c.SHOW_CDATA_SECTION|c.SHOW_PROCESSING_INSTRUCTION,null),r=n.nextNode();for(;r;)r.data=_t(r.data),r=n.nextNode();let i=e.querySelectorAll?.call(e,`template`);i&&Ot(i,e=>{xt(e.content)&&vt(e.content)})},bt=function(e){let t=x?x(e):null;return typeof t!=`string`||q(t)!==`form`?!1:typeof e.nodeName!=`string`||typeof e.textContent!=`string`||typeof e.removeChild!=`function`||e.attributes!==y(e)||typeof e.removeAttribute!=`function`||typeof e.removeAttributeNode!=`function`||typeof e.getAttributeNode!=`function`||typeof e.setAttribute!=`function`||typeof e.namespaceURI!=`string`||typeof e.insertBefore!=`function`||typeof e.hasChildNodes!=`function`||e.nodeType!==b(e)||e.childNodes!==g(e)},xt=function(e){if(!b||typeof e!=`object`||!e)return!1;try{return b(e)===En.documentFragment}catch{return!1}},St=function(e){if(!b||typeof e!=`object`||!e)return!1;try{return typeof b(e)==`number`}catch{return!1}};function Ct(e,n,r){e.length!==0&&Ot(e,e=>{e.call(t,n,r,Ze)})}let Tt=function(e,t){return!!(ge&&e.hasChildNodes()&&!St(e.firstElementChild)&&Kt(Sn,e.textContent)&&Kt(Sn,e.innerHTML)||ge&&e.namespaceURI===ze&&On[t]&&(St(e.firstElementChild)||typeof e.textContent==`string`&&Kt(kn[t],e.textContent))||e.nodeType===En.processingInstruction||ge&&e.nodeType===En.comment&&Kt(Cn,e.data))},Et=function(e,t){return e instanceof RegExp?Kt(e,t):e instanceof Function&&!!e(t,...[...arguments].slice(2))},Dt=function(e,t,n){if(!ue[t]&&X(t)&&Et(W.tagNameCheck,t))return!1;if(Oe&&!je[t]){let t=_(e),r=g(e);if(r&&t){let i=r.length;for(let a=i-1;a>=0;--a){let i=e===n?f(r[a],!0):r[a];t.insertBefore(i,h(e))}}}return st(e),!0},Bt=function(e,t,n,r){return e.length===0?t:t===n||t===r?Xt(t):t},Vt=function(e,t){return e===t||_(e)!==null?!1:(ke&&ft(e),!0)},Ht=function(e,n){if(Ct(L.beforeSanitizeElements,e,null),Vt(e,n))return!0;if(bt(e))return st(e),!0;let r=q(w(e));if(V=Bt(L.uponSanitizeElement,V,le,ye),Ct(L.uponSanitizeElement,e,{tagName:r,allowedTags:V}),Vt(e,n))return!0;if(Tt(e,r))return st(e),!0;if(ue[r]||!(G.tagCheck instanceof Function&&G.tagCheck(r))&&!V[r]){let t=Dt(e,r,n);return t===!1&&Ct(L.afterSanitizeElements,e,null),t}if(C(e)===En.element&&!ot(e)||(r===`noscript`||r===`noembed`||r===`noframes`)&&Kt(wn,e.innerHTML))return st(e),!0;if(K&&e.nodeType===En.text){let n=_t(e.textContent);e.textContent!==n&&(jt(t.removed,{element:e.cloneNode()}),e.textContent=n)}return Ct(L.afterSanitizeElements,e,null),!1},Ut=function(e,t,r){if(de[t]||pt(t,e)||Te&&(t===`id`||t===`name`)&&(r in n||r in Qe))return!1;let i=H[t]||G.attributeCheck instanceof Function&&G.attributeCheck(t,e);return pe&&Kt(ie,t)||fe&&Kt(ae,t)?!0:i?Fe[t]||Kt(ce,Lt(r,oe,``))||(t===`src`||t===`xlink:href`||t===`href`)&&e!==`script`&&Rt(r,`data:`)===0&&Ne[e]||me&&!Kt(B,Lt(r,oe,``))?!0:!r:X(e)&&Et(W.tagNameCheck,e)&&Et(W.attributeNameCheck,t,e)||t===`is`&&W.allowCustomizedBuiltInElements&&Et(W.tagNameCheck,r)},Gt=Z({},[`annotation-xml`,`color-profile`,`font-face`,`font-face-format`,`font-face-name`,`font-face-src`,`font-face-uri`,`missing-glyph`]),X=function(e){return!Gt[Pt(e)]&&Kt(se,e)},Jt=function(e,t,n,r){if(T&&typeof u==`object`&&typeof u.getAttributeType==`function`&&!n)switch(u.getAttributeType(e,t)){case`TrustedHTML`:return j(r);case`TrustedScriptURL`:return M(r)}return r},Yt=function(e,t,n,r){try{return n?e.setAttributeNS(n,t,r):e.setAttribute(t,r),!bt(e)||(st(e),!1)}catch{return ut(t,e),!1}},Dn=function(e){Ct(L.beforeSanitizeAttributes,e,null);let n=e.attributes;if(!n||bt(e))return;H=Bt(L.uponSanitizeAttribute,H,U,be);let r={attrName:``,attrValue:``,keepAttr:!0,allowedAttributes:H,forceKeepAttr:void 0},i=n.length,a=q(e.nodeName);for(;i--;){let o=n[i],s=o.name,c=o.namespaceURI,l=o.value,u=q(s),d=l,f=s===`value`?d:zt(d),p=!1;if(r.attrName=u,r.attrValue=f,r.keepAttr=!0,r.forceKeepAttr=void 0,Ct(L.uponSanitizeAttribute,e,r),f=r.attrValue,Ee&&(u===`id`||u===`name`)&&Rt(f,De)!==0&&(ut(s,e,o),f=De+f,p=!0),ge&&Kt(/((--!?|])>)|<\/(style|script|title|xmp|textarea|noscript|iframe|noembed|noframes)/i,f)){ut(s,e,o);continue}if(u===`attributename`&&It(f,`href`)){ut(s,e,o);continue}if(!r.forceKeepAttr){if(!r.keepAttr){ut(s,e,o);continue}if(!he&&Kt(Tn,f)){ut(s,e,o);continue}if(K&&(f=_t(f)),!Ut(a,u,f)){ut(s,e,o);continue}f=Jt(a,u,c,f),f!==d&&Yt(e,s,c,f)&&p&&At(t.removed)}}Ct(L.afterSanitizeAttributes,e,null)},In=function(e){let t=null,n=gt(e);for(Ct(L.beforeSanitizeShadowDOM,e,null);t=n.nextNode();)if(Ct(L.uponSanitizeShadowNode,t,null),Ht(t,e),Dn(t),xt(t.content)&&In(t.content),C(t)===En.element){let e=v(t);xt(e)&&(Ln(e),In(e))}Ct(L.afterSanitizeShadowDOM,e,null)},Ln=function(e){let t=[{node:e,shadow:null}];for(;t.length>0;){let e=t.pop();if(e.shadow){In(e.shadow);continue}let n=e.node,r=C(n)===En.element,i=g(n);if(i)for(let e=i.length-1;e>=0;--e)t.push({node:i[e],shadow:null});if(r){let e=x?x(n):null;if(typeof e==`string`&&q(e)===`template`){let e=n.content;xt(e)&&t.push({node:e,shadow:null})}}if(r){let e=v(n);xt(e)&&t.push({node:null,shadow:e},{node:e,shadow:null})}}};return t.sanitize=function(e){let n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},i=null,a=null,o=null,s=null;if(Ve=!e,Ve&&(e=``),typeof e!=`string`&&!St(e)&&(e=Zt(e),typeof e!=`string`))throw qt(`dirty is not a string, aborting`);if(!t.isSupported)return e;ve?(V=ye,H=be):et(n),(L.uponSanitizeElement.length>0||L.uponSanitizeAttribute.length>0)&&(V=Xt(V)),L.uponSanitizeAttribute.length>0&&(H=Xt(H)),t.removed=[];let c=ke&&typeof e!=`string`&&St(e);if(c){mt(e);let t=w(e);if(typeof t==`string`){let n=q(t);if(!V[n]||ue[n])throw lt(e),qt(`root node is forbidden and cannot be sanitized in-place`)}if(bt(e))throw lt(e),qt(`root node is clobbered and cannot be sanitized in-place`);try{Ln(e)}catch(t){throw lt(e),t}}else if(St(e))i=ht(``),a=i.ownerDocument.importNode(e,!0),a.nodeType===En.element&&a.nodeName===`BODY`||a.nodeName===`HTML`?i=a:i.appendChild(a),Ln(i);else{if(!Se&&!K&&!_e&&e.indexOf(`<`)===-1)return T&&we?j(e):e;if(i=ht(e),!i)return Se?null:we?E:``}i&&xe&&st(i.firstChild);let l=c?e:i;try{let e=gt(l);for(;o=e.nextNode();)Ht(o,l),Dn(o),xt(o.content)&&In(o.content)}catch(n){throw c&&(lt(e),Ot(t.removed,e=>{e.element&&ft(e.element)})),n}if(c)return Ot(t.removed,e=>{e.element&&ft(e.element)}),K&&vt(e),e;if(Se){if(K&&vt(i),Ce)for(s=ne.call(i.ownerDocument);i.firstChild;)s.appendChild(i.firstChild);else s=i;return(H.shadowroot||H.shadowrootmode)&&(s=I.call(r,s,!0)),s}let u=_e?i.outerHTML:i.innerHTML;return _e&&V[`!doctype`]&&i.ownerDocument&&i.ownerDocument.doctype&&i.ownerDocument.doctype.name&&Kt(bn,i.ownerDocument.doctype.name)&&(u=` +`+u),K&&(u=_t(u)),T&&we?j(u):u},t.setConfig=function(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};et(e),ve=!0,ye=V,be=H},t.clearConfig=function(){Ze=null,ve=!1,ye=null,be=null,T=D,E=``},t.isValidAttribute=function(e,t,n){Ze||et({});let r=q(e),i=q(t);return Ut(r,i,n)},t.addHook=function(e,t){typeof t==`function`&&Wt(L,e)&&jt(L[e],t)},t.removeHook=function(e,t){if(Wt(L,e)){if(t!==void 0){let n=kt(L[e],t);return n===-1?void 0:Mt(L[e],n,1)[0]}return At(L[e])}},t.removeHooks=function(e){Wt(L,e)&&(L[e]=[])},t.removeAllHooks=function(){L=Mn()},t}var In=Fn(),Ln=2097152,Rn=67108864,zn=25165824,Bn={bash:`bash`,c:`c`,cc:`cpp`,cpp:`cpp`,css:`css`,go:`go`,h:`c`,hpp:`cpp`,java:`java`,js:`javascript`,json:`json`,jsx:`javascript`,mjs:`javascript`,py:`python`,rb:`ruby`,rs:`rust`,sh:`bash`,sql:`sql`,toml:`ini`,ts:`typescript`,tsx:`typescript`,xml:`xml`,yaml:`yaml`,yml:`yaml`,zsh:`bash`},Vn=new Set([`application/javascript`,`application/json`,`application/ld+json`,`application/sql`,`application/toml`,`application/typescript`,`application/xml`,`application/x-httpd-php`,`application/x-javascript`,`application/x-sh`,`application/x-yaml`,`text/css`,`text/csv`,`text/javascript`,`text/typescript`,`text/x-python`,`text/x-shellscript`,`text/xml`,`text/yaml`]),Hn=new Set([`application/vnd.ms-excel.sheet.macroenabled.12`,`application/vnd.ms-excel.template.macroenabled.12`,`application/vnd.openxmlformats-officedocument.spreadsheetml.sheet`,`application/vnd.openxmlformats-officedocument.spreadsheetml.template`]),Un=new Set([`application/vnd.ms-powerpoint.presentation.macroenabled.12`,`application/vnd.ms-powerpoint.slideshow.macroenabled.12`,`application/vnd.ms-powerpoint.template.macroenabled.12`,`application/vnd.openxmlformats-officedocument.presentationml.presentation`,`application/vnd.openxmlformats-officedocument.presentationml.slideshow`,`application/vnd.openxmlformats-officedocument.presentationml.template`]);function Wn(e){let t=e.toLowerCase().split(/[\\/]/).pop()||``,n=t.lastIndexOf(`.`);return n>0?t.slice(n+1):``}function Gn(e){return(e.content_type||``).split(`;`,1)[0].trim().toLowerCase()}function Kn(e){let t=Wn(e.filename),n=Gn(e);return t===`docx`||n===`application/vnd.openxmlformats-officedocument.wordprocessingml.document`?`docx`:[`xlsx`,`xlsm`,`xltx`,`xltm`].includes(t)||Hn.has(n)?`spreadsheet`:[`pptx`,`pptm`,`potx`,`potm`,`ppsx`,`ppsm`].includes(t)||Un.has(n)?`presentation`:t===`md`||t===`markdown`||n===`text/markdown`?`markdown`:t===`html`||t===`htm`||n===`text/html`?`html`:t===`pdf`||n===`application/pdf`?`pdf`:Bn[t]||Vn.has(n)?`code`:t===`txt`||t===`log`||n===`text/plain`||n.startsWith(`text/`)?`text`:`unsupported`}function qn(e){let t=Wn(e.filename);if(Bn[t])return Bn[t];let n=Gn(e);if(n.includes(`json`))return`json`;if(n.includes(`javascript`))return`javascript`;if(n.includes(`typescript`))return`typescript`;if(n.includes(`yaml`))return`yaml`;if(n.includes(`xml`))return`xml`;if(n.includes(`sql`))return`sql`}function Jn(e){switch(e){case`code`:return`Code`;case`text`:return`Text`;case`markdown`:return`Markdown`;case`pdf`:return`PDF`;case`docx`:return`Word document`;case`spreadsheet`:return`Spreadsheet`;case`presentation`:return`Slide text outline`;case`html`:return`Web page`;default:return`File`}}function Yn(e){if(e===`pdf`)return Rn;if(e===`spreadsheet`||e===`presentation`)return zn;if(e===`code`||e===`text`||e===`markdown`||e===`html`)return Ln}function Xn(){return{async:!1,breaks:!1,extensions:null,gfm:!0,hooks:null,pedantic:!1,renderer:null,silent:!1,tokenizer:null,walkTokens:null}}var Zn=Xn();function Qn(e){Zn=e}var $n={exec:()=>null};function er(e){let t=[];return n=>{let r=Math.max(0,Math.min(3,n-1)),i=t[r];return i||(i=e(r),t[r]=i),i}}function Q(e,t=``){let n=typeof e==`string`?e:e.source,r={replace:(e,t)=>{let i=typeof t==`string`?t:t.source;return i=i.replace(nr.caret,`$1`),n=n.replace(e,i),r},getRegex:()=>new RegExp(n,t)};return r}var tr=((e=``)=>{try{return!!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:e=>RegExp(`^( {0,3}${e})((?:[ ][^\\n]*)?(?:\\n|$))`),nextBulletRegex:er(e=>RegExp(`^ {0,${e}}(?:[*+-]|\\d{1,9}[.)])((?:[ ][^\\n]*)?(?:\\n|$))`)),hrRegex:er(e=>RegExp(`^ {0,${e}}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)`)),fencesBeginRegex:er(e=>RegExp(`^ {0,${e}}(?:\`\`\`|~~~)`)),headingBeginRegex:er(e=>RegExp(`^ {0,${e}}#`)),htmlBeginRegex:er(e=>RegExp(`^ {0,${e}}<(?:[a-z].*>|!--)`,`i`)),blockquoteBeginRegex:er(e=>RegExp(`^ {0,${e}}>`))},rr=/^(?:[ \t]*(?:\n|$))+/,ir=/^((?: {4}| {0,3}\t)[^\n]+(?:\n(?:[ \t]*(?:\n|$))*)?)+/,ar=/^ {0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?: {0,3}\1[~`]* *(?=\n|$)|$)/,or=/^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/,sr=/^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/,cr=/ {0,3}(?:[*+-]|\d{1,9}[.)])/,lr=/^(?!bull |blockCode|fences|blockquote|heading|html|table)((?:.|\n(?!\s*?\n|bull |blockCode|fences|blockquote|heading|html|table))+?)\n {0,3}(=+|-+) *(?:\n+|$)/,ur=Q(lr).replace(/bull/g,cr).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}(?:\s|$)/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).replace(/\|table/g,``).getRegex(),dr=Q(lr).replace(/bull/g,cr).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}(?:\s|$)/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).replace(/table/g,/ {0,3}\|?(?:[:\- ]*\|)+[\:\- ]*\n/).getRegex(),fr=/^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table|[ \t]+\n)[^\n]+)*)/,pr=/^[^\n]+/,mr=/(?!\s*\])(?:\\[\s\S]|[^\[\]\\])+/,hr=Q(/^ {0,3}\[(label)\]: *(?:\n[ \t]*)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n[ \t]*)?| *\n[ \t]*)(title))? *(?:\n+|$)/).replace(`label`,mr).replace(`title`,/(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/).getRegex(),gr=Q(/^(bull)([ \t][^\n]*?)?(?:\n|$)/).replace(/bull/g,cr).getRegex(),_r=`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`,vr=/|$))/,yr=Q(`^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:[^\\n]*\\n*|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>[^\\n]*\\n*|$)|[^\\n]*\\n*|$)|[^\\n]*\\n*|$)|)[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|<(?!script|pre|style|textarea)([a-z][a-z0-9-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$))`,`i`).replace(`comment`,vr).replace(`tag`,_r).replace(`attribute`,/ +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(),br=e=>Q(fr).replace(`hr`,or).replace(`heading`,` {0,3}#{1,6}(?:\\s|$)`).replace(`|lheading`,``).replace(`|table`,``).replace(`blockquote`,` {0,3}>`).replace(`fences`," {0,3}(?:`{3,}(?=[^`\\n]*(?:\\n|$))|~~~)[^\\n]*(?:\\n|$)").replace(`list`,e).replace(`html`,`)|<(?:script|pre|style|textarea|!--)`).replace(`tag`,_r).getRegex(),xr=br(/ {0,3}(?:[*+-]|1[.)])[ \t]+[^ \t\n]/),Sr=br(/ {0,3}(?:[*+-]|\d{1,9}[.)])(?:[ \t]|\n|$)/),Cr={blockquote:Q(/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/).replace(`paragraph`,Sr).getRegex(),code:ir,def:hr,fences:ar,heading:sr,hr:or,html:yr,lheading:ur,list:gr,newline:rr,paragraph:xr,table:$n,text:pr},wr=Q(`^ *([^\\n ].*)\\n {0,3}((?:\\| *)?:?-+:? *(?:\\| *:?-+:? *)*(?:\\| *)?)(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)`).replace(`hr`,or).replace(`heading`,` {0,3}#{1,6}(?:\\s|$)`).replace(`blockquote`,` {0,3}>`).replace(`code`,`(?: {4}| {0,3} )[^\\n]`).replace(`fences`," {0,3}(?:`{3,}(?=[^`\\n]*(?:\\n|$))|~~~)[^\\n]*(?:\\n|$)").replace(`list`,` {0,3}(?:[*+-]|1[.)])[ \\t]`).replace(`html`,`)|<(?:script|pre|style|textarea|!--)`).replace(`tag`,_r).getRegex(),Tr={...Cr,lheading:dr,table:wr,paragraph:Q(fr).replace(`hr`,or).replace(`heading`,` {0,3}#{1,6}(?:\\s|$)`).replace(`|lheading`,``).replace(`table`,wr).replace(`blockquote`,` {0,3}>`).replace(`fences`," {0,3}(?:`{3,}(?=[^`\\n]*(?:\\n|$))|~~~)[^\\n]*(?:\\n|$)").replace(`list`,` {0,3}(?:[*+-]|1[.)])[ \\t]+[^ \\t\\n]`).replace(`html`,`)|<(?:script|pre|style|textarea|!--)`).replace(`tag`,_r).getRegex()},Er={...Cr,html:Q(`^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+? *(?:\\n{2,}|\\s*$)|\\s]*)*?/?> *(?:\\n{2,}|\\s*$))`).replace(`comment`,vr).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:Q(fr).replace(`hr`,or).replace(`heading`,` *#{1,6} *[^ +]`).replace(`lheading`,ur).replace(`|table`,``).replace(`blockquote`,` {0,3}>`).replace(`|fences`,``).replace(`|list`,``).replace(`|html`,``).replace(`|tag`,``).getRegex()},Dr=/^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,Or=/^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,kr=/^( {2,}|\\)\n(?!\s*$)/,Ar=/^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\`+)[^`]+\k(?!`))*?\]\((?:\\[\s\S]|[^\\\(\)]|\((?:\\[\s\S]|[^\\\(\)])*\))*\)/).replace(`precode-`,tr?"(?`+)[^`]+\k(?!`)/).replace(`html`,/<(?! )[^<>]*?>/).getRegex(),Br=/^(?:\*+(?:((?!\*)punct)|([^\s*]))?)|^_+(?:((?!_)punct)|([^\s_]))?/,Vr=Q(Br,`u`).replace(/punct/g,jr).getRegex(),Hr=Q(Br,`u`).replace(/punct/g,Ir).getRegex(),Ur=Q(/^(?:\*+(?:((?!\*)(?!openQuote)punct)|([^\s*]))?)|^_+(?:((?!_)(?!openQuote)punct)|([^\s_]))?/,`u`).replace(/openQuote/g,Fr).replace(/punct/g,jr).getRegex(),Wr=`^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\*)punct(\\*+)(?=[\\s]|$)|notPunctSpace(\\*+)(?!\\*)(?=punctSpace|$)|(?!\\*)punctSpace(\\*+)(?=notPunctSpace)|[\\s](\\*+)(?!\\*)(?=punct)|(?!\\*)punct(\\*+)(?!\\*)(?=punct)|notPunctSpace(\\*+)(?=notPunctSpace)`,Gr=Q(Wr,`gu`).replace(/notPunctSpace/g,Nr).replace(/punctSpace/g,Mr).replace(/punct/g,jr).getRegex(),Kr=Q(Wr,`gu`).replace(/notPunctSpace/g,Rr).replace(/punctSpace/g,Lr).replace(/punct/g,Ir).getRegex(),qr=Q(`^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\*)punct(\\*+)(?=[\\s]|$)|notPunctSpace(\\*+)(?!\\*)(?=punctSpace|$)|(?!\\*)[\\s](\\*+)(?=notPunctSpace)|[\\s](\\*+)(?!\\*)(?=punct)|(?!\\*)punct(\\*+)(?!\\*)(?=punct)|(?:(?!\\*)punct|notPunctSpace)(\\*+)(?!\\*)(?=notPunctSpace)`,`gu`).replace(/notPunctSpace/g,Nr).replace(/punctSpace/g,Mr).replace(/punct/g,jr).getRegex(),Jr=Q(`^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)punctSpace(_+)(?=notPunctSpace)|[\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)`,`gu`).replace(/notPunctSpace/g,Nr).replace(/punctSpace/g,Mr).replace(/punct/g,jr).getRegex(),Yr=Q(`^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)[\\s](_+)(?=notPunctSpace)|[\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)|(?:(?!_)punct|notPunctSpace)(_+)(?!_)(?=notPunctSpace)`,`gu`).replace(/notPunctSpace/g,Nr).replace(/punctSpace/g,Mr).replace(/punct/g,jr).getRegex(),Xr=Q(/^~~?(?:((?!~)punct)|[^\s~])/,`u`).replace(/punct/g,jr).getRegex(),Zr=Q(`^[^~]+(?=[^~])|(?!~)punct(~~?)(?=[\\s]|$)|notPunctSpace(~~?)(?!~)(?=punctSpace|$)|(?!~)punctSpace(~~?)(?=notPunctSpace)|[\\s](~~?)(?!~)(?=punct)|(?!~)punct(~~?)(?!~)(?=punct)|notPunctSpace(~~?)(?=notPunctSpace)`,`gu`).replace(/notPunctSpace/g,Nr).replace(/punctSpace/g,Mr).replace(/punct/g,jr).getRegex(),Qr=Q(/\\(punct)/,`gu`).replace(/punct/g,jr).getRegex(),$r=Q(/^<(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(),ei=Q(vr).replace(`(?:-->|$)`,`-->`).getRegex(),ti=Q(`^comment|^|^<[a-zA-Z][a-zA-Z0-9-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^|^`).replace(`comment`,ei).replace(`attribute`,/\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/).getRegex(),ni=Q(/(?:\[(?:brackets|\\[\s\S]|[^\[\]\\])*\]|\\[\s\S]|`+(?!`)[^`]*?`+(?!`)|``+(?=\])|[^\[\]\\`])*?/).replace(`brackets`,/\[(?:\\[\s\S]|[^\[\]\\])*\]/).getRegex(),ri=Q(/^!?\[(label)\]\(\s*(href)(?:(?:[ \t]+(?:\n[ \t]*)?|\n[ \t]*)(title))?\s*\)/).replace(`label`,ni).replace(`href`,/<(?:\\.|[^\n<>\\])+>|[^ \t\n\x00-\x1f]+|(?=\))/).replace(`title`,/"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/).getRegex(),ii=Q(/^!?\[(label)\]\[(ref)\]/).replace(`label`,ni).replace(`ref`,mr).getRegex(),ai=Q(/^!?\[(ref)\](?:\[\])?/).replace(`ref`,mr).getRegex(),oi=Q(`reflink|nolink(?!\\()`,`g`).replace(`reflink`,ii).replace(`nolink`,ai).getRegex(),si=/[hH][tT][tT][pP][sS]?|[fF][tT][pP]/,ci={_backpedal:$n,anyPunctuation:Qr,autolink:$r,blockSkip:zr,br:kr,code:Or,del:$n,delLDelim:$n,delRDelim:$n,emStrongLDelim:Vr,emStrongRDelimAst:Gr,emStrongRDelimUnd:Jr,escape:Dr,link:ri,nolink:ai,punctuation:Pr,reflink:ii,reflinkSearch:oi,tag:ti,text:Ar,url:$n},li={...ci,emStrongLDelim:Ur,emStrongRDelimAst:qr,emStrongRDelimUnd:Yr,link:Q(/^!?\[(label)\]\((.*?)\)/).replace(`label`,ni).getRegex(),reflink:Q(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace(`label`,ni).getRegex()},ui={...ci,emStrongRDelimAst:Kr,emStrongLDelim:Hr,delLDelim:Xr,delRDelim:Zr,url:Q(/^((?:protocol):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/).replace(`protocol`,si).replace(`email`,/[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![\w-])/).getRegex(),_backpedal:/(?:[^?!.,:;*_'"~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'"~)]+(?!$))+/,del:/^(~~?)(?=[^\s~])((?:\\[\s\S]|[^\\])*?(?:\\[\s\S]|[^\s~\\]))\1(?=[^~]|$)/,text:Q(/^(`+|~+|[^`~])(?:(?=[`~])|(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\":`>`,'"':`"`,"'":`'`},hi=e=>mi[e];function gi(e,t){if(t){if(nr.escapeTest.test(e))return e.replace(nr.escapeReplace,hi)}else if(nr.escapeTestNoEncode.test(e))return e.replace(nr.escapeReplaceNoEncode,hi);return e}function _i(e){try{e=encodeURI(e).replace(nr.percentDecode,`%`)}catch{return null}return e}function vi(e,t){let n=e.replace(nr.findPipe,(e,t,n)=>{let r=!1,i=t;for(;--i>=0&&n[i]===`\\`;)r=!r;return r?`|`:` |`}).split(nr.splitPipe),r=0;if(n[0].trim()||n.shift(),n.length>0&&!n.at(-1)?.trim()&&n.pop(),t){if(n.length>t)n.splice(t);else for(;n.length=0&&nr.blankLine.test(t[n]);)n--;return t.length-n<=2?e:t.slice(0,n+1).join(` +`)}function xi(e,t){if(e.indexOf(t[1])===-1)return-1;let n=0;for(let r=0;r0?-2:-1}function Si(e,t=0){let n=t,r=``;for(let t of e)if(t===` `){let e=4-n%4;r+=` `.repeat(e),n+=e}else r+=t,n++;return r}function Ci(e,t,n,r,i){let a=t.href,o=t.title||null,s=e[1].replace(i.other.outputLinkReplace,`$1`),c=e[0].charAt(0)===`!`;r.state.inLink=!0;let l=r.state.linkEmitted,u=r.state.inRawBlock;r.state.linkEmitted=!1;let d=r.inlineTokens(s),f=r.state.linkEmitted;if(r.state.linkEmitted=l,r.state.inLink=!1,!c){if(f){r.state.inRawBlock=u;return}r.state.linkEmitted=!0}return{type:c?`image`:`link`,raw:n,href:a,title:o,text:s,tokens:d}}function wi(e,t,n){let r=e.match(n.other.indentCodeCompensation);if(r===null)return t;let i=r[1];return t.split(` +`).map(e=>{let t=e.match(n.other.beginningSpace);if(t===null)return e;let[r]=t;return e.slice(Math.min(r.length,i.length))}).join(` +`)}var Ti=class{options;rules;lexer;constructor(e){this.options=e||Zn}space(e){let t=this.rules.block.newline.exec(e);if(t&&t[0].length>0)return{type:`space`,raw:t[0]}}code(e){let t=this.rules.block.code.exec(e);if(t){let e=this.options.pedantic?t[0]:bi(t[0]);return{type:`code`,raw:e,codeBlockStyle:`indented`,text:e.replace(this.rules.other.codeRemoveIndent,``)}}}fences(e){let t=this.rules.block.fences.exec(e);if(t){let e=t[0],n=wi(e,t[3]||``,this.rules);return{type:`code`,raw:e,lang:t[2]?t[2].trim().replace(this.rules.inline.anyPunctuation,`$1`):t[2],text:n}}}heading(e){let t=this.rules.block.heading.exec(e);if(t){let e=t[2].trim();if(this.rules.other.endingHash.test(e)){let t=yi(e,`#`);(this.options.pedantic||!t||this.rules.other.endingSpaceTabChar.test(t))&&(e=t.trim())}return{type:`heading`,raw:yi(t[0],` +`),depth:t[1].length,text:e,tokens:this.lexer.inline(e)}}}hr(e){let t=this.rules.block.hr.exec(e);if(t)return{type:`hr`,raw:yi(t[0],` +`)}}blockquote(e){let t=this.rules.block.blockquote.exec(e);if(t){let e=yi(t[0],` +`).split(` +`),n=``,r=``,i=[];for(;e.length>0;){let t=!1,a=[],o;for(o=0;o1,i={type:`list`,raw:``,ordered:r,start:r?+n.slice(0,-1):``,loose:!1,items:[]};n=r?`\\d{1,9}\\${n.slice(-1)}`:`\\${n}`,this.options.pedantic&&(n=r?n:`[*+-]`);let a=this.rules.other.listItemRegex(n),o=!1;for(;e;){let n=!1,r=``,s=``;if(!(t=a.exec(e))||this.rules.block.hr.test(e))break;r=t[0],e=e.substring(r.length);let c=Si(t[2].split(` +`,1)[0],t[1].length),l=e.split(` +`,1)[0],u=!c.trim(),d=0;if(this.options.pedantic?(d=2,s=c.trimStart()):u?d=t[1].length+1:(d=c.search(this.rules.other.nonSpaceChar),d=d>4?1:d,s=c.slice(d),d+=t[1].length),u&&this.rules.other.blankLine.test(l)&&(r+=l+` +`,e=e.substring(l.length+1),n=!0),!n){let t=this.rules.other.nextBulletRegex(d),n=this.rules.other.hrRegex(d),i=this.rules.other.fencesBeginRegex(d),a=this.rules.other.headingBeginRegex(d),o=this.rules.other.htmlBeginRegex(d),f=this.rules.other.blockquoteBeginRegex(d);for(;e;){let p=e.split(` +`,1)[0],m;if(l=p,this.options.pedantic?(l=l.replace(this.rules.other.listReplaceNesting,` `),m=l):m=l.replace(this.rules.other.tabCharGlobal,` `),i.test(l)||a.test(l)||o.test(l)||f.test(l)||t.test(l)||n.test(l))break;if(m.search(this.rules.other.nonSpaceChar)>=d||!l.trim())s+=` +`+m.slice(d);else{if(u||c.replace(this.rules.other.tabCharGlobal,` `).search(this.rules.other.nonSpaceChar)>=4||i.test(c)||a.test(c)||n.test(c))break;s+=` +`+l}u=!l.trim(),r+=p+` +`,e=e.substring(p.length+1),c=m.slice(d)}}i.loose||(o?i.loose=!0:this.rules.other.doubleBlankLine.test(r)&&(o=!0)),i.items.push({type:`list_item`,raw:r,task:!!this.options.gfm&&this.rules.other.listIsTask.test(s),loose:!1,text:s,tokens:[]}),i.raw+=r}let s=i.items.at(-1);if(s)s.raw=s.raw.trimEnd(),s.text=s.text.trimEnd();else return;i.raw=i.raw.trimEnd();for(let e of i.items)if(this.lexer.state.top=!1,e.tokens=this.lexer.blockTokens(e.text,[]),!i.loose){let t=e.tokens.filter(e=>e.type===`space`);i.loose=t.length>0&&t.some(e=>this.rules.other.anyLine.test(e.raw))}for(let e of i.items){let t=e.tokens[0];if(e.task&&(t?.type===`text`||t?.type===`paragraph`)){e.text=e.text.replace(this.rules.other.listReplaceTask,``),t.raw=t.raw.replace(this.rules.other.listReplaceTask,``),t.text=t.text.replace(this.rules.other.listReplaceTask,``);for(let e=this.lexer.inlineQueue.length-1;e>=0;e--)if(this.rules.other.listIsTask.test(this.lexer.inlineQueue[e].src)){this.lexer.inlineQueue[e].src=this.lexer.inlineQueue[e].src.replace(this.rules.other.listReplaceTask,``);break}let n=this.rules.other.listTaskCheckbox.exec(e.raw);if(n){let t={type:`checkbox`,raw:n[0]+` `,checked:n[0]!==`[ ]`};e.checked=t.checked,i.loose?e.tokens[0]&&[`paragraph`,`text`].includes(e.tokens[0].type)&&`tokens`in e.tokens[0]&&e.tokens[0].tokens?(e.tokens[0].raw=t.raw+e.tokens[0].raw,e.tokens[0].text=t.raw+e.tokens[0].text,e.tokens[0].tokens.unshift(t)):e.tokens.unshift({type:`paragraph`,raw:t.raw,text:t.raw,tokens:[t]}):e.tokens.unshift(t)}}else e.task&&=!1}if(i.loose)for(let e of i.items){e.loose=!0;for(let t of e.tokens)t.type===`text`&&(t.type=`paragraph`)}return i}}html(e){let t=this.rules.block.html.exec(e);if(t){let e=bi(t[0]);return{type:`html`,block:!0,raw:e,pre:t[1]===`pre`||t[1]===`script`||t[1]===`style`,text:e}}}def(e){let t=this.rules.block.def.exec(e);if(t){let e=t[1].toLowerCase().replace(this.rules.other.multipleSpaceGlobal,` `),n=t[2]?t[2].replace(this.rules.other.hrefBrackets,`$1`).replace(this.rules.inline.anyPunctuation,`$1`):``,r=t[3]?t[3].substring(1,t[3].length-1).replace(this.rules.inline.anyPunctuation,`$1`):t[3];return{type:`def`,tag:e,raw:yi(t[0],` +`),href:n,title:r}}}table(e){let t=this.rules.block.table.exec(e);if(!t||!this.rules.other.tableDelimiter.test(t[2]))return;let n=vi(t[1]),r=t[2].replace(this.rules.other.tableAlignChars,``).split(`|`),i=t[3]?.trim()?t[3].replace(this.rules.other.tableRowBlankLine,``).split(` +`):[],a={type:`table`,raw:yi(t[0],` +`),header:[],align:[],rows:[]};if(n.length===r.length){for(let e of r)this.rules.other.tableAlignRight.test(e)?a.align.push(`right`):this.rules.other.tableAlignCenter.test(e)?a.align.push(`center`):this.rules.other.tableAlignLeft.test(e)?a.align.push(`left`):a.align.push(null);for(let e=0;e({text:e,tokens:this.lexer.inline(e),header:!1,align:a.align[t]})));return a}}lheading(e){let t=this.rules.block.lheading.exec(e);if(t){let e=t[1].trim();return{type:`heading`,raw:yi(t[0],` +`),depth:t[2].charAt(0)===`=`?1:2,text:e,tokens:this.lexer.inline(e)}}}paragraph(e){let t=this.rules.block.paragraph.exec(e);if(t){let e=t[1].charAt(t[1].length-1)===` +`?t[1].slice(0,-1):t[1];return{type:`paragraph`,raw:t[0],text:e,tokens:this.lexer.inline(e)}}}text(e){let t=this.rules.block.text.exec(e);if(t)return{type:`text`,raw:t[0],text:t[0],tokens:this.lexer.inline(t[0])}}escape(e){let t=this.rules.inline.escape.exec(e);if(t)return{type:`escape`,raw:t[0],text:t[1]}}tag(e){let t=this.rules.inline.tag.exec(e);if(t)return!this.lexer.state.inLink&&this.rules.other.startATag.test(t[0])?this.lexer.state.inLink=!0:this.lexer.state.inLink&&this.rules.other.endATag.test(t[0])&&(this.lexer.state.inLink=!1),!this.lexer.state.inRawBlock&&this.rules.other.startPreScriptTag.test(t[0])?this.lexer.state.inRawBlock=!0:this.lexer.state.inRawBlock&&this.rules.other.endPreScriptTag.test(t[0])&&(this.lexer.state.inRawBlock=!1),{type:`html`,raw:t[0],inLink:this.lexer.state.inLink,inRawBlock:this.lexer.state.inRawBlock,block:!1,text:t[0]}}link(e){let t=this.rules.inline.link.exec(e);if(t){let e=t[2].trim();if(!this.options.pedantic&&this.rules.other.startAngleBracket.test(e)){if(!this.rules.other.endAngleBracket.test(e))return;let t=yi(e.slice(0,-1),`\\`);if((e.length-t.length)%2==0)return}else{let e=xi(t[2],`()`);if(e===-2)return;if(e>-1){let n=(t[0].indexOf(`!`)===0?5:4)+t[1].length+e;t[2]=t[2].substring(0,e),t[0]=t[0].substring(0,n).trim(),t[3]=``}}let n=t[2],r=``;if(this.options.pedantic){let e=this.rules.other.pedanticHrefTitle.exec(n);e&&(n=e[1],r=e[3])}else r=t[3]?t[3].slice(1,-1):``;return n=n.trim(),this.rules.other.startAngleBracket.test(n)&&(n=this.options.pedantic&&!this.rules.other.endAngleBracket.test(e)?n.slice(1):n.slice(1,-1)),Ci(t,{href:n&&n.replace(this.rules.inline.anyPunctuation,`$1`),title:r&&r.replace(this.rules.inline.anyPunctuation,`$1`)},t[0],this.lexer,this.rules)}}reflink(e,t){let n;if((n=this.rules.inline.reflink.exec(e))||(n=this.rules.inline.nolink.exec(e))){let e=t[(n[2]||n[1]).replace(this.rules.other.multipleSpaceGlobal,` `).toLowerCase()];if(!e){let e=n[0].charAt(0);return{type:`text`,raw:e,text:e}}return Ci(n,e,n[0],this.lexer,this.rules)}}emStrong(e,t,n=``){let r=this.rules.inline.emStrongLDelim.exec(e);if(!(!r||!r[1]&&!r[2]&&!r[3]&&!r[4]||r[4]&&n.match(this.rules.other.unicodeAlphaNumeric))&&(!(r[1]||r[3])||!n||this.rules.inline.punctuation.exec(n))){let i=[...r[0]].length-1,a,o,s=i,c=0,l=r[0][0],u=n===l,d=l===`*`?this.rules.inline.emStrongRDelimAst:this.rules.inline.emStrongRDelimUnd;for(d.lastIndex=0,t=t.slice(-1*e.length+i);(r=d.exec(t))!==null;){if(a=r[1]||r[2]||r[3]||r[4]||r[5]||r[6],!a)continue;if(o=[...a].length,r[3]||r[4]){s+=o;continue}if(r[5]||r[6]){if(i%3&&!((i+o)%3)){c+=o;continue}if(u)break}if(s-=o,s>0)continue;o=Math.min(o,o+s+c);let t=[...r[0]][0].length,n=e.slice(0,i+r.index+t+o);if(Math.min(i,o)%2){let e=n.slice(1,-1);return{type:`em`,raw:n,text:e,tokens:this.lexer.inlineTokens(e)}}let l=n.slice(2,-2);return{type:`strong`,raw:n,text:l,tokens:this.lexer.inlineTokens(l)}}}}codespan(e){let t=this.rules.inline.code.exec(e);if(t){let e=t[2].replace(this.rules.other.newLineCharGlobal,` `),n=this.rules.other.nonSpaceChar.test(e),r=this.rules.other.startingSpaceChar.test(e)&&this.rules.other.endingSpaceChar.test(e);return n&&r&&(e=e.substring(1,e.length-1)),{type:`codespan`,raw:t[0],text:e}}}br(e){let t=this.rules.inline.br.exec(e);if(t)return{type:`br`,raw:t[0]}}del(e,t,n=``){let r=this.rules.inline.delLDelim.exec(e);if(r&&(!r[1]||!n||this.rules.inline.punctuation.exec(n))){let n=[...r[0]].length-1,i,a,o=n,s=this.rules.inline.delRDelim;for(s.lastIndex=0,t=t.slice(-1*e.length+n);(r=s.exec(t))!==null;){if(i=r[1]||r[2]||r[3]||r[4]||r[5]||r[6],!i||(a=[...i].length,a!==n))continue;if(r[3]||r[4]){o+=a;continue}if(o-=a,o>0)continue;a=Math.min(a,a+o);let t=[...r[0]][0].length,s=e.slice(0,n+r.index+t+a),c=s.slice(n,-n);return{type:`del`,raw:s,text:c,tokens:this.lexer.inlineTokens(c)}}}}autolink(e){let t=this.rules.inline.autolink.exec(e);if(t){let e,n;return t[2]===`@`?(e=t[1],n=`mailto:`+e):(e=t[1],n=e),{type:`link`,raw:t[0],text:e,href:n,autolink:!0,tokens:[{type:`text`,raw:e,text:e}]}}}url(e){let t;if(t=this.rules.inline.url.exec(e)){let e,n;if(t[2]===`@`)e=t[0],n=`mailto:`+e;else{let r;do r=t[0],t[0]=this.rules.inline._backpedal.exec(t[0])?.[0]??``;while(r!==t[0]);e=t[0],n=t[1]===`www.`?`http://`+t[0]:t[0]}return{type:`link`,raw:t[0],text:e,href:n,autolink:!0,tokens:[{type:`text`,raw:e,text:e}]}}}inlineText(e){let t=this.rules.inline.text.exec(e);if(t){let e=this.lexer.state.inRawBlock;return{type:`text`,raw:t[0],text:t[0],escaped:e}}}},Ei=class e{tokens;options;state;inlineQueue;tokenizer;constructor(e){this.tokens=[],this.tokens.links=Object.create(null),this.options=e||Zn,this.options.tokenizer=this.options.tokenizer||new Ti,this.tokenizer=this.options.tokenizer,this.tokenizer.options=this.options,this.tokenizer.lexer=this,this.inlineQueue=[],this.state={inLink:!1,inRawBlock:!1,linkEmitted:!1,top:!0};let t={other:nr,block:fi.normal,inline:pi.normal};this.options.pedantic?(t.block=fi.pedantic,t.inline=pi.pedantic):this.options.gfm&&(t.block=fi.gfm,t.inline=this.options.breaks?pi.breaks:pi.gfm),this.tokenizer.rules=t}static get rules(){return{block:fi,inline:pi}}static lex(t,n){return new e(n).lex(t)}static lexInline(t,n){return new e(n).inlineTokens(t)}lex(e){e=e.replace(nr.carriageReturn,` +`),this.blockTokens(e,this.tokens);for(let e=0;e(i=n.call({lexer:this},e,t))?(e=e.substring(i.raw.length),t.push(i),!0):!1))continue;if(i=this.tokenizer.space(e)){e=e.substring(i.raw.length);let n=t.at(-1);i.raw.length===1&&n!==void 0?n.raw+=` +`:t.push(i);continue}if(i=this.tokenizer.code(e)){e=e.substring(i.raw.length);let n=t.at(-1);n?.type===`paragraph`||n?.type===`text`?(n.raw+=(n.raw.endsWith(` +`)?``:` +`)+i.raw,n.text+=` +`+i.text,this.inlineQueue.at(-1).src=n.text):t.push(i);continue}if(i=this.tokenizer.fences(e)){e=e.substring(i.raw.length),t.push(i);continue}if(i=this.tokenizer.heading(e)){e=e.substring(i.raw.length),t.push(i);continue}if(i=this.tokenizer.hr(e)){e=e.substring(i.raw.length),t.push(i);continue}if(i=this.tokenizer.blockquote(e)){e=e.substring(i.raw.length),t.push(i);continue}if(i=this.tokenizer.list(e)){e=e.substring(i.raw.length),t.push(i);continue}if(i=this.tokenizer.html(e)){e=e.substring(i.raw.length),t.push(i);continue}if(i=this.tokenizer.def(e)){e=e.substring(i.raw.length);let n=t.at(-1);n?.type===`paragraph`||n?.type===`text`?(n.raw+=(n.raw.endsWith(` +`)?``:` +`)+i.raw,n.text+=` +`+i.raw,this.inlineQueue.at(-1).src=n.text):this.tokens.links[i.tag]||(this.tokens.links[i.tag]={href:i.href,title:i.title},t.push(i));continue}if(i=this.tokenizer.table(e)){e=e.substring(i.raw.length),t.push(i);continue}if(i=this.tokenizer.lheading(e)){e=e.substring(i.raw.length),t.push(i);continue}let a=e;if(this.options.extensions?.startBlock){let t=1/0,n=e.slice(1),r;this.options.extensions.startBlock.forEach(e=>{r=e.call({lexer:this},n),typeof r==`number`&&r>=0&&(t=Math.min(t,r))}),t<1/0&&t>=0&&(a=e.substring(0,t+1))}if(this.state.top&&(i=this.tokenizer.paragraph(a))){let r=t.at(-1);n&&r?.type===`paragraph`?(r.raw+=(r.raw.endsWith(` +`)?``:` +`)+i.raw,r.text+=` +`+i.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=r.text):t.push(i),n=a.length!==e.length,e=e.substring(i.raw.length);continue}if(i=this.tokenizer.text(e)){e=e.substring(i.raw.length);let n=t.at(-1);n?.type===`text`?(n.raw+=(n.raw.endsWith(` +`)?``:` +`)+i.raw,n.text+=` +`+i.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=n.text):t.push(i);continue}if(e){this.infiniteLoopError(e.charCodeAt(0));break}}return this.state.top=!0,t}inline(e,t=[]){return this.inlineQueue.push({src:e,tokens:t}),t}linkInText(e){if(!e.includes(`[`))return!1;let t=this.tokenizer.rules.inline.link;for(let n of e.matchAll(this.tokenizer.rules.inline.blockSkip))if(t.test(n[0])&&e.charAt(n.index-1)!==`!`)return!0;for(let t of e.matchAll(this.tokenizer.rules.inline.reflinkSearch)){let e=t[0],n=e.lastIndexOf(`[`);if(!(e.charAt(0)===`!`||!Object.hasOwn(this.tokens.links,e.slice(n+1,-1)))&&!(n>1&&this.linkInText(e.slice(1,n-1))))return!0}return!1}inlineTokens(e,t=[]){this.tokenizer.lexer=this;let n=e;if(this.tokens.links&&e.includes(`[`)){let e=this.tokenizer.rules.inline.reflinkSearch,t=n=>{let r=n.lastIndexOf(`[`);if(!Object.hasOwn(this.tokens.links,n.slice(r+1,-1)))return n;if(r>1&&n.charAt(0)!==`!`){let i=n.slice(1,r-1);if(this.linkInText(i))return`[`+i.replace(e,t)+`][`+`a`.repeat(n.length-r-2)+`]`}return`[`+`a`.repeat(n.length-2)+`]`};n=n.replace(e,t)}n=n.replace(this.tokenizer.rules.inline.anyPunctuation,e=>`+`.repeat(e.length)),n=n.replace(this.tokenizer.rules.inline.blockSkip,(e,t,n)=>{let r=n?n.length:0;return e.slice(0,r)+`[`+`a`.repeat(e.length-r-2)+`]`}),n=this.options.hooks?.emStrongMask?.call({lexer:this},n)??n;let r=!1,i=``,a=1/0;for(;e;){if(e.length(o=n.call({lexer:this},e,t))?(e=e.substring(o.raw.length),t.push(o),!0):!1))continue;if(o=this.tokenizer.escape(e)){e=e.substring(o.raw.length),t.push(o);continue}if(o=this.tokenizer.tag(e)){e=e.substring(o.raw.length),t.push(o);continue}if(o=this.tokenizer.link(e)){e=e.substring(o.raw.length),t.push(o);continue}if(o=this.tokenizer.reflink(e,this.tokens.links)){e=e.substring(o.raw.length);let n=t.at(-1);o.type===`text`&&n?.type===`text`?(n.raw+=o.raw,n.text+=o.text):t.push(o);continue}if(o=this.tokenizer.emStrong(e,n,i)){e=e.substring(o.raw.length),t.push(o);continue}if(o=this.tokenizer.codespan(e)){e=e.substring(o.raw.length),t.push(o);continue}if(o=this.tokenizer.br(e)){e=e.substring(o.raw.length),t.push(o);continue}if(o=this.tokenizer.del(e,n,i)){e=e.substring(o.raw.length),t.push(o);continue}if(o=this.tokenizer.autolink(e)){e=e.substring(o.raw.length),t.push(o);continue}if(!this.state.inLink&&(o=this.tokenizer.url(e))){e=e.substring(o.raw.length),t.push(o);continue}let s=e;if(this.options.extensions?.startInline){let t=1/0,n=e.slice(1),r;this.options.extensions.startInline.forEach(e=>{r=e.call({lexer:this},n),typeof r==`number`&&r>=0&&(t=Math.min(t,r))}),t<1/0&&t>=0&&(s=e.substring(0,t+1))}if(o=this.tokenizer.inlineText(s)){e=e.substring(o.raw.length),o.raw.slice(-1)!==`_`&&(i=o.raw.slice(-1)),r=!0;let n=t.at(-1);n?.type===`text`?(n.raw+=o.raw,n.text+=o.text):t.push(o);continue}if(e){this.infiniteLoopError(e.charCodeAt(0));break}}return t}infiniteLoopError(e){let t=`Infinite loop on byte: `+e;if(this.options.silent)console.error(t);else throw Error(t)}},Di=class{options;parser;constructor(e){this.options=e||Zn}space(e){return``}code({text:e,lang:t,escaped:n}){let r=(t||``).match(nr.notSpaceStart)?.[0],i=e?e.replace(nr.endingNewline,``)+` +`:``;return r?`
                `+(n?i:gi(i,!0))+`
                +`:`
                `+(n?i:gi(i,!0))+`
                +`}blockquote({tokens:e}){return`
                +${this.parser.parse(e)}
                +`}html({text:e}){return e}def(e){return``}heading({tokens:e,depth:t}){return`${this.parser.parseInline(e)} +`}hr(e){return`
                +`}list(e){let t=e.ordered,n=e.start,r=``;for(let t=0;t +`+r+` +`}listitem(e){return`
              • ${this.parser.parse(e.tokens)}
              • +`}checkbox({checked:e}){return` `}paragraph({tokens:e}){return`

                ${this.parser.parseInline(e)}

                +`}table(e){let t=``,n=``;for(let t=0;t${r}`,` + +`+t+` +`+r+`
                +`}tablerow({text:e}){return` +${e} +`}tablecell(e){let t=this.parser.parseInline(e.tokens),n=e.header?`th`:`td`;return(e.align?`<${n} align="${e.align}">`:`<${n}>`)+t+` +`}strong({tokens:e}){return`${this.parser.parseInline(e)}`}em({tokens:e}){return`${this.parser.parseInline(e)}`}codespan({text:e}){return`${gi(e,!0)}`}br(e){return`
                `}del({tokens:e}){return`${this.parser.parseInline(e)}`}link({href:e,title:t,text:n,tokens:r,autolink:i}){let a=i?gi(n,!0):this.parser.parseInline(r),o=_i(e);if(o===null)return a;e=gi(o,i);let s=`
                `+a+``,s}image({href:e,title:t,text:n,tokens:r}){r&&(n=this.parser.parseInline(r,this.parser.textRenderer));let i=_i(e);if(i===null)return gi(n);e=i;let a=`${gi(n)}`,a}text(e){return`tokens`in e&&e.tokens?this.parser.parseInline(e.tokens):`escaped`in e&&e.escaped?e.text:gi(e.text)}},Oi=class{strong({text:e}){return e}em({text:e}){return e}codespan({text:e}){return e}del({text:e}){return e}html({text:e}){return e}text({text:e}){return e}link({text:e}){return``+e}image({text:e}){return``+e}br(){return``}checkbox({raw:e}){return e}},ki=class e{options;renderer;textRenderer;constructor(e){this.options=e||Zn,this.options.renderer=this.options.renderer||new Di,this.renderer=this.options.renderer,this.renderer.options=this.options,this.renderer.parser=this,this.textRenderer=new Oi}static parse(t,n){return new e(n).parse(t)}static parseInline(t,n){return new e(n).parseInline(t)}parse(e){this.renderer.parser=this;let t=``;for(let n=0;n{let i=e[r].flat(1/0);n=n.concat(this.walkTokens(i,t))}):e.tokens&&(n=n.concat(this.walkTokens(e.tokens,t)))}}return n}use(...e){let t=this.defaults.extensions||{renderers:{},childTokens:{}};return e.forEach(e=>{let n={...e};if(n.async=this.defaults.async||n.async||!1,e.extensions&&(e.extensions.forEach(e=>{if(!e.name)throw Error(`extension name required`);if(`renderer`in e){let n=t.renderers[e.name];n?t.renderers[e.name]=function(...t){let r=e.renderer.apply(this,t);return r===!1&&(r=n.apply(this,t)),r}:t.renderers[e.name]=e.renderer}if(`tokenizer`in e){if(!e.level||e.level!==`block`&&e.level!==`inline`)throw Error(`extension level must be 'block' or 'inline'`);let n=t[e.level];n?n.unshift(e.tokenizer):t[e.level]=[e.tokenizer],e.start&&(e.level===`block`?t.startBlock?t.startBlock.push(e.start):t.startBlock=[e.start]:e.level===`inline`&&(t.startInline?t.startInline.push(e.start):t.startInline=[e.start]))}`childTokens`in e&&e.childTokens&&(t.childTokens[e.name]=e.childTokens)}),n.extensions=t),e.renderer){let t=this.defaults.renderer||new Di(this.defaults);for(let n in e.renderer){if(!(n in t))throw Error(`renderer '${n}' does not exist`);if([`options`,`parser`].includes(n))continue;let r=n,i=e.renderer[r],a=t[r];t[r]=(...e)=>{let n=i.apply(t,e);return n===!1&&(n=a.apply(t,e)),n||``}}n.renderer=t}if(e.tokenizer){let t=this.defaults.tokenizer||new Ti(this.defaults);for(let n in e.tokenizer){if(!(n in t))throw Error(`tokenizer '${n}' does not exist`);if([`options`,`rules`,`lexer`].includes(n))continue;let r=n,i=e.tokenizer[r],a=t[r];t[r]=(...e)=>{let n=i.apply(t,e);return n===!1&&(n=a.apply(t,e)),n}}n.tokenizer=t}if(e.hooks){let t=this.defaults.hooks||new Ai;for(let n in e.hooks){if(!(n in t))throw Error(`hook '${n}' does not exist`);if([`options`,`block`].includes(n))continue;let r=n,i=e.hooks[r],a=t[r];t[r]=Ai.passThroughHooks.has(n)?e=>{if(this.defaults.async&&Ai.passThroughHooksRespectAsync.has(n))return(async()=>{let n=await i.call(t,e);return a.call(t,n)})();let r=i.call(t,e);return a.call(t,r)}:(...e)=>{if(this.defaults.async)return(async()=>{let n=await i.apply(t,e);return n===!1&&(n=await a.apply(t,e)),n})();let n=i.apply(t,e);return n===!1&&(n=a.apply(t,e)),n}}n.hooks=t}if(e.walkTokens){let t=this.defaults.walkTokens,r=e.walkTokens;n.walkTokens=function(e){let n=[];return n.push(r.call(this,e)),t&&(n=n.concat(t.call(this,e))),n}}this.defaults={...this.defaults,...n}}),this}setOptions(e){return this.defaults={...this.defaults,...e},this}lexer(e,t){return Ei.lex(e,t??this.defaults)}parser(e,t){return ki.parse(e,t??this.defaults)}parseMarkdown(e){return(t,n)=>{let r={...n},i={...this.defaults,...r},a=this.onError(!!i.silent,!!i.async);if(this.defaults.async===!0&&r.async===!1)return a(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 t>`u`||t===null)return a(Error(`marked(): input parameter is undefined or null`));if(typeof t!=`string`)return a(Error(`marked(): input parameter is of type `+Object.prototype.toString.call(t)+`, string expected`));if(i.hooks&&(i.hooks.options=i,i.hooks.block=e),i.async)return(async()=>{let n=i.hooks?await i.hooks.preprocess(t):t,r=await(i.hooks?await i.hooks.provideLexer(e):e?Ei.lex:Ei.lexInline)(n,i),a=i.hooks?await i.hooks.processAllTokens(r):r;i.walkTokens&&await Promise.all(this.walkTokens(a,i.walkTokens));let o=await(i.hooks?await i.hooks.provideParser(e):e?ki.parse:ki.parseInline)(a,i);return i.hooks?await i.hooks.postprocess(o):o})().catch(a);try{i.hooks&&(t=i.hooks.preprocess(t));let n=(i.hooks?i.hooks.provideLexer(e):e?Ei.lex:Ei.lexInline)(t,i);i.hooks&&(n=i.hooks.processAllTokens(n)),i.walkTokens&&this.walkTokens(n,i.walkTokens);let r=(i.hooks?i.hooks.provideParser(e):e?ki.parse:ki.parseInline)(n,i);return i.hooks&&(r=i.hooks.postprocess(r)),r}catch(e){return a(e)}}}onError(e,t){return n=>{if(n.message+=` +Please report this to https://github.com/markedjs/marked.`,e){let e=`

                An error occurred:

                `+gi(n.message+``,!0)+`
                `;return t?Promise.resolve(e):e}if(t)return Promise.reject(n);throw n}}};function $(e,t){return ji.parse(e,t)}$.options=$.setOptions=function(e){return ji.setOptions(e),$.defaults=ji.defaults,Qn($.defaults),$},$.getDefaults=Xn,$.defaults=Zn;function Mi(...e){return ji.use(...e),$.defaults=ji.defaults,Qn($.defaults),$}$.use=Mi,$.walkTokens=function(e,t){return ji.walkTokens(e,t)},$.parseInline=ji.parseInline,$.Parser=ki,$.parser=ki.parse,$.Renderer=Di,$.TextRenderer=Oi,$.Lexer=Ei,$.lexer=Ei.lex,$.Tokenizer=Ti,$.Hooks=Ai,$.parse=$,$.options,$.setOptions,$.walkTokens,$.parseInline,ki.parse,Ei.lex;function Ni(e){return In.sanitize($.parse(e,{async:!1,breaks:!0,gfm:!0}))}function Pi(e){return new Intl.DateTimeFormat(void 0,{hour:`2-digit`,minute:`2-digit`}).format(new Date(e))}var Fi=a(``);function Ii(n,i){r(i,!0);let a=C(null),c=C(null),u=C(null),d=typeof document<`u`&&document.activeElement instanceof HTMLElement?document.activeElement:null,p=d?.closest(`.thread`),m=d?.closest(`.timeline`),h=p?.querySelector(`[aria-label="Reply body"]:not(:disabled)`)??p?.querySelector(`[aria-label="Close thread"]`)??m?.querySelector(`[aria-label="Message body"]:not(:disabled)`)??m?.querySelector(`[aria-label="Search messages"]`)??(typeof document<`u`?document.querySelector(`[aria-label="Reply body"]:not(:disabled)`)??document.querySelector(`[aria-label="Message body"]:not(:disabled)`)??document.querySelector(`[aria-label="Close thread"]`)??document.querySelector(`[aria-label="Search messages"]`):null),g=new Set;N(()=>{let e=o(a)?.parentElement;if(e)for(let t of e.children)!(t instanceof HTMLElement)||t===o(a)||t.inert||(t.inert=!0,g.add(t));o(u)?.focus({preventScroll:!0})}),j(()=>{for(let e of g)e.inert=!1;g.clear(),!(d?.isConnected&&d!==document.body&&(d.focus({preventScroll:!0}),document.activeElement===d))&&h?.isConnected&&h.focus({preventScroll:!0})});function _(e){if(e.key===`Escape`){e.preventDefault(),e.stopPropagation(),i.onClose();return}if(e.key!==`Tab`||!o(c))return;let t=Array.from(o(c).querySelectorAll(`a[href], button:not([disabled]), [tabindex]:not([tabindex="-1"])`)).filter(e=>!e.inert&&e.getClientRects().length>0);if(t.length===0){e.preventDefault(),o(c).focus();return}let n=t[0],r=t[t.length-1];e.shiftKey&&(document.activeElement===n||!o(c).contains(document.activeElement))?(e.preventDefault(),r.focus()):!e.shiftKey&&(document.activeElement===r||!o(c).contains(document.activeElement))&&(e.preventDefault(),n.focus())}var v=Fi(),y=A(v),x=S(y,2),w=A(x),D=A(w),O=b(D,!0),k=S(D,2),ee=A(k),te=S(ee,2);P(te,e=>T(u,e),()=>o(u)),e(k),e(w);var ne=S(w,2),F=b(ne);e(x),P(x,e=>T(c,e),()=>o(c)),e(v),P(v,e=>T(a,e),()=>o(a)),E(()=>{M(x,`aria-label`,`Image viewer: ${i.title}`),s(O,i.title),M(ee,`href`,i.url),M(F,`src`,i.url),M(F,`alt`,i.title)}),t(`click`,y,function(...e){i.onClose?.apply(this,e)}),t(`keydown`,x,_),t(`click`,te,function(...e){i.onClose?.apply(this,e)}),l(n,v),f()}L([`click`,`keydown`]);var Li=a(``);function Ri(e,t){let n=g(t,`size`,3,44),r=g(t,`class`,3,``);var i=Li();E(()=>{v(i,1,`keystroke-mark ${r()??``}`,`svelte-1bx7eka`),F(i,`--keystroke-size: ${n()??``}px`)}),l(e,i)}var zi=a(`
                `),Bi=a(`
                `);function Vi(t,n){let r=g(n,`rows`,3,3);var i=Bi();c(i,21,()=>Array.from({length:r()}),O,(e,t,n)=>{var r=zi();F(r,`--history-row: ${n}`),l(e,r)}),e(i),E(()=>{v(i,1,`history-loader history-loader--${n.direction}`),M(i,`aria-label`,n.direction===`older`?`Loading older messages`:`Loading newer messages`)}),l(t,i)}var Hi=/(^|[^A-Za-z0-9_@-])(@[A-Za-z0-9][A-Za-z0-9_-]{0,31})/gu;function Ui(e){let t=new Map;for(let n of e){let e=n.handle?.trim().toLowerCase();e&&!n.deleted_at&&t.set(e,n)}return t}function Wi(e,t){let n=[];for(let r of e.matchAll(Hi)){let i=r[1]??``,a=r[2]??``,o=a.slice(1).toLowerCase(),s=r.index+i.length;!t.has(o)||Gi(e,s)||n.push({start:s,end:s+a.length,handle:o})}return n}function Gi(e,t){let n=Math.max(e.lastIndexOf(` `,t-1),e.lastIndexOf(` +`,t-1))+1,r=e.slice(n,t);return/^(?:www\.[^\s/]+|[A-Za-z][A-Za-z0-9+.-]*:\/\/[^\s/]+)\//u.test(r)||/(?:^|\/)[^\s/]*\/$/u.test(r)}function Ki(e){for(let t of e.querySelectorAll(`[data-clickclack-mention]`))t.replaceWith(e.ownerDocument.createTextNode(t.textContent??``))}function qi(e){return!!e.parentElement?.closest(`a, code, pre, script, style, textarea`)}function Ji(e,t,n){if(Ki(e),t.size===0)return;let r=e.ownerDocument.createTreeWalker(e,4),i=[],a;for(;a=r.nextNode();)a instanceof Text&&!qi(a)&&i.push(a);for(let r of i){let i=Wi(r.data,new Set(t.keys()));if(i.length===0)continue;let a=e.ownerDocument.createDocumentFragment(),o=0;for(let s of i){a.append(r.data.slice(o,s.start));let i=t.get(s.handle),c=e.ownerDocument.createElement(`mark`);c.className=`message-mention`,c.dataset.clickclackMention=`true`,c.dataset.mentionHandle=s.handle,i?.id&&(c.dataset.mentionUserId=i.id),i?.id&&i.id===n&&(c.classList.add(`is-current-user`),c.dataset.mentionAttention=`true`),c.title=i?.display_name||`@${s.handle}`,c.textContent=r.data.slice(s.start,s.end),a.append(c),o=s.end}a.append(r.data.slice(o)),r.replaceWith(a)}}function Yi(e,t={}){let n=Ui(t.people??[]),r=t.attentionUserID??``,i,a=()=>{i?.disconnect(),Ji(e,n,r),i?.observe(e,{childList:!0,subtree:!0})};return i=new MutationObserver(()=>a()),a(),{update(e={}){n=Ui(e.people??[]),r=e.attentionUserID??``,a()},destroy(){i?.disconnect()}}}var Xi=[`👍`,`❤️`,`😂`,`😮`,`😢`,`🙏`,`🎉`,`🔥`,`💯`,`👀`,`🚀`,`✅`],Zi=[`👍`,`✅`,`👀`],Qi=[...Zi,...Xi.filter(e=>!Zi.includes(e))].slice(0,6),$i=a(``),ea=a(`
                `);function ta(n,i){r(i,!0);let a=g(i,`placement`,3,`above`),u=g(i,`disabled`,3,!1),d=C(void 0);function p(e){e.key===`Escape`&&(e.preventDefault(),i.onEscape())}_(()=>{(async()=>{await m(),o(d)?.querySelector(`.emoji-option`)?.focus()})()});var h=ea();let y;c(h,21,()=>Xi,O,(e,n)=>{var r=$i(),a=b(r,!0);E(()=>{M(r,`aria-label`,`React with ${o(n)}`),M(r,`title`,o(n)),r.disabled=u(),s(a,o(n))}),t(`click`,r,()=>i.onPick(o(n))),t(`keydown`,r,p),l(e,r)}),e(h),P(h,e=>T(d,e),()=>o(d)),E(()=>{y=v(h,1,`emoji-grid svelte-1caswp`,null,y,{below:a()===`below`,"above-right":a()===`above-right`}),M(h,`id`,i.id)}),l(n,h),f()}L([`click`,`keydown`]);var na=a(` `),ra=a(``),ia=a(`
                `),aa=a(` `),oa=a(`
                `);function sa(n,a){r(a,!0);let u=g(a,`reactions`,19,()=>[]),d=g(a,`pending`,3,!1),p=g(a,`error`,3,``),m=g(a,`disabled`,3,!1),h=I(()=>[...u()].sort((e,t)=>t.count-e.count||e.emoji.localeCompare(t.emoji))),y=C(!1),x=C(void 0),w=C(void 0),k=I(()=>`reaction-picker-${a.messageId}`);function j(){m()||d()||T(y,!o(y))}function ee(e){m()||d()||(a.onToggle(e),T(y,!1))}function N(){T(y,!1),o(w)?.focus()}function ne(e){o(x)&&!o(x).contains(e.target)&&T(y,!1)}_(()=>{if(o(y))return document.addEventListener(`click`,ne),()=>document.removeEventListener(`click`,ne)}),_(()=>{(m()||d())&&T(y,!1)});var F=i(),L=te(F),R=n=>{var r=oa(),i=A(r);c(i,17,()=>o(h),O,(n,r)=>{let i=()=>o(r).emoji,c=()=>o(r).count,u=()=>o(r).reacted_by_me;var f=ra();let p;var h=A(f),g=b(h,!0),_=S(h,2),y=e=>{var t=na(),n=b(t,!0);E(()=>s(n,c())),l(e,t)};D(_,e=>{c()>1&&e(y)}),e(f),E(()=>{p=v(f,1,`reaction-btn svelte-nxju2c`,null,p,{me:u()}),f.disabled=m()||d(),M(f,`aria-pressed`,u()),M(f,`aria-label`,`${i()??``} — ${c()??``} reaction${c()===1?``:`s`}`),M(f,`title`,i()),s(g,i())}),t(`click`,f,()=>a.onToggle(i())),l(n,f)});var u=S(i,2),f=n=>{var r=ia(),i=A(r);P(i,e=>T(w,e),()=>o(w));var a=S(i,2),s=e=>{{let t=I(()=>m()||d());ta(e,{get id(){return o(k)},get disabled(){return o(t)},onPick:ee,onEscape:N})}};D(a,e=>{o(y)&&e(s)}),e(r),P(r,e=>T(x,e),()=>o(x)),E(()=>{M(i,`aria-controls`,o(k)),M(i,`aria-expanded`,o(y)),i.disabled=m()||d()}),t(`click`,i,j),l(n,r)};D(u,e=>{o(h).length>0&&!m()&&e(f)});var g=S(u,2),_=e=>{var t=aa(),n=b(t,!0);E(()=>s(n,p())),l(e,t)};D(g,e=>{p()&&e(_)}),e(r),l(n,r)};D(L,e=>{(o(h).length>0||p())&&e(R)}),l(n,F),f()}L([`click`]);function ca(e){return document.body.appendChild(e),{destroy(){e.remove()}}}var la=a(``),ua=a(``),da=a(` `),fa=a(`Couldn't create link`),pa=a(``),ma=a(`

                `),ha=a(` `,1),ga=a(``),_a=a(``),va=a(``);function ya(n,i){r(i,!0);let a=g(i,`canReact`,3,!1),u=g(i,`canReply`,3,!1),p=g(i,`showOpenThread`,3,!0),m=g(i,`canOpenThread`,3,!1),h=g(i,`canEdit`,3,!1),_=g(i,`canPin`,3,!1),y=g(i,`pinned`,3,!1),x=g(i,`pinning`,3,!1),w=g(i,`pinError`,3,``),k=g(i,`canDelete`,3,!1),ee=g(i,`deleting`,3,!1),ne=g(i,`copyStatus`,3,``),F=g(i,`canCopyLink`,3,!1),I=g(i,`copyLinkStatus`,3,``),L=C(void 0),R=C(void 0),re=!0,z=new Set;function ie(e){if(e.key===`Escape`){e.preventDefault(),e.stopPropagation(),i.onClose();return}if(e.key!==`Tab`||!o(R))return;let t=[...o(R).querySelectorAll(`a[href], button:not([disabled]), [tabindex]:not([tabindex="-1"])`)].filter(e=>!e.inert&&e.getClientRects().length>0);if(t.length===0){e.preventDefault(),o(R).focus();return}let n=t[0],r=t[t.length-1];e.shiftKey&&(document.activeElement===n||!o(R).contains(document.activeElement))?(e.preventDefault(),r.focus()):!e.shiftKey&&(document.activeElement===r||!o(R).contains(document.activeElement))&&(e.preventDefault(),n.focus())}function ae(e,t=!1){re=t,e()}N(()=>{let e=o(L)?.parentElement;if(e)for(let t of e.children)!(t instanceof HTMLElement)||t===o(L)||t.inert||(t.inert=!0,z.add(t));o(R)?.querySelector(`button:not(:disabled)`)?.focus({preventScroll:!0})}),j(()=>{for(let e of z)e.inert=!1;z.clear(),re&&i.returnFocus?.isConnected&&i.returnFocus.focus({preventScroll:!0})});var B=va(),oe=A(B),se=S(oe,2),ce=S(A(se),2);c(ce,21,()=>Qi,O,(e,n)=>{var r=la(),c=b(r,!0);E(()=>{M(r,`aria-label`,`React with ${o(n)}`),r.disabled=!a(),s(c,o(n))}),t(`click`,r,()=>ae(()=>i.onReact(o(n)),!0)),l(e,r)}),e(ce);var V=S(ce,2),le=A(V),H=e=>{var n=ua();E(()=>n.disabled=!m()),t(`click`,n,()=>ae(i.onOpenThread)),l(e,n)};D(le,e=>{p()&&e(H)});var U=S(le,2),W=S(U,2),ue=S(A(W),2),de=e=>{var t=da();let n;var r=b(t,!0);E(()=>{n=v(t,1,`sheet-copy-status`,null,n,{"is-error":ne()===`failed`}),s(r,ne()===`copied`?`Copied`:`Couldn't copy`)}),l(e,t)};D(ue,e=>{ne()&&e(de)}),e(W);var G=S(W,2),fe=n=>{var r=pa(),a=S(A(r)),o=S(a),c=e=>{var t=fa();l(e,t)};D(o,e=>{I()===`failed`&&e(c)}),e(r),E(()=>{r.disabled=I()===`pending`,s(a,` ${I()===`pending`?`Creating link…`:`Copy link`} `)}),t(`click`,r,function(...e){i.onCopyLink?.apply(this,e)}),l(n,r)};D(G,e=>{F()&&i.onCopyLink&&e(fe)});var pe=S(G,2),me=n=>{var r=ha(),a=te(r),o=S(A(a));e(a);var c=S(a,2),u=e=>{var t=ma(),n=b(t,!0);E(()=>s(n,w())),l(e,t)};D(c,e=>{w()&&e(u)}),E(()=>{a.disabled=x(),s(o,` ${y()?`Unpin message`:`Pin message`}`)}),t(`click`,a,function(...e){i.onTogglePin?.apply(this,e)}),l(n,r)};D(pe,e=>{_()&&i.onTogglePin&&e(me)});var he=S(pe,2),K=e=>{var n=ga();t(`click`,n,()=>ae(i.onEdit)),l(e,n)};D(he,e=>{h()&&e(K)});var ge=S(he,2),_e=e=>{var n=_a();E(()=>n.disabled=ee()),t(`click`,n,()=>ae(i.onDelete)),l(e,n)};D(ge,e=>{k()&&e(_e)}),e(V),e(se),P(se,e=>T(R,e),()=>o(R)),e(B),P(B,e=>T(L,e),()=>o(L)),d(B,e=>ca?.(e)),E(()=>{M(se,`id`,i.id),U.disabled=!u()}),t(`keydown`,B,ie),t(`click`,oe,function(...e){i.onClose?.apply(this,e)}),t(`click`,U,()=>ae(i.onReply)),t(`click`,W,function(...e){i.onCopy?.apply(this,e)}),l(n,B),f()}L([`keydown`,`click`]);var ba=a(``);function xa(n,i){r(i,!0);let a=C(void 0),s=C(void 0),c=new Set;function u(e){e.key===`Escape`&&(e.preventDefault(),i.onClose())}function p(){o(s)?.focus({preventScroll:!0}),o(s)?.select()}N(()=>{let e=o(a)?.parentElement;if(e)for(let t of e.children)!(t instanceof HTMLElement)||t===o(a)||t.inert||(t.inert=!0,c.add(t));p()}),j(()=>{for(let e of c)e.inert=!1;c.clear(),i.returnFocus?.isConnected&&i.returnFocus.focus({preventScroll:!0})});var m=ba(),h=A(m),g=S(h,2),_=S(A(g),4);x(_),P(_,e=>T(s,e),()=>o(s));var v=S(_,2);e(g),e(m),P(m,e=>T(a,e),()=>o(a)),d(m,e=>ca?.(e)),E(()=>w(_,i.url)),t(`keydown`,m,u),t(`click`,h,function(...e){i.onClose?.apply(this,e)}),t(`click`,_,p),t(`click`,v,function(...e){i.onClose?.apply(this,e)}),l(n,m),f()}L([`keydown`,`click`]);function Sa(e,t){if(!e)return!1;let n=window.innerHeight,r=e.parentElement;for(;r;){let e=getComputedStyle(r).overflowY;if(e===`auto`||e===`scroll`||e===`hidden`){n=r.getBoundingClientRect().bottom;break}r=r.parentElement}let i=e.getBoundingClientRect();return n-i.bottomt}var Ca=a(`
                `),wa=a(``),Ta=a(` `,1),Ea=a(`
                `,2),Da=a(`
                `),Oa=a(`
                `),ka=a(` `);function Aa(n,a){r(a,!0);let c=g(a,`onOpenImage`,3,()=>{}),u=g(a,`onOpenArtifact`,3,()=>{}),d=C(null),m=C(!1),h=C(``),_=I(()=>o(h)||ne(a.upload.duration_ms??0)),y=I(()=>Gn(a.upload)),x=I(()=>Kn(a.upload)),w=I(()=>o(x)===`unsupported`&&o(y).startsWith(`image/`)),O=I(()=>o(x)===`unsupported`&&o(y).startsWith(`video/`)),k=I(()=>o(x)===`unsupported`&&o(y).startsWith(`audio/`)),j=I(()=>Yn(o(x))!==void 0),ee=I(()=>Jn(o(x))),N=I(()=>{let e=a.upload.width??0,t=a.upload.height??0;if(e<=0||t<=0)return``;let n=o(w)?320:360;return`aspect-ratio: ${e} / ${t}; max-height: ${Math.min(n,Math.max(120,t))}px;`});function ne(e){if(!e||e<=0)return``;let t=Math.floor(e/1e3);return`${Math.floor(t/60)}:${(t%60).toString().padStart(2,`0`)}`}function L(){T(m,!0)}function R(){!o(d)||!isFinite(o(d).duration)||T(h,ne(o(d).duration*1e3),!0)}function re(){o(d)&&(T(m,!0),o(d).play())}var z=i(),ie=te(z),ae=n=>{var r=Ca(),i=A(r),u=b(i),d=S(i,2),f=A(d),p=b(f,!0),m=S(f,2);e(d),e(r),E(()=>{M(i,`aria-label`,`Open image ${a.upload.filename}`),M(u,`src`,a.url),M(u,`alt`,a.upload.filename),M(u,`width`,a.upload.width||void 0),M(u,`height`,a.upload.height||void 0),F(u,o(N)),s(p,a.upload.filename),M(m,`href`,a.url),M(m,`download`,a.upload.filename),M(m,`aria-label`,`Download ${a.upload.filename}`)}),t(`click`,i,()=>c()(a.url,a.upload.filename)),t(`click`,m,e=>e.stopPropagation()),l(n,r)},B=n=>{var r=Ea();let i;var c=A(r),u=b(c);P(c,e=>T(d,e),()=>o(d));var f=S(c,2),h=e=>{var n=Ta(),r=te(n),i=S(r,2),c=e=>{var t=wa(),n=b(t,!0);E(()=>s(n,o(_))),l(e,t)};D(i,e=>{o(_)&&e(c)}),E(()=>M(r,`aria-label`,`Play ${a.upload.filename}`)),t(`click`,r,re),l(e,n)};D(f,e=>{o(m)||e(h)});var g=S(f,2),x=A(g),C=b(x,!0),w=S(x,2);e(g),e(r),E(()=>{i=v(r,1,`media-tile media-tile--video`,null,i,{"is-started":o(m)}),c.controls=o(m),M(c,`aria-label`,a.upload.filename),M(c,`width`,a.upload.width||void 0),M(c,`height`,a.upload.height||void 0),F(c,o(N)),M(u,`src`,a.url),M(u,`type`,o(y)),s(C,a.upload.filename),M(w,`href`,a.url),M(w,`download`,a.upload.filename),M(w,`aria-label`,`Download ${a.upload.filename}`)}),p(`play`,c,L),p(`loadedmetadata`,c,R),t(`click`,w,e=>e.stopPropagation()),l(n,r)},oe=t=>{var n=Da(),r=A(n),i=S(A(r),2),o=A(i),c=b(o,!0),u=S(o,2),d=b(u,!0);e(i),e(r);var f=S(r,2),p=A(f),m=b(p,!0);e(f),e(n),E(e=>{s(c,a.upload.filename),s(d,e),M(f,`src`,a.url),M(p,`href`,a.url),s(m,a.upload.filename)},[()=>Xe(a.upload.byte_size)]),l(t,n)},se=n=>{var r=Oa(),i=A(r),c=A(i),d=b(c,!0);e(i);var f=S(i,2),p=A(f),m=b(p,!0),h=S(p,2),g=b(h,!0);e(f);var _=S(f,2);e(r),E(e=>{M(i,`data-artifact-upload-id`,a.upload.id),M(i,`aria-label`,`Open ${a.upload.filename}`),s(d,o(ee)),M(p,`data-artifact-upload-id`,a.upload.id),s(m,a.upload.filename),s(g,e),M(_,`href`,a.url),M(_,`download`,a.upload.filename),M(_,`aria-label`,`Download ${a.upload.filename}`)},[()=>Xe(a.upload.byte_size)]),t(`click`,i,()=>u()(a.upload)),t(`click`,p,()=>u()(a.upload)),l(n,r)},ce=t=>{var n=ka(),r=S(A(n),2),i=A(r),o=b(i,!0),c=S(i,2),u=b(c,!0);e(r),e(n),E(e=>{M(n,`href`,a.url),M(n,`download`,a.upload.filename),M(n,`aria-label`,`Download ${a.upload.filename}`),s(o,a.upload.filename),s(u,e)},[()=>Xe(a.upload.byte_size)]),l(t,n)};D(ie,e=>{o(w)?e(ae):o(O)?e(B,1):o(k)?e(oe,2):o(j)?e(se,3):e(ce,-1)}),l(n,z),f()}L([`click`]);var ja=a(``),Ma=a(`
                `);function Na(n,i){r(i,!0);let a=C(void 0);N(async()=>{await m(),o(a)?.focus(),o(a)?.setSelectionRange(o(a).value.length,o(a).value.length)});function c(e){if(!(e.isComposing||e.keyCode===229)){if(e.key===`Escape`){e.preventDefault(),e.stopPropagation(),i.onCancel();return}e.target===o(a)&&e.key===`Enter`&&(e.metaKey||e.ctrlKey)&&(e.preventDefault(),i.onSave())}}var d=Ma(),p=A(d);y(p),P(p,e=>T(a,e),()=>o(a));var h=S(p,2),g=A(h),_=A(g),v=e=>{var t=u(`Saving…`);l(e,t)},x=e=>{var t=u(`Save`);l(e,t)};D(_,e=>{i.saving?e(v):e(x,-1)}),e(g);var O=S(g,2);e(h);var k=S(h,2),j=e=>{var t=ja(),n=b(t,!0);E(()=>s(n,i.errorMessage)),l(e,t)};D(k,e=>{i.errorMessage&&e(j)}),e(d),E(e=>{M(d,`aria-busy`,i.saving),w(p,i.body),p.disabled=i.saving,M(p,`aria-invalid`,i.errorMessage?`true`:void 0),M(p,`aria-describedby`,i.errorMessage?`message-edit-error`:void 0),g.disabled=e,O.disabled=i.saving},[()=>i.saving||!Ee(i.body)]),t(`keydown`,d,c),t(`input`,p,e=>i.onBody(e.currentTarget.value)),t(`click`,g,function(...e){i.onSave?.apply(this,e)}),t(`click`,O,function(...e){i.onCancel?.apply(this,e)}),l(n,d),f()}L([`keydown`,`input`,`click`]);var Pa=a(` `),Fa=a(` `),Ia=a(``);function La(n,a){r(a,!0);var o=i(),c=te(o),u=n=>{var r=Ia();let i;var o=S(A(r),2),c=A(o),u=b(c,!0),d=S(c,2),f=e=>{var t=Pa(),n=b(t,!0);E(e=>s(n,e),[()=>he(a.message.quoted_body_snapshot)]),l(e,t)},p=e=>{var t=Fa(),n=b(t);E(e=>s(n,`[original deleted] ${e??``}`),[()=>he(a.message.quoted_body_snapshot)]),l(e,t)};D(d,e=>{a.message.quoted_message_id?e(f):e(p,-1)}),e(o),e(r),E((e,t)=>{i=v(r,1,`quote-block`,null,i,{dangling:!a.message.quoted_message_id}),r.disabled=!a.message.quoted_message_id,M(r,`aria-label`,e),s(u,t)},[()=>a.message.quoted_message_id?`Jump to quoted message from ${K(a.message)}`:`Original message was deleted`,()=>K(a.message)]),t(`click`,r,()=>a.onJump(a.message)),l(n,r)};D(c,e=>{(a.message.quoted_message_id||a.message.quoted_body_snapshot)&&e(u)}),l(n,o),f()}L([`click`]);function Ra(e){return Object.fromEntries(e.items.map(e=>[e.id,{selected:[],other:``,otherOpen:!1}]))}function za(e,t){return e[t.id]??{selected:[],other:``,otherOpen:!1}}function Ba(e,t,n){let r=za(e,t);if(!t.multi_select)return{...e,[t.id]:{selected:[n],other:``,otherOpen:!1}};let i=r.selected.includes(n)?r.selected.filter(e=>e!==n):[...r.selected,n];return{...e,[t.id]:{...r,selected:i}}}function Va(e,t){let n=za(e,t),r=t.multi_select?n.selected:[];return{...e,[t.id]:{...n,selected:r,otherOpen:!0}}}function Ha(e,t,n){let r=za(e,t),i=t.multi_select?r.selected:[];return{...e,[t.id]:{selected:i,other:n,otherOpen:!0}}}function Ua(e,t){if(!t)return[];let n=t.other.trim(),r=(e.options?.length??0)===0||e.allow_other;return[...t.selected,...r&&n?[n]:[]]}function Wa(e,t){return Object.fromEntries(e.items.map(e=>[e.id,Ua(e,t[e.id])]))}function Ga(e,t){return e.items.every(e=>Ua(e,t[e.id]).length>0)}function Ka(e){let[t]=e.items;return e.items.length===1&&!!t?.options?.length&&!t?.multi_select&&!t?.allow_other}function qa(e,t){let n=(e.options?.length??0)+(e.allow_other&&!t?1:0);return Array.from({length:Math.min(n,9)},(e,t)=>String(t+1)).join(` `)}function Ja(e,t){if(!t||e.status!==`open`)return!1;let n=e.responder_user_ids??[];return n.length===0||n.includes(t)}function Ya(e,t){let n=Date.parse(e)-t;if(!Number.isFinite(n)||n<=0)return{label:`0:00`,urgent:!0,expired:!0};let r=Math.ceil(n/1e3);return r>=172800?{label:`${Math.floor(r/86400)} d`,urgent:!1,expired:!1}:r>=3600?{label:`${Math.floor(r/3600)} h`,urgent:!1,expired:!1}:{label:`${Math.floor(r/60)}:${String(r%60).padStart(2,`0`)}`,urgent:r<=120,expired:!1}}function Xa(e,t,n){let r=t||`the agent`;switch(e.status){case`open`:return{label:`Needs your answer`,tone:`open`};case`submitted`:return Date.parse(e.expires_at)<=n?{label:`Sent · not confirmed by ${r}`,tone:`waiting`}:{label:`Sent · waiting for ${r}`,tone:`waiting`};case`answered`:return{label:e.response?.source===`external`?`Answered elsewhere`:`Answered`,tone:`answered`};case`cancelled`:return{label:e.response?.skipped?`Skipped`:`Cancelled`,tone:`muted`};case`expired`:return{label:`Expired`,tone:`muted`};case`failed`:return{label:`Not delivered`,tone:`failed`}}}function Za(e){let t=e.response?.answers;return t?e.items.filter(e=>(t[e.id]?.length??0)>0).map(e=>({id:e.id,header:e.header,values:t[e.id].map(t=>({text:t,typed:!!e.options?.length&&!e.options?.some(e=>e.label===t)}))})):[]}var Qa=50,$a=new Map;function eo(e){return $a.get(e)}function to(e,t){for($a.delete(e),$a.set(e,t);$a.size>Qa;){let e=$a.keys().next().value;if(e===void 0)break;$a.delete(e)}}var no=a(``),ro=a(` `),io=a(` `,1),ao=a(`

                `),oo=a(`

                `),so=a(``),co=a(`Choose any`),lo=a(` `),uo=a(` `),fo=a(``),po=a(``),mo=a(``),ho=a(`
                `),go=a(``),_o=a(`Open link ↗`),vo=a(`
                `),yo=a(`

                `),bo=a(``),xo=a(` `),So=a(``),Co=a(``),wo=a(``),To=a(``),Eo=a(` `),Do=a(`
                `),Oo=a(` `,1),ko=a(` `),Ao=a(`
                `,1),jo=a(`
                `),Mo=a(`

                `),No=a(` `,1),Po=a(`
                `);function Fo(a,d){r(d,!0);let p=g(d,`people`,19,()=>[]),m=h(()=>`${d.message.id}:${d.question.version}`),y=C(null),O=C(ee(h(()=>eo(m)??Ra(d.question)))),k=C(``),j=C(``),N=C(ee(Date.now())),P=Se(),ne=h(()=>`question-${d.message.id}`),F=I(()=>o(y)&&o(y).version>d.question.version?o(y):d.question),L=I(()=>Ya(o(F).expires_at,o(N))),R=I(()=>o(F).status===`open`&&o(L).expired),z=I(()=>o(R)?{...o(F),status:`expired`}:o(F)),B=I(()=>d.message.author?.display_name||`the agent`),oe=I(()=>Xa(o(z),o(B),o(N))),se=I(()=>Ja(o(z),d.currentUserID)),ce=I(()=>Ka(o(F))),V=I(()=>Ga(o(F),o(O))),le=I(()=>Za(o(z))),H=I(()=>(o(F).responder_user_ids??[]).map(e=>{let t=p().find(t=>t.id===e);return t?.handle?`@${t.handle}`:t?.display_name||`a listed person`}));_(()=>{if(o(z).status!==`open`&&o(z).status!==`submitted`)return;let e=setInterval(()=>T(N,Date.now(),!0),1e3);return()=>clearInterval(e)});function U(e){T(O,e,!0),to(m,e)}async function W(e,t){if(!(o(k)||!o(se))){T(k,t,!0),T(j,``);try{let t=await re(`/api/messages/${d.message.id}/question/answers`,{method:`POST`,body:JSON.stringify({...e,nonce:P,expected_version:o(F).version})});t.message.question&&T(y,t.message.question,!0)}catch(e){if(T(j,ae(e,`Could not send your answer`),!0),e instanceof ie&&e.status===409)try{let e=await re(`/api/messages/${d.message.id}`);e.message.question&&T(y,e.message.question,!0)}catch{}}finally{T(k,``)}}}function ue(e,t){if(!(!o(se)||o(k))){if(o(ce)){W({answers:{[e.id]:[t]}},t);return}U(Ba(o(O),e,t))}}function de(){o(V)&&W({answers:Wa(o(F),o(O))},`form`)}function G(e){queueMicrotask(()=>document.getElementById(`question-other-${d.message.id}-${e.id}`)?.focus())}function fe(e,t){if(e.target instanceof HTMLInputElement||e.isComposing||e.metaKey||e.ctrlKey||e.altKey||!/^[1-9]$/.test(e.key)||!o(se))return;let n=Number(e.key)-1,r=t.options??[];n{var t=no();l(e,t)};D(ge,e=>{(o(oe).tone===`open`||o(oe).tone===`waiting`)&&e(_e)});var ve=S(ge);e(K);var ye=S(K,2),be=t=>{var n=io(),r=te(n),i=e=>{var t=ro(),n=b(t);E(()=>s(n,`${o(F).items.length??``} questions`)),l(e,t)};D(r,e=>{o(F).items.length>1&&e(i)});var a=S(r,2);let c;var u=S(A(a));e(a),E(e=>{c=v(a,1,`question-timer`,null,c,{"question-timer--urgent":o(L).urgent}),M(a,`title`,`Expires ${e??``}`),s(u,` ${o(L).label??``}`)},[()=>new Date(o(F).expires_at).toLocaleString()]),l(t,n)},xe=e=>{var t=ro(),n=b(t);E(()=>s(n,`by ${o(z).response.responder.display_name??``}`)),l(e,t)};D(ye,e=>{o(z).status===`open`?e(be):o(z).response?.responder&&e(xe,1)}),e(he);var Ce=S(he,2),we=e=>{var t=ao(),n=b(t,!0);E(()=>s(n,o(F).title)),l(e,t)};D(Ce,e=>{o(F).title&&o(z).status===`open`&&e(we)});var Te=S(Ce,2),Ee=e=>{var t=oo(),n=b(t,!0);E(()=>s(n,o(z).note)),l(e,t)};D(Te,e=>{o(z).note&&o(z).status===`open`&&e(Ee)});var De=S(Te,2),Oe=r=>{var a=Oo(),f=te(a);c(f,19,()=>o(F).items,e=>e.id,(r,a,u)=>{let f=I(()=>o(O)[o(a).id]),p=I(()=>Ua(o(a),o(f)).length>0);var m=vo();let h;var g=A(m),_=A(g),y=e=>{var t=so(),n=b(t,!0);E(()=>s(n,o(u)+1)),l(e,t)};D(_,e=>{o(F).items.length>1&&e(y)});var C=S(_,2),T=b(C,!0),j=S(C,2),ee=e=>{var t=co();l(e,t)};D(j,e=>{o(a).multi_select&&e(ee)}),e(g);var N=S(g,2);n(N,()=>Ni(o(a).prompt),!0),e(N);var P=S(N,2),ne=n=>{var r=ho();let u;var p=A(r);c(p,19,()=>o(a).options??[],e=>e.label,(n,r,i)=>{let c=I(()=>o(f)?.selected.includes(o(r).label)??!1);var u=fo();let d;var p=A(u),m=e=>{var t=lo(),n=b(t,!0);E(()=>s(n,o(i)+1)),l(e,t)};D(p,e=>{o(i)<9&&e(m)});var h=S(p,2),g=b(h,!0),_=S(h,2);let y;var x=S(_,2),C=e=>{var t=uo(),n=b(t,!0);E(()=>s(n,o(r).description)),l(e,t)};D(x,e=>{o(r).description&&e(C)}),e(u),E((e,t)=>{d=v(u,1,`question-key`,null,d,{"is-selected":o(c)||o(k)===o(r).label,"is-pending":o(k)===o(r).label}),M(u,`role`,o(a).multi_select?`checkbox`:`radio`),M(u,`aria-checked`,o(c)),M(u,`aria-keyshortcuts`,e),u.disabled=t,s(g,o(r).label),y=v(_,1,`question-key__mark`,null,y,{"question-key__mark--box":o(a).multi_select})},[()=>o(i)<9?String(o(i)+1):void 0,()=>!o(se)||!!o(k)]),t(`click`,u,()=>ue(o(a),o(r).label)),l(n,u)});var m=S(p,2),h=n=>{var r=i(),c=te(r),u=n=>{var r=po(),i=A(r),c=e=>{var t=lo(),n=b(t,!0);E(()=>s(n,(o(a).options?.length??0)+1)),l(e,t)};D(i,e=>{(o(a).options?.length??0)<9&&e(c)});var u=S(i,2);x(u),e(r),E(e=>{M(u,`id`,`question-other-${d.message.id??``}-${o(a).id??``}`),M(u,`placeholder`,o(a).other_placeholder||`Your answer`),M(u,`aria-label`,`Other answer for ${o(a).header??``}`),w(u,o(f).other),u.disabled=e},[()=>!o(se)||!!o(k)]),t(`input`,u,e=>U(Ha(o(O),o(a),e.currentTarget.value))),t(`keydown`,u,e=>pe(e,o(a))),l(n,r)},p=n=>{var r=mo(),i=A(r),c=e=>{var t=lo(),n=b(t,!0);E(()=>s(n,(o(a).options?.length??0)+1)),l(e,t)};D(i,e=>{(o(a).options?.length??0)<9&&e(c)});var u=S(i,2),d=b(u,!0);e(r),E((e,t)=>{M(r,`aria-keyshortcuts`,e),r.disabled=t,s(d,o(a).other_placeholder||`Other...`)},[()=>(o(a).options?.length??0)<9?String((o(a).options?.length??0)+1):void 0,()=>!o(se)||!!o(k)]),t(`click`,r,()=>{U(Va(o(O),o(a))),G(o(a))}),l(n,r)};D(c,e=>{o(f)?.otherOpen?e(u):e(p,-1)}),l(n,r)};D(m,e=>{o(a).allow_other&&!o(ce)&&e(h)}),e(r),E(e=>{u=v(r,1,`question-options`,null,u,{"question-options--stack":o(ce)}),M(r,`role`,o(a).multi_select?`group`:`radiogroup`),M(r,`aria-label`,o(a).header),M(r,`data-shortcut-keys`,e)},[()=>qa(o(a),o(ce))]),t(`keydown`,r,e=>fe(e,o(a))),l(n,r)},L=e=>{var n=go();x(n),E(e=>{M(n,`aria-label`,o(a).header),w(n,o(f)?.other??``),n.disabled=e},[()=>!o(se)||!!o(k)]),t(`input`,n,e=>U(Ha(o(O),o(a),e.currentTarget.value))),t(`keydown`,n,e=>{e.key===`Enter`&&!e.isComposing&&(e.preventDefault(),de())}),l(e,n)};D(P,e=>{(o(a).options?.length??0)>0?e(ne):e(L,-1)});var R=S(P,2),re=e=>{var t=_o();E(()=>M(t,`href`,o(a).url)),l(e,t)};D(R,e=>{o(a).url&&e(re)}),e(m),E(()=>{h=v(m,1,`question-item`,null,h,{"is-answered":o(p)&&!o(ce)}),s(T,o(a).header)}),l(r,m)});var p=S(f,2),m=t=>{var n=yo(),r=A(n),i=e=>{var t=u(`Sign in to answer this question.`);l(e,t)},a=e=>{var t=u();E(e=>s(t,`Only ${e??``} can answer this question.`),[()=>o(H).join(`, `)]),l(e,t)};D(r,e=>{d.currentUserID?e(a,-1):e(i)}),e(n),l(t,n)};D(p,e=>{o(se)||e(m)});var h=S(p,2),g=e=>{var t=bo(),n=b(t,!0);E(()=>s(n,o(j))),l(e,t)};D(h,e=>{o(j)&&e(g)});var _=S(h,2),y=n=>{var r=Do(),i=A(r),a=e=>{var t=xo(),n=b(t,!0);E(()=>s(n,o(k)?`Sending "${o(k)}"...`:`Tap an answer or press its number`)),l(e,t)},u=e=>{var n=So(),r=b(n,!0);E(e=>{n.disabled=e,s(r,o(k)===`form`?`Sending...`:o(F).items.length>1?`Send answers`:`Send answer`)},[()=>!o(V)||!!o(k)]),t(`click`,n,de),l(e,n)};D(i,e=>{o(ce)?e(a):e(u,-1)});var d=S(i,2),f=e=>{var n=Co(),r=b(n,!0);E(e=>{n.disabled=e,s(r,o(k)===`skip`?`Skipping...`:`Skip`)},[()=>!!o(k)]),t(`click`,n,()=>void W({skip:!0},`skip`)),l(e,n)};D(d,e=>{o(F).allow_skip&&e(f)});var p=S(d,2),m=t=>{var n=To();c(n,21,()=>o(F).items,e=>e.id,(e,t)=>{var n=wo();let r;E(e=>r=v(n,1,``,null,r,{"is-on":e}),[()=>Ua(o(t),o(O)[o(t).id]).length>0]),l(e,n)}),e(n),E(e=>M(n,`aria-label`,`${e??``} of ${o(F).items.length??``} answered`),[()=>o(F).items.filter(e=>Ua(e,o(O)[e.id]).length>0).length]),l(t,n)};D(p,e=>{!o(ce)&&o(F).items.length>1&&e(m)});var h=S(p,2),g=e=>{var t=Eo(),n=b(t);E(e=>s(n,`Only ${e??``} can answer`),[()=>o(H).join(`, `)]),l(e,t)};D(h,e=>{o(H).length>0&&e(g)}),e(r),l(n,r)};D(_,e=>{o(se)&&e(y)}),l(r,a)},ke=t=>{var n=No(),r=te(n),i=t=>{var n=jo();c(n,21,()=>o(le),e=>e.id,(t,n)=>{var r=Ao(),i=te(r),a=b(i,!0),u=S(i,2);c(u,21,()=>o(n).values,e=>e.text,(e,t)=>{var n=ko();let r;var i=b(n,!0);E(()=>{r=v(n,1,`question-answer`,null,r,{"question-answer--typed":o(t).typed}),s(i,o(t).typed?`"${o(t).text}"`:o(t).text)}),l(e,n)}),e(u),E(()=>s(a,o(n).header)),l(t,r)}),e(n),l(t,n)},a=e=>{var t=Mo(),n=b(t);E(e=>s(n,`No answer before ${e??``}.`),[()=>new Date(o(F).expires_at).toLocaleTimeString([],{hour:`numeric`,minute:`2-digit`})]),l(e,t)};D(r,e=>{o(le).length>0?e(i):o(z).status===`expired`&&e(a,1)});var u=S(r,2),d=e=>{var t=Mo(),n=b(t,!0);E(()=>s(n,o(z).note)),l(e,t)};D(u,e=>{o(z).note&&e(d)}),l(t,n)};D(De,e=>{o(z).status===`open`?e(Oe):e(ke,-1)}),e(me),E(()=>{v(me,1,`question-card question-card--${o(oe).tone??``}`),M(me,`aria-labelledby`,ne),M(me,`data-question-status`,o(z).status),M(K,`id`,ne),s(ve,` ${o(oe).label??``}`)}),l(a,me),f()}L([`keydown`,`click`,`input`]);export{Ce as A,Xe as C,Fe as D,Ne as E,ge as F,G as I,fe as L,Se as M,_e as N,De as O,ve as P,de as R,ft as S,Re as T,Jn as _,Sa as a,Kn as b,sa as c,Yi as d,Vi as f,Pi as g,Ni as h,Aa as i,xe as j,we as k,ta as l,Ii as m,La as n,xa as o,Ri as p,Na as r,ya as s,Fo as t,Zi as u,qn as v,Je as w,In as x,Yn as y,ue as z}; \ No newline at end of file diff --git a/apps/api/internal/webassets/dist/_app/immutable/chunks/Cht-DoaS.js b/apps/api/internal/webassets/dist/_app/immutable/chunks/Cht-DoaS.js deleted file mode 100644 index 939d3facb..000000000 --- a/apps/api/internal/webassets/dist/_app/immutable/chunks/Cht-DoaS.js +++ /dev/null @@ -1 +0,0 @@ -import{At as e,B as t,D as n,Et as r,F as i,I as a,K as o,N as s,O as c,P as l,S as u,Tt as d,V as f,X as p,Z as m,a as h,at as g,b as _,dt as v,ft as y,gt as b,ht as x,it as S,j as C,lt as w,n as ee,p as T,pt as E,s as D,ut as O,x as k,yt as A,z as j}from"./CxKeDCcw.js";import"./xihTtKlq.js";import{n as M,u as N}from"./DEPNME54.js";import{C as te,L as ne,O as re,a as ie,c as ae,d as oe,h as se,i as ce,j as P,k as F,m as le,n as ue,o as de,r as fe,s as pe,t as me,u as he,x as ge}from"./BqBbEnKW.js";import{f as _e,l as ve,t as ye,u as be}from"./C7NZ0SeM.js";var I=300,L=200,R=100,z=50,B=e=>e.thread_seq??0,V=class{context;committed;#e=b(null);get root(){return o(this.#e)}set root(e){x(this.#e,e,!0)}#t=b(E([]));get replies(){return o(this.#t)}set replies(e){x(this.#t,e,!0)}#n=b(null);get state(){return o(this.#n)}set state(e){x(this.#n,e,!0)}#r=b(``);get error(){return o(this.#r)}set error(e){x(this.#r,e,!0)}#i=b(null);get selection(){return o(this.#i)}set selection(e){x(this.#i,e)}#a=b(!1);get hasOlder(){return o(this.#a)}set hasOlder(e){x(this.#a,e,!0)}#o=b(!1);get hasNewer(){return o(this.#o)}set hasNewer(e){x(this.#o,e,!0)}#s=b(E({older:!1,newer:!1}));get loading(){return o(this.#s)}set loading(e){x(this.#s,e,!0)}#c=b(E({older:``,newer:``}));get edgeError(){return o(this.#c)}set edgeError(e){x(this.#c,e,!0)}#l=b(!0);get following(){return o(this.#l)}set following(e){x(this.#l,e,!0)}anchor=null;editingID=``;beforeChange;#u=b(E(new Map));get drafts(){return o(this.#u)}set drafts(e){x(this.#u,e,!0)}window=0;revision=0;rowRevisions=new Map;pageMutations=new Set;edgeOwners={};knownTail=0;initialized=!1;coveredStateEvent=!1;constructor(e,t){this.context=e,this.committed=t}get draft(){return this.selection?this.drafts.get(this.selection.messageID):void 0}select(e,t){return this.selection?.messageID===e&&this.isCurrent(this.selection)?this.selection:(this.close(),this.selection={messageID:e,context:this.context()},this.root=t??null,this.state=t?.thread_state??null,this.selection)}isCurrent(e){return e!==null&&this.selection===e&&e.context===this.context()}close(){this.selection=null,this.window++,this.rowRevisions.clear(),this.pageMutations.clear(),this.edgeOwners={},this.knownTail=0,this.root=null,this.replies=[],this.state=null,this.error=``,this.hasOlder=this.hasNewer=!1,this.loading={older:!1,newer:!1},this.edgeError={older:``,newer:``},this.initialized=this.coveredStateEvent=!1,this.following=!0,this.anchor=null,this.editingID=``}owner(e=()=>!0){let t=this.selection,n=this.window;return{selection:t,current:()=>this.isCurrent(t)&&this.window===n&&e()}}async request(e,t){let n=new URLSearchParams(Object.entries(t).map(([e,t])=>[e,String(t)])),r=new Map;this.pageMutations.add(r);try{let t=await M(`/api/messages/${e.messageID}/thread?${n}`);if(r.size>I)throw Error(`Too many replies changed while loading. Please try again.`);let i=e=>{let t=r.get(e.id);return t?F(e,t):e};return t.root=i(t.root),t.replies=t.replies.map(i),t}finally{this.pageMutations.delete(r)}}mergeSnapshot(e,t,n){return t?(this.rowRevisions.get(e.id)??0)>n?F(e,t):F(t,e):e}metadata(e,t){this.root=this.mergeSnapshot(e.root,this.root,t),this.rowRevisions.set(e.root.id,++this.revision),this.knownTail=Math.max(this.knownTail,e.newest_seq),this.reconcileState(e.thread_state),this.error=``,this.committed([e.root,...e.replies])}reconcileState(e){this.state=re(this.state,e),this.root&&={...this.root,thread_state:this.state}}merge(e,t,n,r=`preserve`){this.beforeChange?.(r);let i=new Map(this.replies.map(e=>[e.id,e]));for(let n of e)i.set(n.id,this.mergeSnapshot(n,i.get(n.id),t)),this.rowRevisions.set(n.id,++this.revision);let a=[...i.values()].sort((e,t)=>B(e)-B(t));if(a.length>I){let e=n===`older`?0:a.length-L,t=Math.min(a.length,e+L),r=[this.following?``:this.anchor?.messageID,this.editingID].map(e=>a.findIndex(t=>t.id===e)).filter(e=>e>=0);r.length&&(e=Math.min(e,...r),t=Math.max(t,...r.map(e=>e+1)),t-e>I&&(n===`newer`?t=e+I:e=t-I)),e>0&&(this.hasOlder=!0),te.id)]);for(let t of this.rowRevisions.keys())e.has(t)||this.rowRevisions.delete(t)}selectWindow(){this.window++,this.pageMutations.clear(),this.edgeOwners={},this.loading={older:!1,newer:!1},this.edgeError={older:``,newer:``}}async open(e=()=>!0){return this.initialized&&this.isCurrent(this.selection)?e():this.latest(e)}async latest(e=()=>!0){return this.selectWindow(),this.replace({latest:!0,limit:R},`latest`,e)}async replace(e,t,n){let{selection:r,current:i}=this.owner(n),a=this.revision;if(!r||!i())return!1;try{let n=await this.request(r,e);if(!i())return!1;this.beforeChange?.(t);let o=new Map(this.replies.map(e=>[e.id,e])),s=n.replies.map(e=>this.mergeSnapshot(e,o.get(e.id),a));t===`latest`&&n.replies.some(e=>o.has(e.id))&&(s=[...s,...this.replies.filter(e=>B(e)>n.newest_seq)]),this.replies=s.slice(-300);for(let e of this.replies)this.rowRevisions.set(e.id,++this.revision);return this.pruneRevisions(),this.hasOlder=n.has_older||s.length>this.replies.length,this.hasNewer=n.has_newer||B(this.replies.at(-1)??{})!0){this.selectWindow();let n=this.owner(t);if(!n.selection||!n.current())return!1;try{let t=this.root?.id===e.messageID?this.root:this.replies.find(t=>t.id===e.messageID);if(t){if(t.deleted_at)throw Error(`This message was deleted.`);return this.following=!1,this.beforeChange?.(e),!0}let r=e.threadSeq;if(!r){let t=(await M(`/api/messages/${e.messageID}`)).message;if(!n.current())return!1;if(t.thread_root_id!==n.selection.messageID||!t.thread_seq||t.deleted_at)throw Error(`This reply is no longer available in this thread.`);r=t.thread_seq}if(!n.current()||!await this.replace({around_seq:r,limit:R},e,n.current))return!1;if(!this.replies.some(t=>t.id===e.messageID&&!t.deleted_at))throw Error(`This reply is no longer available.`);return this.following=!1,!0}catch(e){return n.current()&&(this.error=N(e,`Could not open this reply.`)),!1}}async loadEdge(e,t=()=>!0,n=z){if(this.loading[e])return!1;let{selection:r,current:i}=this.owner(t),a=this.revision;if(!r||!i())return!1;let o=B(e===`older`?this.replies[0]??{}:this.replies.at(-1)??{}),s={};this.edgeOwners[e]=s,this.loading[e]=!0,this.edgeError[e]=``;try{let t=await this.request(r,{[e===`older`?`before_seq`:`after_seq`]:o,limit:n});return!i()||(this.metadata(t,a),o&&!this.replies.some(e=>B(e)===o))?!1:(e===`older`?this.hasOlder=t.has_older:this.hasNewer=t.has_newer,this.merge(t.replies,a,e),!0)}catch(t){if(!i())return!1;throw this.edgeError[e]=N(t,`Could not load ${e} replies.`),t}finally{this.edgeOwners[e]===s&&(delete this.edgeOwners[e],this.loading[e]=!1)}}async refresh(e=()=>!0){if(!this.initialized)return this.open(e);let{selection:t,current:n}=this.owner(e),r=this.revision;if(!t||!n())return!1;if(!this.replies.length)return this.latest(e);let i=B(this.replies.at(-1)),a=B(this.replies[0])-1;try{for(;aB(e)<=i),r,`newer`),e.newest_seq<=a)break;a=e.newest_seq,this.hasNewer=e.has_newer||e.newest_seq>i}return this.following&&await this.catchUp(e),n()}catch(e){if(!n())return!1;throw this.error=N(e,`Could not refresh the thread.`),e}}async catchUp(e){let{selection:t,current:n}=this.owner(e),r=this.revision;if(!t||!n())return;let i=await this.request(t,{latest:!0,limit:1});if(n()){if(this.metadata(i,r),B(this.replies.at(-1)??{})>=i.newest_seq){this.hasNewer=!1;return}if(!(this.hasNewer&&!this.following)){for(let e=0;n()&&B(this.replies.at(-1)??{})=I);e+=z);n()&&B(this.replies.at(-1)??{})e.id===n))||!this.isCurrent(this.selection))return!1;let r=this.owner(t);try{if(e.type===`thread.reply_created`)await this.catchUp(t),r.current()&&(this.coveredStateEvent=!0);else if(e.type===`thread.state_updated`)this.coveredStateEvent?this.coveredStateEvent=!1:await this.catchUp(t);else if((e.type===`message.updated`||e.type===`message.deleted`)&&n){let{current:e}=this.owner(t),r=this.revision,i=await M(`/api/messages/${n}`);if(e()){let e=this.root?.id===n?this.root:this.replies.find(e=>e.id===n);this.updateMessage(this.mergeSnapshot(i.message,e,r))}}else return!1;return!0}catch(e){if(r.current())throw e;return!1}}updateDraft(e){let t=this.selection?.messageID;!t||this.draft?.sending||this.patchDraft(t,{body:e,error:``})}setQuote(e){let t=this.selection?.messageID;!t||this.draft?.sending||this.patchDraft(t,{quote:e})}patchDraft(e,t){let n={body:``,quote:null,sending:!1,error:``,...this.drafts.get(e),...t},r=new Map(this.drafts);!n.body&&!n.quote&&!n.sending&&!n.error?r.delete(e):r.set(e,n),this.drafts=r}updateAuthor(e){for(let t of this.root?[this.root,...this.replies]:this.replies)t.author?.id===e.id&&this.updateMessage({id:t.id,thread_root_id:t.thread_root_id,author:e})}updateMessage(e){if(e.deleted_at&&this.draft?.quote?.id===e.id&&this.setQuote(null),e.thread_root_id===this.selection?.messageID){for(let t of this.pageMutations)if(t.size<=I){let n=t.get(e.id);t.set(e.id,n?F(n,e):e)}this.beforeChange?.(`preserve`),this.rowRevisions.set(e.id,++this.revision),this.replies=this.replies.map(t=>t.id===e.id?F(t,e):t),this.root?.id===e.id&&(this.root=F(this.root,e)),this.pruneRevisions(),this.committed()}}async send(e){let{selection:t,current:n}=this.owner(),r=this.draft,i=r?.body.trim();if(!this.isCurrent(t)||!this.root||!r||!i||r.sending)return;let a=r.quote?.id,o=r.submission?.body===i&&r.submission.quotedMessageID===a?r.submission:{body:i,quotedMessageID:a,nonce:P()};this.patchDraft(t.messageID,{sending:!0,error:``,submission:o});try{let e=await M(`/api/messages/${t.messageID}/thread/replies`,{method:`POST`,body:JSON.stringify({body:i,nonce:o.nonce,quoted_message_id:a})});if(this.patchDraft(t.messageID,{body:``,quote:null,submission:void 0}),this.selection?.messageID!==t.messageID||!this.isCurrent(this.selection)||(this.revision++,this.reconcileState(e.thread_state),this.committed(),!n()))return;!this.hasNewer&&!this.replies.some(t=>t.id===e.message.id)&&B(e.message)===B(this.replies.at(-1)??{})+1&&this.merge([e.message],this.revision,`newer`,`latest`);try{await this.latest()}catch{}}catch(n){this.patchDraft(t.messageID,{error:N(n,`Could not post the reply.`)}),this.isCurrent(t)&&e?.(n)}finally{this.patchDraft(t.messageID,{sending:!1})}}},H=a(`
                `);function xe(t,n){r(n,!0);let a=h(n,`agentNames`,19,()=>[]),c=A(()=>a().length===1?`${a()[0]} is responding…`:a().length===2?`${a()[0]} and ${a()[1]} are responding…`:a().length>2?`Several agents are responding…`:`Agent is responding…`);var u=i(),f=O(u),p=t=>{var n=H(),r=y(w(n),2),i=v(r,!0);e(n),S(()=>s(i,o(c))),l(t,n)};C(f,e=>{n.active&&e(p)}),l(t,u),d()}var Se=a(`
                `);function Ce(n,i){r(i,!0);let a=h(i,`disabled`,3,!1),s=h(i,`pending`,3,!1),c=h(i,`buttonClass`,3,``),u=b(!1),f=b(!1),p=b(void 0),m=b(void 0),v=A(()=>`add-reaction-picker-${i.messageId}`);function ee(){a()||s()||(o(u)||x(f,ce(o(p),130),!0),x(u,!o(u)))}function E(e){a()||s()||(i.onToggle(e),x(u,!1))}function O(){x(u,!1),o(m)?.focus()}function j(e){o(p)&&!o(p).contains(e.target)&&x(u,!1)}g(()=>{if(o(u))return document.addEventListener(`click`,j),()=>document.removeEventListener(`click`,j)}),g(()=>{(a()||s())&&x(u,!1)});var M=Se(),N=w(M);D(N,e=>x(m,e),()=>o(m));var te=y(N,2),ne=e=>{{let t=A(()=>o(f)?`above-right`:`below`),n=A(()=>a()||s());ae(e,{get id(){return o(v)},get placement(){return o(t)},get disabled(){return o(n)},onPick:E,onEscape:O})}};C(te,e=>{o(u)&&e(ne)}),e(M),D(M,e=>x(p,e),()=>o(p)),S(()=>{_(N,1,k(c()),`svelte-sk6gxl`),T(N,`aria-controls`,o(v)),T(N,`aria-expanded`,o(u)),N.disabled=a()||s()}),t(`click`,N,ee),l(n,M),d()}j([`click`]);var we=a(``),Te=a(` `),Ee=a(`Couldn't create link`),De=a(`Open in ClickClack`),Oe=a(``),ke=a(`deleted bot`),Ae=a(` `),je=a(``),Me=a(``),Ne=a(``),Pe=a(``),Fe=a(` `,1),Ie=a(`
                This message was deleted.
                `),Le=a(`(edited)`),Re=a(`
                `,1),ze=a(`
                `),Be=a(`

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

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

                `),vt=a(`

                Blocked.

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

                Profile

                Active
                Contact information
                Handle
                User ID
                About

                `,1);function wt(n,i){r(i,!0);let a=h(i,`messagePending`,3,!1),c=h(i,`messageError`,3,``),u=j(()=>i.profile.kind===`bot`?i.profile.owner_user_id?`Bot of ${i.profile.owner_user_id}`:`Service bot`:``),d=j(()=>i.moderation?.role||`member`),p=j(()=>!!i.moderation&&o(d)!==`owner`&&(i.currentUserRole===`owner`||i.currentUserRole===`moderator`&&(o(d)===`member`||o(d)===`guest`))),m=j(()=>i.currentUser?.id!==i.profile.id&&o(p)),g=j(()=>!!i.moderation?.blocked_at),_=j(()=>o(d));var b=Ct(),x=A(b),w=E(x),ee=y(E(w),2),T=v(ee,!0);e(w);var te=y(w,2);e(x);var D=y(x,2),O=E(D),k=E(O);B(k,{class:`profile-avatar`,get id(){return i.profile.id},get name(){return i.profile.display_name},get src(){return i.profile.avatar_url},size:240,loading:`eager`,fetchPriority:`auto`}),e(O);var M=y(O,2),N=E(M),P=E(N),F=E(P),re=v(F,!0),ie=y(F,2),ae=e=>{var t=ft(),n=v(t,!0);S(()=>s(n,o(u))),l(e,t)};C(ie,e=>{o(u)&&e(ae)});var oe=y(ie,2),se=e=>{var t=pt(),n=v(t,!0);S(e=>s(n,e),[()=>z(i.profile.handle)]),l(e,t)};C(oe,e=>{i.profile.handle&&e(se)}),e(P);var ce=y(P,2),le=e=>{var n=mt();t(`click`,n,function(...e){i.onEdit?.apply(this,e)}),l(e,n)};C(ce,e=>{i.currentUser?.id===i.profile.id&&i.onEdit&&e(le)}),e(N);var ue=y(N,4),de=n=>{var r=ht(),o=E(r),c=v(o,!0);e(r),S(()=>{o.disabled=a(),s(c,a()?`Starting…`:`Message`)}),t(`click`,o,()=>i.onMessage?.(i.profile.id)),l(n,r)};C(ue,e=>{i.currentUser?.id!==i.profile.id&&i.onMessage&&e(de)});var fe=y(ue,2),pe=e=>{var t=gt(),n=v(t,!0);S(()=>s(n,c())),l(e,t)};C(fe,e=>{c()&&e(pe)});var me=y(fe,2),I=E(me),L=y(E(I),2),he=e=>{var n=mt();t(`click`,n,function(...e){i.onEdit?.apply(this,e)}),l(e,n)};C(L,e=>{i.currentUser?.id===i.profile.id&&i.onEdit&&e(he)}),e(I);var R=y(I,2),ge=y(E(R),2),_e=y(E(ge),2),ve=v(_e,!0);e(ge),e(R);var ye=y(R,2),xe=y(E(ye),2),Se=y(E(xe),2),Ce=v(Se,!0);e(xe),e(ye);var V=y(ye,2),H=t=>{var n=_t(),r=y(E(n),2),i=y(E(r),2),a=v(i,!0);e(r),e(n),S(()=>s(a,o(u))),l(t,n)};C(V,e=>{i.profile.kind===`bot`&&e(H)}),e(me);var U=y(me,2),we=y(E(U),2),Te=v(we);e(U);var W=y(U,2),Ee=n=>{var r=Q(),a=E(r),c=y(E(a),2),u=v(c,!0);e(a);var d=y(a,2),f=e=>{var t=Z(),n=v(t);S(()=>s(n,`${i.moderation.posts_remaining??``} of ${i.moderation.post_limit??``} waiting-room posts left today.`)),l(e,t)};C(d,e=>{i.moderation.role===`guest`&&i.moderation.post_limit>0&&e(f)});var p=y(d,2),m=e=>{var t=Z(),n=v(t);S(e=>s(n,`Timed out until ${e??``}.`),[()=>new Date(i.moderation.timeout_until).toLocaleString()]),l(e,t)};C(p,e=>{i.moderation.timeout_until&&e(m)});var h=y(p,2),b=e=>{var t=vt();l(e,t)};C(h,e=>{i.moderation.blocked_at&&e(b)});var x=y(h,2),w=E(x),ee=e=>{var n=yt();t(`click`,n,()=>i.onApprove?.(i.profile.id)),l(e,n)};C(w,e=>{i.moderation.role===`guest`&&i.onApprove&&e(ee)});var T=y(w,2),te=e=>{var n=bt();t(`click`,n,()=>i.onTimeout?.(i.profile.id)),l(e,n)};C(T,e=>{i.onTimeout&&e(te)});var D=y(T,2),O=e=>{var n=xt();t(`click`,n,()=>i.onUnblock?.(i.profile.id)),l(e,n)},k=e=>{var n=St();t(`click`,n,()=>i.onBlock?.(i.profile.id)),l(e,n)};C(D,e=>{o(g)&&i.onUnblock?e(O):!o(g)&&i.onBlock&&e(k,1)}),e(x),e(r),S(()=>s(u,o(_))),l(n,r)};C(W,e=>{o(m)&&i.moderation&&e(Ee)}),e(M),e(D),S((e,t)=>{s(T,i.profile.display_name),ne(O,`--hue: ${e??``}deg`),s(re,i.profile.display_name),s(ve,t),s(Ce,i.profile.id),s(Te,`Member of ${(i.workspaceName||`this workspace`)??``}.`)},[()=>be(i.profile.id),()=>i.profile.handle?z(i.profile.handle):`No handle set`]),t(`click`,te,function(...e){i.onClose?.apply(this,e)}),l(n,b),f()}M([`click`]);export{Ce as i,dt as n,Ne as r,wt as t}; \ No newline at end of file diff --git a/apps/api/internal/webassets/dist/_app/immutable/entry/app.CqYZBsX3.js b/apps/api/internal/webassets/dist/_app/immutable/entry/app.Bp9-ZlMx.js similarity index 77% rename from apps/api/internal/webassets/dist/_app/immutable/entry/app.CqYZBsX3.js rename to apps/api/internal/webassets/dist/_app/immutable/entry/app.Bp9-ZlMx.js index d07d6c513..bf193073e 100644 --- a/apps/api/internal/webassets/dist/_app/immutable/entry/app.CqYZBsX3.js +++ b/apps/api/internal/webassets/dist/_app/immutable/entry/app.Bp9-ZlMx.js @@ -1,2 +1,2 @@ -const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["../nodes/0.BFZe630_.js","../chunks/DK3Fl9T5.js","../chunks/CxKeDCcw.js","../chunks/ChC1oWd7.js","../chunks/Dt-HX3Vu.js","../chunks/xihTtKlq.js","../chunks/qQG-ipvL.js","../chunks/Dqjw8vaP.js","../chunks/DEPNME54.js","../assets/0.C7M1Y4Cy.css","../nodes/1.CvWNubFT.js","../chunks/Dr1oMBlb.js","../nodes/2.cjG1hDc1.js","../chunks/Qo16U5GS.js","../chunks/OQjxVT6U.js","../nodes/3.B10d8uq2.js","../chunks/uBIymjUX.js","../chunks/CYM1xkwL.js","../nodes/4.COOlYmhK.js","../chunks/TM-oTWC2.js","../chunks/BqBbEnKW.js","../chunks/C7NZ0SeM.js","../assets/QuoteBlock.Bmfc9wvU.css","../chunks/CyT438p0.js","../chunks/DlGnnCJo.js","../chunks/BVPazc3H.js","../chunks/Cht-DoaS.js","../assets/ThreadPanel.DFXp9CyT.css","../chunks/CVdgRPye.js","../chunks/BIhzYFGW.js","../assets/ChatApp.BrxGlI__.css","../nodes/5.BdROoItM.js","../nodes/6.D1H8DGKr.js","../nodes/7.DMByM9ti.js","../chunks/Wx71Z9jO.js","../nodes/8.BWm139W5.js","../nodes/9.BXnh5nE4.js","../nodes/10.C0wr3ez6.js","../nodes/11.DjDAoGTk.js","../nodes/12.B6Gmd9sk.js","../assets/12.CzRaoRZI.css","../nodes/13._k72L9rt.js","../assets/13.CMVv15Ug.css"])))=>i.map(i=>d[i]); -import{At as e,Et as t,F as n,I as r,K as i,N as a,P as o,R as s,T as c,Tt as l,X as u,a as d,at as f,ft as p,gt as m,ht as h,i as g,it as _,j as v,lt as y,ot as b,r as x,s as S,ut as C,yt as w}from"../chunks/CxKeDCcw.js";import{t as T}from"../chunks/uBIymjUX.js";import"../chunks/xihTtKlq.js";var E={},D=r(`
                `),O=r(` `,1);function k(r,g){t(g,!0);let T=d(g,`components`,23,()=>[]),E=d(g,`data_0`,3,null),k=d(g,`data_1`,3,null),A=d(g,`data_2`,3,null);b(()=>g.stores.page.set(g.page)),f(()=>{g.stores,g.page,g.constructors,T(),g.form,E(),k(),A(),g.stores.page.notify()});let j=m(!1),M=m(!1),N=m(null);x(()=>{let e=g.stores.page.subscribe(()=>{i(j)&&(h(M,!0),u().then(()=>{h(N,document.title||`untitled page`,!0)}))});return h(j,!0),e});let P=w(()=>g.constructors[2]);var F=O(),I=C(F),L=e=>{let t=w(()=>g.constructors[0]);var r=n(),a=C(r);c(a,()=>i(t),(e,t)=>{S(t(e,{get data(){return E()},get form(){return g.form},get params(){return g.page.params},children:(e,t)=>{var r=n(),a=C(r),s=e=>{let t=w(()=>g.constructors[1]);var r=n(),a=C(r);c(a,()=>i(t),(e,t)=>{S(t(e,{get data(){return k()},get form(){return g.form},get params(){return g.page.params},children:(e,t)=>{var r=n(),a=C(r);c(a,()=>i(P),(e,t)=>{S(t(e,{get data(){return A()},get form(){return g.form},get params(){return g.page.params}}),e=>T()[2]=e,()=>T()?.[2])}),o(e,r)},$$slots:{default:!0}}),e=>T()[1]=e,()=>T()?.[1])}),o(e,r)},l=e=>{let t=w(()=>g.constructors[1]);var r=n(),a=C(r);c(a,()=>i(t),(e,t)=>{S(t(e,{get data(){return k()},get form(){return g.form},get params(){return g.page.params}}),e=>T()[1]=e,()=>T()?.[1])}),o(e,r)};v(a,e=>{g.constructors[2]?e(s):e(l,-1)}),o(e,r)},$$slots:{default:!0}}),e=>T()[0]=e,()=>T()?.[0])}),o(e,r)},R=e=>{let t=w(()=>g.constructors[0]);var r=n(),a=C(r);c(a,()=>i(t),(e,t)=>{S(t(e,{get data(){return E()},get form(){return g.form},get params(){return g.page.params}}),e=>T()[0]=e,()=>T()?.[0])}),o(e,r)};v(I,e=>{g.constructors[1]?e(L):e(R,-1)});var z=p(I,2),B=t=>{var n=D(),r=y(n),c=e=>{var t=s();_(()=>a(t,i(N))),o(e,t)};v(r,e=>{i(M)&&e(c)}),e(n),o(t,n)};v(z,e=>{i(j)&&e(B)}),o(r,F),l()}var A=g(k),j=[()=>T(()=>import(`../nodes/0.BFZe630_.js`),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9]),import.meta.url),()=>T(()=>import(`../nodes/1.CvWNubFT.js`),__vite__mapDeps([10,2,1,5,11,3,4]),import.meta.url),()=>T(()=>import(`../nodes/2.cjG1hDc1.js`),__vite__mapDeps([12,1,2,3,4,5,6,8,11,13,14]),import.meta.url),()=>T(()=>import(`../nodes/3.B10d8uq2.js`),__vite__mapDeps([15,1,2,16,5,17]),import.meta.url),()=>T(()=>import(`../nodes/4.COOlYmhK.js`),__vite__mapDeps([18,2,1,5,17,19,3,4,16,6,8,7,13,14,20,21,22,23,24,25,26,27,28,29,30]),import.meta.url),()=>T(()=>import(`../nodes/5.BdROoItM.js`),__vite__mapDeps([31,2,1,5,19,3,4,16,6,8,7,13,14,17,20,21,22,23,24,25,26,27,28,29,30]),import.meta.url),()=>T(()=>import(`../nodes/6.D1H8DGKr.js`),__vite__mapDeps([32,1,4,13]),import.meta.url),()=>T(()=>import(`../nodes/7.DMByM9ti.js`),__vite__mapDeps([33,1,2,5,8,7,14,28,34]),import.meta.url),()=>T(()=>import(`../nodes/8.BWm139W5.js`),__vite__mapDeps([35,1,2,5,8,7,14,24,25,28,29,34]),import.meta.url),()=>T(()=>import(`../nodes/9.BXnh5nE4.js`),__vite__mapDeps([36,1,2,5,21,8,25,29]),import.meta.url),()=>T(()=>import(`../nodes/10.C0wr3ez6.js`),__vite__mapDeps([37,1,2,3,4,5,6,8,14,29]),import.meta.url),()=>T(()=>import(`../nodes/11.DjDAoGTk.js`),__vite__mapDeps([38,2,1,5,19,3,4,16,6,8,7,13,14,17,20,21,22,23,24,25,26,27,28,29,30]),import.meta.url),()=>T(()=>import(`../nodes/12.B6Gmd9sk.js`),__vite__mapDeps([39,1,2,5,8,7,20,21,22,23,24,25,29,40]),import.meta.url),()=>T(()=>import(`../nodes/13._k72L9rt.js`),__vite__mapDeps([41,1,2,5,8,7,20,21,22,24,26,27,29,42]),import.meta.url)],M=[],N={"/":[3],"/app":[4],"/app/[workspaceID]":[5],"/app/[workspaceID]/(settings)/settings":[6,[2]],"/app/[workspaceID]/(settings)/settings/bots":[7,[2]],"/app/[workspaceID]/(settings)/settings/integrations":[8,[2]],"/app/[workspaceID]/(settings)/settings/members":[9,[2]],"/app/[workspaceID]/(settings)/settings/overview":[10,[2]],"/app/[workspaceID]/[targetID]":[11],"/embed/channel/[workspaceID]/[channelID]":[12],"/embed/thread/[workspaceID]/[messageID]":[13]},P={handleError:(({error:e})=>{console.error(e)}),reroute:(()=>{}),transport:{}},F=Object.fromEntries(Object.entries(P.transport).map(([e,t])=>[e,t.decode])),I=Object.fromEntries(Object.entries(P.transport).map(([e,t])=>[e,t.encode])),L=!1,R=(e,t)=>F[e](t),z=()=>T(()=>import(`../chunks/Bjy-W4x2.js`).then(e=>e.default),[],import.meta.url);export{R as decode,F as decoders,N as dictionary,I as encoders,z as get_error_template,L as hash,P as hooks,E as matchers,j as nodes,A as root,M as server_loads}; \ No newline at end of file +const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["../nodes/0.Bvsap0NR.js","../chunks/DK3Fl9T5.js","../chunks/CxKeDCcw.js","../chunks/ChC1oWd7.js","../chunks/Dt-HX3Vu.js","../chunks/xihTtKlq.js","../chunks/qQG-ipvL.js","../chunks/Dqjw8vaP.js","../chunks/DEPNME54.js","../assets/0.CxCYe6Mo.css","../nodes/1.CvWNubFT.js","../chunks/Dr1oMBlb.js","../nodes/2.cjG1hDc1.js","../chunks/Qo16U5GS.js","../chunks/OQjxVT6U.js","../nodes/3.C7DN7NOx.js","../chunks/uBIymjUX.js","../chunks/CYM1xkwL.js","../nodes/4.DqOhk8S8.js","../chunks/2-3ayDfx.js","../chunks/CdcQtYSQ.js","../chunks/C7NZ0SeM.js","../assets/QuestionCard.Bmfc9wvU.css","../chunks/BmuvpQ2l.js","../chunks/DlGnnCJo.js","../chunks/BVPazc3H.js","../chunks/6VrLJ6am.js","../assets/ThreadPanel.DFXp9CyT.css","../chunks/CVdgRPye.js","../chunks/BIhzYFGW.js","../assets/ChatApp.BrxGlI__.css","../nodes/5.DcgOcgA7.js","../nodes/6.D1H8DGKr.js","../nodes/7.DMByM9ti.js","../chunks/Wx71Z9jO.js","../nodes/8.BWm139W5.js","../nodes/9.BXnh5nE4.js","../nodes/10.C0wr3ez6.js","../nodes/11.C5MPc9e3.js","../nodes/12.DPB6t2A_.js","../assets/12.CzRaoRZI.css","../nodes/13.C1uuW6Zz.js","../assets/13.CMVv15Ug.css"])))=>i.map(i=>d[i]); +import{At as e,Et as t,F as n,I as r,K as i,N as a,P as o,R as s,T as c,Tt as l,X as u,a as d,at as f,ft as p,gt as m,ht as h,i as g,it as _,j as v,lt as y,ot as b,r as x,s as S,ut as C,yt as w}from"../chunks/CxKeDCcw.js";import{t as T}from"../chunks/uBIymjUX.js";import"../chunks/xihTtKlq.js";var E={},D=r(`
                `),O=r(` `,1);function k(r,g){t(g,!0);let T=d(g,`components`,23,()=>[]),E=d(g,`data_0`,3,null),k=d(g,`data_1`,3,null),A=d(g,`data_2`,3,null);b(()=>g.stores.page.set(g.page)),f(()=>{g.stores,g.page,g.constructors,T(),g.form,E(),k(),A(),g.stores.page.notify()});let j=m(!1),M=m(!1),N=m(null);x(()=>{let e=g.stores.page.subscribe(()=>{i(j)&&(h(M,!0),u().then(()=>{h(N,document.title||`untitled page`,!0)}))});return h(j,!0),e});let P=w(()=>g.constructors[2]);var F=O(),I=C(F),L=e=>{let t=w(()=>g.constructors[0]);var r=n(),a=C(r);c(a,()=>i(t),(e,t)=>{S(t(e,{get data(){return E()},get form(){return g.form},get params(){return g.page.params},children:(e,t)=>{var r=n(),a=C(r),s=e=>{let t=w(()=>g.constructors[1]);var r=n(),a=C(r);c(a,()=>i(t),(e,t)=>{S(t(e,{get data(){return k()},get form(){return g.form},get params(){return g.page.params},children:(e,t)=>{var r=n(),a=C(r);c(a,()=>i(P),(e,t)=>{S(t(e,{get data(){return A()},get form(){return g.form},get params(){return g.page.params}}),e=>T()[2]=e,()=>T()?.[2])}),o(e,r)},$$slots:{default:!0}}),e=>T()[1]=e,()=>T()?.[1])}),o(e,r)},l=e=>{let t=w(()=>g.constructors[1]);var r=n(),a=C(r);c(a,()=>i(t),(e,t)=>{S(t(e,{get data(){return k()},get form(){return g.form},get params(){return g.page.params}}),e=>T()[1]=e,()=>T()?.[1])}),o(e,r)};v(a,e=>{g.constructors[2]?e(s):e(l,-1)}),o(e,r)},$$slots:{default:!0}}),e=>T()[0]=e,()=>T()?.[0])}),o(e,r)},R=e=>{let t=w(()=>g.constructors[0]);var r=n(),a=C(r);c(a,()=>i(t),(e,t)=>{S(t(e,{get data(){return E()},get form(){return g.form},get params(){return g.page.params}}),e=>T()[0]=e,()=>T()?.[0])}),o(e,r)};v(I,e=>{g.constructors[1]?e(L):e(R,-1)});var z=p(I,2),B=t=>{var n=D(),r=y(n),c=e=>{var t=s();_(()=>a(t,i(N))),o(e,t)};v(r,e=>{i(M)&&e(c)}),e(n),o(t,n)};v(z,e=>{i(j)&&e(B)}),o(r,F),l()}var A=g(k),j=[()=>T(()=>import(`../nodes/0.Bvsap0NR.js`),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9]),import.meta.url),()=>T(()=>import(`../nodes/1.CvWNubFT.js`),__vite__mapDeps([10,2,1,5,11,3,4]),import.meta.url),()=>T(()=>import(`../nodes/2.cjG1hDc1.js`),__vite__mapDeps([12,1,2,3,4,5,6,8,11,13,14]),import.meta.url),()=>T(()=>import(`../nodes/3.C7DN7NOx.js`),__vite__mapDeps([15,1,2,16,5,17]),import.meta.url),()=>T(()=>import(`../nodes/4.DqOhk8S8.js`),__vite__mapDeps([18,2,1,5,17,19,3,4,16,6,8,7,13,14,20,21,22,23,24,25,26,27,28,29,30]),import.meta.url),()=>T(()=>import(`../nodes/5.DcgOcgA7.js`),__vite__mapDeps([31,2,1,5,19,3,4,16,6,8,7,13,14,17,20,21,22,23,24,25,26,27,28,29,30]),import.meta.url),()=>T(()=>import(`../nodes/6.D1H8DGKr.js`),__vite__mapDeps([32,1,4,13]),import.meta.url),()=>T(()=>import(`../nodes/7.DMByM9ti.js`),__vite__mapDeps([33,1,2,5,8,7,14,28,34]),import.meta.url),()=>T(()=>import(`../nodes/8.BWm139W5.js`),__vite__mapDeps([35,1,2,5,8,7,14,24,25,28,29,34]),import.meta.url),()=>T(()=>import(`../nodes/9.BXnh5nE4.js`),__vite__mapDeps([36,1,2,5,21,8,25,29]),import.meta.url),()=>T(()=>import(`../nodes/10.C0wr3ez6.js`),__vite__mapDeps([37,1,2,3,4,5,6,8,14,29]),import.meta.url),()=>T(()=>import(`../nodes/11.C5MPc9e3.js`),__vite__mapDeps([38,2,1,5,19,3,4,16,6,8,7,13,14,17,20,21,22,23,24,25,26,27,28,29,30]),import.meta.url),()=>T(()=>import(`../nodes/12.DPB6t2A_.js`),__vite__mapDeps([39,1,2,5,8,7,20,21,22,23,24,25,29,40]),import.meta.url),()=>T(()=>import(`../nodes/13.C1uuW6Zz.js`),__vite__mapDeps([41,1,2,5,8,7,20,21,22,24,26,27,29,42]),import.meta.url)],M=[],N={"/":[3],"/app":[4],"/app/[workspaceID]":[5],"/app/[workspaceID]/(settings)/settings":[6,[2]],"/app/[workspaceID]/(settings)/settings/bots":[7,[2]],"/app/[workspaceID]/(settings)/settings/integrations":[8,[2]],"/app/[workspaceID]/(settings)/settings/members":[9,[2]],"/app/[workspaceID]/(settings)/settings/overview":[10,[2]],"/app/[workspaceID]/[targetID]":[11],"/embed/channel/[workspaceID]/[channelID]":[12],"/embed/thread/[workspaceID]/[messageID]":[13]},P={handleError:(({error:e})=>{console.error(e)}),reroute:(()=>{}),transport:{}},F=Object.fromEntries(Object.entries(P.transport).map(([e,t])=>[e,t.decode])),I=Object.fromEntries(Object.entries(P.transport).map(([e,t])=>[e,t.encode])),L=!1,R=(e,t)=>F[e](t),z=()=>T(()=>import(`../chunks/Bjy-W4x2.js`).then(e=>e.default),[],import.meta.url);export{R as decode,F as decoders,N as dictionary,I as encoders,z as get_error_template,L as hash,P as hooks,E as matchers,j as nodes,A as root,M as server_loads}; \ No newline at end of file diff --git a/apps/api/internal/webassets/dist/_app/immutable/nodes/0.BFZe630_.js b/apps/api/internal/webassets/dist/_app/immutable/nodes/0.Bvsap0NR.js similarity index 100% rename from apps/api/internal/webassets/dist/_app/immutable/nodes/0.BFZe630_.js rename to apps/api/internal/webassets/dist/_app/immutable/nodes/0.Bvsap0NR.js diff --git a/apps/api/internal/webassets/dist/_app/immutable/nodes/11.DjDAoGTk.js b/apps/api/internal/webassets/dist/_app/immutable/nodes/11.C5MPc9e3.js similarity index 77% rename from apps/api/internal/webassets/dist/_app/immutable/nodes/11.DjDAoGTk.js rename to apps/api/internal/webassets/dist/_app/immutable/nodes/11.C5MPc9e3.js index 9566f5506..3dbf0302a 100644 --- a/apps/api/internal/webassets/dist/_app/immutable/nodes/11.DjDAoGTk.js +++ b/apps/api/internal/webassets/dist/_app/immutable/nodes/11.C5MPc9e3.js @@ -1 +1 @@ -import{Et as e,Tt as t}from"../chunks/CxKeDCcw.js";import"../chunks/xihTtKlq.js";import{t as n}from"../chunks/TM-oTWC2.js";function r(r,i){e(i,!0),n(r,{get routeWorkspaceID(){return i.params.workspaceID},get routeTargetID(){return i.params.targetID}}),t()}export{r as component}; \ No newline at end of file +import{Et as e,Tt as t}from"../chunks/CxKeDCcw.js";import"../chunks/xihTtKlq.js";import{t as n}from"../chunks/2-3ayDfx.js";function r(r,i){e(i,!0),n(r,{get routeWorkspaceID(){return i.params.workspaceID},get routeTargetID(){return i.params.targetID}}),t()}export{r as component}; \ No newline at end of file diff --git a/apps/api/internal/webassets/dist/_app/immutable/nodes/12.B6Gmd9sk.js b/apps/api/internal/webassets/dist/_app/immutable/nodes/12.DPB6t2A_.js similarity index 94% rename from apps/api/internal/webassets/dist/_app/immutable/nodes/12.B6Gmd9sk.js rename to apps/api/internal/webassets/dist/_app/immutable/nodes/12.DPB6t2A_.js index 3da374061..e19dac73d 100644 --- a/apps/api/internal/webassets/dist/_app/immutable/nodes/12.B6Gmd9sk.js +++ b/apps/api/internal/webassets/dist/_app/immutable/nodes/12.DPB6t2A_.js @@ -1 +1 @@ -import{t as e}from"../chunks/DK3Fl9T5.js";import{A as t,At as n,B as r,C as i,Et as a,F as o,I as s,K as c,N as l,P as u,Q as ee,S as te,Tt as d,V as ne,X as f,dt as p,ft as m,gt as h,ht as g,it as _,j as v,kt as re,lt as y,n as ie,pt as ae,r as oe,st as se,ut as ce,yt as b,z as x}from"../chunks/CxKeDCcw.js";import"../chunks/xihTtKlq.js";import{i as le,n as S,t as C,u as w}from"../chunks/DEPNME54.js";import{d as ue}from"../chunks/Dqjw8vaP.js";import{D as de,E as fe,R as pe,T as me,f as he,j as ge,p as _e,w as ve,x as ye}from"../chunks/BqBbEnKW.js";import{i as be,n as xe,t as Se}from"../chunks/CyT438p0.js";import{t as Ce}from"../chunks/DlGnnCJo.js";import{r as we,t as Te}from"../chunks/BIhzYFGW.js";var T=e({prerender:()=>!1,ssr:()=>!1}),Ee=s(``),De=s(`Archived`),Oe=s(`

                `),ke=s(`

                `),Ae=s(`

                Sign in to ClickClack

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

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

                `),ke=s(`

                `),Ae=s(`

                Sign in to ClickClack

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

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

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

                Sign in to ClickClack

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

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

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

                Sign in to ClickClack

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

                Open ClickClack
                `),Ce=c(`
                `),we=c(`
                `),Te=c(`
                `),Ee=c(`
                `),De=c(` `,1);function k(e,n){o(n,!0);let s=g(`loading`),c=g(``),C=g(null),O=new le(()=>l(C)?.id||``),k=new ce(je),A=g(null),j=new he(()=>`${n.workspaceRouteID}:${n.messageRouteID}`,Fe),M=S(()=>j.root),N=S(()=>j.replies),P=S(()=>j.state),F=g(null),I=g(`Thread`),Oe=S(()=>j.draft?.body??``),L=S(()=>j.draft?.quote??null),R=g(null),z=S(()=>j.draft?.error||j.error||l(B)),B=g(``),V=S(()=>j.draft?.sending??!1),H=g(null),U=null,W=0,G=!1,K=g(ne([])),q=0,J=null,Y=g(``),X=S(()=>l(V)||!!(l(F)&&!l(F).can_send)),ke=S(()=>{let e=new Map;for(let t of l(K))t.id&&!t.deleted_at&&e.set(t.id,t);for(let t of l(F)?.members??[])t.id&&t.handle?.trim()&&!t.deleted_at&&e.set(t.id,t);for(let t of l(M)?[l(M),...l(N)]:l(N))t.author?.id&&t.author.handle?.trim()&&!t.author.deleted_at&&e.set(t.author.id,t.author);return l(C)?.id&&e.set(l(C).id,l(C)),[...e.values()]});async function Ae(e){let t=++q;J?.abort();let n=new AbortController;J=n,_(Y,``),_(K,[],!0);try{let r=await ve({workspaceID:e,limit:100,signal:n.signal});t===q&&_(K,r.map(e=>e.user),!0)}catch(e){!n.signal.aborted&&t===q&&(_(K,[],!0),_(Y,_e(e),!0))}}async function je(e,t){let n=j.selection,r=()=>e===l(A)?.target_id&&j.isCurrent(n)&&k.session(e)?.generation===t.generation;if(r()&&await j.target({messageID:t.messageID,threadSeq:t.threadSeq},r))for(let e=0;e<4;e+=1){if(await p(),!r())return;let e=document.querySelector(`[aria-label="Embedded thread"]`)?.querySelector(`[data-message-id="${CSS.escape(t.messageID)}"]`)?.querySelector(`textarea[aria-label="Edit message"]`);if(e){e.focus({preventScroll:!0});return}}}function Me(e){j.updateMessage(e)}function Ne(){q+=1,J?.abort(),U?.close(),U=null,_(A,null),j.close(),O.clear(),k.clear(),_(F,null),_(H,null)}function Z(e){if(Ne(),e instanceof D){_(s,`forbidden`);return}if(e instanceof T){if(e.status===401){_(s,`auth`);return}if(e.status===403){_(s,`forbidden`);return}if(e.status===404){_(s,`not-found`);return}}_(c,E(e,`Could not load this thread.`),!0),_(s,`error`)}async function Pe(e,t){if(e.parent_type===`direct`){let n=(await w(`/api/dms?workspace_id=${encodeURIComponent(e.workspace_id)}`)).conversations.find(t=>t.id===e.parent_id);n||=(await w(`/api/dms/${encodeURIComponent(e.parent_id)}`)).conversation,_(F,n,!0),_(I,pe(n,t.id)||`Direct message`,!0);return}let n=(await w(`/api/workspaces/${encodeURIComponent(e.workspace_id)}/channels`)).channels.find(t=>t.id===e.parent_id);if(!n)throw new T(404,`Thread channel not found`);_(F,null),_(I,`#${me(n)}`)}async function Q(){if(G)return;G=!0;let e=++W;l(s)!==`auth`&&_(s,`loading`),_(c,``);try{let t=await oe(),r=await w(`/api/routes/${encodeURIComponent(n.workspaceRouteID)}/${encodeURIComponent(n.messageRouteID)}`);if(r.route.target_type!==`thread`)throw new T(404,`Thread route not found`);if(e!==W)return;j.select(r.route.target_id);let[i]=await Promise.all([j.open(()=>e===W),Pe(r.route,t.user)]);if(!i||e!==W||!j.root)return;_(C,t.user,!0),_(A,r.route,!0),Ae(r.route.workspace_id),_(s,`ready`),ze(r.route.workspace_id)}catch(t){e===W&&Z(t)}finally{e===W&&(G=!1)}}function Fe(e=[]){l(M)&&(O.seedMessages(e),k.reconcile(l(A)?.target_id||l(M).id,[l(M),...l(N)]))}function Ie(e){if(!l(M))return!1;if(e.payload.root_message_id)return e.payload.root_message_id===l(M).id;let t=e.payload.message_id;return t===l(M).id||l(N).some(e=>e.id===t)}async function Le(e,t){if(Ie(e)&&(e.type===`reaction.added`||e.type===`reaction.removed`)){O.applyEvent(e);return}await j.handleEvent(e,t)}function Re(e){if(l(s)===`ready`){if(e instanceof D||e instanceof T&&[401,403,404].includes(e.status)){Z(e);return}_(B,E(e,`Could not process a realtime update.`),!0)}}function ze(e){U?.close(),U=se({workspaceID:e,onEvent:Le,onOpen:async(e,t)=>{t&&(O.clear(),await j.refresh(e)),e()&&_(B,``)},onError:Re})}async function Be(){l(X)||await j.send(e=>{e instanceof T&&e.status===401&&Z(e)})}function Ve(e){if(e.key===`Escape`&&l(L)){e.preventDefault(),j.setQuote(null);return}e.key===`Enter`&&!e.shiftKey&&(e.preventDefault(),Be())}function He(e){l(V)||(j.setQuote(e),p().then(()=>l(R)?.focus()))}function Ue(){l(V)||j.setQuote(null)}function We(e){e.quoted_message_id&&j.target({messageID:e.quoted_message_id})}function Ge(e){let t=e.target;!(t instanceof HTMLImageElement)||!t.closest(`.markdown`)||(e.preventDefault(),_(H,{url:fe(t),title:t.alt||`Image`},!0))}function Ke(e){let t=window.open(ae(`/api/uploads/${e.id}`),`_blank`,`noopener,noreferrer`);t&&(t.opener=null)}function $(){l(s)===`auth`&&document.visibilityState===`visible`&&Q()}re(()=>{Q(),window.addEventListener(`focus`,$),document.addEventListener(`visibilitychange`,$)}),te(()=>{W+=1,q+=1,J?.abort(),U?.close(),window.removeEventListener(`focus`,$),document.removeEventListener(`visibilitychange`,$)});var qe=De();a(`b3w79y`,e=>{var n=ye();t(()=>{ie.title=`ClickClack thread`}),d(e,n)});var Je=x(qe),Ye=e=>{var t=xe(),n=b(t),i=b(n);{let e=S(()=>`Thread · ${l(P)?.reply_count??l(N).length} ${(l(P)?.reply_count??l(N).length)===1?`reply`:`replies`}`),t=S(()=>l(C)?.id),n=S(()=>!!(l(F)&&!l(F).can_send));ge(i,{get history(){return j},get root(){return l(M)},get replies(){return l(N)},get threadState(){return l(P)},get replyBody(){return l(Oe)},get replyTarget(){return l(L)},get mentionPeople(){return l(ke)},get replyDisabled(){return l(X)},get headerLabel(){return l(I)},get headerDetail(){return l(e)},get openHref(){return l(A).canonical_path},get currentUserID(){return l(t)},get reactionController(){return O},get editController(){return k},get editScope(){return l(A).target_id},onMessageEdited:Me,get reactionsDisabled(){return l(n)},onReplyBody:e=>j.updateDraft(e),onSubmitReply:()=>void Be(),onReplyKeydown:Ve,onReplyFocus:()=>{},onReplyInputRef:e=>_(R,e,!0),onSetReplyTarget:e=>He(e),onClearReply:Ue,onActivateThreadComposer:()=>{},onInlineImagePointerUp:Ge,onJumpToQuote:We,onOpenImage:(e,t)=>_(H,{url:e,title:t},!0),onOpenArtifact:Ke})}r(n);var a=h(n,2),o=e=>{var t=be(),n=m(t);v(()=>u(n,`Mentions unavailable: ${l(Y)??``}`)),d(e,t)};y(a,e=>{l(Y)&&e(o)});var s=h(a,2),c=e=>{var t=be(),n=m(t,!0);v(()=>u(n,l(z))),d(e,t)};y(s,e=>{l(z)&&e(c)}),r(t),d(e,t)},Xe=e=>{var t=Se(),n=b(t),i=b(n);de(i,{class:`embed-mark`,size:42}),ee(6),r(n),r(t),d(e,t)},Ze=e=>{var t=Ce();d(e,t)},Qe=e=>{var t=we();d(e,t)},$e=e=>{var t=Te(),n=b(t),a=h(b(n),2),o=m(a,!0),s=h(a,2);r(n),r(t),v(()=>u(o,l(c))),i(`click`,s,()=>void Q()),d(e,t)},et=e=>{var t=Ee();d(e,t)};y(Je,e=>{l(s)===`ready`&&l(M)&&l(A)?e(Ye):l(s)===`auth`?e(Xe,1):l(s)===`forbidden`?e(Ze,2):l(s)===`not-found`?e(Qe,3):l(s)===`error`?e($e,4):e(et,-1)});var tt=h(Je,2),nt=e=>{ue(e,{get url(){return l(H).url},get title(){return l(H).title},onClose:()=>_(H,null)})};y(tt,e=>{l(H)&&e(nt)}),d(e,qe),f()}C([`click`]);function A(e,t){o(t,!0);var r=s(),i=x(r);n(i,()=>`${t.params.workspaceID}:${t.params.messageID}`,e=>{k(e,{get workspaceRouteID(){return t.params.workspaceID},get messageRouteID(){return t.params.messageID}})}),d(e,r),f()}export{A as component,O as universal}; \ No newline at end of file diff --git a/apps/api/internal/webassets/dist/_app/immutable/nodes/3.B10d8uq2.js b/apps/api/internal/webassets/dist/_app/immutable/nodes/3.C7DN7NOx.js similarity index 60% rename from apps/api/internal/webassets/dist/_app/immutable/nodes/3.B10d8uq2.js rename to apps/api/internal/webassets/dist/_app/immutable/nodes/3.C7DN7NOx.js index 8004fe618..ba7583402 100644 --- a/apps/api/internal/webassets/dist/_app/immutable/nodes/3.B10d8uq2.js +++ b/apps/api/internal/webassets/dist/_app/immutable/nodes/3.C7DN7NOx.js @@ -1,2 +1,2 @@ -const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["../chunks/TM-oTWC2.js","../chunks/DK3Fl9T5.js","../chunks/CxKeDCcw.js","../chunks/ChC1oWd7.js","../chunks/Dt-HX3Vu.js","../chunks/uBIymjUX.js","../chunks/xihTtKlq.js","../chunks/qQG-ipvL.js","../chunks/DEPNME54.js","../chunks/Dqjw8vaP.js","../chunks/Qo16U5GS.js","../chunks/OQjxVT6U.js","../chunks/CYM1xkwL.js","../chunks/BqBbEnKW.js","../chunks/C7NZ0SeM.js","../assets/QuoteBlock.Bmfc9wvU.css","../chunks/CyT438p0.js","../chunks/DlGnnCJo.js","../chunks/BVPazc3H.js","../chunks/Cht-DoaS.js","../assets/ThreadPanel.DFXp9CyT.css","../chunks/CVdgRPye.js","../chunks/BIhzYFGW.js","../assets/ChatApp.BrxGlI__.css","../chunks/D3xoa4tU.js","../assets/ProductSite.BGg6Zt1K.css"])))=>i.map(i=>d[i]); -import{t as e}from"../chunks/DK3Fl9T5.js";import{F as t,K as n,M as r,P as i,ut as a,vt as o}from"../chunks/CxKeDCcw.js";import{t as s}from"../chunks/uBIymjUX.js";import"../chunks/xihTtKlq.js";import"../chunks/CYM1xkwL.js";var c=e({prerender:()=>!0});function l(e){let c=window.location.hostname.startsWith(`app.`)?s(()=>import(`../chunks/TM-oTWC2.js`).then(e=>e.n),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23]),import.meta.url):s(()=>import(`../chunks/D3xoa4tU.js`),__vite__mapDeps([24,2,1,6,12,25]),import.meta.url);var l=t(),u=a(l);r(u,()=>c,null,(e,t)=>{let r=o(()=>n(t).default);n(r)(e,{})}),i(e,l)}export{l as component,c as universal}; \ No newline at end of file +const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["../chunks/2-3ayDfx.js","../chunks/DK3Fl9T5.js","../chunks/CxKeDCcw.js","../chunks/ChC1oWd7.js","../chunks/Dt-HX3Vu.js","../chunks/uBIymjUX.js","../chunks/xihTtKlq.js","../chunks/qQG-ipvL.js","../chunks/DEPNME54.js","../chunks/Dqjw8vaP.js","../chunks/Qo16U5GS.js","../chunks/OQjxVT6U.js","../chunks/CYM1xkwL.js","../chunks/CdcQtYSQ.js","../chunks/C7NZ0SeM.js","../assets/QuestionCard.Bmfc9wvU.css","../chunks/BmuvpQ2l.js","../chunks/DlGnnCJo.js","../chunks/BVPazc3H.js","../chunks/6VrLJ6am.js","../assets/ThreadPanel.DFXp9CyT.css","../chunks/CVdgRPye.js","../chunks/BIhzYFGW.js","../assets/ChatApp.BrxGlI__.css","../chunks/D3xoa4tU.js","../assets/ProductSite.BGg6Zt1K.css"])))=>i.map(i=>d[i]); +import{t as e}from"../chunks/DK3Fl9T5.js";import{F as t,K as n,M as r,P as i,ut as a,vt as o}from"../chunks/CxKeDCcw.js";import{t as s}from"../chunks/uBIymjUX.js";import"../chunks/xihTtKlq.js";import"../chunks/CYM1xkwL.js";var c=e({prerender:()=>!0});function l(e){let c=window.location.hostname.startsWith(`app.`)?s(()=>import(`../chunks/2-3ayDfx.js`).then(e=>e.n),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23]),import.meta.url):s(()=>import(`../chunks/D3xoa4tU.js`),__vite__mapDeps([24,2,1,6,12,25]),import.meta.url);var l=t(),u=a(l);r(u,()=>c,null,(e,t)=>{let r=o(()=>n(t).default);n(r)(e,{})}),i(e,l)}export{l as component,c as universal}; \ No newline at end of file diff --git a/apps/api/internal/webassets/dist/_app/immutable/nodes/4.COOlYmhK.js b/apps/api/internal/webassets/dist/_app/immutable/nodes/4.DqOhk8S8.js similarity index 63% rename from apps/api/internal/webassets/dist/_app/immutable/nodes/4.COOlYmhK.js rename to apps/api/internal/webassets/dist/_app/immutable/nodes/4.DqOhk8S8.js index b30178ac8..f123944c4 100644 --- a/apps/api/internal/webassets/dist/_app/immutable/nodes/4.COOlYmhK.js +++ b/apps/api/internal/webassets/dist/_app/immutable/nodes/4.DqOhk8S8.js @@ -1 +1 @@ -import"../chunks/CxKeDCcw.js";import"../chunks/xihTtKlq.js";import"../chunks/CYM1xkwL.js";import{t as e}from"../chunks/TM-oTWC2.js";function t(t){e(t,{})}export{t as component}; \ No newline at end of file +import"../chunks/CxKeDCcw.js";import"../chunks/xihTtKlq.js";import"../chunks/CYM1xkwL.js";import{t as e}from"../chunks/2-3ayDfx.js";function t(t){e(t,{})}export{t as component}; \ No newline at end of file diff --git a/apps/api/internal/webassets/dist/_app/immutable/nodes/5.BdROoItM.js b/apps/api/internal/webassets/dist/_app/immutable/nodes/5.DcgOcgA7.js similarity index 72% rename from apps/api/internal/webassets/dist/_app/immutable/nodes/5.BdROoItM.js rename to apps/api/internal/webassets/dist/_app/immutable/nodes/5.DcgOcgA7.js index 512350d62..a648b3e39 100644 --- a/apps/api/internal/webassets/dist/_app/immutable/nodes/5.BdROoItM.js +++ b/apps/api/internal/webassets/dist/_app/immutable/nodes/5.DcgOcgA7.js @@ -1 +1 @@ -import{Et as e,Tt as t}from"../chunks/CxKeDCcw.js";import"../chunks/xihTtKlq.js";import{t as n}from"../chunks/TM-oTWC2.js";function r(r,i){e(i,!0),n(r,{get routeWorkspaceID(){return i.params.workspaceID}}),t()}export{r as component}; \ No newline at end of file +import{Et as e,Tt as t}from"../chunks/CxKeDCcw.js";import"../chunks/xihTtKlq.js";import{t as n}from"../chunks/2-3ayDfx.js";function r(r,i){e(i,!0),n(r,{get routeWorkspaceID(){return i.params.workspaceID}}),t()}export{r as component}; \ No newline at end of file diff --git a/apps/api/internal/webassets/dist/index.html b/apps/api/internal/webassets/dist/index.html index 86c9a83e9..ea1817d57 100644 --- a/apps/api/internal/webassets/dist/index.html +++ b/apps/api/internal/webassets/dist/index.html @@ -103,17 +103,17 @@ - + - + - + - + @@ -128,7 +128,7 @@ Promise.all([ import("./_app/immutable/entry/start.W_KKVBz4.js"), - import("./_app/immutable/entry/app.CqYZBsX3.js") + import("./_app/immutable/entry/app.Bp9-ZlMx.js") ]).then(([kit, app]) => { kit.start(app, element); }); diff --git a/apps/web/src/components/messages/MessageList.svelte b/apps/web/src/components/messages/MessageList.svelte index 15fbc0e08..2bfc0c758 100644 --- a/apps/web/src/components/messages/MessageList.svelte +++ b/apps/web/src/components/messages/MessageList.svelte @@ -302,13 +302,20 @@ .filter(Boolean) .join("\u0002"), ); + // Question cards resize when their status changes; a reopened card grows in place. + let questionLayoutRevision = $derived.by(() => + messages + .map((message) => (message.question ? `${message.id}\u0000${message.question.version}` : "")) + .filter(Boolean) + .join("\u0002"), + ); // Reactive mirror for the FAB visibility only. Never gates programmatic scroll. let atBottom = $state(true); let revealed = $state(false); let lastViewKey: string | undefined; let lastItemCount = 0; let lastMessageID = ""; - let lastPreambleLayoutRevision = ""; + let lastLayoutRevision = ""; let lastRestoreState: MessageListState | undefined; // A proxied snapshot keeps its identity when a parent stores it in $state. let capturedScrollState = $state(); @@ -669,7 +676,7 @@ $effect(() => { const key = viewKey; const count = items.length; - const layoutRevision = preambleLayoutRevision; + const layoutRevision = `${preambleLayoutRevision}\u0003${questionLayoutRevision}`; // Ordinary messages can grow an existing group without adding a virtual item. const newestMessageID = messages.at(-1)?.id || ""; const newestMessageChanged = newestMessageID !== lastMessageID; @@ -678,7 +685,7 @@ if (key !== lastViewKey) { lastViewKey = key; lastItemCount = count; - lastPreambleLayoutRevision = layoutRevision; + lastLayoutRevision = layoutRevision; lastRestoreState = restoreState; capturedScrollState = undefined; shouldStickToBottom = true; @@ -699,7 +706,7 @@ lastRestoreState = target; if (!interrupted && (target.atBottom || target.anchorMessageID)) { lastItemCount = count; - lastPreambleLayoutRevision = layoutRevision; + lastLayoutRevision = layoutRevision; pendingRestore = true; void runRestore(key, target, target.atBottom); return; @@ -710,14 +717,14 @@ } const dataChanged = - restoreChanged || count !== lastItemCount || newestMessageChanged || layoutRevision !== lastPreambleLayoutRevision; + restoreChanged || count !== lastItemCount || newestMessageChanged || layoutRevision !== lastLayoutRevision; if (dataChanged && shouldStickToBottom && !hasNewer && !pendingRestore) { void scrollLastItemIntoView(); } else if (dataChanged && !pendingRestore) { void emitSettledAfterFrames(key); } lastItemCount = count; - lastPreambleLayoutRevision = layoutRevision; + lastLayoutRevision = layoutRevision; }); async function emitSettledAfterFrames(key: string, generation = scrollCommandGeneration) { diff --git a/apps/web/src/components/messages/MessageRow.svelte b/apps/web/src/components/messages/MessageRow.svelte index 51e8e6f7e..88f24681d 100644 --- a/apps/web/src/components/messages/MessageRow.svelte +++ b/apps/web/src/components/messages/MessageRow.svelte @@ -18,6 +18,7 @@ import MessageEditor from "./MessageEditor.svelte"; import QuoteBlock from "./QuoteBlock.svelte"; import PreambleBlock from "./PreambleBlock.svelte"; + import QuestionCard from "./QuestionCard.svelte"; import TopicBadge from "./TopicBadge.svelte"; type Props = { @@ -655,11 +656,17 @@ {:else} -
                {@html markdown(message.body)}
                + {#if message.question} + {#key `${message.id}:${message.question.version}`} + + {/key} + {:else} +
                {@html markdown(message.body)}
                + {/if} {#if message.edited_at} (edited) {/if} diff --git a/apps/web/src/components/messages/QuestionCard.svelte b/apps/web/src/components/messages/QuestionCard.svelte new file mode 100644 index 000000000..4a70dfc88 --- /dev/null +++ b/apps/web/src/components/messages/QuestionCard.svelte @@ -0,0 +1,334 @@ + + +
                +
                + + {#if headline.tone === "open" || headline.tone === "waiting"}{/if} + {headline.label} + + {#if view.status === "open"} + {#if shown.items.length > 1}{shown.items.length} questions{/if} + + {countdown.label} + + {:else if view.response?.responder} + by {view.response.responder.display_name} + {/if} +
                + + {#if shown.title && view.status === "open"} +

                {shown.title}

                + {/if} + {#if view.note && view.status === "open"} + +

                {view.note}

                + {/if} + + {#if view.status === "open"} + {#each shown.items as item, itemIndex (item.id)} + {@const entry = draft[item.id]} + {@const answered = questionItemAnswers(item, entry).length > 0} +
                +
                + {#if shown.items.length > 1}{/if} + {item.header} + {#if item.multi_select}Choose any{/if} +
                +
                {@html markdown(item.prompt)}
                + {#if (item.options?.length ?? 0) > 0} + +
                handleItemKeydown(event, item)} + > + {#each item.options ?? [] as option, optionIndex (option.label)} + {@const selected = entry?.selected.includes(option.label) ?? false} + + {/each} + {#if item.allow_other && !quick} + {#if entry?.otherOpen} + + {:else} + + {/if} + {/if} +
                + {:else} + updateDraft(setQuestionOther(draft, item, event.currentTarget.value))} + onkeydown={(event) => { + if (event.key === "Enter" && !event.isComposing) { + event.preventDefault(); + submitForm(); + } + }} + /> + {/if} + {#if item.url} + Open link ↗ + {/if} +
                + {/each} + + {#if !answerable} +

                + {#if !currentUserID} + Sign in to answer this question. + {:else} + Only {responderNames.join(", ")} can answer this question. + {/if} +

                + {/if} + + {#if error} + + {/if} + + {#if answerable} +
                + {#if quick} + {pending ? `Sending "${pending}"...` : "Tap an answer or press its number"} + {:else} + + {/if} + {#if shown.allow_skip} + + {/if} + {#if !quick && shown.items.length > 1} + + {#each shown.items as item (item.id)} + 0}> + {/each} + + {/if} + {#if responderNames.length > 0} + Only {responderNames.join(", ")} can answer + {/if} +
                + {/if} + {:else} + {#if summary.length > 0} +
                + {#each summary as line (line.id)} +
                {line.header}
                +
                + {#each line.values as value (value.text)} + {value.typed ? `"${value.text}"` : value.text} + {/each} +
                + {/each} +
                + {:else if view.status === "expired"} +

                No answer before {new Date(shown.expires_at).toLocaleTimeString([], { hour: "numeric", minute: "2-digit" })}.

                + {/if} + {#if view.note} +

                {view.note}

                + {/if} + {/if} +
                diff --git a/apps/web/src/components/thread/ThreadPanel.svelte b/apps/web/src/components/thread/ThreadPanel.svelte index 894c51744..b1964c732 100644 --- a/apps/web/src/components/thread/ThreadPanel.svelte +++ b/apps/web/src/components/thread/ThreadPanel.svelte @@ -19,6 +19,7 @@ import ChatComposer from "../composer/ChatComposer.svelte"; import MediaAttachment from "../MediaAttachment.svelte"; import MessageEditor from "../messages/MessageEditor.svelte"; + import QuestionCard from "../messages/QuestionCard.svelte"; import QuoteBlock from "../messages/QuoteBlock.svelte"; import ReactionsBar from "../messages/ReactionsBar.svelte"; import AddReactionButton from "../messages/AddReactionButton.svelte"; @@ -686,11 +687,17 @@ onSave={() => saveEdit(root)} /> {:else} -
                {@html markdown(root.body)}
                + {#if root.question} + {#key `${root.id}:${root.question.version}`} + + {/key} + {:else} +
                {@html markdown(root.body)}
                + {/if} {#if root.edited_at} (edited) {/if} @@ -850,11 +857,17 @@ /> {:else} -
                {@html markdown(reply.body)}
                + {#if reply.question} + {#key `${reply.id}:${reply.question.version}`} + + {/key} + {:else} +
                {@html markdown(reply.body)}
                + {/if} {#if reply.edited_at} (edited) {/if} diff --git a/apps/web/src/lib/chat/typeToFocus.ts b/apps/web/src/lib/chat/typeToFocus.ts index 68e8531a7..84f69aa11 100644 --- a/apps/web/src/lib/chat/typeToFocus.ts +++ b/apps/web/src/lib/chat/typeToFocus.ts @@ -92,6 +92,12 @@ function isChatSurfaceAction(el: HTMLElement): boolean { return role === "button" || role === "link"; } +// Numbered choices inside messages keep their digits; other typing still reaches the composer. +function claimsShortcutKey(el: HTMLElement | null, key: string): boolean { + const owner = el?.closest("[data-shortcut-keys]"); + return owner?.dataset.shortcutKeys?.split(" ").includes(key) ?? false; +} + function hasMessageTextSelection(): boolean { const sel = typeof window !== "undefined" ? window.getSelection() : null; if (!sel || sel.isCollapsed || sel.rangeCount === 0) return false; @@ -112,6 +118,7 @@ function shouldRedirectKeystroke(event: KeyboardEvent, options: RedirectTypingOp const active = document.activeElement as HTMLElement | null; if (active === options.messageInput || active === options.replyInput) return false; if (isEditableElement(active)) return false; + if (claimsShortcutKey(active, event.key)) return false; if (consumesKeystrokes(active)) return false; return true; } diff --git a/apps/web/src/lib/questions.test.ts b/apps/web/src/lib/questions.test.ts new file mode 100644 index 000000000..062da03d0 --- /dev/null +++ b/apps/web/src/lib/questions.test.ts @@ -0,0 +1,167 @@ +import test from "node:test"; +import assert from "node:assert/strict"; +import { + canAnswerQuestion, + emptyQuestionDraft, + isQuickQuestion, + openQuestionOther, + questionCountdown, + questionDraftAnswers, + questionDraftComplete, + questionHeadline, + questionShortcutKeys, + questionSummary, + setQuestionOther, + toggleQuestionOption, +} from "./questions.ts"; +import type { MessageQuestion, QuestionItem } from "./types"; + +const date: QuestionItem = { + id: "ship_date", + header: "Fecha", + prompt: "¿Qué día?", + options: [{ label: "Lun 15 sep" }, { label: "Mar 16 sep" }], + allow_other: true, +}; +const boxes: QuestionItem = { id: "boxes", header: "Cajas", prompt: "¿Cuántas?" }; +const extras: QuestionItem = { + id: "extras", + header: "Extras", + prompt: "¿Algo más?", + options: [{ label: "Capuchón" }, { label: "UPC" }], + multi_select: true, +}; + +function question(overrides: Partial = {}): MessageQuestion { + return { + status: "open", + expires_at: "2026-09-12T15:15:00Z", + allow_skip: true, + items: [date, boxes, extras], + version: 1, + ...overrides, + }; +} + +test("question drafts track choices, typed answers, and completeness", () => { + const q = question(); + let draft = emptyQuestionDraft(q); + assert.equal(questionDraftComplete(q, draft), false); + draft = toggleQuestionOption(draft, date, "Lun 15 sep"); + draft = setQuestionOther(draft, boxes, " 120 "); + draft = toggleQuestionOption(draft, extras, "UPC"); + draft = toggleQuestionOption(draft, extras, "Capuchón"); + draft = toggleQuestionOption(draft, extras, "UPC"); + assert.deepEqual(questionDraftAnswers(q, draft), { + ship_date: ["Lun 15 sep"], + boxes: ["120"], + extras: ["Capuchón"], + }); + assert.equal(questionDraftComplete(q, draft), true); + + draft = openQuestionOther(draft, date); + assert.deepEqual(questionDraftAnswers(q, draft).ship_date, []); + draft = setQuestionOther(draft, date, "Jue 18 sep"); + assert.deepEqual(questionDraftAnswers(q, draft).ship_date, ["Jue 18 sep"]); + draft = toggleQuestionOption(draft, date, "Mar 16 sep"); + assert.deepEqual(questionDraftAnswers(q, draft).ship_date, ["Mar 16 sep"]); +}); + +test("typed text only counts where the item accepts it", () => { + const q = question({ items: [extras] }); + const draft = setQuestionOther(emptyQuestionDraft(q), extras, "Comida"); + assert.deepEqual(questionDraftAnswers(q, draft), { extras: [] }); +}); + +test("quick questions are one declared choice without free text", () => { + assert.equal(isQuickQuestion(question({ items: [{ ...date, allow_other: false }] })), true); + assert.equal(isQuickQuestion(question({ items: [date] })), false); + assert.equal(isQuickQuestion(question({ items: [extras] })), false); + assert.equal(isQuickQuestion(question({ items: [boxes] })), false); +}); + +test("digit shortcuts cover the options and the free-text answer up to nine", () => { + assert.equal(questionShortcutKeys(date, false), "1 2 3"); + assert.equal(questionShortcutKeys({ ...date, allow_other: false }, true), "1 2"); + assert.equal(questionShortcutKeys(boxes, false), ""); + const options = Array.from({ length: 10 }, (_, index) => ({ label: `Option ${index}` })); + assert.equal(questionShortcutKeys({ options, allow_other: true }, false), "1 2 3 4 5 6 7 8 9"); +}); + +test("only open questions for listed responders can be answered", () => { + assert.equal(canAnswerQuestion(question(), "usr_1"), true); + assert.equal(canAnswerQuestion(question({ responder_user_ids: ["usr_2"] }), "usr_1"), false); + assert.equal(canAnswerQuestion(question({ status: "submitted" }), "usr_1"), false); + assert.equal(canAnswerQuestion(question(), undefined), false); +}); + +test("questionCountdown formats minutes, hours, and days", () => { + const now = Date.parse("2026-09-12T15:00:00Z"); + assert.deepEqual(questionCountdown("2026-09-12T15:14:32Z", now), { + label: "14:32", + urgent: false, + expired: false, + }); + assert.deepEqual(questionCountdown("2026-09-12T15:01:48Z", now), { + label: "1:48", + urgent: true, + expired: false, + }); + assert.equal(questionCountdown("2026-09-12T18:30:00Z", now).label, "3 h"); + assert.equal(questionCountdown("2026-09-15T15:00:00Z", now).label, "3 d"); + assert.equal(questionCountdown("2026-09-12T14:59:00Z", now).expired, true); +}); + +test("questionHeadline names each state", () => { + const now = Date.parse("2026-09-12T15:00:00Z"); + assert.deepEqual(questionHeadline(question(), "Atlas", now), { + label: "Needs your answer", + tone: "open", + }); + assert.equal( + questionHeadline(question({ status: "submitted" }), "Atlas", now).label, + "Sent · waiting for Atlas", + ); + assert.equal( + questionHeadline( + question({ status: "submitted", expires_at: "2026-09-12T14:00:00Z" }), + "Atlas", + now, + ).label, + "Sent · not confirmed by Atlas", + ); + assert.equal( + questionHeadline( + question({ status: "answered", response: { source: "external" } }), + "Atlas", + now, + ).label, + "Answered elsewhere", + ); + assert.equal( + questionHeadline( + question({ status: "cancelled", response: { source: "clickclack", skipped: true } }), + "Atlas", + now, + ).label, + "Skipped", + ); + assert.equal(questionHeadline(question({ status: "failed" }), "Atlas", now).tone, "failed"); +}); + +test("questionSummary marks answers typed beside declared options", () => { + const summary = questionSummary( + question({ + status: "answered", + response: { + source: "clickclack", + answers: { ship_date: ["Jue 18 sep"], boxes: ["120"], extras: ["UPC"] }, + }, + }), + ); + assert.deepEqual(summary, [ + { id: "ship_date", header: "Fecha", values: [{ text: "Jue 18 sep", typed: true }] }, + { id: "boxes", header: "Cajas", values: [{ text: "120", typed: false }] }, + { id: "extras", header: "Extras", values: [{ text: "UPC", typed: false }] }, + ]); +}); diff --git a/apps/web/src/lib/questions.ts b/apps/web/src/lib/questions.ts new file mode 100644 index 000000000..a2b94a238 --- /dev/null +++ b/apps/web/src/lib/questions.ts @@ -0,0 +1,194 @@ +import type { MessageQuestion, QuestionItem } from "./types"; + +export type QuestionItemDraft = { + selected: string[]; + other: string; + otherOpen: boolean; +}; + +export type QuestionDraft = Record; + +export function emptyQuestionDraft(question: Pick): QuestionDraft { + return Object.fromEntries( + question.items.map((item) => [item.id, { selected: [], other: "", otherOpen: false }]), + ); +} + +function itemDraft(draft: QuestionDraft, item: QuestionItem): QuestionItemDraft { + return draft[item.id] ?? { selected: [], other: "", otherOpen: false }; +} + +// Choosing a declared option in a single-choice item replaces any typed answer. +export function toggleQuestionOption( + draft: QuestionDraft, + item: QuestionItem, + label: string, +): QuestionDraft { + const current = itemDraft(draft, item); + if (!item.multi_select) { + return { ...draft, [item.id]: { selected: [label], other: "", otherOpen: false } }; + } + const selected = current.selected.includes(label) + ? current.selected.filter((value) => value !== label) + : [...current.selected, label]; + return { ...draft, [item.id]: { ...current, selected } }; +} + +export function openQuestionOther(draft: QuestionDraft, item: QuestionItem): QuestionDraft { + const current = itemDraft(draft, item); + const selected = item.multi_select ? current.selected : []; + return { ...draft, [item.id]: { ...current, selected, otherOpen: true } }; +} + +export function setQuestionOther( + draft: QuestionDraft, + item: QuestionItem, + text: string, +): QuestionDraft { + const current = itemDraft(draft, item); + const selected = item.multi_select ? current.selected : []; + return { ...draft, [item.id]: { selected, other: text, otherOpen: true } }; +} + +export function questionItemAnswers( + item: QuestionItem, + entry: QuestionItemDraft | undefined, +): string[] { + if (!entry) return []; + const other = entry.other.trim(); + const acceptsText = (item.options?.length ?? 0) === 0 || item.allow_other; + return [...entry.selected, ...(acceptsText && other ? [other] : [])]; +} + +export function questionDraftAnswers( + question: Pick, + draft: QuestionDraft, +): Record { + return Object.fromEntries( + question.items.map((item) => [item.id, questionItemAnswers(item, draft[item.id])]), + ); +} + +export function questionDraftComplete( + question: Pick, + draft: QuestionDraft, +): boolean { + return question.items.every((item) => questionItemAnswers(item, draft[item.id]).length > 0); +} + +// One tap answers a single declared choice; everything else is a form. +export function isQuickQuestion(question: Pick): boolean { + const [item] = question.items; + return ( + question.items.length === 1 && + Boolean(item?.options?.length) && + !item?.multi_select && + !item?.allow_other + ); +} + +// Digits pick options in order, then open the free-text answer. +export function questionShortcutKeys( + item: Pick, + quick: boolean, +): string { + const count = (item.options?.length ?? 0) + (item.allow_other && !quick ? 1 : 0); + return Array.from({ length: Math.min(count, 9) }, (_, index) => String(index + 1)).join(" "); +} + +export function canAnswerQuestion( + question: Pick, + userID: string | undefined, +): boolean { + if (!userID || question.status !== "open") return false; + const responders = question.responder_user_ids ?? []; + return responders.length === 0 || responders.includes(userID); +} + +export type QuestionCountdown = { label: string; urgent: boolean; expired: boolean }; + +export function questionCountdown(expiresAt: string, now: number): QuestionCountdown { + const remaining = Date.parse(expiresAt) - now; + if (!Number.isFinite(remaining) || remaining <= 0) + return { label: "0:00", urgent: true, expired: true }; + const seconds = Math.ceil(remaining / 1000); + if (seconds >= 2 * 86400) + return { label: `${Math.floor(seconds / 86400)} d`, urgent: false, expired: false }; + if (seconds >= 3600) + return { label: `${Math.floor(seconds / 3600)} h`, urgent: false, expired: false }; + const minutes = Math.floor(seconds / 60); + const label = `${minutes}:${String(seconds % 60).padStart(2, "0")}`; + return { label, urgent: seconds <= 120, expired: false }; +} + +export type QuestionTone = "open" | "waiting" | "answered" | "muted" | "failed"; + +export function questionHeadline( + question: Pick, + askerName: string, + now: number, +): { label: string; tone: QuestionTone } { + const asker = askerName || "the agent"; + switch (question.status) { + case "open": + return { label: "Needs your answer", tone: "open" }; + case "submitted": + return Date.parse(question.expires_at) <= now + ? { label: `Sent · not confirmed by ${asker}`, tone: "waiting" } + : { label: `Sent · waiting for ${asker}`, tone: "waiting" }; + case "answered": + return { + label: question.response?.source === "external" ? "Answered elsewhere" : "Answered", + tone: "answered", + }; + case "cancelled": + return { label: question.response?.skipped ? "Skipped" : "Cancelled", tone: "muted" }; + case "expired": + return { label: "Expired", tone: "muted" }; + case "failed": + return { label: "Not delivered", tone: "failed" }; + } +} + +export type QuestionSummaryLine = { + id: string; + header: string; + values: { text: string; typed: boolean }[]; +}; + +export function questionSummary( + question: Pick, +): QuestionSummaryLine[] { + const answers = question.response?.answers; + if (!answers) return []; + return question.items + .filter((item) => (answers[item.id]?.length ?? 0) > 0) + .map((item) => ({ + id: item.id, + header: item.header, + values: answers[item.id].map((text) => ({ + text, + // Only answers typed beside declared options are marked; free-text items have no options. + typed: + Boolean(item.options?.length) && !item.options?.some((option) => option.label === text), + })), + })); +} + +const QUESTION_DRAFT_LIMIT = 50; +const questionDrafts = new Map(); + +// Drafts outlive virtualized rows and thread panel switches for the same question version. +export function recallQuestionDraft(key: string): QuestionDraft | undefined { + return questionDrafts.get(key); +} + +export function rememberQuestionDraft(key: string, draft: QuestionDraft) { + questionDrafts.delete(key); + questionDrafts.set(key, draft); + while (questionDrafts.size > QUESTION_DRAFT_LIMIT) { + const oldest = questionDrafts.keys().next().value; + if (oldest === undefined) break; + questionDrafts.delete(oldest); + } +} diff --git a/apps/web/src/lib/types.ts b/apps/web/src/lib/types.ts index 4804beb2e..ecaafc83c 100644 --- a/apps/web/src/lib/types.ts +++ b/apps/web/src/lib/types.ts @@ -61,6 +61,44 @@ export type Channel = { unread_count?: number; }; +export type QuestionOption = { + label: string; + description?: string; +}; + +export type QuestionItem = { + id: string; + header: string; + prompt: string; + url?: string; + options?: QuestionOption[]; + multi_select?: boolean; + allow_other?: boolean; + other_placeholder?: string; +}; + +export type QuestionStatus = "open" | "submitted" | "answered" | "cancelled" | "expired" | "failed"; + +export type MessageQuestion = { + status: QuestionStatus; + external_id?: string; + title?: string; + expires_at: string; + allow_skip: boolean; + items: QuestionItem[]; + responder_user_ids?: string[]; + response?: { + answers?: Record; + skipped?: boolean; + source: "clickclack" | "external"; + responder?: User; + responded_at?: string; + }; + note?: string; + resolved_at?: string; + version: number; +}; + export type Topic = { id: string; workspace_id: string; @@ -135,6 +173,7 @@ export type Message = { preamble_block?: PreambleBlock; author?: User; attachments?: Upload[]; + question?: MessageQuestion; quoted_message_id?: string; quoted_body_snapshot?: string; quoted_author_id?: string; diff --git a/apps/web/src/styles/messages.css b/apps/web/src/styles/messages.css index f7650b418..abd63252d 100644 --- a/apps/web/src/styles/messages.css +++ b/apps/web/src/styles/messages.css @@ -2783,3 +2783,522 @@ padding-left: 0; padding-right: 0; } + +/* ---------- AGENT QUESTIONS ---------- */ + +.question-card { + --question-rail: var(--accent); + position: relative; + display: grid; + gap: 10px; + max-width: min(660px, 100%); + margin-top: 2px; + padding: 13px 16px 13px 20px; + overflow: hidden; + border: 1px solid color-mix(in srgb, var(--question-rail) 30%, var(--line)); + border-radius: var(--radius-lg); + background: + radial-gradient(120% 120% at 0% 0%, color-mix(in srgb, var(--question-rail) 10%, transparent), transparent 52%), + var(--panel); + box-shadow: 0 18px 44px -30px color-mix(in srgb, var(--question-rail) 70%, transparent); + color: var(--text); +} + +.question-card::before { + content: ""; + position: absolute; + inset: 0 auto 0 0; + width: 4px; + background: var(--question-rail); +} + +.question-card--waiting { + --question-rail: var(--delivery-accent); +} + +.question-card--answered { + --question-rail: var(--success); +} + +.question-card--muted { + --question-rail: var(--muted-2); + box-shadow: none; +} + +.question-card--failed { + --question-rail: var(--danger); +} + +:root[data-user-align="right"] .message-group.is-self .question-card, +:root[data-other-align="right"] .message-group:not(.is-self) .question-card { + margin-left: auto; +} + +.question-card__head { + display: flex; + flex-wrap: wrap; + align-items: center; + gap: 10px; +} + +.question-eyebrow { + display: inline-flex; + align-items: center; + gap: 7px; + color: var(--question-rail); + font-family: var(--font-mono); + font-size: 10.5px; + font-weight: 700; + letter-spacing: 0.1em; + text-transform: uppercase; +} + +.question-eyebrow__dot { + width: 7px; + height: 7px; + border-radius: 50%; + background: var(--question-rail); + box-shadow: 0 0 0 3px color-mix(in srgb, var(--question-rail) 25%, transparent); +} + +.question-card--waiting .question-eyebrow__dot { + animation: preamble-live-pulse 1.6s ease-in-out infinite; +} + +@media (prefers-reduced-motion: reduce) { + .question-card--waiting .question-eyebrow__dot { + animation: none; + } +} + +.question-card__meta, +.question-card__hint, +.question-card__note, +.question-card__detail, +.question-item__hint { + color: var(--muted); + font-size: 12.5px; +} + +.question-card__detail { + margin: 0; +} + +.question-card__note { + margin-left: auto; +} + +.question-timer { + display: inline-flex; + align-items: center; + gap: 6px; + margin-left: auto; + padding: 2px 9px; + border: 1px solid var(--line-strong); + border-radius: 999px; + background: var(--panel-2); + color: var(--text); + font-family: var(--font-mono); + font-size: 11.5px; +} + +.question-timer--urgent { + border-color: color-mix(in srgb, var(--warn) 50%, transparent); + color: var(--warn); +} + +.question-card__title { + margin: 0; + color: var(--text-strong); + font-size: 15px; + font-weight: 650; +} + +.question-item { + display: grid; + gap: 8px; + min-width: 0; +} + +.question-item + .question-item { + padding-top: 12px; + border-top: 1px dashed var(--line-strong); +} + +.question-item__label { + display: flex; + align-items: center; + gap: 8px; +} + +.question-item__number { + display: grid; + width: 18px; + height: 18px; + place-items: center; + border: 1px solid var(--line-strong); + border-radius: 5px; + color: var(--muted); + font-family: var(--font-mono); + font-size: 10.5px; + font-weight: 700; +} + +.question-item.is-answered .question-item__number { + border-color: transparent; + background: var(--success); + color: var(--accent-contrast); +} + +.question-chip { + padding: 2px 6px; + border-radius: var(--radius-sm); + background: var(--panel-3); + color: var(--text); + font-family: var(--font-mono); + font-size: 10px; + font-weight: 700; + letter-spacing: 0.08em; + text-transform: uppercase; +} + +.question-item__prompt { + color: var(--text-strong); + font-size: 14.5px; +} + +.question-options { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(170px, 1fr)); + gap: 8px; +} + +.question-options--stack { + grid-template-columns: minmax(0, 1fr); +} + +.question-key { + position: relative; + display: grid; + grid-template-columns: auto minmax(0, 1fr) auto; + align-items: center; + column-gap: 10px; + min-height: 44px; + padding: 7px 11px 7px 8px; + border: 1px solid var(--line-strong); + border-radius: 9px; + background: linear-gradient(180deg, color-mix(in srgb, var(--panel-3) 65%, var(--panel-2)), var(--panel-2)); + box-shadow: var(--key-edge); + color: var(--text-strong); + font: inherit; + font-weight: 650; + text-align: left; + cursor: pointer; + transition: + border-color 120ms ease, + background 120ms ease, + transform 80ms ease; +} + +.question-key:hover:not(:disabled) { + border-color: color-mix(in srgb, var(--accent) 50%, var(--line-strong)); +} + +.question-key:active:not(:disabled) { + transform: translateY(1px); + box-shadow: var(--key-edge-pressed); +} + +.question-key:focus-visible { + outline: 2px solid var(--accent); + outline-offset: 2px; +} + +.question-key:disabled { + cursor: default; +} + +.question-key:disabled:not(.is-selected) { + opacity: 0.55; +} + +.question-key kbd, +.question-other kbd { + display: grid; + width: 24px; + height: 24px; + place-items: center; + border: 1px solid var(--line-strong); + border-radius: 6px; + background: var(--bg); + box-shadow: 0 1px 0 var(--line-strong); + color: var(--muted); + font-family: var(--font-mono); + font-size: 11.5px; + font-weight: 700; +} + +.question-key__label { + grid-column: 2; + min-width: 0; + overflow-wrap: anywhere; +} + +.question-key small { + grid-column: 2; + color: var(--muted); + font-size: 12px; + font-weight: 500; + line-height: 1.25; +} + +.question-key__mark { + grid-row: 1 / span 2; + grid-column: 3; + width: 18px; + height: 18px; + border: 1.5px solid var(--line-strong); + border-radius: 50%; +} + +.question-key__mark--box { + border-radius: 5px; +} + +.question-key.is-selected { + border-color: var(--accent); + background: color-mix(in srgb, var(--accent) 15%, var(--panel-2)); + box-shadow: + 0 0 0 1px color-mix(in srgb, var(--accent) 45%, transparent), + 0 1px 0 color-mix(in srgb, var(--accent) 60%, transparent); +} + +.question-key.is-selected kbd { + border-color: transparent; + background: var(--accent); + box-shadow: none; + color: var(--accent-contrast); +} + +.question-key.is-selected .question-key__mark { + border-color: var(--accent); + background: var(--accent); + box-shadow: inset 0 0 0 3px var(--panel); +} + +.question-key.is-selected .question-key__mark--box { + box-shadow: none; +} + +.question-key.is-pending .question-key__mark { + border-color: color-mix(in srgb, var(--accent) 30%, transparent); + border-top-color: var(--accent); + background: transparent; + box-shadow: none; + animation: question-spin 800ms linear infinite; +} + +@keyframes question-spin { + to { + transform: rotate(360deg); + } +} + +@media (prefers-reduced-motion: reduce) { + .question-key.is-pending .question-key__mark { + animation: none; + } +} + +.question-key--other { + grid-column: 1 / -1; + min-height: 38px; + border-style: dashed; + background: transparent; + box-shadow: none; + color: var(--muted); + font-weight: 600; +} + +.question-other { + display: flex; + grid-column: 1 / -1; + align-items: center; + gap: 8px; + padding: 6px 8px; + border: 1px solid var(--accent); + border-radius: 9px; + background: var(--bg); + box-shadow: 0 0 0 3px var(--accent-soft); +} + +.question-other kbd { + border-color: transparent; + background: var(--accent); + box-shadow: none; + color: var(--accent-contrast); +} + +.question-other input, +.question-free { + min-width: 0; + flex: 1; + border: 0; + background: transparent; + color: var(--text-strong); + font: inherit; + font-size: 14px; +} + +.question-other input:focus { + outline: none; +} + +.question-free { + padding: 9px 12px; + border: 1px solid var(--line-strong); + border-radius: 9px; + background: var(--bg); +} + +.question-free:focus { + border-color: var(--accent); + outline: none; + box-shadow: 0 0 0 3px var(--accent-soft); +} + +.question-link { + justify-self: start; + color: var(--accent); + font-size: 13px; + font-weight: 650; +} + +.question-lock, +.question-error, +.question-reopened { + margin: 0; + padding: 7px 10px; + border: 1px solid var(--line); + border-radius: var(--radius); + background: var(--panel-2); + color: var(--muted); + font-size: 12.5px; +} + +.question-reopened { + border-color: color-mix(in srgb, var(--warn) 45%, transparent); + background: color-mix(in srgb, var(--warn) 9%, var(--panel-2)); + color: var(--text-strong); +} + +.question-error { + border-color: color-mix(in srgb, var(--danger) 40%, transparent); + color: var(--danger); +} + +.question-card__foot { + display: flex; + flex-wrap: wrap; + align-items: center; + gap: 10px; + padding-top: 12px; + border-top: 1px solid var(--line); +} + +.question-send, +.question-skip { + min-height: 36px; + padding: 0 14px; + border: 1px solid var(--line-strong); + border-radius: var(--radius); + font: inherit; + font-weight: 700; + cursor: pointer; +} + +.question-send { + border-color: color-mix(in srgb, var(--accent) 70%, var(--text-strong)); + background: var(--accent); + box-shadow: var(--key-edge); + color: var(--accent-contrast); +} + +.question-send:disabled, +.question-skip:disabled { + cursor: default; + opacity: 0.5; +} + +.question-skip { + border-color: transparent; + background: transparent; + color: var(--muted); +} + +.question-skip:hover:not(:disabled) { + color: var(--text-strong); +} + +.question-progress { + display: inline-flex; + gap: 4px; +} + +.question-progress i { + width: 18px; + height: 4px; + border-radius: 2px; + background: var(--line-strong); +} + +.question-progress i.is-on { + background: var(--success); +} + +.question-summary { + display: grid; + grid-template-columns: max-content minmax(0, 1fr); + align-items: baseline; + gap: 7px 14px; + margin: 0; +} + +.question-summary dt { + color: var(--muted); + font-family: var(--font-mono); + font-size: 10px; + letter-spacing: 0.08em; + text-transform: uppercase; +} + +.question-summary dd { + display: flex; + flex-wrap: wrap; + gap: 6px; + margin: 0; +} + +.question-answer { + padding: 2px 10px; + border: 1px solid color-mix(in srgb, var(--question-rail) 38%, var(--line)); + border-radius: 999px; + background: color-mix(in srgb, var(--question-rail) 11%, transparent); + color: var(--text-strong); + font-size: 13px; + overflow-wrap: anywhere; +} + +.question-answer--typed { + font-style: italic; +} + +@media (max-width: 560px) { + .question-options { + grid-template-columns: minmax(0, 1fr); + } + + .question-card__note { + margin-left: 0; + } +} diff --git a/docs/README.md b/docs/README.md index 99d98b02d..49b468e9c 100644 --- a/docs/README.md +++ b/docs/README.md @@ -54,6 +54,7 @@ it for anything that isn't a local clone. | Slack-style threads, one level deep | [Threads](features/threads.md) | | Iframe-ready standalone thread panels | [Embedded threads](features/embedding.md) | | Reactions on every message | [Reactions](features/reactions.md) | +| Structured questions from bots and agents | [Questions](features/questions.md) | | Realtime over WebSocket with cursor recovery | [Realtime](features/realtime.md) | | SQLite FTS5 full-text search | [Search](features/search.md) | | Local file uploads + message attachments | [Uploads](features/uploads.md) | diff --git a/docs/features/bots.md b/docs/features/bots.md index bae424369..d5e59c087 100644 --- a/docs/features/bots.md +++ b/docs/features/bots.md @@ -179,6 +179,9 @@ MVP endpoint mapping: bot bundles cannot publish them. - `GET /api/realtime/events` and `/ws`: `realtime:read` - `PUT /api/bots/self/commands`: bot tokens only, with `commands:write` +- `GET /api/bots/self/questions`: bot tokens only, with `messages:read` +- `POST /api/messages/{id}/question/resolution`: the authoring bot, with + `messages:write`; questions on message create need a bot token - `GET /api/workspaces/{id}/bot-commands`: `workspaces:read` - `POST /api/uploads`: `uploads:write` - `POST /api/messages/{id}/attachments`: `uploads:write` and `messages:write` diff --git a/docs/features/messages.md b/docs/features/messages.md index 66a401f9d..f98f4a45e 100644 --- a/docs/features/messages.md +++ b/docs/features/messages.md @@ -126,6 +126,12 @@ Publishing activity requires bot-token authentication plus the explicit activity-capable bot token with a scope list such as `bot:write,agent_activity:write`. +## Questions + +Bots can attach a structured question to a message they create. The web app +renders it as an answerable card, and the body remains the fallback text. See +[questions.md](questions.md). + ## Conversation organization and attention Conversation organization stays attached to the channel timeline, while diff --git a/docs/features/questions.md b/docs/features/questions.md new file mode 100644 index 000000000..6550b2875 --- /dev/null +++ b/docs/features/questions.md @@ -0,0 +1,198 @@ +--- +read_when: + - changing bot-authored questions, answers, or their lifecycle + - wiring an agent runtime's ask-user flow into ClickClack +--- + +# Questions + +A bot can attach a structured question to one of its messages. The web app +renders it as a card in the conversation, people answer it there, and the bot +records what happened. The card then becomes a compact receipt that stays in +history. + +Questions work on channel messages, direct messages, and thread replies. The +message body is still required and is the readable fallback for clients, +notifications, quotes, and search results that do not render questions. + +## Asking + +`POST /api/channels/{channel_id}/messages`, `POST /api/dms/{conversation_id}/messages`, +and `POST /api/messages/{message_id}/thread/replies` accept an optional +`question` from bot tokens on ordinary messages. Human sessions receive `403`, +and agent activity kinds (`agent_commentary`, `agent_tool`) receive `400`. + +```jsonc +{ + "body": "Agent needs input: which day do we ship?", + "nonce": "runtime-question-1", + "question": { + "external_id": "ask_2f6c…", + "title": "Three details before the draft", + "expires_at": "2026-09-12T15:57:00Z", + "responder_user_ids": ["usr_…"], + "allow_skip": true, + "items": [ + { + "id": "ship_date", + "header": "Date", + "prompt": "Which day do we ship?", + "options": [{ "label": "Mon 15", "description": "AA 2231" }, { "label": "Tue 16" }], + "allow_other": true + }, + { "id": "boxes", "header": "Boxes", "prompt": "How many boxes?" }, + { + "id": "extras", + "header": "Extras", + "prompt": "Anything else?", + "multi_select": true, + "options": [{ "label": "Sleeve" }, { "label": "UPC label" }] + } + ] + } +} +``` + +| Field | Rule | +|---|---| +| `external_id` | Optional opaque identifier from the bot's runtime, at most 128 characters | +| `title` | Optional, at most 300 characters | +| `expires_at` | Required RFC 3339 time between 10 seconds and 7 days from now | +| `responder_user_ids` | Optional, at most 50 people who can read the conversation. Empty lets anyone in the conversation answer | +| `allow_skip` | Defaults to `true` | +| `items` | 1 to 5 questions | +| `items[].id` | Matches `^[a-z][a-z0-9_]{0,63}$` and is unique | +| `items[].header` | 1 to 24 characters | +| `items[].prompt` | 1 to 1000 characters, rendered as Markdown | +| `items[].url` | Optional `http(s)` link of at most 2048 characters, shown as an action that does not answer | +| `items[].options` | Up to 10 unique labels of at most 80 characters, with optional descriptions of at most 200 | +| `items[].multi_select` | Needs at least two options | +| `items[].allow_other` | Accepts one free-text answer besides the options. An item without options is free text | +| `items[].other_placeholder` | Optional hint for the free-text field, at most 60 characters | + +Invalid questions return `400`. Create responses include the stored question +and the `X-ClickClack-Questions: supported` header. Servers that predate this +feature ignore the field, so clients detect support from the echoed +`message.question`. Listed responders are added to the message's resolved +mentions, so a mentions-only channel still alerts them. A nonce replay returns +the original message only when the question is identical, even after the +deadline has moved inside the minimum lifetime; the deadline and responders are +checked only when a question is first created. + +## Reading + +Message payloads include the question wherever messages are hydrated: channel +and DM pages, thread pages, single messages, pins, and create responses. + +```jsonc +"question": { + "status": "submitted", + "external_id": "ask_2f6c…", + "expires_at": "2026-09-12T15:57:00Z", + "allow_skip": true, + "items": [ /* as created */ ], + "responder_user_ids": ["usr_…"], + "response": { + "answers": { "ship_date": ["Mon 15"], "boxes": ["120"], "extras": ["UPC label"] }, + "source": "clickclack", + "responder": { "id": "usr_…", "display_name": "Angela" }, + "responded_at": "2026-09-12T15:44:10Z" + }, + "version": 2 +} +``` + +`status` is `open`, `submitted`, `answered`, `cancelled`, `expired`, or `failed`. +An open question past `expires_at` reads as `expired` before the bot records +it. `version` increases with every change. + +## Answering + +```http +POST /api/messages/{message_id}/question/answers +``` + +People send `{"answers": {...}, "nonce": "…", "expected_version": 1}` or +`{"skip": true, "nonce": "…", "expected_version": 1}`. Bot tokens receive `403`. + +- The caller must be able to read the conversation and must not be timed out or + blocked. Direct messages also require the ability to send there. +- When `responder_user_ids` is set, other people receive `403`. +- Every item needs at least one value. Single-choice items take exactly one. + Values that match a declared label are stored as that label; other values + are accepted once per item where free text is allowed. +- Skipping requires `allow_skip`. +- The first valid answer wins. Later answers, and answers to resolved or expired + questions, return `409`. Replaying the same nonce as the same person returns + the recorded answer without new events. +- `expected_version` is the version the person saw. When the question changed + since then, for example because the bot reopened it after a lost response, the + answer returns `409` instead of submitting it again. The web app always sends + it. + +A successful answer moves the question to `submitted`, returns +`{message, events}`, and appends two durable events: `message.updated`, so every +client refreshes the card, and `question.submitted`, whose payload carries +`message_id`, `root_message_id`, optional `direct_conversation_id`, +`external_id`, `responder_id`, `skipped`, and `version`. Neither event copies the +answers; the bot reads them from the message. Answers do not count against the +guest post budget. + +## Resolving + +```http +POST /api/messages/{message_id}/question/resolution +``` + +Only the bot that asked can resolve a question, using a token for that +workspace with `messages:write` (and `dms:write` in a direct message). + +```json +{ "status": "answered", "note": "", "answers": {}, "expected_version": 2 } +``` + +| From | To | Meaning | +|---|---|---| +| `open` | `answered` | Answered outside ClickClack. Optional `answers` are validated and stored with `source: "external"` | +| `open` | `cancelled`, `expired`, `failed` | The bot stopped waiting | +| `submitted` | `answered`, `cancelled`, `failed` | The bot used the answer, applied a skip, or could not use it | +| `submitted` | `open` | Reopen after a rejected answer; requires `note` and clears the response | + +`note` is at most 200 characters and appears on the card. A stale +`expected_version` or a transition the current status does not allow returns +`409`. Repeating the recorded terminal status returns `200` without an event; +other changes append `message.updated`. + +## Reconciling + +```http +GET /api/bots/self/questions?after=&limit= +``` + +Bot tokens with `messages:read` list their own `open` and `submitted` questions +in the token's workspace, ordered by message ID, with `{questions, next_cursor}`. +Questions in direct messages are included only when the token also has +`dms:read`. `limit` accepts 1 to 200 (default 100). A runtime uses it after a +restart to settle questions whose events it missed or whose waiting agent no +longer exists. + +## Web app + +The card replaces the message body in the timeline and in thread panels. + +- Options are keycaps with number shortcuts. A question with one single-choice + item and no free text answers on the first tap; other questions fill in and + submit with **Send answers**. +- **Other...** opens an inline text field. `Enter` submits and `Escape` closes it. +- A countdown shows the time left and turns to the warning color in the last two + minutes. At the deadline the card closes; the server stays authoritative. +- People outside `responder_user_ids` see disabled options and who can answer. +- After an answer the card shows `Sent · waiting for `, then a receipt with + each header and answer. Skipped, cancelled, expired, and undelivered questions + show their state and the bot's note. +- Drafts survive virtualized rows and panel switches for the same question + version. + +The TypeScript SDK exposes `client.questions.answer`, `client.questions.skip`, +`client.questions.resolve`, and `client.questions.listUnresolved`, and message +create inputs accept `question`. diff --git a/docs/features/realtime.md b/docs/features/realtime.md index bf26aab46..25772626c 100644 --- a/docs/features/realtime.md +++ b/docs/features/realtime.md @@ -88,6 +88,7 @@ Inserted in the same transaction as the underlying mutation: - `thread.reply_created`, `thread.state_updated` - `reaction.added`, `reaction.removed` - `pin.added`, `pin.removed` +- `question.submitted` - `member.moderation_updated` The common append helper is the transaction's finalization boundary: complete diff --git a/packages/protocol/openapi.yaml b/packages/protocol/openapi.yaml index ff0bcf519..7612bb6b5 100644 --- a/packages/protocol/openapi.yaml +++ b/packages/protocol/openapi.yaml @@ -854,6 +854,44 @@ paths: description: Invalid command menu. The previous menu remains unchanged. "403": description: Bot token with commands:write required. Human sessions are rejected. + /api/bots/self/questions: + get: + operationId: listBotUnresolvedQuestions + summary: List the authenticated bot's open and submitted questions in its token workspace + description: > + Requires messages:read. Questions in direct messages are included only + for tokens that also have dms:read. + parameters: + - name: after + in: query + schema: + type: string + description: next_cursor from the previous page + - name: limit + in: query + schema: + type: integer + minimum: 1 + maximum: 200 + default: 100 + responses: + "200": + description: Unresolved questions ordered by message id + content: + application/json: + schema: + type: object + required: [questions, next_cursor] + properties: + questions: + type: array + items: + $ref: "#/components/schemas/BotQuestion" + next_cursor: + type: string + nullable: true + "403": + description: Bot token required /api/bot-tokens/{token_id}/revoke: post: operationId: revokeBotToken @@ -1453,6 +1491,52 @@ paths: description: Existing thread reply returned for an idempotent nonce replay "201": description: Created thread reply + /api/messages/{message_id}/question/answers: + post: + operationId: answerQuestion + description: > + Records the first valid answer, or a skip, from a person who can write + in the conversation. Emits message.updated and question.submitted. + parameters: + - $ref: "#/components/parameters/message_id" + requestBody: + required: true + content: + application/json: + schema: + $ref: "#/components/schemas/AnswerQuestionRequest" + responses: + "200": + description: Updated message with its submitted question + "400": + description: Answers do not match the question + "403": + description: Bot tokens and people outside responder_user_ids cannot answer + "404": + description: Question not found + "409": + description: The question already has an answer, was resolved, expired, or changed since expected_version + /api/messages/{message_id}/question/resolution: + post: + operationId: resolveQuestion + description: Records the outcome of a question. Only the bot that asked it can call this. + parameters: + - $ref: "#/components/parameters/message_id" + requestBody: + required: true + content: + application/json: + schema: + $ref: "#/components/schemas/ResolveQuestionRequest" + responses: + "200": + description: Updated message. The event is omitted when the status was already recorded. + "403": + description: Only the authoring bot can resolve the question + "404": + description: Question not found + "409": + description: Stale expected_version or a transition the current status does not allow /api/messages/{message_id}/reactions: post: operationId: addReaction @@ -2925,6 +3009,8 @@ components: description: | Optional agent-turn correlation ID. Allowed only with agent_commentary or agent_tool; ordinary messages reject it. + question: + $ref: "#/components/schemas/QuestionSpec" CreateThreadReplyRequest: type: object required: [body] @@ -2936,6 +3022,216 @@ components: nonce: type: string maxLength: 128 + question: + $ref: "#/components/schemas/QuestionSpec" + QuestionOption: + type: object + required: [label] + properties: + label: + type: string + minLength: 1 + maxLength: 80 + description: + type: string + maxLength: 200 + QuestionItem: + type: object + required: [id, header, prompt] + properties: + id: + type: string + pattern: "^[a-z][a-z0-9_]{0,63}$" + header: + type: string + minLength: 1 + maxLength: 24 + prompt: + type: string + minLength: 1 + maxLength: 1000 + description: Rendered as inline Markdown. + url: + type: string + format: uri + maxLength: 2048 + description: Optional http(s) link opened by an action that never answers the question. + options: + type: array + maxItems: 10 + items: + $ref: "#/components/schemas/QuestionOption" + description: Declared choices. An item without options accepts one free-text answer. + multi_select: + type: boolean + description: Allow several options. Requires at least two options. + allow_other: + type: boolean + description: Accept one free-text answer in addition to the declared options. + other_placeholder: + type: string + maxLength: 60 + QuestionSpec: + type: object + description: > + Structured question a bot attaches to its message. Only bot tokens can + create questions, and only on ordinary messages (not agent activity + kinds). The message body remains the readable fallback for clients that + do not render questions. + required: [expires_at, items] + properties: + external_id: + type: string + maxLength: 128 + description: Opaque identifier from the bot's runtime. + title: + type: string + maxLength: 300 + expires_at: + type: string + format: date-time + description: Between 10 seconds and 7 days from now. + responder_user_ids: + type: array + maxItems: 50 + items: + type: string + description: People allowed to answer. Empty means anyone who can read and write in the conversation. + allow_skip: + type: boolean + default: true + items: + type: array + minItems: 1 + maxItems: 5 + items: + $ref: "#/components/schemas/QuestionItem" + QuestionResponse: + type: object + required: [source] + properties: + answers: + type: object + additionalProperties: + type: array + items: + type: string + skipped: + type: boolean + source: + type: string + enum: [clickclack, external] + description: external marks answers the bot recorded from outside ClickClack. + responder: + $ref: "#/components/schemas/User" + responded_at: + type: string + format: date-time + MessageQuestion: + type: object + required: [status, expires_at, allow_skip, items, version] + properties: + status: + type: string + enum: [open, submitted, answered, cancelled, expired, failed] + description: An open question past expires_at is reported as expired. + external_id: + type: string + title: + type: string + expires_at: + type: string + format: date-time + allow_skip: + type: boolean + items: + type: array + items: + $ref: "#/components/schemas/QuestionItem" + responder_user_ids: + type: array + items: + type: string + response: + $ref: "#/components/schemas/QuestionResponse" + note: + type: string + resolved_at: + type: string + format: date-time + version: + type: integer + format: int64 + AnswerQuestionRequest: + type: object + properties: + answers: + type: object + additionalProperties: + type: array + items: + type: string + description: Answers keyed by item id. Every item needs at least one value. + skip: + type: boolean + description: Decline to answer when the question allows it. Cannot be combined with answers. + nonce: + type: string + maxLength: 128 + description: Replaying the same nonce as the same person returns the recorded answer. + expected_version: + type: integer + format: int64 + description: > + Question version the person answered. A different current version, + such as after the bot reopened the question, returns 409 instead of + recording the answer. + ResolveQuestionRequest: + type: object + required: [status] + properties: + status: + type: string + enum: [open, answered, cancelled, expired, failed] + description: open reopens a submitted question and requires a note. + note: + type: string + maxLength: 200 + answers: + type: object + additionalProperties: + type: array + items: + type: string + description: Answers recorded outside ClickClack, accepted when an open question becomes answered. + expected_version: + type: integer + format: int64 + BotQuestion: + type: object + required: [message_id, workspace_id, thread_root_id, status, expires_at, version] + properties: + message_id: + type: string + workspace_id: + type: string + channel_id: + type: string + direct_conversation_id: + type: string + thread_root_id: + type: string + external_id: + type: string + status: + type: string + enum: [open, submitted, expired] + expires_at: + type: string + format: date-time + version: + type: integer + format: int64 UpdateMessageRequest: type: object required: [body] @@ -3365,6 +3661,8 @@ components: type: array items: $ref: "#/components/schemas/ReactionSummary" + question: + $ref: "#/components/schemas/MessageQuestion" MessageResponse: type: object required: [message] diff --git a/packages/sdk-ts/src/generated/openapi.d.ts b/packages/sdk-ts/src/generated/openapi.d.ts index dda1636fb..572a36e00 100644 --- a/packages/sdk-ts/src/generated/openapi.d.ts +++ b/packages/sdk-ts/src/generated/openapi.d.ts @@ -592,6 +592,26 @@ export interface paths { patch?: never; trace?: never; }; + "/api/bots/self/questions": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * List the authenticated bot's open and submitted questions in its token workspace + * @description Requires messages:read. Questions in direct messages are included only for tokens that also have dms:read. + */ + get: operations["listBotUnresolvedQuestions"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; "/api/bot-tokens/{token_id}/revoke": { parameters: { query?: never; @@ -977,6 +997,40 @@ export interface paths { patch?: never; trace?: never; }; + "/api/messages/{message_id}/question/answers": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** @description Records the first valid answer, or a skip, from a person who can write in the conversation. Emits message.updated and question.submitted. */ + post: operations["answerQuestion"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/messages/{message_id}/question/resolution": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** @description Records the outcome of a question. Only the bot that asked it can call this. */ + post: operations["resolveQuestion"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; "/api/messages/{message_id}/reactions": { parameters: { query?: never; @@ -1830,11 +1884,128 @@ export interface components { * agent_commentary or agent_tool; ordinary messages reject it. */ turn_id?: string; + question?: components["schemas"]["QuestionSpec"]; }; CreateThreadReplyRequest: { body: string; quoted_message_id?: string; nonce?: string; + question?: components["schemas"]["QuestionSpec"]; + }; + QuestionOption: { + label: string; + description?: string; + }; + QuestionItem: { + id: string; + header: string; + /** @description Rendered as inline Markdown. */ + prompt: string; + /** + * Format: uri + * @description Optional http(s) link opened by an action that never answers the question. + */ + url?: string; + /** @description Declared choices. An item without options accepts one free-text answer. */ + options?: components["schemas"]["QuestionOption"][]; + /** @description Allow several options. Requires at least two options. */ + multi_select?: boolean; + /** @description Accept one free-text answer in addition to the declared options. */ + allow_other?: boolean; + other_placeholder?: string; + }; + /** @description Structured question a bot attaches to its message. Only bot tokens can create questions, and only on ordinary messages (not agent activity kinds). The message body remains the readable fallback for clients that do not render questions. */ + QuestionSpec: { + /** @description Opaque identifier from the bot's runtime. */ + external_id?: string; + title?: string; + /** + * Format: date-time + * @description Between 10 seconds and 7 days from now. + */ + expires_at: string; + /** @description People allowed to answer. Empty means anyone who can read and write in the conversation. */ + responder_user_ids?: string[]; + /** @default true */ + allow_skip: boolean; + items: components["schemas"]["QuestionItem"][]; + }; + QuestionResponse: { + answers?: { + [key: string]: string[]; + }; + skipped?: boolean; + /** + * @description external marks answers the bot recorded from outside ClickClack. + * @enum {string} + */ + source: "clickclack" | "external"; + responder?: components["schemas"]["User"]; + /** Format: date-time */ + responded_at?: string; + }; + MessageQuestion: { + /** + * @description An open question past expires_at is reported as expired. + * @enum {string} + */ + status: "open" | "submitted" | "answered" | "cancelled" | "expired" | "failed"; + external_id?: string; + title?: string; + /** Format: date-time */ + expires_at: string; + allow_skip: boolean; + items: components["schemas"]["QuestionItem"][]; + responder_user_ids?: string[]; + response?: components["schemas"]["QuestionResponse"]; + note?: string; + /** Format: date-time */ + resolved_at?: string; + /** Format: int64 */ + version: number; + }; + AnswerQuestionRequest: { + /** @description Answers keyed by item id. Every item needs at least one value. */ + answers?: { + [key: string]: string[]; + }; + /** @description Decline to answer when the question allows it. Cannot be combined with answers. */ + skip?: boolean; + /** @description Replaying the same nonce as the same person returns the recorded answer. */ + nonce?: string; + /** + * Format: int64 + * @description Question version the person answered. A different current version, such as after the bot reopened the question, returns 409 instead of recording the answer. + */ + expected_version?: number; + }; + ResolveQuestionRequest: { + /** + * @description open reopens a submitted question and requires a note. + * @enum {string} + */ + status: "open" | "answered" | "cancelled" | "expired" | "failed"; + note?: string; + /** @description Answers recorded outside ClickClack, accepted when an open question becomes answered. */ + answers?: { + [key: string]: string[]; + }; + /** Format: int64 */ + expected_version?: number; + }; + BotQuestion: { + message_id: string; + workspace_id: string; + channel_id?: string; + direct_conversation_id?: string; + thread_root_id: string; + external_id?: string; + /** @enum {string} */ + status: "open" | "submitted" | "expired"; + /** Format: date-time */ + expires_at: string; + /** Format: int64 */ + version: number; }; UpdateMessageRequest: { body: string; @@ -2076,6 +2247,7 @@ export interface components { thread_state?: components["schemas"]["ThreadState"]; nonce?: string; reactions?: components["schemas"]["ReactionSummary"][]; + question?: components["schemas"]["MessageQuestion"]; }; MessageResponse: { message: components["schemas"]["Message"]; @@ -3730,6 +3902,40 @@ export interface operations { }; }; }; + listBotUnresolvedQuestions: { + parameters: { + query?: { + /** @description next_cursor from the previous page */ + after?: string; + limit?: number; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Unresolved questions ordered by message id */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": { + questions: components["schemas"]["BotQuestion"][]; + next_cursor: string | null; + }; + }; + }; + /** @description Bot token required */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; revokeBotToken: { parameters: { query?: never; @@ -4646,6 +4852,103 @@ export interface operations { }; }; }; + answerQuestion: { + parameters: { + query?: never; + header?: never; + path: { + message_id: components["parameters"]["message_id"]; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["AnswerQuestionRequest"]; + }; + }; + responses: { + /** @description Updated message with its submitted question */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Answers do not match the question */ + 400: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Bot tokens and people outside responder_user_ids cannot answer */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Question not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description The question already has an answer, was resolved, expired, or changed since expected_version */ + 409: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; + resolveQuestion: { + parameters: { + query?: never; + header?: never; + path: { + message_id: components["parameters"]["message_id"]; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["ResolveQuestionRequest"]; + }; + }; + responses: { + /** @description Updated message. The event is omitted when the status was already recorded. */ + 200: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Only the authoring bot can resolve the question */ + 403: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Question not found */ + 404: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + /** @description Stale expected_version or a transition the current status does not allow */ + 409: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + }; + }; addReaction: { parameters: { query?: never; diff --git a/packages/sdk-ts/src/index.ts b/packages/sdk-ts/src/index.ts index 24409163c..eccaae865 100644 --- a/packages/sdk-ts/src/index.ts +++ b/packages/sdk-ts/src/index.ts @@ -75,10 +75,17 @@ export type Topic = components["schemas"]["Topic"]; export type MessageKind = "message" | "agent_commentary" | "agent_tool"; +export type QuestionSpec = components["schemas"]["QuestionSpec"]; +export type MessageQuestion = components["schemas"]["MessageQuestion"]; +export type BotQuestion = components["schemas"]["BotQuestion"]; +export type QuestionAnswers = Record; + type MessageInputBase = { body: string; quoted_message_id?: string; nonce?: string; + /** Structured question; bot tokens only. The body stays the readable fallback. */ + question?: QuestionSpec; }; export type MessageInput = MessageInputBase & @@ -850,7 +857,7 @@ export class ClickClackClient { }, reply: async ( messageId: string, - input: { body: string; quoted_message_id?: string; nonce?: string }, + input: { body: string; quoted_message_id?: string; nonce?: string; question?: QuestionSpec }, ): Promise => { const data = await this.request<{ message: Message }>( `/api/messages/${messageId}/thread/replies`, @@ -863,6 +870,68 @@ export class ClickClackClient { }, }; + questions = { + answer: async ( + messageId: string, + answers: QuestionAnswers, + options: { nonce?: string; expectedVersion?: number } = {}, + ): Promise => { + const data = await this.request<{ message: Message }>( + `/api/messages/${messageId}/question/answers`, + { + method: "POST", + body: JSON.stringify({ + answers, + nonce: options.nonce, + expected_version: options.expectedVersion, + }), + }, + ); + return data.message; + }, + skip: async ( + messageId: string, + options: { nonce?: string; expectedVersion?: number } = {}, + ): Promise => { + const data = await this.request<{ message: Message }>( + `/api/messages/${messageId}/question/answers`, + { + method: "POST", + body: JSON.stringify({ + skip: true, + nonce: options.nonce, + expected_version: options.expectedVersion, + }), + }, + ); + return data.message; + }, + resolve: async ( + messageId: string, + input: { + status: "open" | "answered" | "cancelled" | "expired" | "failed"; + note?: string; + answers?: QuestionAnswers; + expected_version?: number; + }, + ): Promise => { + const data = await this.request<{ message: Message }>( + `/api/messages/${messageId}/question/resolution`, + { method: "POST", body: JSON.stringify(input) }, + ); + return data.message; + }, + listUnresolved: async ( + options: { after?: string; limit?: number } = {}, + ): Promise<{ questions: BotQuestion[]; next_cursor: string | null }> => { + const params = new URLSearchParams(); + if (options.after) params.set("after", options.after); + if (options.limit !== undefined) params.set("limit", String(options.limit)); + const query = params.size > 0 ? `?${params.toString()}` : ""; + return this.request(`/api/bots/self/questions${query}`); + }, + }; + search = async ( workspaceId: string, query: string, diff --git a/tests/e2e/agent-questions.spec.ts b/tests/e2e/agent-questions.spec.ts new file mode 100644 index 000000000..b970285d9 --- /dev/null +++ b/tests/e2e/agent-questions.spec.ts @@ -0,0 +1,313 @@ +import { expect, test, type APIRequestContext, type Page } from "@playwright/test"; +import { execFileSync } from "node:child_process"; +import { randomUUID } from "node:crypto"; +import { waitForAppReady } from "./app-ready"; +import { createGeneralChannel } from "./channel-fixture"; + +type AskedMessage = { + id: string; + question: { + status: string; + version: number; + note?: string; + response?: { answers?: Record; responder?: { id: string } }; + }; +}; + +function admin(args: string[]) { + return execFileSync( + "go", + ["run", "./apps/api/cmd/clickclack", "admin", ...args, "--data", "./data/e2e"], + { cwd: process.cwd(), encoding: "utf8" }, + ).trim(); +} + +async function createBot(page: Page, workspaceID: string, displayName: string) { + const suffix = randomUUID().replaceAll("-", "").slice(0, 8); + const response = await page.request.post(`/api/workspaces/${workspaceID}/bots`, { + data: { + display_name: displayName, + handle: `${displayName.toLowerCase()}-${suffix}`, + token_name: "e2e", + scopes: ["bot:write"], + }, + }); + expect(response.status()).toBe(201); + const { bot_token } = (await response.json()) as { bot_token: { token: string } }; + return bot_token.token; +} + +function minutesFromNow(minutes: number) { + return new Date(Date.now() + minutes * 60_000).toISOString(); +} + +async function ask( + request: APIRequestContext, + token: string, + endpoint: string, + body: string, + question: Record, +) { + const response = await request.post(endpoint, { + headers: { Authorization: `Bearer ${token}` }, + data: { body, question }, + }); + expect(response.status()).toBe(201); + expect(response.headers()["x-clickclack-questions"]).toBe("supported"); + return ((await response.json()) as { message: AskedMessage }).message; +} + +async function readAsBot(request: APIRequestContext, token: string, messageID: string) { + const response = await request.get(`/api/messages/${messageID}`, { + headers: { Authorization: `Bearer ${token}` }, + }); + expect(response.ok()).toBe(true); + return ((await response.json()) as { message: AskedMessage }).message; +} + +async function resolve( + request: APIRequestContext, + token: string, + messageID: string, + data: Record, +) { + const response = await request.post(`/api/messages/${messageID}/question/resolution`, { + headers: { Authorization: `Bearer ${token}` }, + data, + }); + expect(response.status()).toBe(200); +} + +test("a quick question answers on the first tap and shows the bot's outcome", async ({ page }) => { + const { workspace, channel, route } = await createGeneralChannel(page, "Quick question proof"); + const token = await createBot(page, workspace.id, "Courier"); + const message = await ask( + page.request, + token, + `/api/channels/${channel.id}/messages`, + "Courier needs input: which day do we ship?", + { + external_id: "e2e-quick", + expires_at: minutesFromNow(10), + items: [ + { + id: "ship_date", + header: "Date", + prompt: "Which day do we ship?", + options: [{ label: "Mon 15", description: "AA 2231" }, { label: "Tue 16" }], + }, + ], + }, + ); + + await page.goto(route); + await waitForAppReady(page); + const card = page.locator(`[data-message-id="${message.id}"] .question-card`); + await expect(card).toHaveAttribute("data-question-status", "open"); + await expect(card.getByText("Needs your answer")).toBeVisible(); + + await card.getByRole("radio", { name: /Tue 16/ }).click(); + await expect(card).toHaveAttribute("data-question-status", "submitted"); + await expect(card.getByText("Sent · waiting for Courier")).toBeVisible(); + const submitted = await readAsBot(page.request, token, message.id); + expect(submitted.question.response?.answers).toEqual({ ship_date: ["Tue 16"] }); + + await resolve(page.request, token, message.id, { + status: "answered", + expected_version: submitted.question.version, + }); + await expect(card).toHaveAttribute("data-question-status", "answered"); + await expect(card.locator(".question-summary")).toContainText("Date"); + await expect(card.locator(".question-summary")).toContainText("Tue 16"); +}); + +test("only listed responders answer a form question, and a reopened card explains why", async ({ + page, + browser, +}) => { + const { workspace, channel, route } = await createGeneralChannel(page, "Form question proof"); + const meResponse = await page.request.get("/api/me"); + expect(meResponse.ok()).toBe(true); + const { user: owner } = (await meResponse.json()) as { user: { id: string } }; + const suffix = randomUUID().replaceAll("-", "").slice(0, 12); + const responderID = admin([ + "user", + "create", + "--name", + "Question Responder", + "--email", + `question-responder-${suffix}@example.com`, + ]); + admin([ + "member", + "add", + "--workspace", + workspace.id, + "--created-by", + owner.id, + "--user", + responderID, + "--role", + "member", + ]); + const token = await createBot(page, workspace.id, "Planner"); + const message = await ask( + page.request, + token, + `/api/channels/${channel.id}/messages`, + "Planner needs three details before the draft", + { + title: "Three details before the draft", + expires_at: minutesFromNow(30), + responder_user_ids: [responderID], + allow_skip: false, + items: [ + { + id: "ship_date", + header: "Date", + prompt: "Which day do we ship?", + options: [{ label: "Mon 15" }, { label: "Tue 16" }], + allow_other: true, + }, + { id: "boxes", header: "Boxes", prompt: "How many boxes?" }, + { + id: "extras", + header: "Extras", + prompt: "Anything else?", + multi_select: true, + options: [{ label: "Sleeve" }, { label: "UPC label" }], + }, + ], + }, + ); + + await page.goto(route); + await waitForAppReady(page); + const ownerCard = page.locator(`[data-message-id="${message.id}"] .question-card`); + await expect(ownerCard.getByText("Three details before the draft")).toBeVisible(); + await expect(ownerCard.getByRole("radio", { name: /Mon 15/ })).toBeDisabled(); + await expect(ownerCard.locator(".question-lock")).toContainText("can answer this question"); + await expect(ownerCard.getByRole("button", { name: "Skip" })).toHaveCount(0); + + const context = await browser.newContext({ + extraHTTPHeaders: { "X-ClickClack-User": responderID }, + }); + try { + const responderPage = await context.newPage(); + await responderPage.goto(route); + await waitForAppReady(responderPage); + let card = responderPage.locator(`[data-message-id="${message.id}"] .question-card`); + const date = card.getByRole("radiogroup", { name: "Date" }); + const send = card.getByRole("button", { name: "Send answers" }); + await expect(send).toBeDisabled(); + + await card.getByRole("textbox", { name: "Boxes" }).fill("120"); + await card.getByRole("checkbox", { name: /Sleeve/ }).click(); + await card.getByRole("checkbox", { name: /UPC label/ }).click(); + await date.getByRole("radio", { name: /Mon 15/ }).focus(); + await responderPage.keyboard.press("2"); + await expect(date.getByRole("radio", { name: /Tue 16/ })).toHaveAttribute( + "aria-checked", + "true", + ); + await expect(card.getByLabel("3 of 3 answered")).toBeVisible(); + await expect(date.getByRole("radio", { name: /Mon 15/ })).toBeFocused(); + await responderPage.keyboard.press("3"); + const other = card.getByRole("textbox", { name: "Other answer for Date" }); + await expect(other).toBeFocused(); + await other.press("Escape"); + await expect(other).toHaveCount(0); + await date.getByRole("radio", { name: /Tue 16/ }).focus(); + await responderPage.keyboard.press("3"); + await other.fill("Wed 17"); + await other.press("Enter"); + + await expect(card).toHaveAttribute("data-question-status", "submitted"); + await expect(card.getByText("Sent · waiting for Planner")).toBeVisible(); + await expect(ownerCard).toHaveAttribute("data-question-status", "submitted"); + await expect(ownerCard.getByText("by Question Responder")).toBeVisible(); + const submitted = await readAsBot(page.request, token, message.id); + expect(submitted.question.response?.answers).toEqual({ + ship_date: ["Wed 17"], + boxes: ["120"], + extras: ["Sleeve", "UPC label"], + }); + expect(submitted.question.response?.responder?.id).toBe(responderID); + + await resolve(page.request, token, message.id, { + status: "open", + note: "Pick a listed date and at most 100 boxes", + expected_version: submitted.question.version, + }); + card = responderPage.locator(`[data-message-id="${message.id}"] .question-card`); + await expect(card).toHaveAttribute("data-question-status", "open"); + await expect(card.getByText("Pick a listed date and at most 100 boxes")).toBeVisible(); + // The reopened card grows at the bottom of the channel; the list keeps following it. + await expect(card.getByRole("button", { name: "Send answers" })).toBeInViewport(); + await card.getByRole("radio", { name: /Mon 15/ }).click(); + await card.getByRole("textbox", { name: "Boxes" }).fill("80"); + await card.getByRole("checkbox", { name: /Sleeve/ }).click(); + await card.getByRole("button", { name: "Send answers" }).click(); + await expect(card).toHaveAttribute("data-question-status", "submitted"); + await expect(card.getByText("Pick a listed date and at most 100 boxes")).toHaveCount(0); + + const corrected = await readAsBot(page.request, token, message.id); + await resolve(page.request, token, message.id, { + status: "answered", + expected_version: corrected.question.version, + }); + await expect(ownerCard).toHaveAttribute("data-question-status", "answered"); + const summary = ownerCard.locator(".question-summary"); + await expect(summary).toContainText("Mon 15"); + await expect(summary).toContainText("80"); + await expect(summary).toContainText("Sleeve"); + } finally { + await context.close(); + } +}); + +test("a question in a thread closes at its deadline", async ({ page }) => { + const { workspace, channel, route } = await createGeneralChannel(page, "Thread question proof"); + const token = await createBot(page, workspace.id, "Scout"); + const rootResponse = await page.request.post(`/api/channels/${channel.id}/messages`, { + data: { body: "Scout, can you confirm the pickup?" }, + }); + expect(rootResponse.ok()).toBe(true); + const { message: root } = (await rootResponse.json()) as { message: { id: string } }; + const reply = await ask( + page.request, + token, + `/api/messages/${root.id}/thread/replies`, + "Scout needs input: which truck?", + { + expires_at: minutesFromNow(1), + items: [ + { + id: "truck", + header: "Truck", + prompt: "Which truck picks up?", + options: [{ label: "Morning" }, { label: "Afternoon" }], + }, + ], + }, + ); + + await page.clock.install(); + await page.goto(route); + await waitForAppReady(page); + const rootRow = page.locator(`[data-message-id="${root.id}"]`); + await rootRow.hover(); + await rootRow.getByRole("button", { name: "Open thread" }).click(); + const threadPane = page.getByRole("complementary", { name: "Thread pane" }); + const card = threadPane.locator(".question-card"); + await expect(card).toHaveAttribute("data-question-status", "open"); + await expect(card.locator(".question-timer")).toHaveClass(/question-timer--urgent/); + + // Only the page clock moves; the server keeps its own deadline. + await page.clock.fastForward("01:05"); + await expect(card).toHaveAttribute("data-question-status", "expired"); + await expect(card.getByText("Expired", { exact: true })).toBeVisible(); + await expect(card.getByRole("radio")).toHaveCount(0); + const stored = await readAsBot(page.request, token, reply.id); + expect(stored.question.status).toBe("open"); +});