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 ace8e7dbd..62ce3d6d2 100644 --- a/apps/api/internal/httpapi/server.go +++ b/apps/api/internal/httpapi/server.go @@ -222,6 +222,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) @@ -258,6 +259,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 c15ebd040..bcac4c022 100644 --- a/apps/api/internal/store/postgres/postgres.go +++ b/apps/api/internal/store/postgres/postgres.go @@ -611,6 +611,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 } @@ -663,6 +667,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 } @@ -692,6 +700,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 } @@ -700,6 +713,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 } @@ -753,6 +769,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 @@ -767,6 +787,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 @@ -778,6 +799,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() } @@ -802,6 +824,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 } @@ -827,6 +853,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 @@ -835,6 +871,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 @@ -892,6 +931,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, @@ -910,6 +953,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. @@ -925,6 +969,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..9ea673a46 --- /dev/null +++ b/apps/api/internal/store/postgres/questions.go @@ -0,0 +1,538 @@ +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 err := requireMessageAccessTx(ctx, tx, msg, input.BotUserID); err != nil { + return store.Message{}, store.Event{}, err + } + if msg.DirectConversationID != "" { + err = requireCanSendDirectTx(ctx, tx, msg.WorkspaceID, input.BotUserID) + } else { + err = requireNoModerationBlockTx(ctx, tx, msg.WorkspaceID, input.BotUserID) + } + if err != nil { + return store.Message{}, store.Event{}, err + } + 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..3abfdf9d2 --- /dev/null +++ b/apps/api/internal/store/postgres/questions_test.go @@ -0,0 +1,51 @@ +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 TestQuestionResolutionRespectsModeration(t *testing.T) { + questiontest.QuestionResolutionRespectsModeration(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 ee1a39eaf..820612b48 100644 --- a/apps/api/internal/store/postgres/sqlc/queries.sql +++ b/apps/api/internal/store/postgres/sqlc/queries.sql @@ -1944,6 +1944,67 @@ WHERE user_id = sqlc.arg(user_id) 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); -- name: LockUserPushSubscriptions :one SELECT id FROM users WHERE id = sqlc.arg(user_id) FOR NO KEY UPDATE; diff --git a/apps/api/internal/store/postgres/sqlc/schema.sql b/apps/api/internal/store/postgres/sqlc/schema.sql index 1578a65a3..42eb6b038 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 7d76fed5b..f3ea341fa 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 e4aa8b153..396289d9d 100644 --- a/apps/api/internal/store/postgres/storedb/queries.sql.go +++ b/apps/api/internal/store/postgres/storedb/queries.sql.go @@ -1657,6 +1657,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 @@ -2826,6 +2861,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, @@ -3404,6 +3477,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, @@ -6077,6 +6225,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 = '' @@ -6289,6 +6487,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..5774a6e46 --- /dev/null +++ b/apps/api/internal/store/questiontest/questions.go @@ -0,0 +1,559 @@ +// 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) + } +} + +// QuestionResolutionRespectsModeration verifies current write authority, including +// the response and durable event effects of reopening a submitted question. +func QuestionResolutionRespectsModeration(t *testing.T, st store.Store) { + t.Helper() + ctx := context.Background() + f := newFixture(t, st) + 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) + } + for _, location := range []string{"channel", "direct"} { + for _, restriction := range []string{"blocked", "timeout"} { + for _, outcome := range []string{store.QuestionStatusAnswered, store.QuestionStatusOpen} { + t.Run(location+"/"+restriction+"/"+outcome, func(t *testing.T) { + spec := questionSpec(f.member.ID) + var message store.Message + var err error + if location == "direct" { + message, _, err = st.CreateDirectMessage(ctx, store.CreateDirectMessageInput{ + ConversationID: conversation.ID, AuthorID: f.bot.ID, Body: "Confirm shipping", Question: &spec, + }) + } else { + message, _, err = st.CreateMessage(ctx, store.CreateMessageInput{ + ChannelID: f.channel.ID, AuthorID: f.bot.ID, Body: "Confirm shipping", Question: &spec, + }) + } + if err != nil { + t.Fatal(err) + } + submitted, _, err := st.AnswerQuestion(ctx, store.AnswerQuestionInput{ + MessageID: message.ID, UserID: f.member.ID, + Answers: map[string][]string{"ship_date": {"Lun 15 sep"}, "boxes": {"120"}}, + }) + if err != nil { + t.Fatal(err) + } + moderation := store.UpdateMemberModerationInput{ + WorkspaceID: f.workspace.ID, ActorUserID: f.owner.ID, TargetUserID: f.bot.ID, + } + if restriction == "blocked" { + blocked := true + moderation.Blocked = &blocked + } else { + until := time.Now().Add(time.Hour).UTC().Format(time.RFC3339Nano) + moderation.TimeoutUntil = &until + } + _, boundary, err := st.UpdateMemberModeration(ctx, moderation) + if err != nil { + t.Fatal(err) + } + resolve := store.ResolveQuestionInput{ + MessageID: message.ID, BotUserID: f.bot.ID, Status: outcome, + Note: "Please select a shipping day", ExpectedVersion: &submitted.Question.Version, + } + if _, event, err := st.ResolveQuestion(ctx, resolve); !errors.Is(err, store.ErrModerationRestricted) || event.ID != "" { + t.Fatalf("restricted resolution: event=%#v err=%v", event, err) + } + unchanged, err := st.GetMessage(ctx, message.ID, f.member.ID) + if err != nil || !reflect.DeepEqual(unchanged.Question, submitted.Question) { + t.Fatalf("restricted resolution changed stored question: %#v, %v", unchanged.Question, err) + } + if events, err := st.ListEventsAfter(ctx, f.workspace.ID, f.owner.ID, boundary.Cursor, 100); err != nil || len(events) != 0 { + t.Fatalf("restricted resolution appended durable events: %#v, %v", events, err) + } + clear := false + if _, _, err := st.UpdateMemberModeration(ctx, store.UpdateMemberModerationInput{ + WorkspaceID: f.workspace.ID, ActorUserID: f.owner.ID, TargetUserID: f.bot.ID, + Blocked: &clear, ClearTimeout: true, + }); err != nil { + t.Fatal(err) + } + if allowed, event, err := st.ResolveQuestion(ctx, resolve); err != nil || allowed.Question.Status != outcome || event.ID == "" { + t.Fatalf("resolution after restriction cleared: %#v, %#v, %v", allowed.Question, event, 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..601adc887 --- /dev/null +++ b/apps/api/internal/store/sqlite/questions.go @@ -0,0 +1,542 @@ +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 err := requireMessageAccessTx(ctx, tx, msg, input.BotUserID); err != nil { + return store.Message{}, store.Event{}, err + } + if msg.DirectConversationID != "" { + err = requireCanSendDirectTx(ctx, tx, msg.WorkspaceID, input.BotUserID) + } else { + err = requireNoModerationBlockTx(ctx, tx, msg.WorkspaceID, input.BotUserID) + } + if err != nil { + return store.Message{}, store.Event{}, err + } + 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..0cedc3fc6 --- /dev/null +++ b/apps/api/internal/store/sqlite/questions_test.go @@ -0,0 +1,48 @@ +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 TestQuestionResolutionRespectsModeration(t *testing.T) { + t.Parallel() + questiontest.QuestionResolutionRespectsModeration(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 be3ef1529..6275dea6e 100644 --- a/apps/api/internal/store/sqlite/sqlc/queries.sql +++ b/apps/api/internal/store/sqlite/sqlc/queries.sql @@ -1848,6 +1848,67 @@ 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); -- name: UpsertPushSubscription :exec INSERT INTO user_push_subscriptions ( diff --git a/apps/api/internal/store/sqlite/sqlc/schema.sql b/apps/api/internal/store/sqlite/sqlc/schema.sql index 7d80e3e51..244097fc6 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 a72f80443..271e5efc5 100644 --- a/apps/api/internal/store/sqlite/sqlite.go +++ b/apps/api/internal/store/sqlite/sqlite.go @@ -630,6 +630,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 } @@ -685,6 +689,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 @@ -711,6 +719,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 } @@ -719,6 +732,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 } @@ -772,6 +788,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 @@ -786,6 +806,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 @@ -797,6 +818,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() } @@ -824,6 +846,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 @@ -846,6 +872,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 @@ -854,6 +890,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 @@ -911,6 +950,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, @@ -929,6 +972,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. @@ -944,6 +988,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 c3688cbcd..3eb46b4a5 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 d49909cee..9954c0879 100644 --- a/apps/api/internal/store/sqlite/storedb/queries.sql.go +++ b/apps/api/internal/store/sqlite/storedb/queries.sql.go @@ -1647,6 +1647,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 @@ -2813,6 +2848,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, @@ -3388,6 +3461,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, @@ -5807,6 +5955,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 = '' @@ -6019,6 +6217,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 802653772..235f7453f 100644 --- a/apps/api/internal/store/types.go +++ b/apps/api/internal/store/types.go @@ -367,6 +367,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 { @@ -940,6 +942,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 { @@ -959,6 +963,7 @@ type CreateThreadReplyInput struct { Body string QuotedMessageID *string Nonce string + Question *QuestionSpec } type CreateReactionInput struct { @@ -1105,6 +1110,7 @@ type CreateDirectMessageInput struct { UploadID string Kind string TurnID string + Question *QuestionSpec } type Topic struct { @@ -1345,6 +1351,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 8c698c40c..be9478b15 100644 --- a/apps/api/internal/webassets/dist/200.html +++ b/apps/api/internal/webassets/dist/200.html @@ -110,16 +110,16 @@ - + - + - +
@@ -133,7 +133,7 @@ Promise.all([ import("/_app/immutable/entry/start.CJgF5gsQ.js"), - import("/_app/immutable/entry/app.B8HOrAvW.js") + import("/_app/immutable/entry/app.D_F4hZka.js") ]).then(([kit, app]) => { kit.start(app, element); }); diff --git a/apps/api/internal/webassets/dist/_app/immutable/assets/0.BbpWhj-s.css b/apps/api/internal/webassets/dist/_app/immutable/assets/0.BbpWhj-s.css deleted file mode 100644 index a251df3f9..000000000 --- a/apps/api/internal/webassets/dist/_app/immutable/assets/0.BbpWhj-s.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;grid-template-columns:minmax(0,1fr);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 3 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 .typing-indicator,.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 .typing-indicator.visible,.composer-dock .agent-responding.visible{opacity:1;height:20px;margin:0;transform:none}.composer-dock .typing-indicator__label{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.composer-dock:has(>.agent-responding)>.typing-indicator:not(.agent-responding){justify-content:flex-end;left:50%}.composer-dock:has(>.typing-indicator.visible:not(.agent-responding))>.agent-responding{right:50%}.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:not(.visible) .typing-indicator__dots i{animation:none}.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){:root:not([data-pointer-mode=mouse]) .message-row{-webkit-touch-callout:none}:root:not([data-pointer-mode=mouse]) .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}:root:not([data-pointer-mode=mouse]) .message-actions>:not(.message-more){display:none}:root:not([data-pointer-mode=mouse]) .message-row.actions-flip .message-actions{top:1px;bottom:auto}:root:not([data-pointer-mode=mouse]) .message-actions .message-more{position:static}:root:not([data-pointer-mode=mouse]) .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}:root:not([data-pointer-mode=mouse]) .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}:root:not([data-pointer-mode=mouse]) .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-sheet-scrim,.message-sheet-scrim *{-webkit-user-select:none;user-select:none;-webkit-touch-callout:none}.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){:root:not([data-pointer-mode=mouse]) .thread .group-body>header{min-height:28px;padding-right:32px;position:relative}:root:not([data-pointer-mode=mouse]) .thread .reply-quote-btn,:root:not([data-pointer-mode=mouse]) .thread .thread-action-btn:not(.thread-more-actions){display:none}:root:not([data-pointer-mode=mouse]) .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}:root:not([data-pointer-mode=mouse]) .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-select{background:var(--bg);border:1px solid var(--line);border-radius:var(--radius-sm);width:100%;height:32px;color:var(--text);font:inherit;cursor:pointer;margin:2px 0 6px;padding:0 8px;font-size:13.5px;transition:border-color .12s,box-shadow .12s,background .12s}.settings-modal__rail-select:hover{border-color:var(--line-strong)}.settings-modal__rail-select:focus{border-color:var(--accent);background:var(--panel);box-shadow:0 0 0 3px var(--accent-soft);outline:0}.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.CIpxfnSk.css b/apps/api/internal/webassets/dist/_app/immutable/assets/0.CIpxfnSk.css new file mode 100644 index 000000000..08815868a --- /dev/null +++ b/apps/api/internal/webassets/dist/_app/immutable/assets/0.CIpxfnSk.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;grid-template-columns:minmax(0,1fr);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 3 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 .typing-indicator,.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 .typing-indicator.visible,.composer-dock .agent-responding.visible{opacity:1;height:20px;margin:0;transform:none}.composer-dock .typing-indicator__label{text-overflow:ellipsis;white-space:nowrap;min-width:0;overflow:hidden}.composer-dock:has(>.agent-responding)>.typing-indicator:not(.agent-responding){justify-content:flex-end;left:50%}.composer-dock:has(>.typing-indicator.visible:not(.agent-responding))>.agent-responding{right:50%}.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:not(.visible) .typing-indicator__dots i{animation:none}.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){:root:not([data-pointer-mode=mouse]) .message-row{-webkit-touch-callout:none}:root:not([data-pointer-mode=mouse]) .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}:root:not([data-pointer-mode=mouse]) .message-actions>:not(.message-more){display:none}:root:not([data-pointer-mode=mouse]) .message-row.actions-flip .message-actions{top:1px;bottom:auto}:root:not([data-pointer-mode=mouse]) .message-actions .message-more{position:static}:root:not([data-pointer-mode=mouse]) .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}:root:not([data-pointer-mode=mouse]) .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}:root:not([data-pointer-mode=mouse]) .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-sheet-scrim,.message-sheet-scrim *{-webkit-user-select:none;user-select:none;-webkit-touch-callout:none}.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){:root:not([data-pointer-mode=mouse]) .thread .group-body>header{min-height:28px;padding-right:32px;position:relative}:root:not([data-pointer-mode=mouse]) .thread .reply-quote-btn,:root:not([data-pointer-mode=mouse]) .thread .thread-action-btn:not(.thread-more-actions){display:none}:root:not([data-pointer-mode=mouse]) .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}:root:not([data-pointer-mode=mouse]) .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-select{background:var(--bg);border:1px solid var(--line);border-radius:var(--radius-sm);width:100%;height:32px;color:var(--text);font:inherit;cursor:pointer;margin:2px 0 6px;padding:0 8px;font-size:13.5px;transition:border-color .12s,box-shadow .12s,background .12s}.settings-modal__rail-select:hover{border-color:var(--line-strong)}.settings-modal__rail-select:focus{border-color:var(--accent);background:var(--panel);box-shadow:0 0 0 3px var(--accent-soft);outline:0}.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/BVKCCx27.js b/apps/api/internal/webassets/dist/_app/immutable/chunks/BVKCCx27.js new file mode 100644 index 000000000..ca26be64a --- /dev/null +++ b/apps/api/internal/webassets/dist/_app/immutable/chunks/BVKCCx27.js @@ -0,0 +1 @@ +import{$ as e,A as t,At as n,C as r,Et as i,H as a,I as o,L as s,N as c,P as l,R as u,St as d,T as f,Tt as p,U as m,W as h,Y as g,a as _,ct as v,et as y,ft as b,g as x,gt as S,ht as C,j as ee,mt as w,n as te,pt as T,st as E,u as ne,vt as D,w as O,yt as k,z as A}from"./BTIB_WQZ.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 oe,c as se,d as ce,f as le,g as ue,h as de,i as fe,k as pe,l as P,n as me,o as he,r as ge,s as _e,t as ve,w as ye}from"./CNPmRNxE.js";import{f as be,l as xe,t as Se,u as Ce}from"./ByQ3bZN5.js";var F=300,we=200,Te=100,I=50,L=e=>e.thread_seq??0,R=class{context;committed;#e=k(null);get root(){return g(this.#e)}set root(e){D(this.#e,e,!0)}#t=k(S([]));get replies(){return g(this.#t)}set replies(e){D(this.#t,e,!0)}#n=k(null);get state(){return g(this.#n)}set state(e){D(this.#n,e,!0)}#r=k(``);get error(){return g(this.#r)}set error(e){D(this.#r,e,!0)}#i=k(null);get selection(){return g(this.#i)}set selection(e){D(this.#i,e)}#a=k(!1);get hasOlder(){return g(this.#a)}set hasOlder(e){D(this.#a,e,!0)}#o=k(!1);get hasNewer(){return g(this.#o)}set hasNewer(e){D(this.#o,e,!0)}#s=k(S({older:!1,newer:!1}));get loading(){return g(this.#s)}set loading(e){D(this.#s,e,!0)}#c=k(S({older:``,newer:``}));get edgeError(){return g(this.#c)}set edgeError(e){D(this.#c,e,!0)}#l=k(!0);get following(){return g(this.#l)}set following(e){D(this.#l,e,!0)}anchor=null;editingID=``;beforeChange;#u=k(S(new Map));get drafts(){return g(this.#u)}set drafts(e){D(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=pe(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)=>L(e)-L(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:Te},`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=>L(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||L(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:Te},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=I){if(this.loading[e])return!1;let{selection:r,current:i}=this.owner(t),a=this.revision;if(!r||!i())return!1;let o=L(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=>L(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=L(this.replies.at(-1)),a=L(this.replies[0])-1;try{for(;aL(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),L(this.replies.at(-1)??{})>=i.newest_seq){this.hasNewer=!1;return}if(!this.hasNewer||this.following){for(let e=0;n()&&L(this.replies.at(-1)??{})=F);e+=I);n()&&L(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)&&L(e.message)===L(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})}}},z=A(`
`);function Ee(e,t){i(t,!0);let r=_(t,`agentNames`,19,()=>[]),a=d(()=>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 c=u(),f=T(c),m=e=>{var t=z(),r=C(b(t),2),i=w(r,!0);n(t),E(()=>o(i,g(a))),s(e,t)};l(f,e=>{t.active&&e(m)}),s(e,c),p()}var B=A(`
`);function De(e,t){i(t,!0);let a=_(t,`disabled`,3,!1),o=_(t,`pending`,3,!1),c=_(t,`buttonClass`,3,``),u=k(!1),f=k(!1),h=k(void 0),y=k(void 0),S=d(()=>`add-reaction-picker-${t.messageId}`);function ee(){a()||o()||(g(u)||D(f,oe(g(h),130),!0),D(u,!g(u)))}function w(e){a()||o()||(t.onToggle(e),D(u,!1))}function te(){D(u,!1),g(y)?.focus()}function T(e){g(h)&&!g(h).contains(e.target)&&D(u,!1)}v(()=>{if(g(u))return document.addEventListener(`click`,T),()=>document.removeEventListener(`click`,T)}),v(()=>{(a()||o())&&D(u,!1)});var A=B(),j=b(A);ne(j,e=>D(y,e),()=>g(y));var M=C(j,2),N=e=>{{let t=d(()=>g(f)?`above-right`:`below`),n=d(()=>a()||o());P(e,{get id(){return g(S)},get placement(){return g(t)},get disabled(){return g(n)},onPick:w,onEscape:te})}};l(M,e=>{g(u)&&e(N)}),n(A),ne(A,e=>D(h,e),()=>g(h)),E(()=>{r(j,1,O(c()),`svelte-sk6gxl`),x(j,`aria-controls`,g(S)),x(j,`aria-expanded`,g(u)),j.disabled=a()||o()}),m(`click`,j,ee),s(e,A),p()}a([`click`]);var Oe=A(``),ke=A(` `),Ae=A(`Couldn't create link`),je=A(`Open in ClickClack`),Me=A(``),Ne=A(`deleted bot`),Pe=A(` `),Fe=A(``),Ie=A(``),Le=A(``),Re=A(``),ze=A(` `,1),Be=A(`
This message was deleted.
`),Ve=A(`
`),He=A(`(edited)`),Ue=A(` `,1),We=A(`
`),Ge=A(`

`),Ke=A(`
`),qe=A(` `,1),Je=A(` `,1),Ye=A(`
`),Xe=A(`
`),Ze=A(``),Qe=A(`

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

`),yt=N(`

Blocked.

`),Q=N(``),bt=N(``),xt=N(``),St=N(``),Ct=N(`
Moderation
`),wt=N(`

Profile

Active
Contact information
Handle
User ID
About

`,1);function Tt(e,t){i(t,!0);let r=y(t,`messagePending`,3,!1),a=y(t,`messageError`,3,``),c=f(()=>t.profile.kind===`bot`?t.profile.owner_user_id?`Bot of ${t.profile.owner_user_id}`:`Service bot`:``),u=f(()=>t.moderation?.role||`member`),p=f(()=>!!t.moderation&&v(u)!==`owner`&&(t.currentUserRole===`owner`||t.currentUserRole===`moderator`&&(v(u)===`member`||v(u)===`guest`))),g=f(()=>t.currentUser?.id!==t.profile.id&&v(p)),_=f(()=>!!t.moderation?.blocked_at),b=f(()=>v(u));var S=wt(),C=O(S),T=x(C),E=w(x(T),2),ee=D(E,!0);n(T);var te=w(T,2);n(C);var A=w(C,2),j=x(A),M=x(j);be(M,{class:`profile-avatar`,get id(){return t.profile.id},get name(){return t.profile.display_name},get src(){return t.profile.avatar_url},size:240,loading:`eager`,fetchPriority:`auto`}),n(j);var N=w(j,2),P=x(N),ne=x(P),F=x(ne),re=D(F,!0),ie=w(F,2),ae=e=>{var t=ft(),n=D(t,!0);k(()=>o(n,v(c))),s(e,t)};l(ie,e=>{v(c)&&e(ae)});var oe=w(ie,2),se=e=>{var n=pt(),r=D(n,!0);k(e=>o(r,e),[()=>B(t.profile.handle)]),s(e,n)};l(oe,e=>{t.profile.handle&&e(se)}),n(ne);var ce=w(ne,2),le=e=>{var n=mt();h(`click`,n,function(...e){t.onEdit?.apply(this,e)}),s(e,n)};l(ce,e=>{t.currentUser?.id===t.profile.id&&t.onEdit&&e(le)}),n(P);var ue=w(P,4),de=e=>{var i=ht(),a=x(i),c=D(a,!0);n(i),k(()=>{a.disabled=r(),o(c,r()?`Starting…`:`Message`)}),h(`click`,a,()=>t.onMessage?.(t.profile.id)),s(e,i)};l(ue,e=>{t.currentUser?.id!==t.profile.id&&t.onMessage&&e(de)});var fe=w(ue,2),pe=e=>{var t=gt(),n=D(t,!0);k(()=>o(n,a())),s(e,t)};l(fe,e=>{a()&&e(pe)});var I=w(fe,2),L=x(I),R=w(x(L),2),me=e=>{var n=mt();h(`click`,n,function(...e){t.onEdit?.apply(this,e)}),s(e,n)};l(R,e=>{t.currentUser?.id===t.profile.id&&t.onEdit&&e(me)}),n(L);var z=w(L,2),he=w(x(z),2),ge=w(x(he),2),_e=D(ge,!0);n(he),n(z);var ve=w(z,2),ye=w(x(ve),2),xe=w(x(ye),2),Se=D(xe,!0);n(ye),n(ve);var H=w(ve,2),U=e=>{var t=_t(),r=w(x(t),2),i=w(x(r),2),a=D(i,!0);n(r),n(t),k(()=>o(a,v(c))),s(e,t)};l(H,e=>{t.profile.kind===`bot`&&e(U)}),n(I);var W=w(I,2),Ce=w(x(W),2),we=D(Ce);n(W);var Te=w(W,2),G=e=>{var r=Ct(),i=x(r),a=w(x(i),2),c=D(a,!0);n(i);var u=w(i,2),d=e=>{var n=vt(),r=D(n);k(()=>o(r,`${t.moderation.posts_remaining??``} of ${t.moderation.post_limit??``} waiting-room posts left today.`)),s(e,n)};l(u,e=>{t.moderation.role===`guest`&&t.moderation.post_limit>0&&e(d)});var f=w(u,2),p=e=>{var n=vt(),r=D(n);k(e=>o(r,`Timed out until ${e??``}.`),[()=>new Date(t.moderation.timeout_until).toLocaleString()]),s(e,n)};l(f,e=>{t.moderation.timeout_until&&e(p)});var m=w(f,2),g=e=>{var t=yt();s(e,t)};l(m,e=>{t.moderation.blocked_at&&e(g)});var y=w(m,2),S=x(y),C=e=>{var n=Q();h(`click`,n,()=>t.onApprove?.(t.profile.id)),s(e,n)};l(S,e=>{t.moderation.role===`guest`&&t.onApprove&&e(C)});var T=w(S,2),E=e=>{var n=bt();h(`click`,n,()=>t.onTimeout?.(t.profile.id)),s(e,n)};l(T,e=>{t.onTimeout&&e(E)});var ee=w(T,2),te=e=>{var n=xt();h(`click`,n,()=>t.onUnblock?.(t.profile.id)),s(e,n)},O=e=>{var n=St();h(`click`,n,()=>t.onBlock?.(t.profile.id)),s(e,n)};l(ee,e=>{v(_)&&t.onUnblock?e(te):!v(_)&&t.onBlock&&e(O,1)}),n(y),n(r),k(()=>o(c,v(b))),s(e,r)};l(Te,e=>{v(g)&&t.moderation&&e(G)}),n(N),n(A),k((e,n)=>{o(ee,t.profile.display_name),d(j,`--hue: ${e??``}deg`),o(re,t.profile.display_name),o(_e,n),o(Se,t.profile.id),o(we,`Member of ${(t.workspaceName||`this workspace`)??``}.`)},[()=>V(t.profile.id),()=>t.profile.handle?B(t.profile.handle):`No handle set`]),h(`click`,te,function(...e){t.onClose?.apply(this,e)}),s(e,S),m()}a([`click`]);export{H as i,dt as n,Pe as r,Tt as t}; \ No newline at end of file diff --git a/apps/api/internal/webassets/dist/_app/immutable/chunks/CNPmRNxE.js b/apps/api/internal/webassets/dist/_app/immutable/chunks/CNPmRNxE.js new file mode 100644 index 000000000..620052707 --- /dev/null +++ b/apps/api/internal/webassets/dist/_app/immutable/chunks/CNPmRNxE.js @@ -0,0 +1,72 @@ +import{$ as e,A as t,At as n,C as r,Ct as i,Et as a,H as o,I as s,L as c,M as l,P as u,R as d,S as f,St as p,T as m,Tt as h,U as g,V as _,W as v,Y as y,a as b,ct as x,et as S,ft as C,g as w,gt as T,h as E,ht as D,j as ee,kt as O,mt as k,n as te,pt as ne,r as A,st as j,u as M,v as re,vt as N,w as P,yt as F,z as I}from"./BTIB_WQZ.js";import"./xihTtKlq.js";import{a as L,n as ie,o as R,t as ae,u as oe}from"./DEPNME54.js";import{d as z,f as se,l as ce,r as le,u as B}from"./ByQ3bZN5.js";var ue=Symbol(`clickclackAnimatedURL`),V=new WeakMap;function H(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 U=typeof ResizeObserver>`u`?null:new ResizeObserver(e=>{let t=new Set;for(let n of e){let e=V.get(n.target);e&&t.add(e)}for(let e of t)H(e)});function de(e){return e[ue]||e.currentSrc||e.src}function fe(e){let t=new Map,n=new Map,r=new Map,i=new Map,a=!1,o=e=>{let t=r.get(e);t&&(U?.unobserve(e),U?.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),V.set(e,e),V.set(t,e),U?.observe(e),U?.observe(t),H(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[ue]=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[ue],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 W=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+W)):(o=n,a=Math.max(0,o-W))),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 G(e){return z(e.quoted_author,`Unknown`)}function _e(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 ve(e){let t=e.thread_state?.reply_count||0;return t===0?`Thread`:`${t} ${t===1?`reply`:`replies`}`}function ye(e){let t=e.thread_state?.last_reply_at;return t?be(t):``}function be(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 xe(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 Se(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?xe(a.created_at):null,messages:[a],authorName:a.author?.display_name||`Local User`,authorHandle:se(a.author),authorAvatarURL:B(a.author)?``:a.author?.avatar_url||``,authorID:s,authorDeleted:B(a.author),timestamp:a.created_at}):t[t.length-1].messages.push(a),n=o,r=s,i=e.getTime()}return t}function Ce(){return typeof crypto<`u`&&typeof crypto.randomUUID==`function`?crypto.randomUUID().replace(/-/g,``):`${Date.now().toString(36)}${Math.random().toString(36).slice(2,10)}`}function we(e,t){let n={...e,...t,thread_state:t.thread_state?Te(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 Te(e,t){return e?.root_message_id===t.root_message_id&&e.reply_count>t.reply_count?e:t}var Ee=12;function De(e){return e.replace(/^\p{White_Space}+/u,``).replace(/\p{White_Space}+$/u,``)}var Oe=class{reveal;#e=F(T(new Map));get sessions(){return y(this.#e)}set sessions(e){N(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=De(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 ie(`/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:oe(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<=Ee)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-Ee,r=new Map(this.sessions);for(let[e]of t.slice(0,n))r.delete(e);this.sessions=r}},ke=4001;function Ae(e){return e===ke}async function je(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 Me=8192;function Ne(e){let t=e.isActive??(()=>!0),n=e.maxPendingEvents??Me,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 Pe=class extends Error{},Fe=e=>`clickclack:${e}:cursor`;function Ie(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(Fe(t))}catch{p=!1}return d}function x(e){if(d=e,p)try{localStorage.setItem(Fe(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 R(`/api/realtime/events?${n.toString()}`,{signal:e}).catch(async n=>{if(n instanceof ae&&[400,403].includes(n.status)){let{workspaces:n}=await R(`/api/workspaces`,{signal:e});if(!n.some(e=>e.id===t))throw new Pe(`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 je({readCursor:b,fetchTailCursor:()=>w(i),isActive:()=>S(e)});if(!a.active||!S(e))return;let o=new URL(L(`/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=Ne({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}Le(t)&&p.enqueue(t)}),c.addEventListener(`close`,t=>{p.stop(),l()&&(Ae(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 ae&&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 Le(e){return typeof e==`object`&&!!e&&typeof e.type==`string`}var Re=W+50,ze=class{currentUserID;#e=F(T(new Map));get entries(){return y(this.#e)}set entries(e){N(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:He(a,i.pendingIntent),complete:!0,partialEmojis:new Map,revision:++this.revision}),n=!0}n&&(this.entries=qe(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=Ue(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:He(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=We(n.displayed,t)?`remove`:`add`,i=this.generation,a=n.revision,o={emoji:t,intent:r};this.setEntry(e.id,{...n,displayed:He(n.confirmed,o),pendingIntent:o,error:``});try{let n=r===`remove`?await ie(`/api/messages/${e.id}/reactions/${encodeURIComponent(t)}`,{method:`DELETE`}):await ie(`/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:He(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 ie(`/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:He(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:Ge(r.confirmed,o)?``:oe(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=qe(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 Ke([...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 Ke([...r.values()])}function He(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 Ke(n)}function Ue(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),Ke(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),Ke(a)}function We(e,t){return e.some(e=>e.emoji===t&&e.reacted_by_me)}function Ge(e,t){return We(e,t.emoji)===(t.intent===`add`)}function Ke(e){return e.sort((e,t)=>t.count-e.count||e.emoji.localeCompare(t.emoji))}function qe(e){let t=e.size;for(;e.size>Re&&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 Je(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 Ye(e){return L(`/api/uploads/${encodeURIComponent(e.id)}`)}function Xe(e){return e.content_type.startsWith(`image/`)}function Ze(e){return e<1024?`${e} B`:e<1048576?`${Math.round(e/1024)} KB`:`${(e/1048576).toFixed(1)} MB`}var K=[{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 $e(e,t){a(t,!0);let i=b(t,`disabled`,3,!1);var o=Qe(),s=C(o),l=D(s,2),u=D(l,2),d=C(u);d.textContent=`<>`,n(u);var f=D(u,2),p=C(f);p.textContent=`{}`,n(f);var m=D(f,2),_=D(m,2);let v;n(o),j(()=>{s.disabled=i(),l.disabled=i(),u.disabled=i(),f.disabled=i(),m.disabled=i(),w(_,`aria-expanded`,t.showGifPicker),_.disabled=i(),v=r(_,1,``,null,v,{active:t.showGifPicker})}),g(`click`,s,()=>t.onWrap(`**`)),g(`click`,l,()=>t.onWrap(`_`)),g(`click`,u,()=>t.onWrap("`")),g(`click`,f,()=>t.onWrap("\n```\n","\n```\n",`code`)),g(`click`,m,()=>t.onWrap(`[`,`](https://)`,`label`)),g(`click`,_,function(...e){t.onToggleGif?.apply(this,e)}),c(e,o),h()}o([`click`]);var et=I(``),tt=I(`

No GIFs found

`),nt=I(``);function rt(e,t){a(t,!0);let r=F(void 0);A(()=>y(r)?.focus());var i=nt(),o=C(i),l=D(C(o),2);E(l),M(l,e=>N(r,e),()=>y(r)),n(o);var d=D(o,2);ee(d,21,()=>t.gifs,e=>e.url,(e,r)=>{var i=et(),a=C(i),o=D(a,2),l=k(o,!0);n(i),j(()=>{w(a,`src`,y(r).url),w(a,`alt`,y(r).title),s(l,y(r).title)}),g(`click`,i,()=>t.onPick(y(r).url,y(r).title)),c(e,i)}),n(d);var f=D(d,2),p=e=>{var t=tt();c(e,t)};u(f,e=>{t.gifs.length===0&&e(p)}),n(i),j(()=>re(l,t.query)),g(`keydown`,i,e=>{e.isComposing||e.keyCode===229||e.key===`Escape`&&(e.preventDefault(),t.onClose())}),g(`input`,l,e=>t.onQuery(e.currentTarget.value)),c(e,i),h()}o([`keydown`,`input`,`click`]);var it=I(`
Replying to
`);function at(e,t){a(t,!0);var r=it(),i=D(C(r),2),o=C(i),l=D(C(o)),u=k(l,!0);n(o);var d=D(o,2),f=k(d,!0);n(i);var p=D(i,2);n(r),j((e,t)=>{s(u,e),s(f,t)},[()=>z(t.target.author),()=>ge(t.target.body)]),g(`click`,p,function(...e){t.onClear?.apply(this,e)}),c(e,r),h()}o([`click`]);var ot=I(` `),st=I(``),ct=I(`
`),lt=I(``),ut=I(`
`),dt=I(``),ft=I(`
`);function pt(t,o){a(o,!0);let l=b(o,`formClass`,3,`composer`),d=b(o,`pendingUpload`,3,null),f=b(o,`replyTarget`,3,null),S=b(o,`showUpload`,3,!1),T=b(o,`showToolbar`,3,!1),E=b(o,`slashCommands`,19,()=>[]),te=b(o,`botCommands`,19,()=>[]),ne=b(o,`mentionPeople`,19,()=>[]),A=b(o,`disabled`,3,!1),I=b(o,`onUploadFile`,3,()=>{}),L=b(o,`onRemoveUpload`,3,()=>{}),ie=b(o,`onClearReply`,3,()=>{}),R=F(null),ae=F(0),oe=F(``),z=F(0),se=F(!1),B=F(``),ue=p(()=>{let e=y(B).trim().toLowerCase();return K.filter(t=>!e||t.title.toLowerCase().includes(e)||t.tags.some(t=>t.includes(e)))}),V=p(()=>U(o.value,y(ae))),H=p(()=>!y(V)||de(y(V))===y(oe)?[]:y(V).kind===`slash`?pe(y(V)):he(y(V)));x(()=>(o.onInputRef(y(R)),()=>o.onInputRef(null))),x(()=>{if(y(H).length===0){N(z,0);return}y(z)>=y(H).length&&N(z,0)});function U(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 de(e){return`${e.kind}:${e.start}:${e.raw}`}function fe(e=y(R)){N(ae,e?.selectionStart??o.value.length,!0)}function W(e){return e.startsWith(`/`)?e:`/${e}`}function pe(e){let t=e.query,n=E().filter(e=>!e.revoked_at).map(e=>{let t=W(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=te().filter(e=>!r.has(W(e.command))).map(e=>{let t=W(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 me(e){return ce(e.handle||e.display_name.replace(/\s+/g,``))}function he(e){let t=e.query,n=new Set;return ne().filter(e=>!e.id||!e.handle?.trim()||n.has(e.id)?!1:(n.add(e.id),!0)).map(e=>{let t=me(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 ge(e){y(V)&&G(`${o.value.slice(0,y(V).start)}${e.insertText}${o.value.slice(y(V).end)}`,y(V).start+e.insertText.length)}async function G(t,n=t.length,r=n){A()||(o.onValue(t),await e(),!A()&&(y(R)?.focus(),y(R)?.setSelectionRange(n,r),N(ae,n,!0)))}function _e(e,t=e,n=`text`){let r=y(R)?.selectionStart??o.value.length,i=y(R)?.selectionEnd??r,a=o.value.slice(r,i)||n;G(`${o.value.slice(0,r)}${e}${a}${t}${o.value.slice(i)}`,r+e.length,r+e.length+a.length)}function ve(){y(se)&&(N(se,!1),N(B,``),y(R)?.focus())}function ye(e,t){let n=o.value&&!o.value.endsWith(` +`)?` +`:``;G(`${o.value}${n}![${t}](${e})`),ve()}function be(e){let t=e.currentTarget;o.onValue(t.value),fe(t)}function xe(){fe(),o.onFocus()}function Se(e){if(!(e.defaultPrevented||e.isComposing||e.keyCode===229)){if(e.key===`Escape`&&y(H).length>0&&y(V)){e.preventDefault(),N(oe,de(y(V)),!0),y(R)?.focus();return}if(e.target===y(R)){if(y(H).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;N(z,(y(z)+t+y(H).length)%y(H).length);return}if(e.key===`Enter`||e.key===`Tab`){e.preventDefault(),ge(y(H)[y(z)]);return}}o.onKeydown(e)}}}var Ce=ft(),we=C(Ce),Te=e=>{rt(e,{get gifs(){return y(ue)},get query(){return y(B)},onQuery:e=>N(B,e,!0),onPick:ye,onClose:ve})};u(we,e=>{T()&&y(se)&&!A()&&e(Te)});var Ee=D(we,2),De=e=>{var t=ct();ee(t,23,()=>y(H),e=>e.id,(e,t,i)=>{var a=st();let o;var l=C(a),d=C(l),f=e=>{var t=_(`/`);c(e,t)},p=e=>{var n=_();j(e=>s(n,e),[()=>le(y(t).detail)]),c(e,n)};u(d,e=>{y(t).kind===`slash`?e(f):e(p,-1)}),n(l);var m=D(l,2),h=C(m),v=C(h,!0),b=D(v),x=e=>{var n=ot(),r=k(n,!0);j(()=>s(r,y(t).hint)),c(e,n)};u(b,e=>{y(t).hint&&e(x)}),n(h);var S=D(h,2),T=k(S,!0);n(m);var E=D(m,2),ee=k(E,!0);n(a),j(()=>{w(a,`aria-selected`,y(i)===y(z)),o=r(a,1,``,null,o,{active:y(i)===y(z)}),s(v,y(t).label),s(T,y(t).detail),s(ee,y(t).source??(y(t).kind===`slash`?`command`:`mention`))}),g(`mousedown`,a,e=>e.preventDefault()),g(`click`,a,()=>ge(y(t))),c(e,a)}),n(t),j(()=>w(t,`aria-label`,y(V)?.kind===`slash`?`Slash command suggestions`:`Mention suggestions`)),c(e,t)};u(Ee,e=>{y(H).length>0&&e(De)});var Oe=D(Ee,2),ke=C(Oe),Ae=e=>{var t=ut(),r=D(C(t),2),i=e=>{var t=lt();j(e=>{w(t,`src`,e),w(t,`alt`,d().filename)},[()=>Ye(d())]),c(e,t)},a=p(()=>Xe(d()));u(r,e=>{y(a)&&e(i)});var o=D(r,2),l=k(o),f=D(o,2);n(t),j(e=>s(l,`${d().filename??``} · ${e??``}`),[()=>Ze(d().byte_size)]),g(`click`,f,function(...e){L()?.apply(this,e)}),c(e,t)};u(ke,e=>{d()&&e(Ae)});var je=D(ke,2),Me=e=>{at(e,{get target(){return f()},get onClear(){return ie()}})};u(je,e=>{f()&&e(Me)});var Ne=D(je,2),Pe=C(Ne),Fe=e=>{var t=dt(),r=C(t);O(2),n(t),j(()=>r.disabled=A()),g(`change`,r,function(...e){I()?.apply(this,e)}),c(e,t)};u(Pe,e=>{S()&&e(Fe)});var Ie=D(Pe,2);i(Ie),M(Ie,e=>N(R,e),()=>y(R)),m(Ie,(e,t)=>Je?.(e,t),()=>o.value);var Le=D(Ie,2);n(Ne);var Re=D(Ne,2),ze=e=>{$e(e,{get showGifPicker(){return y(se)},get disabled(){return A()},onWrap:_e,onToggleGif:()=>{y(se)?ve():N(se,!0)}})};u(Re,e=>{T()&&e(ze)}),n(Oe),n(Ce),j(e=>{r(Ce,1,P(l())),w(Ce,`data-handles-escape`,y(H).length>0?``:void 0),re(Ie,o.value),w(Ie,`placeholder`,o.placeholder),w(Ie,`aria-label`,o.ariaLabel),Ie.disabled=A(),w(Le,`aria-label`,o.submitLabel),Le.disabled=e},[()=>A()||!o.value.trim()]),g(`keydown`,Ce,Se),v(`submit`,Oe,e=>{e.preventDefault(),!A()&&(ve(),o.onSubmit())}),g(`input`,Ie,be),v(`focus`,Ie,xe),g(`keyup`,Ie,()=>fe()),g(`mouseup`,Ie,()=>fe()),v(`select`,Ie,()=>fe()),c(t,Ce),h()}o([`keydown`,`mousedown`,`click`,`change`,`input`,`keyup`,`mouseup`]);function mt(e,t){this.v=e,this.k=t}function ht(e,t){(t==null||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n`u`?null:Y(BigInt.prototype.toString),Kt=typeof Symbol>`u`?null:Y(Symbol.prototype.toString),qt=Y(Object.prototype.hasOwnProperty),Jt=Y(Object.prototype.toString),Yt=Y(RegExp.prototype.test),Xt=Zt(TypeError);function Y(e){return function(t){t instanceof RegExp&&(t.lastIndex=0);var n=[...arguments].slice(1);return kt(e,t,n)}}function Zt(e){return function(){return At(e,[...arguments])}}function X(e,t){let n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:Lt;if(Ct&&Ct(e,null),!It(t))return e;let r=t.length;for(;r--;){let i=t[r];if(typeof i==`string`){let e=n(i);e!==i&&(wt(t)||(t[r]=e),i=e)}e[i]=!0}return e}function Qt(e){for(let t=0;t/g),_n=J(/\${[\w\W]*/g),vn=J(/^data-[\-\w.\u00B7-\uFFFF]+$/),yn=J(/^aria-[\-\w]+$/),bn=J(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp|matrix):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i),xn=J(/^(?:\w+script|data):/i),Sn=J(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g),Cn=J(/^html$/i),wn=J(/^[a-z][.\w]*(-[.\w]+)+$/i),Tn=J(/<[/\w!]/g),En=J(/<[/\w]/g),Dn=J(/<\/no(script|embed|frames)/i),On=J(/\/>/i),kn={element:1,attribute:2,text:3,cdataSection:4,entityReference:5,entityNode:6,processingInstruction:7,comment:8,document:9,documentType:10,documentFragment:11,notation:12},An=[`style`,`script`,`xmp`,`iframe`,`noembed`,`noframes`,`plaintext`,`noscript`],jn=q(X({},An)),Mn=function(){let e={};return jt(An,t=>{e[t]=J(RegExp(`])`,`i`))}),q(e)}(),Nn=function(){return typeof window>`u`?null:window},Pn=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}},Fn=function(){return{afterSanitizeAttributes:[],afterSanitizeElements:[],afterSanitizeShadowDOM:[],beforeSanitizeAttributes:[],beforeSanitizeElements:[],beforeSanitizeShadowDOM:[],uponSanitizeAttribute:[],uponSanitizeElement:[],uponSanitizeShadowNode:[]}},In=function(e,t,n,r){return qt(e,t)&&It(e[t])?X(r.base?$t(r.base):{},e[t],r.transform):n},Ln=function(e,t,n){let r=qt(e,t)?e[t]:void 0;return r&&typeof r==`object`?$t(r):n()};function Rn(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:Nn(),t=e=>Rn(e);if(t.version=`3.4.16`,t.removed=[],!e||!e.document||e.document.nodeType!==kn.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=tn(d,`cloneNode`),p=tn(d,`remove`),m=tn(d,`removeAttributeNode`),h=tn(d,`nextSibling`),g=tn(d,`childNodes`),_=tn(d,`parentNode`),v=tn(d,`shadowRoot`),y=tn(d,`attributes`),b=o&&o.prototype?tn(o.prototype,`nodeType`):null,x=o&&o.prototype?tn(o.prototype,`nodeName`):null,S=o&&o.prototype?tn(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,ee=!1,O=0,k=function(){if(O>0)throw Xt(`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.`)},te=function(e){k(),O++;try{return T.createHTML(e)}finally{O--}},ne=function(e){k(),O++;try{return T.createScriptURL(e)}finally{O--}},A=function(){return ee||=(D=Pn(u,i),!0),D},j=n,M=j.implementation,re=j.createNodeIterator,N=j.createDocumentFragment,P=j.getElementsByTagName,F=r.importNode,I=Fn();t.isSupported=typeof St==`function`&&typeof _==`function`&&M&&M.createHTMLDocument!==void 0;let L=hn,ie=gn,R=_n,ae=vn,oe=yn,z=xn,se=Sn,ce=wn,le=bn,B=null,ue=X({},[...rn,...an,...on,...cn,...un]),V=null,H=X({},[...dn,...fn,...pn,...mn]),U=Object.seal(Dt(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}})),de=null,fe=null,W=Object.seal(Dt(null,{tagCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeCheck:{writable:!0,configurable:!1,enumerable:!0,value:null}})),pe=!0,me=!0,he=!1,ge=!0,G=!1,_e=!0,ve=!1,ye=!1,be=null,xe=null,Se=!1,Ce=!1,we=!1,Te=!1,Ee=!0,De=!1,Oe=`user-content-`,ke=!0,Ae=!1,je={},Me=null,Ne=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(`.`)),Pe=null,Fe=X({},[`audio`,`video`,`img`,`source`,`image`,`track`]),Ie=null,Le=X({},[`alt`,`class`,`for`,`id`,`label`,`name`,`pattern`,`placeholder`,`role`,`summary`,`title`,`value`,`style`,`xmlns`]),Re=`http://www.w3.org/1998/Math/MathML`,ze=`http://www.w3.org/2000/svg`,Be=`http://www.w3.org/1999/xhtml`,Ve=Be,He=!1,Ue=null,We=X({},[Re,ze,Be],Rt),Ge=q([`mi`,`mo`,`mn`,`ms`,`mtext`]),Ke=X({},Ge),qe=q([`annotation-xml`]),Je=X({},qe),Ye=X({},[`title`,`style`,`font`,`a`,`script`]),Xe=null,Ze=[`application/xhtml+xml`,`text/html`],K=null,Qe=null,$e=n.createElement(`form`),et=function(e){return e instanceof RegExp||e instanceof Function},tt=function(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};if(Qe&&Qe===e)return;(!e||typeof e!=`object`)&&(e={}),e=$t(e),Xe=Ze.indexOf(e.PARSER_MEDIA_TYPE)===-1?`text/html`:e.PARSER_MEDIA_TYPE,K=Xe===`application/xhtml+xml`?Rt:Lt,B=In(e,`ALLOWED_TAGS`,ue,{transform:K}),V=In(e,`ALLOWED_ATTR`,H,{transform:K}),Ue=In(e,`ALLOWED_NAMESPACES`,We,{transform:Rt}),Ie=In(e,`ADD_URI_SAFE_ATTR`,Le,{transform:K,base:Le}),Pe=In(e,`ADD_DATA_URI_TAGS`,Fe,{transform:K,base:Fe}),Me=In(e,`FORBID_CONTENTS`,Ne,{transform:K}),de=In(e,`FORBID_TAGS`,$t({}),{transform:K}),fe=In(e,`FORBID_ATTR`,$t({}),{transform:K}),je=qt(e,`USE_PROFILES`)?e.USE_PROFILES&&typeof e.USE_PROFILES==`object`?$t(e.USE_PROFILES):e.USE_PROFILES:!1,pe=e.ALLOW_ARIA_ATTR!==!1,me=e.ALLOW_DATA_ATTR!==!1,he=e.ALLOW_UNKNOWN_PROTOCOLS||!1,ge=e.ALLOW_SELF_CLOSE_IN_ATTR!==!1,G=e.SAFE_FOR_TEMPLATES||!1,_e=e.SAFE_FOR_XML!==!1,ve=e.WHOLE_DOCUMENT||!1,Ce=e.RETURN_DOM||!1,we=e.RETURN_DOM_FRAGMENT||!1,Te=e.RETURN_TRUSTED_TYPE||!1,Se=e.FORCE_BODY||!1,Ee=e.SANITIZE_DOM!==!1,De=e.SANITIZE_NAMED_PROPS||!1,ke=e.KEEP_CONTENT!==!1,Ae=e.IN_PLACE||!1,le=nn(e.ALLOWED_URI_REGEXP)?e.ALLOWED_URI_REGEXP:bn,Ve=typeof e.NAMESPACE==`string`?e.NAMESPACE:Be,Ke=Ln(e,`MATHML_TEXT_INTEGRATION_POINTS`,()=>X({},Ge)),Je=Ln(e,`HTML_INTEGRATION_POINTS`,()=>X({},qe));let t=Ln(e,`CUSTOM_ELEMENT_HANDLING`,()=>Dt(null));if(U=Dt(null),qt(t,`tagNameCheck`)&&et(t.tagNameCheck)&&(U.tagNameCheck=t.tagNameCheck),qt(t,`attributeNameCheck`)&&et(t.attributeNameCheck)&&(U.attributeNameCheck=t.attributeNameCheck),qt(t,`allowCustomizedBuiltInElements`)&&typeof t.allowCustomizedBuiltInElements==`boolean`&&(U.allowCustomizedBuiltInElements=t.allowCustomizedBuiltInElements),J(U),G&&(me=!1),we&&(Ce=!0),je&&(B=X({},un),V=Dt(null),je.html===!0&&(X(B,rn),X(V,dn)),je.svg===!0&&(X(B,an),X(V,fn),X(V,mn)),je.svgFilters===!0&&(X(B,on),X(V,fn),X(V,mn)),je.mathMl===!0&&(X(B,cn),X(V,pn),X(V,mn))),W.tagCheck=null,W.attributeCheck=null,qt(e,`ADD_TAGS`)&&(typeof e.ADD_TAGS==`function`?W.tagCheck=e.ADD_TAGS:It(e.ADD_TAGS)&&(B===ue&&(B=$t(B)),X(B,e.ADD_TAGS,K))),qt(e,`ADD_ATTR`)&&(typeof e.ADD_ATTR==`function`?W.attributeCheck=e.ADD_ATTR:It(e.ADD_ATTR)&&(V===H&&(V=$t(V)),X(V,e.ADD_ATTR,K))),qt(e,`ADD_FORBID_CONTENTS`)&&It(e.ADD_FORBID_CONTENTS)&&(Me===Ne&&(Me=$t(Me)),X(Me,e.ADD_FORBID_CONTENTS,K)),ke&&(B[`#text`]=!0),ve&&X(B,[`html`,`head`,`body`]),B.table&&(X(B,[`tbody`]),delete de.tbody),e.TRUSTED_TYPES_POLICY){if(typeof e.TRUSTED_TYPES_POLICY.createHTML!=`function`)throw Xt(`TRUSTED_TYPES_POLICY configuration option must provide a "createHTML" hook.`);if(typeof e.TRUSTED_TYPES_POLICY.createScriptURL!=`function`)throw Xt(`TRUSTED_TYPES_POLICY configuration option must provide a "createScriptURL" hook.`);let t=T;T=e.TRUSTED_TYPES_POLICY;try{E=te(``)}catch(e){throw T=t,e}}else e.TRUSTED_TYPES_POLICY===null?(T=void 0,E=``):(T===void 0&&(T=A()),T&&typeof E==`string`&&(E=te(``)));q&&q(e),Qe=e},nt=X({},[...an,...on,...sn]),rt=X({},[...cn,...ln]),it=function(e,t,n){return t.namespaceURI===Be?e===`svg`:t.namespaceURI===Re?e===`svg`&&(n===`annotation-xml`||Ke[n]):!!nt[e]},at=function(e,t,n){return t.namespaceURI===Be?e===`math`:t.namespaceURI===ze?e===`math`&&Je[n]:!!rt[e]},ot=function(e,t,n){return t.namespaceURI===ze&&!Je[n]||t.namespaceURI===Re&&!Ke[n]?!1:!rt[e]&&(Ye[e]||!nt[e])},st=function(e){let t=_(e);(!t||!t.tagName)&&(t={namespaceURI:Ve,tagName:`template`});let n=Lt(e.tagName),r=Lt(t.tagName);return Ue[e.namespaceURI]?e.namespaceURI===ze?it(n,t,r):e.namespaceURI===Re?at(n,t,r):e.namespaceURI===Be?ot(n,t,r):!!(Xe===`application/xhtml+xml`&&Ue[e.namespaceURI]):!1},ct=function(e){Pt(t.removed,{element:e});try{_(e).removeChild(e)}catch{if(p(e),!_(e))throw Xt(`a node selected for removal could not be detached from its tree and cannot be safely returned; refusing to sanitize in place`)}},lt=function(e,t,n){try{m(e,t)}catch{try{e.removeAttribute(n)}catch{}}},ut=function(e){pt(e);let t=g(e);if(t){let e=[];jt(t,t=>{Pt(e,t)}),jt(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`&<(e,r,i)}},dt=function(e,n,r){if(!r)try{r=n.getAttributeNode(e)}catch{r=null}Pt(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(Ce||we)try{ct(n)}catch{}else try{n.setAttribute(e,``)}catch{}}},ft=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`||V[K(i)]||lt(e,r,i)}},pt=function(e){let t=[e];for(;t.length>0;){let e=t.pop();C(e)===kn.element&&ft(e);let n=g(e);if(n)for(let e=n.length-1;e>=0;--e)t.push(n[e])}},mt=function(e,t){return _e?e===`patchsrc`||e===`for`&&t!==`label`&&t!==`output`:!1},ht=function(e){if(!_e)return;let t=[e];for(;t.length>0;){let e=t.pop(),n=C(e);if(n===kn.processingInstruction||n===kn.comment&&Yt(En,e.data)){try{p(e)}catch{}continue}if(n===kn.element){let t=e,n=K(w(e));try{t.hasAttribute&&t.hasAttribute(`patchsrc`)&&t.removeAttribute(`patchsrc`),t.hasAttribute&&t.hasAttribute(`for`)&&mt(`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])}},gt=function(e){let t=null,r=null;if(Se)e=``+e;else{let t=zt(e,/^[\r\n\t ]+/);r=t&&t[0]}Xe===`application/xhtml+xml`&&Ve===Be&&(e=``+e+``);let i=T?te(e):e;if(Ve===Be)try{t=new l().parseFromString(i,Xe)}catch{}if(!t||!t.documentElement){t=M.createDocument(Ve,`template`,null);try{t.documentElement.innerHTML=He?E:i}catch{}}let a=t.body||t.documentElement;return e&&r&&a.insertBefore(n.createTextNode(r),a.childNodes[0]||null),Ve===Be?P.call(t,ve?`html`:`body`)[0]:ve?t.documentElement:a},_t=function(e){let t=S?S(e):e.ownerDocument;return re.call(t||e,e,c.SHOW_ELEMENT|c.SHOW_COMMENT|c.SHOW_TEXT|c.SHOW_PROCESSING_INSTRUCTION|c.SHOW_CDATA_SECTION,null)},vt=function(e){return e=Bt(e,L,` `),e=Bt(e,ie,` `),e=Bt(e,R,` `),e},yt=function(e){e.normalize();let t=S?S(e):e.ownerDocument,n=re.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=vt(r.data),r=n.nextNode();let i=e.querySelectorAll?.call(e,`template`);i&&jt(i,e=>{xt(e.content)&&yt(e.content)})},bt=function(e){let t=x?x(e):null;return typeof t!=`string`||K(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)===kn.documentFragment}catch{return!1}},Ct=function(e){if(!b||typeof e!=`object`||!e)return!1;try{return typeof b(e)==`number`}catch{return!1}};function wt(e,n,r){e.length!==0&&jt(e,e=>{e.call(t,n,r,Qe)})}let Tt=function(e,t){return!!(_e&&e.hasChildNodes()&&!Ct(e.firstElementChild)&&Yt(Tn,e.textContent)&&Yt(Tn,e.innerHTML)||_e&&e.namespaceURI===Be&&jn[t]&&(Ct(e.firstElementChild)||typeof e.textContent==`string`&&Yt(Mn[t],e.textContent))||e.nodeType===kn.processingInstruction||_e&&e.nodeType===kn.comment&&Yt(En,e.data))},Et=function(e,t){return e instanceof RegExp?Yt(e,t):e instanceof Function&&!!e(t,...[...arguments].slice(2))},Ot=function(e,t,n){if(!de[t]&&Kt(t)&&Et(U.tagNameCheck,t))return!1;if(ke&&!Me[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 ct(e),!0},kt=function(e,t,n,r){return e.length===0?t:t===n||t===r?$t(t):t},At=function(e,t){return e===t||_(e)!==null?!1:(Ae&&pt(e),!0)},Ut=function(e,n){if(wt(I.beforeSanitizeElements,e,null),At(e,n))return!0;if(bt(e))return ct(e),!0;let r=K(w(e));if(B=kt(I.uponSanitizeElement,B,ue,be),wt(I.uponSanitizeElement,e,{tagName:r,allowedTags:B}),At(e,n))return!0;if(Tt(e,r))return ct(e),!0;if(de[r]||!(W.tagCheck instanceof Function&&W.tagCheck(r))&&!B[r]){let t=Ot(e,r,n);return t===!1&&(wt(I.afterSanitizeElements,e,null),At(e,n))?!0:t}if(C(e)===kn.element&&!st(e)||(r===`noscript`||r===`noembed`||r===`noframes`)&&Yt(Dn,e.innerHTML))return ct(e),!0;if(G&&e.nodeType===kn.text){let n=vt(e.textContent);e.textContent!==n&&(Pt(t.removed,{element:e.cloneNode()}),e.textContent=n)}return wt(I.afterSanitizeElements,e,null),At(e,n)},Wt=function(e,t,r){if(fe[t]||mt(t,e)||Ee&&(t===`id`||t===`name`)&&(r in n||r in $e))return!1;let i=V[t]||W.attributeCheck instanceof Function&&W.attributeCheck(t,e);return me&&Yt(ae,t)||pe&&Yt(oe,t)?!0:i?Ie[t]||Yt(le,Bt(r,se,``))||(t===`src`||t===`xlink:href`||t===`href`)&&e!==`script`&&Vt(r,`data:`)===0&&Pe[e]||he&&!Yt(z,Bt(r,se,``))?!0:!r:Kt(e)&&Et(U.tagNameCheck,e)&&Et(U.attributeNameCheck,t,e)||t===`is`&&U.allowCustomizedBuiltInElements&&Et(U.tagNameCheck,r)},Gt=X({},[`annotation-xml`,`color-profile`,`font-face`,`font-face-format`,`font-face-name`,`font-face-src`,`font-face-uri`,`missing-glyph`]),Kt=function(e){return!Gt[Lt(e)]&&Yt(ce,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 te(r);case`TrustedScriptURL`:return ne(r)}return r},Y=function(e,t,n,r){try{return n?e.setAttributeNS(n,t,r):e.setAttribute(t,r),!bt(e)||(ct(e),!1)}catch{return dt(t,e),!1}},Zt=function(e,n){if(wt(I.beforeSanitizeAttributes,e,null),At(e,n))return;let r=e.attributes;if(!r||bt(e))return;V=kt(I.uponSanitizeAttribute,V,H,xe);let i={attrName:``,attrValue:``,keepAttr:!0,allowedAttributes:V,forceKeepAttr:void 0},a=r.length,o=K(e.nodeName);for(;a--;){let n=r[a],s=n.name,c=n.namespaceURI,l=n.value,u=K(s),d=l,f=s===`value`?d:Ht(d),p=!1;if(i.attrName=u,i.attrValue=f,i.keepAttr=!0,i.forceKeepAttr=void 0,wt(I.uponSanitizeAttribute,e,i),f=i.attrValue,De&&(u===`id`||u===`name`)&&Vt(f,Oe)!==0&&(dt(s,e,n),f=Oe+f,p=!0),_e&&Yt(/((--!?|])>)|<\/(style|script|title|xmp|textarea|noscript|iframe|noembed|noframes)/i,f)){dt(s,e,n);continue}if(u===`attributename`&&zt(f,`href`)){dt(s,e,n);continue}if(!i.forceKeepAttr){if(!i.keepAttr){dt(s,e,n);continue}if(!ge&&Yt(On,f)){dt(s,e,n);continue}if(G&&(f=vt(f)),!Wt(o,u,f)){dt(s,e,n);continue}f=Jt(o,u,c,f),f!==d&&Y(e,s,c,f)&&p&&Nt(t.removed)}}wt(I.afterSanitizeAttributes,e,null),At(e,n)},Qt=function(e){let t=null,n=_t(e);for(wt(I.beforeSanitizeShadowDOM,e,null);t=n.nextNode();)if(wt(I.uponSanitizeShadowNode,t,null),Ut(t,e),Zt(t,e),xt(t.content)&&Qt(t.content),C(t)===kn.element){let e=v(t);xt(e)&&(An(e),Qt(e))}wt(I.afterSanitizeShadowDOM,e,null)},An=function(e){let t=[{node:e,shadow:null}];for(;t.length>0;){let e=t.pop();if(e.shadow){Qt(e.shadow);continue}let n=e.node,r=C(n)===kn.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`&&K(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(He=!e,He&&(e=``),typeof e!=`string`&&!Ct(e)&&(e=en(e),typeof e!=`string`))throw Xt(`dirty is not a string, aborting`);if(!t.isSupported)return e;ye?(B=be,V=xe):tt(n),(I.uponSanitizeElement.length>0||I.uponSanitizeAttribute.length>0)&&(B=$t(B)),I.uponSanitizeAttribute.length>0&&(V=$t(V)),t.removed=[];let c=Ae&&typeof e!=`string`&&Ct(e);if(c){ht(e);let t=w(e);if(typeof t==`string`){let n=K(t);if(!B[n]||de[n])throw ut(e),Xt(`root node is forbidden and cannot be sanitized in-place`)}if(bt(e))throw ut(e),Xt(`root node is clobbered and cannot be sanitized in-place`);try{An(e)}catch(t){throw ut(e),t}}else if(Ct(e))i=gt(``),a=i.ownerDocument.importNode(e,!0),a.nodeType===kn.element&&a.nodeName===`BODY`||a.nodeName===`HTML`?i=a:i.appendChild(a),An(i);else{if(!Ce&&!G&&!ve&&e.indexOf(`<`)===-1)return T&&Te?te(e):e;if(i=gt(e),!i)return Ce?null:Te?E:``}i&&Se&&ct(i.firstChild);let l=c?e:i;try{let e=_t(l);for(;o=e.nextNode();)Ut(o,l),Zt(o,l),xt(o.content)&&Qt(o.content)}catch(n){throw c&&(ut(e),jt(t.removed,e=>{e.element&&pt(e.element)})),n}if(c){let n=!1;if(jt(t.removed,t=>{t.element&&(t.element===e&&(n=!0),pt(t.element))}),n)throw Xt(`a node selected for removal could not be safely returned; refusing to sanitize in place`);return G&&yt(e),e}if(Ce){if(G&&yt(i),we)for(s=N.call(i.ownerDocument);i.firstChild;)s.appendChild(i.firstChild);else s=i;return(V.shadowroot||V.shadowrootmode)&&(s=F.call(r,s,!0)),s}let u=ve?i.outerHTML:i.innerHTML;return ve&&B[`!doctype`]&&i.ownerDocument&&i.ownerDocument.doctype&&i.ownerDocument.doctype.name&&Yt(Cn,i.ownerDocument.doctype.name)&&(u=` +`+u),G&&(u=vt(u)),T&&Te?te(u):u},t.setConfig=function(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};tt(e),ye=!0,be=B,xe=V},t.clearConfig=function(){Qe=null,ye=!1,be=null,xe=null,T=D,E=``},t.isValidAttribute=function(e,t,n){Qe||tt({});let r=K(e),i=K(t);return Wt(r,i,n)},t.addHook=function(e,t){typeof t==`function`&&qt(I,e)&&Pt(I[e],t)},t.removeHook=function(e,t){if(qt(I,e)){if(t!==void 0){let n=Mt(I[e],t);return n===-1?void 0:Ft(I[e],n,1)[0]}return Nt(I[e])}},t.removeHooks=function(e){qt(I,e)&&(I[e]=[])},t.removeAllHooks=function(){I=Fn()},t}var zn=Rn(),Bn=2097152,Vn=67108864,Hn=25165824,Un={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`},Wn=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`]),Gn=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`]),Kn=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 qn(e){let t=e.toLowerCase().split(/[\\/]/).pop()||``,n=t.lastIndexOf(`.`);return n>0?t.slice(n+1):``}function Jn(e){return(e.content_type||``).split(`;`,1)[0].trim().toLowerCase()}function Yn(e){let t=qn(e.filename),n=Jn(e);return t===`docx`||n===`application/vnd.openxmlformats-officedocument.wordprocessingml.document`?`docx`:[`xlsx`,`xlsm`,`xltx`,`xltm`].includes(t)||Gn.has(n)?`spreadsheet`:[`pptx`,`pptm`,`potx`,`potm`,`ppsx`,`ppsm`].includes(t)||Kn.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`:Un[t]||Wn.has(n)?`code`:t===`txt`||t===`log`||n===`text/plain`||n.startsWith(`text/`)?`text`:`unsupported`}function Xn(e){let t=qn(e.filename);if(Un[t])return Un[t];let n=Jn(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 Zn(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 Qn(e){if(e===`pdf`)return Vn;if(e===`spreadsheet`||e===`presentation`)return Hn;if(e===`code`||e===`text`||e===`markdown`||e===`html`)return Bn}function $n(){return{async:!1,breaks:!1,extensions:null,gfm:!0,hooks:null,pedantic:!1,renderer:null,silent:!1,tokenizer:null,walkTokens:null}}var er=$n();function tr(e){er=e}var nr={exec:()=>null};function rr(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 ir=((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,numericCharacterReference:/&#(?:(\d{1,7})|[Xx]([A-Fa-f0-9]{1,6}));/g,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:rr(e=>RegExp(`^ {0,${e}}(?:[*+-]|\\d{1,9}[.)])((?:[ ][^\\n]*)?(?:\\n|$))`)),hrRegex:rr(e=>RegExp(`^ {0,${e}}((?:-[ ]*){3,}|(?:_[ ]*){3,}|(?:\\*[ ]*){3,})(?:\\n+|$)`)),fencesBeginRegex:rr(e=>RegExp(`^ {0,${e}}(?:\`\`\`|~~~)`)),headingBeginRegex:rr(e=>RegExp(`^ {0,${e}}#`)),htmlBeginRegex:rr(e=>RegExp(`^ {0,${e}}(?:)|<(?:script|pre|style|textarea|!--))`,`i`)),blockquoteBeginRegex:rr(e=>RegExp(`^ {0,${e}}>`))},ar=/^(?:[ \t]*(?:\n|$))+/,or=/^((?: {4}| {0,3}\t)[^\n]+(?:\n(?:[ \t]*(?:\n|$))*)?)+/,sr=/^ {0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?: {0,3}\1[~`]* *(?=\n|$)|$)/,cr=/^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/,lr=/^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/,ur=/ {0,3}(?:[*+-]|\d{1,9}[.)])/,dr=/^(?!bull |blockCode|fences|blockquote|heading|html|table)((?:.|\n(?!\s*?\n|bull |fences|blockquote|heading|hr|html|table))+?)\n {0,3}(=+|-+) *(?:\n+|$)/,fr=Z(dr).replace(/bull/g,ur).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(/hr/g,/ {0,3}(?:(?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).replace(/\|table/g,``).getRegex(),pr=Z(dr).replace(/bull/g,ur).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(/hr/g,/ {0,3}(?:(?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).replace(/table/g,/ {0,3}\|?(?:[:\- ]*\|)+[\:\- ]*\n/).getRegex(),mr=/^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table|[ \t]+\n)[^\n]+)*)/,hr=/^[^\n]+/,gr=/(?!\s*\])(?:\\[\s\S]|[^\[\]\\])+/,_r=Z(/^ {0,3}\[(label)\]: *(?:\n[ \t]*)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n[ \t]*)?| *\n[ \t]*)(title))? *(?:\n+|$)/).replace(`label`,gr).replace(`title`,/(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/).getRegex(),vr=Z(/^(bull)([ \t][^\n]*?)?(?:\n|$)/).replace(/bull/g,ur).getRegex(),yr=`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`,br=/|$))/,xr=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`,br).replace(`tag`,yr).replace(`attribute`,/ +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(),Sr=e=>Z(mr).replace(`hr`,cr).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`,yr).getRegex(),Cr=Sr(/ {0,3}(?:[*+-]|1[.)])[ \t]+[^ \t\n]/),wr=Sr(/ {0,3}(?:[*+-]|\d{1,9}[.)])(?:[ \t]|\n|$)/),Tr={blockquote:Z(/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/).replace(`paragraph`,wr).getRegex(),code:or,def:_r,fences:sr,heading:lr,hr:cr,html:xr,lheading:fr,list:vr,newline:ar,paragraph:Cr,table:nr,text:hr},Er=Z(`^ *([^\\n ].*)\\n {0,3}((?:\\| *)?:?-+:? *(?:\\| *:?-+:? *)*(?:\\| *)?)(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)`).replace(`hr`,cr).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`,yr).getRegex(),Dr={...Tr,lheading:pr,table:Er,paragraph:Z(mr).replace(`hr`,cr).replace(`heading`,` {0,3}#{1,6}(?:\\s|$)`).replace(`|lheading`,``).replace(`table`,Er).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`,yr).getRegex()},Or={...Tr,html:Z(`^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+? *(?:\\n{2,}|\\s*$)|\\s]*)*?/?> *(?:\\n{2,}|\\s*$))`).replace(`comment`,br).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:nr,lheading:/^(.+?)\n {0,3}(=+|-+) *(?:\n+|$)/,paragraph:Z(mr).replace(`hr`,cr).replace(`heading`,` *#{1,6} *[^ +]`).replace(`lheading`,fr).replace(`|table`,``).replace(`blockquote`,` {0,3}>`).replace(`|fences`,``).replace(`|list`,``).replace(`|html`,``).replace(`|tag`,``).getRegex()},kr=/^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,Ar=/^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,jr=/^( {2,}|\\)\n(?!\s*$)[ \t]*/,Mr=/^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\`+)[^`]+\k(?!`))*?\]\((?:\\[\s\S]|[^\\\(\)]|\((?:\\[\s\S]|[^\\\(\)])*\))*\)/).replace(`precode-`,ir?"(?`+)[^`]+\k(?!`)/).replace(`html`,/<(?! )[^<>]*?>/).getRegex(),Hr=/^(?:\*+(?:((?!\*)punct)|([^\s*]))?)|^_+(?:((?!_)punct)|([^\s_]))?/,Ur=Z(Hr,`u`).replace(/punct/g,Nr).getRegex(),Wr=Z(Hr,`u`).replace(/punct/g,Rr).getRegex(),Gr=Z(/^(?:\*+(?:((?!\*)(?!openQuote)punct)|([^\s*]))?)|^_+(?:((?!_)(?!openQuote)punct)|([^\s_]))?/,`u`).replace(/openQuote/g,Lr).replace(/punct/g,Nr).getRegex(),Kr=`^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\*)punct(\\*+)(?=[\\s]|$)|notPunctSpace(\\*+)(?!\\*)(?=punctSpace|$)|(?!\\*)punctSpace(\\*+)(?=notPunctSpace)|[\\s](\\*+)(?!\\*)(?=punct)|(?!\\*)punct(\\*+)(?!\\*)(?=punct)|notPunctSpace(\\*+)(?=notPunctSpace)`,qr=Z(Kr,`gu`).replace(/notPunctSpace/g,Fr).replace(/punctSpace/g,Pr).replace(/punct/g,Nr).getRegex(),Jr=Z(Kr,`gu`).replace(/notPunctSpace/g,Br).replace(/punctSpace/g,zr).replace(/punct/g,Rr).getRegex(),Yr=Z(`^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\*)punct(\\*+)(?=[\\s]|$)|notPunctSpace(\\*+)(?!\\*)(?=punctSpace|$)|(?!\\*)[\\s](\\*+)(?=notPunctSpace)|[\\s](\\*+)(?!\\*)(?=punct)|(?!\\*)punct(\\*+)(?!\\*)(?=punct)|(?:(?!\\*)punct|notPunctSpace)(\\*+)(?!\\*)(?=notPunctSpace)`,`gu`).replace(/notPunctSpace/g,Fr).replace(/punctSpace/g,Pr).replace(/punct/g,Nr).getRegex(),Xr=Z(`^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)punctSpace(_+)(?=notPunctSpace)|[\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)`,`gu`).replace(/notPunctSpace/g,Fr).replace(/punctSpace/g,Pr).replace(/punct/g,Nr).getRegex(),Zr=Z(`^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)[\\s](_+)(?=notPunctSpace)|[\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)|(?:(?!_)punct|notPunctSpace)(_+)(?!_)(?=notPunctSpace)`,`gu`).replace(/notPunctSpace/g,Fr).replace(/punctSpace/g,Pr).replace(/punct/g,Nr).getRegex(),Qr=Z(/^~~?(?:((?!~)punct)|[^\s~])/,`u`).replace(/punct/g,Nr).getRegex(),$r=Z(`^[^~]+(?=[^~])|(?!~)punct(~~?)(?=[\\s]|$)|notPunctSpace(~~?)(?!~)(?=punctSpace|$)|(?!~)punctSpace(~~?)(?=notPunctSpace)|[\\s](~~?)(?!~)(?=punct)|(?!~)punct(~~?)(?!~)(?=punct)|notPunctSpace(~~?)(?=notPunctSpace)`,`gu`).replace(/notPunctSpace/g,Fr).replace(/punctSpace/g,Pr).replace(/punct/g,Nr).getRegex(),ei=Z(/\\(punct)/,`gu`).replace(/punct/g,Nr).getRegex(),ti=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(),ni=Z(br).replace(`(?:-->|$)`,`-->`).getRegex(),ri=Z(`^comment|^|^<[a-zA-Z][a-zA-Z0-9-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^|^`).replace(`comment`,ni).replace(`attribute`,/\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/).getRegex(),ii=/\[(?:\\[\s\S]|[^\[\]\\])*\]/,ai=Z(/(?:\[(?:brackets|\\[\s\S]|[^\[\]\\])*\]|\\[\s\S]|`+(?!`)[^`]*?`+(?!`)|``+(?=\])|[^\[\]\\`])*?/).replace(`brackets`,ii).getRegex(),oi=Z(/^!?\[(label)\]\([ \t\n]*(href)(?:(?:[ \t]+(?:\n[ \t]*)?|\n[ \t]*)(title))?[ \t\n]*\)/).replace(`label`,ai).replace(`href`,/<(?:\\.|[^\n<>\\])+>|[^ \t\n\x00-\x1f]+|(?=\))/).replace(`title`,/"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/).getRegex(),si=Z(/^!?\[(label)\]\[(ref)\]/).replace(`label`,ai).replace(`ref`,gr).getRegex(),ci=Z(/^!?\[(ref)\](?:\[\])?/).replace(`ref`,gr).getRegex(),li=/(?!\s*\])(?:\\[\s\S]|[^\[\]\\]){1,999}/,ui=Z(/(?:[^\[\]\\`]*(?:\[(?:brackets|\\[\s\S]|[^\[\]\\])*\]|\\[\s\S]|`+(?!`)[^`]*?`+(?!`)|``+(?=\]))){0,999}?[^\[\]\\`]*?/).replace(`brackets`,ii).getRegex(),di=Z(`reflink|nolink(?!\\()`,`g`).replace(`reflink`,Z(/^!?\[(label)\]\[(ref)\]/).replace(`label`,ui).replace(`ref`,li).getRegex()).replace(`nolink`,Z(/^!?\[(ref)\](?:\[\])?/).replace(`ref`,li).getRegex()).getRegex(),fi=/[hH][tT][tT][pP][sS]?|[fF][tT][pP]/,pi=Z(/(?:mailto:email|xmpp:email(?:\/[A-Za-z0-9@.]+)?)/).replace(/email/g,/[A-Za-z0-9._+-]+@[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![\w-])/).getRegex(),mi={_backpedal:nr,anyPunctuation:ei,autolink:ti,blockSkip:Vr,br:jr,code:Ar,del:nr,delLDelim:nr,delRDelim:nr,emStrongLDelim:Ur,emStrongRDelimAst:qr,emStrongRDelimUnd:Xr,escape:kr,link:oi,nolink:ci,punctuation:Ir,reflink:si,reflinkSearch:di,tag:ri,text:Mr,url:nr},hi={...mi,emStrongLDelim:Gr,emStrongRDelimAst:Yr,emStrongRDelimUnd:Zr,link:Z(/^!?\[(label)\]\((.*?)\)/).replace(`label`,ai).getRegex(),reflink:Z(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace(`label`,ai).getRegex()},gi={...mi,emStrongRDelimAst:Jr,emStrongLDelim:Wr,delLDelim:Qr,delRDelim:$r,url:Z(/^emailProtocol|^((?:protocol):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/).replace(`emailProtocol`,pi).replace(`protocol`,fi).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(/^(?:[^a-zA-Z0-9](?=emailProtocol)|(`+|~+|[^`~])(?:(?=[`~])|(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\":`>`,'"':`"`,"'":`'`},xi=e=>bi[e];function Si(e,t){if(t){if(Q.escapeTest.test(e))return e.replace(Q.escapeReplace,xi)}else if(Q.escapeTestNoEncode.test(e))return e.replace(Q.escapeReplaceNoEncode,xi);return e}function Ci(e){return e.replace(Q.numericCharacterReference,(e,t,n)=>{let r=t===void 0?Number.parseInt(n,16):Number.parseInt(t,10);return r===0||r>1114111||r>=55296&&r<=57343?`�`:String.fromCodePoint(r)})}function wi(e){try{e=encodeURI(e).replace(Q.percentDecode,`%`)}catch{return null}return e}function Ti(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 Oi(e){return e.trim().toLowerCase().toUpperCase().toLowerCase()}function ki(e,t){if(e.indexOf(t[0])===-1&&e.indexOf(t[1])===-1)return-1;let n=0;for(let r=0;r0?-2:-1}function Ai(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 ji(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 Mi(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(` +`)}function Ni(e,t,n,r){if(!t.includes(`<`))return!1;for(let i=0;it.length-i)return!0;i+=o[0].length-1}}return!1}var Pi=class{options;rules;lexer;constructor(e){this.options=e||er}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]:Di(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=Mi(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=Ei(e,`#`);(this.options.pedantic||!t||this.rules.other.endingSpaceTabChar.test(t))&&(e=t.trim())}return{type:`heading`,raw:Ei(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:Ei(t[0],` +`)}}blockquote(e){let t=this.rules.block.blockquote.exec(e);if(t){let e=Ei(t[0],` +`).split(` +`),n=``,r=``,i=[];for(;e.length>0;){let t=!1,a=[],o=0;for(;o0&&(n=`${n} +${d.join(` +`)}`),r=r.substring(0,r.length-t.text.length)+s.text;break}if(u?.type===`list`){let t=u,a=t.raw+` +`+e.join(` +`),o=this.list(a);i[i.length-1]=o,n=n.substring(0,n.length-u.raw.length)+o.raw,r=r.substring(0,r.length-t.raw.length)+o.raw,e=a.substring(i.at(-1).raw.length).split(` +`);continue}}return{type:`blockquote`,raw:n,tokens:i,text:r}}}list(e){let t=this.rules.block.list.exec(e);if(t){let n=t[1].trim(),r=n.length>1,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=t[2].split(` +`,1)[0],l=t[1].length,u=this.options.pedantic?Ai(c,l):c.replace(this.rules.other.leadingSpaceTab,e=>Ai(e,l)),d=e.split(` +`,1)[0],f=!u.trim(),p=0;if(this.options.pedantic?(p=2,s=u.trimStart()):f?p=l+1:(p=u.search(this.rules.other.nonSpaceChar),p=p>4?1:p,s=u.slice(p),p+=l),f&&this.rules.other.blankLine.test(d)&&(r+=d+` +`,e=e.substring(d.length+1),n=!0),!n){let t=this.rules.other.nextBulletRegex(p),n=this.rules.other.hrRegex(p),i=this.rules.other.fencesBeginRegex(p),a=this.rules.other.headingBeginRegex(p),o=this.rules.other.htmlBeginRegex(p),c=this.rules.other.blockquoteBeginRegex(p);for(;e;){let l=e.split(` +`,1)[0],m;if(d=l,this.options.pedantic?(d=d.replace(this.rules.other.listReplaceNesting,` `),m=d):m=d.replace(this.rules.other.leadingSpaceTab,e=>e.replace(this.rules.other.tabCharGlobal,` `)),i.test(d)||a.test(d)||o.test(d)||c.test(d)||t.test(d)||n.test(d))break;if(m.search(this.rules.other.nonSpaceChar)>=p||!d.trim())s+=` +`+m.slice(p);else{if(f||u.replace(this.rules.other.tabCharGlobal,` `).search(this.rules.other.nonSpaceChar)>=4||i.test(u)||a.test(u)||n.test(u))break;s+=` +`+d}f=!d.trim(),r+=l+` +`,e=e.substring(l.length+1),u=m.slice(p)}}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=Di(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){if(!this.rules.other.startAngleBracket.test(t[2])&&ki(t[2],`()`)!==-1)return;let e=Oi(t[1]).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:Ei(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=Ti(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:Ei(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:Ei(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){if(this.lexer.state.linkParenPossible===!1)return;let t=this.rules.inline.link.exec(e);if(t){let n=t[0].charAt(0)===`!`?2:1;if(!this.options.pedantic&&Ni(e,t[1],n,this.rules))return;let r=t[2].trim();if(!this.options.pedantic&&this.rules.other.startAngleBracket.test(r)){if(!this.rules.other.endAngleBracket.test(r))return;let e=Ei(r.slice(0,-1),`\\`);if((r.length-e.length)%2==0)return}else{let e=ki(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 i=t[2],a=``;if(this.options.pedantic){let e=this.rules.other.pedanticHrefTitle.exec(i);e&&(i=e[1],a=e[3])}else a=t[3]?t[3].slice(1,-1):``;return i=i.trim(),this.rules.other.startAngleBracket.test(i)&&(i=this.options.pedantic&&!this.rules.other.endAngleBracket.test(r)?i.slice(1):i.slice(1,-1)),ji(t,{href:i&&i.replace(this.rules.inline.anyPunctuation,`$1`),title:a&&a.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 r=n[0].charAt(0)===`!`?2:1;if(!this.options.pedantic&&Ni(e,n[1],r,this.rules))return;let i=t[Oi((n[2]||n[1]).replace(this.rules.other.multipleSpaceGlobal,` `))];if(!i){let e=n[0].charAt(0);return{type:`text`,raw:e,text:e}}return ji(n,i,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:e?t[0]:Ci(t[0]),escaped:e}}}},Fi=class e{tokens;options;state;inlineQueue;tokenizer;constructor(e){this.tokens=[],this.tokens.links=Object.create(null),this.options=e||er,this.options.tokenizer=this.options.tokenizer||new Pi,this.tokenizer=this.options.tokenizer,this.tokenizer.options=this.options,this.tokenizer.lexer=this,this.inlineQueue=[],this.state={inLink:!1,inRawBlock:!1,linkEmitted:!1,linkParenPossible:!0,top:!0};let t={other:Q,block:vi.normal,inline:yi.normal};this.options.pedantic?(t.block=vi.pedantic,t.inline=yi.pedantic):this.options.gfm&&(t.block=vi.gfm,t.inline=this.options.breaks?yi.breaks:yi.gfm),this.tokenizer.rules=t}static get rules(){return{block:vi,inline:yi}}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,Oi(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=this.state.linkParenPossible;this.state.linkParenPossible=n&&e.includes(`)`);try{return this.#e(e,t)}finally{this.state.linkParenPossible=n}}#e(e,t){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,Oi(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)}},Ii=class{options;parser;constructor(e){this.options=e||er}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:Si(i,!0))+`
+`:`
`+(n?i:Si(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`${Si(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?Si(n,!0):this.parser.parseInline(r),o=wi(e);if(o===null)return a;e=Si(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=wi(e);if(i===null)return Si(n);e=i;let a=`${Si(n)}`,a}text(e){return`tokens`in e&&e.tokens?this.parser.parseInline(e.tokens):`escaped`in e&&e.escaped?e.text:Si(e.text)}},Li=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}},Ri=class e{options;renderer;textRenderer;constructor(e){this.options=e||er,this.options.renderer=this.options.renderer||new Ii,this.renderer=this.options.renderer,this.renderer.options=this.options,this.renderer.parser=this,this.textRenderer=new Li}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 Ii(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 Pi(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 zi;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]=zi.passThroughHooks.has(n)?e=>{if(this.defaults.async&&zi.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 Fi.lex(e,t??this.defaults)}parser(e,t){return Ri.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?Fi.lex:Fi.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?Ri.parse:Ri.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?Fi.lex:Fi.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?Ri.parse:Ri.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:

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

    `),wa=I(` `,1),Ta=I(``),Ea=I(``),Da=I(``);function Oa(e,t){a(t,!0);let i=b(t,`canReact`,3,!1),o=b(t,`canReply`,3,!1),d=b(t,`showOpenThread`,3,!0),f=b(t,`canOpenThread`,3,!1),p=b(t,`canEdit`,3,!1),_=b(t,`canPin`,3,!1),v=b(t,`pinned`,3,!1),x=b(t,`pinning`,3,!1),S=b(t,`pinError`,3,``),T=b(t,`canDelete`,3,!1),E=b(t,`deleting`,3,!1),O=b(t,`copyStatus`,3,``),re=b(t,`canCopyLink`,3,!1),P=b(t,`copyLinkStatus`,3,``),I=F(void 0),L=F(void 0),ie=!0,R=new Set;function ae(e){if(e.key===`Escape`){e.preventDefault(),e.stopPropagation(),t.onClose();return}if(e.key!==`Tab`||!y(L))return;let n=[...y(L).querySelectorAll(`a[href], button:not([disabled]), [tabindex]:not([tabindex="-1"])`)].filter(e=>!e.inert&&e.getClientRects().length>0);if(n.length===0){e.preventDefault(),y(L).focus();return}let r=n[0],i=n[n.length-1];e.shiftKey&&(document.activeElement===r||!y(L).contains(document.activeElement))?(e.preventDefault(),i.focus()):!e.shiftKey&&(document.activeElement===i||!y(L).contains(document.activeElement))&&(e.preventDefault(),r.focus())}function oe(e,t=!1){ie=t,e()}A(()=>{let e=y(I)?.parentElement;if(e)for(let t of e.children)t instanceof HTMLElement&&t!==y(I)&&!t.inert&&(t.inert=!0,R.add(t));y(L)?.querySelector(`button:not(:disabled)`)?.focus({preventScroll:!0})}),te(()=>{for(let e of R)e.inert=!1;R.clear(),ie&&t.returnFocus?.isConnected&&t.returnFocus.focus({preventScroll:!0})});var z=Da(),se=C(z),ce=D(se,2),le=D(C(ce),2);ee(le,21,()=>sa,l,(e,n)=>{var r=va(),a=k(r,!0);j(()=>{w(r,`aria-label`,`React with ${y(n)}`),r.disabled=!i(),s(a,y(n))}),g(`click`,r,()=>oe(()=>t.onReact(y(n)),!0)),c(e,r)}),n(le);var B=D(le,2),ue=C(B),V=e=>{var n=ya();j(()=>n.disabled=!f()),g(`click`,n,()=>oe(t.onOpenThread)),c(e,n)};u(ue,e=>{d()&&e(V)});var H=D(ue,2),U=D(H,2),de=D(C(U),2),fe=e=>{var t=ba();let n;var i=k(t,!0);j(()=>{n=r(t,1,`sheet-copy-status`,null,n,{"is-error":O()===`failed`}),s(i,O()===`copied`?`Copied`:`Couldn't copy`)}),c(e,t)};u(de,e=>{O()&&e(fe)}),n(U);var W=D(U,2),pe=e=>{var r=Sa(),i=D(C(r)),a=D(i),o=e=>{var t=xa();c(e,t)};u(a,e=>{P()===`failed`&&e(o)}),n(r),j(()=>{r.disabled=P()===`pending`,s(i,` ${P()===`pending`?`Creating link…`:`Copy link`} `)}),g(`click`,r,function(...e){t.onCopyLink?.apply(this,e)}),c(e,r)};u(W,e=>{re()&&t.onCopyLink&&e(pe)});var me=D(W,2),he=e=>{var r=wa(),i=ne(r),a=D(C(i));n(i);var o=D(i,2),l=e=>{var t=Ca(),n=k(t,!0);j(()=>s(n,S())),c(e,t)};u(o,e=>{S()&&e(l)}),j(()=>{i.disabled=x(),s(a,` ${v()?`Unpin message`:`Pin message`}`)}),g(`click`,i,function(...e){t.onTogglePin?.apply(this,e)}),c(e,r)};u(me,e=>{_()&&t.onTogglePin&&e(he)});var ge=D(me,2),G=e=>{var n=Ta();g(`click`,n,()=>oe(t.onEdit)),c(e,n)};u(ge,e=>{p()&&e(G)});var _e=D(ge,2),ve=e=>{var n=Ea();j(()=>n.disabled=E()),g(`click`,n,()=>oe(t.onDelete)),c(e,n)};u(_e,e=>{T()&&e(ve)}),n(B),n(ce),M(ce,e=>N(L,e),()=>y(L)),n(z),M(z,e=>N(I,e),()=>y(I)),m(z,e=>_a?.(e)),j(()=>{w(ce,`id`,t.id),H.disabled=!o()}),g(`keydown`,z,ae),g(`click`,se,function(...e){t.onClose?.apply(this,e)}),g(`click`,H,()=>oe(t.onReply)),g(`click`,U,function(...e){t.onCopy?.apply(this,e)}),c(e,z),h()}o([`keydown`,`click`]);var ka=I(``);function Aa(e,t){a(t,!0);let r=F(void 0),i=F(void 0),o=new Set;function s(e){e.key===`Escape`&&(e.preventDefault(),t.onClose())}function l(){y(i)?.focus({preventScroll:!0}),y(i)?.select()}A(()=>{let e=y(r)?.parentElement;if(e)for(let t of e.children)t instanceof HTMLElement&&t!==y(r)&&!t.inert&&(t.inert=!0,o.add(t));l()}),te(()=>{for(let e of o)e.inert=!1;o.clear(),t.returnFocus?.isConnected&&t.returnFocus.focus({preventScroll:!0})});var u=ka(),d=C(u),f=D(d,2),p=D(C(f),4);E(p),M(p,e=>N(i,e),()=>y(i));var _=D(p,2);n(f),n(u),M(u,e=>N(r,e),()=>y(r)),m(u,e=>_a?.(e)),j(()=>re(p,t.url)),g(`keydown`,u,s),g(`click`,d,function(...e){t.onClose?.apply(this,e)}),g(`click`,p,l),g(`click`,_,function(...e){t.onClose?.apply(this,e)}),c(e,u),h()}o([`keydown`,`click`]);function ja(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 Ma=I(`
    `),Na=I(``),Pa=I(` `,1),Fa=I(`
    `,2),Ia=I(`
    `),La=I(`
    `),Ra=I(` `);function za(e,t){a(t,!0);let i=b(t,`onOpenImage`,3,()=>{}),o=b(t,`onOpenArtifact`,3,()=>{}),l=F(null),m=F(!1),_=F(``),x=p(()=>y(_)||P(t.upload.duration_ms??0)),S=p(()=>Jn(t.upload)),T=p(()=>Yn(t.upload)),E=p(()=>y(T)===`unsupported`&&y(S).startsWith(`image/`)),ee=p(()=>y(T)===`unsupported`&&y(S).startsWith(`video/`)),O=p(()=>y(T)===`unsupported`&&y(S).startsWith(`audio/`)),te=p(()=>Qn(y(T))!==void 0),A=p(()=>Zn(y(T))),re=p(()=>{let e=t.upload.width??0,n=t.upload.height??0;if(e<=0||n<=0)return``;let r=y(E)?320:360;return`aspect-ratio: ${e} / ${n}; max-height: ${Math.min(r,Math.max(120,n))}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 I(){N(m,!0)}function L(){y(l)&&isFinite(y(l).duration)&&N(_,P(y(l).duration*1e3),!0)}function ie(){y(l)&&(N(m,!0),y(l).play())}var R=d(),ae=ne(R),oe=e=>{var r=Ma(),a=C(r),o=k(a),l=D(a,2),u=C(l),d=k(u,!0),p=D(u,2);n(l),n(r),j(()=>{w(a,`aria-label`,`Open image ${t.upload.filename}`),w(o,`src`,t.url),w(o,`alt`,t.upload.filename),w(o,`width`,t.upload.width||void 0),w(o,`height`,t.upload.height||void 0),f(o,y(re)),s(d,t.upload.filename),w(p,`href`,t.url),w(p,`download`,t.upload.filename),w(p,`aria-label`,`Download ${t.upload.filename}`)}),g(`click`,a,()=>i()(t.url,t.upload.filename)),g(`click`,p,e=>e.stopPropagation()),c(e,r)},z=e=>{var i=Fa();let a;var o=C(i),d=k(o);M(o,e=>N(l,e),()=>y(l));var p=D(o,2),h=e=>{var n=Pa(),r=ne(n),i=D(r,2),a=e=>{var t=Na(),n=k(t,!0);j(()=>s(n,y(x))),c(e,t)};u(i,e=>{y(x)&&e(a)}),j(()=>w(r,`aria-label`,`Play ${t.upload.filename}`)),g(`click`,r,ie),c(e,n)};u(p,e=>{y(m)||e(h)});var _=D(p,2),b=C(_),T=k(b,!0),E=D(b,2);n(_),n(i),j(()=>{a=r(i,1,`media-tile media-tile--video`,null,a,{"is-started":y(m)}),o.controls=y(m),w(o,`aria-label`,t.upload.filename),w(o,`width`,t.upload.width||void 0),w(o,`height`,t.upload.height||void 0),f(o,y(re)),w(d,`src`,t.url),w(d,`type`,y(S)),s(T,t.upload.filename),w(E,`href`,t.url),w(E,`download`,t.upload.filename),w(E,`aria-label`,`Download ${t.upload.filename}`)}),v(`play`,o,I),v(`loadedmetadata`,o,L),g(`click`,E,e=>e.stopPropagation()),c(e,i)},se=e=>{var r=Ia(),i=C(r),a=D(C(i),2),o=C(a),l=k(o,!0),u=D(o,2),d=k(u,!0);n(a),n(i);var f=D(i,2),p=C(f),m=k(p,!0);n(f),n(r),j(e=>{s(l,t.upload.filename),s(d,e),w(f,`src`,t.url),w(p,`href`,t.url),s(m,t.upload.filename)},[()=>Ze(t.upload.byte_size)]),c(e,r)},ce=e=>{var r=La(),i=C(r),a=C(i),l=k(a,!0);n(i);var u=D(i,2),d=C(u),f=k(d,!0),p=D(d,2),m=k(p,!0);n(u);var h=D(u,2);n(r),j(e=>{w(i,`data-artifact-upload-id`,t.upload.id),w(i,`aria-label`,`Open ${t.upload.filename}`),s(l,y(A)),w(d,`data-artifact-upload-id`,t.upload.id),s(f,t.upload.filename),s(m,e),w(h,`href`,t.url),w(h,`download`,t.upload.filename),w(h,`aria-label`,`Download ${t.upload.filename}`)},[()=>Ze(t.upload.byte_size)]),g(`click`,i,()=>o()(t.upload)),g(`click`,d,()=>o()(t.upload)),c(e,r)},le=e=>{var r=Ra(),i=D(C(r),2),a=C(i),o=k(a,!0),l=D(a,2),u=k(l,!0);n(i),n(r),j(e=>{w(r,`href`,t.url),w(r,`download`,t.upload.filename),w(r,`aria-label`,`Download ${t.upload.filename}`),s(o,t.upload.filename),s(u,e)},[()=>Ze(t.upload.byte_size)]),c(e,r)};u(ae,e=>{y(E)?e(oe):y(ee)?e(z,1):y(O)?e(se,2):y(te)?e(ce,3):e(le,-1)}),c(e,R),h()}o([`click`]);var Ba=I(``),Va=I(`
    `);function Ha(t,r){a(r,!0);let o=F(void 0);A(async()=>{await e(),y(o)?.focus(),y(o)?.setSelectionRange(y(o).value.length,y(o).value.length)});function l(e){if(!(e.isComposing||e.keyCode===229)){if(e.key===`Escape`){e.preventDefault(),e.stopPropagation(),r.onCancel();return}e.target===y(o)&&e.key===`Enter`&&(e.metaKey||e.ctrlKey)&&(e.preventDefault(),r.onSave())}}var d=Va(),f=C(d);i(f),M(f,e=>N(o,e),()=>y(o));var p=D(f,2),m=C(p),v=C(m),b=e=>{var t=_(`Saving…`);c(e,t)},x=e=>{var t=_(`Save`);c(e,t)};u(v,e=>{r.saving?e(b):e(x,-1)}),n(m);var S=D(m,2);n(p);var T=D(p,2),E=e=>{var t=Ba(),n=k(t,!0);j(()=>s(n,r.errorMessage)),c(e,t)};u(T,e=>{r.errorMessage&&e(E)}),n(d),j(e=>{w(d,`aria-busy`,r.saving),re(f,r.body),f.disabled=r.saving,w(f,`aria-invalid`,r.errorMessage?`true`:void 0),w(f,`aria-describedby`,r.errorMessage?`message-edit-error`:void 0),m.disabled=e,S.disabled=r.saving},[()=>r.saving||!De(r.body)]),g(`keydown`,d,l),g(`input`,f,e=>r.onBody(e.currentTarget.value)),g(`click`,m,function(...e){r.onSave?.apply(this,e)}),g(`click`,S,function(...e){r.onCancel?.apply(this,e)}),c(t,d),h()}o([`keydown`,`input`,`click`]);var Ua=I(` `),Wa=I(` `),Ga=I(``);function Ka(e,t){a(t,!0);var i=d(),o=ne(i),l=e=>{var i=Ga();let a;var o=D(C(i),2),l=C(o),d=k(l,!0),f=D(l,2),p=e=>{var n=Ua(),r=k(n,!0);j(e=>s(r,e),[()=>ge(t.message.quoted_body_snapshot)]),c(e,n)},m=e=>{var n=Wa(),r=k(n);j(e=>s(r,`[original deleted] ${e??``}`),[()=>ge(t.message.quoted_body_snapshot)]),c(e,n)};u(f,e=>{t.message.quoted_message_id?e(p):e(m,-1)}),n(o),n(i),j((e,n)=>{a=r(i,1,`quote-block`,null,a,{dangling:!t.message.quoted_message_id}),i.disabled=!t.message.quoted_message_id,w(i,`aria-label`,e),s(d,n)},[()=>t.message.quoted_message_id?`Jump to quoted message from ${G(t.message)}`:`Original message was deleted`,()=>G(t.message)]),g(`click`,i,()=>t.onJump(t.message)),c(e,i)};u(o,e=>{(t.message.quoted_message_id||t.message.quoted_body_snapshot)&&e(l)}),c(e,i),h()}o([`click`]);function qa(e){return Object.fromEntries(e.items.map(e=>[e.id,{selected:[],other:``,otherOpen:!1}]))}function Ja(e,t){return e[t.id]??{selected:[],other:``,otherOpen:!1}}function Ya(e,t,n){let r=Ja(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 Xa(e,t){let n=Ja(e,t),r=t.multi_select?n.selected:[];return{...e,[t.id]:{...n,selected:r,otherOpen:!0}}}function Za(e,t,n){let r=Ja(e,t),i=t.multi_select?r.selected:[];return{...e,[t.id]:{selected:i,other:n,otherOpen:!0}}}function Qa(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 $a(e,t){return Object.fromEntries(e.items.map(e=>[e.id,Qa(e,t[e.id])]))}function eo(e,t){return e.items.every(e=>Qa(e,t[e.id]).length>0)}function to(e){let[t]=e.items;return e.items.length===1&&!!t?.options?.length&&!t?.multi_select&&!t?.allow_other}function no(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 ro(e,t){if(!t||e.status!==`open`)return!1;let n=e.responder_user_ids??[];return n.length===0||n.includes(t)}function io(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 ao(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 oo(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 so=50,co=new Map;function lo(e){return co.get(e)}function uo(e,t){for(co.delete(e),co.set(e,t);co.size>so;){let e=co.keys().next().value;if(e===void 0)break;co.delete(e)}}var fo=I(``),po=I(` `),mo=I(` `,1),ho=I(`

    `),go=I(`

    `),_o=I(``),vo=I(`Choose any`),yo=I(` `),bo=I(` `),xo=I(``),So=I(``),Co=I(``),wo=I(`
    `),To=I(``),Eo=I(`Open link ↗`),Do=I(`
    `),Oo=I(`

    `),ko=I(``),Ao=I(` `),jo=I(``),Mo=I(``),No=I(``),Po=I(``),Fo=I(` `),Io=I(`
    `),Lo=I(` `,1),Ro=I(` `),zo=I(`
    `,1),Bo=I(`
    `),Vo=I(`

    `),Ho=I(` `,1),Uo=I(`
    `);function Wo(e,i){a(i,!0);let o=b(i,`people`,19,()=>[]),l=S(()=>`${i.message.id}:${i.question.version}`),f=F(null),m=F(T(S(()=>lo(l)??qa(i.question)))),v=F(``),O=F(``),te=F(T(Date.now())),A=Ce(),M=S(()=>`question-${i.message.id}`),P=p(()=>y(f)&&y(f).version>i.question.version?y(f):i.question),I=p(()=>io(y(P).expires_at,y(te))),L=p(()=>y(P).status===`open`&&y(I).expired),R=p(()=>y(L)?{...y(P),status:`expired`}:y(P)),z=p(()=>i.message.author?.display_name||`the agent`),se=p(()=>ao(y(R),y(z),y(te))),ce=p(()=>ro(y(R),i.currentUserID)),le=p(()=>to(y(P))),B=p(()=>eo(y(P),y(m))),ue=p(()=>oo(y(R))),V=p(()=>(y(P).responder_user_ids??[]).map(e=>{let t=o().find(t=>t.id===e);return t?.handle?`@${t.handle}`:t?.display_name||`a listed person`}));x(()=>{if(y(R).status!==`open`&&y(R).status!==`submitted`)return;let e=setInterval(()=>N(te,Date.now(),!0),1e3);return()=>clearInterval(e)});function H(e){N(m,e,!0),uo(l,e)}async function U(e,t){if(!y(v)&&y(ce)){N(v,t,!0),N(O,``);try{let t=await ie(`/api/messages/${i.message.id}/question/answers`,{method:`POST`,body:JSON.stringify({...e,nonce:A,expected_version:y(P).version})});t.message.question&&N(f,t.message.question,!0)}catch(e){if(N(O,oe(e,`Could not send your answer`),!0),e instanceof ae&&e.status===409)try{let e=await ie(`/api/messages/${i.message.id}`);e.message.question&&N(f,e.message.question,!0)}catch{}}finally{N(v,``)}}}function de(e,t){if(y(ce)&&!y(v)){if(y(le)){U({answers:{[e.id]:[t]}},t);return}H(Ya(y(m),e,t))}}function fe(){y(B)&&U({answers:$a(y(P),y(m))},`form`)}function W(e){queueMicrotask(()=>document.getElementById(`question-other-${i.message.id}-${e.id}`)?.focus())}function pe(e,t){if(e.target instanceof HTMLInputElement||e.isComposing||e.metaKey||e.ctrlKey||e.altKey||!/^[1-9]$/.test(e.key)||!y(ce))return;let n=Number(e.key)-1,r=t.options??[];n{var t=fo();c(e,t)};u(_e,e=>{(y(se).tone===`open`||y(se).tone===`waiting`)&&e(ve)});var ye=D(_e);n(G);var be=D(G,2),xe=e=>{var t=mo(),i=ne(t),a=e=>{var t=po(),n=k(t);j(()=>s(n,`${y(P).items.length??``} questions`)),c(e,t)};u(i,e=>{y(P).items.length>1&&e(a)});var o=D(i,2);let l;var d=D(C(o));n(o),j(e=>{l=r(o,1,`question-timer`,null,l,{"question-timer--urgent":y(I).urgent}),w(o,`title`,`Expires ${e??``}`),s(d,` ${y(I).label??``}`)},[()=>new Date(y(P).expires_at).toLocaleString()]),c(e,t)},Se=e=>{var t=po(),n=k(t);j(()=>s(n,`by ${y(R).response.responder.display_name??``}`)),c(e,t)};u(be,e=>{y(R).status===`open`?e(xe):y(R).response?.responder&&e(Se,1)}),n(ge);var we=D(ge,2),Te=e=>{var t=ho(),n=k(t,!0);j(()=>s(n,y(P).title)),c(e,t)};u(we,e=>{y(P).title&&y(R).status===`open`&&e(Te)});var Ee=D(we,2),De=e=>{var t=go(),n=k(t,!0);j(()=>s(n,y(R).note)),c(e,t)};u(Ee,e=>{y(R).note&&y(R).status===`open`&&e(De)});var Oe=D(Ee,2),ke=e=>{var a=Lo(),o=ne(a);ee(o,19,()=>y(P).items,e=>e.id,(e,a,o)=>{let l=p(()=>y(m)[y(a).id]),f=p(()=>Qa(y(a),y(l)).length>0);var h=Do();let _;var b=C(h),x=C(b),S=e=>{var t=_o(),n=k(t,!0);j(()=>s(n,y(o)+1)),c(e,t)};u(x,e=>{y(P).items.length>1&&e(S)});var T=D(x,2),O=k(T,!0),te=D(T,2),A=e=>{var t=vo();c(e,t)};u(te,e=>{y(a).multi_select&&e(A)}),n(b);var M=D(b,2);t(M,()=>Hi(y(a).prompt),!0),n(M);var N=D(M,2),F=e=>{var t=wo();let o;var f=C(t);ee(f,19,()=>y(a).options??[],e=>e.label,(e,t,i)=>{let o=p(()=>y(l)?.selected.includes(y(t).label)??!1);var d=xo();let f;var m=C(d),h=e=>{var t=yo(),n=k(t,!0);j(()=>s(n,y(i)+1)),c(e,t)};u(m,e=>{y(i)<9&&e(h)});var _=D(m,2),b=k(_,!0),x=D(_,2);let S;var T=D(x,2),E=e=>{var n=bo(),r=k(n,!0);j(()=>s(r,y(t).description)),c(e,n)};u(T,e=>{y(t).description&&e(E)}),n(d),j((e,n)=>{f=r(d,1,`question-key`,null,f,{"is-selected":y(o)||y(v)===y(t).label,"is-pending":y(v)===y(t).label}),w(d,`role`,y(a).multi_select?`checkbox`:`radio`),w(d,`aria-checked`,y(o)),w(d,`aria-keyshortcuts`,e),d.disabled=n,s(b,y(t).label),S=r(x,1,`question-key__mark`,null,S,{"question-key__mark--box":y(a).multi_select})},[()=>y(i)<9?String(y(i)+1):void 0,()=>!y(ce)||!!y(v)]),g(`click`,d,()=>de(y(a),y(t).label)),c(e,d)});var h=D(f,2),_=e=>{var t=d(),r=ne(t),o=e=>{var t=So(),r=C(t),o=e=>{var t=yo(),n=k(t,!0);j(()=>s(n,(y(a).options?.length??0)+1)),c(e,t)};u(r,e=>{(y(a).options?.length??0)<9&&e(o)});var d=D(r,2);E(d),n(t),j(e=>{w(d,`id`,`question-other-${i.message.id??``}-${y(a).id??``}`),w(d,`placeholder`,y(a).other_placeholder||`Your answer`),w(d,`aria-label`,`Other answer for ${y(a).header??``}`),re(d,y(l).other),d.disabled=e},[()=>!y(ce)||!!y(v)]),g(`input`,d,e=>H(Za(y(m),y(a),e.currentTarget.value))),g(`keydown`,d,e=>me(e,y(a))),c(e,t)},f=e=>{var t=Co(),r=C(t),i=e=>{var t=yo(),n=k(t,!0);j(()=>s(n,(y(a).options?.length??0)+1)),c(e,t)};u(r,e=>{(y(a).options?.length??0)<9&&e(i)});var o=D(r,2),l=k(o,!0);n(t),j((e,n)=>{w(t,`aria-keyshortcuts`,e),t.disabled=n,s(l,y(a).other_placeholder||`Other...`)},[()=>(y(a).options?.length??0)<9?String((y(a).options?.length??0)+1):void 0,()=>!y(ce)||!!y(v)]),g(`click`,t,()=>{H(Xa(y(m),y(a))),W(y(a))}),c(e,t)};u(r,e=>{y(l)?.otherOpen?e(o):e(f,-1)}),c(e,t)};u(h,e=>{y(a).allow_other&&!y(le)&&e(_)}),n(t),j(e=>{o=r(t,1,`question-options`,null,o,{"question-options--stack":y(le)}),w(t,`role`,y(a).multi_select?`group`:`radiogroup`),w(t,`aria-label`,y(a).header),w(t,`data-shortcut-keys`,e)},[()=>no(y(a),y(le))]),g(`keydown`,t,e=>pe(e,y(a))),c(e,t)},I=e=>{var t=To();E(t),j(e=>{w(t,`aria-label`,y(a).header),re(t,y(l)?.other??``),t.disabled=e},[()=>!y(ce)||!!y(v)]),g(`input`,t,e=>H(Za(y(m),y(a),e.currentTarget.value))),g(`keydown`,t,e=>{e.key===`Enter`&&!e.isComposing&&(e.preventDefault(),fe())}),c(e,t)};u(N,e=>{(y(a).options?.length??0)>0?e(F):e(I,-1)});var L=D(N,2),ie=e=>{var t=Eo();j(()=>w(t,`href`,y(a).url)),c(e,t)};u(L,e=>{y(a).url&&e(ie)}),n(h),j(()=>{_=r(h,1,`question-item`,null,_,{"is-answered":y(f)&&!y(le)}),s(O,y(a).header)}),c(e,h)});var l=D(o,2),f=e=>{var t=Oo(),r=C(t),a=e=>{var t=_(`Sign in to answer this question.`);c(e,t)},o=e=>{var t=_();j(e=>s(t,`Only ${e??``} can answer this question.`),[()=>y(V).join(`, `)]),c(e,t)};u(r,e=>{i.currentUserID?e(o,-1):e(a)}),n(t),c(e,t)};u(l,e=>{y(ce)||e(f)});var h=D(l,2),b=e=>{var t=ko(),n=k(t,!0);j(()=>s(n,y(O))),c(e,t)};u(h,e=>{y(O)&&e(b)});var x=D(h,2),S=e=>{var t=Io(),i=C(t),a=e=>{var t=Ao(),n=k(t,!0);j(()=>s(n,y(v)?`Sending "${y(v)}"...`:`Tap an answer or press its number`)),c(e,t)},o=e=>{var t=jo(),n=k(t,!0);j(e=>{t.disabled=e,s(n,y(v)===`form`?`Sending...`:y(P).items.length>1?`Send answers`:`Send answer`)},[()=>!y(B)||!!y(v)]),g(`click`,t,fe),c(e,t)};u(i,e=>{y(le)?e(a):e(o,-1)});var l=D(i,2),d=e=>{var t=Mo(),n=k(t,!0);j(e=>{t.disabled=e,s(n,y(v)===`skip`?`Skipping...`:`Skip`)},[()=>!!y(v)]),g(`click`,t,()=>void U({skip:!0},`skip`)),c(e,t)};u(l,e=>{y(P).allow_skip&&e(d)});var f=D(l,2),p=e=>{var t=Po();ee(t,21,()=>y(P).items,e=>e.id,(e,t)=>{var n=No();let i;j(e=>i=r(n,1,``,null,i,{"is-on":e}),[()=>Qa(y(t),y(m)[y(t).id]).length>0]),c(e,n)}),n(t),j(e=>w(t,`aria-label`,`${e??``} of ${y(P).items.length??``} answered`),[()=>y(P).items.filter(e=>Qa(e,y(m)[e.id]).length>0).length]),c(e,t)};u(f,e=>{!y(le)&&y(P).items.length>1&&e(p)});var h=D(f,2),_=e=>{var t=Fo(),n=k(t);j(e=>s(n,`Only ${e??``} can answer`),[()=>y(V).join(`, `)]),c(e,t)};u(h,e=>{y(V).length>0&&e(_)}),n(t),c(e,t)};u(x,e=>{y(ce)&&e(S)}),c(e,a)},Ae=e=>{var t=Ho(),i=ne(t),a=e=>{var t=Bo();ee(t,21,()=>y(ue),e=>e.id,(e,t)=>{var i=zo(),a=ne(i),o=k(a,!0),l=D(a,2);ee(l,21,()=>y(t).values,e=>e.text,(e,t)=>{var n=Ro();let i;var a=k(n,!0);j(()=>{i=r(n,1,`question-answer`,null,i,{"question-answer--typed":y(t).typed}),s(a,y(t).typed?`"${y(t).text}"`:y(t).text)}),c(e,n)}),n(l),j(()=>s(o,y(t).header)),c(e,i)}),n(t),c(e,t)},o=e=>{var t=Vo(),n=k(t);j(e=>s(n,`No answer before ${e??``}.`),[()=>new Date(y(P).expires_at).toLocaleTimeString([],{hour:`numeric`,minute:`2-digit`})]),c(e,t)};u(i,e=>{y(ue).length>0?e(a):y(R).status===`expired`&&e(o,1)});var l=D(i,2),d=e=>{var t=Vo(),n=k(t,!0);j(()=>s(n,y(R).note)),c(e,t)};u(l,e=>{y(R).note&&e(d)}),c(e,t)};u(Oe,e=>{y(R).status===`open`?e(ke):e(Ae,-1)}),n(he),j(()=>{r(he,1,`question-card question-card--${y(se).tone??``}`),w(he,`aria-labelledby`,M),w(he,`data-question-status`,y(R).status),w(G,`id`,M),s(ye,` ${y(se).label??``}`)}),c(e,he),h()}o([`keydown`,`click`,`input`]);export{we as A,Ze as C,Ie as D,Pe as E,_e as F,W as I,pe as L,Ce as M,ve as N,Oe as O,ye as P,fe as R,pt as S,ze as T,Zn as _,ja as a,Yn as b,ga as c,ia as d,Xi as f,Ui as g,Hi as h,za as i,Se as j,Te as k,ua as l,Gi as m,Ka as n,Aa as o,qi as p,Ha as r,Oa as s,Wo as t,oa as u,Xn as v,Ye as w,zn as x,Qn as y,de as z}; \ No newline at end of file diff --git a/apps/api/internal/webassets/dist/_app/immutable/chunks/CmseFvlq.js b/apps/api/internal/webassets/dist/_app/immutable/chunks/DOeWsdLH.js similarity index 55% rename from apps/api/internal/webassets/dist/_app/immutable/chunks/CmseFvlq.js rename to apps/api/internal/webassets/dist/_app/immutable/chunks/DOeWsdLH.js index d58e14a9f..7c43b3e57 100644 --- a/apps/api/internal/webassets/dist/_app/immutable/chunks/CmseFvlq.js +++ b/apps/api/internal/webassets/dist/_app/immutable/chunks/DOeWsdLH.js @@ -1,4 +1,4 @@ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./DKccj-zk.js","./BaNbYf_w.js"])))=>i.map(i=>d[i]); -import{t as e}from"./DK3Fl9T5.js";import{$ as t,A as n,At as r,C as i,E as a,Et as o,H as s,I as c,J as l,L as u,M as d,P as f,R as p,St as m,T as h,Tt as g,U as _,V as v,W as y,Y as b,_ as x,_t as S,a as C,at as w,b as T,ct as E,d as D,dt as O,et as k,ft as A,g as j,gt as ee,h as M,ht as N,it as P,j as F,jt as I,k as L,kt as te,l as ne,mt as R,n as re,o as ie,p as z,pt as ae,r as oe,s as se,st as B,u as ce,v as le,vt as V,x as ue,xt as H,yt as U,z as W}from"./BTIB_WQZ.js";import{c as de,n as fe,t as pe}from"./CRok6MwI.js";import{t as me}from"./BaNbYf_w.js";import"./xihTtKlq.js";import"./DFzK05fS.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 K,i as Fe,n as Ie,o as Le,s as Re,t as q}from"./B4px22Nd.js";import{n as ze,t as Be}from"./DBpO2iwN.js";import"./j4GI4VLW.js";import{C as Ve,D as He,E as Ue,I as We,L as Ge,R as Ke,S as qe,T as Je,_ as Ye,b as J,f as Xe,g as Y,h as X,j as Ze,k as Qe,m as Z,p as $e,r as Q,u as et,v as tt,w as nt,x as rt,y as it}from"./T0GVabNa.js";import{a as at,c as ot,f as st,i as ct,l as lt,o as ut,p as dt,s as ft,t as pt,u as mt}from"./ByQ3bZN5.js";import{i as ht,n as gt,r as _t,t as vt}from"./C16fMXIp.js";import{n as yt,t as bt}from"./DlGnnCJo.js";import{n as xt,r as St,t as Ct}from"./DfsrRaIf.js";import{p as wt,r as Tt}from"./CVdgRPye.js";import{r as Et,t as Dt}from"./BIhzYFGW.js";var Ot={url:`/`,label:`cc`};function kt(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 At(e){if(!e||typeof e!=`object`)return Ot;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&&kt(r)?r:Ot.url,label:i&&Array.from(i).length<=32?i:Ot.label}}function jt(e){return e===Ot.label}function Mt(e){return jt(e.label)?`ClickClack home`:`${e.label} home`}async function Nt(e){try{return At(await e(`/api/home-link`))}catch{return Ot}}var Pt=`clickclack:browser-notifications-enabled:v1:`;function Ft(e){return`${Pt}${e}`}function It(e){if(!e)return!1;try{return window.localStorage.getItem(Ft(e))===`enabled`}catch{return!1}}function Lt(e,t){if(!e)return!1;try{return t?window.localStorage.setItem(Ft(e),`enabled`):window.localStorage.removeItem(Ft(e)),!0}catch{return!1}}var Rt=typeof window>`u`?void 0:window.clickclackDesktop;function zt(){return typeof navigator<`u`&&`serviceWorker`in navigator&&typeof window<`u`&&`PushManager`in window&&`Notification`in window}function Bt(){return typeof window>`u`?!1:window.navigator.standalone===!0||typeof window.matchMedia==`function`&&window.matchMedia(`(display-mode: standalone)`).matches}function Vt(){if(typeof navigator>`u`)return!1;let e=navigator.userAgent;return/iPhone|iPad|iPod/.test(e)?!0:e.includes(`Macintosh`)&&(navigator.maxTouchPoints||0)>1}function Ht(e=typeof navigator>`u`?``:navigator.userAgent,t=typeof navigator>`u`?0:navigator.maxTouchPoints||0){let n=[[/iPhone/,`iPhone`],[/iPad/,`iPad`],[/Android/,`Android`],[/Macintosh|Mac OS X/,/Macintosh/.test(e)&&t>1?`iPad`:`Mac`],[/Windows/,`Windows`],[/Linux/,`Linux`]].find(([t])=>t.test(e))?.[1]??`This device`,r=/Edg\//.test(e)?`Edge`:/Chrome\//.test(e)?`Chrome`:/Firefox\//.test(e)?`Firefox`:/Safari\//.test(e)?`Safari`:``;return r?`${n} ${r}`:n}function Ut(e,t){if(!e)return!0;let n=ArrayBuffer.isView(e)?new Uint8Array(e.buffer,e.byteOffset,e.byteLength):new Uint8Array(e);return n.length===t.length&&n.every((e,n)=>e===t[n])}function Wt(e){let t=e.trim().replace(/-/g,`+`).replace(/_/g,`/`),n=atob(t+`=`.repeat((4-t.length%4)%4)),r=new Uint8Array(new ArrayBuffer(n.length));for(let e=0;evoid 0)}let o=await e.pushManager.subscribe({userVisibleOnly:!0,applicationServerKey:i});return en(n,r),o}async function an(){if(!zt())return null;let e=await navigator.serviceWorker.getRegistration(`/`);return e?await e.pushManager.getSubscription():null}async function on(){return(await G(`/api/me`)).user.id}async function sn(e,t){let n=e.toJSON();return(await G(`/api/me/push/subscriptions`,{method:`PUT`,body:JSON.stringify({user_id:t,endpoint:n.endpoint??e.endpoint,keys:{p256dh:n.keys?.p256dh??``,auth:n.keys?.auth??``},user_agent:Ht()})})).subscription}async function cn(e,t){await G(`/api/me/push/subscriptions`,{method:`DELETE`,body:JSON.stringify({user_id:t,endpoint:e})})}async function ln(e){if(e&&zt())try{let t=await an(),n=Zt(e);if(!n&&!t||await on()!==e)return;let r=await tn(t);if(!r.enabled)return;if(!n){if(t&&!r.this_device){await t.unsubscribe();let e=await navigator.serviceWorker.getRegistration(`/`);for(let t of await e?.getNotifications()??[])t.close()}return}await sn(await rn(await nn(),r,e),e)}catch{}}var un=`from`,dn=`push`;function fn(e){let t=new URL(e,`https://clickclack.invalid`);return t.searchParams.get(un)===dn?(t.searchParams.delete(un),`${t.pathname}${t.search}${t.hash}`):null}function pn(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 mn=new Set([`agent_commentary`,`agent_tool`]),hn=18e4;function gn(e){return e.kind!==void 0&&mn.has(e.kind)}function _n(e){return e.kind===void 0||e.kind===`message`}function vn(e){return e.author?.id||e.author_id||``}function yn(e){return`${e.channel_id?`channel:${e.channel_id}`:`direct:${e.direct_conversation_id||``}`}\u0000${vn(e)}\u0000${e.turn_id||e.id}`}function bn(e){let t=e.trim(),n=``,r=``,i=t.match(/^\*\*([^*]+)\*\*\s*\n+([\s\S]+)$/),a=t.match(/^\*\*([^*]+)\*\*$/);if(i)n=i[1].trim(),r=Sn(i[2]);else if(a)n=a[1].trim();else return xn(t.replace(/\*\*/g,``).trim(),``);return xn(n,r)}function xn(e,t){let n=Sn(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 Sn(e){return e.replace(/\s+/g,` `).trim()}function Cn(e,t,n,r){let i=[];for(let e of t)if(e.kind===`agent_tool`){if(r.hideToolCalls)continue;let t=bn(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 wn(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>hn&&(r=!0)}a.set(t,r)}let o=[];for(let n=0;n=Kn)&&(qn.active=!0,qn.lastPingAt=t,Xn(e,`typing.started`)),qn.idleTimer&&window.clearTimeout(qn.idleTimer),qn.idleTimer=window.setTimeout(()=>{qn&&=(Qn(qn),null)},Gn)}async function Qn(e){e.idleTimer&&window.clearTimeout(e.idleTimer),e.active&&await Xn(e.scope,`typing.stopped`)}function $n(){qn&&=(Qn(qn),null)}var er=2e3,tr=2097152;function nr(e){let t=document.createElement(`span`);return t.textContent=e,t.innerHTML}function rr(e,t,n){return!t||e.length>262144?Promise.resolve(nr(e)):new Promise((r,i)=>{let a=new Worker(new URL(new URL(`../workers/highlight.worker-8wMHDvrm.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(nr(e))),er);if(a.onmessage=t=>{let n=t.data;`error`in n?s(()=>r(nr(e))):s(()=>r(n.html))},a.onerror=()=>s(()=>r(nr(e))),n.addEventListener(`abort`,c,{once:!0}),n.aborted){c();return}a.postMessage({source:e,language:t,outputLimit:tr})})}var ir=5e3;function ar(e,t,n){return new Promise((r,i)=>{let a=new Worker(new URL(new URL(`../workers/office.worker-DYsoLmCH.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.`))),ir);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 or=16777216,sr=1e4,cr=1e4,lr=`This PDF page is too large to preview safely. Download the original to open it locally.`;function ur(e,t){if(!Number.isSafeInteger(e)||!Number.isSafeInteger(t)||e<1||t<1||e>8192||t>8192||e*t>16777216)throw Error(lr)}var dr=new URL(`../assets/pdf.worker.PhvoOpM7.mjs`,import.meta.url).href,fr=W(`
    `),pr=W(`

    Preparing a safe preview.

    `),mr=W(``),hr=W(`
    No preview for this file type

    You can still download the original file.

    Download original
    `),gr=W(`
    `,1),_r=W(` `),vr=W(` `),yr=W(` `),br=W(` `),xr=W(`

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

    `),Sr=W(``),Cr=W(`
    Raw cached values; number and date formatting omitted
    `,1),wr=W(`

    `),Tr=W(`

    `),Er=W(`

    `),Dr=W(`

    Some slide content was omitted by preview limits.

    `),Or=W(`

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

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

    or

    `),Rr=W(` `,1),zr=W(``),Br=W(``),Vr=W(`

    `),Hr=W(`
    ClickClack OpenClaw workspace chat

    Welcome.

    Have a sign-in token?
    `,1);function Ur(e,t){o(t,!0);let n=Rt?.integratedTitleBar===!0,i=U(``),a=ge(),s=a.includes(`github`),l=a.includes(`password`),d=!Rt&&a.includes(`openclaw`),p=U(``),m=U(``),h=U(``),v=U(!1),x=U(``),S=l?s?`Sign in with your ClickClack account, or continue with GitHub.`:`Sign in with your ClickClack account.`:s?`Sign in with GitHub to join the guest room.`:d?`Sign in with OpenClaw ID to join the guest room.`:`Sign in with a token from your ClickClack administrator.`,C=s&&!l?`Any GitHub account can join.`:``;async function w(e){if(Rt){e.preventDefault(),V(i,`Opening GitHub in your browser…`);try{await Rt.signInWithGitHub(),V(i,`Finish signing in in your browser. ClickClack will complete here automatically.`)}catch{V(i,`Could not open your browser. Try again.`)}}}async function T(e,t){if(!b(v)){V(v,!0),V(x,``);try{await G(e,{method:`POST`,body:JSON.stringify(t)}),window.location.reload()}catch(e){V(x,xe(e,`Could not sign in.`),!0),V(v,!1)}}}function E(e){e.preventDefault(),T(`/api/auth/password/login`,{identifier:b(p),password:b(m)})}function D(e){e.preventDefault(),T(`/api/auth/magic/consume`,{token:b(h)})}var O=Hr(),k=ae(O),ee=e=>{var t=Fr();B(()=>j(t,`data-platform`,Rt.platform)),u(e,t)};f(k,e=>{n&&Rt&&e(ee)});var P=N(k,2),F=A(P),I=A(F),L=A(I);Xe(L,{class:`mark`,size:44}),te(2),r(I);var ne=N(I,2),re=N(A(ne),2),ie=R(re,!0);r(ne);var oe=N(ne,2),se=e=>{var t=Ir(),n=A(t),i=N(A(n),2);M(i),r(n);var a=N(n,2),o=N(A(a),2);M(o),r(a);var s=N(a,2),l=R(s,!0);r(t),B(()=>{s.disabled=b(v),c(l,b(v)?`Signing in...`:`Sign in`)}),y(`submit`,t,E),z(i,()=>b(p),e=>V(p,e)),z(o,()=>b(m),e=>V(m,e)),u(e,t)};f(oe,e=>{l&&e(se)});var ce=N(oe,2),le=e=>{var t=Rr(),n=ae(t),r=e=>{var t=Lr();u(e,t)};f(n,e=>{l&&e(r)});var i=N(n,2);B(e=>j(i,`href`,e),[()=>he(`/api/auth/github/start`)]),_(`click`,i,w),u(e,t)};f(ce,e=>{s&&e(le)});var ue=N(ce,2),H=e=>{var t=zr();B(e=>j(t,`href`,e),[()=>he(`/api/auth/openclaw/start`)]),u(e,t)};f(ue,e=>{d&&e(H)});var W=N(ue,2),de=e=>{var t=Br(),n=R(t,!0);B(()=>c(n,b(x))),u(e,t)};f(W,e=>{b(x)&&e(de)});var fe=N(W,2),pe=N(A(fe),2),me=A(pe),_e=N(A(me),2);M(_e),r(me);var ve=N(me,2);r(pe),r(fe);var ye=N(fe,2),be=e=>{var t=Vr(),n=R(t,!0);B(()=>c(n,b(i)||C)),u(e,t)};f(ye,e=>{(b(i)||C)&&e(be)}),r(F),r(P),B(()=>{c(ie,S),fe.open=!s&&!l&&!d,ve.disabled=b(v)}),y(`submit`,pe,D),z(_e,()=>b(h),e=>V(h,e)),u(e,O),g()}s([`click`]);var Wr=W(``),Gr=W(``);function Kr(e,t){o(t,!0);let n=C(t,`deleting`,3,!1),i=C(t,`error`,3,``),a=m(()=>t.message.author?.display_name||`Local User`);function s(){n()||t.onClose()}var l=Gr(),d=A(l),p=N(d,2),h=A(p),v=N(A(h),2);r(h);var y=N(h,2),x=N(A(y),2),S=A(x);{let e=m(()=>t.message.author?.id||t.message.author_id),n=m(()=>t.message.author?.avatar_url);pt(S,{class:`avatar`,get id(){return b(e)},get name(){return b(a)},get src(){return b(n)},size:36,loading:`eager`,fetchPriority:`auto`})}var w=N(S,2),T=A(w),E=A(T),D=R(E,!0),O=N(E,2),k=R(O,!0);r(T);var ee=N(T,2),M=R(ee,!0);r(w),r(x);var P=N(x,2),F=e=>{var t=Wr(),n=R(t,!0);B(()=>c(n,i())),u(e,t)};f(P,e=>{i()&&e(F)});var I=N(P,2),L=A(I),te=N(L,2),ne=R(te,!0);r(I),r(y),r(p),r(l),B(e=>{d.disabled=n(),v.disabled=n(),c(D,b(a)),j(O,`datetime`,t.message.created_at),c(k,e),c(M,t.message.body),L.disabled=n(),te.disabled=n(),c(ne,n()?`Deleting...`:`Delete`)},[()=>X(t.message.created_at)]),_(`click`,d,s),_(`click`,v,s),_(`click`,L,s),_(`click`,te,function(...e){t.onConfirm?.apply(this,e)}),u(e,l),g()}s([`click`]);var qr=6500,Jr=W(`
    `);function Yr(e,t){o(t,!0);let n=m(()=>t.entries.filter(e=>e.userID!==t.currentUserID));function a(e,t=`Someone`){return e?.display_name?.trim()||(e?.handle?`@${e.handle}`:t)}let s=m(()=>b(n).length===0?``:b(n).length===1?`${a(b(n)[0].user)} is typing…`:b(n).length===2?`${a(b(n)[0].user)} and ${a(b(n)[1].user)} are typing…`:b(n).length===3?`${a(b(n)[0].user)}, ${a(b(n)[1].user)}, and ${a(b(n)[2].user)} are typing…`:`Several people are typing…`);var l=Jr();let d;var f=N(A(l),2),p=R(f,!0);r(l),B(()=>{d=i(l,1,`typing-indicator`,null,d,{visible:b(n).length>0}),c(p,b(s))}),u(e,l),g()}var Xr=W(`
    `),Zr=W(`
    `),Qr=W(`
    `);function $r(e,t){o(t,!0);function n(e){return e.kind===`tool`&&e.toolName?!e.text||e.text===e.toolName?e.toolName:`${e.toolName}: ${e.text}`:e.text}function a(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 s=p(),l=ae(s),d=e=>{var o=Qr();F(o,21,()=>t.turns,e=>e.key,(e,t)=>{var o=Zr();F(o,21,()=>b(t).lines,e=>e.id,(e,t)=>{var o=Xr();let s;var l=A(o),d=R(l,!0),f=N(l,2),p=R(f,!0);r(o),B((e,n)=>{s=i(o,1,`agent-progress__line svelte-6vwkyv`,null,s,{"agent-progress__line--done":b(t).finalized}),j(o,`data-kind`,b(t).kind),c(d,e),c(p,n)},[()=>a(b(t).kind),()=>n(b(t))]),u(e,o)}),r(o),u(e,o)}),r(o),u(e,o)};f(l,e=>{t.turns.length>0&&e(d)}),u(e,s),g()}function ei(e,t){return`${e}\u0000${t}`}var ti=45e3;function ni(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=ei(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+ti;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 ri=W(``),ii=W(``);function ai(e,t){o(t,!0);var n=ii(),i=A(n),a=N(i,2),s=A(a),l=N(A(s),2);r(s);var d=N(s,2),p=A(d),m=N(A(p),2);M(m),r(p);var h=N(p,2),v=e=>{var n=ri(),r=R(n,!0);B(()=>c(r,t.error)),u(e,n)};f(h,e=>{t.error&&e(v)});var b=N(h,2),x=A(b),S=N(x,2),C=R(S,!0);r(b),r(d),r(a),r(n),B(e=>{le(m,t.channelName),m.disabled=t.pending,S.disabled=e,c(C,t.pending?`Creating…`:`Create channel`)},[()=>t.pending||!t.channelName.trim()]),_(`click`,i,function(...e){t.onClose?.apply(this,e)}),_(`click`,l,function(...e){t.onClose?.apply(this,e)}),y(`submit`,d,e=>{e.preventDefault(),t.onCreate()}),_(`input`,m,e=>t.onChannelName(e.currentTarget.value)),_(`click`,x,function(...e){t.onClose?.apply(this,e)}),u(e,n),g()}s([`click`,`input`]);var oi=W(``),si=W(`
    No matching people yet
    `),ci=W(`

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

    Creating workspace…

    `),_i=W(`
    `),vi=W(``);function yi(e,t){o(t,!0);let n=C(t,`homeHref`,3,`/`),a=C(t,`homeLabel`,3,`cc`),s=C(t,`homeTitle`,3,`ClickClack home`);function l(e){return e.button===0&&!e.metaKey&&!e.ctrlKey&&!e.shiftKey&&!e.altKey}var d=vi(),p=A(d);let h;var v=A(p),x=e=>{Xe(e,{size:48})},S=m(()=>jt(a())),w=e=>{var t=fi(),n=R(t,!0);B(()=>c(n,a())),u(e,t)};f(v,e=>{b(S)?e(x):e(w,-1)}),r(p);var T=N(p,4),E=A(T);F(E,17,()=>t.workspaces,e=>e.id,(e,n)=>{var a=mi();let o;var s=A(a),d=A(s),p=e=>{var t=pi();B(e=>j(t,`src`,e),[()=>_e(b(n).icon_url)]),u(e,t)},m=e=>{var t=fi(),r=R(t,!0);B(e=>c(r,e),[()=>dt(b(n).name)]),u(e,t)};f(d,e=>{b(n).icon_url?e(p):e(m,-1)}),r(s),r(a),B(e=>{o=i(a,1,`guild-wrap`,null,o,{active:b(n).id===t.selectedWorkspaceID}),j(s,`title`,b(n).name),j(s,`aria-label`,b(n).name),j(s,`href`,e)},[()=>t.hrefForWorkspace(b(n).id)]),_(`click`,s,e=>{l(e)&&(e.preventDefault(),t.onSelectWorkspace(b(n).id))}),u(e,a)});var D=N(E,2);r(T);var O=N(T,2),k=e=>{var n=_i(),i=A(n);M(i);var a=N(i,2),o=e=>{var n=hi(),r=R(n,!0);B(()=>c(r,t.createError)),u(e,n)};f(a,e=>{t.createError&&e(o)});var s=N(a,2),l=e=>{var t=gi();u(e,t)};f(s,e=>{t.createPending&&e(l)}),r(n),B(()=>{le(i,t.workspaceName),i.disabled=t.createPending}),y(`submit`,n,e=>{e.preventDefault(),t.onCreateWorkspace()}),_(`input`,i,e=>t.onWorkspaceName(e.currentTarget.value)),u(e,n)};f(O,e=>{t.showWorkspaceCreate&&e(k)}),r(d),B(e=>{h=i(p,1,`guild home`,null,h,{"home--mark":e}),j(p,`title`,s()),j(p,`aria-label`,s()),j(p,`href`,n())},[()=>jt(a())]),_(`click`,D,function(...e){t.onToggleWorkspaceCreate?.apply(this,e)}),u(e,d),g()}s([`click`,`input`]);var bi=`clickclack:sidebar-channel-order:v1:`,xi=new Map,Si=new Map;function Ci(e,t){return`${bi}${t}:${e}`}function wi(e){if(!e||e.length>1e6)return[];try{let t=JSON.parse(e);return Array.isArray(t)&&t.length<=1e4&&t.every(e=>typeof e==`string`&&e.length<=128)?[...new Set(t)]:[]}catch{return[]}}function Ti(e,t){try{window.localStorage.setItem(e,JSON.stringify(t))}catch{}}function Ei(e,t,n){e?.startsWith(`${bi}${n}:`)&&xi.set(e,wi(t))}function Di(e,t){if(!e?.id||!t)return[];let n=Ci(t,e.id),r=xi.get(n);if(r)return r;let i=[];try{i=wi(window.localStorage.getItem(n))}catch{}let a=e.sidebar_preferences?.channel_order?.[t];if(a===void 0)return i;let o=a.length?[...new Set([...a,...i])].slice(0,1e4):[];return Ti(n,o),o}function Oi(e,t,n,r,i){let a=Ci(t,e);xi.set(a,n),Ti(a,n);let o=(Si.get(a)??Promise.resolve()).then(async()=>{if(xi.get(a)===n&&i())try{let e=JSON.stringify({sidebar_preferences:{channel_order:{[t]:n.slice(0,500)}}});await r(`/api/me`,{method:`PATCH`,keepalive:new TextEncoder().encode(e).length<6e4,body:e})}catch{}});return Si.set(a,o),o.then(()=>{Si.get(a)===o&&Si.delete(a)}),o}var ki=W(``),Ai=W(` `,1),ji=W(``),Mi=W(` `),Ni=W(``),Pi=W(`
    `),Fi=W(``),Ii=W(`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),Li=W(`
    `);function Ri(e,n){o(n,!0);let a=(e,t=I,a=I,o=I,s=I,l=I)=>{let p=m(()=>t().unread_count||0),g=m(()=>a().findIndex(e=>e.id===t().id));var S=Ni();let T;var E=A(S),D=e=>{var n=Ai(),i=ae(n),s=N(i,2),c=e=>{var n=ki(),i=A(n),o=N(i,2);r(n),ce(n,e=>V(w,e),()=>b(w)),B(e=>{j(n,`aria-label`,e),i.disabled=b(g)<=0,o.disabled=b(g)<0||b(g)>=a().length-1},[()=>`Move #${bt(t())}`]),_(`keydown`,n,e=>{e.key===`Escape`&&(e.preventDefault(),_e(!0))}),_(`click`,i,()=>ve(t().id,-1,a())),_(`click`,o,()=>ve(t().id,1,a())),u(e,n)};f(s,e=>{b(C)===t().id&&e(c)}),B(e=>{j(i,`aria-label`,e),j(i,`aria-expanded`,b(C)===t().id)},[()=>`Move #${bt(t())}`]),_(`click`,i,e=>void ge(t().id,e.currentTarget)),y(`dragstart`,i,e=>fe(e,t().id,o())),y(`dragend`,i,he),_(`keydown`,i,e=>{e.key===`ArrowUp`||e.key===`ArrowDown`?(e.preventDefault(),V(C,``),de(t().id,e.key===`ArrowUp`?-1:1,a())):e.key===`Escape`&&V(C,``)}),u(e,n)};f(E,e=>{l()&&e(D)});var O=N(E,2);let k;var ee=N(A(O),2),M=R(ee,!0),P=N(ee,2),F=e=>{var t=ji();u(e,t)};f(P,e=>{t().external_managed&&e(F)});var L=N(P,2),te=e=>{var t=Mi(),n=R(t,!0);B(()=>{j(t,`aria-label`,`${b(p)} unread`),c(n,b(p)>99?`99+`:b(p))}),u(e,t)};f(L,e=>{b(p)>0&&(t().id!==n.selectedChannelID||n.selectedDirectID)&&e(te)}),r(O),r(S),B((e,r)=>{T=i(S,1,`channel-row`,null,T,{reorderable:l(),subdued:s(),dragging:b(d)===t().id,"drop-before":b(v)===t().id&&b(x),"drop-after":b(v)===t().id&&!b(x)}),j(O,`href`,e),k=i(O,1,`nav-item channel`,null,k,{active:t().id===n.selectedChannelID&&!n.selectedDirectID,"has-unread":b(p)>0&&!(t().id===n.selectedChannelID&&!n.selectedDirectID)}),c(M,r)},[()=>n.hrefForChannel(t().id),()=>bt(t())]),y(`dragover`,S,e=>{l()&&pe(e,t().id,o())}),y(`drop`,S,e=>{e.preventDefault(),l()&&b(h)===o()&&(W(b(d),t().id,b(x),a()),he())}),_(`focusout`,S,e=>{e.currentTarget.contains(e.relatedTarget)||V(C,``)}),_(`click`,O,e=>{G(e)&&(e.preventDefault(),n.onSelectChannel(t().id))}),u(e,S)},s=(e,t=I,n=I,o=I)=>{let s=m(()=>oe(t().key)),l=m(()=>ue(t()));var d=Pi();let f;var p=A(d),h=N(A(p),2),g=R(h,!0),v=N(h,2),y=R(v,!0);r(p);var x=N(p,2);F(x,21,()=>b(l),e=>e.id,(e,n)=>{a(e,()=>b(n),()=>t().channels,()=>t().key,o,()=>b(s))}),r(x),r(d),B(()=>{f=i(d,1,`channel-subgroup`,null,f,{"archived-channel-group":o()}),j(p,`aria-expanded`,b(s)),j(p,`aria-controls`,n()),c(g,t().label),c(y,t().channels.length),j(x,`id`,n()),j(x,`hidden`,!b(s)&&b(l).length===0)}),_(`click`,p,()=>se(t().key)),u(e,d)},l=`archived`,d=U(``),h=U(``),v=U(``),x=U(!0),S=U(!1),C=U(``),w=U(void 0),T,D=U(``),k=U(ee({})),M=m(()=>n.channels.filter(e=>!e.archived_at)),P=m(()=>n.channels.filter(e=>!!e.archived_at)),L=m(()=>b(M).filter(e=>!e.sidebar_section?.trim())),te=m(()=>{let e=new Map;for(let t of b(M)){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=m(()=>n.channels.filter(e=>e.id===n.selectedChannelID&&!n.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 z(e){if(!e)return{};try{return re(window.localStorage.getItem(ie(e)))}catch{return{}}}function oe(e){let t=b(k)[e];return typeof t==`boolean`?t:e!==l}function se(e){if(V(k,{...b(k),[e]:!oe(e)},!0),n.workspaceID)try{window.localStorage.setItem(ie(n.workspaceID),JSON.stringify(b(k)))}catch{}}function le(e){e.key===ie(n.workspaceID)&&V(k,re(e.newValue),!0)}function ue(e){return oe(e.key)?e.channels:e.channels.filter(e=>e.id===n.selectedChannelID&&!n.selectedDirectID||(e.unread_count||0)>0)}function H(e){V(D,``),queueMicrotask(()=>{V(D,e,!0)})}function W(e,t,r,i){if(!e||!t||e===t)return;let a=n.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+ +!r,0,e),n.onReorder(a);let c=n.channels.find(t=>t.id===e),l=i.map(e=>e.id).filter(t=>t!==e),u=l.indexOf(t);l.splice(u+ +!r,0,e),c&&H(`Moved #${bt(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){V(S,!0),V(C,``),V(d,t,!0),V(h,n,!0),e.dataTransfer?.setData(`text/plain`,t),e.dataTransfer&&(e.dataTransfer.effectAllowed=`move`)}function pe(e,t,n){if(!b(d)||b(d)===t||b(h)!==n)return;e.preventDefault();let r=e.currentTarget;V(v,t,!0),V(x,e.clientY{V(S,!1)},0)}async function ge(e,n){if(!b(S)){if(b(C)===e){V(C,``);return}T=n,V(C,e,!0),await t(),b(w)?.querySelector(`button:not(:disabled)`)?.focus()}}async function _e(e=!1){V(C,``),e&&(await t(),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}E(()=>{V(k,z(n.workspaceID),!0)}),E(()=>{n.expanded||(V(C,``),me(),V(S,!1))});var ye=Li();y(`storage`,O,le);let be;var xe=A(ye),Se=A(xe),Ce=N(Se,2);r(xe);var we=N(xe,2),Te=A(we),Ee=e=>{var t=Ii(),r=N(ae(t),2);F(r,17,()=>b(L),e=>e.id,(e,t)=>{a(e,()=>b(t),()=>b(L),()=>`unsectioned`,()=>!1,()=>!0)});var i=N(r,2);F(i,19,()=>b(te),e=>e.key,(e,t,n)=>{s(e,()=>b(t),()=>`sidebar-channel-section-${b(n)}`,()=>!1)});var o=N(i,2),c=e=>{s(e,()=>({key:l,label:`Archived`,channels:b(P)}),()=>`sidebar-archived-channels`,()=>!0)};f(o,e=>{b(P).length>0&&e(c)});var d=N(o,2),p=e=>{var t=Fi();u(e,t)};f(d,e=>{n.channels.length===0&&e(p)}),u(e,t)},De=e=>{var t=p(),n=ae(t);F(n,17,()=>b(ne),e=>e.id,(e,t)=>{{let n=m(()=>!!b(t).archived_at);a(e,()=>b(t),()=>b(ne),()=>`priority`,()=>b(n),()=>!1)}}),u(e,t)};f(Te,e=>{n.expanded?e(Ee):e(De,-1)}),r(we);var Oe=N(we,2),ke=R(Oe,!0);r(ye),B(()=>{be=i(ye,1,`nav-section`,null,be,{collapsed:!n.expanded}),j(Se,`aria-expanded`,n.expanded),j(we,`hidden`,!n.expanded&&b(ne).length===0),c(ke,b(D))}),_(`click`,Se,function(...e){n.onToggle?.apply(this,e)}),_(`click`,Ce,function(...e){n.onCreateChannel?.apply(this,e)}),u(e,ye),g()}s([`focusout`,`click`,`keydown`]);var zi=W(` `),Bi=W(``),Vi=W(``),Hi=W(`
    `),Ui=W(``),Wi=W(`
    `),Gi=W(`
    `);function Ki(e,t){o(t,!0);let n=U(``),a=m(()=>t.expanded?t.conversations:t.conversations.filter(e=>e.id===t.selectedDirectID||(e.unread_count||0)>0));function s(e){return e.button===0&&!e.metaKey&&!e.ctrlKey&&!e.shiftKey&&!e.altKey}function l(e){V(n,b(n)===e?``:e,!0)}function d(){V(n,``)}var p=Gi();let h;var v=A(p),y=A(v),x=N(y,2);r(v);var S=N(v,2),C=A(S);F(C,17,()=>b(a),e=>e.id,(e,a)=>{let o=m(()=>ft(b(a),t.currentUserID)),p=m(()=>b(a).unread_count||0),h=m(()=>b(a).id===t.selectedDirectID);var g=Hi();let v;var y=A(g);let x;var S=A(y);{let e=m(()=>b(o)?.id||b(a).id),t=m(()=>b(o)?.display_name),n=m(()=>mt(b(o))?void 0:b(o)?.avatar_url);pt(S,{class:`dm-avatar`,get id(){return b(e)},get name(){return b(t)},get src(){return b(n)},size:22})}var C=N(S,2),w=R(C,!0),T=N(C,2),E=e=>{var t=zi(),n=R(t,!0);B(()=>{j(t,`aria-label`,`${b(p)} unread`),c(n,b(p)>99?`99+`:b(p))}),u(e,t)},D=e=>{var t=Bi();u(e,t)};f(T,e=>{b(p)>0&&!b(h)?e(E):e(D,-1)}),r(y);var O=N(y,2),k=N(O,2),ee=e=>{var n=Vi(),r=R(n);_(`click`,r,e=>{e.preventDefault(),e.stopPropagation(),d(),t.onHideDirect(b(a).id)}),u(e,n)};f(k,e=>{b(n)===b(a).id&&e(ee)}),r(g),B((e,t,r)=>{v=i(g,1,`dm-row`,null,v,{active:b(h)}),j(y,`href`,e),x=i(y,1,`nav-item dm`,null,x,{active:b(h),"has-unread":b(p)>0&&!b(h)}),c(w,t),j(O,`aria-label`,r),j(O,`aria-expanded`,b(n)===b(a).id)},[()=>t.hrefForDirect(b(a).id),()=>ot(b(a),t.currentUserID),()=>`Direct message actions for ${ot(b(a),t.currentUserID)}`]),_(`click`,y,e=>{s(e)&&(e.preventDefault(),t.onSelectDirect(b(a).id))}),_(`click`,O,e=>{e.preventDefault(),e.stopPropagation(),l(b(a).id)}),_(`keydown`,O,e=>{e.key===`Escape`&&d()}),u(e,g)});var w=N(C,2),T=e=>{var t=Ui();u(e,t)};f(w,e=>{t.expanded&&t.conversations.length===0&&e(T)});var E=N(w,2),D=e=>{var n=Wi(),i=A(n),a=R(i),o=N(i,2);r(n),B(()=>c(a,`Closed ${t.hiddenDirectTitle??``}`)),_(`click`,o,function(...e){t.onUndoHideDirect?.apply(this,e)}),u(e,n)};f(E,e=>{t.expanded&&t.hiddenDirectTitle&&e(D)}),r(S),r(p),B(()=>{h=i(p,1,`nav-section`,null,h,{collapsed:!t.expanded}),j(y,`aria-expanded`,t.expanded),j(S,`hidden`,!t.expanded&&b(a).length===0)}),_(`click`,y,function(...e){t.onToggle?.apply(this,e)}),_(`click`,x,function(...e){t.onCreateDirect?.apply(this,e)}),u(e,p),g()}s([`click`,`keydown`]);var qi=W(``),Ji=W(`Connecting…`),Yi=W(`
    `),Xi=W(` `),Zi=W(``),Qi=W(``),$i=W(``);function ea(e,t){o(t,!0);let n=C(t,`showHeader`,3,!0),a=`clickclack:sidebar-sections:v1:`,s={channels:!0,directMessages:!0,people:!0},l=U(ee({...s}));function d(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 p(e){if(!e)return{...s};try{let t=window.localStorage.getItem(`${a}${e}`);if(!t)return{...s};let n=JSON.parse(t);return d(n)?n:{...s}}catch{return{...s}}}function h(e){if(V(l,{...b(l),[e]:!b(l)[e]},!0),t.workspaceID)try{window.localStorage.setItem(`${a}${t.workspaceID}`,JSON.stringify(b(l)))}catch{}}E(()=>{V(l,p(t.workspaceID),!0)});let v=U(ee([]));function x(e){V(v,e,!0);let n=t.currentUser?.id;t.workspaceID&&n&&Oi(n,t.workspaceID,e,G,()=>t.currentUser?.id===n)}function S(e){t.currentUser?.id&&(Ei(e.key,e.newValue,t.currentUser.id),e.key===Ci(t.workspaceID,t.currentUser.id)&&V(v,wi(e.newValue),!0))}let w=m(()=>{let e=new Map(t.channels.map(e=>[e.id,e]));return[...b(v).flatMap(t=>{let n=e.get(t);return n?(e.delete(t),[n]):[]}),...e.values()]});E(()=>{V(v,Di(t.currentUser,t.workspaceID),!0)});function T(e){return e.button===0&&!e.metaKey&&!e.ctrlKey&&!e.shiftKey&&!e.altKey}var D=$i();y(`storage`,O,S);var k=A(D),M=e=>{var n=Yi(),i=A(n),a=A(i),o=e=>{var n=qi();B(e=>j(n,`src`,e),[()=>_e(t.workspaceIconURL)]),u(e,n)};f(a,e=>{t.workspaceIconURL&&e(o)});var s=N(a,2),l=A(s),d=A(l),p=R(d,!0);te(2),r(l);var m=N(l,2),h=e=>{var t=Ji();u(e,t)};f(m,e=>{t.connected||e(h)}),r(s),r(i);var g=N(i,2),v=A(g),y=A(v),b=R(y);r(v),r(g),r(n),B(()=>{c(p,t.workspaceName||`Pick a workspace`),j(v,`aria-label`,t.sidebarCollapsed?`Expand sidebar`:`Collapse sidebar`),j(v,`title`,t.sidebarCollapsed?`Expand sidebar`:`Collapse sidebar`),j(b,`d`,t.sidebarCollapsed?`m9 6 6 6-6 6`:`m15 6-6 6 6 6`)}),_(`click`,i,function(...e){t.onOpenWorkspaceSettings?.apply(this,e)}),_(`click`,v,function(...e){t.onToggleCollapse?.apply(this,e)}),u(e,n)};f(k,e=>{n()&&e(M)});var P=N(k,2),I=A(P);Ri(I,{get workspaceID(){return t.workspaceID},get expanded(){return b(l).channels},get channels(){return b(w)},get selectedChannelID(){return t.selectedChannelID},get selectedDirectID(){return t.selectedDirectID},get hrefForChannel(){return t.hrefForChannel},get onSelectChannel(){return t.onSelectChannel},get onCreateChannel(){return t.onCreateChannel},onToggle:()=>h(`channels`),onReorder:x});var L=N(I,2);{let e=m(()=>t.currentUser?.id);Ki(L,{get expanded(){return b(l).directMessages},get conversations(){return t.directConversations},get currentUserID(){return b(e)},get selectedDirectID(){return t.selectedDirectID},get hrefForDirect(){return t.hrefForDirect},get onSelectDirect(){return t.onSelectDirect},get onCreateDirect(){return t.onCreateDirect},get onHideDirect(){return t.onHideDirect},get hiddenDirectTitle(){return t.hiddenDirectTitle},get onUndoHideDirect(){return t.onUndoHideDirect},onToggle:()=>h(`directMessages`)})}var ne=N(L,2);let re;var ie=A(ne),z=R(ie),ae=N(ie,2),oe=A(ae);F(oe,17,()=>t.recentPeople,e=>e.id,(e,n)=>{let a=m(()=>ut(t.directConversations,b(n).id,t.currentUser?.id));var o=Xi();let s;var l=A(o);pt(l,{class:`dm-avatar`,get id(){return b(n).id},get name(){return b(n).display_name},get src(){return b(n).avatar_url},size:22});var d=N(l,2),f=R(d,!0);te(2),r(o),B(e=>{j(o,`href`,e),s=i(o,1,`nav-item dm`,null,s,{active:b(a)?.id===t.selectedDirectID||t.selectedProfile?.id===b(n).id}),c(f,b(n).display_name)},[()=>b(a)?t.hrefForDirect(b(a).id):`#`]),_(`click`,o,e=>{if(b(a)){if(!T(e))return;e.preventDefault(),t.onSelectDirect(b(a).id)}else e.preventDefault(),t.onOpenProfile(b(n))}),u(e,o)});var se=N(oe,2),ce=e=>{var t=Zi();u(e,t)};f(se,e=>{t.recentPeople.length===0&&e(ce)}),r(ae),r(ne),r(P);var le=N(P,2),ue=e=>{var n=Qi(),i=A(n);pt(i,{class:`dm-avatar`,get id(){return t.currentUser.id},get name(){return t.currentUser.display_name},get src(){return t.currentUser.avatar_url},size:28,loading:`eager`,fetchPriority:`auto`});var a=N(i,2),o=A(a),s=R(o,!0),l=N(o,2),d=R(l,!0);r(a),te(2),r(n),B((e,r)=>{j(n,`aria-label`,e),c(s,t.currentUser.display_name),c(d,r)},[()=>`Account settings for ${t.currentUser.display_name} ${lt(t.currentUser.handle)}`,()=>t.currentUser.handle?lt(t.currentUser.handle):t.connected?`Active`:`Reconnecting…`]),_(`click`,n,function(...e){t.onOpenSettings?.apply(this,e)}),_(`contextmenu`,n,e=>{e.preventDefault(),t.onOpenSettings()}),u(e,n)};f(le,e=>{t.currentUser&&e(ue)}),r(D),B(()=>{re=i(ne,1,`nav-section`,null,re,{collapsed:!b(l).people}),j(z,`aria-expanded`,b(l).people),j(ae,`hidden`,!b(l).people)}),_(`click`,z,()=>h(`people`)),u(e,D),g()}s([`click`,`contextmenu`]);var ta=W(`
    Loading...
    `),na=W(`
    `),ra=W(`
    `),ia=W(`

    No pinned messages

    Pin important messages to keep them easily accessible.

    `),aa=W(`
    `),oa=W(`
    `),sa=W(`
    `),ca=W(` `,1),la=W(`

    Pinned Messages

    `);function ua(e,t){o(t,!0);let i=C(t,`loading`,3,!1),a=C(t,`error`,3,``),s=C(t,`topics`,19,()=>[]),l=C(t,`mentionPeople`,19,()=>[]),d=C(t,`maxPins`,3,100),p=U(ee(new Set)),v=U(``);async function y(e){if(!b(p).has(e.id)){V(p,new Set(b(p)).add(e.id),!0),V(v,``);try{await t.onUnpin(e)}catch(e){V(v,e instanceof Error?e.message:`Could not unpin message`,!0)}finally{let t=new Set(b(p));t.delete(e.id),V(p,t,!0)}}}var x=la(),S=A(x),w=A(S),T=A(w),E=N(A(T),2),D=R(E);r(T);var O=N(T,2),k=R(O);r(w);var M=N(w,2);r(S);var P=N(S,2),I=A(P),L=e=>{var t=ta();u(e,t)},te=e=>{var t=na(),n=R(t,!0);B(()=>c(n,a())),u(e,t)},ne=e=>{var i=ca(),a=ae(i),o=e=>{var t=ra(),n=R(t,!0);B(()=>c(n,b(v))),u(e,t)};f(a,e=>{b(v)&&e(o)});var d=N(a,2),g=e=>{var t=ia();u(e,t)},x=e=>{var i=sa();F(i,21,()=>t.messages,e=>e.id,(e,i)=>{let a=m(()=>s().find(e=>e.id===b(i).topic_id));var o=oa(),d=A(o),g=A(d),v=R(g,!0),x=N(g,2),S=R(x,!0);r(d);var C=N(d,2);_t(C,{get topic(){return b(a)},get onSelect(){return t.onSelectTopic}});var w=N(C,2);n(w,()=>Z(b(i).body),!0),r(w),h(w,e=>Ge?.(e)),h(w,(e,t)=>et?.(e,t),()=>({people:l(),attentionUserID:t.mentionAttentionUserID}));var T=N(w,2),E=e=>{var n=aa();F(n,21,()=>b(i).attachments,e=>e.id,(e,n)=>{{let r=m(()=>Ve(b(n)));Q(e,{get upload(){return b(n)},get url(){return b(r)},get onOpenImage(){return t.onOpenImage},get onOpenArtifact(){return t.onOpenArtifact}})}}),r(n),u(e,n)};f(T,e=>{b(i).attachments?.length&&e(E)});var D=N(T,2),O=A(D),k=N(O,2);r(D),r(o),B((e,t)=>{j(o,`data-message-id`,b(i).id),c(v,b(i).author?.display_name||`Unknown`),c(S,e),k.disabled=t},[()=>X(b(i).created_at),()=>b(p).has(b(i).id)]),_(`click`,O,()=>t.onOpenThread(b(i))),_(`click`,k,()=>y(b(i))),u(e,o)}),r(i),u(e,i)};f(d,e=>{t.messages.length===0?e(g):e(x,-1)}),u(e,i)};f(I,e=>{i()?e(L):a()?e(te,1):e(ne,-1)}),r(P),r(x),B(()=>{c(D,`${t.messages.length??``} / ${d()??``} pinned`),c(k,`Shared across this channel, with a maximum of ${d()??``} messages.`)}),_(`click`,M,function(...e){t.onClose?.apply(this,e)}),u(e,x),g()}s([`click`]);var da=W(` `,1),fa=W(`
    `),pa=W(`
    We couldn’t search messages

    `),ma=W(`
    No messages found

    Try another word or phrase.

    `),ha=W(`deleted bot`),ga=W(` `),_a=W(` `),va=W(` `),ya=W(` Reply in thread`),ba=W(` `),xa=W(`
  • `),Sa=W(``),Ca=W(``),wa=W(``),Ta=W(`
      `,1),Ea=W(``);function Da(e,t){o(t,!0);let n=C(t,`covered`,3,!1),a=C(t,`inert`,3,!1),s=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 y(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=v(`Searching messages…`);u(e,t)},te=e=>{var n=da(),r=ae(n),i=N(r),a=e=>{var n=v();B(()=>c(n,`in ${t.session.scope.label??``}`)),u(e,n)};f(i,e=>{t.session.scope.label&&e(a)}),B(()=>c(r,`${t.session.results.length??``}${t.session.nextCursor?`+`:``} - ${t.session.results.length===1&&!t.session.nextCursor?`result`:`results`}`)),u(e,n)},ne=e=>{var t=v(`Search unavailable`);u(e,t)};f(I,e=>{t.session.state===`loading`?e(L):t.session.state===`ready`?e(te,1):t.session.state===`error`&&e(ne,2)}),r(P);var re=N(P,2),ie=A(re),z=e=>{var t=fa();u(e,t)},oe=e=>{var n=pa(),i=N(A(n),4),a=R(i,!0);r(n),B(()=>c(a,t.session.error)),u(e,n)},se=e=>{var t=ma();u(e,t)},ce=e=>{var n=Ta(),a=ae(n);F(a,21,()=>t.session.results,e=>e.id,(e,n)=>{let a=m(()=>t.contextFor(b(n)));var o=xa(),s=A(o);let l;var h=A(s);{let e=m(()=>mt(b(n).author)?void 0:b(n).author.avatar_url);pt(h,{class:`dm-avatar`,get id(){return b(n).author.id},get name(){return b(n).author.display_name},get src(){return b(e)},size:30})}var g=N(h,2),S=A(g),C=A(S),w=R(C,!0),T=N(C,2),E=e=>{var t=ha();u(e,t)},D=m(()=>mt(b(n).author)),O=e=>{var t=ga(),r=R(t,!0);B(e=>c(r,e),[()=>lt(st(b(n).author))]),u(e,t)},k=m(()=>st(b(n).author));f(T,e=>{b(D)?e(E):b(k)&&e(O,1)});var ee=N(T,2),M=R(ee,!0);r(S);var P=N(S,2);F(P,21,()=>y(b(n).snippet,b(n).highlights),d,(e,t)=>{var n=p(),r=ae(n),i=e=>{var n=_a(),r=R(n,!0);B(()=>c(r,b(t).text)),u(e,n)},a=e=>{var n=v();B(()=>c(n,b(t).text)),u(e,n)};f(r,e=>{b(t).highlighted?e(i):e(a,-1)}),u(e,n)}),r(P);var I=N(P,2),L=A(I),te=e=>{var t=va(),n=R(t,!0);B(()=>c(n,b(a))),u(e,t)};f(L,e=>{b(a)&&e(te)});var ne=N(L,2),re=e=>{var t=ya();u(e,t)},ie=e=>{var t=ba(),i=N(A(t));r(t),B(()=>c(i,` ${b(n).reply_count??``} ${b(n).reply_count===1?`reply`:`replies`}`)),u(e,t)};f(ne,e=>{b(n).parent_message_id?e(re):b(n).reply_count>0&&e(ie,1)}),r(I),r(g),r(s),r(o),B(e=>{l=i(s,1,`search-result`,null,l,{"is-active":t.session.activeResultID===b(n).id}),j(s,`data-result-id`,b(n).id),c(w,b(n).author.display_name||`Local User`),j(ee,`datetime`,b(n).created_at),c(M,e)},[()=>x(b(n).created_at)]),_(`click`,s,()=>t.onOpenResult(b(n))),u(e,o)}),r(a);var o=N(a,2),s=e=>{var n=Sa(),i=A(n),a=R(i,!0),o=N(i,2);r(n),B(()=>c(a,t.session.moreError)),_(`click`,o,function(...e){t.onLoadMore?.apply(this,e)}),u(e,n)},l=e=>{var n=Ca(),r=R(n,!0);B(()=>{n.disabled=t.session.loadingMore,c(r,t.session.loadingMore?`Loading more…`:`Load more results`)}),_(`click`,n,function(...e){t.onLoadMore?.apply(this,e)}),u(e,n)},h=e=>{var t=wa();u(e,t)};f(o,e=>{t.session.moreError?e(s):t.session.nextCursor?e(l,1):e(h,-1)}),u(e,n)};f(ie,e=>{t.session.state===`loading`?e(z):t.session.state===`error`?e(oe,1):t.session.results.length===0?e(se,2):e(ce,-1)}),r(re),r(S),B(()=>{w=i(S,1,`search-results`,null,w,{covered:n()}),S.inert=a(),j(S,`aria-hidden`,n()?`true`:void 0),c(O,`Search${t.session.scope.label?` in ${t.session.scope.label}`:``}`),c(ee,`Results for “${t.session.query??``}”`)}),_(`click`,M,function(...e){t.onClose?.apply(this,e)}),u(e,S),g()}s([`click`]);var Oa=W(``),ka=W(`
      `),Aa=W(`

      `,1),ja=W(`
      `),Ma=W(``);function Na(e,t){o(t,!0);let n=C(t,`saving`,3,!1),i=C(t,`error`,3,``),a=U(!1),s=m(()=>!!t.channel.archived_at),l=m(()=>`#${bt(t.channel)}`);function d(){n()||t.onClose()}var p=Ma(),h=A(p),v=N(h,2),y=A(v),x=N(A(y),2);r(y);var S=N(y,2),w=A(S),T=A(w),E=R(T,!0);te(2),r(w);var D=N(w,2),O=e=>{var t=Oa(),n=R(t,!0);B(()=>c(n,i())),u(e,t)};f(D,e=>{i()&&e(O)});var k=N(D,2),j=e=>{var i=ka(),a=A(i),o=N(a,2),s=R(o,!0);r(i),B(()=>{a.disabled=n(),o.disabled=n(),c(s,n()?`Restoring...`:`Restore channel`)}),_(`click`,a,d),_(`click`,o,()=>t.onArchivedChange(!1)),u(e,i)},ee=e=>{var i=Aa(),o=ae(i),s=R(o),d=N(o,2),f=A(d),p=N(f,2),m=R(p,!0);r(d),B(()=>{c(s,`Archive ${b(l)??``}? The channel will remain available to workspace members under Archived.`),f.disabled=n(),p.disabled=n(),c(m,n()?`Archiving...`:`Archive channel`)}),_(`click`,f,()=>V(a,!1)),_(`click`,p,()=>t.onArchivedChange(!0)),u(e,i)},M=e=>{var t=ja(),i=A(t),o=N(i,2);r(t),B(()=>{i.disabled=n(),o.disabled=n()}),_(`click`,i,d),_(`click`,o,()=>V(a,!0)),u(e,t)};f(k,e=>{b(s)?e(j):b(a)?e(ee,1):e(M,-1)}),r(S),r(v),r(p),B(()=>{h.disabled=n(),x.disabled=n(),c(E,b(l))}),_(`click`,h,d),_(`click`,x,d),u(e,p),g()}s([`click`]);var Pa=W(`

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

      Browser notifications are not supported on this device.

      `),Ra=W(`

      Browser notifications are blocked by this browser.

      `),za=W(`

      `),Ba=W(`

      Show alerts when ClickClack is in the background.

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

      Add ClickClack to your Home Screen from the Share menu, then open it from there to turn this on.

      `),Ka=W(`

      This browser does not support push notifications.

      `),qa=W(`

      `),Ja=W(`

      `),Ya=W(`

      Receive alerts when the app is closed.

      `);function Xa(e,t){o(t,!0);let n=C(t,`isDesktop`,3,!1),a=`This browser is now signed in to a different account. Reload to continue.`,s=U(!1),l=U(!1),d=U(!1),h=U(!1),v=U(``),y=U(!1);E(()=>{S(t.user.id,n())});async function S(e,t){if(t){V(s,!1);return}V(l,zt(),!0);try{let t=b(l)?await an():null,n=await tn(t),r=n.enabled&&await on()!==e;if(V(s,n.enabled,!0),!n.enabled)return;if(r){V(d,!1),V(v,a),V(y,!0);return}V(d,!!t&&Zt(e)&&n.this_device,!0),!t&&Zt(e)&&Qt(e,!1)}catch{V(s,!1)}}async function w(e){let t=e.checked;V(v,``),V(y,!1),V(h,!0);try{t?await T():await D()}catch(e){t&&V(d,!1),V(v,xe(e,t?`Push notifications could not be turned on`:`Push notifications could not be turned off`),!0),V(y,!0)}finally{V(h,!1),e.checked=b(d)}}async function T(){let e=Notification.permission==="default"?await Notification.requestPermission():Notification.permission;if(e!==`granted`){V(d,!1),V(v,e===`denied`?`Notifications are blocked for this site. Allow them in your browser settings, then try again.`:`Notifications were not enabled.`,!0),V(y,!0);return}let[n,r]=await Promise.all([an().then(tn),on()]);if(!n.enabled){V(s,!1);return}if(r!==t.user.id){V(d,!1),V(v,a),V(y,!0);return}await sn(await rn(await nn(),n,t.user.id),t.user.id),Qt(t.user.id,!0),V(d,!0),V(v,`On for this device`)}async function D(){if(await on()!==t.user.id){V(v,a),V(y,!0);return}let e=await an();e&&await cn(e.endpoint,t.user.id),Qt(t.user.id,!1),en(t.user.id,``),V(d,!1),e&&(await e.unsubscribe(),V(v,`Off for this device`))}let O=m(()=>!b(l)&&Vt()&&!Bt());var k=p(),j=ae(k),ee=e=>{var t=Ya(),n=A(t),a=N(A(n),4),o=e=>{var t=Ga();u(e,t)},s=e=>{var t=Ka();u(e,t)},p=e=>{var t=qa(),n=R(t);B(e=>c(n,`On for ${e??``}`),[()=>Ht()]),u(e,t)};f(a,e=>{b(O)?e(o):b(l)?b(d)&&e(p,2):e(s,1)});var m=N(a,2),g=e=>{var t=Ja();let n;var r=R(t,!0);B(()=>{n=i(t,1,`settings-row2__hint`,null,n,{"is-error":b(y)}),c(r,b(v))}),u(e,t)};f(m,e=>{b(v)&&e(g)}),r(n);var S=N(n,2),C=A(S);M(C),r(S),r(t),B(()=>{C.disabled=!b(l)||b(h),x(C,b(d))}),_(`change`,C,e=>void w(e.currentTarget)),u(e,t)};f(j,e=>{b(s)&&e(ee)}),u(e,k),g()}s([`change`]);var Za=W(`

      Desktop

      Mobile push

      Send push notifications to your phone via Pushover.

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

      `);function Qa(e,t){o(t,!0);let n=C(t,`isDesktop`,3,!1),i=U(!1),a=U(``);E(()=>{V(i,t.user.notification_settings?.pushover_enabled??!1,!0),V(a,t.user.notification_settings?.pushover_user_key??``,!0)}),Ia(e,{section:`notifications`,get onUserUpdated(){return t.onUserUpdated},payload:()=>({notification_settings:{pushover_enabled:b(i),pushover_user_key:b(a)}}),children:(e,o)=>{var s=Za(),c=N(A(s),2);Va(c,{get user(){return t.user},get isDesktop(){return n()},get onChanged(){return t.onBrowserNotificationsChanged}});var l=N(c,4);Xa(l,{get user(){return t.user},get isDesktop(){return n()}});var d=N(l,2),f=N(A(d),2),p=A(f);M(p),r(f),r(d);var m=N(d,2),h=N(A(m),2),g=A(h);M(g),r(h),r(m),r(s),D(p,()=>b(i),e=>V(i,e)),z(g,()=>b(a),e=>V(a,e)),u(e,s)},$$slots:{default:!0}}),g()}var $a=W(`

      Loading…

      `),eo=W(`

      `),to=W(`
      You don't own any bots yet. Open a workspace's Bots & agents page to mint one.
      `),no=W(``),ro=W(`
    • `),io=W(`

        `),ao=W(`
        `),oo=W(`

        Account

        My bots

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

        `,1);function so(e,t){o(t,!0);let n=U(ee([])),i=U(`loading`),a=U(``);oe(()=>{s()});async function s(){V(i,`loading`);try{V(n,await wt(),!0),V(i,`ready`)}catch(e){V(i,`error`),V(a,Tt(e),!0)}}function l(e){t.onClose(),fe(Re(e.workspace.route_id||e.workspace.id,`bots`))}function d(e){return e.startsWith(`@`)?e:`@${e}`}function p(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 h=m(()=>{let e=new Map;for(let t of b(n)){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=oo(),x=N(ae(y),2),S=e=>{var t=$a();u(e,t)},C=e=>{var t=eo(),n=R(t,!0);B(()=>c(n,b(a))),u(e,t)},w=e=>{var t=to();u(e,t)},T=e=>{var t=ao();F(t,21,()=>b(h),e=>e.workspace.id,(e,t)=>{var n=io(),i=A(n),a=A(i),o=R(a,!0),s=N(a,2);r(i);var m=N(i,2);F(m,21,()=>b(t).entries,e=>e.bot.id,(e,t)=>{var n=ro(),i=A(n),a=A(i),o=e=>{var n=no();B(()=>j(n,`src`,b(t).bot.avatar_url)),u(e,n)},s=e=>{var n=v();B(e=>c(n,e),[()=>p(b(t).bot.display_name||b(t).bot.handle||`?`)]),u(e,n)};f(a,e=>{b(t).bot.avatar_url?e(o):e(s,-1)}),r(i);var m=N(i,2),h=A(m),g=R(h,!0),y=N(h,2),x=A(y),S=R(x,!0),C=N(x,4),w=R(C);r(y),r(m);var T=N(m,2);r(n),B(e=>{c(g,b(t).bot.display_name||b(t).bot.handle),c(S,e),c(w,`${b(t).active_token_count??``} - active ${b(t).active_token_count===1?`token`:`tokens`}`)},[()=>d(b(t).bot.handle)]),_(`click`,T,()=>l(b(t))),u(e,n)}),r(m),r(n),B(()=>c(o,b(t).workspace.name)),_(`click`,s,()=>l(b(t).entries[0])),u(e,n)}),r(t),u(e,t)};f(x,e=>{b(i)===`loading`?e(S):b(i)===`error`?e(C,1):b(n).length===0?e(w,2):e(T,-1)}),u(e,y),g()}s([`click`]);function co(e,t){return t.includes(`password`)&&e.password_enrolled===!0}function lo(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 uo=W(`

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

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

        Workspace

        `,1),Eo=W(`

        `),Do=W(`
      • `),Oo=W(`
          `),ko=W(`

          Loading...

          `),Ao=W(`

          `),jo=W(`

          `),Mo=W(`

          Account

          Profile settings

          How you appear across ClickClack.

          Sign out

          End this session on this device.

          `,1),No=W(`

          Account

          Notifications

          Decide when and how ClickClack should reach you.

          `,1),Po=W(``);function Fo(e,t){o(t,!0);let n=C(t,`workspaces`,19,()=>[]),a=C(t,`currentWorkspaceID`,3,``),s=C(t,`initialSection`,3,Ie),l=C(t,`isDesktop`,3,!1),d=U(``),h=m(()=>n().find(e=>e.id===b(d))??K(n(),a())),v=U(!1),x=U(``),S=U(ee(Ie)),w=m(()=>co(t.user,ge())),D=U(`loading`),k=U(``);E(()=>{V(S,s(),!0)}),E(()=>{b(S);let e=new AbortController;return P(e.signal),()=>e.abort()});async function M(){if(!b(v)){V(v,!0),V(x,``);try{await G(`/api/auth/logout`,{method:`POST`,body:JSON.stringify({})}),window.location.reload()}catch(e){V(x,xe(e,`Could not sign out. Try again.`),!0),V(v,!1)}}}async function P(e){V(D,`loading`),V(k,``);try{let n=await Ce({signal:e});e.throwIfAborted(),t.onUserUpdated(n.user),V(D,`ready`)}catch(t){if(e.aborted)return;if(t instanceof be&&(t.status===401||t.status===403)){V(D,`error`),V(k,`Sign in to manage your account`);return}V(D,`error`),V(k,t instanceof Error?t.message:`Could not load your account`,!0)}}function I(e){e.target===e.currentTarget&&t.onClose()}function L(e){if(e.key!==`Escape`)return;let n=e.target;(!n||n.tagName!==`INPUT`&&n.tagName!==`TEXTAREA`&&!n.isContentEditable)&&(e.preventDefault(),t.onClose())}function te(e,n){t.onClose(),fe(Re(e.route_id||e.id,n))}var ne=Po();y(`keydown`,O,L);var re=A(ne),ie=A(re),z=N(ie,2),oe=A(z),se=N(A(oe),2);F(se,21,()=>q,e=>e.id,(e,n)=>{var a=Co(),o=A(a);let s;var l=A(o),d=e=>{var r=yo(),i=ae(r);pt(i,{class:`settings-modal__rail-avatar`,get id(){return t.user.id},get name(){return t.user.display_name},get src(){return t.user.avatar_url},size:18});var a=N(i,2),o=R(a,!0);B(()=>c(o,t.user.display_name||b(n).label)),u(e,r)},p=e=>{var t=bo(),r=N(ae(t),2),i=R(r,!0);B(()=>c(i,b(n).label)),u(e,t)},m=e=>{var t=xo(),r=N(ae(t),2),i=R(r,!0);B(()=>c(i,b(n).label)),u(e,t)},h=e=>{var t=So(),r=N(ae(t),2),i=R(r,!0);B(()=>c(i,b(n).label)),u(e,t)};f(l,e=>{b(n).id===`profile`?e(d):b(n).id===`appearance`?e(p,1):b(n).id===`notifications`?e(m,2):b(n).id===`bots`&&e(h,3)}),r(o),r(a),B(()=>{s=i(o,1,`settings-modal__rail-item`,null,s,{"is-active":b(S)===b(n).id}),j(o,`aria-current`,b(S)===b(n).id?`page`:void 0)}),_(`click`,o,()=>V(S,b(n).id,!0)),u(e,a)}),r(se),r(oe);var ce=N(oe,2),le=e=>{var t=Oo(),i=A(t),o=e=>{var t=To(),i=N(ae(t),4);F(i,21,n,e=>e.id,(e,t)=>{var n=wo(),r=R(n,!0),i={};B(e=>{c(r,e),i!==(i=b(t).id)&&(n.value=(n.__value=i)??``)},[()=>Le(b(t),a())?`${b(t).name} (current)`:b(t).name]),u(e,n)}),r(i);var o;T(i),B(()=>{o!==(o=b(h).id)&&(i.value=(i.__value=o)??``,ue(i,o))}),_(`change`,i,e=>V(d,e.currentTarget.value,!0)),u(e,t)},s=e=>{var t=Eo(),n=R(t);B(()=>{j(t,`title`,b(h).name),c(n,`Workspace · ${b(h).name??``}`)}),u(e,t)};f(i,e=>{n().length>1?e(o):e(s,-1)});var l=N(i,2);F(l,21,()=>Fe,e=>e.id,(e,t)=>{var n=p(),i=ae(n),a=e=>{var n=Do(),i=A(n),a=N(A(i),2),o=R(a,!0);r(i),r(n),B(()=>c(o,b(t).label)),_(`click`,i,()=>te(b(h),b(t).slug)),u(e,n)},o=m(()=>!b(t).managersOnly||ze(b(h).role));f(i,e=>{b(o)&&e(a)}),u(e,n)}),r(l),r(t),u(e,t)};f(ce,e=>{b(h)&&e(le)}),r(z);var H=N(z,2),W=A(H),de=e=>{var t=ko();u(e,t)},pe=e=>{var t=Ao(),n=R(t,!0);B(()=>c(n,b(k))),u(e,t)},me=e=>{var n=Mo(),i=N(ae(n),2);Wa(i,{get user(){return t.user},get hideCommentary(){return t.hideCommentary},get hideToolCalls(){return t.hideToolCalls},get userAlign(){return t.userAlign},get otherAlign(){return t.otherAlign},get isDesktop(){return l()},get onUserUpdated(){return t.onUserUpdated},get onSaved(){return t.onClose},get onHideCommentary(){return t.onHideCommentary},get onHideToolCalls(){return t.onHideToolCalls},get onUserAlign(){return t.onUserAlign},get onOtherAlign(){return t.onOtherAlign},get onBrowserNotificationsChanged(){return t.onBrowserNotificationsChanged}});var a=N(i,2),o=e=>{mo(e,{})};f(a,e=>{b(w)&&e(o)});var s=N(a,2),d=A(s),p=N(A(d),4),m=e=>{var t=jo(),n=R(t,!0);B(()=>c(n,b(x))),u(e,t)};f(p,e=>{b(x)&&e(m)}),r(d);var h=N(d,2),g=A(h),y=R(g,!0);r(h),r(s),B(()=>{g.disabled=b(v),c(y,b(v)?`Signing out...`:`Sign out`)}),_(`click`,g,M),u(e,n)},he=e=>{vo(e,{get user(){return t.user}})},_e=e=>{var n=No();Qa(N(ae(n),2),{get user(){return t.user},get isDesktop(){return l()},get onUserUpdated(){return t.onUserUpdated},get onBrowserNotificationsChanged(){return t.onBrowserNotificationsChanged}}),u(e,n)},ve=e=>{so(e,{get onClose(){return t.onClose}})};f(W,e=>{b(D)===`loading`?e(de):b(D)===`error`?e(pe,1):b(S)===`profile`?e(me,2):b(S)===`appearance`?e(he,3):b(S)===`notifications`?e(_e,4):b(S)===`bots`&&e(ve,5)}),r(H),r(re),r(ne),_(`click`,ne,I),_(`click`,ie,function(...e){t.onClose?.apply(this,e)}),u(e,ne),g()}s([`click`,`change`]);var Io=W(`
          No thread open Hover any message and tap the bubble to keep side conversations tidy.
          `);function Lo(e){var t=Io();u(e,t)}var Ro=W(``),zo=W(`

          `,1),Bo=W(``),Vo=W(``),Ho=W(``),Uo=W(``),Wo=W(``),Go=W(``),Ko=W(``),qo=W(`
          `),Jo=W(`Connecting…`),Yo=W(`
          `);function Xo(e,t){o(t,!0);function n(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=C(t,`channelNotifPreference`,3,void 0),s=C(t,`channelNotifSaving`,3,!1),l=C(t,`channelSettingsAvailable`,3,!1),d=C(t,`pinsAvailable`,3,!1),p=C(t,`pinnedOpen`,3,!1),h=C(t,`onOpenChannelSettings`,3,()=>{}),v=C(t,`onToggleChannelNotifications`,3,()=>{}),x=m(()=>yt(t.externalURL));var S=Yo(),w=A(S),T=A(w),E=A(T),D=A(E),O=N(A(D),2);r(D),r(E);var k=N(E,2),ee=R(k,!0),P=N(k,2),F=e=>{var n=zo(),r=N(ae(n),2),i=R(r,!0),a=N(r,2),o=e=>{var t=Ro();B(()=>j(t,`href`,b(x))),u(e,t)};f(a,e=>{b(x)&&e(o)}),B(()=>{j(r,`title`,t.channelTitle),c(i,t.channelTitle)}),u(e,n)};f(P,e=>{t.channelTitle&&e(F)}),r(T);var I=N(T,2),L=N(A(I),2);M(L);var ne=N(L,2),re=e=>{var n=Bo();_(`click`,n,function(...e){t.onResetSearch?.apply(this,e)}),u(e,n)};f(ne,e=>{t.searchQuery&&e(re)}),te(2),r(I);var ie=N(I,2),z=e=>{var o=qo(),c=A(o),m=e=>{var t=Wo(),i=A(t),o=e=>{var t=Vo();u(e,t)},c=e=>{var t=Ho();u(e,t)},l=e=>{var t=Uo();u(e,t)};f(i,e=>{a()===`muted`?e(o):a()===`mentions`?e(c,1):e(l,-1)}),r(t),B((e,n)=>{j(t,`title`,e),j(t,`aria-label`,n),j(t,`aria-busy`,s()),t.disabled=s()},[()=>n(a()),()=>n(a())]),_(`click`,t,function(...e){v()?.apply(this,e)}),u(e,t)};f(c,e=>{a()&&e(m)});var g=N(c,2),y=e=>{var n=Go();let r;B(()=>{j(n,`title`,p()?`Close pinned items`:`Pinned items`),j(n,`aria-label`,p()?`Close pinned items`:`Pinned items`),r=i(n,1,``,null,r,{active:p()})}),_(`click`,n,function(...e){t.onPinnedItems?.apply(this,e)}),u(e,n)};f(g,e=>{d()&&e(y)});var b=N(g,2),x=e=>{var t=Ko();_(`click`,t,function(...e){h()?.apply(this,e)}),u(e,t)};f(b,e=>{l()&&e(x)}),r(o),u(e,o)};f(ie,e=>{(a()||d()||l())&&e(z)});var oe=N(ie,2),se=e=>{var t=Jo();u(e,t)};f(oe,e=>{t.connected||e(se)}),r(w),r(S),B(()=>{j(S,`data-platform`,t.platform),j(E,`aria-label`,t.mobileNavigation?t.mobileNavOpen?`Close navigation`:`Open navigation`:t.sidebarCollapsed?`Expand sidebar`:`Collapse sidebar`),j(E,`title`,t.mobileNavigation?t.mobileNavOpen?`Close navigation`:`Open navigation`:t.sidebarCollapsed?`Expand sidebar`:`Collapse sidebar`),j(O,`d`,t.mobileNavigation?t.mobileNavOpen?`m15 9-3 3 3 3`:`m9 9 3 3-3 3`:t.sidebarCollapsed?`m13 9 3 3-3 3`:`m16 9-3 3 3 3`),c(ee,t.workspaceName||`ClickClack`),le(L,t.searchQuery)}),_(`click`,E,function(...e){t.onToggleSidebar?.apply(this,e)}),_(`click`,k,function(...e){t.onOpenWorkspaceSettings?.apply(this,e)}),y(`submit`,I,e=>{e.preventDefault(),t.onSearch()}),_(`input`,L,e=>t.onSearchQuery(e.currentTarget.value)),u(e,S),g()}s([`click`,`input`]);var Zo=W(`

          `),Qo=W(``),$o=W(``),es=W(``),ts=W(``),ns=W(`

          `,1),rs=W(`

          ClickClack

          `),is=W(``),as=W(``),os=W(``),ss=W(``),cs=W(`

          `);function ls(e,t){o(t,!0);function n(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=C(t,`pinnedOpen`,3,!1),s=C(t,`channelNotifPreference`,3,void 0),l=C(t,`channelNotifSaving`,3,!1),d=C(t,`channelSettingsAvailable`,3,!1),p=C(t,`onOpenChannelSettings`,3,()=>{}),h=C(t,`onToggleChannelNotifications`,3,()=>{}),v=m(()=>t.selectedDirect?void 0:yt(t.selectedChannel?.external_url));var x=cs(),S=A(x),w=A(S),T=e=>{var n=Zo(),r=R(n,!0);B(e=>c(r,e),[()=>`@${ot(t.selectedDirect,t.currentUserID)}`]),u(e,n)},E=e=>{var i=ns(),a=ae(i),o=R(a,!0),d=N(a,2),p=e=>{var t=ts(),i=A(t),a=e=>{var t=Qo();u(e,t)},o=e=>{var t=$o();u(e,t)},c=e=>{var t=es();u(e,t)};f(i,e=>{s()===`muted`?e(a):s()===`mentions`?e(o,1):e(c,-1)}),r(t),B((e,n)=>{j(t,`title`,e),j(t,`aria-label`,n),j(t,`aria-busy`,l()),t.disabled=l()},[()=>n(s()),()=>n(s())]),_(`click`,t,function(...e){h()?.apply(this,e)}),u(e,t)};f(d,e=>{s()&&e(p)}),B(e=>c(o,e),[()=>`#${bt(t.selectedChannel)}`]),u(e,i)},D=e=>{var t=rs();u(e,t)};f(w,e=>{t.selectedDirect?e(T):t.selectedChannel?e(E,1):e(D,-1)});var O=N(w,4),k=R(O,!0);r(S);var ee=N(S,2),P=N(A(ee),2);M(P);var F=N(P,2),I=e=>{var n=is();_(`click`,n,function(...e){t.onResetSearch?.apply(this,e)}),u(e,n)};f(F,e=>{t.searchQuery&&e(I)}),te(2),r(ee);var L=N(ee,2),ne=A(L),re=e=>{var t=as();B(()=>j(t,`href`,b(v))),u(e,t)};f(ne,e=>{b(v)&&e(re)});var ie=N(ne,2);let z;var oe=N(ie,2),se=e=>{var n=os();let r;B(()=>{j(n,`title`,a()?`Close pinned items`:`Pinned items`),j(n,`aria-label`,a()?`Close pinned items`:`Pinned items`),r=i(n,1,``,null,r,{active:a()})}),_(`click`,n,function(...e){t.onPinnedItems?.apply(this,e)}),u(e,n)};f(oe,e=>{t.selectedChannel&&e(se)});var ce=N(oe,2),V=e=>{var t=ss();_(`click`,t,function(...e){p()?.apply(this,e)}),u(e,t)};f(ce,e=>{t.selectedChannel&&d()&&e(V)}),r(L),r(x),B(()=>{c(k,t.workspaceName||`no workspace`),le(P,t.searchQuery),j(ie,`title`,t.threadOpen?`Close thread`:`Open a message thread`),j(ie,`aria-label`,t.threadOpen?`Close thread`:`Open a message thread`),z=i(ie,1,``,null,z,{active:t.threadOpen})}),y(`submit`,ee,e=>{e.preventDefault(),t.onSearch()}),_(`input`,P,e=>t.onSearchQuery(e.currentTarget.value)),_(`click`,ie,function(...e){t.onToggleThread?.apply(this,e)}),u(e,x),g()}s([`click`,`input`]);function us(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 ds(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=us(a.userId,t,n);e&&i.push(e)}return i}async function fs(e){return(await G(`/api/workspaces/${e}/bot-commands`)).bot_commands??[]}function ps(e){let t=e.trim().toLowerCase();return t?t.startsWith(`/`)?t:`/${t}`:``}function ms(e){let t=/^(\/\S+)\s*([\s\S]*)$/.exec(e);return t?{command:ps(t[1]),text:t[2].trim()}:null}function hs(e,t){return e.find(e=>!e.revoked_at&&ps(e.command)===t)}async function gs(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 _s=e({default:()=>Ms}),vs=W(``),ys=W(``),bs=W(``),xs=W(`
          Showing topic
          `),Ss=W(`

          `),Cs=W(`
          `),ws=W(``),Ts=W(``),Es=W(``),Ds=W(` `,1),Os=W(`

          Loading thread…

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

          Preparing a safe preview.

          `),hr=W(``),gr=W(`
          No preview for this file type

          You can still download the original file.

          Download original
          `),_r=W(`
          `,1),vr=W(` `),yr=W(` `),br=W(` `),xr=W(` `),Sr=W(`

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

          `),Cr=W(``),wr=W(`
          Raw cached values; number and date formatting omitted
          `,1),Tr=W(`

          `),Er=W(`

          `),Dr=W(`

          `),Or=W(`

          Some slide content was omitted by preview limits.

          `),kr=W(`

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

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

          or

          `),zr=W(` `,1),Br=W(``),Vr=W(``),Hr=W(`

          `),Ur=W(`
          ClickClack OpenClaw workspace chat

          Welcome.

          Have a sign-in token?
          `,1);function Wr(e,t){o(t,!0);let n=Rt?.integratedTitleBar===!0,i=U(``),a=ge(),s=a.includes(`github`),l=a.includes(`password`),d=!Rt&&a.includes(`openclaw`),p=U(``),m=U(``),h=U(``),v=U(!1),x=U(``),S=l?s?`Sign in with your ClickClack account, or continue with GitHub.`:`Sign in with your ClickClack account.`:s?`Sign in with GitHub to join the guest room.`:d?`Sign in with OpenClaw ID to join the guest room.`:`Sign in with a token from your ClickClack administrator.`,C=s&&!l?`Any GitHub account can join.`:``;async function w(e){if(Rt){e.preventDefault(),V(i,`Opening GitHub in your browser…`);try{await Rt.signInWithGitHub(),V(i,`Finish signing in in your browser. ClickClack will complete here automatically.`)}catch{V(i,`Could not open your browser. Try again.`)}}}async function T(e,t){if(!b(v)){V(v,!0),V(x,``);try{await G(e,{method:`POST`,body:JSON.stringify(t)}),window.location.reload()}catch(e){V(x,xe(e,`Could not sign in.`),!0),V(v,!1)}}}function E(e){e.preventDefault(),T(`/api/auth/password/login`,{identifier:b(p),password:b(m)})}function D(e){e.preventDefault(),T(`/api/auth/magic/consume`,{token:b(h)})}var O=Ur(),k=ae(O),ee=e=>{var t=Ir();B(()=>j(t,`data-platform`,Rt.platform)),u(e,t)};f(k,e=>{n&&Rt&&e(ee)});var P=N(k,2),F=A(P),I=A(F),L=A(I);Z(L,{class:`mark`,size:44}),te(2),r(I);var ne=N(I,2),re=N(A(ne),2),ie=R(re,!0);r(ne);var oe=N(ne,2),se=e=>{var t=Lr(),n=A(t),i=N(A(n),2);M(i),r(n);var a=N(n,2),o=N(A(a),2);M(o),r(a);var s=N(a,2),l=R(s,!0);r(t),B(()=>{s.disabled=b(v),c(l,b(v)?`Signing in...`:`Sign in`)}),y(`submit`,t,E),z(i,()=>b(p),e=>V(p,e)),z(o,()=>b(m),e=>V(m,e)),u(e,t)};f(oe,e=>{l&&e(se)});var ce=N(oe,2),le=e=>{var t=zr(),n=ae(t),r=e=>{var t=Rr();u(e,t)};f(n,e=>{l&&e(r)});var i=N(n,2);B(e=>j(i,`href`,e),[()=>he(`/api/auth/github/start`)]),_(`click`,i,w),u(e,t)};f(ce,e=>{s&&e(le)});var ue=N(ce,2),H=e=>{var t=Br();B(e=>j(t,`href`,e),[()=>he(`/api/auth/openclaw/start`)]),u(e,t)};f(ue,e=>{d&&e(H)});var W=N(ue,2),de=e=>{var t=Vr(),n=R(t,!0);B(()=>c(n,b(x))),u(e,t)};f(W,e=>{b(x)&&e(de)});var fe=N(W,2),pe=N(A(fe),2),me=A(pe),_e=N(A(me),2);M(_e),r(me);var ve=N(me,2);r(pe),r(fe);var ye=N(fe,2),be=e=>{var t=Hr(),n=R(t,!0);B(()=>c(n,b(i)||C)),u(e,t)};f(ye,e=>{(b(i)||C)&&e(be)}),r(F),r(P),B(()=>{c(ie,S),fe.open=!s&&!l&&!d,ve.disabled=b(v)}),y(`submit`,pe,D),z(_e,()=>b(h),e=>V(h,e)),u(e,O),g()}s([`click`]);var Gr=W(``),Kr=W(``);function qr(e,t){o(t,!0);let n=C(t,`deleting`,3,!1),i=C(t,`error`,3,``),a=m(()=>t.message.author?.display_name||`Local User`);function s(){n()||t.onClose()}var l=Kr(),d=A(l),p=N(d,2),h=A(p),v=N(A(h),2);r(h);var y=N(h,2),x=N(A(y),2),S=A(x);{let e=m(()=>t.message.author?.id||t.message.author_id),n=m(()=>t.message.author?.avatar_url);pt(S,{class:`avatar`,get id(){return b(e)},get name(){return b(a)},get src(){return b(n)},size:36,loading:`eager`,fetchPriority:`auto`})}var w=N(S,2),T=A(w),E=A(T),D=R(E,!0),O=N(E,2),k=R(O,!0);r(T);var ee=N(T,2),M=R(ee,!0);r(w),r(x);var P=N(x,2),F=e=>{var t=Gr(),n=R(t,!0);B(()=>c(n,i())),u(e,t)};f(P,e=>{i()&&e(F)});var I=N(P,2),L=A(I),te=N(L,2),ne=R(te,!0);r(I),r(y),r(p),r(l),B(e=>{d.disabled=n(),v.disabled=n(),c(D,b(a)),j(O,`datetime`,t.message.created_at),c(k,e),c(M,t.message.body),L.disabled=n(),te.disabled=n(),c(ne,n()?`Deleting...`:`Delete`)},[()=>$e(t.message.created_at)]),_(`click`,d,s),_(`click`,v,s),_(`click`,L,s),_(`click`,te,function(...e){t.onConfirm?.apply(this,e)}),u(e,l),g()}s([`click`]);var Jr=6500,Yr=W(`
          `);function Xr(e,t){o(t,!0);let n=m(()=>t.entries.filter(e=>e.userID!==t.currentUserID));function a(e,t=`Someone`){return e?.display_name?.trim()||(e?.handle?`@${e.handle}`:t)}let s=m(()=>b(n).length===0?``:b(n).length===1?`${a(b(n)[0].user)} is typing…`:b(n).length===2?`${a(b(n)[0].user)} and ${a(b(n)[1].user)} are typing…`:b(n).length===3?`${a(b(n)[0].user)}, ${a(b(n)[1].user)}, and ${a(b(n)[2].user)} are typing…`:`Several people are typing…`);var l=Yr();let d;var f=N(A(l),2),p=R(f,!0);r(l),B(()=>{d=i(l,1,`typing-indicator`,null,d,{visible:b(n).length>0}),c(p,b(s))}),u(e,l),g()}var Zr=W(`
          `),Qr=W(`
          `),$r=W(`
          `);function ei(e,t){o(t,!0);function n(e){return e.kind===`tool`&&e.toolName?!e.text||e.text===e.toolName?e.toolName:`${e.toolName}: ${e.text}`:e.text}function a(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 s=p(),l=ae(s),d=e=>{var o=$r();F(o,21,()=>t.turns,e=>e.key,(e,t)=>{var o=Qr();F(o,21,()=>b(t).lines,e=>e.id,(e,t)=>{var o=Zr();let s;var l=A(o),d=R(l,!0),f=N(l,2),p=R(f,!0);r(o),B((e,n)=>{s=i(o,1,`agent-progress__line svelte-6vwkyv`,null,s,{"agent-progress__line--done":b(t).finalized}),j(o,`data-kind`,b(t).kind),c(d,e),c(p,n)},[()=>a(b(t).kind),()=>n(b(t))]),u(e,o)}),r(o),u(e,o)}),r(o),u(e,o)};f(l,e=>{t.turns.length>0&&e(d)}),u(e,s),g()}function ti(e,t){return`${e}\u0000${t}`}var ni=45e3;function ri(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=ti(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+ni;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 ii=W(``),ai=W(``);function oi(e,t){o(t,!0);var n=ai(),i=A(n),a=N(i,2),s=A(a),l=N(A(s),2);r(s);var d=N(s,2),p=A(d),m=N(A(p),2);M(m),r(p);var h=N(p,2),v=e=>{var n=ii(),r=R(n,!0);B(()=>c(r,t.error)),u(e,n)};f(h,e=>{t.error&&e(v)});var b=N(h,2),x=A(b),S=N(x,2),C=R(S,!0);r(b),r(d),r(a),r(n),B(e=>{le(m,t.channelName),m.disabled=t.pending,S.disabled=e,c(C,t.pending?`Creating…`:`Create channel`)},[()=>t.pending||!t.channelName.trim()]),_(`click`,i,function(...e){t.onClose?.apply(this,e)}),_(`click`,l,function(...e){t.onClose?.apply(this,e)}),y(`submit`,d,e=>{e.preventDefault(),t.onCreate()}),_(`input`,m,e=>t.onChannelName(e.currentTarget.value)),_(`click`,x,function(...e){t.onClose?.apply(this,e)}),u(e,n),g()}s([`click`,`input`]);var si=W(``),ci=W(`
          No matching people yet
          `),li=W(`

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

          Creating workspace…

          `),vi=W(`
          `),yi=W(``);function bi(e,t){o(t,!0);let n=C(t,`homeHref`,3,`/`),a=C(t,`homeLabel`,3,`cc`),s=C(t,`homeTitle`,3,`ClickClack home`);function l(e){return e.button===0&&!e.metaKey&&!e.ctrlKey&&!e.shiftKey&&!e.altKey}var d=yi(),p=A(d);let h;var v=A(p),x=e=>{Z(e,{size:48})},S=m(()=>jt(a())),w=e=>{var t=pi(),n=R(t,!0);B(()=>c(n,a())),u(e,t)};f(v,e=>{b(S)?e(x):e(w,-1)}),r(p);var T=N(p,4),E=A(T);F(E,17,()=>t.workspaces,e=>e.id,(e,n)=>{var a=hi();let o;var s=A(a),d=A(s),p=e=>{var t=mi();B(e=>j(t,`src`,e),[()=>_e(b(n).icon_url)]),u(e,t)},m=e=>{var t=pi(),r=R(t,!0);B(e=>c(r,e),[()=>dt(b(n).name)]),u(e,t)};f(d,e=>{b(n).icon_url?e(p):e(m,-1)}),r(s),r(a),B(e=>{o=i(a,1,`guild-wrap`,null,o,{active:b(n).id===t.selectedWorkspaceID}),j(s,`title`,b(n).name),j(s,`aria-label`,b(n).name),j(s,`href`,e)},[()=>t.hrefForWorkspace(b(n).id)]),_(`click`,s,e=>{l(e)&&(e.preventDefault(),t.onSelectWorkspace(b(n).id))}),u(e,a)});var D=N(E,2);r(T);var O=N(T,2),k=e=>{var n=vi(),i=A(n);M(i);var a=N(i,2),o=e=>{var n=gi(),r=R(n,!0);B(()=>c(r,t.createError)),u(e,n)};f(a,e=>{t.createError&&e(o)});var s=N(a,2),l=e=>{var t=_i();u(e,t)};f(s,e=>{t.createPending&&e(l)}),r(n),B(()=>{le(i,t.workspaceName),i.disabled=t.createPending}),y(`submit`,n,e=>{e.preventDefault(),t.onCreateWorkspace()}),_(`input`,i,e=>t.onWorkspaceName(e.currentTarget.value)),u(e,n)};f(O,e=>{t.showWorkspaceCreate&&e(k)}),r(d),B(e=>{h=i(p,1,`guild home`,null,h,{"home--mark":e}),j(p,`title`,s()),j(p,`aria-label`,s()),j(p,`href`,n())},[()=>jt(a())]),_(`click`,D,function(...e){t.onToggleWorkspaceCreate?.apply(this,e)}),u(e,d),g()}s([`click`,`input`]);var xi=`clickclack:sidebar-channel-order:v1:`,Si=new Map,Ci=new Map;function wi(e,t){return`${xi}${t}:${e}`}function Ti(e){if(!e||e.length>1e6)return[];try{let t=JSON.parse(e);return Array.isArray(t)&&t.length<=1e4&&t.every(e=>typeof e==`string`&&e.length<=128)?[...new Set(t)]:[]}catch{return[]}}function Ei(e,t){try{window.localStorage.setItem(e,JSON.stringify(t))}catch{}}function Di(e,t,n){e?.startsWith(`${xi}${n}:`)&&Si.set(e,Ti(t))}function Oi(e,t){if(!e?.id||!t)return[];let n=wi(t,e.id),r=Si.get(n);if(r)return r;let i=[];try{i=Ti(window.localStorage.getItem(n))}catch{}let a=e.sidebar_preferences?.channel_order?.[t];if(a===void 0)return i;let o=a.length?[...new Set([...a,...i])].slice(0,1e4):[];return Ei(n,o),o}function ki(e,t,n,r,i){let a=wi(t,e);Si.set(a,n),Ei(a,n);let o=(Ci.get(a)??Promise.resolve()).then(async()=>{if(Si.get(a)===n&&i())try{let e=JSON.stringify({sidebar_preferences:{channel_order:{[t]:n.slice(0,500)}}});await r(`/api/me`,{method:`PATCH`,keepalive:new TextEncoder().encode(e).length<6e4,body:e})}catch{}});return Ci.set(a,o),o.then(()=>{Ci.get(a)===o&&Ci.delete(a)}),o}var Ai=W(``),ji=W(` `,1),Mi=W(``),Ni=W(` `),Pi=W(``),Fi=W(`
          `),Ii=W(``),Li=W(`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),Ri=W(`
          `);function zi(e,n){o(n,!0);let a=(e,t=I,a=I,o=I,s=I,l=I)=>{let p=m(()=>t().unread_count||0),g=m(()=>a().findIndex(e=>e.id===t().id));var S=Pi();let T;var E=A(S),D=e=>{var n=ji(),i=ae(n),s=N(i,2),c=e=>{var n=Ai(),i=A(n),o=N(i,2);r(n),ce(n,e=>V(w,e),()=>b(w)),B(e=>{j(n,`aria-label`,e),i.disabled=b(g)<=0,o.disabled=b(g)<0||b(g)>=a().length-1},[()=>`Move #${bt(t())}`]),_(`keydown`,n,e=>{e.key===`Escape`&&(e.preventDefault(),_e(!0))}),_(`click`,i,()=>ve(t().id,-1,a())),_(`click`,o,()=>ve(t().id,1,a())),u(e,n)};f(s,e=>{b(C)===t().id&&e(c)}),B(e=>{j(i,`aria-label`,e),j(i,`aria-expanded`,b(C)===t().id)},[()=>`Move #${bt(t())}`]),_(`click`,i,e=>void ge(t().id,e.currentTarget)),y(`dragstart`,i,e=>fe(e,t().id,o())),y(`dragend`,i,he),_(`keydown`,i,e=>{e.key===`ArrowUp`||e.key===`ArrowDown`?(e.preventDefault(),V(C,``),de(t().id,e.key===`ArrowUp`?-1:1,a())):e.key===`Escape`&&V(C,``)}),u(e,n)};f(E,e=>{l()&&e(D)});var O=N(E,2);let k;var ee=N(A(O),2),M=R(ee,!0),P=N(ee,2),F=e=>{var t=Mi();u(e,t)};f(P,e=>{t().external_managed&&e(F)});var L=N(P,2),te=e=>{var t=Ni(),n=R(t,!0);B(()=>{j(t,`aria-label`,`${b(p)} unread`),c(n,b(p)>99?`99+`:b(p))}),u(e,t)};f(L,e=>{b(p)>0&&(t().id!==n.selectedChannelID||n.selectedDirectID)&&e(te)}),r(O),r(S),B((e,r)=>{T=i(S,1,`channel-row`,null,T,{reorderable:l(),subdued:s(),dragging:b(d)===t().id,"drop-before":b(v)===t().id&&b(x),"drop-after":b(v)===t().id&&!b(x)}),j(O,`href`,e),k=i(O,1,`nav-item channel`,null,k,{active:t().id===n.selectedChannelID&&!n.selectedDirectID,"has-unread":b(p)>0&&!(t().id===n.selectedChannelID&&!n.selectedDirectID)}),c(M,r)},[()=>n.hrefForChannel(t().id),()=>bt(t())]),y(`dragover`,S,e=>{l()&&pe(e,t().id,o())}),y(`drop`,S,e=>{e.preventDefault(),l()&&b(h)===o()&&(W(b(d),t().id,b(x),a()),he())}),_(`focusout`,S,e=>{e.currentTarget.contains(e.relatedTarget)||V(C,``)}),_(`click`,O,e=>{G(e)&&(e.preventDefault(),n.onSelectChannel(t().id))}),u(e,S)},s=(e,t=I,n=I,o=I)=>{let s=m(()=>oe(t().key)),l=m(()=>ue(t()));var d=Fi();let f;var p=A(d),h=N(A(p),2),g=R(h,!0),v=N(h,2),y=R(v,!0);r(p);var x=N(p,2);F(x,21,()=>b(l),e=>e.id,(e,n)=>{a(e,()=>b(n),()=>t().channels,()=>t().key,o,()=>b(s))}),r(x),r(d),B(()=>{f=i(d,1,`channel-subgroup`,null,f,{"archived-channel-group":o()}),j(p,`aria-expanded`,b(s)),j(p,`aria-controls`,n()),c(g,t().label),c(y,t().channels.length),j(x,`id`,n()),j(x,`hidden`,!b(s)&&b(l).length===0)}),_(`click`,p,()=>se(t().key)),u(e,d)},l=`archived`,d=U(``),h=U(``),v=U(``),x=U(!0),S=U(!1),C=U(``),w=U(void 0),T,D=U(``),k=U(ee({})),M=m(()=>n.channels.filter(e=>!e.archived_at)),P=m(()=>n.channels.filter(e=>!!e.archived_at)),L=m(()=>b(M).filter(e=>!e.sidebar_section?.trim())),te=m(()=>{let e=new Map;for(let t of b(M)){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=m(()=>n.channels.filter(e=>e.id===n.selectedChannelID&&!n.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 z(e){if(!e)return{};try{return re(window.localStorage.getItem(ie(e)))}catch{return{}}}function oe(e){let t=b(k)[e];return typeof t==`boolean`?t:e!==l}function se(e){if(V(k,{...b(k),[e]:!oe(e)},!0),n.workspaceID)try{window.localStorage.setItem(ie(n.workspaceID),JSON.stringify(b(k)))}catch{}}function le(e){e.key===ie(n.workspaceID)&&V(k,re(e.newValue),!0)}function ue(e){return oe(e.key)?e.channels:e.channels.filter(e=>e.id===n.selectedChannelID&&!n.selectedDirectID||(e.unread_count||0)>0)}function H(e){V(D,``),queueMicrotask(()=>{V(D,e,!0)})}function W(e,t,r,i){if(!e||!t||e===t)return;let a=n.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+ +!r,0,e),n.onReorder(a);let c=n.channels.find(t=>t.id===e),l=i.map(e=>e.id).filter(t=>t!==e),u=l.indexOf(t);l.splice(u+ +!r,0,e),c&&H(`Moved #${bt(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){V(S,!0),V(C,``),V(d,t,!0),V(h,n,!0),e.dataTransfer?.setData(`text/plain`,t),e.dataTransfer&&(e.dataTransfer.effectAllowed=`move`)}function pe(e,t,n){if(!b(d)||b(d)===t||b(h)!==n)return;e.preventDefault();let r=e.currentTarget;V(v,t,!0),V(x,e.clientY{V(S,!1)},0)}async function ge(e,n){if(!b(S)){if(b(C)===e){V(C,``);return}T=n,V(C,e,!0),await t(),b(w)?.querySelector(`button:not(:disabled)`)?.focus()}}async function _e(e=!1){V(C,``),e&&(await t(),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}E(()=>{V(k,z(n.workspaceID),!0)}),E(()=>{n.expanded||(V(C,``),me(),V(S,!1))});var ye=Ri();y(`storage`,O,le);let be;var xe=A(ye),Se=A(xe),Ce=N(Se,2);r(xe);var we=N(xe,2),Te=A(we),Ee=e=>{var t=Li(),r=N(ae(t),2);F(r,17,()=>b(L),e=>e.id,(e,t)=>{a(e,()=>b(t),()=>b(L),()=>`unsectioned`,()=>!1,()=>!0)});var i=N(r,2);F(i,19,()=>b(te),e=>e.key,(e,t,n)=>{s(e,()=>b(t),()=>`sidebar-channel-section-${b(n)}`,()=>!1)});var o=N(i,2),c=e=>{s(e,()=>({key:l,label:`Archived`,channels:b(P)}),()=>`sidebar-archived-channels`,()=>!0)};f(o,e=>{b(P).length>0&&e(c)});var d=N(o,2),p=e=>{var t=Ii();u(e,t)};f(d,e=>{n.channels.length===0&&e(p)}),u(e,t)},De=e=>{var t=p(),n=ae(t);F(n,17,()=>b(ne),e=>e.id,(e,t)=>{{let n=m(()=>!!b(t).archived_at);a(e,()=>b(t),()=>b(ne),()=>`priority`,()=>b(n),()=>!1)}}),u(e,t)};f(Te,e=>{n.expanded?e(Ee):e(De,-1)}),r(we);var Oe=N(we,2),ke=R(Oe,!0);r(ye),B(()=>{be=i(ye,1,`nav-section`,null,be,{collapsed:!n.expanded}),j(Se,`aria-expanded`,n.expanded),j(we,`hidden`,!n.expanded&&b(ne).length===0),c(ke,b(D))}),_(`click`,Se,function(...e){n.onToggle?.apply(this,e)}),_(`click`,Ce,function(...e){n.onCreateChannel?.apply(this,e)}),u(e,ye),g()}s([`focusout`,`click`,`keydown`]);var Bi=W(` `),Vi=W(``),Hi=W(``),Ui=W(`
          `),Wi=W(``),Gi=W(`
          `),Ki=W(`
          `);function qi(e,t){o(t,!0);let n=U(``),a=m(()=>t.expanded?t.conversations:t.conversations.filter(e=>e.id===t.selectedDirectID||(e.unread_count||0)>0));function s(e){return e.button===0&&!e.metaKey&&!e.ctrlKey&&!e.shiftKey&&!e.altKey}function l(e){V(n,b(n)===e?``:e,!0)}function d(){V(n,``)}var p=Ki();let h;var v=A(p),y=A(v),x=N(y,2);r(v);var S=N(v,2),C=A(S);F(C,17,()=>b(a),e=>e.id,(e,a)=>{let o=m(()=>ft(b(a),t.currentUserID)),p=m(()=>b(a).unread_count||0),h=m(()=>b(a).id===t.selectedDirectID);var g=Ui();let v;var y=A(g);let x;var S=A(y);{let e=m(()=>b(o)?.id||b(a).id),t=m(()=>b(o)?.display_name),n=m(()=>mt(b(o))?void 0:b(o)?.avatar_url);pt(S,{class:`dm-avatar`,get id(){return b(e)},get name(){return b(t)},get src(){return b(n)},size:22})}var C=N(S,2),w=R(C,!0),T=N(C,2),E=e=>{var t=Bi(),n=R(t,!0);B(()=>{j(t,`aria-label`,`${b(p)} unread`),c(n,b(p)>99?`99+`:b(p))}),u(e,t)},D=e=>{var t=Vi();u(e,t)};f(T,e=>{b(p)>0&&!b(h)?e(E):e(D,-1)}),r(y);var O=N(y,2),k=N(O,2),ee=e=>{var n=Hi(),r=R(n);_(`click`,r,e=>{e.preventDefault(),e.stopPropagation(),d(),t.onHideDirect(b(a).id)}),u(e,n)};f(k,e=>{b(n)===b(a).id&&e(ee)}),r(g),B((e,t,r)=>{v=i(g,1,`dm-row`,null,v,{active:b(h)}),j(y,`href`,e),x=i(y,1,`nav-item dm`,null,x,{active:b(h),"has-unread":b(p)>0&&!b(h)}),c(w,t),j(O,`aria-label`,r),j(O,`aria-expanded`,b(n)===b(a).id)},[()=>t.hrefForDirect(b(a).id),()=>ot(b(a),t.currentUserID),()=>`Direct message actions for ${ot(b(a),t.currentUserID)}`]),_(`click`,y,e=>{s(e)&&(e.preventDefault(),t.onSelectDirect(b(a).id))}),_(`click`,O,e=>{e.preventDefault(),e.stopPropagation(),l(b(a).id)}),_(`keydown`,O,e=>{e.key===`Escape`&&d()}),u(e,g)});var w=N(C,2),T=e=>{var t=Wi();u(e,t)};f(w,e=>{t.expanded&&t.conversations.length===0&&e(T)});var E=N(w,2),D=e=>{var n=Gi(),i=A(n),a=R(i),o=N(i,2);r(n),B(()=>c(a,`Closed ${t.hiddenDirectTitle??``}`)),_(`click`,o,function(...e){t.onUndoHideDirect?.apply(this,e)}),u(e,n)};f(E,e=>{t.expanded&&t.hiddenDirectTitle&&e(D)}),r(S),r(p),B(()=>{h=i(p,1,`nav-section`,null,h,{collapsed:!t.expanded}),j(y,`aria-expanded`,t.expanded),j(S,`hidden`,!t.expanded&&b(a).length===0)}),_(`click`,y,function(...e){t.onToggle?.apply(this,e)}),_(`click`,x,function(...e){t.onCreateDirect?.apply(this,e)}),u(e,p),g()}s([`click`,`keydown`]);var Ji=W(``),Yi=W(`Connecting…`),Xi=W(`
          `),Zi=W(` `),Qi=W(``),$i=W(``),ea=W(``);function ta(e,t){o(t,!0);let n=C(t,`showHeader`,3,!0),a=`clickclack:sidebar-sections:v1:`,s={channels:!0,directMessages:!0,people:!0},l=U(ee({...s}));function d(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 p(e){if(!e)return{...s};try{let t=window.localStorage.getItem(`${a}${e}`);if(!t)return{...s};let n=JSON.parse(t);return d(n)?n:{...s}}catch{return{...s}}}function h(e){if(V(l,{...b(l),[e]:!b(l)[e]},!0),t.workspaceID)try{window.localStorage.setItem(`${a}${t.workspaceID}`,JSON.stringify(b(l)))}catch{}}E(()=>{V(l,p(t.workspaceID),!0)});let v=U(ee([]));function x(e){V(v,e,!0);let n=t.currentUser?.id;t.workspaceID&&n&&ki(n,t.workspaceID,e,G,()=>t.currentUser?.id===n)}function S(e){t.currentUser?.id&&(Di(e.key,e.newValue,t.currentUser.id),e.key===wi(t.workspaceID,t.currentUser.id)&&V(v,Ti(e.newValue),!0))}let w=m(()=>{let e=new Map(t.channels.map(e=>[e.id,e]));return[...b(v).flatMap(t=>{let n=e.get(t);return n?(e.delete(t),[n]):[]}),...e.values()]});E(()=>{V(v,Oi(t.currentUser,t.workspaceID),!0)});function T(e){return e.button===0&&!e.metaKey&&!e.ctrlKey&&!e.shiftKey&&!e.altKey}var D=ea();y(`storage`,O,S);var k=A(D),M=e=>{var n=Xi(),i=A(n),a=A(i),o=e=>{var n=Ji();B(e=>j(n,`src`,e),[()=>_e(t.workspaceIconURL)]),u(e,n)};f(a,e=>{t.workspaceIconURL&&e(o)});var s=N(a,2),l=A(s),d=A(l),p=R(d,!0);te(2),r(l);var m=N(l,2),h=e=>{var t=Yi();u(e,t)};f(m,e=>{t.connected||e(h)}),r(s),r(i);var g=N(i,2),v=A(g),y=A(v),b=R(y);r(v),r(g),r(n),B(()=>{c(p,t.workspaceName||`Pick a workspace`),j(v,`aria-label`,t.sidebarCollapsed?`Expand sidebar`:`Collapse sidebar`),j(v,`title`,t.sidebarCollapsed?`Expand sidebar`:`Collapse sidebar`),j(b,`d`,t.sidebarCollapsed?`m9 6 6 6-6 6`:`m15 6-6 6 6 6`)}),_(`click`,i,function(...e){t.onOpenWorkspaceSettings?.apply(this,e)}),_(`click`,v,function(...e){t.onToggleCollapse?.apply(this,e)}),u(e,n)};f(k,e=>{n()&&e(M)});var P=N(k,2),I=A(P);zi(I,{get workspaceID(){return t.workspaceID},get expanded(){return b(l).channels},get channels(){return b(w)},get selectedChannelID(){return t.selectedChannelID},get selectedDirectID(){return t.selectedDirectID},get hrefForChannel(){return t.hrefForChannel},get onSelectChannel(){return t.onSelectChannel},get onCreateChannel(){return t.onCreateChannel},onToggle:()=>h(`channels`),onReorder:x});var L=N(I,2);{let e=m(()=>t.currentUser?.id);qi(L,{get expanded(){return b(l).directMessages},get conversations(){return t.directConversations},get currentUserID(){return b(e)},get selectedDirectID(){return t.selectedDirectID},get hrefForDirect(){return t.hrefForDirect},get onSelectDirect(){return t.onSelectDirect},get onCreateDirect(){return t.onCreateDirect},get onHideDirect(){return t.onHideDirect},get hiddenDirectTitle(){return t.hiddenDirectTitle},get onUndoHideDirect(){return t.onUndoHideDirect},onToggle:()=>h(`directMessages`)})}var ne=N(L,2);let re;var ie=A(ne),z=R(ie),ae=N(ie,2),oe=A(ae);F(oe,17,()=>t.recentPeople,e=>e.id,(e,n)=>{let a=m(()=>ut(t.directConversations,b(n).id,t.currentUser?.id));var o=Zi();let s;var l=A(o);pt(l,{class:`dm-avatar`,get id(){return b(n).id},get name(){return b(n).display_name},get src(){return b(n).avatar_url},size:22});var d=N(l,2),f=R(d,!0);te(2),r(o),B(e=>{j(o,`href`,e),s=i(o,1,`nav-item dm`,null,s,{active:b(a)?.id===t.selectedDirectID||t.selectedProfile?.id===b(n).id}),c(f,b(n).display_name)},[()=>b(a)?t.hrefForDirect(b(a).id):`#`]),_(`click`,o,e=>{if(b(a)){if(!T(e))return;e.preventDefault(),t.onSelectDirect(b(a).id)}else e.preventDefault(),t.onOpenProfile(b(n))}),u(e,o)});var se=N(oe,2),ce=e=>{var t=Qi();u(e,t)};f(se,e=>{t.recentPeople.length===0&&e(ce)}),r(ae),r(ne),r(P);var le=N(P,2),ue=e=>{var n=$i(),i=A(n);pt(i,{class:`dm-avatar`,get id(){return t.currentUser.id},get name(){return t.currentUser.display_name},get src(){return t.currentUser.avatar_url},size:28,loading:`eager`,fetchPriority:`auto`});var a=N(i,2),o=A(a),s=R(o,!0),l=N(o,2),d=R(l,!0);r(a),te(2),r(n),B((e,r)=>{j(n,`aria-label`,e),c(s,t.currentUser.display_name),c(d,r)},[()=>`Account settings for ${t.currentUser.display_name} ${lt(t.currentUser.handle)}`,()=>t.currentUser.handle?lt(t.currentUser.handle):t.connected?`Active`:`Reconnecting…`]),_(`click`,n,function(...e){t.onOpenSettings?.apply(this,e)}),_(`contextmenu`,n,e=>{e.preventDefault(),t.onOpenSettings()}),u(e,n)};f(le,e=>{t.currentUser&&e(ue)}),r(D),B(()=>{re=i(ne,1,`nav-section`,null,re,{collapsed:!b(l).people}),j(z,`aria-expanded`,b(l).people),j(ae,`hidden`,!b(l).people)}),_(`click`,z,()=>h(`people`)),u(e,D),g()}s([`click`,`contextmenu`]);var na=W(`
          Loading...
          `),ra=W(`
          `),ia=W(`
          `),aa=W(`

          No pinned messages

          Pin important messages to keep them easily accessible.

          `),oa=W(`
          `),sa=W(`
          `),ca=W(`
          `),la=W(` `,1),ua=W(`

          Pinned Messages

          `);function da(e,t){o(t,!0);let i=C(t,`loading`,3,!1),a=C(t,`error`,3,``),s=C(t,`topics`,19,()=>[]),l=C(t,`mentionPeople`,19,()=>[]),d=C(t,`maxPins`,3,100),p=U(ee(new Set)),v=U(``);async function y(e){if(!b(p).has(e.id)){V(p,new Set(b(p)).add(e.id),!0),V(v,``);try{await t.onUnpin(e)}catch(e){V(v,e instanceof Error?e.message:`Could not unpin message`,!0)}finally{let t=new Set(b(p));t.delete(e.id),V(p,t,!0)}}}var x=ua(),S=A(x),w=A(S),T=A(w),E=N(A(T),2),D=R(E);r(T);var O=N(T,2),k=R(O);r(w);var M=N(w,2);r(S);var P=N(S,2),I=A(P),L=e=>{var t=na();u(e,t)},te=e=>{var t=ra(),n=R(t,!0);B(()=>c(n,a())),u(e,t)},ne=e=>{var i=la(),a=ae(i),o=e=>{var t=ia(),n=R(t,!0);B(()=>c(n,b(v))),u(e,t)};f(a,e=>{b(v)&&e(o)});var d=N(a,2),g=e=>{var t=aa();u(e,t)},x=e=>{var i=ca();F(i,21,()=>t.messages,e=>e.id,(e,i)=>{let a=m(()=>s().find(e=>e.id===b(i).topic_id));var o=sa(),d=A(o),g=A(d),v=R(g,!0),x=N(g,2),S=R(x,!0);r(d);var C=N(d,2);_t(C,{get topic(){return b(a)},get onSelect(){return t.onSelectTopic}});var w=N(C,2);n(w,()=>Y(b(i).body),!0),r(w),h(w,e=>Je?.(e)),h(w,(e,t)=>J?.(e,t),()=>({people:l(),attentionUserID:t.mentionAttentionUserID}));var T=N(w,2),E=e=>{var n=oa();F(n,21,()=>b(i).attachments,e=>e.id,(e,n)=>{{let r=m(()=>tt(b(n)));X(e,{get upload(){return b(n)},get url(){return b(r)},get onOpenImage(){return t.onOpenImage},get onOpenArtifact(){return t.onOpenArtifact}})}}),r(n),u(e,n)};f(T,e=>{b(i).attachments?.length&&e(E)});var D=N(T,2),O=A(D),k=N(O,2);r(D),r(o),B((e,t)=>{j(o,`data-message-id`,b(i).id),c(v,b(i).author?.display_name||`Unknown`),c(S,e),k.disabled=t},[()=>$e(b(i).created_at),()=>b(p).has(b(i).id)]),_(`click`,O,()=>t.onOpenThread(b(i))),_(`click`,k,()=>y(b(i))),u(e,o)}),r(i),u(e,i)};f(d,e=>{t.messages.length===0?e(g):e(x,-1)}),u(e,i)};f(I,e=>{i()?e(L):a()?e(te,1):e(ne,-1)}),r(P),r(x),B(()=>{c(D,`${t.messages.length??``} / ${d()??``} pinned`),c(k,`Shared across this channel, with a maximum of ${d()??``} messages.`)}),_(`click`,M,function(...e){t.onClose?.apply(this,e)}),u(e,x),g()}s([`click`]);var fa=W(` `,1),pa=W(`
          `),ma=W(`
          We couldn’t search messages

          `),ha=W(`
          No messages found

          Try another word or phrase.

          `),ga=W(`deleted bot`),_a=W(` `),va=W(` `),ya=W(` `),ba=W(` Reply in thread`),xa=W(` `),Sa=W(`
        • `),Ca=W(``),wa=W(``),Ta=W(``),Ea=W(`
            `,1),Da=W(``);function Oa(e,t){o(t,!0);let n=C(t,`covered`,3,!1),a=C(t,`inert`,3,!1),s=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 y(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=v(`Searching messages…`);u(e,t)},te=e=>{var n=fa(),r=ae(n),i=N(r),a=e=>{var n=v();B(()=>c(n,`in ${t.session.scope.label??``}`)),u(e,n)};f(i,e=>{t.session.scope.label&&e(a)}),B(()=>c(r,`${t.session.results.length??``}${t.session.nextCursor?`+`:``} + ${t.session.results.length===1&&!t.session.nextCursor?`result`:`results`}`)),u(e,n)},ne=e=>{var t=v(`Search unavailable`);u(e,t)};f(I,e=>{t.session.state===`loading`?e(L):t.session.state===`ready`?e(te,1):t.session.state===`error`&&e(ne,2)}),r(P);var re=N(P,2),ie=A(re),z=e=>{var t=pa();u(e,t)},oe=e=>{var n=ma(),i=N(A(n),4),a=R(i,!0);r(n),B(()=>c(a,t.session.error)),u(e,n)},se=e=>{var t=ha();u(e,t)},ce=e=>{var n=Ea(),a=ae(n);F(a,21,()=>t.session.results,e=>e.id,(e,n)=>{let a=m(()=>t.contextFor(b(n)));var o=Sa(),s=A(o);let l;var h=A(s);{let e=m(()=>mt(b(n).author)?void 0:b(n).author.avatar_url);pt(h,{class:`dm-avatar`,get id(){return b(n).author.id},get name(){return b(n).author.display_name},get src(){return b(e)},size:30})}var g=N(h,2),S=A(g),C=A(S),w=R(C,!0),T=N(C,2),E=e=>{var t=ga();u(e,t)},D=m(()=>mt(b(n).author)),O=e=>{var t=_a(),r=R(t,!0);B(e=>c(r,e),[()=>lt(st(b(n).author))]),u(e,t)},k=m(()=>st(b(n).author));f(T,e=>{b(D)?e(E):b(k)&&e(O,1)});var ee=N(T,2),M=R(ee,!0);r(S);var P=N(S,2);F(P,21,()=>y(b(n).snippet,b(n).highlights),d,(e,t)=>{var n=p(),r=ae(n),i=e=>{var n=va(),r=R(n,!0);B(()=>c(r,b(t).text)),u(e,n)},a=e=>{var n=v();B(()=>c(n,b(t).text)),u(e,n)};f(r,e=>{b(t).highlighted?e(i):e(a,-1)}),u(e,n)}),r(P);var I=N(P,2),L=A(I),te=e=>{var t=ya(),n=R(t,!0);B(()=>c(n,b(a))),u(e,t)};f(L,e=>{b(a)&&e(te)});var ne=N(L,2),re=e=>{var t=ba();u(e,t)},ie=e=>{var t=xa(),i=N(A(t));r(t),B(()=>c(i,` ${b(n).reply_count??``} ${b(n).reply_count===1?`reply`:`replies`}`)),u(e,t)};f(ne,e=>{b(n).parent_message_id?e(re):b(n).reply_count>0&&e(ie,1)}),r(I),r(g),r(s),r(o),B(e=>{l=i(s,1,`search-result`,null,l,{"is-active":t.session.activeResultID===b(n).id}),j(s,`data-result-id`,b(n).id),c(w,b(n).author.display_name||`Local User`),j(ee,`datetime`,b(n).created_at),c(M,e)},[()=>x(b(n).created_at)]),_(`click`,s,()=>t.onOpenResult(b(n))),u(e,o)}),r(a);var o=N(a,2),s=e=>{var n=Ca(),i=A(n),a=R(i,!0),o=N(i,2);r(n),B(()=>c(a,t.session.moreError)),_(`click`,o,function(...e){t.onLoadMore?.apply(this,e)}),u(e,n)},l=e=>{var n=wa(),r=R(n,!0);B(()=>{n.disabled=t.session.loadingMore,c(r,t.session.loadingMore?`Loading more…`:`Load more results`)}),_(`click`,n,function(...e){t.onLoadMore?.apply(this,e)}),u(e,n)},h=e=>{var t=Ta();u(e,t)};f(o,e=>{t.session.moreError?e(s):t.session.nextCursor?e(l,1):e(h,-1)}),u(e,n)};f(ie,e=>{t.session.state===`loading`?e(z):t.session.state===`error`?e(oe,1):t.session.results.length===0?e(se,2):e(ce,-1)}),r(re),r(S),B(()=>{w=i(S,1,`search-results`,null,w,{covered:n()}),S.inert=a(),j(S,`aria-hidden`,n()?`true`:void 0),c(O,`Search${t.session.scope.label?` in ${t.session.scope.label}`:``}`),c(ee,`Results for “${t.session.query??``}”`)}),_(`click`,M,function(...e){t.onClose?.apply(this,e)}),u(e,S),g()}s([`click`]);var ka=W(``),Aa=W(`
            `),ja=W(`

            `,1),Ma=W(`
            `),Na=W(``);function Pa(e,t){o(t,!0);let n=C(t,`saving`,3,!1),i=C(t,`error`,3,``),a=U(!1),s=m(()=>!!t.channel.archived_at),l=m(()=>`#${bt(t.channel)}`);function d(){n()||t.onClose()}var p=Na(),h=A(p),v=N(h,2),y=A(v),x=N(A(y),2);r(y);var S=N(y,2),w=A(S),T=A(w),E=R(T,!0);te(2),r(w);var D=N(w,2),O=e=>{var t=ka(),n=R(t,!0);B(()=>c(n,i())),u(e,t)};f(D,e=>{i()&&e(O)});var k=N(D,2),j=e=>{var i=Aa(),a=A(i),o=N(a,2),s=R(o,!0);r(i),B(()=>{a.disabled=n(),o.disabled=n(),c(s,n()?`Restoring...`:`Restore channel`)}),_(`click`,a,d),_(`click`,o,()=>t.onArchivedChange(!1)),u(e,i)},ee=e=>{var i=ja(),o=ae(i),s=R(o),d=N(o,2),f=A(d),p=N(f,2),m=R(p,!0);r(d),B(()=>{c(s,`Archive ${b(l)??``}? The channel will remain available to workspace members under Archived.`),f.disabled=n(),p.disabled=n(),c(m,n()?`Archiving...`:`Archive channel`)}),_(`click`,f,()=>V(a,!1)),_(`click`,p,()=>t.onArchivedChange(!0)),u(e,i)},M=e=>{var t=Ma(),i=A(t),o=N(i,2);r(t),B(()=>{i.disabled=n(),o.disabled=n()}),_(`click`,i,d),_(`click`,o,()=>V(a,!0)),u(e,t)};f(k,e=>{b(s)?e(j):b(a)?e(ee,1):e(M,-1)}),r(S),r(v),r(p),B(()=>{h.disabled=n(),x.disabled=n(),c(E,b(l))}),_(`click`,h,d),_(`click`,x,d),u(e,p),g()}s([`click`]);var Fa=W(`

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

            Browser notifications are not supported on this device.

            `),za=W(`

            Browser notifications are blocked by this browser.

            `),Ba=W(`

            `),Va=W(`

            Show alerts when ClickClack is in the background.

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

            Add ClickClack to your Home Screen from the Share menu, then open it from there to turn this on.

            `),qa=W(`

            This browser does not support push notifications.

            `),Ja=W(`

            `),Ya=W(`

            `),Xa=W(`

            Receive alerts when the app is closed.

            `);function Za(e,t){o(t,!0);let n=C(t,`isDesktop`,3,!1),a=`This browser is now signed in to a different account. Reload to continue.`,s=U(!1),l=U(!1),d=U(!1),h=U(!1),v=U(``),y=U(!1);E(()=>{S(t.user.id,n())});async function S(e,t){if(t){V(s,!1);return}V(l,zt(),!0);try{let t=b(l)?await an():null,n=await tn(t),r=n.enabled&&await on()!==e;if(V(s,n.enabled,!0),!n.enabled)return;if(r){V(d,!1),V(v,a),V(y,!0);return}V(d,!!t&&Zt(e)&&n.this_device,!0),!t&&Zt(e)&&Qt(e,!1)}catch{V(s,!1)}}async function w(e){let t=e.checked;V(v,``),V(y,!1),V(h,!0);try{t?await T():await D()}catch(e){t&&V(d,!1),V(v,xe(e,t?`Push notifications could not be turned on`:`Push notifications could not be turned off`),!0),V(y,!0)}finally{V(h,!1),e.checked=b(d)}}async function T(){let e=Notification.permission==="default"?await Notification.requestPermission():Notification.permission;if(e!==`granted`){V(d,!1),V(v,e===`denied`?`Notifications are blocked for this site. Allow them in your browser settings, then try again.`:`Notifications were not enabled.`,!0),V(y,!0);return}let[n,r]=await Promise.all([an().then(tn),on()]);if(!n.enabled){V(s,!1);return}if(r!==t.user.id){V(d,!1),V(v,a),V(y,!0);return}await sn(await rn(await nn(),n,t.user.id),t.user.id),Qt(t.user.id,!0),V(d,!0),V(v,`On for this device`)}async function D(){if(await on()!==t.user.id){V(v,a),V(y,!0);return}let e=await an();e&&await cn(e.endpoint,t.user.id),Qt(t.user.id,!1),en(t.user.id,``),V(d,!1),e&&(await e.unsubscribe(),V(v,`Off for this device`))}let O=m(()=>!b(l)&&Vt()&&!Bt());var k=p(),j=ae(k),ee=e=>{var t=Xa(),n=A(t),a=N(A(n),4),o=e=>{var t=Ka();u(e,t)},s=e=>{var t=qa();u(e,t)},p=e=>{var t=Ja(),n=R(t);B(e=>c(n,`On for ${e??``}`),[()=>Ht()]),u(e,t)};f(a,e=>{b(O)?e(o):b(l)?b(d)&&e(p,2):e(s,1)});var m=N(a,2),g=e=>{var t=Ya();let n;var r=R(t,!0);B(()=>{n=i(t,1,`settings-row2__hint`,null,n,{"is-error":b(y)}),c(r,b(v))}),u(e,t)};f(m,e=>{b(v)&&e(g)}),r(n);var S=N(n,2),C=A(S);M(C),r(S),r(t),B(()=>{C.disabled=!b(l)||b(h),x(C,b(d))}),_(`change`,C,e=>void w(e.currentTarget)),u(e,t)};f(j,e=>{b(s)&&e(ee)}),u(e,k),g()}s([`change`]);var Qa=W(`

            Desktop

            Mobile push

            Send push notifications to your phone via Pushover.

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

            `);function $a(e,t){o(t,!0);let n=C(t,`isDesktop`,3,!1),i=U(!1),a=U(``);E(()=>{V(i,t.user.notification_settings?.pushover_enabled??!1,!0),V(a,t.user.notification_settings?.pushover_user_key??``,!0)}),La(e,{section:`notifications`,get onUserUpdated(){return t.onUserUpdated},payload:()=>({notification_settings:{pushover_enabled:b(i),pushover_user_key:b(a)}}),children:(e,o)=>{var s=Qa(),c=N(A(s),2);Ha(c,{get user(){return t.user},get isDesktop(){return n()},get onChanged(){return t.onBrowserNotificationsChanged}});var l=N(c,4);Za(l,{get user(){return t.user},get isDesktop(){return n()}});var d=N(l,2),f=N(A(d),2),p=A(f);M(p),r(f),r(d);var m=N(d,2),h=N(A(m),2),g=A(h);M(g),r(h),r(m),r(s),D(p,()=>b(i),e=>V(i,e)),z(g,()=>b(a),e=>V(a,e)),u(e,s)},$$slots:{default:!0}}),g()}var eo=W(`

            Loading…

            `),to=W(`

            `),no=W(`
            You don't own any bots yet. Open a workspace's Bots & agents page to mint one.
            `),ro=W(``),io=W(`
          • `),ao=W(`

              `),oo=W(`
              `),so=W(`

              Account

              My bots

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

              `,1);function co(e,t){o(t,!0);let n=U(ee([])),i=U(`loading`),a=U(``);oe(()=>{s()});async function s(){V(i,`loading`);try{V(n,await wt(),!0),V(i,`ready`)}catch(e){V(i,`error`),V(a,Tt(e),!0)}}function l(e){t.onClose(),fe(Re(e.workspace.route_id||e.workspace.id,`bots`))}function d(e){return e.startsWith(`@`)?e:`@${e}`}function p(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 h=m(()=>{let e=new Map;for(let t of b(n)){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=so(),x=N(ae(y),2),S=e=>{var t=eo();u(e,t)},C=e=>{var t=to(),n=R(t,!0);B(()=>c(n,b(a))),u(e,t)},w=e=>{var t=no();u(e,t)},T=e=>{var t=oo();F(t,21,()=>b(h),e=>e.workspace.id,(e,t)=>{var n=ao(),i=A(n),a=A(i),o=R(a,!0),s=N(a,2);r(i);var m=N(i,2);F(m,21,()=>b(t).entries,e=>e.bot.id,(e,t)=>{var n=io(),i=A(n),a=A(i),o=e=>{var n=ro();B(()=>j(n,`src`,b(t).bot.avatar_url)),u(e,n)},s=e=>{var n=v();B(e=>c(n,e),[()=>p(b(t).bot.display_name||b(t).bot.handle||`?`)]),u(e,n)};f(a,e=>{b(t).bot.avatar_url?e(o):e(s,-1)}),r(i);var m=N(i,2),h=A(m),g=R(h,!0),y=N(h,2),x=A(y),S=R(x,!0),C=N(x,4),w=R(C);r(y),r(m);var T=N(m,2);r(n),B(e=>{c(g,b(t).bot.display_name||b(t).bot.handle),c(S,e),c(w,`${b(t).active_token_count??``} + active ${b(t).active_token_count===1?`token`:`tokens`}`)},[()=>d(b(t).bot.handle)]),_(`click`,T,()=>l(b(t))),u(e,n)}),r(m),r(n),B(()=>c(o,b(t).workspace.name)),_(`click`,s,()=>l(b(t).entries[0])),u(e,n)}),r(t),u(e,t)};f(x,e=>{b(i)===`loading`?e(S):b(i)===`error`?e(C,1):b(n).length===0?e(w,2):e(T,-1)}),u(e,y),g()}s([`click`]);function lo(e,t){return t.includes(`password`)&&e.password_enrolled===!0}function uo(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 fo=W(`

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

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

              Workspace

              `,1),Do=W(`

              `),Oo=W(`
            • `),ko=W(`
                `),Ao=W(`

                Loading...

                `),jo=W(`

                `),Mo=W(`

                `),No=W(`

                Account

                Profile settings

                How you appear across ClickClack.

                Sign out

                End this session on this device.

                `,1),Po=W(`

                Account

                Notifications

                Decide when and how ClickClack should reach you.

                `,1),Fo=W(``);function Io(e,t){o(t,!0);let n=C(t,`workspaces`,19,()=>[]),a=C(t,`currentWorkspaceID`,3,``),s=C(t,`initialSection`,3,Ie),l=C(t,`isDesktop`,3,!1),d=U(``),h=m(()=>n().find(e=>e.id===b(d))??K(n(),a())),v=U(!1),x=U(``),S=U(ee(Ie)),w=m(()=>lo(t.user,ge())),D=U(`loading`),k=U(``);E(()=>{V(S,s(),!0)}),E(()=>{b(S);let e=new AbortController;return P(e.signal),()=>e.abort()});async function M(){if(!b(v)){V(v,!0),V(x,``);try{await G(`/api/auth/logout`,{method:`POST`,body:JSON.stringify({})}),window.location.reload()}catch(e){V(x,xe(e,`Could not sign out. Try again.`),!0),V(v,!1)}}}async function P(e){V(D,`loading`),V(k,``);try{let n=await Ce({signal:e});e.throwIfAborted(),t.onUserUpdated(n.user),V(D,`ready`)}catch(t){if(e.aborted)return;if(t instanceof be&&(t.status===401||t.status===403)){V(D,`error`),V(k,`Sign in to manage your account`);return}V(D,`error`),V(k,t instanceof Error?t.message:`Could not load your account`,!0)}}function I(e){e.target===e.currentTarget&&t.onClose()}function L(e){if(e.key!==`Escape`)return;let n=e.target;(!n||n.tagName!==`INPUT`&&n.tagName!==`TEXTAREA`&&!n.isContentEditable)&&(e.preventDefault(),t.onClose())}function te(e,n){t.onClose(),fe(Re(e.route_id||e.id,n))}var ne=Fo();y(`keydown`,O,L);var re=A(ne),ie=A(re),z=N(ie,2),oe=A(z),se=N(A(oe),2);F(se,21,()=>q,e=>e.id,(e,n)=>{var a=wo(),o=A(a);let s;var l=A(o),d=e=>{var r=bo(),i=ae(r);pt(i,{class:`settings-modal__rail-avatar`,get id(){return t.user.id},get name(){return t.user.display_name},get src(){return t.user.avatar_url},size:18});var a=N(i,2),o=R(a,!0);B(()=>c(o,t.user.display_name||b(n).label)),u(e,r)},p=e=>{var t=xo(),r=N(ae(t),2),i=R(r,!0);B(()=>c(i,b(n).label)),u(e,t)},m=e=>{var t=So(),r=N(ae(t),2),i=R(r,!0);B(()=>c(i,b(n).label)),u(e,t)},h=e=>{var t=Co(),r=N(ae(t),2),i=R(r,!0);B(()=>c(i,b(n).label)),u(e,t)};f(l,e=>{b(n).id===`profile`?e(d):b(n).id===`appearance`?e(p,1):b(n).id===`notifications`?e(m,2):b(n).id===`bots`&&e(h,3)}),r(o),r(a),B(()=>{s=i(o,1,`settings-modal__rail-item`,null,s,{"is-active":b(S)===b(n).id}),j(o,`aria-current`,b(S)===b(n).id?`page`:void 0)}),_(`click`,o,()=>V(S,b(n).id,!0)),u(e,a)}),r(se),r(oe);var ce=N(oe,2),le=e=>{var t=ko(),i=A(t),o=e=>{var t=Eo(),i=N(ae(t),4);F(i,21,n,e=>e.id,(e,t)=>{var n=To(),r=R(n,!0),i={};B(e=>{c(r,e),i!==(i=b(t).id)&&(n.value=(n.__value=i)??``)},[()=>Le(b(t),a())?`${b(t).name} (current)`:b(t).name]),u(e,n)}),r(i);var o;T(i),B(()=>{o!==(o=b(h).id)&&(i.value=(i.__value=o)??``,ue(i,o))}),_(`change`,i,e=>V(d,e.currentTarget.value,!0)),u(e,t)},s=e=>{var t=Do(),n=R(t);B(()=>{j(t,`title`,b(h).name),c(n,`Workspace · ${b(h).name??``}`)}),u(e,t)};f(i,e=>{n().length>1?e(o):e(s,-1)});var l=N(i,2);F(l,21,()=>Fe,e=>e.id,(e,t)=>{var n=p(),i=ae(n),a=e=>{var n=Oo(),i=A(n),a=N(A(i),2),o=R(a,!0);r(i),r(n),B(()=>c(o,b(t).label)),_(`click`,i,()=>te(b(h),b(t).slug)),u(e,n)},o=m(()=>!b(t).managersOnly||ze(b(h).role));f(i,e=>{b(o)&&e(a)}),u(e,n)}),r(l),r(t),u(e,t)};f(ce,e=>{b(h)&&e(le)}),r(z);var H=N(z,2),W=A(H),de=e=>{var t=Ao();u(e,t)},pe=e=>{var t=jo(),n=R(t,!0);B(()=>c(n,b(k))),u(e,t)},me=e=>{var n=No(),i=N(ae(n),2);Ga(i,{get user(){return t.user},get hideCommentary(){return t.hideCommentary},get hideToolCalls(){return t.hideToolCalls},get userAlign(){return t.userAlign},get otherAlign(){return t.otherAlign},get isDesktop(){return l()},get onUserUpdated(){return t.onUserUpdated},get onSaved(){return t.onClose},get onHideCommentary(){return t.onHideCommentary},get onHideToolCalls(){return t.onHideToolCalls},get onUserAlign(){return t.onUserAlign},get onOtherAlign(){return t.onOtherAlign},get onBrowserNotificationsChanged(){return t.onBrowserNotificationsChanged}});var a=N(i,2),o=e=>{ho(e,{})};f(a,e=>{b(w)&&e(o)});var s=N(a,2),d=A(s),p=N(A(d),4),m=e=>{var t=Mo(),n=R(t,!0);B(()=>c(n,b(x))),u(e,t)};f(p,e=>{b(x)&&e(m)}),r(d);var h=N(d,2),g=A(h),y=R(g,!0);r(h),r(s),B(()=>{g.disabled=b(v),c(y,b(v)?`Signing out...`:`Sign out`)}),_(`click`,g,M),u(e,n)},he=e=>{yo(e,{get user(){return t.user}})},_e=e=>{var n=Po();$a(N(ae(n),2),{get user(){return t.user},get isDesktop(){return l()},get onUserUpdated(){return t.onUserUpdated},get onBrowserNotificationsChanged(){return t.onBrowserNotificationsChanged}}),u(e,n)},ve=e=>{co(e,{get onClose(){return t.onClose}})};f(W,e=>{b(D)===`loading`?e(de):b(D)===`error`?e(pe,1):b(S)===`profile`?e(me,2):b(S)===`appearance`?e(he,3):b(S)===`notifications`?e(_e,4):b(S)===`bots`&&e(ve,5)}),r(H),r(re),r(ne),_(`click`,ne,I),_(`click`,ie,function(...e){t.onClose?.apply(this,e)}),u(e,ne),g()}s([`click`,`change`]);var Lo=W(`
                No thread open Hover any message and tap the bubble to keep side conversations tidy.
                `);function Ro(e){var t=Lo();u(e,t)}var zo=W(``),Bo=W(`

                `,1),Vo=W(``),Ho=W(``),Uo=W(``),Wo=W(``),Go=W(``),Ko=W(``),qo=W(``),Jo=W(`
                `),Yo=W(`Connecting…`),Xo=W(`
                `);function Zo(e,t){o(t,!0);function n(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=C(t,`channelNotifPreference`,3,void 0),s=C(t,`channelNotifSaving`,3,!1),l=C(t,`channelSettingsAvailable`,3,!1),d=C(t,`pinsAvailable`,3,!1),p=C(t,`pinnedOpen`,3,!1),h=C(t,`onOpenChannelSettings`,3,()=>{}),v=C(t,`onToggleChannelNotifications`,3,()=>{}),x=m(()=>yt(t.externalURL));var S=Xo(),w=A(S),T=A(w),E=A(T),D=A(E),O=N(A(D),2);r(D),r(E);var k=N(E,2),ee=R(k,!0),P=N(k,2),F=e=>{var n=Bo(),r=N(ae(n),2),i=R(r,!0),a=N(r,2),o=e=>{var t=zo();B(()=>j(t,`href`,b(x))),u(e,t)};f(a,e=>{b(x)&&e(o)}),B(()=>{j(r,`title`,t.channelTitle),c(i,t.channelTitle)}),u(e,n)};f(P,e=>{t.channelTitle&&e(F)}),r(T);var I=N(T,2),L=N(A(I),2);M(L);var ne=N(L,2),re=e=>{var n=Vo();_(`click`,n,function(...e){t.onResetSearch?.apply(this,e)}),u(e,n)};f(ne,e=>{t.searchQuery&&e(re)}),te(2),r(I);var ie=N(I,2),z=e=>{var o=Jo(),c=A(o),m=e=>{var t=Go(),i=A(t),o=e=>{var t=Ho();u(e,t)},c=e=>{var t=Uo();u(e,t)},l=e=>{var t=Wo();u(e,t)};f(i,e=>{a()===`muted`?e(o):a()===`mentions`?e(c,1):e(l,-1)}),r(t),B((e,n)=>{j(t,`title`,e),j(t,`aria-label`,n),j(t,`aria-busy`,s()),t.disabled=s()},[()=>n(a()),()=>n(a())]),_(`click`,t,function(...e){v()?.apply(this,e)}),u(e,t)};f(c,e=>{a()&&e(m)});var g=N(c,2),y=e=>{var n=Ko();let r;B(()=>{j(n,`title`,p()?`Close pinned items`:`Pinned items`),j(n,`aria-label`,p()?`Close pinned items`:`Pinned items`),r=i(n,1,``,null,r,{active:p()})}),_(`click`,n,function(...e){t.onPinnedItems?.apply(this,e)}),u(e,n)};f(g,e=>{d()&&e(y)});var b=N(g,2),x=e=>{var t=qo();_(`click`,t,function(...e){h()?.apply(this,e)}),u(e,t)};f(b,e=>{l()&&e(x)}),r(o),u(e,o)};f(ie,e=>{(a()||d()||l())&&e(z)});var oe=N(ie,2),se=e=>{var t=Yo();u(e,t)};f(oe,e=>{t.connected||e(se)}),r(w),r(S),B(()=>{j(S,`data-platform`,t.platform),j(E,`aria-label`,t.mobileNavigation?t.mobileNavOpen?`Close navigation`:`Open navigation`:t.sidebarCollapsed?`Expand sidebar`:`Collapse sidebar`),j(E,`title`,t.mobileNavigation?t.mobileNavOpen?`Close navigation`:`Open navigation`:t.sidebarCollapsed?`Expand sidebar`:`Collapse sidebar`),j(O,`d`,t.mobileNavigation?t.mobileNavOpen?`m15 9-3 3 3 3`:`m9 9 3 3-3 3`:t.sidebarCollapsed?`m13 9 3 3-3 3`:`m16 9-3 3 3 3`),c(ee,t.workspaceName||`ClickClack`),le(L,t.searchQuery)}),_(`click`,E,function(...e){t.onToggleSidebar?.apply(this,e)}),_(`click`,k,function(...e){t.onOpenWorkspaceSettings?.apply(this,e)}),y(`submit`,I,e=>{e.preventDefault(),t.onSearch()}),_(`input`,L,e=>t.onSearchQuery(e.currentTarget.value)),u(e,S),g()}s([`click`,`input`]);var Qo=W(`

                `),$o=W(``),es=W(``),ts=W(``),ns=W(``),rs=W(`

                `,1),is=W(`

                ClickClack

                `),as=W(``),os=W(``),ss=W(``),cs=W(``),ls=W(`

                `);function us(e,t){o(t,!0);function n(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=C(t,`pinnedOpen`,3,!1),s=C(t,`channelNotifPreference`,3,void 0),l=C(t,`channelNotifSaving`,3,!1),d=C(t,`channelSettingsAvailable`,3,!1),p=C(t,`onOpenChannelSettings`,3,()=>{}),h=C(t,`onToggleChannelNotifications`,3,()=>{}),v=m(()=>t.selectedDirect?void 0:yt(t.selectedChannel?.external_url));var x=ls(),S=A(x),w=A(S),T=e=>{var n=Qo(),r=R(n,!0);B(e=>c(r,e),[()=>`@${ot(t.selectedDirect,t.currentUserID)}`]),u(e,n)},E=e=>{var i=rs(),a=ae(i),o=R(a,!0),d=N(a,2),p=e=>{var t=ns(),i=A(t),a=e=>{var t=$o();u(e,t)},o=e=>{var t=es();u(e,t)},c=e=>{var t=ts();u(e,t)};f(i,e=>{s()===`muted`?e(a):s()===`mentions`?e(o,1):e(c,-1)}),r(t),B((e,n)=>{j(t,`title`,e),j(t,`aria-label`,n),j(t,`aria-busy`,l()),t.disabled=l()},[()=>n(s()),()=>n(s())]),_(`click`,t,function(...e){h()?.apply(this,e)}),u(e,t)};f(d,e=>{s()&&e(p)}),B(e=>c(o,e),[()=>`#${bt(t.selectedChannel)}`]),u(e,i)},D=e=>{var t=is();u(e,t)};f(w,e=>{t.selectedDirect?e(T):t.selectedChannel?e(E,1):e(D,-1)});var O=N(w,4),k=R(O,!0);r(S);var ee=N(S,2),P=N(A(ee),2);M(P);var F=N(P,2),I=e=>{var n=as();_(`click`,n,function(...e){t.onResetSearch?.apply(this,e)}),u(e,n)};f(F,e=>{t.searchQuery&&e(I)}),te(2),r(ee);var L=N(ee,2),ne=A(L),re=e=>{var t=os();B(()=>j(t,`href`,b(v))),u(e,t)};f(ne,e=>{b(v)&&e(re)});var ie=N(ne,2);let z;var oe=N(ie,2),se=e=>{var n=ss();let r;B(()=>{j(n,`title`,a()?`Close pinned items`:`Pinned items`),j(n,`aria-label`,a()?`Close pinned items`:`Pinned items`),r=i(n,1,``,null,r,{active:a()})}),_(`click`,n,function(...e){t.onPinnedItems?.apply(this,e)}),u(e,n)};f(oe,e=>{t.selectedChannel&&e(se)});var ce=N(oe,2),V=e=>{var t=cs();_(`click`,t,function(...e){p()?.apply(this,e)}),u(e,t)};f(ce,e=>{t.selectedChannel&&d()&&e(V)}),r(L),r(x),B(()=>{c(k,t.workspaceName||`no workspace`),le(P,t.searchQuery),j(ie,`title`,t.threadOpen?`Close thread`:`Open a message thread`),j(ie,`aria-label`,t.threadOpen?`Close thread`:`Open a message thread`),z=i(ie,1,``,null,z,{active:t.threadOpen})}),y(`submit`,ee,e=>{e.preventDefault(),t.onSearch()}),_(`input`,P,e=>t.onSearchQuery(e.currentTarget.value)),_(`click`,ie,function(...e){t.onToggleThread?.apply(this,e)}),u(e,x),g()}s([`click`,`input`]);function ds(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 fs(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=ds(a.userId,t,n);e&&i.push(e)}return i}async function ps(e){return(await G(`/api/workspaces/${e}/bot-commands`)).bot_commands??[]}function ms(e){let t=e.trim().toLowerCase();return t?t.startsWith(`/`)?t:`/${t}`:``}function hs(e){let t=/^(\/\S+)\s*([\s\S]*)$/.exec(e);return t?{command:ms(t[1]),text:t[2].trim()}:null}function gs(e,t){return e.find(e=>!e.revoked_at&&ms(e.command)===t)}async function _s(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 vs=e({default:()=>Ns}),ys=W(``),bs=W(``),xs=W(``),Ss=W(`
                Showing topic
                `),Cs=W(`

                `),ws=W(`
                `),Ts=W(``),Es=W(``),Ds=W(``),Os=W(` `,1),ks=W(`

                Loading thread…

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

                `),He=A(`
                `),Ue=A(` `,1),We=A(`
                `,1),Ge=A(`
                `),Ke=A(`
                `),qe=A(``),Je=A(`

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

                `),xt=P(`

                Blocked.

                `),St=P(``),Ct=P(``),wt=P(``),Tt=P(``),Et=P(`
                Moderation
                `),Dt=P(`

                Profile

                Active
                Contact information
                Handle
                User ID
                About

                `,1);function Ot(e,t){i(t,!0);let r=b(t,`messagePending`,3,!1),a=b(t,`messageError`,3,``),c=p(()=>t.profile.kind===`bot`?t.profile.owner_user_id?`Bot of ${t.profile.owner_user_id}`:`Service bot`:``),l=p(()=>t.moderation?.role||`member`),d=p(()=>!!t.moderation&&y(l)!==`owner`&&(t.currentUserRole===`owner`||t.currentUserRole===`moderator`&&(y(l)===`member`||y(l)===`guest`))),m=p(()=>t.currentUser?.id!==t.profile.id&&y(d)),_=p(()=>!!t.moderation?.blocked_at),v=p(()=>y(l));var x=Dt(),C=k(x),w=S(C),E=T(S(w),2),ee=D(E,!0);n(w);var te=T(w,2);n(C);var O=T(C,2),j=S(O),M=S(j);H(M,{class:`profile-avatar`,get id(){return t.profile.id},get name(){return t.profile.display_name},get src(){return t.profile.avatar_url},size:240,loading:`eager`,fetchPriority:`auto`}),n(j);var N=T(j,2),P=S(N),F=S(P),ne=S(F),I=D(ne,!0),re=T(ne,2),ie=e=>{var t=ht(),n=D(t,!0);A(()=>o(n,y(c))),s(e,t)};u(re,e=>{y(c)&&e(ie)});var ae=T(re,2),oe=e=>{var n=gt(),r=D(n,!0);A(e=>o(r,e),[()=>B(t.profile.handle)]),s(e,n)};u(ae,e=>{t.profile.handle&&e(oe)}),n(F);var se=T(F,2),ce=e=>{var n=_t();g(`click`,n,function(...e){t.onEdit?.apply(this,e)}),s(e,n)};u(se,e=>{t.currentUser?.id===t.profile.id&&t.onEdit&&e(ce)}),n(P);var le=T(P,4),ue=e=>{var i=vt(),a=S(i),c=D(a,!0);n(i),A(()=>{a.disabled=r(),o(c,r()?`Starting…`:`Message`)}),g(`click`,a,()=>t.onMessage?.(t.profile.id)),s(e,i)};u(le,e=>{t.currentUser?.id!==t.profile.id&&t.onMessage&&e(ue)});var de=T(le,2),fe=e=>{var t=yt(),n=D(t,!0);A(()=>o(n,a())),s(e,t)};u(de,e=>{a()&&e(fe)});var L=T(de,2),pe=S(L),R=T(S(pe),2),me=e=>{var n=_t();g(`click`,n,function(...e){t.onEdit?.apply(this,e)}),s(e,n)};u(R,e=>{t.currentUser?.id===t.profile.id&&t.onEdit&&e(me)}),n(pe);var z=T(pe,2),he=T(S(z),2),ge=T(S(he),2),_e=D(ge,!0);n(he),n(z);var ve=T(z,2),ye=T(S(ve),2),be=T(S(ye),2),xe=D(be,!0);n(ye),n(ve);var Se=T(ve,2),Ce=e=>{var t=bt(),r=T(S(t),2),i=T(S(r),2),a=D(i,!0);n(r),n(t),A(()=>o(a,y(c))),s(e,t)};u(Se,e=>{t.profile.kind===`bot`&&e(Ce)}),n(L);var we=T(L,2),U=T(S(we),2),W=D(U);n(we);var Te=T(we,2),Ee=e=>{var r=Et(),i=S(r),a=T(S(i),2),c=D(a,!0);n(i);var l=T(i,2),d=e=>{var n=Q(),r=D(n);A(()=>o(r,`${t.moderation.posts_remaining??``} of ${t.moderation.post_limit??``} waiting-room posts left today.`)),s(e,n)};u(l,e=>{t.moderation.role===`guest`&&t.moderation.post_limit>0&&e(d)});var f=T(l,2),p=e=>{var n=Q(),r=D(n);A(e=>o(r,`Timed out until ${e??``}.`),[()=>new Date(t.moderation.timeout_until).toLocaleString()]),s(e,n)};u(f,e=>{t.moderation.timeout_until&&e(p)});var m=T(f,2),h=e=>{var t=xt();s(e,t)};u(m,e=>{t.moderation.blocked_at&&e(h)});var b=T(m,2),x=S(b),C=e=>{var n=St();g(`click`,n,()=>t.onApprove?.(t.profile.id)),s(e,n)};u(x,e=>{t.moderation.role===`guest`&&t.onApprove&&e(C)});var w=T(x,2),E=e=>{var n=Ct();g(`click`,n,()=>t.onTimeout?.(t.profile.id)),s(e,n)};u(w,e=>{t.onTimeout&&e(E)});var ee=T(w,2),te=e=>{var n=wt();g(`click`,n,()=>t.onUnblock?.(t.profile.id)),s(e,n)},O=e=>{var n=Tt();g(`click`,n,()=>t.onBlock?.(t.profile.id)),s(e,n)};u(ee,e=>{y(_)&&t.onUnblock?e(te):!y(_)&&t.onBlock&&e(O,1)}),n(b),n(r),A(()=>o(c,y(v))),s(e,r)};u(Te,e=>{y(m)&&t.moderation&&e(Ee)}),n(N),n(O),A((e,n)=>{o(ee,t.profile.display_name),f(j,`--hue: ${e??``}deg`),o(I,t.profile.display_name),o(_e,n),o(xe,t.profile.id),o(W,`Member of ${(t.workspaceName||`this workspace`)??``}.`)},[()=>V(t.profile.id),()=>t.profile.handle?B(t.profile.handle):`No handle set`]),g(`click`,te,function(...e){t.onClose?.apply(this,e)}),s(e,x),h()}a([`click`]);export{we as i,mt as n,Ie as r,Ot as t}; \ No newline at end of file diff --git a/apps/api/internal/webassets/dist/_app/immutable/chunks/T0GVabNa.js b/apps/api/internal/webassets/dist/_app/immutable/chunks/T0GVabNa.js deleted file mode 100644 index 67141e44d..000000000 --- a/apps/api/internal/webassets/dist/_app/immutable/chunks/T0GVabNa.js +++ /dev/null @@ -1,72 +0,0 @@ -import{$ as e,At as t,C as n,Ct as r,Et as i,H as a,I as o,L as s,M as c,P as l,R as u,S as d,St as f,T as p,Tt as m,U as h,V as g,W as _,Y as v,a as y,ct as b,ft as x,g as S,gt as C,h as w,ht as T,j as E,kt as D,mt as O,n as ee,pt as te,r as ne,st as k,u as A,v as re,vt as j,w as ie,yt as M,z as N}from"./BTIB_WQZ.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"./ByQ3bZN5.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=M(C(new Map));get sessions(){return v(this.#e)}set sessions(e){j(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=M(C(new Map));get entries(){return v(this.#e)}set entries(e){j(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=N(`
                `);function G(e,r){i(r,!0);let a=y(r,`disabled`,3,!1);var o=Qe(),c=x(o),l=T(c,2),u=T(l,2),d=x(u);d.textContent=`<>`,t(u);var f=T(u,2),p=x(f);p.textContent=`{}`,t(f);var g=T(f,2),_=T(g,2);let v;t(o),k(()=>{c.disabled=a(),l.disabled=a(),u.disabled=a(),f.disabled=a(),g.disabled=a(),S(_,`aria-expanded`,r.showGifPicker),_.disabled=a(),v=n(_,1,``,null,v,{active:r.showGifPicker})}),h(`click`,c,()=>r.onWrap(`**`)),h(`click`,l,()=>r.onWrap(`_`)),h(`click`,u,()=>r.onWrap("`")),h(`click`,f,()=>r.onWrap("\n```\n","\n```\n",`code`)),h(`click`,g,()=>r.onWrap(`[`,`](https://)`,`label`)),h(`click`,_,function(...e){r.onToggleGif?.apply(this,e)}),s(e,o),m()}a([`click`]);var $e=N(``),et=N(`

                No GIFs found

                `),tt=N(``);function nt(e,n){i(n,!0);let r=M(void 0);ne(()=>v(r)?.focus());var a=tt(),c=x(a),u=T(x(c),2);w(u),A(u,e=>j(r,e),()=>v(r)),t(c);var d=T(c,2);E(d,21,()=>n.gifs,e=>e.url,(e,r)=>{var i=$e(),a=x(i),c=T(a,2),l=O(c,!0);t(i),k(()=>{S(a,`src`,v(r).url),S(a,`alt`,v(r).title),o(l,v(r).title)}),h(`click`,i,()=>n.onPick(v(r).url,v(r).title)),s(e,i)}),t(d);var f=T(d,2),p=e=>{var t=et();s(e,t)};l(f,e=>{n.gifs.length===0&&e(p)}),t(a),k(()=>re(u,n.query)),h(`keydown`,a,e=>{e.isComposing||e.keyCode===229||e.key===`Escape`&&(e.preventDefault(),n.onClose())}),h(`input`,u,e=>n.onQuery(e.currentTarget.value)),s(e,a),m()}a([`keydown`,`input`,`click`]);var rt=N(`
                Replying to
                `);function it(e,n){i(n,!0);var r=rt(),a=T(x(r),2),c=x(a),l=T(x(c)),u=O(l,!0);t(c);var d=T(c,2),f=O(d,!0);t(a);var p=T(a,2);t(r),k((e,t)=>{o(u,e),o(f,t)},[()=>se(n.target.author),()=>ge(n.target.body)]),h(`click`,p,function(...e){n.onClear?.apply(this,e)}),s(e,r),m()}a([`click`]);var at=N(` `),ot=N(``),st=N(`
                `),ct=N(``),lt=N(`
                `),ut=N(``),dt=N(`
                `);function ft(a,c){i(c,!0);let u=y(c,`formClass`,3,`composer`),d=y(c,`pendingUpload`,3,null),C=y(c,`replyTarget`,3,null),w=y(c,`showUpload`,3,!1),ee=y(c,`showToolbar`,3,!1),te=y(c,`slashCommands`,19,()=>[]),ne=y(c,`botCommands`,19,()=>[]),N=y(c,`mentionPeople`,19,()=>[]),P=y(c,`disabled`,3,!1),F=y(c,`onUploadFile`,3,()=>{}),ae=y(c,`onRemoveUpload`,3,()=>{}),oe=y(c,`onClearReply`,3,()=>{}),I=M(null),se=M(0),ce=M(``),L=M(0),R=M(!1),z=M(``),de=f(()=>{let e=v(z).trim().toLowerCase();return Ze.filter(t=>!e||t.title.toLowerCase().includes(e)||t.tags.some(t=>t.includes(e)))}),B=f(()=>H(c.value,v(se))),V=f(()=>!v(B)||fe(v(B))===v(ce)?[]:v(B).kind===`slash`?he(v(B)):_e(v(B)));b(()=>(c.onInputRef(v(I)),()=>c.onInputRef(null))),b(()=>{if(v(V).length===0){j(L,0);return}v(L)>=v(V).length&&j(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=v(I)){j(se,e?.selectionStart??c.value.length,!0)}function me(e){return e.startsWith(`/`)?e:`/${e}`}function he(e){let t=e.query,n=te().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=ne().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){v(B)&&ye(`${c.value.slice(0,v(B).start)}${e.insertText}${c.value.slice(v(B).end)}`,v(B).start+e.insertText.length)}async function ye(t,n=t.length,r=n){P()||(c.onValue(t),await e(),!P()&&(v(I)?.focus(),v(I)?.setSelectionRange(n,r),j(se,n,!0)))}function be(e,t=e,n=`text`){let r=v(I)?.selectionStart??c.value.length,i=v(I)?.selectionEnd??r,a=c.value.slice(r,i)||n;ye(`${c.value.slice(0,r)}${e}${a}${t}${c.value.slice(i)}`,r+e.length,r+e.length+a.length)}function xe(){v(R)&&(j(R,!1),j(z,``),v(I)?.focus())}function Se(e,t){let n=c.value&&!c.value.endsWith(` -`)?` -`:``;ye(`${c.value}${n}![${t}](${e})`),xe()}function Ce(e){let t=e.currentTarget;c.onValue(t.value),pe(t)}function we(){pe(),c.onFocus()}function Te(e){if(!(e.defaultPrevented||e.isComposing||e.keyCode===229)){if(e.key===`Escape`&&v(V).length>0&&v(B)){e.preventDefault(),j(ce,fe(v(B)),!0),v(I)?.focus();return}if(e.target===v(I)){if(v(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;j(L,(v(L)+t+v(V).length)%v(V).length);return}if(e.key===`Enter`||e.key===`Tab`){e.preventDefault(),ve(v(V)[v(L)]);return}}c.onKeydown(e)}}}var Ee=dt(),De=x(Ee),Oe=e=>{nt(e,{get gifs(){return v(de)},get query(){return v(z)},onQuery:e=>j(z,e,!0),onPick:Se,onClose:xe})};l(De,e=>{ee()&&v(R)&&!P()&&e(Oe)});var ke=T(De,2),Ae=e=>{var r=st();E(r,23,()=>v(V),e=>e.id,(e,r,i)=>{var a=ot();let c;var u=x(a),d=x(u),f=e=>{var t=g(`/`);s(e,t)},p=e=>{var t=g();k(e=>o(t,e),[()=>ue(v(r).detail)]),s(e,t)};l(d,e=>{v(r).kind===`slash`?e(f):e(p,-1)}),t(u);var m=T(u,2),_=x(m),y=x(_,!0),b=T(y),C=e=>{var t=at(),n=O(t,!0);k(()=>o(n,v(r).hint)),s(e,t)};l(b,e=>{v(r).hint&&e(C)}),t(_);var w=T(_,2),E=O(w,!0);t(m);var D=T(m,2),ee=O(D,!0);t(a),k(()=>{S(a,`aria-selected`,v(i)===v(L)),c=n(a,1,``,null,c,{active:v(i)===v(L)}),o(y,v(r).label),o(E,v(r).detail),o(ee,v(r).source??(v(r).kind===`slash`?`command`:`mention`))}),h(`mousedown`,a,e=>e.preventDefault()),h(`click`,a,()=>ve(v(r))),s(e,a)}),t(r),k(()=>S(r,`aria-label`,v(B)?.kind===`slash`?`Slash command suggestions`:`Mention suggestions`)),s(e,r)};l(ke,e=>{v(V).length>0&&e(Ae)});var je=T(ke,2),Me=x(je),Ne=e=>{var n=lt(),r=T(x(n),2),i=e=>{var t=ct();k(e=>{S(t,`src`,e),S(t,`alt`,d().filename)},[()=>Je(d())]),s(e,t)},a=f(()=>Ye(d()));l(r,e=>{v(a)&&e(i)});var c=T(r,2),u=O(c),p=T(c,2);t(n),k(e=>o(u,`${d().filename??``} · ${e??``}`),[()=>Xe(d().byte_size)]),h(`click`,p,function(...e){ae()?.apply(this,e)}),s(e,n)};l(Me,e=>{d()&&e(Ne)});var Pe=T(Me,2),Fe=e=>{it(e,{get target(){return C()},get onClear(){return oe()}})};l(Pe,e=>{C()&&e(Fe)});var Ie=T(Pe,2),Le=x(Ie),Re=e=>{var n=ut(),r=x(n);D(2),t(n),k(()=>r.disabled=P()),h(`change`,r,function(...e){F()?.apply(this,e)}),s(e,n)};l(Le,e=>{w()&&e(Re)});var U=T(Le,2);r(U),A(U,e=>j(I,e),()=>v(I)),p(U,(e,t)=>qe?.(e,t),()=>c.value);var ze=T(U,2);t(Ie);var Be=T(Ie,2),Ve=e=>{G(e,{get showGifPicker(){return v(R)},get disabled(){return P()},onWrap:be,onToggleGif:()=>{v(R)?xe():j(R,!0)}})};l(Be,e=>{ee()&&e(Ve)}),t(je),t(Ee),k(e=>{n(Ee,1,ie(u())),S(Ee,`data-handles-escape`,v(V).length>0?``:void 0),re(U,c.value),S(U,`placeholder`,c.placeholder),S(U,`aria-label`,c.ariaLabel),U.disabled=P(),S(ze,`aria-label`,c.submitLabel),ze.disabled=e},[()=>P()||!c.value.trim()]),h(`keydown`,Ee,Te),_(`submit`,je,e=>{e.preventDefault(),!P()&&(xe(),c.onSubmit())}),h(`input`,U,Ce),_(`focus`,U,we),h(`keyup`,U,()=>pe()),h(`mouseup`,U,()=>pe()),_(`select`,U,()=>pe()),s(a,Ee),m()}a([`keydown`,`mousedown`,`click`,`change`,`input`,`keyup`,`mouseup`]);function pt(e,t){this.v=e,this.k=t}function mt(e,t){(t==null||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n`u`?null:Y(BigInt.prototype.toString),Gt=typeof Symbol>`u`?null:Y(Symbol.prototype.toString),Kt=Y(Object.prototype.hasOwnProperty),qt=Y(Object.prototype.toString),J=Y(RegExp.prototype.test),Jt=Yt(TypeError);function Y(e){return function(t){t instanceof RegExp&&(t.lastIndex=0);var n=[...arguments].slice(1);return Ot(e,t,n)}}function Yt(e){return function(){return kt(e,[...arguments])}}function X(e,t){let n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:It;if(St&&St(e,null),!Ft(t))return e;let r=t.length;for(;r--;){let i=t[r];if(typeof i==`string`){let e=n(i);e!==i&&(Ct(t)||(t[r]=e),i=e)}e[i]=!0}return e}function Xt(e){for(let t=0;t/g),hn=q(/\${[\w\W]*/g),gn=q(/^data-[\-\w.\u00B7-\uFFFF]+$/),_n=q(/^aria-[\-\w]+$/),vn=q(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp|matrix):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i),yn=q(/^(?:\w+script|data):/i),bn=q(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g),xn=q(/^html$/i),Sn=q(/^[a-z][.\w]*(-[.\w]+)+$/i),Cn=q(/<[/\w!]/g),wn=q(/<[/\w]/g),Tn=q(/<\/no(script|embed|frames)/i),En=q(/\/>/i),Dn={element:1,attribute:2,text:3,cdataSection:4,entityReference:5,entityNode:6,processingInstruction:7,comment:8,document:9,documentType:10,documentFragment:11,notation:12},On=[`style`,`script`,`xmp`,`iframe`,`noembed`,`noframes`,`plaintext`,`noscript`],kn=K(X({},On)),An=function(){let e={};return At(On,t=>{e[t]=q(RegExp(`])`,`i`))}),K(e)}(),jn=function(){return typeof window>`u`?null:window},Mn=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}},Nn=function(){return{afterSanitizeAttributes:[],afterSanitizeElements:[],afterSanitizeShadowDOM:[],beforeSanitizeAttributes:[],beforeSanitizeElements:[],beforeSanitizeShadowDOM:[],uponSanitizeAttribute:[],uponSanitizeElement:[],uponSanitizeShadowNode:[]}},Pn=function(e,t,n,r){return Kt(e,t)&&Ft(e[t])?X(r.base?Zt(r.base):{},e[t],r.transform):n},Fn=function(e,t,n){let r=Kt(e,t)?e[t]:void 0;return r&&typeof r==`object`?Zt(r):n()};function In(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:jn(),t=e=>In(e);if(t.version=`3.4.16`,t.removed=[],!e||!e.document||e.document.nodeType!==Dn.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=$t(d,`cloneNode`),p=$t(d,`remove`),m=$t(d,`removeAttributeNode`),h=$t(d,`nextSibling`),g=$t(d,`childNodes`),_=$t(d,`parentNode`),v=$t(d,`shadowRoot`),y=$t(d,`attributes`),b=o&&o.prototype?$t(o.prototype,`nodeType`):null,x=o&&o.prototype?$t(o.prototype,`nodeName`):null,S=o&&o.prototype?$t(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,ee=0,te=function(){if(ee>0)throw Jt(`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.`)},ne=function(e){te(),ee++;try{return T.createHTML(e)}finally{ee--}},k=function(e){te(),ee++;try{return T.createScriptURL(e)}finally{ee--}},A=function(){return O||=(D=Mn(u,i),!0),D},re=n,j=re.implementation,ie=re.createNodeIterator,M=re.createDocumentFragment,N=re.getElementsByTagName,P=r.importNode,F=Nn();t.isSupported=typeof xt==`function`&&typeof _==`function`&&j&&j.createHTMLDocument!==void 0;let ae=pn,oe=mn,I=hn,se=gn,ce=_n,le=yn,ue=bn,L=Sn,R=vn,z=null,de=X({},[...tn,...nn,...rn,...on,...cn]),B=null,V=X({},[...ln,...un,...dn,...fn]),H=Object.seal(Et(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(Et(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],Lt),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=Zt(e),Ze=Qe.indexOf(e.PARSER_MEDIA_TYPE)===-1?`text/html`:e.PARSER_MEDIA_TYPE,G=Ze===`application/xhtml+xml`?Lt:It,z=Pn(e,`ALLOWED_TAGS`,de,{transform:G}),B=Pn(e,`ALLOWED_ATTR`,V,{transform:G}),We=Pn(e,`ALLOWED_NAMESPACES`,Ge,{transform:Lt}),U=Pn(e,`ADD_URI_SAFE_ATTR`,ze,{transform:G,base:ze}),Le=Pn(e,`ADD_DATA_URI_TAGS`,Re,{transform:G,base:Re}),Fe=Pn(e,`FORBID_CONTENTS`,Ie,{transform:G}),fe=Pn(e,`FORBID_TAGS`,Zt({}),{transform:G}),pe=Pn(e,`FORBID_ATTR`,Zt({}),{transform:G}),Pe=Kt(e,`USE_PROFILES`)?e.USE_PROFILES&&typeof e.USE_PROFILES==`object`?Zt(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=en(e.ALLOWED_URI_REGEXP)?e.ALLOWED_URI_REGEXP:vn,He=typeof e.NAMESPACE==`string`?e.NAMESPACE:W,qe=Fn(e,`MATHML_TEXT_INTEGRATION_POINTS`,()=>X({},Ke)),Ye=Fn(e,`HTML_INTEGRATION_POINTS`,()=>X({},Je));let t=Fn(e,`CUSTOM_ELEMENT_HANDLING`,()=>Et(null));if(H=Et(null),Kt(t,`tagNameCheck`)&&tt(t.tagNameCheck)&&(H.tagNameCheck=t.tagNameCheck),Kt(t,`attributeNameCheck`)&&tt(t.attributeNameCheck)&&(H.attributeNameCheck=t.attributeNameCheck),Kt(t,`allowCustomizedBuiltInElements`)&&typeof t.allowCustomizedBuiltInElements==`boolean`&&(H.allowCustomizedBuiltInElements=t.allowCustomizedBuiltInElements),q(H),ye&&(ge=!1),De&&(Ee=!0),Pe&&(z=X({},cn),B=Et(null),Pe.html===!0&&(X(z,tn),X(B,ln)),Pe.svg===!0&&(X(z,nn),X(B,un),X(B,fn)),Pe.svgFilters===!0&&(X(z,rn),X(B,un),X(B,fn)),Pe.mathMl===!0&&(X(z,on),X(B,dn),X(B,fn))),me.tagCheck=null,me.attributeCheck=null,Kt(e,`ADD_TAGS`)&&(typeof e.ADD_TAGS==`function`?me.tagCheck=e.ADD_TAGS:Ft(e.ADD_TAGS)&&(z===de&&(z=Zt(z)),X(z,e.ADD_TAGS,G))),Kt(e,`ADD_ATTR`)&&(typeof e.ADD_ATTR==`function`?me.attributeCheck=e.ADD_ATTR:Ft(e.ADD_ATTR)&&(B===V&&(B=Zt(B)),X(B,e.ADD_ATTR,G))),Kt(e,`ADD_FORBID_CONTENTS`)&&Ft(e.ADD_FORBID_CONTENTS)&&(Fe===Ie&&(Fe=Zt(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 Jt(`TRUSTED_TYPES_POLICY configuration option must provide a "createHTML" hook.`);if(typeof e.TRUSTED_TYPES_POLICY.createScriptURL!=`function`)throw Jt(`TRUSTED_TYPES_POLICY configuration option must provide a "createScriptURL" hook.`);let t=T;T=e.TRUSTED_TYPES_POLICY;try{E=ne(``)}catch(e){throw T=t,e}}else e.TRUSTED_TYPES_POLICY===null?(T=void 0,E=``):(T===void 0&&(T=A()),T&&typeof E==`string`&&(E=ne(``)));K&&K(e),$e=e},rt=X({},[...nn,...rn,...an]),it=X({},[...on,...sn]),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=It(e.tagName),r=It(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){Nt(t.removed,{element:e});try{_(e).removeChild(e)}catch{if(p(e),!_(e))throw Jt(`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=[];At(t,t=>{Nt(e,t)}),At(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}Nt(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)===Dn.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===Dn.processingInstruction||n===Dn.comment&&J(wn,e.data)){try{p(e)}catch{}continue}if(n===Dn.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=Rt(e,/^[\r\n\t ]+/);r=t&&t[0]}Ze===`application/xhtml+xml`&&He===W&&(e=``+e+``);let i=T?ne(e):e;if(He===W)try{t=new l().parseFromString(i,Ze)}catch{}if(!t||!t.documentElement){t=j.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)},yt=function(e){return e=zt(e,ae,` `),e=zt(e,oe,` `),e=zt(e,I,` `),e},bt=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=yt(r.data),r=n.nextNode();let i=e.querySelectorAll?.call(e,`template`);i&&At(i,e=>{Ct(e.content)&&bt(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)===Dn.documentFragment}catch{return!1}},wt=function(e){if(!b||typeof e!=`object`||!e)return!1;try{return typeof b(e)==`number`}catch{return!1}};function Tt(e,n,r){e.length!==0&&At(e,e=>{e.call(t,n,r,$e)})}let Dt=function(e,t){return!!(be&&e.hasChildNodes()&&!wt(e.firstElementChild)&&J(Cn,e.textContent)&&J(Cn,e.innerHTML)||be&&e.namespaceURI===W&&kn[t]&&(wt(e.firstElementChild)||typeof e.textContent==`string`&&J(An[t],e.textContent))||e.nodeType===Dn.processingInstruction||be&&e.nodeType===Dn.comment&&J(wn,e.data))},Ot=function(e,t){return e instanceof RegExp?J(e,t):e instanceof Function&&!!e(t,...[...arguments].slice(2))},kt=function(e,t,n){if(!fe[t]&&Y(t)&&Ot(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?Zt(t):t},Ut=function(e,t){return e===t||_(e)!==null?!1:(Ne&&mt(e),!0)},Wt=function(e,n){if(Tt(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),Tt(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=kt(e,r,n);return t===!1&&(Tt(F.afterSanitizeElements,e,null),Ut(e,n))?!0:t}if(C(e)===Dn.element&&!ct(e)||(r===`noscript`||r===`noembed`||r===`noframes`)&&J(Tn,e.innerHTML))return lt(e),!0;if(ye&&e.nodeType===Dn.text){let n=yt(e.textContent);e.textContent!==n&&(Nt(t.removed,{element:e.cloneNode()}),e.textContent=n)}return Tt(F.afterSanitizeElements,e,null),Ut(e,n)},Gt=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,zt(r,ue,``))||(t===`src`||t===`xlink:href`||t===`href`)&&e!==`script`&&Bt(r,`data:`)===0&&Le[e]||_e&&!J(le,zt(r,ue,``))?!0:!r:Y(e)&&Ot(H.tagNameCheck,e)&&Ot(H.attributeNameCheck,t,e)||t===`is`&&H.allowCustomizedBuiltInElements&&Ot(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`]),Y=function(e){return!qt[It(e)]&&J(L,e)},Yt=function(e,t,n,r){if(T&&typeof u==`object`&&typeof u.getAttributeType==`function`&&!n)switch(u.getAttributeType(e,t)){case`TrustedHTML`:return ne(r);case`TrustedScriptURL`:return k(r)}return r},Xt=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}},On=function(e,n){if(Tt(F.beforeSanitizeAttributes,e,null),Ut(e,n))return;let r=e.attributes;if(!r||St(e))return;B=Ht(F.uponSanitizeAttribute,B,V,we);let i={attrName:``,attrValue:``,keepAttr:!0,allowedAttributes:B,forceKeepAttr:void 0},a=r.length,o=G(e.nodeName);for(;a--;){let n=r[a],s=n.name,c=n.namespaceURI,l=n.value,u=G(s),d=l,f=s===`value`?d:Vt(d),p=!1;if(i.attrName=u,i.attrValue=f,i.keepAttr=!0,i.forceKeepAttr=void 0,Tt(F.uponSanitizeAttribute,e,i),f=i.attrValue,Ae&&(u===`id`||u===`name`)&&Bt(f,je)!==0&&(ft(s,e,n),f=je+f,p=!0),be&&J(/((--!?|])>)|<\/(style|script|title|xmp|textarea|noscript|iframe|noembed|noframes)/i,f)){ft(s,e,n);continue}if(u===`attributename`&&Rt(f,`href`)){ft(s,e,n);continue}if(!i.forceKeepAttr){if(!i.keepAttr){ft(s,e,n);continue}if(!ve&&J(En,f)){ft(s,e,n);continue}if(ye&&(f=yt(f)),!Gt(o,u,f)){ft(s,e,n);continue}f=Yt(o,u,c,f),f!==d&&Xt(e,s,c,f)&&p&&Mt(t.removed)}}Tt(F.afterSanitizeAttributes,e,null),Ut(e,n)},Ln=function(e){let t=null,n=vt(e);for(Tt(F.beforeSanitizeShadowDOM,e,null);t=n.nextNode();)if(Tt(F.uponSanitizeShadowNode,t,null),Wt(t,e),On(t,e),Ct(t.content)&&Ln(t.content),C(t)===Dn.element){let e=v(t);Ct(e)&&(Rn(e),Ln(e))}Tt(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)===Dn.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`&&!wt(e)&&(e=Qt(e),typeof e!=`string`))throw Jt(`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=Zt(z)),F.uponSanitizeAttribute.length>0&&(B=Zt(B)),t.removed=[];let c=Ne&&typeof e!=`string`&&wt(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),Jt(`root node is forbidden and cannot be sanitized in-place`)}if(St(e))throw dt(e),Jt(`root node is clobbered and cannot be sanitized in-place`);try{Rn(e)}catch(t){throw dt(e),t}}else if(wt(e))i=_t(``),a=i.ownerDocument.importNode(e,!0),a.nodeType===Dn.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?ne(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();)Wt(o,l),On(o,l),Ct(o.content)&&Ln(o.content)}catch(n){throw c&&(dt(e),At(t.removed,e=>{e.element&&mt(e.element)})),n}if(c){let n=!1;if(At(t.removed,t=>{t.element&&(t.element===e&&(n=!0),mt(t.element))}),n)throw Jt(`a node selected for removal could not be safely returned; refusing to sanitize in place`);return ye&&bt(e),e}if(Ee){if(ye&&bt(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(xn,i.ownerDocument.doctype.name)&&(u=` -`+u),ye&&(u=yt(u)),T&&Oe?ne(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 Gt(r,i,n)},t.addHook=function(e,t){typeof t==`function`&&Kt(F,e)&&Nt(F[e],t)},t.removeHook=function(e,t){if(Kt(F,e)){if(t!==void 0){let n=jt(F[e],t);return n===-1?void 0:Pt(F[e],n,1)[0]}return Mt(F[e])}},t.removeHooks=function(e){Kt(F,e)&&(F[e]=[])},t.removeAllHooks=function(){F=Nn()},t}var Ln=In(),Rn=2097152,zn=67108864,Bn=25165824,Vn={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`},Hn=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`]),Un=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`]),Wn=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 Gn(e){let t=e.toLowerCase().split(/[\\/]/).pop()||``,n=t.lastIndexOf(`.`);return n>0?t.slice(n+1):``}function Kn(e){return(e.content_type||``).split(`;`,1)[0].trim().toLowerCase()}function qn(e){let t=Gn(e.filename),n=Kn(e);return t===`docx`||n===`application/vnd.openxmlformats-officedocument.wordprocessingml.document`?`docx`:[`xlsx`,`xlsm`,`xltx`,`xltm`].includes(t)||Un.has(n)?`spreadsheet`:[`pptx`,`pptm`,`potx`,`potm`,`ppsx`,`ppsm`].includes(t)||Wn.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`:Vn[t]||Hn.has(n)?`code`:t===`txt`||t===`log`||n===`text/plain`||n.startsWith(`text/`)?`text`:`unsupported`}function Jn(e){let t=Gn(e.filename);if(Vn[t])return Vn[t];let n=Kn(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 Yn(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 Xn(e){if(e===`pdf`)return zn;if(e===`spreadsheet`||e===`presentation`)return Bn;if(e===`code`||e===`text`||e===`markdown`||e===`html`)return Rn}function Zn(){return{async:!1,breaks:!1,extensions:null,gfm:!0,hooks:null,pedantic:!1,renderer:null,silent:!1,tokenizer:null,walkTokens:null}}var Qn=Zn();function $n(e){Qn=e}var er={exec:()=>null};function tr(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 nr=((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,numericCharacterReference:/&#(?:(\d{1,7})|[Xx]([A-Fa-f0-9]{1,6}));/g,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:tr(e=>RegExp(`^ {0,${e}}(?:[*+-]|\\d{1,9}[.)])((?:[ ][^\\n]*)?(?:\\n|$))`)),hrRegex:tr(e=>RegExp(`^ {0,${e}}((?:-[ ]*){3,}|(?:_[ ]*){3,}|(?:\\*[ ]*){3,})(?:\\n+|$)`)),fencesBeginRegex:tr(e=>RegExp(`^ {0,${e}}(?:\`\`\`|~~~)`)),headingBeginRegex:tr(e=>RegExp(`^ {0,${e}}#`)),htmlBeginRegex:tr(e=>RegExp(`^ {0,${e}}(?:)|<(?:script|pre|style|textarea|!--))`,`i`)),blockquoteBeginRegex:tr(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 |fences|blockquote|heading|hr|html|table))+?)\n {0,3}(=+|-+) *(?:\n+|$)/,ur=Z(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(/hr/g,/ {0,3}(?:(?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).replace(/\|table/g,``).getRegex(),dr=Z(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(/hr/g,/ {0,3}(?:(?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/).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=Z(/^ {0,3}\[(label)\]: *(?:\n[ \t]*)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n[ \t]*)?| *\n[ \t]*)(title))? *(?:\n+|$)/).replace(`label`,mr).replace(`title`,/(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/).getRegex(),gr=Z(/^(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=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`,vr).replace(`tag`,_r).replace(`attribute`,/ +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(),br=e=>Z(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:Z(/^( {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:er,text:pr},wr=Z(`^ *([^\\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:Z(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:Z(`^ *(?: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:er,lheading:/^(.+?)\n {0,3}(=+|-+) *(?:\n+|$)/,paragraph:Z(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*$)[ \t]*/,Ar=/^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\`+)[^`]+\k(?!`))*?\]\((?:\\[\s\S]|[^\\\(\)]|\((?:\\[\s\S]|[^\\\(\)])*\))*\)/).replace(`precode-`,nr?"(?`+)[^`]+\k(?!`)/).replace(`html`,/<(?! )[^<>]*?>/).getRegex(),Br=/^(?:\*+(?:((?!\*)punct)|([^\s*]))?)|^_+(?:((?!_)punct)|([^\s_]))?/,Vr=Z(Br,`u`).replace(/punct/g,jr).getRegex(),Hr=Z(Br,`u`).replace(/punct/g,Ir).getRegex(),Ur=Z(/^(?:\*+(?:((?!\*)(?!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=Z(Wr,`gu`).replace(/notPunctSpace/g,Nr).replace(/punctSpace/g,Mr).replace(/punct/g,jr).getRegex(),Kr=Z(Wr,`gu`).replace(/notPunctSpace/g,Rr).replace(/punctSpace/g,Lr).replace(/punct/g,Ir).getRegex(),qr=Z(`^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\*)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=Z(`^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)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=Z(`^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)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=Z(/^~~?(?:((?!~)punct)|[^\s~])/,`u`).replace(/punct/g,jr).getRegex(),Zr=Z(`^[^~]+(?=[^~])|(?!~)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=Z(/\\(punct)/,`gu`).replace(/punct/g,jr).getRegex(),$r=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(),ei=Z(vr).replace(`(?:-->|$)`,`-->`).getRegex(),ti=Z(`^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=/\[(?:\\[\s\S]|[^\[\]\\])*\]/,ri=Z(/(?:\[(?:brackets|\\[\s\S]|[^\[\]\\])*\]|\\[\s\S]|`+(?!`)[^`]*?`+(?!`)|``+(?=\])|[^\[\]\\`])*?/).replace(`brackets`,ni).getRegex(),ii=Z(/^!?\[(label)\]\([ \t\n]*(href)(?:(?:[ \t]+(?:\n[ \t]*)?|\n[ \t]*)(title))?[ \t\n]*\)/).replace(`label`,ri).replace(`href`,/<(?:\\.|[^\n<>\\])+>|[^ \t\n\x00-\x1f]+|(?=\))/).replace(`title`,/"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/).getRegex(),ai=Z(/^!?\[(label)\]\[(ref)\]/).replace(`label`,ri).replace(`ref`,mr).getRegex(),oi=Z(/^!?\[(ref)\](?:\[\])?/).replace(`ref`,mr).getRegex(),si=/(?!\s*\])(?:\\[\s\S]|[^\[\]\\]){1,999}/,ci=Z(/(?:[^\[\]\\`]*(?:\[(?:brackets|\\[\s\S]|[^\[\]\\])*\]|\\[\s\S]|`+(?!`)[^`]*?`+(?!`)|``+(?=\]))){0,999}?[^\[\]\\`]*?/).replace(`brackets`,ni).getRegex(),li=Z(`reflink|nolink(?!\\()`,`g`).replace(`reflink`,Z(/^!?\[(label)\]\[(ref)\]/).replace(`label`,ci).replace(`ref`,si).getRegex()).replace(`nolink`,Z(/^!?\[(ref)\](?:\[\])?/).replace(`ref`,si).getRegex()).getRegex(),ui=/[hH][tT][tT][pP][sS]?|[fF][tT][pP]/,di=Z(/(?:mailto:email|xmpp:email(?:\/[A-Za-z0-9@.]+)?)/).replace(/email/g,/[A-Za-z0-9._+-]+@[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![\w-])/).getRegex(),fi={_backpedal:er,anyPunctuation:Qr,autolink:$r,blockSkip:zr,br:kr,code:Or,del:er,delLDelim:er,delRDelim:er,emStrongLDelim:Vr,emStrongRDelimAst:Gr,emStrongRDelimUnd:Jr,escape:Dr,link:ii,nolink:oi,punctuation:Pr,reflink:ai,reflinkSearch:li,tag:ti,text:Ar,url:er},pi={...fi,emStrongLDelim:Ur,emStrongRDelimAst:qr,emStrongRDelimUnd:Yr,link:Z(/^!?\[(label)\]\((.*?)\)/).replace(`label`,ri).getRegex(),reflink:Z(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace(`label`,ri).getRegex()},mi={...fi,emStrongRDelimAst:Kr,emStrongLDelim:Hr,delLDelim:Xr,delRDelim:Zr,url:Z(/^emailProtocol|^((?:protocol):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/).replace(`emailProtocol`,di).replace(`protocol`,ui).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(/^(?:[^a-zA-Z0-9](?=emailProtocol)|(`+|~+|[^`~])(?:(?=[`~])|(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\":`>`,'"':`"`,"'":`'`},yi=e=>vi[e];function bi(e,t){if(t){if(Q.escapeTest.test(e))return e.replace(Q.escapeReplace,yi)}else if(Q.escapeTestNoEncode.test(e))return e.replace(Q.escapeReplaceNoEncode,yi);return e}function xi(e){return e.replace(Q.numericCharacterReference,(e,t,n)=>{let r=t===void 0?Number.parseInt(n,16):Number.parseInt(t,10);return r===0||r>1114111||r>=55296&&r<=57343?`�`:String.fromCodePoint(r)})}function Si(e){try{e=encodeURI(e).replace(Q.percentDecode,`%`)}catch{return null}return e}function Ci(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 Ei(e){return e.trim().toLowerCase().toUpperCase().toLowerCase()}function Di(e,t){if(e.indexOf(t[0])===-1&&e.indexOf(t[1])===-1)return-1;let n=0;for(let r=0;r0?-2:-1}function Oi(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 ki(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 Ai(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(` -`)}function ji(e,t,n,r){if(!t.includes(`<`))return!1;for(let i=0;it.length-i)return!0;i+=o[0].length-1}}return!1}var Mi=class{options;rules;lexer;constructor(e){this.options=e||Qn}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]:Ti(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=Ai(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=wi(e,`#`);(this.options.pedantic||!t||this.rules.other.endingSpaceTabChar.test(t))&&(e=t.trim())}return{type:`heading`,raw:wi(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:wi(t[0],` -`)}}blockquote(e){let t=this.rules.block.blockquote.exec(e);if(t){let e=wi(t[0],` -`).split(` -`),n=``,r=``,i=[];for(;e.length>0;){let t=!1,a=[],o=0;for(;o0&&(n=`${n} -${d.join(` -`)}`),r=r.substring(0,r.length-t.text.length)+s.text;break}if(u?.type===`list`){let t=u,a=t.raw+` -`+e.join(` -`),o=this.list(a);i[i.length-1]=o,n=n.substring(0,n.length-u.raw.length)+o.raw,r=r.substring(0,r.length-t.raw.length)+o.raw,e=a.substring(i.at(-1).raw.length).split(` -`);continue}}return{type:`blockquote`,raw:n,tokens:i,text:r}}}list(e){let t=this.rules.block.list.exec(e);if(t){let n=t[1].trim(),r=n.length>1,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=t[2].split(` -`,1)[0],l=t[1].length,u=this.options.pedantic?Oi(c,l):c.replace(this.rules.other.leadingSpaceTab,e=>Oi(e,l)),d=e.split(` -`,1)[0],f=!u.trim(),p=0;if(this.options.pedantic?(p=2,s=u.trimStart()):f?p=l+1:(p=u.search(this.rules.other.nonSpaceChar),p=p>4?1:p,s=u.slice(p),p+=l),f&&this.rules.other.blankLine.test(d)&&(r+=d+` -`,e=e.substring(d.length+1),n=!0),!n){let t=this.rules.other.nextBulletRegex(p),n=this.rules.other.hrRegex(p),i=this.rules.other.fencesBeginRegex(p),a=this.rules.other.headingBeginRegex(p),o=this.rules.other.htmlBeginRegex(p),c=this.rules.other.blockquoteBeginRegex(p);for(;e;){let l=e.split(` -`,1)[0],m;if(d=l,this.options.pedantic?(d=d.replace(this.rules.other.listReplaceNesting,` `),m=d):m=d.replace(this.rules.other.leadingSpaceTab,e=>e.replace(this.rules.other.tabCharGlobal,` `)),i.test(d)||a.test(d)||o.test(d)||c.test(d)||t.test(d)||n.test(d))break;if(m.search(this.rules.other.nonSpaceChar)>=p||!d.trim())s+=` -`+m.slice(p);else{if(f||u.replace(this.rules.other.tabCharGlobal,` `).search(this.rules.other.nonSpaceChar)>=4||i.test(u)||a.test(u)||n.test(u))break;s+=` -`+d}f=!d.trim(),r+=l+` -`,e=e.substring(l.length+1),u=m.slice(p)}}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=Ti(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){if(!this.rules.other.startAngleBracket.test(t[2])&&Di(t[2],`()`)!==-1)return;let e=Ei(t[1]).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:wi(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=Ci(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:wi(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:wi(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){if(this.lexer.state.linkParenPossible===!1)return;let t=this.rules.inline.link.exec(e);if(t){let n=t[0].charAt(0)===`!`?2:1;if(!this.options.pedantic&&ji(e,t[1],n,this.rules))return;let r=t[2].trim();if(!this.options.pedantic&&this.rules.other.startAngleBracket.test(r)){if(!this.rules.other.endAngleBracket.test(r))return;let e=wi(r.slice(0,-1),`\\`);if((r.length-e.length)%2==0)return}else{let e=Di(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 i=t[2],a=``;if(this.options.pedantic){let e=this.rules.other.pedanticHrefTitle.exec(i);e&&(i=e[1],a=e[3])}else a=t[3]?t[3].slice(1,-1):``;return i=i.trim(),this.rules.other.startAngleBracket.test(i)&&(i=this.options.pedantic&&!this.rules.other.endAngleBracket.test(r)?i.slice(1):i.slice(1,-1)),ki(t,{href:i&&i.replace(this.rules.inline.anyPunctuation,`$1`),title:a&&a.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 r=n[0].charAt(0)===`!`?2:1;if(!this.options.pedantic&&ji(e,n[1],r,this.rules))return;let i=t[Ei((n[2]||n[1]).replace(this.rules.other.multipleSpaceGlobal,` `))];if(!i){let e=n[0].charAt(0);return{type:`text`,raw:e,text:e}}return ki(n,i,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:e?t[0]:xi(t[0]),escaped:e}}}},Ni=class e{tokens;options;state;inlineQueue;tokenizer;constructor(e){this.tokens=[],this.tokens.links=Object.create(null),this.options=e||Qn,this.options.tokenizer=this.options.tokenizer||new Mi,this.tokenizer=this.options.tokenizer,this.tokenizer.options=this.options,this.tokenizer.lexer=this,this.inlineQueue=[],this.state={inLink:!1,inRawBlock:!1,linkEmitted:!1,linkParenPossible:!0,top:!0};let t={other:Q,block:gi.normal,inline:_i.normal};this.options.pedantic?(t.block=gi.pedantic,t.inline=_i.pedantic):this.options.gfm&&(t.block=gi.gfm,t.inline=this.options.breaks?_i.breaks:_i.gfm),this.tokenizer.rules=t}static get rules(){return{block:gi,inline:_i}}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,Ei(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=this.state.linkParenPossible;this.state.linkParenPossible=n&&e.includes(`)`);try{return this.#e(e,t)}finally{this.state.linkParenPossible=n}}#e(e,t){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,Ei(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)}},Pi=class{options;parser;constructor(e){this.options=e||Qn}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:bi(i,!0))+`
                -`:`
                `+(n?i:bi(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`${bi(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?bi(n,!0):this.parser.parseInline(r),o=Si(e);if(o===null)return a;e=bi(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=Si(e);if(i===null)return bi(n);e=i;let a=`${bi(n)}`,a}text(e){return`tokens`in e&&e.tokens?this.parser.parseInline(e.tokens):`escaped`in e&&e.escaped?e.text:bi(e.text)}},Fi=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}},Ii=class e{options;renderer;textRenderer;constructor(e){this.options=e||Qn,this.options.renderer=this.options.renderer||new Pi,this.renderer=this.options.renderer,this.renderer.options=this.options,this.renderer.parser=this,this.textRenderer=new Fi}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 Pi(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 Mi(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 Li;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]=Li.passThroughHooks.has(n)?e=>{if(this.defaults.async&&Li.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 Ni.lex(e,t??this.defaults)}parser(e,t){return Ii.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?Ni.lex:Ni.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?Ii.parse:Ii.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?Ni.lex:Ni.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?Ii.parse:Ii.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:

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

                `),Sa=N(` `,1),Ca=N(``),wa=N(``),Ta=N(``);function Ea(e,r){i(r,!0);let a=y(r,`canReact`,3,!1),u=y(r,`canReply`,3,!1),d=y(r,`showOpenThread`,3,!0),f=y(r,`canOpenThread`,3,!1),g=y(r,`canEdit`,3,!1),_=y(r,`canPin`,3,!1),b=y(r,`pinned`,3,!1),C=y(r,`pinning`,3,!1),w=y(r,`pinError`,3,``),D=y(r,`canDelete`,3,!1),re=y(r,`deleting`,3,!1),ie=y(r,`copyStatus`,3,``),N=y(r,`canCopyLink`,3,!1),P=y(r,`copyLinkStatus`,3,``),F=M(void 0),ae=M(void 0),oe=!0,I=new Set;function se(e){if(e.key===`Escape`){e.preventDefault(),e.stopPropagation(),r.onClose();return}if(e.key!==`Tab`||!v(ae))return;let t=[...v(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(),v(ae).focus();return}let n=t[0],i=t[t.length-1];e.shiftKey&&(document.activeElement===n||!v(ae).contains(document.activeElement))?(e.preventDefault(),i.focus()):!e.shiftKey&&(document.activeElement===i||!v(ae).contains(document.activeElement))&&(e.preventDefault(),n.focus())}function ce(e,t=!1){oe=t,e()}ne(()=>{let e=v(F)?.parentElement;if(e)for(let t of e.children)t instanceof HTMLElement&&t!==v(F)&&!t.inert&&(t.inert=!0,I.add(t));v(ae)?.querySelector(`button:not(:disabled)`)?.focus({preventScroll:!0})}),ee(()=>{for(let e of I)e.inert=!1;I.clear(),oe&&r.returnFocus?.isConnected&&r.returnFocus.focus({preventScroll:!0})});var le=Ta(),ue=x(le),L=T(ue,2),R=T(x(L),2);E(R,21,()=>aa,c,(e,t)=>{var n=ga(),i=O(n,!0);k(()=>{S(n,`aria-label`,`React with ${v(t)}`),n.disabled=!a(),o(i,v(t))}),h(`click`,n,()=>ce(()=>r.onReact(v(t)),!0)),s(e,n)}),t(R);var z=T(R,2),de=x(z),B=e=>{var t=_a();k(()=>t.disabled=!f()),h(`click`,t,()=>ce(r.onOpenThread)),s(e,t)};l(de,e=>{d()&&e(B)});var V=T(de,2),H=T(V,2),fe=T(x(H),2),pe=e=>{var t=va();let r;var i=O(t,!0);k(()=>{r=n(t,1,`sheet-copy-status`,null,r,{"is-error":ie()===`failed`}),o(i,ie()===`copied`?`Copied`:`Couldn't copy`)}),s(e,t)};l(fe,e=>{ie()&&e(pe)}),t(H);var me=T(H,2),he=e=>{var n=ba(),i=T(x(n)),a=T(i),c=e=>{var t=ya();s(e,t)};l(a,e=>{P()===`failed`&&e(c)}),t(n),k(()=>{n.disabled=P()===`pending`,o(i,` ${P()===`pending`?`Creating link…`:`Copy link`} `)}),h(`click`,n,function(...e){r.onCopyLink?.apply(this,e)}),s(e,n)};l(me,e=>{N()&&r.onCopyLink&&e(he)});var ge=T(me,2),_e=e=>{var n=Sa(),i=te(n),a=T(x(i));t(i);var c=T(i,2),u=e=>{var t=xa(),n=O(t,!0);k(()=>o(n,w())),s(e,t)};l(c,e=>{w()&&e(u)}),k(()=>{i.disabled=C(),o(a,` ${b()?`Unpin message`:`Pin message`}`)}),h(`click`,i,function(...e){r.onTogglePin?.apply(this,e)}),s(e,n)};l(ge,e=>{_()&&r.onTogglePin&&e(_e)});var ve=T(ge,2),ye=e=>{var t=Ca();h(`click`,t,()=>ce(r.onEdit)),s(e,t)};l(ve,e=>{g()&&e(ye)});var be=T(ve,2),xe=e=>{var t=wa();k(()=>t.disabled=re()),h(`click`,t,()=>ce(r.onDelete)),s(e,t)};l(be,e=>{D()&&e(xe)}),t(z),t(L),A(L,e=>j(ae,e),()=>v(ae)),t(le),A(le,e=>j(F,e),()=>v(F)),p(le,e=>ha?.(e)),k(()=>{S(L,`id`,r.id),V.disabled=!u()}),h(`keydown`,le,se),h(`click`,ue,function(...e){r.onClose?.apply(this,e)}),h(`click`,V,()=>ce(r.onReply)),h(`click`,H,function(...e){r.onCopy?.apply(this,e)}),s(e,le),m()}a([`keydown`,`click`]);var Da=N(``);function Oa(e,n){i(n,!0);let r=M(void 0),a=M(void 0),o=new Set;function c(e){e.key===`Escape`&&(e.preventDefault(),n.onClose())}function l(){v(a)?.focus({preventScroll:!0}),v(a)?.select()}ne(()=>{let e=v(r)?.parentElement;if(e)for(let t of e.children)t instanceof HTMLElement&&t!==v(r)&&!t.inert&&(t.inert=!0,o.add(t));l()}),ee(()=>{for(let e of o)e.inert=!1;o.clear(),n.returnFocus?.isConnected&&n.returnFocus.focus({preventScroll:!0})});var u=Da(),d=x(u),f=T(d,2),g=T(x(f),4);w(g),A(g,e=>j(a,e),()=>v(a));var _=T(g,2);t(f),t(u),A(u,e=>j(r,e),()=>v(r)),p(u,e=>ha?.(e)),k(()=>re(g,n.url)),h(`keydown`,u,c),h(`click`,d,function(...e){n.onClose?.apply(this,e)}),h(`click`,g,l),h(`click`,_,function(...e){n.onClose?.apply(this,e)}),s(e,u),m()}a([`keydown`,`click`]);function ka(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 Aa=N(`
                `),ja=N(``),Ma=N(` `,1),Na=N(`
                `,2),Pa=N(`
                `),Fa=N(`
                `),Ia=N(` `);function La(e,r){i(r,!0);let a=y(r,`onOpenImage`,3,()=>{}),c=y(r,`onOpenArtifact`,3,()=>{}),p=M(null),g=M(!1),b=M(``),C=f(()=>v(b)||P(r.upload.duration_ms??0)),w=f(()=>Kn(r.upload)),E=f(()=>qn(r.upload)),D=f(()=>v(E)===`unsupported`&&v(w).startsWith(`image/`)),ee=f(()=>v(E)===`unsupported`&&v(w).startsWith(`video/`)),ne=f(()=>v(E)===`unsupported`&&v(w).startsWith(`audio/`)),re=f(()=>Xn(v(E))!==void 0),ie=f(()=>Yn(v(E))),N=f(()=>{let e=r.upload.width??0,t=r.upload.height??0;if(e<=0||t<=0)return``;let n=v(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(){j(g,!0)}function ae(){v(p)&&isFinite(v(p).duration)&&j(b,P(v(p).duration*1e3),!0)}function oe(){v(p)&&(j(g,!0),v(p).play())}var I=u(),se=te(I),ce=e=>{var n=Aa(),i=x(n),c=O(i),l=T(i,2),u=x(l),f=O(u,!0),p=T(u,2);t(l),t(n),k(()=>{S(i,`aria-label`,`Open image ${r.upload.filename}`),S(c,`src`,r.url),S(c,`alt`,r.upload.filename),S(c,`width`,r.upload.width||void 0),S(c,`height`,r.upload.height||void 0),d(c,v(N)),o(f,r.upload.filename),S(p,`href`,r.url),S(p,`download`,r.upload.filename),S(p,`aria-label`,`Download ${r.upload.filename}`)}),h(`click`,i,()=>a()(r.url,r.upload.filename)),h(`click`,p,e=>e.stopPropagation()),s(e,n)},le=e=>{var i=Na();let a;var c=x(i),u=O(c);A(c,e=>j(p,e),()=>v(p));var f=T(c,2),m=e=>{var t=Ma(),n=te(t),i=T(n,2),a=e=>{var t=ja(),n=O(t,!0);k(()=>o(n,v(C))),s(e,t)};l(i,e=>{v(C)&&e(a)}),k(()=>S(n,`aria-label`,`Play ${r.upload.filename}`)),h(`click`,n,oe),s(e,t)};l(f,e=>{v(g)||e(m)});var y=T(f,2),b=x(y),E=O(b,!0),D=T(b,2);t(y),t(i),k(()=>{a=n(i,1,`media-tile media-tile--video`,null,a,{"is-started":v(g)}),c.controls=v(g),S(c,`aria-label`,r.upload.filename),S(c,`width`,r.upload.width||void 0),S(c,`height`,r.upload.height||void 0),d(c,v(N)),S(u,`src`,r.url),S(u,`type`,v(w)),o(E,r.upload.filename),S(D,`href`,r.url),S(D,`download`,r.upload.filename),S(D,`aria-label`,`Download ${r.upload.filename}`)}),_(`play`,c,F),_(`loadedmetadata`,c,ae),h(`click`,D,e=>e.stopPropagation()),s(e,i)},ue=e=>{var n=Pa(),i=x(n),a=T(x(i),2),c=x(a),l=O(c,!0),u=T(c,2),d=O(u,!0);t(a),t(i);var f=T(i,2),p=x(f),m=O(p,!0);t(f),t(n),k(e=>{o(l,r.upload.filename),o(d,e),S(f,`src`,r.url),S(p,`href`,r.url),o(m,r.upload.filename)},[()=>Xe(r.upload.byte_size)]),s(e,n)},L=e=>{var n=Fa(),i=x(n),a=x(i),l=O(a,!0);t(i);var u=T(i,2),d=x(u),f=O(d,!0),p=T(d,2),m=O(p,!0);t(u);var g=T(u,2);t(n),k(e=>{S(i,`data-artifact-upload-id`,r.upload.id),S(i,`aria-label`,`Open ${r.upload.filename}`),o(l,v(ie)),S(d,`data-artifact-upload-id`,r.upload.id),o(f,r.upload.filename),o(m,e),S(g,`href`,r.url),S(g,`download`,r.upload.filename),S(g,`aria-label`,`Download ${r.upload.filename}`)},[()=>Xe(r.upload.byte_size)]),h(`click`,i,()=>c()(r.upload)),h(`click`,d,()=>c()(r.upload)),s(e,n)},R=e=>{var n=Ia(),i=T(x(n),2),a=x(i),c=O(a,!0),l=T(a,2),u=O(l,!0);t(i),t(n),k(e=>{S(n,`href`,r.url),S(n,`download`,r.upload.filename),S(n,`aria-label`,`Download ${r.upload.filename}`),o(c,r.upload.filename),o(u,e)},[()=>Xe(r.upload.byte_size)]),s(e,n)};l(se,e=>{v(D)?e(ce):v(ee)?e(le,1):v(ne)?e(ue,2):v(re)?e(L,3):e(R,-1)}),s(e,I),m()}a([`click`]);var Ra=N(``),za=N(`
                `);function Ba(n,a){i(a,!0);let c=M(void 0);ne(async()=>{await e(),v(c)?.focus(),v(c)?.setSelectionRange(v(c).value.length,v(c).value.length)});function u(e){if(!(e.isComposing||e.keyCode===229)){if(e.key===`Escape`){e.preventDefault(),e.stopPropagation(),a.onCancel();return}e.target===v(c)&&e.key===`Enter`&&(e.metaKey||e.ctrlKey)&&(e.preventDefault(),a.onSave())}}var d=za(),f=x(d);r(f),A(f,e=>j(c,e),()=>v(c));var p=T(f,2),_=x(p),y=x(_),b=e=>{var t=g(`Saving…`);s(e,t)},C=e=>{var t=g(`Save`);s(e,t)};l(y,e=>{a.saving?e(b):e(C,-1)}),t(_);var w=T(_,2);t(p);var E=T(p,2),D=e=>{var t=Ra(),n=O(t,!0);k(()=>o(n,a.errorMessage)),s(e,t)};l(E,e=>{a.errorMessage&&e(D)}),t(d),k(e=>{S(d,`aria-busy`,a.saving),re(f,a.body),f.disabled=a.saving,S(f,`aria-invalid`,a.errorMessage?`true`:void 0),S(f,`aria-describedby`,a.errorMessage?`message-edit-error`:void 0),_.disabled=e,w.disabled=a.saving},[()=>a.saving||!Oe(a.body)]),h(`keydown`,d,u),h(`input`,f,e=>a.onBody(e.currentTarget.value)),h(`click`,_,function(...e){a.onSave?.apply(this,e)}),h(`click`,w,function(...e){a.onCancel?.apply(this,e)}),s(n,d),m()}a([`keydown`,`input`,`click`]);var Va=N(` `),Ha=N(` `),Ua=N(``);function Wa(e,r){i(r,!0);var a=u(),c=te(a),d=e=>{var i=Ua();let a;var c=T(x(i),2),u=x(c),d=O(u,!0),f=T(u,2),p=e=>{var t=Va(),n=O(t,!0);k(e=>o(n,e),[()=>ge(r.message.quoted_body_snapshot)]),s(e,t)},m=e=>{var t=Ha(),n=O(t);k(e=>o(n,`[original deleted] ${e??``}`),[()=>ge(r.message.quoted_body_snapshot)]),s(e,t)};l(f,e=>{r.message.quoted_message_id?e(p):e(m,-1)}),t(c),t(i),k((e,t)=>{a=n(i,1,`quote-block`,null,a,{dangling:!r.message.quoted_message_id}),i.disabled=!r.message.quoted_message_id,S(i,`aria-label`,e),o(d,t)},[()=>r.message.quoted_message_id?`Jump to quoted message from ${_e(r.message)}`:`Original message was deleted`,()=>_e(r.message)]),h(`click`,i,()=>r.onJump(r.message)),s(e,i)};l(c,e=>{(r.message.quoted_message_id||r.message.quoted_body_snapshot)&&e(d)}),s(e,a),m()}a([`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,Jn as _,Oa as a,Ln as b,ca as c,Ji as d,Gi as f,Yn as g,Vi as h,ka as i,we as j,Te as k,ia as l,Bi as m,Ba as n,Ea as o,Ui as p,La as r,ma as s,Wa as t,na as u,Xn as v,ze as w,ft as x,qn as y}; \ No newline at end of file diff --git a/apps/api/internal/webassets/dist/_app/immutable/entry/app.B8HOrAvW.js b/apps/api/internal/webassets/dist/_app/immutable/entry/app.D_F4hZka.js similarity index 78% rename from apps/api/internal/webassets/dist/_app/immutable/entry/app.B8HOrAvW.js rename to apps/api/internal/webassets/dist/_app/immutable/entry/app.D_F4hZka.js index 50c5840f5..dde531828 100644 --- a/apps/api/internal/webassets/dist/_app/immutable/entry/app.B8HOrAvW.js +++ b/apps/api/internal/webassets/dist/_app/immutable/entry/app.D_F4hZka.js @@ -1,2 +1,2 @@ -const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["../nodes/0.ByQannvM.js","../chunks/DK3Fl9T5.js","../chunks/BTIB_WQZ.js","../chunks/CRok6MwI.js","../chunks/Dt-HX3Vu.js","../chunks/xihTtKlq.js","../chunks/DFzK05fS.js","../chunks/DLuhiCle.js","../chunks/Dqjw8vaP.js","../chunks/DEPNME54.js","../assets/0.BbpWhj-s.css","../nodes/1.Cb0U0XYQ.js","../chunks/DlMq4Pta.js","../nodes/2.B_8pZXrq.js","../chunks/B4px22Nd.js","../chunks/DBpO2iwN.js","../nodes/3.DL068NCn.js","../chunks/BaNbYf_w.js","../chunks/j4GI4VLW.js","../nodes/4.CIr3xalv.js","../chunks/CmseFvlq.js","../chunks/T0GVabNa.js","../chunks/ByQ3bZN5.js","../assets/QuoteBlock.Bmfc9wvU.css","../chunks/C16fMXIp.js","../chunks/DlGnnCJo.js","../chunks/CmtSSHF9.js","../chunks/DfsrRaIf.js","../assets/ThreadPanel.DFXp9CyT.css","../chunks/CVdgRPye.js","../chunks/BIhzYFGW.js","../assets/ChatApp.BrxGlI__.css","../nodes/5.CNg4Lt1d.js","../nodes/6.wekSS-ZX.js","../nodes/7.99dtKcEw.js","../chunks/CcwoL1Kr.js","../nodes/8.BO6p1T8e.js","../nodes/9.B_43Zg12.js","../nodes/10.ZprqyIMx.js","../nodes/11.JW5N0h7U.js","../nodes/12.CJ0rSSBz.js","../assets/12.CzRaoRZI.css","../nodes/13.BEYBWebA.js","../assets/13.CMVv15Ug.css"])))=>i.map(i=>d[i]); -import{$ as e,At as t,Et as n,I as r,L as i,O as a,P as o,R as s,St as c,Tt as l,V as u,Y as d,a as f,ct as p,ft as m,ht as h,i as g,lt as _,pt as v,r as y,st as b,u as x,vt as S,yt as C,z as w}from"../chunks/BTIB_WQZ.js";import{t as T}from"../chunks/BaNbYf_w.js";import"../chunks/xihTtKlq.js";var E={},D=w(`
                `),O=w(` `,1);function k(g,w){n(w,!0);let T=f(w,`components`,23,()=>[]),E=f(w,`data_0`,3,null),k=f(w,`data_1`,3,null),A=f(w,`data_2`,3,null);_(()=>w.stores.page.set(w.page)),p(()=>{w.stores,w.page,w.constructors,T(),w.form,E(),k(),A(),w.stores.page.notify()});let j=C(!1),M=C(!1),N=C(null);y(()=>{let t=w.stores.page.subscribe(()=>{d(j)&&(S(M,!0),e().then(()=>{S(N,document.title||`untitled page`,!0)}))});return S(j,!0),t});let P=c(()=>w.constructors[2]);var F=O(),I=v(F),L=e=>{let t=c(()=>w.constructors[0]);var n=s(),r=v(n);a(r,()=>d(t),(e,t)=>{x(t(e,{get data(){return E()},get form(){return w.form},get params(){return w.page.params},children:(e,t)=>{var n=s(),r=v(n),l=e=>{let t=c(()=>w.constructors[1]);var n=s(),r=v(n);a(r,()=>d(t),(e,t)=>{x(t(e,{get data(){return k()},get form(){return w.form},get params(){return w.page.params},children:(e,t)=>{var n=s(),r=v(n);a(r,()=>d(P),(e,t)=>{x(t(e,{get data(){return A()},get form(){return w.form},get params(){return w.page.params}}),e=>T()[2]=e,()=>T()?.[2])}),i(e,n)},$$slots:{default:!0}}),e=>T()[1]=e,()=>T()?.[1])}),i(e,n)},u=e=>{let t=c(()=>w.constructors[1]);var n=s(),r=v(n);a(r,()=>d(t),(e,t)=>{x(t(e,{get data(){return k()},get form(){return w.form},get params(){return w.page.params}}),e=>T()[1]=e,()=>T()?.[1])}),i(e,n)};o(r,e=>{w.constructors[2]?e(l):e(u,-1)}),i(e,n)},$$slots:{default:!0}}),e=>T()[0]=e,()=>T()?.[0])}),i(e,n)},R=e=>{let t=c(()=>w.constructors[0]);var n=s(),r=v(n);a(r,()=>d(t),(e,t)=>{x(t(e,{get data(){return E()},get form(){return w.form},get params(){return w.page.params}}),e=>T()[0]=e,()=>T()?.[0])}),i(e,n)};o(I,e=>{w.constructors[1]?e(L):e(R,-1)});var z=h(I,2),B=e=>{var n=D(),a=m(n),s=e=>{var t=u();b(()=>r(t,d(N))),i(e,t)};o(a,e=>{d(M)&&e(s)}),t(n),i(e,n)};o(z,e=>{d(j)&&e(B)}),i(g,F),l()}var A=g(k),j=[()=>T(()=>import(`../nodes/0.ByQannvM.js`),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10]),import.meta.url),()=>T(()=>import(`../nodes/1.Cb0U0XYQ.js`),__vite__mapDeps([11,2,1,5,12,3,4]),import.meta.url),()=>T(()=>import(`../nodes/2.B_8pZXrq.js`),__vite__mapDeps([13,1,2,3,4,5,6,9,12,14,15]),import.meta.url),()=>T(()=>import(`../nodes/3.DL068NCn.js`),__vite__mapDeps([16,1,2,17,5,18]),import.meta.url),()=>T(()=>import(`../nodes/4.CIr3xalv.js`),__vite__mapDeps([19,2,1,5,18,20,3,4,17,6,9,8,14,15,21,22,23,24,7,25,26,27,28,29,30,31]),import.meta.url),()=>T(()=>import(`../nodes/5.CNg4Lt1d.js`),__vite__mapDeps([32,2,1,5,20,3,4,17,6,9,8,14,15,18,21,22,23,24,7,25,26,27,28,29,30,31]),import.meta.url),()=>T(()=>import(`../nodes/6.wekSS-ZX.js`),__vite__mapDeps([33,1,4,14]),import.meta.url),()=>T(()=>import(`../nodes/7.99dtKcEw.js`),__vite__mapDeps([34,1,2,5,9,8,15,29,35]),import.meta.url),()=>T(()=>import(`../nodes/8.BO6p1T8e.js`),__vite__mapDeps([36,1,2,5,9,8,15,25,26,29,30,35]),import.meta.url),()=>T(()=>import(`../nodes/9.B_43Zg12.js`),__vite__mapDeps([37,1,2,5,22,9,26,30]),import.meta.url),()=>T(()=>import(`../nodes/10.ZprqyIMx.js`),__vite__mapDeps([38,1,2,3,4,5,6,9,15,30]),import.meta.url),()=>T(()=>import(`../nodes/11.JW5N0h7U.js`),__vite__mapDeps([39,2,1,5,20,3,4,17,6,9,8,14,15,18,21,22,23,24,7,25,26,27,28,29,30,31]),import.meta.url),()=>T(()=>import(`../nodes/12.CJ0rSSBz.js`),__vite__mapDeps([40,1,2,5,9,8,21,22,23,24,7,25,26,30,41]),import.meta.url),()=>T(()=>import(`../nodes/13.BEYBWebA.js`),__vite__mapDeps([42,1,2,5,9,8,21,22,23,25,27,28,30,43]),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._IX1sTAN.js","../chunks/DK3Fl9T5.js","../chunks/BTIB_WQZ.js","../chunks/CRok6MwI.js","../chunks/Dt-HX3Vu.js","../chunks/xihTtKlq.js","../chunks/DFzK05fS.js","../chunks/DLuhiCle.js","../chunks/Dqjw8vaP.js","../chunks/DEPNME54.js","../assets/0.CIpxfnSk.css","../nodes/1.Cb0U0XYQ.js","../chunks/DlMq4Pta.js","../nodes/2.B_8pZXrq.js","../chunks/B4px22Nd.js","../chunks/DBpO2iwN.js","../nodes/3.D-QdFf9M.js","../chunks/BaNbYf_w.js","../chunks/j4GI4VLW.js","../nodes/4.DSmX87en.js","../chunks/DOeWsdLH.js","../chunks/CNPmRNxE.js","../chunks/ByQ3bZN5.js","../assets/QuestionCard.Bmfc9wvU.css","../chunks/DjeObDL_.js","../chunks/DlGnnCJo.js","../chunks/CmtSSHF9.js","../chunks/BVKCCx27.js","../assets/ThreadPanel.DFXp9CyT.css","../chunks/CVdgRPye.js","../chunks/BIhzYFGW.js","../assets/ChatApp.BrxGlI__.css","../nodes/5.CTSqTTfh.js","../nodes/6.wekSS-ZX.js","../nodes/7.99dtKcEw.js","../chunks/CcwoL1Kr.js","../nodes/8.BO6p1T8e.js","../nodes/9.B_43Zg12.js","../nodes/10.ZprqyIMx.js","../nodes/11.msomaBUM.js","../nodes/12.CkBWy2pR.js","../assets/12.CzRaoRZI.css","../nodes/13.D7HzJONo.js","../assets/13.CMVv15Ug.css"])))=>i.map(i=>d[i]); +import{$ as e,At as t,Et as n,I as r,L as i,O as a,P as o,R as s,St as c,Tt as l,V as u,Y as d,a as f,ct as p,ft as m,ht as h,i as g,lt as _,pt as v,r as y,st as b,u as x,vt as S,yt as C,z as w}from"../chunks/BTIB_WQZ.js";import{t as T}from"../chunks/BaNbYf_w.js";import"../chunks/xihTtKlq.js";var E={},D=w(`
                `),O=w(` `,1);function k(g,w){n(w,!0);let T=f(w,`components`,23,()=>[]),E=f(w,`data_0`,3,null),k=f(w,`data_1`,3,null),A=f(w,`data_2`,3,null);_(()=>w.stores.page.set(w.page)),p(()=>{w.stores,w.page,w.constructors,T(),w.form,E(),k(),A(),w.stores.page.notify()});let j=C(!1),M=C(!1),N=C(null);y(()=>{let t=w.stores.page.subscribe(()=>{d(j)&&(S(M,!0),e().then(()=>{S(N,document.title||`untitled page`,!0)}))});return S(j,!0),t});let P=c(()=>w.constructors[2]);var F=O(),I=v(F),L=e=>{let t=c(()=>w.constructors[0]);var n=s(),r=v(n);a(r,()=>d(t),(e,t)=>{x(t(e,{get data(){return E()},get form(){return w.form},get params(){return w.page.params},children:(e,t)=>{var n=s(),r=v(n),l=e=>{let t=c(()=>w.constructors[1]);var n=s(),r=v(n);a(r,()=>d(t),(e,t)=>{x(t(e,{get data(){return k()},get form(){return w.form},get params(){return w.page.params},children:(e,t)=>{var n=s(),r=v(n);a(r,()=>d(P),(e,t)=>{x(t(e,{get data(){return A()},get form(){return w.form},get params(){return w.page.params}}),e=>T()[2]=e,()=>T()?.[2])}),i(e,n)},$$slots:{default:!0}}),e=>T()[1]=e,()=>T()?.[1])}),i(e,n)},u=e=>{let t=c(()=>w.constructors[1]);var n=s(),r=v(n);a(r,()=>d(t),(e,t)=>{x(t(e,{get data(){return k()},get form(){return w.form},get params(){return w.page.params}}),e=>T()[1]=e,()=>T()?.[1])}),i(e,n)};o(r,e=>{w.constructors[2]?e(l):e(u,-1)}),i(e,n)},$$slots:{default:!0}}),e=>T()[0]=e,()=>T()?.[0])}),i(e,n)},R=e=>{let t=c(()=>w.constructors[0]);var n=s(),r=v(n);a(r,()=>d(t),(e,t)=>{x(t(e,{get data(){return E()},get form(){return w.form},get params(){return w.page.params}}),e=>T()[0]=e,()=>T()?.[0])}),i(e,n)};o(I,e=>{w.constructors[1]?e(L):e(R,-1)});var z=h(I,2),B=e=>{var n=D(),a=m(n),s=e=>{var t=u();b(()=>r(t,d(N))),i(e,t)};o(a,e=>{d(M)&&e(s)}),t(n),i(e,n)};o(z,e=>{d(j)&&e(B)}),i(g,F),l()}var A=g(k),j=[()=>T(()=>import(`../nodes/0._IX1sTAN.js`),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10]),import.meta.url),()=>T(()=>import(`../nodes/1.Cb0U0XYQ.js`),__vite__mapDeps([11,2,1,5,12,3,4]),import.meta.url),()=>T(()=>import(`../nodes/2.B_8pZXrq.js`),__vite__mapDeps([13,1,2,3,4,5,6,9,12,14,15]),import.meta.url),()=>T(()=>import(`../nodes/3.D-QdFf9M.js`),__vite__mapDeps([16,1,2,17,5,18]),import.meta.url),()=>T(()=>import(`../nodes/4.DSmX87en.js`),__vite__mapDeps([19,2,1,5,18,20,3,4,17,6,9,8,14,15,21,22,23,24,7,25,26,27,28,29,30,31]),import.meta.url),()=>T(()=>import(`../nodes/5.CTSqTTfh.js`),__vite__mapDeps([32,2,1,5,20,3,4,17,6,9,8,14,15,18,21,22,23,24,7,25,26,27,28,29,30,31]),import.meta.url),()=>T(()=>import(`../nodes/6.wekSS-ZX.js`),__vite__mapDeps([33,1,4,14]),import.meta.url),()=>T(()=>import(`../nodes/7.99dtKcEw.js`),__vite__mapDeps([34,1,2,5,9,8,15,29,35]),import.meta.url),()=>T(()=>import(`../nodes/8.BO6p1T8e.js`),__vite__mapDeps([36,1,2,5,9,8,15,25,26,29,30,35]),import.meta.url),()=>T(()=>import(`../nodes/9.B_43Zg12.js`),__vite__mapDeps([37,1,2,5,22,9,26,30]),import.meta.url),()=>T(()=>import(`../nodes/10.ZprqyIMx.js`),__vite__mapDeps([38,1,2,3,4,5,6,9,15,30]),import.meta.url),()=>T(()=>import(`../nodes/11.msomaBUM.js`),__vite__mapDeps([39,2,1,5,20,3,4,17,6,9,8,14,15,18,21,22,23,24,7,25,26,27,28,29,30,31]),import.meta.url),()=>T(()=>import(`../nodes/12.CkBWy2pR.js`),__vite__mapDeps([40,1,2,5,9,8,21,22,23,24,7,25,26,30,41]),import.meta.url),()=>T(()=>import(`../nodes/13.D7HzJONo.js`),__vite__mapDeps([42,1,2,5,9,8,21,22,23,25,27,28,30,43]),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.ByQannvM.js b/apps/api/internal/webassets/dist/_app/immutable/nodes/0._IX1sTAN.js similarity index 100% rename from apps/api/internal/webassets/dist/_app/immutable/nodes/0.ByQannvM.js rename to apps/api/internal/webassets/dist/_app/immutable/nodes/0._IX1sTAN.js diff --git a/apps/api/internal/webassets/dist/_app/immutable/nodes/11.JW5N0h7U.js b/apps/api/internal/webassets/dist/_app/immutable/nodes/11.msomaBUM.js similarity index 77% rename from apps/api/internal/webassets/dist/_app/immutable/nodes/11.JW5N0h7U.js rename to apps/api/internal/webassets/dist/_app/immutable/nodes/11.msomaBUM.js index b031eef82..52ab48916 100644 --- a/apps/api/internal/webassets/dist/_app/immutable/nodes/11.JW5N0h7U.js +++ b/apps/api/internal/webassets/dist/_app/immutable/nodes/11.msomaBUM.js @@ -1 +1 @@ -import{Et as e,Tt as t}from"../chunks/BTIB_WQZ.js";import"../chunks/xihTtKlq.js";import{t as n}from"../chunks/CmseFvlq.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/BTIB_WQZ.js";import"../chunks/xihTtKlq.js";import{t as n}from"../chunks/DOeWsdLH.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.CJ0rSSBz.js b/apps/api/internal/webassets/dist/_app/immutable/nodes/12.CkBWy2pR.js similarity index 94% rename from apps/api/internal/webassets/dist/_app/immutable/nodes/12.CJ0rSSBz.js rename to apps/api/internal/webassets/dist/_app/immutable/nodes/12.CkBWy2pR.js index 4b6cb7948..e63400060 100644 --- a/apps/api/internal/webassets/dist/_app/immutable/nodes/12.CJ0rSSBz.js +++ b/apps/api/internal/webassets/dist/_app/immutable/nodes/12.CkBWy2pR.js @@ -1 +1 @@ -import{t as e}from"../chunks/DK3Fl9T5.js";import{$ as t,At as n,E as r,Et as i,H as a,I as o,L as s,N as c,P as l,R as u,St as ee,T as te,Tt as d,U as ne,W as f,Y as p,ft as m,gt as re,ht as h,kt as ie,mt as g,n as ae,pt as oe,r as se,st as _,tt as ce,ut as le,vt as v,yt as y,z as b}from"../chunks/BTIB_WQZ.js";import"../chunks/xihTtKlq.js";import{i as ue,n as x,t as S,u as C}from"../chunks/DEPNME54.js";import{d as de}from"../chunks/Dqjw8vaP.js";import{D as fe,E as pe,R as me,T as he,f as ge,j as _e,p as ve,w as ye,x as be}from"../chunks/T0GVabNa.js";import{i as xe,n as Se,t as Ce}from"../chunks/C16fMXIp.js";import{t as we}from"../chunks/DlGnnCJo.js";import{r as Te,t as Ee}from"../chunks/BIhzYFGW.js";var w=e({prerender:()=>!1,ssr:()=>!1}),De=b(``),Oe=b(`Archived`),ke=b(`

                `),Ae=b(`

                `),je=b(`

                Sign in to ClickClack

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

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

                `),Ae=b(`

                `),je=b(`

                Sign in to ClickClack

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

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

                `),Se=x(`
                `),Ce=x(`

                Sign in to ClickClack

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

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

                `),Se=x(`
                `),Ce=x(`

                Sign in to ClickClack

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

                Open ClickClack
                `),we=x(`
                `),Te=x(`
                `),Ee=x(`
                `),De=x(`
                `),Oe=x(` `,1);function O(e,a){i(a,!0);let c=b(`loading`),u=b(``),x=b(null),E=new de(()=>p(x)?.id||``),O=new ue(Me),k=b(null),A=new _e(()=>`${a.workspaceRouteID}:${a.messageRouteID}`,Ie),j=d(()=>A.root),M=d(()=>A.replies),N=d(()=>A.state),P=b(null),F=b(`Thread`),ke=d(()=>A.draft?.body??``),I=d(()=>A.draft?.quote??null),L=b(null),R=d(()=>A.draft?.error||A.error||p(z)),z=b(``),B=d(()=>A.draft?.sending??!1),V=b(null),H=null,U=0,W=!1,G=b(te([])),K=0,q=null,J=b(``),Y=d(()=>p(B)||!(!p(P)||p(P).can_send)),Ae=d(()=>{let e=new Map;for(let t of p(G))t.id&&!t.deleted_at&&e.set(t.id,t);for(let t of p(P)?.members??[])t.id&&t.handle?.trim()&&!t.deleted_at&&e.set(t.id,t);for(let t of p(j)?[p(j),...p(M)]:p(M))t.author?.id&&t.author.handle?.trim()&&!t.author.deleted_at&&e.set(t.author.id,t.author);return p(x)?.id&&e.set(p(x).id,p(x)),[...e.values()]});async function je(e){let t=++K;q?.abort();let n=new AbortController;q=n,y(J,``),y(G,[],!0);try{let r=await be({workspaceID:e,limit:100,signal:n.signal});t===K&&y(G,r.map(e=>e.user),!0)}catch(e){!n.signal.aborted&&t===K&&(y(G,[],!0),y(J,ye(e),!0))}}async function Me(e,n){let r=A.selection,i=()=>e===p(k)?.target_id&&A.isCurrent(r)&&O.session(e)?.generation===n.generation;if(i()&&await A.target({messageID:n.messageID,threadSeq:n.threadSeq},i))for(let e=0;e<4;e+=1){if(await t(),!i())return;let e=document.querySelector(`[aria-label="Embedded thread"]`)?.querySelector(`[data-message-id="${CSS.escape(n.messageID)}"]`)?.querySelector(`textarea[aria-label="Edit message"]`);if(e){e.focus({preventScroll:!0});return}}}function Ne(e){A.updateMessage(e)}function Pe(){K+=1,q?.abort(),H?.close(),H=null,y(k,null),A.close(),E.clear(),O.clear(),y(P,null),y(V,null)}function X(e){if(Pe(),e instanceof T){y(c,`forbidden`);return}if(e instanceof C){if(e.status===401){y(c,`auth`);return}if(e.status===403){y(c,`forbidden`);return}if(e.status===404){y(c,`not-found`);return}}y(u,w(e,`Could not load this thread.`),!0),y(c,`error`)}async function Fe(e,t){if(e.parent_type===`direct`){let n=(await S(`/api/dms?workspace_id=${encodeURIComponent(e.workspace_id)}`)).conversations.find(t=>t.id===e.parent_id);n||=(await S(`/api/dms/${encodeURIComponent(e.parent_id)}`)).conversation,y(P,n,!0),y(F,he(n,t.id)||`Direct message`,!0);return}let n=(await S(`/api/workspaces/${encodeURIComponent(e.workspace_id)}/channels`)).channels.find(t=>t.id===e.parent_id);if(!n)throw new C(404,`Thread channel not found`);y(P,null),y(F,`#${ge(n)}`)}async function Z(){if(W)return;W=!0;let e=++U;p(c)!==`auth`&&y(c,`loading`),y(u,``);try{let t=await ce(),n=await S(`/api/routes/${encodeURIComponent(a.workspaceRouteID)}/${encodeURIComponent(a.messageRouteID)}`);if(n.route.target_type!==`thread`)throw new C(404,`Thread route not found`);if(e!==U)return;A.select(n.route.target_id);let[r]=await Promise.all([A.open(()=>e===U),Fe(n.route,t.user)]);if(!r||e!==U||!A.root)return;y(x,t.user,!0),y(k,n.route,!0),je(n.route.workspace_id),y(c,`ready`),Be(n.route.workspace_id)}catch(t){e===U&&X(t)}finally{e===U&&(W=!1)}}function Ie(e=[]){p(j)&&(E.seedMessages(e),O.reconcile(p(k)?.target_id||p(j).id,[p(j),...p(M)]))}function Le(e){if(!p(j))return!1;if(e.payload.root_message_id)return e.payload.root_message_id===p(j).id;let t=e.payload.message_id;return t===p(j).id||p(M).some(e=>e.id===t)}async function Re(e,t){if(Le(e)&&(e.type===`reaction.added`||e.type===`reaction.removed`)){E.applyEvent(e);return}await A.handleEvent(e,t)}function ze(e){if(p(c)===`ready`){if(e instanceof T||e instanceof C&&[401,403,404].includes(e.status)){X(e);return}y(z,w(e,`Could not process a realtime update.`),!0)}}function Be(e){H?.close(),H=le({workspaceID:e,onEvent:Re,onOpen:async(e,t)=>{t&&(E.clear(),await A.refresh(e)),e()&&y(z,``)},onError:ze})}async function Q(){p(Y)||await A.send(e=>{e instanceof C&&e.status===401&&X(e)})}function Ve(e){if(e.key===`Escape`&&p(I)){e.preventDefault(),A.setQuote(null);return}e.key===`Enter`&&!e.shiftKey&&(e.preventDefault(),Q())}function He(e){p(B)||(A.setQuote(e),t().then(()=>p(L)?.focus()))}function Ue(){p(B)||A.setQuote(null)}function We(e){e.quoted_message_id&&A.target({messageID:e.quoted_message_id})}function Ge(e){let t=e.target;t instanceof HTMLImageElement&&t.closest(`.markdown`)&&(e.preventDefault(),y(V,{url:me(t),title:t.alt||`Image`},!0))}function Ke(e){let t=window.open(se(`/api/uploads/${e.id}`),`_blank`,`noopener,noreferrer`);t&&(t.opener=null)}function $(){p(c)===`auth`&&document.visibilityState===`visible`&&Z()}ae(()=>{Z(),window.addEventListener(`focus`,$),document.addEventListener(`visibilitychange`,$)}),re(()=>{U+=1,K+=1,q?.abort(),H?.close(),window.removeEventListener(`focus`,$),document.removeEventListener(`visibilitychange`,$)});var qe=Oe();r(`b3w79y`,e=>{var t=xe();ie(()=>{oe.title=`ClickClack thread`}),s(e,t)});var Je=_(qe),Ye=e=>{var t=Se(),r=m(t),i=m(r);{let e=d(()=>`Thread · ${p(N)?.reply_count??p(M).length} ${(p(N)?.reply_count??p(M).length)===1?`reply`:`replies`}`),t=d(()=>p(x)?.id),n=d(()=>!(!p(P)||p(P).can_send));ve(i,{get history(){return A},get root(){return p(j)},get replies(){return p(M)},get threadState(){return p(N)},get replyBody(){return p(ke)},get replyTarget(){return p(I)},get mentionPeople(){return p(Ae)},get replyDisabled(){return p(Y)},get headerLabel(){return p(F)},get headerDetail(){return p(e)},get openHref(){return p(k).canonical_path},get currentUserID(){return p(t)},get reactionController(){return E},get editController(){return O},get editScope(){return p(k).target_id},onMessageEdited:Ne,get reactionsDisabled(){return p(n)},onReplyBody:e=>A.updateDraft(e),onSubmitReply:()=>void Q(),onReplyKeydown:Ve,onReplyFocus:()=>{},onReplyInputRef:e=>y(L,e,!0),onSetReplyTarget:e=>He(e),onClearReply:Ue,onActivateThreadComposer:()=>{},onInlineImagePointerUp:Ge,onJumpToQuote:We,onOpenImage:(e,t)=>y(V,{url:e,title:t},!0),onOpenArtifact:Ke})}n(r);var a=h(r,2),c=e=>{var t=D(),n=g(t);v(()=>o(n,`Mentions unavailable: ${p(J)??``}`)),s(e,t)};l(a,e=>{p(J)&&e(c)});var u=h(a,2),f=e=>{var t=D(),n=g(t,!0);v(()=>o(n,p(R))),s(e,t)};l(u,e=>{p(R)&&e(f)}),n(t),s(e,t)},Xe=e=>{var t=Ce(),r=m(t),i=m(r);pe(i,{class:`embed-mark`,size:42}),ne(6),n(r),n(t),s(e,t)},Ze=e=>{var t=we();s(e,t)},Qe=e=>{var t=Te();s(e,t)},$e=e=>{var t=Ee(),r=m(t),i=h(m(r),2),a=g(i,!0),c=h(i,2);n(r),n(t),v(()=>o(a,p(u))),ee(`click`,c,()=>void Z()),s(e,t)},et=e=>{var t=De();s(e,t)};l(Je,e=>{p(c)===`ready`&&p(j)&&p(k)?e(Ye):p(c)===`auth`?e(Xe,1):p(c)===`forbidden`?e(Ze,2):p(c)===`not-found`?e(Qe,3):p(c)===`error`?e($e,4):e(et,-1)});var tt=h(Je,2),nt=e=>{fe(e,{get url(){return p(V).url},get title(){return p(V).title},onClose:()=>y(V,null)})};l(tt,e=>{p(V)&&e(nt)}),s(e,qe),f()}a([`click`]);function k(e,t){i(t,!0);var n=u(),r=_(n);c(r,()=>`${t.params.workspaceID}:${t.params.messageID}`,e=>{O(e,{get workspaceRouteID(){return t.params.workspaceID},get messageRouteID(){return t.params.messageID}})}),s(e,n),f()}export{k as component,E as universal}; \ No newline at end of file diff --git a/apps/api/internal/webassets/dist/_app/immutable/nodes/3.DL068NCn.js b/apps/api/internal/webassets/dist/_app/immutable/nodes/3.D-QdFf9M.js similarity index 59% rename from apps/api/internal/webassets/dist/_app/immutable/nodes/3.DL068NCn.js rename to apps/api/internal/webassets/dist/_app/immutable/nodes/3.D-QdFf9M.js index 39ac35821..040195172 100644 --- a/apps/api/internal/webassets/dist/_app/immutable/nodes/3.DL068NCn.js +++ b/apps/api/internal/webassets/dist/_app/immutable/nodes/3.D-QdFf9M.js @@ -1,2 +1,2 @@ -const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["../chunks/CmseFvlq.js","../chunks/DK3Fl9T5.js","../chunks/BTIB_WQZ.js","../chunks/CRok6MwI.js","../chunks/Dt-HX3Vu.js","../chunks/BaNbYf_w.js","../chunks/xihTtKlq.js","../chunks/DFzK05fS.js","../chunks/DEPNME54.js","../chunks/Dqjw8vaP.js","../chunks/B4px22Nd.js","../chunks/DBpO2iwN.js","../chunks/j4GI4VLW.js","../chunks/T0GVabNa.js","../chunks/ByQ3bZN5.js","../assets/QuoteBlock.Bmfc9wvU.css","../chunks/C16fMXIp.js","../chunks/DLuhiCle.js","../chunks/DlGnnCJo.js","../chunks/CmtSSHF9.js","../chunks/DfsrRaIf.js","../assets/ThreadPanel.DFXp9CyT.css","../chunks/CVdgRPye.js","../chunks/BIhzYFGW.js","../assets/ChatApp.BrxGlI__.css","../chunks/BRaTlnvd.js","../assets/ProductSite.BGg6Zt1K.css"])))=>i.map(i=>d[i]); -import{t as e}from"../chunks/DK3Fl9T5.js";import{F as t,L as n,R as r,Y as i,pt as a,xt as o}from"../chunks/BTIB_WQZ.js";import{t as s}from"../chunks/BaNbYf_w.js";import"../chunks/xihTtKlq.js";import"../chunks/j4GI4VLW.js";var c=e({prerender:()=>!0});function l(e){let c=window.location.hostname.startsWith(`app.`)?s(()=>import(`../chunks/CmseFvlq.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,24]),import.meta.url):s(()=>import(`../chunks/BRaTlnvd.js`),__vite__mapDeps([25,2,1,6,12,26]),import.meta.url);var l=r(),u=a(l);t(u,()=>c,null,(e,t)=>{let n=o(()=>i(t).default);i(n)(e,{})}),n(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/DOeWsdLH.js","../chunks/DK3Fl9T5.js","../chunks/BTIB_WQZ.js","../chunks/CRok6MwI.js","../chunks/Dt-HX3Vu.js","../chunks/BaNbYf_w.js","../chunks/xihTtKlq.js","../chunks/DFzK05fS.js","../chunks/DEPNME54.js","../chunks/Dqjw8vaP.js","../chunks/B4px22Nd.js","../chunks/DBpO2iwN.js","../chunks/j4GI4VLW.js","../chunks/CNPmRNxE.js","../chunks/ByQ3bZN5.js","../assets/QuestionCard.Bmfc9wvU.css","../chunks/DjeObDL_.js","../chunks/DLuhiCle.js","../chunks/DlGnnCJo.js","../chunks/CmtSSHF9.js","../chunks/BVKCCx27.js","../assets/ThreadPanel.DFXp9CyT.css","../chunks/CVdgRPye.js","../chunks/BIhzYFGW.js","../assets/ChatApp.BrxGlI__.css","../chunks/BRaTlnvd.js","../assets/ProductSite.BGg6Zt1K.css"])))=>i.map(i=>d[i]); +import{t as e}from"../chunks/DK3Fl9T5.js";import{F as t,L as n,R as r,Y as i,pt as a,xt as o}from"../chunks/BTIB_WQZ.js";import{t as s}from"../chunks/BaNbYf_w.js";import"../chunks/xihTtKlq.js";import"../chunks/j4GI4VLW.js";var c=e({prerender:()=>!0});function l(e){let c=window.location.hostname.startsWith(`app.`)?s(()=>import(`../chunks/DOeWsdLH.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,24]),import.meta.url):s(()=>import(`../chunks/BRaTlnvd.js`),__vite__mapDeps([25,2,1,6,12,26]),import.meta.url);var l=r(),u=a(l);t(u,()=>c,null,(e,t)=>{let n=o(()=>i(t).default);i(n)(e,{})}),n(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.CIr3xalv.js b/apps/api/internal/webassets/dist/_app/immutable/nodes/4.DSmX87en.js similarity index 63% rename from apps/api/internal/webassets/dist/_app/immutable/nodes/4.CIr3xalv.js rename to apps/api/internal/webassets/dist/_app/immutable/nodes/4.DSmX87en.js index 42cdff062..42b506fcc 100644 --- a/apps/api/internal/webassets/dist/_app/immutable/nodes/4.CIr3xalv.js +++ b/apps/api/internal/webassets/dist/_app/immutable/nodes/4.DSmX87en.js @@ -1 +1 @@ -import"../chunks/BTIB_WQZ.js";import"../chunks/xihTtKlq.js";import"../chunks/j4GI4VLW.js";import{t as e}from"../chunks/CmseFvlq.js";function t(t){e(t,{})}export{t as component}; \ No newline at end of file +import"../chunks/BTIB_WQZ.js";import"../chunks/xihTtKlq.js";import"../chunks/j4GI4VLW.js";import{t as e}from"../chunks/DOeWsdLH.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.CNg4Lt1d.js b/apps/api/internal/webassets/dist/_app/immutable/nodes/5.CTSqTTfh.js similarity index 72% rename from apps/api/internal/webassets/dist/_app/immutable/nodes/5.CNg4Lt1d.js rename to apps/api/internal/webassets/dist/_app/immutable/nodes/5.CTSqTTfh.js index e5f7e0a42..7b940de0c 100644 --- a/apps/api/internal/webassets/dist/_app/immutable/nodes/5.CNg4Lt1d.js +++ b/apps/api/internal/webassets/dist/_app/immutable/nodes/5.CTSqTTfh.js @@ -1 +1 @@ -import{Et as e,Tt as t}from"../chunks/BTIB_WQZ.js";import"../chunks/xihTtKlq.js";import{t as n}from"../chunks/CmseFvlq.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/BTIB_WQZ.js";import"../chunks/xihTtKlq.js";import{t as n}from"../chunks/DOeWsdLH.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 759e8da72..75dd5a48a 100644 --- a/apps/api/internal/webassets/dist/index.html +++ b/apps/api/internal/webassets/dist/index.html @@ -110,18 +110,18 @@ - + - + - + - + @@ -136,7 +136,7 @@ Promise.all([ import("./_app/immutable/entry/start.CJgF5gsQ.js"), - import("./_app/immutable/entry/app.B8HOrAvW.js") + import("./_app/immutable/entry/app.D_F4hZka.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 4d5e9f371..89de9d4f8 100644 --- a/apps/web/src/components/messages/MessageRow.svelte +++ b/apps/web/src/components/messages/MessageRow.svelte @@ -19,6 +19,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 = { @@ -676,11 +677,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 4f55b07fb..81688b752 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 3d9c7aedc..ccc45c16d 100644 --- a/apps/web/src/lib/types.ts +++ b/apps/web/src/lib/types.ts @@ -73,6 +73,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; @@ -147,6 +185,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 403c90ff2..ba32cf6ef 100644 --- a/apps/web/src/styles/messages.css +++ b/apps/web/src/styles/messages.css @@ -2823,3 +2823,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 1b148a433..f68b02f33 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 2101e4833..771e46967 100644 --- a/docs/features/messages.md +++ b/docs/features/messages.md @@ -131,6 +131,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..ad0ae004a --- /dev/null +++ b/docs/features/questions.md @@ -0,0 +1,201 @@ +--- +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`. The asking bot must still have message access and current write authority: +blocked or timed-out bots receive `403`, including when reopening a submitted +answer. No question state or durable event changes on rejection. +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 42c091046..2f9018f7b 100644 --- a/packages/protocol/openapi.yaml +++ b/packages/protocol/openapi.yaml @@ -929,6 +929,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 @@ -1528,6 +1566,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 @@ -3093,6 +3177,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] @@ -3104,6 +3190,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] @@ -3533,6 +3829,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 8b27fd480..a4749d078 100644 --- a/packages/sdk-ts/src/generated/openapi.d.ts +++ b/packages/sdk-ts/src/generated/openapi.d.ts @@ -627,6 +627,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; @@ -1012,6 +1032,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; @@ -1917,11 +1971,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; @@ -2163,6 +2334,7 @@ export interface components { thread_state?: components["schemas"]["ThreadState"]; nonce?: string; reactions?: components["schemas"]["ReactionSummary"][]; + question?: components["schemas"]["MessageQuestion"]; }; MessageResponse: { message: components["schemas"]["Message"]; @@ -3949,6 +4121,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; @@ -4865,6 +5071,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..2b34793f7 100644 --- a/packages/sdk-ts/src/index.ts +++ b/packages/sdk-ts/src/index.ts @@ -75,10 +75,20 @@ export type Topic = components["schemas"]["Topic"]; export type MessageKind = "message" | "agent_commentary" | "agent_tool"; +export type QuestionSpec = Omit & { + /** Omission lets the server default to allowing skip. */ + allow_skip?: boolean; +}; +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 +860,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 +873,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/packages/sdk-ts/src/questions.type-tests.d.ts b/packages/sdk-ts/src/questions.type-tests.d.ts new file mode 100644 index 000000000..cfbe770a6 --- /dev/null +++ b/packages/sdk-ts/src/questions.type-tests.d.ts @@ -0,0 +1,24 @@ +import type { ClickClackClient, MessageQuestion, QuestionSpec } from "./index"; + +type Assert = T; +type IsAssignable = Input extends Target ? true : false; +type QuestionWithoutSkip = { + expires_at: "2026-10-14T12:00:00Z"; + items: [{ id: "day"; header: "Day"; prompt: "Which day?" }]; +}; +type ChannelMessageInput = Parameters[1]; + +type _OmittedSkipAllowed = Assert>; +type _ExplicitFalseAllowed = Assert< + IsAssignable +>; +type _ChannelInputOmittedSkipAllowed = Assert< + IsAssignable<{ body: "Which day?"; question: QuestionWithoutSkip }, ChannelMessageInput> +>; +type _ChannelInputExplicitFalseAllowed = Assert< + IsAssignable< + { body: "Which day?"; question: QuestionWithoutSkip & { allow_skip: false } }, + ChannelMessageInput + > +>; +type _ResponseSkipRequired = Assert>; 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"); +});