Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
89 commits
Select commit Hold shift + click to select a range
2c51e1a
Merge pull request #322 from codercops/production
anurag629 Oct 23, 2026
31d67fb
feat(server): signed-in visitors with identity tokens and budget tier…
anurag629 Oct 25, 2026
8acc6cf
docs(examples): run the Cloudflare example on D1 and a Durable Object…
anurag629 Oct 25, 2026
8a3f9ba
feat(website): run the docs chat on D1 and sessions when they're conf…
anurag629 Oct 25, 2026
feb5d26
chore(website): bind the docs chat's D1 database (#326)
anurag629 Oct 25, 2026
6cf2674
fix(widget): type event handlers by their event (#328)
anurag629 Oct 26, 2026
c6605fc
ci(docs): type-check TypeScript samples (#327)
piyusshhjangid Oct 26, 2026
f1ff788
feat(widget): load the chat panel on demand from a small loader (#329)
anurag629 Oct 26, 2026
59e8486
feat(widget): no storage before the chat opens, and persistence modes…
anurag629 Oct 26, 2026
0d35733
perf(widget): load the pre-chat form and Turnstile as separate chunks…
anurag629 Oct 26, 2026
d09b5a7
feat(widget): load translations as one file per language (#332)
anurag629 Oct 26, 2026
95f58dd
style(widget): use logical CSS properties (#346)
srikar-naidu Oct 26, 2026
d9c8ea6
feat(widget): support RTL direction and locale language (#349)
srikar-naidu Oct 26, 2026
983d7d6
fix(widget): lock mobile fullscreen scroll and update responsive styl…
bhushan4work Oct 26, 2026
d6c857f
Show no. of replies (#350)
anurag2787 Oct 26, 2026
fa8df0d
feat(widget): add Hindi locale (#351)
piyusshhjangid Oct 26, 2026
82822a6
fix(widget): trap focus in popup chat (#356)
piyusshhjangid Oct 26, 2026
83e0d3f
fix(widget): unify keyboard focus rings across controls (#352)
anurag2787 Oct 27, 2026
e51822f
feat(widget): add Urdu translations (#358)
Saifjafri212213 Oct 27, 2026
1b03e00
chore: measure coverage on TypeScript sources only (#347)
anurag629 Oct 27, 2026
bd6f3c8
chore(core): upgrade to @anthropic-ai/sdk 1.x and stop sending temper…
anurag629 Oct 27, 2026
100475b
feat(core): VectorStore interface, memoryVectors and vector conforman…
anurag629 Oct 27, 2026
9d36629
feat(core): retrieval types, openaiEmbedder and chunks for knowledge …
anurag629 Oct 27, 2026
d890cbe
feat(core): vectorRetriever, hybridRetriever and follow-up query buil…
anurag629 Oct 27, 2026
7ecd228
feat(core): add voyageEmbedder (#368)
Saifjafri212213 Oct 27, 2026
535e23a
feat(widget): add Spanish locale (#355)
piyusshhjangid Oct 27, 2026
4245b68
chore(widget): raise the panel budget to 16 kB (#373)
anurag629 Oct 27, 2026
b93e221
feat(widget): add suggested question buttons (#348)
srujankaleru2007 Oct 27, 2026
9632988
feat(widget): add French locale (#371)
piyusshhjangid Oct 27, 2026
7e1e8cf
feat(store-postgres): add pgvector vector storage (#372)
piyusshhjangid Oct 27, 2026
4e86624
fix(core): support Japanese and Chinese knowledge matching (#369)
anurag2787 Oct 27, 2026
458fb3c
feat(widget): add German locale (#374)
piyusshhjangid Oct 27, 2026
15d5b10
feat(widget): add Chinese locale (#376)
piyusshhjangid Oct 27, 2026
8d6223d
feat(core): add Gemini embeddings support (#375)
anurag2787 Oct 27, 2026
2c1f49a
feat(widget): add Japanese locale (#377)
piyusshhjangid Oct 27, 2026
a714a12
refactor(core): share retries and batching between embedders, and bou…
anurag629 Oct 27, 2026
b8c5ed6
feat(widget): add Arabic locale (#379)
piyusshhjangid Oct 27, 2026
a029c43
feat(core): add workersAiEmbedder for Cloudflare Workers AI embedding…
bhushan4work Oct 27, 2026
f535508
fix(store-postgres): match any word in keyword search, and check it i…
anurag629 Oct 27, 2026
d651eea
feat(store-cloudflare): add Vectorize vector store (#380)
srikar-naidu Oct 27, 2026
3d50e5b
feat(store-sqlite): add sqlite-vec vector storage (#382)
srikar-naidu Oct 27, 2026
7665dcb
fix(widget): make welcome bubble keyboard accessible (#383)
kachamsiddarth Oct 28, 2026
ce1d0e3
feat(store): add Upstash Vector adapter (#385)
srujankaleru2007 Oct 28, 2026
b0bd38d
feat(core): cite the pages answers come from (#386)
anurag629 Oct 28, 2026
f73ecf8
feat(widget): add Portuguese locale (#384)
piyusshhjangid Oct 28, 2026
26a4086
feat(widget): add Italian locale (#390)
piyusshhjangid Oct 28, 2026
eb4107c
feat(ingest): build a knowledge index from a site (#391)
anurag629 Oct 28, 2026
a9c1c60
feat(cli): chatcops ingest and chatcops search (#393)
anurag629 Oct 28, 2026
095829b
feat(widget): add Dutch locale (#396)
piyusshhjangid Oct 28, 2026
2e66f57
feat(ingest): respect robots.txt and crawl delays (#399)
srikar-naidu Oct 28, 2026
3ee5fdc
feat(core): add Cohere reranker (#404)
srujankaleru2007 Oct 28, 2026
3896eb0
feat(widget): add Korean locale (#407)
piyusshhjangid Oct 28, 2026
304f1df
feat(core): add Workers AI reranker (#398)
piyusshhjangid Oct 28, 2026
cf184c7
feat(widget): show sources under assistant replies (#397)
anurag2787 Oct 28, 2026
5ef0242
fix(widget): announce streamed replies once (#410)
kachamsiddarth Oct 28, 2026
9de7d5c
ci: let the claim check accept "Part of #N" (#354)
anurag629 Oct 28, 2026
aa0576d
feat(cli): chatcops test runs eval files against your bot (#394)
anurag629 Oct 28, 2026
55b6e36
feat(cli): record and replay the API calls of chatcops test (#395)
anurag629 Oct 28, 2026
07de986
feat(cli): judge assertions, prices and --max-cost for chatcops test …
anurag629 Oct 28, 2026
e22060d
feat(core,server): a Logger for everything ChatCops writes, and tool …
anurag629 Oct 28, 2026
cc19259
feat(widget): light, dark and auto themes (#401)
anurag629 Oct 28, 2026
5dc1fc6
perf(widget): render streaming replies in O(n) and keep the reader's …
anurag629 Oct 28, 2026
3ff10e0
feat(widget): tell visitors they're chatting with an AI (#403)
anurag629 Oct 28, 2026
b66fd9f
feat(core): add Voyage reranker (#406)
srujankaleru2007 Oct 28, 2026
af6345a
test(website): eval the docs bot with chatcops test, replayed in CI (…
anurag629 Oct 28, 2026
c9ca76a
feat(cli): add tokens-under, latency-under and cost-under assertions …
prakashNalla Oct 28, 2026
c5c81b0
fix(cli): fail the test, not the run, when a reply throws (#425)
anurag629 Oct 28, 2026
6412ae2
feat(website): the docs bot answers from the docs pages and cites the…
anurag629 Oct 28, 2026
f362c92
feat(cli): add cites and lead-captured assertions (#424)
prakashNalla Oct 28, 2026
d567528
test(website): a 50-question citation eval for the docs bot, in CI (#…
anurag629 Oct 28, 2026
30525e3
feat(cli): add the javascript assertion to chatcops test (#427)
anurag2787 Oct 28, 2026
da756fe
feat(widget): toggle, sendMessage, newConversation, clear, registerLo…
anurag629 Oct 28, 2026
316f625
feat(widget): add Hebrew locale (#409)
piyusshhjangid Oct 28, 2026
86085c0
feat(widget,server): setUser and setContext (#432)
anurag629 Oct 28, 2026
08b4647
feat(widget): update() for theme, branding and strings on a running c…
anurag629 Oct 28, 2026
a27092f
test(e2e): check every widget state with axe in light, dark and RTL (…
anurag629 Oct 28, 2026
5e34537
fix(server): send an Allow header with 405 responses (#434)
prakashNalla Oct 28, 2026
f76384d
ci: check each package's public API against a snapshot in api/ (#437)
anurag629 Oct 28, 2026
cb360ad
feat(widget,server): export the types a config is made of (#438)
anurag629 Oct 28, 2026
7a34b09
docs(server): mark the source part as emitted in the protocol referen…
prakashNalla Oct 28, 2026
91d4c51
docs: document the options the docs never mentioned, and a page for C…
anurag629 Oct 28, 2026
897f8e3
feat(core,server): noun.verb analytics event names, with the old ones…
anurag629 Oct 28, 2026
234b056
docs: rebuild the docs bot index for the analytics event names (#443)
anurag629 Oct 28, 2026
c488287
feat(cli): a fuller pretty report for chatcops test (#444)
Sreehita-here Oct 28, 2026
f5416e2
fix(widget): fall back to the default welcome bubble delay for non-nu…
prakashNalla Oct 29, 2026
75903b4
feat(widget): translate the sources label and AI disclosure in 11 loc…
piyusshhjangid Oct 29, 2026
f4ce2c8
perf(widget): rename more private members in the minified builds, che…
anurag629 Oct 29, 2026
18a77bd
feat(cli): calls-tool and no-tool-call assertions (#446)
bhushan4work Oct 29, 2026
8289a65
docs: rebuild the docs bot index before v0.8 (#454)
anurag629 Oct 29, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
5 changes: 5 additions & 0 deletions .changeset/allow-header-405.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@chatcops/server": patch
---

405 responses now include `Allow: POST, OPTIONS`.
6 changes: 6 additions & 0 deletions .changeset/analytics-event-names.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
"@chatcops/core": minor
"@chatcops/server": minor
---

Analytics events are named `noun.verb` now: `conversation.started`, `message.sent`, `message.received` and `lead.captured`, also exported as `ANALYTICS_EVENTS`. The old `noun:verb` names keep working until 1.0. `track()` and `getEvents()` read them as the new ones, stats count events a store saved under either, and `eventCounts` has both keys, so the numbers carry on across the upgrade. Stats gain `leadsCaptured`. `leadsCapture`, the same number, is deprecated. A custom `EventSink` now receives the new names. Webhook event names don't change.
5 changes: 5 additions & 0 deletions .changeset/announce-streamed-replies.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@chatcops/widget": patch
---

Announce completed assistant replies once for screen readers.
5 changes: 5 additions & 0 deletions .changeset/anthropic-sdk-1.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@chatcops/core": patch
---

The Claude provider now uses `@anthropic-ai/sdk` 1.x, which talks to Claude's API version 2026-10-21. That version removed `temperature`, so it's never sent to Claude: a configured `temperature` logs one warning and is left out. Claude 4.7 and later, including the default `claude-haiku-5-5`, already ignored it. On older Claude models a lowered `temperature` no longer has an effect; use `effort` instead.
5 changes: 5 additions & 0 deletions .changeset/arabic-widget-locale.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@chatcops/widget": patch
---

Add Arabic widget translations, loaded only for visitors using Arabic.
5 changes: 5 additions & 0 deletions .changeset/brave-oranges-refuse.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@chatcops/widget": patch
---

Show unread reply count in the launcher badge and accessible name.
5 changes: 5 additions & 0 deletions .changeset/bright-questions-start.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@chatcops/widget": minor
---

Add configurable suggested question buttons to new widget conversations.
5 changes: 5 additions & 0 deletions .changeset/bright-rerankers-smile.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@chatcops/core": minor
---

Add a Cloudflare Workers AI reranker for knowledge retrieval.
5 changes: 5 additions & 0 deletions .changeset/bright-rerankers-sort.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@chatcops/core": minor
---

Add `cohereReranker` for reranking retrieved chunks with Cohere's Rerank API.
10 changes: 10 additions & 0 deletions .changeset/chatcops-test.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
---
"@chatcops/cli": minor
"@chatcops/ingest": patch
---

`chatcops test` runs eval files against your bot: YAML conversations (`evals/**/*.chat.yaml`, or `.chat.ts`/`.chat.mjs` modules) with assertions on each reply. It uses the config's new `server` section and runs through the real request path with fresh in-memory storage, tool mocks, page context, locale, `repeat` and `passRate`. Options: `--filter` (name or `tag:x`), `--repeat`, `--concurrency`, `--reporter pretty|json` (repeatable) and `--json`. Exit 0 when all passed, 1 when some failed, 2 when it couldn't run. This first version has the `contains` assertion (and `not-contains`); more are coming.

`ingest` and `search` now say what's missing from the config when they run, so a config with only `server` works for `chatcops test`.

`globToRegExp` in `@chatcops/ingest`: `**/` now also matches no folder, so `docs/**/*.md` matches `docs/intro.md`.
5 changes: 5 additions & 0 deletions .changeset/chinese-widget-locale.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@chatcops/widget": patch
---

Add Simplified Chinese widget translations, loaded only for visitors using Chinese.
6 changes: 6 additions & 0 deletions .changeset/citations.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
"@chatcops/core": minor
"@chatcops/server": minor
---

Answers now cite the pages they came from. Chunks from knowledge sources with `retrieve` are passed to the turn as `sources`, and each page the reply cites becomes a `source` part (once per page), streamed after the text and saved with the reply. Claude gets the chunks as `search_result` blocks and cites them natively; other providers get a numbered `<sources>` block and cite with `[n]`, and numbers that match no source are removed from the text. New in core: `sources` on `runTurn` and provider step params, `citations: 'native'` on providers, a `source` provider event, and `CitationParser`/`parseCitations`/`sourcePart`.
5 changes: 5 additions & 0 deletions .changeset/cjk-knowledge-sources.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@chatcops/core": patch
---

Support Japanese and Chinese in TextKnowledgeSource and FAQKnowledgeSource using word segmentation.
8 changes: 8 additions & 0 deletions .changeset/cli.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
---
"@chatcops/cli": minor
"@chatcops/ingest": minor
---

New package: the `chatcops` command. `chatcops ingest` builds or updates a knowledge index from `chatcops.config.ts` or `--source` (sitemaps, page URLs, folders), with `--dry-run`, `--max-pages`, `--concurrency`, `--prune`, `--force`, `--index` and `--json` (one JSON object per line). `chatcops search` shows what retrieval finds for a question. Both refuse an embedder other than the one the index was built with. Exit codes: 0 done, 1 finished with failed pages or discovery errors, 2 could not run.

`ingest()` takes `maxPages`; a capped run never prunes.
4 changes: 4 additions & 0 deletions .changeset/cloudflare-example-origins.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
---
---

The Cloudflare Worker example uses `allowedOrigins` instead of the deprecated `cors`.
5 changes: 5 additions & 0 deletions .changeset/cloudflare-vectorize.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@chatcops/store-cloudflare": minor
---

Add optional Cloudflare Vectorize and D1 vector storage with semantic and keyword search.
5 changes: 5 additions & 0 deletions .changeset/dutch-widget-locale.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@chatcops/widget": patch
---

Add Dutch widget translations, loaded only for visitors using Dutch.
5 changes: 5 additions & 0 deletions .changeset/eleven-locales-disclosure.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@chatcops/widget": patch
---

Add source labels and AI disclosure translations to 11 widget locales.
5 changes: 5 additions & 0 deletions .changeset/embedder-http.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@chatcops/core": patch
---

`openaiEmbedder` now keeps `batchSize` between 1 and 2048 (what OpenAI accepts), so a value of 0 no longer loops forever. The OpenAI, Voyage and Gemini embedders share one implementation of retries and batching, with no change in behavior.
5 changes: 5 additions & 0 deletions .changeset/eval-cassettes-gzip.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@chatcops/cli": patch
---

Eval recordings save response bodies over 4 kB gzipped in base64 (`encoding: 'gzip'`), so a streamed reply, which is one event per token, takes about a tenth of the space. Request bodies stay readable JSON, so a re-recording's diff still shows what changed.
5 changes: 5 additions & 0 deletions .changeset/eval-cassettes.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@chatcops/cli": minor
---

`chatcops test --record` saves every HTTP call the tests make (model, embeddings, tools that call APIs) to `__cassettes__/<eval file>.jsonl`, and `--replay` answers them from there without the network. Replay is the default when `CI` is set; `--live` calls the APIs anyway. Calls are matched by a hash of their method, URL and body, so a changed prompt, model or tool list fails with where the request changed and a note to re-record, instead of passing on an old answer. Headers and key-like query parameters are never saved.
7 changes: 7 additions & 0 deletions .changeset/eval-judge.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
"@chatcops/cli": minor
---

`judge` assertions in `chatcops test`: a model grades the reply against a rubric from 0 to 1 and passes at `threshold` (default 0.7). The default judge is the cheap model of a provider other than the bot's; `--judge-model provider:model` or `judge` in the config picks another. Without a key for it the run refuses to start, and every run prints the judge it used. Judge calls are recorded and replayed with the rest.

`prices` in the config (US dollars per million tokens, by model id) gives each turn and judge call a cost, and the run prints what it spent. `--max-cost <usd>` stops starting turns once a run has spent that much; it needs prices for the models in use. Reporters get a run summary (mode, judge, cost) in `onEnd`.
5 changes: 5 additions & 0 deletions .changeset/eval-turn-errors.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@chatcops/cli": patch
---

`chatcops test` no longer stops the whole run when something throws while a reply is read, such as a knowledge source that can't reach its index (or a replay that has no recording for an embedding call). That test fails with `internal_error` and the message, and the other tests still run.
6 changes: 6 additions & 0 deletions .changeset/export-config-types.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
"@chatcops/widget": minor
"@chatcops/server": minor
---

The types that make up a config are now exported, so a site can name them: `ThemeConfig`, `ThemeMode`, `PreChatField`, `PreChatFormConfig`, `Persistence`, `MessageStatus` and `MessageErrorType` from `@chatcops/widget`, and `TurnstileConfig` from `@chatcops/server`.
5 changes: 5 additions & 0 deletions .changeset/focus-ring-controls.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@chatcops/widget': patch
---

Add --cc-focus-ring on :host for visible keyboard focus indicators across widget controls.
5 changes: 5 additions & 0 deletions .changeset/french-widget-locale.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@chatcops/widget": patch
---

Add French widget translations, loaded only for visitors using French.
5 changes: 5 additions & 0 deletions .changeset/gemini-embedder.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@chatcops/core": minor
---

Add `geminiEmbedder` for embeddings via Google's Gemini batchEmbedContents API.
5 changes: 5 additions & 0 deletions .changeset/german-widget-locale.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@chatcops/widget": patch
---

Add German widget translations, loaded only for visitors using German.
5 changes: 5 additions & 0 deletions .changeset/hebrew-widget-locale.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@chatcops/widget": patch
---

Add Hebrew widget translations, loaded only for visitors using Hebrew.
5 changes: 5 additions & 0 deletions .changeset/hi-widget-locale.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@chatcops/widget": patch
---

Add Hindi widget translations, loaded only for visitors using Hindi.
6 changes: 6 additions & 0 deletions .changeset/identity-tokens.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
"@chatcops/server": minor
"@chatcops/widget": minor
---

Signed-in visitors. With `identity: { secret }` on the server, your site signs a `userToken` (an HS256 JWT with `sub`, `exp` and an optional `tier`) and the widget sends it with `/session` (`userToken` or `data-user-token`). The user id goes into the session token and is stored on the conversation, so the same user can resume it with a fresh token and nobody else can. `identity.tiers` gives a tier its own budgets.
5 changes: 5 additions & 0 deletions .changeset/ingest.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@chatcops/ingest": minor
---

New package: `ingest()` builds a knowledge index from a site. It discovers pages from sitemaps (indexes and `.xml.gz` too), URL lists and folders of Markdown/MDX/HTML; fetches with conditional requests, a timeout and limited concurrency; extracts readable content as Markdown with Readability, after removing hidden elements, scripts and comments; chunks along headings without splitting code blocks or tables; embeds and writes to any `VectorStore`. A manifest in a `KeyValueStore` makes re-runs embed only what changed, `prune` never runs after a discovery error, and an index refuses an embedder other than the one that built it.
5 changes: 5 additions & 0 deletions .changeset/italian-widget-locale.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@chatcops/widget": patch
---

Add Italian widget translations, loaded only for visitors using Italian.
5 changes: 5 additions & 0 deletions .changeset/japanese-widget-locale.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@chatcops/widget": patch
---

Add Japanese widget translations, loaded only for visitors using Japanese.
5 changes: 5 additions & 0 deletions .changeset/javascript-assertion.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@chatcops/cli": minor
---

`javascript` assertion: point it at a module (relative to the eval file) and its default export is called with `(turn, conversation)`. Returns a boolean or `{ pass, reason?, score? }`, and may be async. A missing file, a module without a default function, or a throw inside it are failures with the file name in the reason. Modules are loaded once per run.
6 changes: 6 additions & 0 deletions .changeset/keyword-any-word.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
"@chatcops/core": patch
"@chatcops/store-postgres": patch
---

Keyword search in the pgvector store now matches pages with any of the question's words, ranked by how well they match, instead of only pages with all of them. The storage conformance suite checks this for every store.
5 changes: 5 additions & 0 deletions .changeset/korean-widget-locale.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@chatcops/widget": patch
---

Add Korean widget translations, loaded only for visitors using Korean.
10 changes: 10 additions & 0 deletions .changeset/logger.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
---
"@chatcops/core": minor
"@chatcops/server": minor
---

A `Logger` for everything ChatCops writes: `logger` in the server config gets startup notes, refused requests and every error the server handles instead of throwing, each with a stable `event` name (`provider_error`, `tool_error`, `webhook_failed`, `origin_refused`, …). The default `consoleLogger()` prints the same `[chatcops] …` lines as before; `jsonLogger()` writes one JSON object per line, and any object with `debug`/`info`/`warn`/`error` works. Tools get the logger as `context.logger`, and `runTurn`, providers (`ProviderConfig.logger`), `ConversationManager` and `BufferedEventSink` take one too.

**Tool errors:** when a tool throws, the model now sees only `Tool failed: <name>`, and the full error is logged as `tool_error`. Before, the thrown message went to the model, which could repeat a database error or a connection string to the visitor. Return `{ success: false, message }` to tell the model something it can pass on. Timeouts and cancelled replies keep their messages.

Console lines for errors that come with an error object no longer end in a colon (`[chatcops] Provider error` and the error), and `describeBudgets` and `describeSecurity` no longer start with `[chatcops] `, since the logger adds it.
5 changes: 5 additions & 0 deletions .changeset/logical-widget-styles.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@chatcops/widget': patch
---

Use logical CSS properties for widget styles so layout and message bubbles adapt to right-to-left languages.
5 changes: 5 additions & 0 deletions .changeset/mobile-fullscreen-scroll-lock.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@chatcops/widget": patch
---

Lock document scrolling on mobile screens (640px and below) when the chat panel is open in full-screen mode, and restore original overflow on close or destroy. Update mobile breakpoint to 640px, add safe-area insets, and set mobile input font size to 16px to prevent auto-zooming on mobile devices.
5 changes: 5 additions & 0 deletions .changeset/parts-assertions.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@chatcops/cli": minor
---

`chatcops test` has `cites` and `lead-captured` assertions, for the pages a reply cites and the leads a turn captures.
5 changes: 5 additions & 0 deletions .changeset/popup-focus-trap.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@chatcops/widget": patch
---

Keep keyboard focus inside the open popup chat.
5 changes: 5 additions & 0 deletions .changeset/portuguese-widget-locale.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@chatcops/widget": patch
---

Add Portuguese widget translations, loaded only for visitors using Portuguese.
5 changes: 5 additions & 0 deletions .changeset/quiet-rivers-smile.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@chatcops/cli": minor
---

Add a grouped, more detailed pretty report for `chatcops test`, including the `--verbose` option.
5 changes: 5 additions & 0 deletions .changeset/quiet-vectors-smile.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@chatcops/store-upstash-vector": minor
---

Add an Upstash Vector-backed store for ChatCops embedded page chunks.
7 changes: 7 additions & 0 deletions .changeset/respect-ingest-robots.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
'@chatcops/ingest': minor
---

Respect robots.txt by default during ingestion, with per-origin policy caching, allow/disallow matching and crawl-delay scheduling. Add respectRobots to opt out for network sources; local files are unaffected.

Report unavailable robots policies as per-origin errors and skip pruning during outages, instead of treating them as successful runs blocked by explicit rules.
8 changes: 8 additions & 0 deletions .changeset/retrieval.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
---
"@chatcops/core": minor
"@chatcops/server": minor
---

Retrieval building blocks. `KnowledgeSource` has an optional `retrieve(query)` that returns chunks with their source page. When a source has it, the server calls it with the conversation so far, for follow-up questions, and gives the model every source's chunks as one numbered block, fenced as reference material that never contains instructions. Sources with only `getContext` work as before.

New in core: the `Embedder`, `Retriever`, `RetrievedChunk` and `RetrievalQuery` types, `openaiEmbedder` (fetch only, `text-embedding-3-small` at 1024 dimensions by default, with retries on rate limits), `retrieverKnowledge` and `formatSources`.
5 changes: 5 additions & 0 deletions .changeset/retrievers.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@chatcops/core": minor
---

Ready-made retrievers: `vectorRetriever` searches a vector store by meaning, and `hybridRetriever` also searches by words and merges both by rank (reciprocal rank fusion, k = 60), which finds product names and codes that meaning alone misses. Both take `candidates` and an optional `reranker` (new `Reranker` interface), and refuse an embedder whose vectors don't match the store's size. A short or follow-up question is searched together with the visitor's previous one (`retrievalQueryText`). `reciprocalRankFusion` is exported too.
5 changes: 5 additions & 0 deletions .changeset/rtl-widget-direction.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@chatcops/widget": minor
---

Add locale-aware text direction and language attributes for RTL widget support.
5 changes: 5 additions & 0 deletions .changeset/spanish-widget-locale.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@chatcops/widget": patch
---

Add Spanish widget translations, loaded only for visitors using Spanish.
5 changes: 5 additions & 0 deletions .changeset/sqlite-vector-search.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@chatcops/store-sqlite': minor
---

Add opt-in sqlite-vec vector storage with cosine similarity, metadata filtering, and FTS5 keyword search including CJK segmentation.
5 changes: 5 additions & 0 deletions .changeset/tidy-vectors-search.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@chatcops/store-postgres': minor
---

Add optional pgvector-backed vector storage with cosine and keyword search.
5 changes: 5 additions & 0 deletions .changeset/tool-call-assertions.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@chatcops/cli": minor
---

`chatcops test` has `calls-tool` and `no-tool-call` assertions, for checking that a turn calls a tool with expected arguments or makes no unexpected tool calls.
5 changes: 5 additions & 0 deletions .changeset/typed-widget-events.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@chatcops/widget": patch
---

`ChatCops.on()` and `widget.on()` type each handler by its event, so `on('message', (message) => ...)` gets a `MessageData` and `on('error', (error) => ...)` an `Error`. A handler typed `(...args: unknown[]) => void` still works. `WidgetEvents` and `MessageData` are exported.
5 changes: 5 additions & 0 deletions .changeset/ur-widget-locale.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@chatcops/widget": patch
---

Add Urdu widget translations, loaded only for visitors using Urdu.
5 changes: 5 additions & 0 deletions .changeset/usage-assertions.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@chatcops/cli": minor
---

`chatcops test` has `tokens-under`, `latency-under` and `cost-under` assertions, to catch replies that get longer, slower or more expensive.
5 changes: 5 additions & 0 deletions .changeset/vector-store.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@chatcops/core": minor
---

New `VectorStore` interface (`vectors` on `ChatCopsStorage`) for embedded chunks of a site's pages, with `upsert`, `query` (cosine similarity), an optional `keywordQuery` and `deleteBySource`. `memoryVectors({ dimensions })` keeps them in memory and does BM25 keyword search with `Intl.Segmenter`, so Japanese and Chinese work. `runStorageConformance` checks `vectors` when a store has them. The server doesn't search vectors yet.
5 changes: 5 additions & 0 deletions .changeset/voyage-embedder.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@chatcops/core": minor
---

Add `voyageEmbedder`, which turns text into vectors with Voyage AI's embeddings API. It embeds documents and search queries the way Voyage recommends, batches requests, and retries rate limits and server errors.
5 changes: 5 additions & 0 deletions .changeset/warm-rerankers-rank.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@chatcops/core": minor
---

Add `voyageReranker` for reranking retrieved chunks with Voyage AI's Reranker API.
5 changes: 5 additions & 0 deletions .changeset/welcome-bubble-button.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@chatcops/widget": patch
---

Make the welcome bubble text keyboard-accessible.
5 changes: 5 additions & 0 deletions .changeset/welcome-bubble-delay.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@chatcops/widget": patch
---

A `data-welcome-bubble-delay` that isn't whole milliseconds, such as `3s`, now falls back to the default delay instead of being read as 3 ms.
5 changes: 5 additions & 0 deletions .changeset/widget-ai-disclosure.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@chatcops/widget": minor
---

The chat now starts with a note that the visitor is talking to an AI ("You're chatting with an AI assistant. It can make mistakes."), as the EU AI Act asks (Article 50). It's on by default, stays first in the log (also after a new conversation), and has `role="note"`. `disclosure: { text, learnMoreUrl }` (or `data-disclosure-text`, `data-disclosure-url`) changes the wording and adds a link; `disclosure: false` (`data-disclosure="false"`) removes it and logs a console notice that telling visitors is then up to you. New locale strings: `disclosure`, `disclosureLearnMore`.
Loading
Loading