chore: settle product naming across app, widget and deployments

One word everywhere: ReplyPier in UI copy, package and image names, the
replypier.site domains (app/api/docs/help), REPLYPIER_* settings and the
--rp-* design tokens.

- public widget API is window.ReplyPier with replypierId / replypierBaseUrl /
  replypierConfig / replypierToken, loader at webclient/replypier.min.js;
  both bundles rebuilt from source
- NOTICE, llms.txt, CONTRIBUTING, HELP_CENTER_INFRA and the demo runtime
  config rewritten; the demo config ships no third-party keys
- migration adds the ReplyPier managed model value to the AI model enum
- local compose project, database, role, volume and Docker network carry the
  same name
This commit is contained in:
WangShen007 committed 2026-10-26 00:57:22 +08:00
1 parent ff0a09f0e5
commit 20fef2b9f3
1156 files changed
+7267 -7148

No files matched your search

+1 -1
View File
@@ -1,5 +1,5 @@
"""
Copyright 2024-2026 ChatterMate
Copyright 2024-2026 ReplyPier
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@@ -1,5 +1,5 @@
"""
Copyright 2024-2026 ChatterMate
Copyright 2024-2026 ReplyPier
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
+1 -1
View File
@@ -1,5 +1,5 @@
"""
Copyright 2024-2026 ChatterMate
Copyright 2024-2026 ReplyPier
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@@ -1,5 +1,5 @@
"""
Copyright 2024-2026 ChatterMate
Copyright 2024-2026 ReplyPier
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
+1 -1
View File
@@ -1,5 +1,5 @@
"""
Copyright 2024-2026 ChatterMate
Copyright 2024-2026 ReplyPier
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@@ -1,5 +1,5 @@
"""
Copyright 2024-2026 ChatterMate
Copyright 2024-2026 ReplyPier
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@@ -1,5 +1,5 @@
"""
Copyright 2024-2026 ChatterMate
Copyright 2024-2026 ReplyPier
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@@ -1,5 +1,5 @@
"""
Copyright 2024-2026 ChatterMate
Copyright 2024-2026 ReplyPier
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@@ -308,7 +308,7 @@ async def test_failed_after_read_changes_nothing(db, account, test_organization,
@pytest.mark.asyncio
async def test_every_receipt_is_announced_even_for_unknown_messages(
db, account, use_test_db, mock_sio, redis):
"""Usage counting needs receipts for messages ChatterMate never stored."""
"""Usage counting needs receipts for messages ReplyPier never stored."""
seen = []
async def listen(event):
@@ -1,5 +1,5 @@
"""
Copyright 2024-2026 ChatterMate
Copyright 2024-2026 ReplyPier
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@@ -1,5 +1,5 @@
"""
Copyright 2024-2026 ChatterMate
Copyright 2024-2026 ReplyPier
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@@ -1,5 +1,5 @@
"""
Copyright 2024-2026 ChatterMate
Copyright 2024-2026 ReplyPier
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@@ -1,5 +1,5 @@
"""
Copyright 2024-2026 ChatterMate
Copyright 2024-2026 ReplyPier
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@@ -1,5 +1,5 @@
"""
Copyright 2024-2026 ChatterMate
Copyright 2024-2026 ReplyPier
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@@ -88,7 +88,7 @@ def test_set_domain_generates_token_and_resets_state(db, row):
def test_set_domain_rejects_base_domain_hosts(db, row):
with pytest.raises(ValueError):
dv.set_custom_domain(db, row, "acme.chattermate.help")
dv.set_custom_domain(db, row, "acme.help.replypier.site")
def test_verify_partial_records_stay_pending(db, row):
@@ -151,7 +151,7 @@ def test_domain_endpoints_flow(client, db, test_organization):
assert body["custom_domain"] == "help.customer.com"
assert body["domain_status"] == "pending"
assert [r["type"] for r in body["records"]] == ["CNAME", "TXT"]
assert body["records"][1]["host"] == "_chattermate.help.customer.com"
assert body["records"][1]["host"] == "_replypier.help.customer.com"
with patch.object(dv, "check_txt_record", return_value=True), \
patch.object(dv, "check_cname_record", return_value=True), \
@@ -174,4 +174,4 @@ def test_verify_without_domain_400(client):
def test_set_domain_rejects_invalid_hostnames(client):
assert client.post(f"{BASE}/domain", json={"domain": "not a domain"}).status_code == 422
assert client.post(f"{BASE}/domain", json={"domain": "x.chattermate.help"}).status_code == 400
assert client.post(f"{BASE}/domain", json={"domain": "x.help.replypier.site"}).status_code == 400
@@ -1,5 +1,5 @@
"""
Copyright 2024-2026 ChatterMate
Copyright 2024-2026 ReplyPier
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@@ -165,7 +165,7 @@ def test_fetch_article_converts_markdown_strips_chrome_and_collects_images():
# Link absolutized (same-site remapping happens later, in the import job).
assert "[pricing](https://help.example.com/pricing)" in article.markdown
# Real image collected as placeholder; data: image reduced to alt text.
assert "cm-pending-image://0.img" in article.markdown
assert "rp-pending-image://0.img" in article.markdown
assert len(article.pending_images) == 1
assert "base64" not in article.markdown
# Help-center chrome stripped: no Chatwoot footer, breadcrumb or metadata.
@@ -1,5 +1,5 @@
"""
Copyright 2024-2026 ChatterMate
Copyright 2024-2026 ReplyPier
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
+1 -1
View File
@@ -1,5 +1,5 @@
"""
Copyright 2024-2026 ChatterMate
Copyright 2024-2026 ReplyPier
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@@ -1,5 +1,5 @@
"""
Copyright 2024-2026 ChatterMate
Copyright 2024-2026 ReplyPier
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@@ -1,5 +1,5 @@
"""
Copyright 2024-2026 ChatterMate
Copyright 2024-2026 ReplyPier
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@@ -1,5 +1,5 @@
"""
Copyright 2024-2026 ChatterMate
Copyright 2024-2026 ReplyPier
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@@ -1,5 +1,5 @@
"""
Copyright 2024-2026 ChatterMate
Copyright 2024-2026 ReplyPier
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@@ -52,8 +52,8 @@ def test_live_url_custom_domain_wins(monkeypatch):
def test_live_url_subdomain_mode(monkeypatch):
monkeypatch.setattr(settings, "HELP_CENTER_PUBLIC_MODE", "subdomain")
monkeypatch.setattr(settings, "HELP_CENTER_BASE_DOMAIN", "chattermate.help")
assert live_url(_row()) == "https://acme.chattermate.help"
monkeypatch.setattr(settings, "HELP_CENTER_BASE_DOMAIN", "help.replypier.site")
assert live_url(_row()) == "https://acme.help.replypier.site"
def test_live_url_path_mode_uses_backend_url(monkeypatch):
+1 -1
View File
@@ -1,5 +1,5 @@
"""
Copyright 2024-2026 ChatterMate
Copyright 2024-2026 ReplyPier
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@@ -1,5 +1,5 @@
"""
Copyright 2024-2026 ChatterMate
Copyright 2024-2026 ReplyPier
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@@ -1,5 +1,5 @@
"""
Copyright 2024-2026 ChatterMate
Copyright 2024-2026 ReplyPier
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@@ -1,5 +1,5 @@
"""
Copyright 2024-2026 ChatterMate
Copyright 2024-2026 ReplyPier
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
+1 -1
View File
@@ -1,5 +1,5 @@
"""
Copyright 2024-2026 ChatterMate
Copyright 2024-2026 ReplyPier
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@@ -1,5 +1,5 @@
"""
Copyright 2024-2026 ChatterMate
Copyright 2024-2026 ReplyPier
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@@ -1,5 +1,5 @@
"""
Copyright 2024-2026 ChatterMate
Copyright 2024-2026 ReplyPier
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@@ -1,5 +1,5 @@
"""
Copyright 2024-2026 ChatterMate
Copyright 2024-2026 ReplyPier
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@@ -248,7 +248,7 @@ class TestEdgeCases:
ROW_SCOPE = {"public.orders": "customer_email", "public.customers": "email"}
OWNER = "arun@chattermate.chat"
OWNER = "arun@replypier.site"
def scoped(sql, scope=None, value=OWNER, allowed=ALLOWED, masked=None):
@@ -359,7 +359,7 @@ class TestRowScopeCaseInsensitivity:
)
def test_predicate_folds_both_sides(self):
result = self._ci("Arun@ChatterMate.Chat")
result = self._ci("Arun@ReplyPier.Site")
assert result.ok
assert "LOWER(customer_email) = '%s'" % OWNER in result.sql
@@ -369,10 +369,10 @@ class TestRowScopeCaseInsensitivity:
assert "'x'' or ''1''=''1'" in result.sql.lower()
def test_exact_match_when_disabled(self):
result = scoped("SELECT id FROM orders", value="Arun@ChatterMate.Chat")
result = scoped("SELECT id FROM orders", value="Arun@ReplyPier.Site")
assert result.ok
assert "LOWER(" not in result.sql
assert "customer_email = 'Arun@ChatterMate.Chat'" in result.sql
assert "customer_email = 'Arun@ReplyPier.Site'" in result.sql
def test_still_fails_closed(self):
result = self._ci(value=None)
@@ -1,5 +1,5 @@
"""
Copyright 2024-2026 ChatterMate
Copyright 2024-2026 ReplyPier
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@@ -1,5 +1,5 @@
"""
Copyright 2024-2026 ChatterMate
Copyright 2024-2026 ReplyPier
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@@ -13,7 +13,7 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
Registering ChatterMate's webhook with Telegram bots — including again for
Registering ReplyPier's webhook with Telegram bots — including again for
an agent's bots when its reply buttons are turned on.
"""
+1 -1
View File
@@ -1,5 +1,5 @@
"""
Copyright 2024-2026 ChatterMate
Copyright 2024-2026 ReplyPier
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@@ -1,5 +1,5 @@
"""
Copyright 2024-2026 ChatterMate
Copyright 2024-2026 ReplyPier
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@@ -1,5 +1,5 @@
"""
Copyright 2024-2026 ChatterMate
Copyright 2024-2026 ReplyPier
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@@ -1,5 +1,5 @@
"""
Copyright 2024-2026 ChatterMate
Copyright 2024-2026 ReplyPier
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
+1 -1
View File
@@ -1,5 +1,5 @@
"""
Copyright 2024-2026 ChatterMate
Copyright 2024-2026 ReplyPier
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@@ -1,5 +1,5 @@
"""
Copyright 2024-2026 ChatterMate
Copyright 2024-2026 ReplyPier
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@@ -23,7 +23,7 @@ from app.services.ticket_privacy import (
scrub_outbound,
)
OWNER_EMAIL = "arun@chattermate.chat"
OWNER_EMAIL = "arun@replypier.site"
OWNER_PHONE = "+441234567890"
@@ -41,7 +41,7 @@ class TestScrubOutbound:
assert scrub_outbound(text, (OWNER_EMAIL,)) == text
def test_own_email_matched_case_insensitively(self):
text = "Your account Arun@ChatterMate.Chat is fixed."
text = "Your account Arun@ReplyPier.Site is fixed."
assert scrub_outbound(text, (OWNER_EMAIL,)) == text
def test_own_phone_survives_reformatting(self):
@@ -1,5 +1,5 @@
"""
Copyright 2024-2026 ChatterMate
Copyright 2024-2026 ReplyPier
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
+1 -1
View File
@@ -1,5 +1,5 @@
"""
Copyright 2024-2026 ChatterMate
Copyright 2024-2026 ReplyPier
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
+1 -1
View File
@@ -1,5 +1,5 @@
"""
Copyright 2024-2026 ChatterMate
Copyright 2024-2026 ReplyPier
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
+1 -1
View File
@@ -1,5 +1,5 @@
"""
Copyright 2024-2026 ChatterMate
Copyright 2024-2026 ReplyPier
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@@ -1,5 +1,5 @@
"""
Copyright 2024-2026 ChatterMate
Copyright 2024-2026 ReplyPier
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@@ -1,5 +1,5 @@
"""
Copyright 2024-2026 ChatterMate
Copyright 2024-2026 ReplyPier
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@@ -1,5 +1,5 @@
"""
Copyright 2024-2026 ChatterMate
Copyright 2024-2026 ReplyPier
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@@ -1,5 +1,5 @@
"""
Copyright 2024-2026 ChatterMate
Copyright 2024-2026 ReplyPier
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
+1 -1
View File
@@ -1,5 +1,5 @@
"""
Copyright 2024-2026 ChatterMate
Copyright 2024-2026 ReplyPier
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@@ -1,5 +1,5 @@
"""
Copyright 2024-2026 ChatterMate
Copyright 2024-2026 ReplyPier
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.