Thanks to visit codestin.com
Credit goes to github.com

Skip to content

DNM: feat(coderd/database): add search parameter to GetChats - #27009

Closed
johnstcn wants to merge 5 commits into
cian/codagt-722-dbpurge-sweep-to-backfill-and-maintainfrom
cian/codagt-724-add-search-parameter-and-recency-ordering-to-getchats
Closed

DNM: feat(coderd/database): add search parameter to GetChats#27009
johnstcn wants to merge 5 commits into
cian/codagt-722-dbpurge-sweep-to-backfill-and-maintainfrom
cian/codagt-724-add-search-parameter-and-recency-ordering-to-getchats

Conversation

@johnstcn

@johnstcn johnstcn commented Jul 6, 2026

Copy link
Copy Markdown
Member

Adds a search parameter to GetChats. A chat matches when the search hits its title (FTS), its PR title (FTS), a message body (FTS over the backfilled chat_messages.search_tsv), or its exact PR number when the search is all digits. Empty search is a no-op and composes with the existing archived, repo, and pr_status filters. A ^[0-9]{1,18}$ guard keeps the PR-number cast from erroring or overflowing on oversized digit strings.

Stacked on #26995, which stacks on #26968; those add the schema migration and the BackfillChatMessagesSearchTsv query.

Refs https://linear.app/codercom/issue/CODAGT-724

EXPLAIN smoke check (20k seeded chats, messages, and diff statuses). The partial GIN indexes serve the message and PR-title arms:

SubPlan 2
  ->  Bitmap Heap Scan on chat_diff_statuses cds_1 (actual time=1.913..1.913 rows=0 loops=1)
        Recheck Cond: (to_tsvector('simple'::regconfig, pull_request_title) @@ '''kubernetes'''::tsquery)
        ->  Bitmap Index Scan on idx_chat_diff_statuses_pr_title_fts (actual time=1.911..1.911 rows=0 loops=1)
SubPlan 4
  ->  Bitmap Heap Scan on chat_messages cm_1 (actual time=1.696..1.696 rows=0 loops=1)
        Recheck Cond: ((search_tsv @@ '''kubernetes'''::tsquery) AND (NOT deleted) AND ...)
        ->  Bitmap Index Scan on idx_chat_messages_search_tsv (actual time=1.695..1.696 rows=0 loops=1)

Cross-table OR arms force a sequential scan of chats for the title arm, but idx_chats_title_fts serves the title predicate itself:

Bitmap Heap Scan on chats (actual time=0.669..0.858 rows=20 loops=1)
  ->  Bitmap Index Scan on idx_chats_title_fts (actual time=0.660..0.660 rows=40 loops=1)
        Index Cond: (to_tsvector('simple'::regconfig, title) @@ '''kubernetes'''::tsquery)

🤖 This PR was generated by Coder Agents on behalf of @johnstcn.

@linear-code

linear-code Bot commented Jul 6, 2026

Copy link
Copy Markdown

CODAGT-724

@johnstcn
johnstcn force-pushed the cian/codagt-722-dbpurge-sweep-to-backfill-and-maintain branch from e11a3a8 to f367661 Compare July 8, 2026 10:57
@johnstcn
johnstcn force-pushed the cian/codagt-724-add-search-parameter-and-recency-ordering-to-getchats branch from de5d61f to d06ddf4 Compare July 8, 2026 10:58
@johnstcn

johnstcn commented Jul 8, 2026

Copy link
Copy Markdown
Member Author

/coder-agents-review

@coder-agents-review

coder-agents-review Bot commented Jul 8, 2026

Copy link
Copy Markdown
Contributor

Chat: Review posted | View chat
Requested: 2026-07-09 07:23 UTC by @johnstcn
Spend: $74.89 / $100.00

Review history
  • R1 (2026-07-08): 16 reviewers, 2 Nit, 3 Note, 1 P3, COMMENT. Review
  • R2 (2026-07-08): 10 reviewers, 5 Nit, 3 Note, 2 P3, COMMENT. Review
  • R3 (2026-07-08): 10 reviewers, 9 Nit, 3 Note, 3 P3, COMMENT. Review
  • R4 (2026-07-09): 10 reviewers, 9 Nit, 3 Note, 3 P3, APPROVE. Review

deep-review v0.9.0 | Round 4 | 01a47d9..7b927dd

Last posted: Round 4, 15 findings (3 P3, 9 Nit, 3 Note), APPROVE. Review

Finding inventory

Findings

# Sev Status Location Summary Round Reviewer Posted
CRF-1 P3 Author fixed (98a120b) chats.sql:674 Comment claims AND-of-terms but websearch_to_tsquery also supports OR/NOT; misattributes case-insensitivity to the function rather than 'simple' config R1 Ryosuke P3, Leorio Note, Gon P2 Yes
CRF-2 Nit Author fixed (98a120b) chats.sql:679 SQL arm labels restate what code shows; index references are the real value R1 Gon P2 Yes
CRF-3 Nit Author fixed (98a120b) querier_test.go:15435 Test comment first clause restates test name; trim to the trap R1 Gon P2 Yes
CRF-4 Note Author fixed (98a120b) querier_test.go:15417 Test section headers (// 1. ... // 11.) repeat what test names convey R1 Gon Yes
CRF-5 Note Author fixed (98a120b) chats.sql:705 AND short-circuit for bigint cast relies on PostgreSQL behavior, not SQL standard R1 Hisoka Yes
CRF-6 Note Author accepted R2 (no code change; 'simple' semantics intentional, docs deferred to CODAGT-727) chats.sql:680 'simple' config means no stemming; "auth" won't match "authentication" R1 Ryosuke Yes
CRF-7 Note Dropped by orchestrator (stacked PR with linked ticket CODAGT-724) queries.sql.go:8776 Search field no production caller R1 Kite P4 No
CRF-8 Nit Dropped by orchestrator (factually incorrect; no blank line exists at line 693) chats.sql:693 Blank line in EXISTS subquery R1 Kite No
CRF-9 P3 Author fixed (f14b054) chats.sql:677 Whitespace-only search returns zero rows; empty search returns all rows R2 Hisoka Yes
CRF-10 Nit Author fixed (f14b054) chats.sql:673 SQL comments contain sentences that restate what code shows (header at 673, message-body at 689, PR-number at 702) R2 Gon P2 Yes
CRF-11 Nit Author fixed (f14b054) querier_test.go:15272 Test separators (--- helpers --- at 15272, --- fixtures --- at 15356) carry no category R2 Gon P2 Yes
CRF-12 Nit Author fixed (f14b054) querier_test.go:15382 Test comments contain leading clauses that narrate setup (backfill at 15382, delete at 15387) R2 Gon P2 Yes
CRF-13 P3 Author fixed (7b927dd) querier_test.go:15365 Message search positive path covers only (user, both); assistant role and user visibility not tested on root chats R3 Bisky Yes
CRF-14 Nit Author fixed (7b927dd) chats.sql:675 btrim comment restates guard and is inaccurate (btrim strips spaces, not all whitespace) R3 Gon P2, Leorio Note Yes
CRF-15 Nit Author fixed (7b927dd) querier_test.go:15391 Comment leading clause restates the SQL UPDATE R3 Gon P2 Yes
CRF-16 Nit Author fixed (7b927dd) querier_test.go:15376 modelMsg named by visibility while toolMsg named by role R3 Gon Yes
CRF-17 Nit Author fixed (7b927dd) querier_test.go:15425 IneligibleRolesNoMatch name says Roles but covers both role and visibility R3 Gon Yes

Round log

Round 1

Panel (16 reviewers). 1 P3, 2 Nit new. 3 Notes. 2 dropped. Reviewed against f367661..d06ddf4.

Round 2

Panel (10 reviewers). CRF-1 through CRF-5 addressed, CRF-6 accepted. 1 P3, 3 Nit new. Reviewed against 554ef39..2a4e560.

Round 3

Panel (10 reviewers). CRF-9 through CRF-12 addressed. 1 P3, 4 Nit new. Reviewed against 01a47d9..4904714.

Round 4

Panel (10 reviewers). CRF-13 through CRF-17 addressed. No new findings. Convergence. Reviewed against 01a47d9..7b927dd.

About deep-review

CRF = Coder Review Finding (P0-P4, Nit, Note)

Reviewer Focus
Bisky tests
Chopper ops/errors
Churn-guard change verification
Ging language modernization
Gon naming
Hisoka edge cases
Killua perf
Kite change integrity
Knov contracts
Knuckle SQL
Komugi flake/determinism
Kurapika security
Law decomposition
Leorio docs
Luffy product
Mafu-san process
Mafuuu contracts
Melody dispatch/pairing
Meruem structural
Nami frontend
Netero mechanical checks
Pariston premise testing
Pen-botter product gaps
Razor verification
Robin duplication
Ryosuke Go arch
Takumi concurrency
Zoro shape

🤖 Managed by Coder Agents.

coder-agents-review[bot]

This comment was marked as resolved.

@johnstcn
johnstcn force-pushed the cian/codagt-724-add-search-parameter-and-recency-ordering-to-getchats branch from d06ddf4 to 98a120b Compare July 8, 2026 14:28
@johnstcn
johnstcn force-pushed the cian/codagt-722-dbpurge-sweep-to-backfill-and-maintain branch from 7381fb1 to 2d5bcc9 Compare July 8, 2026 14:51
@johnstcn
johnstcn force-pushed the cian/codagt-724-add-search-parameter-and-recency-ordering-to-getchats branch from 98a120b to 71399d8 Compare July 8, 2026 14:52
@johnstcn
johnstcn force-pushed the cian/codagt-722-dbpurge-sweep-to-backfill-and-maintain branch from 2d5bcc9 to c6a884b Compare July 8, 2026 18:38
@johnstcn
johnstcn force-pushed the cian/codagt-724-add-search-parameter-and-recency-ordering-to-getchats branch from 71399d8 to f17ee99 Compare July 8, 2026 18:39
@johnstcn
johnstcn force-pushed the cian/codagt-722-dbpurge-sweep-to-backfill-and-maintain branch from c6a884b to 7ee0e38 Compare July 8, 2026 19:16
@johnstcn
johnstcn force-pushed the cian/codagt-724-add-search-parameter-and-recency-ordering-to-getchats branch from f17ee99 to 30d3b97 Compare July 8, 2026 19:17
@johnstcn
johnstcn force-pushed the cian/codagt-722-dbpurge-sweep-to-backfill-and-maintain branch from 7ee0e38 to 554ef39 Compare July 8, 2026 19:33
@johnstcn
johnstcn force-pushed the cian/codagt-724-add-search-parameter-and-recency-ordering-to-getchats branch from 30d3b97 to 2a4e560 Compare July 8, 2026 19:34
@johnstcn

johnstcn commented Jul 8, 2026

Copy link
Copy Markdown
Member Author

/coder-agents-review

@coder-agents-review coder-agents-review Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

All R1 findings addressed. CRF-1 comment rewritten with accurate websearch_to_tsquery docs. CRF-5's AND short-circuit replaced with CASE/WHEN per the SQL standard. CRF-2/3/4 comment cleanup applied. CRF-6 accepted with docs deferred to CODAGT-727.

1 P3, 3 Nit. No blockers.

"The forced search_tsv update on toolMsg and modelMsg is the real test. Without the manual UPDATE the test would pass by accident." (Bisky)

Process note: the fix commit subject ("refactor(coderd/database): address review on GetChats search") names the process rather than the change. Something like "guard bigint cast with CASE in GetChats search" would tell a future git blame reader what changed.

🤖 This review was automatically generated with Coder Agents.

Comment thread coderd/database/queries/chats.sql Outdated
-- PR number. websearch_to_tsquery accepts quoted phrases, OR, and
-- -negation; the 'simple' config folds case and skips stemming.
AND CASE
WHEN @search::text != '' THEN (

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P3 [CRF-9] Whitespace-only search returns zero rows; empty search returns all rows.

"" hits ELSE true and returns everything. " " passes != '', enters the THEN branch, and websearch_to_tsquery('simple', ' ') produces an empty tsquery that matches nothing. All four OR arms fail, zero rows returned.

Input Rows
"" all
" " 0
"-" 0
"OR" 0

"'' vs ' ' is a sharp discontinuity at the SQL layer. Every future caller inherits it." (Hisoka)

Fix: BTRIM(@search) != '' or LENGTH(BTRIM(@search)) > 0. The - and OR cases are arguably correct (operators without operands), but whitespace producing zero rows when empty produces all rows is a trap.

(Hisoka P3)

🤖

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

issue(fixed): Guard is now btrim(@search::text) != '', so whitespace-only search returns all rows, same as empty. Pinned by WhitespaceSearch/ReturnsAll alongside the existing EmptySearch cases. Punctuation-only inputs ("OR", "-") still return 0 rows here by FTS semantics; the API layer rejects them with 400 via PR #27093's preflight. Fixed in f14b054.

🤖 Reply posted by Coder Agents on behalf of @johnstcn.

Comment thread coderd/database/queries/chats.sql Outdated
)
ELSE true
END
-- Free-text search across chat title, PR title, message bodies, and

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit [CRF-10] The first sentence ("Free-text search across chat title, PR title, message bodies, and PR number") enumerates what the four OR arms below already show. Same pattern at line 689 ("Rows pending backfill (search_tsv IS NULL) match nothing" restates the IS NOT NULL predicate) and line 702 ("The length cap prevents overflow" restates the regex). Each comment has a useful trap sentence; the trailing restatement could be trimmed.

(Gon)

🤖

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

chore: Trimmed all three restatements; each comment now carries only its trap. Fixed in f14b054.

🤖 Reply posted by Coder Agents on behalf of @johnstcn.

Comment thread coderd/database/querier_test.go Outdated
})
require.NoError(t, err)

// --- helpers ---

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit [CRF-11] The --- helpers --- and --- fixtures --- (line 15356) separators are navigational aids in a long test function, but carry no invariant, trap, or contract. The helper names (createRoot, createChild, insertMsg, linkPR) and the subsequent variable declarations are self-documenting.

(Gon)

🤖

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

chore: Separators deleted. Fixed in f14b054.

🤖 Reply posted by Coder Agents on behalf of @johnstcn.

Comment thread coderd/database/querier_test.go Outdated
toolMsg := insertMsg(ineligibleChat.ID, database.ChatMessageRoleTool, database.ChatMessageVisibilityBoth, "forbidden secret token")
modelMsg := insertMsg(ineligibleChat.ID, database.ChatMessageRoleUser, database.ChatMessageVisibilityModel, "forbidden secret token")

// Backfill search_tsv through the real pipeline. The backfill indexes

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit [CRF-12] The leading clauses at lines 15382 ("Backfill search_tsv through the real pipeline") and 15387 ("Deleting after backfill removes the row from search results") narrate the test setup sequence. The trap sentences that follow are the real value. Trimming to:

// Ineligible rows keep search_tsv NULL after backfill.
// Soft-deleted rows stay excluded even though search_tsv remains populated.

keeps the invariant without the sequence narration.

(Gon)

🤖

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

chore: Took both one-liners nearly verbatim. Fixed in f14b054.

🤖 Reply posted by Coder Agents on behalf of @johnstcn.

@johnstcn
johnstcn force-pushed the cian/codagt-724-add-search-parameter-and-recency-ordering-to-getchats branch from f14b054 to 4904714 Compare July 8, 2026 22:43

johnstcn commented Jul 8, 2026

Copy link
Copy Markdown
Member Author

/coder-agents-review

All prior findings addressed and replied to inline. Requesting a convergence pass.

🤖 Requested via Coder Agents on behalf of @johnstcn.

@coder-agents-review coder-agents-review Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

All R2 findings addressed. CRF-9 whitespace guard landed with btrim. CRF-10/11/12 comment cleanup applied.

1 P3, 4 Nit. No blockers.

"If someone narrowed the SQL to cm.role = 'user' or cm.visibility = 'both', every test in this suite would still pass." (Bisky)

🤖 This review was automatically generated with Coder Agents.

linkPR(mergedChat.ID, "https://github.com/acme/other-repo/pull/7", "merged", "Fix authentication flow", 7, "https://github.com/acme/other-repo.git")

msgChat := createRoot("plain one")
insertMsg(msgChat.ID, database.ChatMessageRoleUser, database.ChatMessageVisibilityBoth, "kubernetes cluster restart")

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P3 [CRF-13] The message search positive path covers only one of four eligible (role, visibility) pairs.

The SQL accepts cm.role IN ('user', 'assistant') AND cm.visibility IN ('user', 'both'), giving four eligible combinations. Every positive message match on a root chat uses (user, both):

  • msgChat at line 15365: ChatMessageRoleUser, ChatMessageVisibilityBoth

The assistant role only appears on childChat (line 15372), where the assertion tests child exclusion, not role eligibility. The user visibility (distinct from both) also only appears there.

"If someone narrowed the SQL to cm.role = 'user' or cm.visibility = 'both', every test in this suite would still pass. The exclusion tests prove that tool role and model visibility are rejected, but they don't prove that assistant role or user visibility are accepted." (Bisky)

Fix: add one message with (assistant, both) and one with (user, user) on root chats, each with a distinct search term, and add table cases asserting they match.

(Bisky P3)

🤖

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

issue(fixed): Added root-chat fixtures for the three missing eligible pairs: (assistant, both), (user, user), and (assistant, user), each with a distinct term and a positive table case. Narrowing role or visibility in the SQL now fails the suite. Fixed in 7b927dd.

🤖 Reply posted by Coder Agents on behalf of @johnstcn.

Comment thread coderd/database/queries/chats.sql Outdated
END
-- websearch_to_tsquery accepts quoted phrases, OR, and -negation;
-- the 'simple' config folds case and skips stemming. btrim makes
-- whitespace-only search behave like empty.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit [CRF-14] "btrim makes whitespace-only search behave like empty" restates the btrim(@search::text) != '' guard on the next line. Additionally, PostgreSQL btrim(text) strips ASCII space (U+0020) only, not tabs or newlines, so "whitespace-only" overstates the scope (practical impact is zero, but the comment is imprecise).

Dropping the sentence resolves both issues:

-- websearch_to_tsquery accepts quoted phrases, OR, and -negation;
-- the 'simple' config folds case and skips stemming.

(Gon P2, Leorio Note)

🤖

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

issue(fixed): Dropped the sentence, and fixed the gap it papered over: the guard is now btrim(@search::text, E' \t\n\r') != '', so tab/newline-only input behaves like empty too. Pinned by TabOnlySearch/ReturnsAll. Fixed in 7b927dd.

🤖 Reply posted by Coder Agents on behalf of @johnstcn.

Comment thread coderd/database/querier_test.go Outdated
pendingChat := createRoot("plain four")
insertMsg(pendingChat.ID, database.ChatMessageRoleUser, database.ChatMessageVisibilityBoth, "elasticsearch indexing")

// Force search_tsv onto ineligible rows to prove the role and

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit [CRF-15] "Force search_tsv onto ineligible rows" restates the SQL UPDATE that follows. The why-not-what is the second half. Trimming to:

// Prove role/visibility predicates exclude rows even when search_tsv is set.

(Gon)

🤖

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

chore: Took your one-liner. Fixed in 7b927dd.

🤖 Reply posted by Coder Agents on behalf of @johnstcn.

Comment thread coderd/database/querier_test.go Outdated

ineligibleChat := createRoot("plain three")
toolMsg := insertMsg(ineligibleChat.ID, database.ChatMessageRoleTool, database.ChatMessageVisibilityBoth, "forbidden secret token")
modelMsg := insertMsg(ineligibleChat.ID, database.ChatMessageRoleUser, database.ChatMessageVisibilityModel, "forbidden secret token")

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit [CRF-16] toolMsg is named by role (tool) but modelMsg is named by visibility (model-only). A reader scanning the pair assumes symmetric naming. modelOnlyMsg or modelVisMsg would surface the visibility dimension.

(Gon)

🤖

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

chore: Renamed to modelOnlyMsg. Fixed in 7b927dd.

🤖 Reply posted by Coder Agents on behalf of @johnstcn.

Comment thread coderd/database/querier_test.go Outdated
{"Message/DeletedNoMatch", database.GetChatsParams{Search: "terraform"}, nil},
// Parent also excluded: EXISTS is per-chat, not per-tree.
{"Message/ChildNotSurfaced", database.GetChatsParams{Search: "orchestrator saga"}, nil},
{"Message/IneligibleRolesNoMatch", database.GetChatsParams{Search: "forbidden secret"}, nil},

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit [CRF-17] IneligibleRolesNoMatch says "Roles" but the test covers both role exclusion (toolMsg) and visibility exclusion (modelMsg). IneligibleMessagesNoMatch would be more accurate.

(Gon)

🤖

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

chore: Renamed to IneligibleMessagesNoMatch. Fixed in 7b927dd.

🤖 Reply posted by Coder Agents on behalf of @johnstcn.

johnstcn commented Jul 9, 2026

Copy link
Copy Markdown
Member Author

/coder-agents-review

R3 findings addressed in 7b927dd, including a behavioral upgrade of CRF-14 (btrim now strips tabs/newlines, pinned by test).

🤖 Requested via Coder Agents on behalf of @johnstcn.

@coder-agents-review coder-agents-review Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

All 17 findings resolved across 4 rounds. The PR is clean.

R1 caught comment inaccuracies (websearch_to_tsquery semantics, case-insensitivity attribution) and a SQL-standard compliance gap (AND short-circuit for bigint cast). R2 found the whitespace/empty search discontinuity. R3 closed the (role, visibility) test coverage gap and tightened comments. R4 confirmed convergence: 10 reviewers, zero new findings.

The author went beyond fixes on two occasions: CRF-5 was treated as correctness rather than style (CASE for guaranteed evaluation order), and CRF-14's comment drop led to widening btrim to strip tabs/newlines with a pinning test.

Process note (repeated from R2): the commit eb282b97b9 subject "address review" names the process, not the change. Future git blame readers benefit from subjects that describe what changed.

"These comments explain what would break if you changed the code without understanding it. That is what comments are for." (Leorio)

🤖 This review was automatically generated with Coder Agents.

@johnstcn johnstcn changed the title feat(coderd/database): add search parameter to GetChats DNM: feat(coderd/database): add search parameter to GetChats Jul 9, 2026
@github-actions github-actions Bot added the stale This issue is like stale bread. label Jul 19, 2026
@github-actions github-actions Bot closed this Jul 23, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

stale This issue is like stale bread.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant