@uplifted/fixtures 0.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +67 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +42 -0
- package/dist/index.js.map +1 -0
- package/dist/partnerFetch.d.ts +170 -0
- package/dist/partnerFetch.d.ts.map +1 -0
- package/dist/partnerFetch.js +602 -0
- package/dist/partnerFetch.js.map +1 -0
- package/package.json +27 -0
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Synthetic data for the Uplift packages. Every record is invented. Phone numbers use
|
|
3
|
+
* the +15005550xxx Twilio test range so nothing here can reach a real handset.
|
|
4
|
+
*
|
|
5
|
+
* Identity follows plan decision S6: Uplift sees an opaque `hostAccountId` and
|
|
6
|
+
* `hostUserId`, never a GHL location or any host-specific concept.
|
|
7
|
+
*/
|
|
8
|
+
export type Channel = "sms" | "whatsapp";
|
|
9
|
+
export type ClientStatus = "active" | "awaiting_reply" | "quiet" | "new";
|
|
10
|
+
export type Direction = "inbound" | "outbound";
|
|
11
|
+
export type WorkoutEventType = "logged" | "missed" | "moved" | "inactive" | "setLogged" | "started" | "workoutLog" | "working_out" | (string & {});
|
|
12
|
+
export interface FixtureCoach {
|
|
13
|
+
id: string;
|
|
14
|
+
hostAccountId: string;
|
|
15
|
+
hostUserId: string;
|
|
16
|
+
name: string;
|
|
17
|
+
timezone: string;
|
|
18
|
+
subscription: "free" | "active" | "inactive";
|
|
19
|
+
}
|
|
20
|
+
export interface FixtureClient {
|
|
21
|
+
id: string;
|
|
22
|
+
coachId: string;
|
|
23
|
+
name: string;
|
|
24
|
+
phone: string;
|
|
25
|
+
channel: Channel;
|
|
26
|
+
status: ClientStatus;
|
|
27
|
+
lastContactAt: string | null;
|
|
28
|
+
}
|
|
29
|
+
export interface FixtureMessage {
|
|
30
|
+
id: string;
|
|
31
|
+
clientId: string;
|
|
32
|
+
direction: Direction;
|
|
33
|
+
body: string;
|
|
34
|
+
sentAt: string;
|
|
35
|
+
attachments?: Array<{
|
|
36
|
+
url: string;
|
|
37
|
+
mimeType: string;
|
|
38
|
+
type: "image" | "video" | "audio" | "document";
|
|
39
|
+
filename?: string;
|
|
40
|
+
sizeBytes?: number;
|
|
41
|
+
description?: string;
|
|
42
|
+
transcription?: string;
|
|
43
|
+
}>;
|
|
44
|
+
deliveryStatus?: string | null;
|
|
45
|
+
sentViaTemplate?: boolean;
|
|
46
|
+
templateBody?: string | null;
|
|
47
|
+
deliveredViaTapAt?: string | null;
|
|
48
|
+
}
|
|
49
|
+
export interface FixtureWorkoutEvent {
|
|
50
|
+
id: string;
|
|
51
|
+
clientId: string;
|
|
52
|
+
type: WorkoutEventType;
|
|
53
|
+
/** The timeline line. The fake partner API derives it from `data` when a host sends none. */
|
|
54
|
+
title: string;
|
|
55
|
+
occurredAt: string;
|
|
56
|
+
data?: Record<string, unknown>;
|
|
57
|
+
sessionId?: string;
|
|
58
|
+
}
|
|
59
|
+
export declare const coach: FixtureCoach;
|
|
60
|
+
export declare const clients: FixtureClient[];
|
|
61
|
+
export declare const messages: FixtureMessage[];
|
|
62
|
+
export declare const workoutEvents: FixtureWorkoutEvent[];
|
|
63
|
+
export declare function messagesFor(clientId: string): FixtureMessage[];
|
|
64
|
+
export declare function eventsFor(clientId: string): FixtureWorkoutEvent[];
|
|
65
|
+
export { createPartnerFetch, partnerErrorResponse, defaultDrafts, DEFAULT_PROACTIVE_OPTIONS, sanitizeProactiveOptions, FIXTURE_PROACTIVE_ICONS } from "./partnerFetch.js";
|
|
66
|
+
export type { PartnerFetchOptions, PartnerFetchHandle, PartnerFetchState, PartnerRequest, FixtureDraftSet, DraftTone } from "./partnerFetch.js";
|
|
67
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Synthetic data for the Uplift packages. Every record is invented. Phone numbers use
|
|
3
|
+
* the +15005550xxx Twilio test range so nothing here can reach a real handset.
|
|
4
|
+
*
|
|
5
|
+
* Identity follows plan decision S6: Uplift sees an opaque `hostAccountId` and
|
|
6
|
+
* `hostUserId`, never a GHL location or any host-specific concept.
|
|
7
|
+
*/
|
|
8
|
+
export const coach = {
|
|
9
|
+
id: "coach_fx_1",
|
|
10
|
+
hostAccountId: "host_acct_fx_1",
|
|
11
|
+
hostUserId: "host_user_fx_1",
|
|
12
|
+
name: "Sam Rivera",
|
|
13
|
+
timezone: "Australia/Brisbane",
|
|
14
|
+
subscription: "free",
|
|
15
|
+
};
|
|
16
|
+
export const clients = [
|
|
17
|
+
{ id: "client_fx_1", coachId: coach.id, name: "Priya Nair", phone: "+15005550101", channel: "sms", status: "awaiting_reply", lastContactAt: "2026-10-05T22:10:00Z" },
|
|
18
|
+
{ id: "client_fx_2", coachId: coach.id, name: "Tom Okafor", phone: "+15005550102", channel: "whatsapp", status: "active", lastContactAt: "2026-10-06T08:30:00Z" },
|
|
19
|
+
{ id: "client_fx_3", coachId: coach.id, name: "Lena Fischer", phone: "+15005550103", channel: "sms", status: "quiet", lastContactAt: "2026-09-27T11:00:00Z" },
|
|
20
|
+
{ id: "client_fx_4", coachId: coach.id, name: "Marcus Bell", phone: "+15005550104", channel: "sms", status: "new", lastContactAt: null },
|
|
21
|
+
];
|
|
22
|
+
export const messages = [
|
|
23
|
+
{ id: "msg_fx_1", clientId: "client_fx_1", direction: "outbound", body: "Great session yesterday Priya. How are the legs feeling today?", sentAt: "2026-10-05T22:10:00Z" },
|
|
24
|
+
{ id: "msg_fx_2", clientId: "client_fx_2", direction: "outbound", body: "Tom, you moved Thursday to Friday. Still good for 6am?", sentAt: "2026-10-06T08:00:00Z" },
|
|
25
|
+
{ id: "msg_fx_3", clientId: "client_fx_2", direction: "inbound", body: "Yes 6am works. Bringing my own bands this time.", sentAt: "2026-10-06T08:30:00Z" },
|
|
26
|
+
{ id: "msg_fx_4", clientId: "client_fx_3", direction: "outbound", body: "Hey Lena, noticed a quiet week. Anything getting in the way?", sentAt: "2026-09-27T11:00:00Z" },
|
|
27
|
+
];
|
|
28
|
+
export const workoutEvents = [
|
|
29
|
+
{ id: "evt_fx_1", clientId: "client_fx_1", type: "logged", title: "Lower body strength", occurredAt: "2026-10-05T07:45:00Z" },
|
|
30
|
+
{ id: "evt_fx_2", clientId: "client_fx_2", type: "moved", title: "Upper body, Thu to Fri", occurredAt: "2026-10-05T19:20:00Z" },
|
|
31
|
+
{ id: "evt_fx_3", clientId: "client_fx_2", type: "logged", title: "Upper body", occurredAt: "2026-10-06T20:05:00Z" },
|
|
32
|
+
{ id: "evt_fx_4", clientId: "client_fx_3", type: "missed", title: "Conditioning", occurredAt: "2026-10-01T09:00:00Z" },
|
|
33
|
+
{ id: "evt_fx_5", clientId: "client_fx_3", type: "inactive", title: "No activity for 7 days", occurredAt: "2026-10-04T03:00:00Z" },
|
|
34
|
+
];
|
|
35
|
+
export function messagesFor(clientId) {
|
|
36
|
+
return messages.filter((m) => m.clientId === clientId).sort((a, b) => a.sentAt.localeCompare(b.sentAt));
|
|
37
|
+
}
|
|
38
|
+
export function eventsFor(clientId) {
|
|
39
|
+
return workoutEvents.filter((e) => e.clientId === clientId).sort((a, b) => a.occurredAt.localeCompare(b.occurredAt));
|
|
40
|
+
}
|
|
41
|
+
export { createPartnerFetch, partnerErrorResponse, defaultDrafts, DEFAULT_PROACTIVE_OPTIONS, sanitizeProactiveOptions, FIXTURE_PROACTIVE_ICONS } from "./partnerFetch.js";
|
|
42
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* An in-memory implementation of the Uplift partner API served through `fetch`.
|
|
3
|
+
* Package tests and host dev modes pass `createPartnerFetch().fetch` to the sdk so the
|
|
4
|
+
* whole panel runs against the synthetic data in this package, with no server and no
|
|
5
|
+
* real phone numbers. Routes and shapes follow uplift_coach docs/partner-api.openapi.yaml.
|
|
6
|
+
*/
|
|
7
|
+
import { type FixtureClient, type FixtureMessage, type FixtureWorkoutEvent } from "./index.js";
|
|
8
|
+
export type DraftTone = "happy" | "tough" | "inquisitive" | "five_words";
|
|
9
|
+
export type FixtureDraftSet = Record<DraftTone, string>;
|
|
10
|
+
export interface PartnerRequest {
|
|
11
|
+
method: string;
|
|
12
|
+
/** Path below the partner prefix, e.g. `/clients/client_fx_1/thread`. */
|
|
13
|
+
path: string;
|
|
14
|
+
body: unknown;
|
|
15
|
+
headers: Record<string, string>;
|
|
16
|
+
}
|
|
17
|
+
export interface PartnerFetchOptions {
|
|
18
|
+
/** Artificial delay per request, in ms. Default 0. */
|
|
19
|
+
latencyMs?: number;
|
|
20
|
+
/** Return a Response to answer a request yourself (error simulation). Return undefined to fall through. */
|
|
21
|
+
intercept?: (req: PartnerRequest) => Response | undefined | Promise<Response | undefined>;
|
|
22
|
+
/** Draft text per client. Defaults to templates built from the client's first name. */
|
|
23
|
+
drafts?: (client: FixtureClient) => FixtureDraftSet;
|
|
24
|
+
/** Override the seed data. Copies are taken; the fixture arrays are never mutated. */
|
|
25
|
+
/** False mimics a plan without custom AI instructions (Config AI hidden, PUT 403). */
|
|
26
|
+
instructionsCanEdit?: boolean;
|
|
27
|
+
/** True mimics an Enterprise plan (canned answers and phase goals unlocked). */
|
|
28
|
+
enterprise?: boolean;
|
|
29
|
+
seed?: {
|
|
30
|
+
clients?: FixtureClient[];
|
|
31
|
+
messages?: FixtureMessage[];
|
|
32
|
+
events?: FixtureWorkoutEvent[];
|
|
33
|
+
unread?: Record<string, {
|
|
34
|
+
count: number;
|
|
35
|
+
messages: number;
|
|
36
|
+
updates: number;
|
|
37
|
+
drafts: FixtureDraftSet | null;
|
|
38
|
+
}>;
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
export interface PartnerFetchState {
|
|
42
|
+
clients: FixtureClient[];
|
|
43
|
+
messages: FixtureMessage[];
|
|
44
|
+
events: FixtureWorkoutEvent[];
|
|
45
|
+
/** Idempotency-Key -> first send result. */
|
|
46
|
+
sends: Map<string, Record<string, unknown>>;
|
|
47
|
+
/** Storage keys PUT through the fake presigned URLs. */
|
|
48
|
+
uploads: string[];
|
|
49
|
+
/** The coach's custom ✨ options, or null for the built-ins. */
|
|
50
|
+
proactiveOptions: FixtureProactiveOption[] | null;
|
|
51
|
+
/** Per client: unread count and the reply drafts prepared when they last wrote. Cleared by POST /clients/:id/read. */
|
|
52
|
+
unread: Map<string, {
|
|
53
|
+
count: number;
|
|
54
|
+
messages: number;
|
|
55
|
+
updates: number;
|
|
56
|
+
drafts: FixtureDraftSet | null;
|
|
57
|
+
}>;
|
|
58
|
+
/** Per client: WhatsApp 24h window state (sms clients ignore it). */
|
|
59
|
+
whatsappWindow: Map<string, {
|
|
60
|
+
open: boolean;
|
|
61
|
+
lastInboundAt: string | null;
|
|
62
|
+
}>;
|
|
63
|
+
/** Per outbound message id: carrier status sequence to play back on each status poll. */
|
|
64
|
+
deliveryStatus: Map<string, string[]>;
|
|
65
|
+
/** Per thread item id: reply options already generated for it (native InlineDrafts). */
|
|
66
|
+
itemDrafts: Map<string, FixtureDraftSet>;
|
|
67
|
+
/** The coach's custom AI instructions per surface; `canEdit` mirrors the native entitlement. */
|
|
68
|
+
instructions: Record<string, string>;
|
|
69
|
+
instructionsCanEdit: boolean;
|
|
70
|
+
/** Native AI Config: what the plan allows, and the stored values. */
|
|
71
|
+
entitlements: {
|
|
72
|
+
philosophy: boolean;
|
|
73
|
+
instructions: boolean;
|
|
74
|
+
messageExamples: boolean;
|
|
75
|
+
cannedAnswers: boolean;
|
|
76
|
+
phaseGoals: boolean;
|
|
77
|
+
};
|
|
78
|
+
philosophy: string;
|
|
79
|
+
messageExamples: Array<{
|
|
80
|
+
id: string;
|
|
81
|
+
inputs: string[];
|
|
82
|
+
response: string;
|
|
83
|
+
source: "manual" | "auto" | "generated";
|
|
84
|
+
generated?: string;
|
|
85
|
+
scenario?: string;
|
|
86
|
+
createdAt: string;
|
|
87
|
+
updatedAt: string;
|
|
88
|
+
}>;
|
|
89
|
+
cannedAnswers: Array<{
|
|
90
|
+
id: string;
|
|
91
|
+
questionDescription: string;
|
|
92
|
+
cannedResponse: string;
|
|
93
|
+
createdAt: string;
|
|
94
|
+
updatedAt: string;
|
|
95
|
+
}>;
|
|
96
|
+
phaseGoal: string | null;
|
|
97
|
+
domain: {
|
|
98
|
+
role: string;
|
|
99
|
+
clientNoun: string;
|
|
100
|
+
clientNounPlural: string;
|
|
101
|
+
sessionNoun: string;
|
|
102
|
+
domainContext: string;
|
|
103
|
+
};
|
|
104
|
+
/** The coach's plan. POST /billing/checkout never changes it; set it to "active" to play the Stripe webhook. */
|
|
105
|
+
subscription: "free" | "active" | "inactive";
|
|
106
|
+
/** Checkout sessions handed out. */
|
|
107
|
+
checkouts: string[];
|
|
108
|
+
/** What GET /accounts/me reports as billing dates once paid. */
|
|
109
|
+
billing: {
|
|
110
|
+
renewsAt: string | null;
|
|
111
|
+
cancelsAt: string | null;
|
|
112
|
+
} | null;
|
|
113
|
+
/** Portal sessions handed out. */
|
|
114
|
+
portals: string[];
|
|
115
|
+
/** What GET /billing/plan returns (the Stripe price). */
|
|
116
|
+
plan: {
|
|
117
|
+
amount: number;
|
|
118
|
+
currency: string;
|
|
119
|
+
interval: "day" | "week" | "month" | "year" | null;
|
|
120
|
+
intervalCount: number;
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
/** Native constants/voiceScenarios.js labels (hints shortened). */
|
|
124
|
+
export declare const FIXTURE_VOICE_SCENARIOS: {
|
|
125
|
+
key: string;
|
|
126
|
+
label: string;
|
|
127
|
+
hint: string;
|
|
128
|
+
}[];
|
|
129
|
+
export declare const FIXTURE_PHASE_GOAL_DEFAULT = "Your strategic goal is retention through genuine connection.";
|
|
130
|
+
export interface FixtureAttachment {
|
|
131
|
+
url: string;
|
|
132
|
+
mimeType: string;
|
|
133
|
+
type: "image" | "video" | "audio" | "document";
|
|
134
|
+
filename?: string;
|
|
135
|
+
sizeBytes?: number;
|
|
136
|
+
}
|
|
137
|
+
/** Where fixture presigned PUTs point, and the "owned media" prefix sends must use. */
|
|
138
|
+
export declare const FIXTURE_UPLOAD_HOST = "https://uploads.fixture.local";
|
|
139
|
+
export interface FixtureProactiveOption {
|
|
140
|
+
id: string;
|
|
141
|
+
label: string;
|
|
142
|
+
icon: string;
|
|
143
|
+
prompt: string | null;
|
|
144
|
+
cannedText: string | null;
|
|
145
|
+
}
|
|
146
|
+
export declare const FIXTURE_PROACTIVE_ICONS: string[];
|
|
147
|
+
/** Native DEFAULT_PROACTIVE_OPTIONS, verbatim. */
|
|
148
|
+
export declare const DEFAULT_PROACTIVE_OPTIONS: FixtureProactiveOption[];
|
|
149
|
+
/** Native sanitizeProactiveOptions, same rules and messages. */
|
|
150
|
+
export declare function sanitizeProactiveOptions(input: unknown): {
|
|
151
|
+
options: FixtureProactiveOption[];
|
|
152
|
+
} | {
|
|
153
|
+
error: string;
|
|
154
|
+
};
|
|
155
|
+
export declare const FIXTURE_MEDIA_PREFIX = "https://media.fixture.local/";
|
|
156
|
+
export interface PartnerFetchHandle {
|
|
157
|
+
fetch: typeof fetch;
|
|
158
|
+
/** Every request seen, oldest first. */
|
|
159
|
+
calls: PartnerRequest[];
|
|
160
|
+
state: PartnerFetchState;
|
|
161
|
+
/** Push a server-sent event to every open GET /stream (e.g. emit("client_changed", { clientId, action: "upsert" })). */
|
|
162
|
+
emit: (type: string, data: unknown) => void;
|
|
163
|
+
/** Open streams right now. */
|
|
164
|
+
openStreams: () => number;
|
|
165
|
+
}
|
|
166
|
+
/** Build a partner API error response `{ error: { code, message, retryable, ...extra } }`. */
|
|
167
|
+
export declare function partnerErrorResponse(status: number, code: string, message: string, extra?: Record<string, unknown>): Response;
|
|
168
|
+
export declare function defaultDrafts(client: FixtureClient): FixtureDraftSet;
|
|
169
|
+
export declare function createPartnerFetch(opts?: PartnerFetchOptions): PartnerFetchHandle;
|
|
170
|
+
//# sourceMappingURL=partnerFetch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"partnerFetch.d.ts","sourceRoot":"","sources":["../src/partnerFetch.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,602 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* An in-memory implementation of the Uplift partner API served through `fetch`.
|
|
3
|
+
* Package tests and host dev modes pass `createPartnerFetch().fetch` to the sdk so the
|
|
4
|
+
* whole panel runs against the synthetic data in this package, with no server and no
|
|
5
|
+
* real phone numbers. Routes and shapes follow uplift_coach docs/partner-api.openapi.yaml.
|
|
6
|
+
*/
|
|
7
|
+
import { clients as baseClients, coach as baseCoach, messages as baseMessages, workoutEvents as baseEvents, } from "./index.js";
|
|
8
|
+
const PREFIX = "/api/partner/v1";
|
|
9
|
+
/** Native constants/voiceScenarios.js labels (hints shortened). */
|
|
10
|
+
export const FIXTURE_VOICE_SCENARIOS = [
|
|
11
|
+
{ key: "workout_completed", label: "They completed a workout", hint: "A full session logged." },
|
|
12
|
+
{ key: "exercise_logged", label: "They logged an exercise", hint: "One exercise or set logged." },
|
|
13
|
+
{ key: "habit_logged", label: "They logged a habit", hint: "A habit ticked off." },
|
|
14
|
+
{ key: "personal_best", label: "They hit a PR", hint: "A new personal best." },
|
|
15
|
+
{ key: "no_activity_6h", label: "No activity for 6 hours", hint: "Quiet since this morning." },
|
|
16
|
+
{ key: "no_activity_24h", label: "No activity for 24 hours", hint: "A day without logging." },
|
|
17
|
+
{ key: "no_activity_48h", label: "No activity for 48 hours", hint: "Two quiet days." },
|
|
18
|
+
{ key: "check_in", label: "Routine check-in", hint: "Nothing happened; you just check in." },
|
|
19
|
+
{ key: "struggling", label: "They are struggling or demotivated", hint: "They said it's hard." },
|
|
20
|
+
{ key: "call_out", label: "They need a push", hint: "Time for some accountability." },
|
|
21
|
+
{ key: "nutrition_slip", label: "They went off plan", hint: "Food or routine slipped." },
|
|
22
|
+
{ key: "good_news", label: "Celebrating something", hint: "Life news worth a cheer." },
|
|
23
|
+
];
|
|
24
|
+
export const FIXTURE_PHASE_GOAL_DEFAULT = "Your strategic goal is retention through genuine connection.";
|
|
25
|
+
/** Where fixture presigned PUTs point, and the "owned media" prefix sends must use. */
|
|
26
|
+
export const FIXTURE_UPLOAD_HOST = "https://uploads.fixture.local";
|
|
27
|
+
export const FIXTURE_PROACTIVE_ICONS = ["timer", "target", "bar-chart", "flame", "calendar", "refresh", "clipboard-list", "message-circle", "heart", "trophy", "dumbbell", "apple", "moon", "sun", "bell", "zap", "star", "thumbs-up"];
|
|
28
|
+
/** Native DEFAULT_PROACTIVE_OPTIONS, verbatim. */
|
|
29
|
+
export const DEFAULT_PROACTIVE_OPTIONS = [
|
|
30
|
+
{ id: "check_in", label: "Check In", icon: "timer", prompt: "Check in with client depending on the time of day", cannedText: null },
|
|
31
|
+
{ id: "game_plan", label: "Game Plan", icon: "target", prompt: "Invite the client to articulate their plan for the day or to achieve their weekly goals", cannedText: null },
|
|
32
|
+
{ id: "status", label: "Status Review", icon: "bar-chart", prompt: "Share details with the client regarding their goals and engagement and progress report", cannedText: null },
|
|
33
|
+
{ id: "call_out", label: "Call Out", icon: "flame", prompt: "Inspire the client to action with a tough love callout", cannedText: null },
|
|
34
|
+
{ id: "schedule", label: "Schedule", icon: "calendar", prompt: "Remind the client to book a video call", cannedText: null },
|
|
35
|
+
{ id: "follow_up", label: "Follow Up", icon: "refresh", prompt: "Follow up on last sent message", cannedText: null },
|
|
36
|
+
];
|
|
37
|
+
const slugify = (label) => label.toLowerCase().replace(/[^a-z0-9]+/g, "_").replace(/^_+|_+$/g, "").slice(0, 40) || "option";
|
|
38
|
+
/** Native sanitizeProactiveOptions, same rules and messages. */
|
|
39
|
+
export function sanitizeProactiveOptions(input) {
|
|
40
|
+
if (!Array.isArray(input))
|
|
41
|
+
return { error: "options must be an array" };
|
|
42
|
+
if (input.length === 0)
|
|
43
|
+
return { error: "At least one option is required" };
|
|
44
|
+
if (input.length > 10)
|
|
45
|
+
return { error: "At most 10 options" };
|
|
46
|
+
const options = [];
|
|
47
|
+
const seen = new Set();
|
|
48
|
+
for (const raw of input) {
|
|
49
|
+
const label = typeof raw?.label === "string" ? raw.label.trim() : "";
|
|
50
|
+
if (!label)
|
|
51
|
+
return { error: "Every option needs a label" };
|
|
52
|
+
if (label.length > 24)
|
|
53
|
+
return { error: "Labels must be 24 characters or fewer" };
|
|
54
|
+
const icon = typeof raw?.icon === "string" ? raw.icon.trim() : "";
|
|
55
|
+
if (!FIXTURE_PROACTIVE_ICONS.includes(icon))
|
|
56
|
+
return { error: `"${label}": unknown icon` };
|
|
57
|
+
const prompt = typeof raw?.prompt === "string" ? raw.prompt.trim().slice(0, 500) : "";
|
|
58
|
+
const cannedText = typeof raw?.cannedText === "string" ? raw.cannedText.trim().slice(0, 2000) : "";
|
|
59
|
+
if (!prompt && !cannedText)
|
|
60
|
+
return { error: `"${label}" needs AI guidance or an exact message` };
|
|
61
|
+
let id = typeof raw?.id === "string" && raw.id.trim() ? raw.id.trim() : slugify(label);
|
|
62
|
+
let n = 2;
|
|
63
|
+
const base = id;
|
|
64
|
+
while (seen.has(id))
|
|
65
|
+
id = `${base}_${n++}`;
|
|
66
|
+
seen.add(id);
|
|
67
|
+
options.push({ id, label, icon, prompt: prompt || null, cannedText: cannedText || null });
|
|
68
|
+
}
|
|
69
|
+
return { options };
|
|
70
|
+
}
|
|
71
|
+
export const FIXTURE_MEDIA_PREFIX = "https://media.fixture.local/";
|
|
72
|
+
/** Build a partner API error response `{ error: { code, message, retryable, ...extra } }`. */
|
|
73
|
+
export function partnerErrorResponse(status, code, message, extra = {}) {
|
|
74
|
+
const retryable = typeof extra["retryable"] === "boolean" ? extra["retryable"] : status === 429 || status >= 500;
|
|
75
|
+
return json(status, { error: { code, message, retryable, ...extra } });
|
|
76
|
+
}
|
|
77
|
+
export function defaultDrafts(client) {
|
|
78
|
+
const first = client.name.split(" ")[0] ?? client.name;
|
|
79
|
+
return {
|
|
80
|
+
happy: `Nice work this week ${first}. Keep that momentum going into the next session.`,
|
|
81
|
+
tough: `${first}, the plan only works if you show up. Next session, no excuses.`,
|
|
82
|
+
inquisitive: `How did the last session feel, ${first}? Anything I should adjust?`,
|
|
83
|
+
five_words: `Great week ${first}, keep going.`,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
export function createPartnerFetch(opts = {}) {
|
|
87
|
+
const state = {
|
|
88
|
+
clients: (opts.seed?.clients ?? baseClients).map((c) => ({ ...c })),
|
|
89
|
+
messages: (opts.seed?.messages ?? baseMessages).map((m) => ({ ...m })),
|
|
90
|
+
events: (opts.seed?.events ?? baseEvents).map((e) => ({ ...e })),
|
|
91
|
+
sends: new Map(),
|
|
92
|
+
uploads: [],
|
|
93
|
+
proactiveOptions: null,
|
|
94
|
+
unread: new Map(opts.seed?.unread ? Object.entries(opts.seed.unread) : []),
|
|
95
|
+
whatsappWindow: new Map(),
|
|
96
|
+
deliveryStatus: new Map(),
|
|
97
|
+
itemDrafts: new Map(),
|
|
98
|
+
instructions: { all: "", message: "", update: "", aggregate: "", bulk: "", proactive: "" },
|
|
99
|
+
instructionsCanEdit: opts.instructionsCanEdit ?? true,
|
|
100
|
+
entitlements: { philosophy: true, instructions: opts.instructionsCanEdit ?? true, messageExamples: true, cannedAnswers: opts.enterprise ?? false, phaseGoals: opts.enterprise ?? false },
|
|
101
|
+
philosophy: "",
|
|
102
|
+
messageExamples: [],
|
|
103
|
+
cannedAnswers: [],
|
|
104
|
+
phaseGoal: null,
|
|
105
|
+
domain: { role: "coach", clientNoun: "client", clientNounPlural: "clients", sessionNoun: "session", domainContext: "" },
|
|
106
|
+
subscription: baseCoach.subscription,
|
|
107
|
+
checkouts: [],
|
|
108
|
+
billing: null,
|
|
109
|
+
portals: [],
|
|
110
|
+
plan: { amount: 2900, currency: "usd", interval: "month", intervalCount: 1 },
|
|
111
|
+
};
|
|
112
|
+
const calls = [];
|
|
113
|
+
const streams = new Set();
|
|
114
|
+
const enc = new TextEncoder();
|
|
115
|
+
const draftsFor = opts.drafts ?? defaultDrafts;
|
|
116
|
+
let counter = 0;
|
|
117
|
+
const nextId = (prefix) => `${prefix}_local_${++counter}`;
|
|
118
|
+
const impl = async (input, init) => {
|
|
119
|
+
const url = new URL(typeof input === "string" ? input : input instanceof URL ? input.href : input.url, "http://fixture.local");
|
|
120
|
+
const method = (init?.method ?? "GET").toUpperCase();
|
|
121
|
+
// The presigned PUT goes to storage, not the API: accept it here so uploads work offline.
|
|
122
|
+
if (method === "PUT" && url.href.startsWith(`${FIXTURE_UPLOAD_HOST}/put/`)) {
|
|
123
|
+
calls.push({ method, path: url.pathname, headers: lowerHeaders(init?.headers), body: null });
|
|
124
|
+
state.uploads.push(url.pathname.slice("/put/".length));
|
|
125
|
+
return new Response(null, { status: 200 });
|
|
126
|
+
}
|
|
127
|
+
const headers = lowerHeaders(init?.headers);
|
|
128
|
+
const body = typeof init?.body === "string" && init.body ? safeParse(init.body) : null;
|
|
129
|
+
if (!url.pathname.startsWith(PREFIX))
|
|
130
|
+
return json(404, { error: { code: "not_found", message: `No route ${url.pathname}`, retryable: false } });
|
|
131
|
+
const path = url.pathname.slice(PREFIX.length) || "/";
|
|
132
|
+
const req = { method, path, body, headers };
|
|
133
|
+
calls.push(req);
|
|
134
|
+
if (opts.latencyMs)
|
|
135
|
+
await new Promise((r) => setTimeout(r, opts.latencyMs));
|
|
136
|
+
if (opts.intercept) {
|
|
137
|
+
const hit = await opts.intercept(req);
|
|
138
|
+
if (hit)
|
|
139
|
+
return hit;
|
|
140
|
+
}
|
|
141
|
+
if (!headers["authorization"]?.startsWith("Bearer ")) {
|
|
142
|
+
return partnerErrorResponse(401, "unauthorized", "Missing partner API key");
|
|
143
|
+
}
|
|
144
|
+
const seg = path.split("/").filter(Boolean);
|
|
145
|
+
// E6: a lapsed plan with more than the free 2 clients refuses sends and coach-requested drafts.
|
|
146
|
+
const coachAction = method === "POST" && (path === "/drafts/preview" || (seg[0] === "clients" && (seg[2] === "messages" || seg[2] === "drafts" || (seg[2] === "events" && seg[4] === "drafts"))));
|
|
147
|
+
if (coachAction && state.subscription === "inactive" && state.clients.length > 2) {
|
|
148
|
+
return partnerErrorResponse(402, "plan_inactive", `Your paid plan has ended. Reactivate it to message and draft for your ${state.clients.length} clients.`, { details: { current: state.clients.length, freeLimit: 2 } });
|
|
149
|
+
}
|
|
150
|
+
if (method === "GET" && path === "/accounts/me")
|
|
151
|
+
return json(200, coachPayload(state));
|
|
152
|
+
if (method === "POST" && path === "/accounts")
|
|
153
|
+
return json(200, coachPayload(state));
|
|
154
|
+
if (method === "GET" && path === "/billing/plan")
|
|
155
|
+
return json(200, state.plan);
|
|
156
|
+
if (method === "POST" && path === "/billing/portal") {
|
|
157
|
+
if (!state.billing)
|
|
158
|
+
return partnerErrorResponse(404, "not_found", "This coach has no billing account yet");
|
|
159
|
+
const url = `https://billing.stripe.test/p/${state.portals.length + 1}`;
|
|
160
|
+
state.portals.push(url);
|
|
161
|
+
return json(200, { url });
|
|
162
|
+
}
|
|
163
|
+
if (method === "POST" && path === "/billing/checkout") {
|
|
164
|
+
if (state.subscription === "active")
|
|
165
|
+
return partnerErrorResponse(409, "conflict", "This coach already has an active plan", { details: { reason: "already_active" } });
|
|
166
|
+
const url = `https://checkout.stripe.test/c/${state.checkouts.length + 1}`;
|
|
167
|
+
state.checkouts.push(url);
|
|
168
|
+
return json(200, { url, expiresAt: null });
|
|
169
|
+
}
|
|
170
|
+
if (path === "/clients") {
|
|
171
|
+
if (method === "GET")
|
|
172
|
+
return json(200, { clients: state.clients.map((c) => clientPayload(c, state)).sort(byRecency) });
|
|
173
|
+
if (method === "POST") {
|
|
174
|
+
const b = (body ?? {});
|
|
175
|
+
if (!b.name || !b.phone || !b.channel)
|
|
176
|
+
return partnerErrorResponse(400, "invalid_request", "name, phone and channel are required");
|
|
177
|
+
if (state.clients.some((c) => c.phone === b.phone))
|
|
178
|
+
return partnerErrorResponse(409, "conflict", "A client with this phone already exists");
|
|
179
|
+
const created = { id: nextId("client"), coachId: baseCoach.id, name: b.name, phone: b.phone, channel: b.channel, status: "new", lastContactAt: null };
|
|
180
|
+
state.clients.push(created);
|
|
181
|
+
return json(201, clientPayload(created, state));
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
if (method === "GET" && path === "/stream") {
|
|
185
|
+
let ctl = null;
|
|
186
|
+
const body = new ReadableStream({
|
|
187
|
+
start(c) { ctl = c; streams.add(c); c.enqueue(enc.encode(`event: connected\ndata: ${JSON.stringify({ at: new Date().toISOString() })}\n\n`)); },
|
|
188
|
+
cancel() { if (ctl)
|
|
189
|
+
streams.delete(ctl); },
|
|
190
|
+
});
|
|
191
|
+
init?.signal?.addEventListener("abort", () => { if (ctl) {
|
|
192
|
+
streams.delete(ctl);
|
|
193
|
+
try {
|
|
194
|
+
ctl.close();
|
|
195
|
+
}
|
|
196
|
+
catch { /* closed */ }
|
|
197
|
+
} });
|
|
198
|
+
return new Response(body, { status: 200, headers: { "content-type": "text/event-stream" } });
|
|
199
|
+
}
|
|
200
|
+
if (path === "/account/ai-settings" && method === "GET") {
|
|
201
|
+
return json(200, {
|
|
202
|
+
entitlements: effectiveEntitlements(state),
|
|
203
|
+
philosophy: state.philosophy,
|
|
204
|
+
instructions: { values: { ...state.instructions }, surfaces: Object.keys(state.instructions), maxLength: 1500 },
|
|
205
|
+
messageExamples: state.messageExamples.slice().sort((a, b) => b.createdAt.localeCompare(a.createdAt)),
|
|
206
|
+
voiceScenarios: FIXTURE_VOICE_SCENARIOS,
|
|
207
|
+
cannedAnswers: state.cannedAnswers.slice().sort((a, b) => b.createdAt.localeCompare(a.createdAt)),
|
|
208
|
+
phaseGoal: { content: state.phaseGoal ?? FIXTURE_PHASE_GOAL_DEFAULT, isDefault: state.phaseGoal === null, default: FIXTURE_PHASE_GOAL_DEFAULT },
|
|
209
|
+
domain: { ...state.domain },
|
|
210
|
+
});
|
|
211
|
+
}
|
|
212
|
+
{
|
|
213
|
+
const locked = (key, plan) => (effectiveEntitlements(state)[key] ? null : partnerErrorResponse(403, "forbidden", `Not included in this plan. Available on ${plan} and above.`));
|
|
214
|
+
const now = () => new Date().toISOString();
|
|
215
|
+
const b = (body ?? {});
|
|
216
|
+
if (path === "/account/philosophy" && method === "PUT") {
|
|
217
|
+
if (typeof b.content !== "string")
|
|
218
|
+
return partnerErrorResponse(400, "invalid_request", "content must be a string");
|
|
219
|
+
const l = locked("philosophy", "Starter");
|
|
220
|
+
if (l)
|
|
221
|
+
return l;
|
|
222
|
+
state.philosophy = b.content;
|
|
223
|
+
return json(200, { content: b.content });
|
|
224
|
+
}
|
|
225
|
+
if (path === "/account/phase-goal" && method === "PUT") {
|
|
226
|
+
if (typeof b.content !== "string")
|
|
227
|
+
return partnerErrorResponse(400, "invalid_request", "content must be a string");
|
|
228
|
+
const l = locked("phaseGoals", "Enterprise");
|
|
229
|
+
if (l)
|
|
230
|
+
return l;
|
|
231
|
+
state.phaseGoal = b.content.trim();
|
|
232
|
+
return json(200, { content: state.phaseGoal });
|
|
233
|
+
}
|
|
234
|
+
if (path === "/account/domain" && method === "PUT") {
|
|
235
|
+
const out = {};
|
|
236
|
+
for (const k of Object.keys(state.domain))
|
|
237
|
+
if (typeof b[k] === "string") {
|
|
238
|
+
state.domain[k] = b[k].trim();
|
|
239
|
+
out[k] = state.domain[k];
|
|
240
|
+
}
|
|
241
|
+
if (!Object.keys(out).length)
|
|
242
|
+
return partnerErrorResponse(400, "invalid_request", "Send at least one field");
|
|
243
|
+
return json(200, out);
|
|
244
|
+
}
|
|
245
|
+
const ex = path.match(/^\/account\/message-examples(?:\/([^/]+))?$/);
|
|
246
|
+
if (ex) {
|
|
247
|
+
const l = method === "GET" ? null : locked("messageExamples", "Starter");
|
|
248
|
+
if (method === "POST" && !ex[1]) {
|
|
249
|
+
const inputs = Array.isArray(b.inputs) ? b.inputs.map((i) => i.trim()).filter(Boolean) : null;
|
|
250
|
+
const scenario = typeof b.scenario === "string" ? b.scenario : undefined;
|
|
251
|
+
if (!inputs || typeof b.response !== "string" || !b.response.trim())
|
|
252
|
+
return partnerErrorResponse(400, "invalid_request", "inputs (string[]) and a non-empty response are required");
|
|
253
|
+
if (scenario && !FIXTURE_VOICE_SCENARIOS.some((v) => v.key === scenario))
|
|
254
|
+
return partnerErrorResponse(400, "invalid_request", `Unknown scenario: ${scenario}`);
|
|
255
|
+
if (!scenario && inputs.length === 0)
|
|
256
|
+
return partnerErrorResponse(400, "invalid_request", "Give at least one client input, or a scenario");
|
|
257
|
+
if (l)
|
|
258
|
+
return l;
|
|
259
|
+
const e = { id: `ex_${state.messageExamples.length + 1}_${Date.now()}`, inputs, response: b.response, source: "manual", ...(scenario ? { scenario } : {}), createdAt: now(), updatedAt: now() };
|
|
260
|
+
state.messageExamples.push(e);
|
|
261
|
+
return json(201, e);
|
|
262
|
+
}
|
|
263
|
+
const e = ex[1] ? state.messageExamples.find((x) => x.id === ex[1]) : undefined;
|
|
264
|
+
if (ex[1] && method === "PUT") {
|
|
265
|
+
if (l)
|
|
266
|
+
return l;
|
|
267
|
+
if (!e)
|
|
268
|
+
return partnerErrorResponse(404, "not_found", "Message example not found");
|
|
269
|
+
if (Array.isArray(b.inputs))
|
|
270
|
+
e.inputs = b.inputs.map((i) => i.trim()).filter(Boolean);
|
|
271
|
+
if (typeof b.response === "string")
|
|
272
|
+
e.response = b.response;
|
|
273
|
+
if (b.source === "manual")
|
|
274
|
+
e.source = "manual";
|
|
275
|
+
e.updatedAt = now();
|
|
276
|
+
return json(200, { ...e });
|
|
277
|
+
}
|
|
278
|
+
if (ex[1] && method === "DELETE") {
|
|
279
|
+
if (l)
|
|
280
|
+
return l;
|
|
281
|
+
if (!e)
|
|
282
|
+
return partnerErrorResponse(404, "not_found", "Message example not found");
|
|
283
|
+
state.messageExamples = state.messageExamples.filter((x) => x !== e);
|
|
284
|
+
return new Response(null, { status: 204 });
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
const ca = path.match(/^\/account\/canned-answers(?:\/([^/]+))?$/);
|
|
288
|
+
if (ca) {
|
|
289
|
+
const l = locked("cannedAnswers", "Enterprise");
|
|
290
|
+
if (method === "POST" && !ca[1]) {
|
|
291
|
+
const q = typeof b.questionDescription === "string" ? b.questionDescription.trim() : "";
|
|
292
|
+
const a = typeof b.cannedResponse === "string" ? b.cannedResponse.trim() : "";
|
|
293
|
+
if (!q || !a)
|
|
294
|
+
return partnerErrorResponse(400, "invalid_request", "questionDescription and cannedResponse are required");
|
|
295
|
+
if (l)
|
|
296
|
+
return l;
|
|
297
|
+
const item = { id: `ca_${state.cannedAnswers.length + 1}_${Date.now()}`, questionDescription: q, cannedResponse: a, createdAt: now(), updatedAt: now() };
|
|
298
|
+
state.cannedAnswers.push(item);
|
|
299
|
+
return json(201, item);
|
|
300
|
+
}
|
|
301
|
+
const item = ca[1] ? state.cannedAnswers.find((x) => x.id === ca[1]) : undefined;
|
|
302
|
+
if (ca[1] && method === "PUT") {
|
|
303
|
+
if (l)
|
|
304
|
+
return l;
|
|
305
|
+
if (!item)
|
|
306
|
+
return partnerErrorResponse(404, "not_found", "Canned answer not found");
|
|
307
|
+
if (typeof b.questionDescription === "string")
|
|
308
|
+
item.questionDescription = b.questionDescription.trim();
|
|
309
|
+
if (typeof b.cannedResponse === "string")
|
|
310
|
+
item.cannedResponse = b.cannedResponse.trim();
|
|
311
|
+
item.updatedAt = now();
|
|
312
|
+
return json(200, { ...item });
|
|
313
|
+
}
|
|
314
|
+
if (ca[1] && method === "DELETE") {
|
|
315
|
+
if (l)
|
|
316
|
+
return l;
|
|
317
|
+
if (!item)
|
|
318
|
+
return partnerErrorResponse(404, "not_found", "Canned answer not found");
|
|
319
|
+
state.cannedAnswers = state.cannedAnswers.filter((x) => x !== item);
|
|
320
|
+
return new Response(null, { status: 204 });
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
if (path === "/account/instructions") {
|
|
325
|
+
const view = () => ({ instructions: { ...state.instructions }, surfaces: Object.keys(state.instructions), maxLength: 1500, canEdit: state.instructionsCanEdit });
|
|
326
|
+
if (method === "GET")
|
|
327
|
+
return json(200, view());
|
|
328
|
+
if (method === "PUT") {
|
|
329
|
+
const b = (body ?? {});
|
|
330
|
+
if (typeof b.surface !== "string" || !(b.surface in state.instructions))
|
|
331
|
+
return partnerErrorResponse(400, "invalid_request", "unknown surface");
|
|
332
|
+
if (typeof b.content !== "string")
|
|
333
|
+
return partnerErrorResponse(400, "invalid_request", "content must be a string");
|
|
334
|
+
if (!state.instructionsCanEdit)
|
|
335
|
+
return partnerErrorResponse(403, "forbidden", "Custom AI instructions are not included in this plan");
|
|
336
|
+
state.instructions[b.surface] = b.content.trim().slice(0, 1500);
|
|
337
|
+
return json(200, view());
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
if (path === "/account/proactive-options") {
|
|
341
|
+
if (method === "GET")
|
|
342
|
+
return json(200, { options: state.proactiveOptions ?? DEFAULT_PROACTIVE_OPTIONS, isCustom: !!state.proactiveOptions });
|
|
343
|
+
if (method === "PUT") {
|
|
344
|
+
const b = (body ?? {});
|
|
345
|
+
if (b.options === null || b.options === undefined) {
|
|
346
|
+
state.proactiveOptions = null;
|
|
347
|
+
return json(200, { options: DEFAULT_PROACTIVE_OPTIONS, isCustom: false });
|
|
348
|
+
}
|
|
349
|
+
const r = sanitizeProactiveOptions(b.options);
|
|
350
|
+
if ("error" in r)
|
|
351
|
+
return partnerErrorResponse(400, "invalid_request", r.error, { details: { field: "options" } });
|
|
352
|
+
state.proactiveOptions = r.options;
|
|
353
|
+
return json(200, { options: r.options, isCustom: true });
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
// Media presign: a fake PUT target and a public URL under the fixture bucket prefix.
|
|
357
|
+
if (method === "POST" && path === "/media/upload-url") {
|
|
358
|
+
const b = (body ?? {});
|
|
359
|
+
if (typeof b.contentType !== "string" || !b.contentType)
|
|
360
|
+
return partnerErrorResponse(400, "invalid_request", "contentType is required", { details: { field: "contentType" } });
|
|
361
|
+
const mt = b.contentType.split(";")[0].trim().toLowerCase();
|
|
362
|
+
const type = mt.startsWith("image/") ? "image" : mt.startsWith("video/") ? "video" : mt.startsWith("audio/") ? "audio" : mt === "application/pdf" ? "document" : null;
|
|
363
|
+
if (!type)
|
|
364
|
+
return partnerErrorResponse(400, "invalid_request", "Unsupported media type", { details: { field: "contentType" } });
|
|
365
|
+
if (typeof b.sizeBytes === "number" && b.sizeBytes > 16 * 1024 * 1024)
|
|
366
|
+
return partnerErrorResponse(400, "invalid_request", "File exceeds the 16MB limit", { details: { field: "sizeBytes", max: 16 * 1024 * 1024 } });
|
|
367
|
+
const ext = type === "image" ? "jpg" : type === "video" ? "mp4" : type === "audio" ? "m4a" : "pdf";
|
|
368
|
+
const key = `public/message-media/${typeof b.clientId === "string" ? b.clientId : "coach"}/${nextId("media")}.${ext}`;
|
|
369
|
+
return json(200, { uploadUrl: `${FIXTURE_UPLOAD_HOST}/put/${key}`, publicUrl: `${FIXTURE_MEDIA_PREFIX}${key}`, key, type });
|
|
370
|
+
}
|
|
371
|
+
if (method === "POST" && path === "/drafts/preview") {
|
|
372
|
+
const b = (body ?? {});
|
|
373
|
+
if (typeof b.clientName !== "string" || !b.clientName.trim())
|
|
374
|
+
return partnerErrorResponse(400, "invalid_request", "clientName is required", { details: { field: "clientName" } });
|
|
375
|
+
if (!Array.isArray(b.events))
|
|
376
|
+
return partnerErrorResponse(400, "invalid_request", "events must be an array", { details: { field: "events" } });
|
|
377
|
+
if (b.events.length > 10)
|
|
378
|
+
return partnerErrorResponse(400, "invalid_request", "events must hold at most 10 items", { details: { field: "events", max: 10 } });
|
|
379
|
+
// Stateless by contract: nothing in `state` changes.
|
|
380
|
+
return json(200, draftsFor({ id: "preview", coachId: "coach_fx_1", name: b.clientName, phone: "", channel: "sms", status: "new", lastContactAt: null }));
|
|
381
|
+
}
|
|
382
|
+
if (method === "POST" && path === "/events") {
|
|
383
|
+
const list = (body?.events ?? []);
|
|
384
|
+
let accepted = 0;
|
|
385
|
+
let duplicates = 0;
|
|
386
|
+
for (const e of list) {
|
|
387
|
+
if (state.events.some((x) => x.id === e.externalId)) {
|
|
388
|
+
duplicates++;
|
|
389
|
+
continue;
|
|
390
|
+
}
|
|
391
|
+
const dataType = typeof e.data?.type === "string" ? e.data.type : undefined;
|
|
392
|
+
const type = e.type ?? dataType ?? "update";
|
|
393
|
+
// A rough stand-in for Uplift's summariser: title wins, then the obvious data fields.
|
|
394
|
+
const verb = type === "missed" ? "Missed" : type === "moved" ? "Moved" : type === "started" ? "Started" : "Completed";
|
|
395
|
+
const title = e.title
|
|
396
|
+
?? (type === "setLogged" && typeof e.data?.exerciseName === "string" ? `Logged ${e.data.exerciseName}` : undefined)
|
|
397
|
+
?? (typeof e.data?.workoutName === "string" ? `${verb} ${e.data.workoutName}` : undefined)
|
|
398
|
+
?? (typeof e.data?.exerciseName === "string" ? `Logged ${e.data.exerciseName}` : undefined)
|
|
399
|
+
?? (typeof e.data?.sessionName === "string" ? e.data.sessionName : undefined)
|
|
400
|
+
?? `${type} update`;
|
|
401
|
+
const live = e.sessionId && (type === "setLogged" || type === "started");
|
|
402
|
+
const existing = e.sessionId ? state.events.find((x) => x.sessionId === e.sessionId) : undefined;
|
|
403
|
+
if (existing) {
|
|
404
|
+
existing.type = live ? "working_out" : type;
|
|
405
|
+
existing.title = live ? `Client is working out · latest: ${title}` : title;
|
|
406
|
+
existing.occurredAt = e.occurredAt;
|
|
407
|
+
if (!live && e.data)
|
|
408
|
+
existing.data = e.data;
|
|
409
|
+
}
|
|
410
|
+
else {
|
|
411
|
+
state.events.push({ id: e.externalId, clientId: e.clientId, type: live ? "working_out" : type, title: live ? `Client is working out · latest: ${title}` : title, occurredAt: e.occurredAt, ...(e.data ? { data: e.data } : {}), ...(e.sessionId ? { sessionId: e.sessionId } : {}) });
|
|
412
|
+
}
|
|
413
|
+
accepted++;
|
|
414
|
+
}
|
|
415
|
+
return json(200, { accepted, duplicates });
|
|
416
|
+
}
|
|
417
|
+
if (seg[0] === "clients" && seg[1]) {
|
|
418
|
+
const client = state.clients.find((c) => c.id === seg[1]);
|
|
419
|
+
if (!client)
|
|
420
|
+
return partnerErrorResponse(404, "not_found", "No such client");
|
|
421
|
+
if (method === "GET" && seg[2] === "thread") {
|
|
422
|
+
const limit = Math.min(Math.max(Number(url.searchParams.get("limit")) || 50, 1), 200);
|
|
423
|
+
const before = url.searchParams.get("before");
|
|
424
|
+
let items = threadItems(state, client.id);
|
|
425
|
+
if (before)
|
|
426
|
+
items = items.filter((m) => m.sentAt < before);
|
|
427
|
+
const page = items.slice(Math.max(0, items.length - limit));
|
|
428
|
+
const hasMore = items.length > page.length;
|
|
429
|
+
const u = state.unread.get(client.id);
|
|
430
|
+
return json(200, { messages: page, hasMore, nextBefore: hasMore ? page[0]?.sentAt ?? null : null, replyDrafts: u?.drafts ?? null, unreadCount: u?.count ?? 0 });
|
|
431
|
+
}
|
|
432
|
+
if (method === "POST" && seg[2] === "read" && !seg[3]) {
|
|
433
|
+
const u = state.unread.get(client.id);
|
|
434
|
+
const cleared = u ? 1 : 0;
|
|
435
|
+
state.unread.delete(client.id);
|
|
436
|
+
return json(200, { clientId: client.id, cleared });
|
|
437
|
+
}
|
|
438
|
+
if (method === "POST" && seg[2] === "events" && seg[3] && seg[4] === "drafts") {
|
|
439
|
+
const item = threadItems(state, client.id).find((m) => m.id === seg[3]);
|
|
440
|
+
if (!item)
|
|
441
|
+
return partnerErrorResponse(404, "not_found", "No such thread item for this client");
|
|
442
|
+
const n = (state.itemDrafts.has(item.id) ? 2 : 1);
|
|
443
|
+
const d = { happy: `Nice one (${n})`, tough: `Push harder (${n})`, inquisitive: `How did it feel? (${n})`, five_words: `Great work, keep going (${n})` };
|
|
444
|
+
state.itemDrafts.set(item.id, d);
|
|
445
|
+
return json(200, d);
|
|
446
|
+
}
|
|
447
|
+
if (method === "POST" && seg[2] === "drafts" && seg[3] === "regenerate") {
|
|
448
|
+
const d = draftsFor(client);
|
|
449
|
+
const u = state.unread.get(client.id) ?? { count: 0, messages: 0, updates: 0, drafts: null };
|
|
450
|
+
state.unread.set(client.id, { ...u, drafts: d });
|
|
451
|
+
return json(200, d);
|
|
452
|
+
}
|
|
453
|
+
if (method === "GET" && seg[2] === "messages" && seg[3] && seg[4] === "status") {
|
|
454
|
+
const seqId = seg[3];
|
|
455
|
+
const seq = state.deliveryStatus.get(seqId);
|
|
456
|
+
const status = seq && seq.length ? (seq.length > 1 ? seq.shift() : seq[0]) : "delivered";
|
|
457
|
+
const terminal = ["delivered", "read", "failed", "undelivered"].includes(status);
|
|
458
|
+
return json(200, { status, isDelivered: status === "delivered" || status === "read", isFailed: status === "failed" || status === "undelivered", terminal, errorCode: status === "failed" ? 30008 : null, errorMessage: status === "failed" ? "Unknown error" : null });
|
|
459
|
+
}
|
|
460
|
+
if (method === "GET" && seg[2] === "whatsapp-window") {
|
|
461
|
+
if (client.channel !== "whatsapp")
|
|
462
|
+
return json(200, { channel: client.channel, open: true, lastInboundAt: null, hoursSince: null, waitingTemplate: null });
|
|
463
|
+
const w = state.whatsappWindow.get(client.id) ?? { open: true, lastInboundAt: new Date().toISOString() };
|
|
464
|
+
return json(200, { channel: "whatsapp", open: w.open, lastInboundAt: w.lastInboundAt, hoursSince: w.lastInboundAt ? (Date.now() - Date.parse(w.lastInboundAt)) / 3600000 : null, waitingTemplate: w.open ? null : { key: "message_waiting", label: "Message waiting", previewMax: 100, variables: [{ index: 1, source: "clientName" }, { index: 2, source: "custom", label: "preview" }] } });
|
|
465
|
+
}
|
|
466
|
+
if (method === "POST" && seg[2] === "drafts")
|
|
467
|
+
return json(200, draftsFor(client));
|
|
468
|
+
if (method === "POST" && seg[2] === "messages") {
|
|
469
|
+
const key = headers["idempotency-key"];
|
|
470
|
+
if (!key)
|
|
471
|
+
return partnerErrorResponse(400, "invalid_request", "Idempotency-Key header is required");
|
|
472
|
+
const text = body?.body;
|
|
473
|
+
const rawAtts = body?.attachments;
|
|
474
|
+
const attachments = [];
|
|
475
|
+
if (rawAtts !== undefined) {
|
|
476
|
+
if (!Array.isArray(rawAtts) || rawAtts.length > 10)
|
|
477
|
+
return partnerErrorResponse(400, "invalid_request", "attachments must be an array of at most 10 items", { details: { field: "attachments", max: 10 } });
|
|
478
|
+
for (let i = 0; i < rawAtts.length; i++) {
|
|
479
|
+
const a = rawAtts[i];
|
|
480
|
+
if (!a || typeof a.url !== "string" || !a.url)
|
|
481
|
+
return partnerErrorResponse(400, "invalid_request", "each attachment needs a url and mimeType", { details: { field: `attachments[${i}]` } });
|
|
482
|
+
if (!a.url.startsWith(FIXTURE_MEDIA_PREFIX))
|
|
483
|
+
return partnerErrorResponse(400, "invalid_request", "attachment URLs must come from POST /media/upload-url", { details: { field: `attachments[${i}].url` } });
|
|
484
|
+
const mimeType = typeof a.mimeType === "string" ? a.mimeType : "application/octet-stream";
|
|
485
|
+
const type = (typeof a.type === "string" ? a.type : mimeType.startsWith("image/") ? "image" : mimeType.startsWith("video/") ? "video" : mimeType.startsWith("audio/") ? "audio" : "document");
|
|
486
|
+
attachments.push({ url: a.url, mimeType, type, ...(typeof a.filename === "string" ? { filename: a.filename } : {}), ...(typeof a.sizeBytes === "number" ? { sizeBytes: a.sizeBytes } : {}) });
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
const bodyText = typeof text === "string" ? text.trim() : "";
|
|
490
|
+
if (!bodyText && attachments.length === 0)
|
|
491
|
+
return partnerErrorResponse(400, "invalid_request", "body is required", { details: { field: "body" } });
|
|
492
|
+
const prior = state.sends.get(key);
|
|
493
|
+
if (prior)
|
|
494
|
+
return json(200, { ...prior, replayed: true });
|
|
495
|
+
const sentAt = new Date().toISOString();
|
|
496
|
+
const id = nextId("msg");
|
|
497
|
+
const win = client.channel === "whatsapp" ? state.whatsappWindow.get(client.id) : undefined;
|
|
498
|
+
const viaTemplate = !!win && !win.open;
|
|
499
|
+
state.messages.push({ id, clientId: client.id, direction: "outbound", body: bodyText, sentAt, deliveryStatus: "sent", ...(attachments.length ? { attachments } : {}), ...(viaTemplate ? { sentViaTemplate: true, templateBody: `${client.name.split(" ")[0]}, you have a message waiting: "${bodyText.slice(0, 100)}" Tap to read it in full.` } : {}) });
|
|
500
|
+
if (!state.deliveryStatus.has(id))
|
|
501
|
+
state.deliveryStatus.set(id, ["sent", "delivered"]);
|
|
502
|
+
client.lastContactAt = sentAt;
|
|
503
|
+
if (client.status === "new")
|
|
504
|
+
client.status = "active";
|
|
505
|
+
const result = { messageId: id, state: "sent", ...(viaTemplate ? { viaTemplate: true } : {}) };
|
|
506
|
+
state.sends.set(key, result);
|
|
507
|
+
return json(200, result);
|
|
508
|
+
}
|
|
509
|
+
}
|
|
510
|
+
return partnerErrorResponse(404, "not_found", `No partner route ${method} ${path}`);
|
|
511
|
+
};
|
|
512
|
+
const emit = (type, data) => {
|
|
513
|
+
const chunk = enc.encode(`event: ${type}\ndata: ${JSON.stringify(data)}\n\n`);
|
|
514
|
+
for (const c of [...streams]) {
|
|
515
|
+
try {
|
|
516
|
+
c.enqueue(chunk);
|
|
517
|
+
}
|
|
518
|
+
catch {
|
|
519
|
+
streams.delete(c);
|
|
520
|
+
}
|
|
521
|
+
}
|
|
522
|
+
};
|
|
523
|
+
return { fetch: impl, calls, state, emit, openStreams: () => streams.size };
|
|
524
|
+
}
|
|
525
|
+
/** Like the server: the paid partner plan is partner_enterprise, so paying unlocks the Enterprise settings. */
|
|
526
|
+
function effectiveEntitlements(state) {
|
|
527
|
+
return state.subscription === "active" ? { ...state.entitlements, cannedAnswers: true, phaseGoals: true } : state.entitlements;
|
|
528
|
+
}
|
|
529
|
+
function coachPayload(state) {
|
|
530
|
+
return {
|
|
531
|
+
id: baseCoach.id,
|
|
532
|
+
hostAccountId: baseCoach.hostAccountId,
|
|
533
|
+
name: baseCoach.name,
|
|
534
|
+
timezone: baseCoach.timezone,
|
|
535
|
+
subscription: state.subscription,
|
|
536
|
+
billing: state.billing,
|
|
537
|
+
clientCount: state.clients.length,
|
|
538
|
+
integrationMode: "sandbox",
|
|
539
|
+
};
|
|
540
|
+
}
|
|
541
|
+
function clientPayload(c, state) {
|
|
542
|
+
const base = { id: c.id, name: c.name, phone: c.phone, channel: c.channel, status: c.status, lastContactAt: c.lastContactAt };
|
|
543
|
+
if (!state)
|
|
544
|
+
return base;
|
|
545
|
+
// Inbox-row enrichment (native ClientRow): newest thread item, unread counts, prepared drafts, follow-up.
|
|
546
|
+
const items = threadItems(state, c.id);
|
|
547
|
+
const last = items[items.length - 1];
|
|
548
|
+
const lastOutbound = [...items].reverse().find((m) => m.kind === "message" && m.direction === "outbound");
|
|
549
|
+
const lastInbound = [...items].reverse().find((m) => m.kind === "message" && m.direction === "inbound");
|
|
550
|
+
const u = state.unread.get(c.id);
|
|
551
|
+
const followUpDue = !!lastOutbound && (!lastInbound || lastInbound.sentAt < lastOutbound.sentAt) && Date.now() - Date.parse(lastOutbound.sentAt) > 24 * 3600 * 1000;
|
|
552
|
+
return {
|
|
553
|
+
...base,
|
|
554
|
+
// Same derivation as the server: unread client messages mean the coach owes a reply.
|
|
555
|
+
status: (u?.messages ?? 0) > 0 ? "awaiting_reply" : base.status,
|
|
556
|
+
lastActivity: last ? { kind: last.kind, direction: last.kind === "message" ? last.direction ?? null : null, body: last.body, at: last.sentAt } : null,
|
|
557
|
+
unreadCount: u?.count ?? 0,
|
|
558
|
+
unreadMessages: u?.messages ?? 0,
|
|
559
|
+
unreadUpdates: u?.updates ?? 0,
|
|
560
|
+
drafts: u?.drafts ?? null,
|
|
561
|
+
followUpDue,
|
|
562
|
+
lastDeliveryFailure: null,
|
|
563
|
+
};
|
|
564
|
+
}
|
|
565
|
+
function byRecency(a, b) {
|
|
566
|
+
return (b.lastContactAt ?? "").localeCompare(a.lastContactAt ?? "") || a.name.localeCompare(b.name);
|
|
567
|
+
}
|
|
568
|
+
function threadItems(state, clientId) {
|
|
569
|
+
const msgs = state.messages.filter((m) => m.clientId === clientId).map((m) => ({ id: m.id, kind: "message", direction: m.direction, body: m.body, sentAt: m.sentAt, ...(m.attachments?.length ? { attachments: m.attachments } : {}), ...(m.direction === "outbound" ? { deliveryStatus: m.deliveryStatus ?? "delivered" } : {}), ...(m.sentViaTemplate ? { sentViaTemplate: true, templateBody: m.templateBody ?? null, deliveredViaTapAt: m.deliveredViaTapAt ?? null } : {}) }));
|
|
570
|
+
const evs = state.events.filter((e) => e.clientId === clientId).map((e) => ({ id: e.id, kind: "event", eventType: e.type, body: e.title, sentAt: e.occurredAt }));
|
|
571
|
+
return [...msgs, ...evs].sort((a, b) => a.sentAt.localeCompare(b.sentAt))
|
|
572
|
+
.map((m) => { const d = state.itemDrafts.get(m.id); return d && (m.kind === "event" || m.direction === "inbound") ? { ...m, drafts: d } : m; });
|
|
573
|
+
}
|
|
574
|
+
function json(status, data) {
|
|
575
|
+
return new Response(JSON.stringify(data), { status, headers: { "content-type": "application/json" } });
|
|
576
|
+
}
|
|
577
|
+
function safeParse(text) {
|
|
578
|
+
try {
|
|
579
|
+
return JSON.parse(text);
|
|
580
|
+
}
|
|
581
|
+
catch {
|
|
582
|
+
return null;
|
|
583
|
+
}
|
|
584
|
+
}
|
|
585
|
+
function lowerHeaders(h) {
|
|
586
|
+
const out = {};
|
|
587
|
+
if (!h)
|
|
588
|
+
return out;
|
|
589
|
+
if (h instanceof Headers) {
|
|
590
|
+
h.forEach((v, k) => { out[k.toLowerCase()] = v; });
|
|
591
|
+
return out;
|
|
592
|
+
}
|
|
593
|
+
if (Array.isArray(h)) {
|
|
594
|
+
for (const [k, v] of h)
|
|
595
|
+
out[k.toLowerCase()] = v;
|
|
596
|
+
return out;
|
|
597
|
+
}
|
|
598
|
+
for (const [k, v] of Object.entries(h))
|
|
599
|
+
out[k.toLowerCase()] = v;
|
|
600
|
+
return out;
|
|
601
|
+
}
|
|
602
|
+
//# sourceMappingURL=partnerFetch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"partnerFetch.js","sourceRoot":"","sources":["../src/partnerFetch.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@uplifted/fixtures",
|
|
3
|
+
"version": "0.11.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"description": "Synthetic Uplift data for tests and host dev modes. Nothing here is real.",
|
|
6
|
+
"license": "UNLICENSED",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "git+https://github.com/iantur89/uplifted.git",
|
|
10
|
+
"directory": "packages/fixtures"
|
|
11
|
+
},
|
|
12
|
+
"main": "./dist/index.js",
|
|
13
|
+
"types": "./dist/index.d.ts",
|
|
14
|
+
"exports": {
|
|
15
|
+
".": {
|
|
16
|
+
"types": "./dist/index.d.ts",
|
|
17
|
+
"import": "./dist/index.js"
|
|
18
|
+
}
|
|
19
|
+
},
|
|
20
|
+
"files": [
|
|
21
|
+
"dist",
|
|
22
|
+
"!dist/.tsbuildinfo"
|
|
23
|
+
],
|
|
24
|
+
"publishConfig": {
|
|
25
|
+
"access": "restricted"
|
|
26
|
+
}
|
|
27
|
+
}
|