Skip to content

Commit 837ec44

Browse files
feat(#81,#91,#95,#97): mark sunset/EOL providers as deprecated
drift, sendbird, userlike, zendesk-classic each get a JSDoc @deprecated header and a one-shot console.warn on first load() so callers learn the underlying vendor SDK is sunset, discontinued, or on a deprecation timeline before they invest further. Behavior is otherwise unchanged. - drift: Clari + Salesloft sunset announced 2026-03-06 - sendbird: AI Chatbot Widget repo archived 2025-07-09 - userlike: v1 CDN EOL 2026-08-01, vendor rebranded to Lime Connect - zendesk-classic: Web Widget Classic limited to pre-2023-06-05 accounts; underlying Chat SDK in active removal Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 4eb094b commit 837ec44

4 files changed

Lines changed: 65 additions & 0 deletions

File tree

src/providers/drift.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
/**
2+
* @deprecated Drift is being sunset by Clari + Salesloft (announced 2026-03-06,
3+
* ~60–90 day customer wind-down). Drift was taken offline in Sept 2025 after the
4+
* Salesloft OAuth breach. New integrations should pick a different provider.
5+
* See https://github.com/productdevbook/ahize/issues/81 for migration notes.
6+
*/
17
import { waitForDefer } from "../_defer.ts"
28
import { createIdentityStore } from "../_identity.ts"
39
import { createLifecycle, hashConfig } from "../_lifecycle.ts"
@@ -36,6 +42,7 @@ const store = createIdentityStore()
3642
const lifecycle = createLifecycle()
3743
let readyPromise: Promise<void> | undefined
3844
let readyResolve: (() => void) | undefined
45+
let sunsetWarned = false
3946

4047
export interface DriftLoadOptions extends LoadOptions {
4148
embedId: string
@@ -45,6 +52,14 @@ export interface DriftLoadOptions extends LoadOptions {
4552
export async function load(options: DriftLoadOptions): Promise<void> {
4653
if (!isBrowser()) return
4754
if (options.consent === false) return
55+
if (!sunsetWarned) {
56+
sunsetWarned = true
57+
console.warn(
58+
"[ahize/drift] Drift is being sunset by Clari + Salesloft (announced 2026-03-06). " +
59+
"New integrations should pick a different provider. " +
60+
"See https://github.com/productdevbook/ahize/issues/81",
61+
)
62+
}
4863
const h = hashConfig({ embedId: options.embedId })
4964
if (lifecycle.state() === "ready" && lifecycle.configHash() === h) return
5065
if (lifecycle.configHash() && lifecycle.configHash() !== h) await destroy()

src/providers/sendbird.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,14 @@
22
// awkwardly: track() throws, identify() is part of boot options, show()/hide()
33
// are CSS-level. Use Sendbird Desk if you want full support semantics.
44

5+
/**
6+
* @deprecated The Sendbird AI Chatbot Widget product targeted by this wrapper
7+
* was discontinued by Sendbird. The source repo `sendbird/chat-ai-widget` was
8+
* archived 2025-07-09 at v1.9.7 and the AI Chatbot docs were removed from
9+
* sendbird.com. The successor "AI Agent" has a different API surface; Sendbird
10+
* Desk is recommended for support semantics.
11+
* See https://github.com/productdevbook/ahize/issues/91 for migration notes.
12+
*/
513
import { waitForDefer } from "../_defer.ts"
614
import { createIdentityStore } from "../_identity.ts"
715
import { createLifecycle, hashConfig } from "../_lifecycle.ts"
@@ -34,6 +42,7 @@ const store = createIdentityStore()
3442
const lifecycle = createLifecycle()
3543
let currentSettings: SendbirdWidgetSettings | undefined
3644
let trackForwarder: ((event: string, metadata?: EventMetadata) => void) | undefined
45+
let sunsetWarned = false
3746

3847
export class SendbirdUnsupportedError extends AhizeError {
3948
override name = "SendbirdUnsupportedError"
@@ -51,6 +60,14 @@ export interface SendbirdLoadOptions extends LoadOptions {
5160
export async function load(options: SendbirdLoadOptions): Promise<void> {
5261
if (!isBrowser()) return
5362
if (options.consent === false) return
63+
if (!sunsetWarned) {
64+
sunsetWarned = true
65+
console.warn(
66+
"[ahize/sendbird] The Sendbird AI Chatbot Widget product is discontinued " +
67+
"(repo archived 2025-07-09 at v1.9.7). Consider Sendbird Desk or another provider. " +
68+
"See https://github.com/productdevbook/ahize/issues/91",
69+
)
70+
}
5471
const h = hashConfig({
5572
appId: options.applicationId,
5673
botId: options.botId,

src/providers/userlike.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,10 @@
1+
/**
2+
* @deprecated The Userlike v1 CDN bundle (`userlike-cdn-widgets.s3-eu-west-1...`)
3+
* loaded by this wrapper reaches EOL on 2026-08-01. Userlike has rebranded to
4+
* Lime Connect; the v2 SDK (`@userlike/messenger`, `createMessenger({ version: 2 })`)
5+
* has a different surface and is the recommended migration target.
6+
* See https://github.com/productdevbook/ahize/issues/95 for migration notes.
7+
*/
18
import { waitForDefer } from "../_defer.ts"
29
import { createIdentityStore } from "../_identity.ts"
310
import { createLifecycle, hashConfig } from "../_lifecycle.ts"
@@ -41,6 +48,7 @@ function w(): UserlikeWindow {
4148
const queue = createQueue<UserlikeMessenger>()
4249
const store = createIdentityStore()
4350
const lifecycle = createLifecycle()
51+
let sunsetWarned = false
4452

4553
function unwrap<T>(r: UserlikeResult<T>): T {
4654
if (!r.ok) throw new ProviderNotLoadedError(`Userlike error: ${r.error}`)
@@ -54,6 +62,14 @@ export interface UserlikeLoadOptions extends LoadOptions {
5462
export async function load(options: UserlikeLoadOptions): Promise<void> {
5563
if (!isBrowser()) return
5664
if (options.consent === false) return
65+
if (!sunsetWarned) {
66+
sunsetWarned = true
67+
console.warn(
68+
"[ahize/userlike] Userlike v1 CDN reaches EOL on 2026-08-01. " +
69+
"Vendor rebranded to Lime Connect; migrate to @userlike/messenger v2. " +
70+
"See https://github.com/productdevbook/ahize/issues/95",
71+
)
72+
}
5773
const h = hashConfig({ messengerId: options.messengerId })
5874
if (lifecycle.state() === "ready" && lifecycle.configHash() === h) return
5975
if (lifecycle.configHash() && lifecycle.configHash() !== h) await destroy()

src/providers/zendesk-classic.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,13 @@
22
// API surface (zE('webWidget', '...')). Kept separate from ahize/zendesk so
33
// types don't pretend cross-compatibility.
44

5+
/**
6+
* @deprecated Web Widget (Classic) is only available on Zendesk accounts created
7+
* before 2023-06-05. The underlying Chat Web SDK / Chat Conversation APIs entered
8+
* active removal on 2025-04-30. New integrations should use `ahize/zendesk`
9+
* (Messenger).
10+
* See https://github.com/productdevbook/ahize/issues/97 for migration notes.
11+
*/
512
import { waitForDefer } from "../_defer.ts"
613
import { createIdentityStore } from "../_identity.ts"
714
import { createLifecycle, hashConfig } from "../_lifecycle.ts"
@@ -29,6 +36,7 @@ function w(): ZendeskWindow {
2936
const queue = createQueue<ZendeskFn>()
3037
const store = createIdentityStore()
3138
const lifecycle = createLifecycle()
39+
let sunsetWarned = false
3240

3341
export interface ZendeskClassicLoadOptions extends LoadOptions {
3442
key: string
@@ -37,6 +45,15 @@ export interface ZendeskClassicLoadOptions extends LoadOptions {
3745
export async function load(options: ZendeskClassicLoadOptions): Promise<void> {
3846
if (!isBrowser()) return
3947
if (options.consent === false) return
48+
if (!sunsetWarned) {
49+
sunsetWarned = true
50+
console.warn(
51+
"[ahize/zendesk-classic] Web Widget (Classic) is only available on Zendesk " +
52+
"accounts created before 2023-06-05; underlying Chat SDK is being removed. " +
53+
"Use ahize/zendesk (Messenger) for new integrations. " +
54+
"See https://github.com/productdevbook/ahize/issues/97",
55+
)
56+
}
4057
const h = hashConfig({ key: options.key })
4158
if (lifecycle.state() === "ready" && lifecycle.configHash() === h) return
4259
if (lifecycle.configHash() && lifecycle.configHash() !== h) await destroy()

0 commit comments

Comments
 (0)