@pear-protocol/agent-sdk 0.4.0 → 0.5.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/README.md +67 -6
- package/dist/{client-CJNmyV0P.d.cts → client-ETT3B7Kt.d.cts} +122 -3
- package/dist/{client-CJNmyV0P.d.ts → client-ETT3B7Kt.d.ts} +122 -3
- package/dist/index.cjs +92 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +86 -3
- package/dist/index.js.map +1 -1
- package/dist/react/index.cjs +107 -0
- package/dist/react/index.cjs.map +1 -1
- package/dist/react/index.d.cts +52 -4
- package/dist/react/index.d.ts +52 -4
- package/dist/react/index.js +107 -1
- package/dist/react/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -4,7 +4,7 @@ TypeScript client for the Pear **agent chat** API — the conversational assista
|
|
|
4
4
|
(pair-trade ideas, market data, and confirm-before-write trade execution).
|
|
5
5
|
|
|
6
6
|
- **`@pear-protocol/agent-sdk`** — framework-agnostic core (`AgentChatClient`).
|
|
7
|
-
- **`@pear-protocol/agent-sdk/react`** — optional React hooks (`useAgentChat`, `useAgentSessions`).
|
|
7
|
+
- **`@pear-protocol/agent-sdk/react`** — optional React hooks (`useAgentChat`, `useAgentSessions`, `useWalletLink`, `useOnboarding`).
|
|
8
8
|
|
|
9
9
|
Published to **public npm** (same registry as the org's other `@pear-protocol`
|
|
10
10
|
packages — no `.npmrc` or token needed). The wire types are a single source of
|
|
@@ -60,11 +60,12 @@ There's also a sync `client.sendMessage({ sessionId, message })` returning a
|
|
|
60
60
|
`getMessages`).
|
|
61
61
|
|
|
62
62
|
Both `streamChat` and `sendMessage` require a `surface`
|
|
63
|
-
(`pear_v3` | `pear_pro` | `base_mini` | `
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
63
|
+
(`pear_v3` | `pear_pro` | `base_mini` | `web`) declaring which Pear client you
|
|
64
|
+
are — the API rejects requests without a valid one. The agent applies
|
|
65
|
+
per-surface universe and execution policy — e.g. `base_mini` surfaces only SYMM
|
|
66
|
+
assets and is analysis-only. (`useAgentChat` defaults to `pear_v3`; set it via
|
|
67
|
+
the returned `setSurface`.) The Telegram surfaces are resolved server-side and
|
|
68
|
+
are not client-declarable.
|
|
68
69
|
|
|
69
70
|
## React
|
|
70
71
|
|
|
@@ -115,6 +116,66 @@ React apps can use `useWalletLink(client)` from `./react` —
|
|
|
115
116
|
`{ linked, isWorking, error, link, unlink, refresh }` (`linked` is `null`
|
|
116
117
|
while the initial status fetch is in flight).
|
|
117
118
|
|
|
119
|
+
## Onboarding (deterministic, FE-controlled)
|
|
120
|
+
|
|
121
|
+
A first-time user can be onboarded with a short, deterministic wizard you render
|
|
122
|
+
yourself — the agent exposes the flow over REST (no in-band chat short-circuit).
|
|
123
|
+
Every endpoint returns the **same** state shape so you drive the loop off one type:
|
|
124
|
+
|
|
125
|
+
```ts
|
|
126
|
+
let state = await client.getOnboardingState("pear_v3"); // { needsOnboarding, nextQuestion, isLast, answered, total, onboardingState, profile }
|
|
127
|
+
while (state.needsOnboarding && state.nextQuestion) {
|
|
128
|
+
const q = state.nextQuestion;
|
|
129
|
+
// closed questions carry q.options: { value, label, description? } — render
|
|
130
|
+
// label + description, submit value. Free-text note uses the typed string.
|
|
131
|
+
const value = q.freeform ? userTypedText : userPickedOption.value;
|
|
132
|
+
state = await client.submitOnboardingAnswer("pear_v3", { questionId: q.id, value });
|
|
133
|
+
}
|
|
134
|
+
// or bail: await client.skipOnboarding("pear_v3"); // smart-skip (parity with TG)
|
|
135
|
+
// start over: await client.resetOnboarding(); // clears picks — NOT for edits
|
|
136
|
+
// surface-static question set: await client.getOnboardingQuestions("pear_v3");
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
### Editing preferences (pre-fill + non-destructive)
|
|
140
|
+
|
|
141
|
+
`getOnboardingState` returns `profile` — the caller's CURRENT picks
|
|
142
|
+
(`experience`/`tradingStyle`/`riskAppetite`/`favoriteSectors`/`avoidAssets`/`note`,
|
|
143
|
+
all optional; `{}` for a new user). Render an edit form from the full question set
|
|
144
|
+
+ `profile`, then submit only the changed field — the server MERGES, so editing
|
|
145
|
+
one field never wipes the others. **Use `submitOnboardingAnswer` to edit; `resetOnboarding`
|
|
146
|
+
is "start over" only.**
|
|
147
|
+
|
|
148
|
+
```ts
|
|
149
|
+
const [state, questions] = await Promise.all([
|
|
150
|
+
client.getOnboardingState("pear_v3"),
|
|
151
|
+
client.getOnboardingQuestions("pear_v3"),
|
|
152
|
+
]);
|
|
153
|
+
// Render each question PRE-FILLED: e.g. select state.profile.tradingStyle.
|
|
154
|
+
// On a change, submit just that field (non-destructive merge):
|
|
155
|
+
await client.submitOnboardingAnswer("pear_v3", { questionId: "risk_appetite", value: "aggressive" });
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
React apps can use `useOnboarding({ client, surface })` from `./react` —
|
|
159
|
+
`{ needsOnboarding, onboardingState, currentQuestion, questions, profile, isLast, progress, submitAnswer, skip, reset, loading, error, refresh }`.
|
|
160
|
+
Gate your wizard on `needsOnboarding` once `loading` is false; for editing, render
|
|
161
|
+
`questions` pre-filled from `profile` and call `submitAnswer(questionId, value)`:
|
|
162
|
+
|
|
163
|
+
```tsx
|
|
164
|
+
function App({ client }) {
|
|
165
|
+
const ob = useOnboarding({ client, surface: "pear_v3" });
|
|
166
|
+
if (ob.loading) return <Spinner />;
|
|
167
|
+
// First run — sequential wizard off currentQuestion + progress.
|
|
168
|
+
if (ob.needsOnboarding) return <OnboardingWizard {...ob} />;
|
|
169
|
+
// Edit — pre-fill from ob.profile, submit changed fields (no reset):
|
|
170
|
+
// ob.questions.map(q => …current value = ob.profile[…]…
|
|
171
|
+
// onChange={(value) => ob.submitAnswer(q.id, value)} )
|
|
172
|
+
return <Chat client={client} />;
|
|
173
|
+
}
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
`submitAnswer` is overloaded: `submitAnswer(value)` answers the next first-run
|
|
177
|
+
question; `submitAnswer(questionId, value)` edits a specific field.
|
|
178
|
+
|
|
118
179
|
## Trade tickets (confirm-before-write)
|
|
119
180
|
|
|
120
181
|
A turn that would move money returns a `pendingAction`
|
|
@@ -220,6 +220,122 @@ declare const AgentChatMessageSchema: z.ZodObject<{
|
|
|
220
220
|
}, z.core.$loose>;
|
|
221
221
|
type AgentChatMessage = z.infer<typeof AgentChatMessageSchema>;
|
|
222
222
|
|
|
223
|
+
declare const OnboardingQuestionIdSchema: z.ZodEnum<{
|
|
224
|
+
experience: "experience";
|
|
225
|
+
trading_style: "trading_style";
|
|
226
|
+
risk_appetite: "risk_appetite";
|
|
227
|
+
note: "note";
|
|
228
|
+
}>;
|
|
229
|
+
type OnboardingQuestionId = z.infer<typeof OnboardingQuestionIdSchema>;
|
|
230
|
+
declare const OnboardingStateSchema: z.ZodEnum<{
|
|
231
|
+
not_started: "not_started";
|
|
232
|
+
skipped: "skipped";
|
|
233
|
+
completed: "completed";
|
|
234
|
+
}>;
|
|
235
|
+
type OnboardingState = z.infer<typeof OnboardingStateSchema>;
|
|
236
|
+
declare const OnboardingOptionSchema: z.ZodObject<{
|
|
237
|
+
value: z.ZodString;
|
|
238
|
+
label: z.ZodString;
|
|
239
|
+
description: z.ZodOptional<z.ZodString>;
|
|
240
|
+
}, z.core.$strip>;
|
|
241
|
+
type OnboardingOption = z.infer<typeof OnboardingOptionSchema>;
|
|
242
|
+
declare const OnboardingQuestionSchema: z.ZodObject<{
|
|
243
|
+
id: z.ZodEnum<{
|
|
244
|
+
experience: "experience";
|
|
245
|
+
trading_style: "trading_style";
|
|
246
|
+
risk_appetite: "risk_appetite";
|
|
247
|
+
note: "note";
|
|
248
|
+
}>;
|
|
249
|
+
prompt: z.ZodString;
|
|
250
|
+
options: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
251
|
+
value: z.ZodString;
|
|
252
|
+
label: z.ZodString;
|
|
253
|
+
description: z.ZodOptional<z.ZodString>;
|
|
254
|
+
}, z.core.$strip>>>;
|
|
255
|
+
freeform: z.ZodBoolean;
|
|
256
|
+
}, z.core.$strip>;
|
|
257
|
+
type OnboardingQuestion = z.infer<typeof OnboardingQuestionSchema>;
|
|
258
|
+
declare const OnboardingProfileSchema: z.ZodObject<{
|
|
259
|
+
experience: z.ZodOptional<z.ZodEnum<{
|
|
260
|
+
new: "new";
|
|
261
|
+
intermediate: "intermediate";
|
|
262
|
+
seasoned: "seasoned";
|
|
263
|
+
}>>;
|
|
264
|
+
tradingStyle: z.ZodOptional<z.ZodEnum<{
|
|
265
|
+
scalper: "scalper";
|
|
266
|
+
swing: "swing";
|
|
267
|
+
position: "position";
|
|
268
|
+
passive: "passive";
|
|
269
|
+
}>>;
|
|
270
|
+
riskAppetite: z.ZodOptional<z.ZodEnum<{
|
|
271
|
+
conservative: "conservative";
|
|
272
|
+
balanced: "balanced";
|
|
273
|
+
aggressive: "aggressive";
|
|
274
|
+
}>>;
|
|
275
|
+
favoriteSectors: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
276
|
+
avoidAssets: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
277
|
+
note: z.ZodOptional<z.ZodString>;
|
|
278
|
+
}, z.core.$strip>;
|
|
279
|
+
type OnboardingProfile = z.infer<typeof OnboardingProfileSchema>;
|
|
280
|
+
declare const OnboardingStateResponseSchema: z.ZodObject<{
|
|
281
|
+
needsOnboarding: z.ZodBoolean;
|
|
282
|
+
onboardingState: z.ZodEnum<{
|
|
283
|
+
not_started: "not_started";
|
|
284
|
+
skipped: "skipped";
|
|
285
|
+
completed: "completed";
|
|
286
|
+
}>;
|
|
287
|
+
nextQuestion: z.ZodNullable<z.ZodObject<{
|
|
288
|
+
id: z.ZodEnum<{
|
|
289
|
+
experience: "experience";
|
|
290
|
+
trading_style: "trading_style";
|
|
291
|
+
risk_appetite: "risk_appetite";
|
|
292
|
+
note: "note";
|
|
293
|
+
}>;
|
|
294
|
+
prompt: z.ZodString;
|
|
295
|
+
options: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
296
|
+
value: z.ZodString;
|
|
297
|
+
label: z.ZodString;
|
|
298
|
+
description: z.ZodOptional<z.ZodString>;
|
|
299
|
+
}, z.core.$strip>>>;
|
|
300
|
+
freeform: z.ZodBoolean;
|
|
301
|
+
}, z.core.$strip>>;
|
|
302
|
+
isLast: z.ZodBoolean;
|
|
303
|
+
answered: z.ZodNumber;
|
|
304
|
+
total: z.ZodNumber;
|
|
305
|
+
profile: z.ZodObject<{
|
|
306
|
+
experience: z.ZodOptional<z.ZodEnum<{
|
|
307
|
+
new: "new";
|
|
308
|
+
intermediate: "intermediate";
|
|
309
|
+
seasoned: "seasoned";
|
|
310
|
+
}>>;
|
|
311
|
+
tradingStyle: z.ZodOptional<z.ZodEnum<{
|
|
312
|
+
scalper: "scalper";
|
|
313
|
+
swing: "swing";
|
|
314
|
+
position: "position";
|
|
315
|
+
passive: "passive";
|
|
316
|
+
}>>;
|
|
317
|
+
riskAppetite: z.ZodOptional<z.ZodEnum<{
|
|
318
|
+
conservative: "conservative";
|
|
319
|
+
balanced: "balanced";
|
|
320
|
+
aggressive: "aggressive";
|
|
321
|
+
}>>;
|
|
322
|
+
favoriteSectors: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
323
|
+
avoidAssets: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
324
|
+
note: z.ZodOptional<z.ZodString>;
|
|
325
|
+
}, z.core.$strip>;
|
|
326
|
+
}, z.core.$strip>;
|
|
327
|
+
type OnboardingStateResponse = z.infer<typeof OnboardingStateResponseSchema>;
|
|
328
|
+
declare const OnboardingAnswerRequestSchema: z.ZodObject<{
|
|
329
|
+
questionId: z.ZodEnum<{
|
|
330
|
+
experience: "experience";
|
|
331
|
+
trading_style: "trading_style";
|
|
332
|
+
risk_appetite: "risk_appetite";
|
|
333
|
+
note: "note";
|
|
334
|
+
}>;
|
|
335
|
+
value: z.ZodString;
|
|
336
|
+
}, z.core.$strip>;
|
|
337
|
+
type OnboardingAnswerRequest = z.infer<typeof OnboardingAnswerRequestSchema>;
|
|
338
|
+
|
|
223
339
|
declare const TradeLinkSchema: z.ZodObject<{
|
|
224
340
|
link: z.ZodString;
|
|
225
341
|
platform: z.ZodString;
|
|
@@ -255,8 +371,6 @@ declare const ChatSurfaceSchema: z.ZodEnum<{
|
|
|
255
371
|
pear_v3: "pear_v3";
|
|
256
372
|
pear_pro: "pear_pro";
|
|
257
373
|
base_mini: "base_mini";
|
|
258
|
-
tg_dm: "tg_dm";
|
|
259
|
-
tg_group: "tg_group";
|
|
260
374
|
web: "web";
|
|
261
375
|
}>;
|
|
262
376
|
type ChatSurface = z.infer<typeof ChatSurfaceSchema>;
|
|
@@ -377,6 +491,11 @@ declare class AgentChatClient {
|
|
|
377
491
|
code?: string;
|
|
378
492
|
}): Promise<SelfLinkResult>;
|
|
379
493
|
unlinkWallet(): Promise<SelfUnlinkResult>;
|
|
494
|
+
getOnboardingState(surface: ChatSurface): Promise<OnboardingStateResponse>;
|
|
495
|
+
getOnboardingQuestions(surface: ChatSurface): Promise<OnboardingQuestion[]>;
|
|
496
|
+
submitOnboardingAnswer(surface: ChatSurface, body: OnboardingAnswerRequest): Promise<OnboardingStateResponse>;
|
|
497
|
+
skipOnboarding(surface: ChatSurface): Promise<OnboardingStateResponse>;
|
|
498
|
+
resetOnboarding(): Promise<OnboardingStateResponse>;
|
|
380
499
|
}
|
|
381
500
|
|
|
382
|
-
export {
|
|
501
|
+
export { StatusEventSchema as $, AgentChatClient as A, OnboardingQuestionSchema as B, type CancelResult as C, type OnboardingState as D, ErrorEventSchema as E, type OnboardingStateResponse as F, OnboardingStateResponseSchema as G, OnboardingStateSchema as H, PendingActionSchema as I, SelfLinkResultSchema as J, type SelfUnlinkResult as K, type LinkStatus as L, SelfUnlinkResultSchema as M, type Session as N, type OnboardingAnswerRequest as O, type PendingAction as P, type SessionListItem as Q, SessionListItemSchema as R, type SelfLinkResult as S, SessionSchema as T, type SessionSummary as U, SessionSummarySchema as V, type SetConfirmationsResult as W, SetConfirmationsResultSchema as X, type SetExecutionResult as Y, SetExecutionResultSchema as Z, SourcesEventSchema as _, type AgentChatClientConfig as a, type StreamEvent as a0, type SuggestedAction as a1, SuggestedActionSchema as a2, ThinkingEventSchema as a3, type TicketAction as a4, TicketActionSchema as a5, type TicketStatus as a6, TicketStatusSchema as a7, TokenEventSchema as a8, type TradeLink as a9, TradeLinkSchema as aa, type TradeSettings as ab, TradeSettingsSchema as ac, type TwitterSource as ad, TwitterSourceSchema as ae, type AgentChatMessage as b, AgentChatMessageSchema as c, type AgentEvent as d, type AgentWireEvent as e, AgentWireEventSchema as f, CancelResultSchema as g, type ChatMode as h, ChatModeSchema as i, type ChatResult as j, ChatResultSchema as k, type ChatSurface as l, ChatSurfaceSchema as m, type CitationSource as n, CitationSourceSchema as o, type ConfirmResult as p, ConfirmResultSchema as q, LinkStatusSchema as r, OnboardingAnswerRequestSchema as s, type OnboardingOption as t, OnboardingOptionSchema as u, type OnboardingProfile as v, OnboardingProfileSchema as w, type OnboardingQuestion as x, type OnboardingQuestionId as y, OnboardingQuestionIdSchema as z };
|
|
@@ -220,6 +220,122 @@ declare const AgentChatMessageSchema: z.ZodObject<{
|
|
|
220
220
|
}, z.core.$loose>;
|
|
221
221
|
type AgentChatMessage = z.infer<typeof AgentChatMessageSchema>;
|
|
222
222
|
|
|
223
|
+
declare const OnboardingQuestionIdSchema: z.ZodEnum<{
|
|
224
|
+
experience: "experience";
|
|
225
|
+
trading_style: "trading_style";
|
|
226
|
+
risk_appetite: "risk_appetite";
|
|
227
|
+
note: "note";
|
|
228
|
+
}>;
|
|
229
|
+
type OnboardingQuestionId = z.infer<typeof OnboardingQuestionIdSchema>;
|
|
230
|
+
declare const OnboardingStateSchema: z.ZodEnum<{
|
|
231
|
+
not_started: "not_started";
|
|
232
|
+
skipped: "skipped";
|
|
233
|
+
completed: "completed";
|
|
234
|
+
}>;
|
|
235
|
+
type OnboardingState = z.infer<typeof OnboardingStateSchema>;
|
|
236
|
+
declare const OnboardingOptionSchema: z.ZodObject<{
|
|
237
|
+
value: z.ZodString;
|
|
238
|
+
label: z.ZodString;
|
|
239
|
+
description: z.ZodOptional<z.ZodString>;
|
|
240
|
+
}, z.core.$strip>;
|
|
241
|
+
type OnboardingOption = z.infer<typeof OnboardingOptionSchema>;
|
|
242
|
+
declare const OnboardingQuestionSchema: z.ZodObject<{
|
|
243
|
+
id: z.ZodEnum<{
|
|
244
|
+
experience: "experience";
|
|
245
|
+
trading_style: "trading_style";
|
|
246
|
+
risk_appetite: "risk_appetite";
|
|
247
|
+
note: "note";
|
|
248
|
+
}>;
|
|
249
|
+
prompt: z.ZodString;
|
|
250
|
+
options: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
251
|
+
value: z.ZodString;
|
|
252
|
+
label: z.ZodString;
|
|
253
|
+
description: z.ZodOptional<z.ZodString>;
|
|
254
|
+
}, z.core.$strip>>>;
|
|
255
|
+
freeform: z.ZodBoolean;
|
|
256
|
+
}, z.core.$strip>;
|
|
257
|
+
type OnboardingQuestion = z.infer<typeof OnboardingQuestionSchema>;
|
|
258
|
+
declare const OnboardingProfileSchema: z.ZodObject<{
|
|
259
|
+
experience: z.ZodOptional<z.ZodEnum<{
|
|
260
|
+
new: "new";
|
|
261
|
+
intermediate: "intermediate";
|
|
262
|
+
seasoned: "seasoned";
|
|
263
|
+
}>>;
|
|
264
|
+
tradingStyle: z.ZodOptional<z.ZodEnum<{
|
|
265
|
+
scalper: "scalper";
|
|
266
|
+
swing: "swing";
|
|
267
|
+
position: "position";
|
|
268
|
+
passive: "passive";
|
|
269
|
+
}>>;
|
|
270
|
+
riskAppetite: z.ZodOptional<z.ZodEnum<{
|
|
271
|
+
conservative: "conservative";
|
|
272
|
+
balanced: "balanced";
|
|
273
|
+
aggressive: "aggressive";
|
|
274
|
+
}>>;
|
|
275
|
+
favoriteSectors: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
276
|
+
avoidAssets: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
277
|
+
note: z.ZodOptional<z.ZodString>;
|
|
278
|
+
}, z.core.$strip>;
|
|
279
|
+
type OnboardingProfile = z.infer<typeof OnboardingProfileSchema>;
|
|
280
|
+
declare const OnboardingStateResponseSchema: z.ZodObject<{
|
|
281
|
+
needsOnboarding: z.ZodBoolean;
|
|
282
|
+
onboardingState: z.ZodEnum<{
|
|
283
|
+
not_started: "not_started";
|
|
284
|
+
skipped: "skipped";
|
|
285
|
+
completed: "completed";
|
|
286
|
+
}>;
|
|
287
|
+
nextQuestion: z.ZodNullable<z.ZodObject<{
|
|
288
|
+
id: z.ZodEnum<{
|
|
289
|
+
experience: "experience";
|
|
290
|
+
trading_style: "trading_style";
|
|
291
|
+
risk_appetite: "risk_appetite";
|
|
292
|
+
note: "note";
|
|
293
|
+
}>;
|
|
294
|
+
prompt: z.ZodString;
|
|
295
|
+
options: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
296
|
+
value: z.ZodString;
|
|
297
|
+
label: z.ZodString;
|
|
298
|
+
description: z.ZodOptional<z.ZodString>;
|
|
299
|
+
}, z.core.$strip>>>;
|
|
300
|
+
freeform: z.ZodBoolean;
|
|
301
|
+
}, z.core.$strip>>;
|
|
302
|
+
isLast: z.ZodBoolean;
|
|
303
|
+
answered: z.ZodNumber;
|
|
304
|
+
total: z.ZodNumber;
|
|
305
|
+
profile: z.ZodObject<{
|
|
306
|
+
experience: z.ZodOptional<z.ZodEnum<{
|
|
307
|
+
new: "new";
|
|
308
|
+
intermediate: "intermediate";
|
|
309
|
+
seasoned: "seasoned";
|
|
310
|
+
}>>;
|
|
311
|
+
tradingStyle: z.ZodOptional<z.ZodEnum<{
|
|
312
|
+
scalper: "scalper";
|
|
313
|
+
swing: "swing";
|
|
314
|
+
position: "position";
|
|
315
|
+
passive: "passive";
|
|
316
|
+
}>>;
|
|
317
|
+
riskAppetite: z.ZodOptional<z.ZodEnum<{
|
|
318
|
+
conservative: "conservative";
|
|
319
|
+
balanced: "balanced";
|
|
320
|
+
aggressive: "aggressive";
|
|
321
|
+
}>>;
|
|
322
|
+
favoriteSectors: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
323
|
+
avoidAssets: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
324
|
+
note: z.ZodOptional<z.ZodString>;
|
|
325
|
+
}, z.core.$strip>;
|
|
326
|
+
}, z.core.$strip>;
|
|
327
|
+
type OnboardingStateResponse = z.infer<typeof OnboardingStateResponseSchema>;
|
|
328
|
+
declare const OnboardingAnswerRequestSchema: z.ZodObject<{
|
|
329
|
+
questionId: z.ZodEnum<{
|
|
330
|
+
experience: "experience";
|
|
331
|
+
trading_style: "trading_style";
|
|
332
|
+
risk_appetite: "risk_appetite";
|
|
333
|
+
note: "note";
|
|
334
|
+
}>;
|
|
335
|
+
value: z.ZodString;
|
|
336
|
+
}, z.core.$strip>;
|
|
337
|
+
type OnboardingAnswerRequest = z.infer<typeof OnboardingAnswerRequestSchema>;
|
|
338
|
+
|
|
223
339
|
declare const TradeLinkSchema: z.ZodObject<{
|
|
224
340
|
link: z.ZodString;
|
|
225
341
|
platform: z.ZodString;
|
|
@@ -255,8 +371,6 @@ declare const ChatSurfaceSchema: z.ZodEnum<{
|
|
|
255
371
|
pear_v3: "pear_v3";
|
|
256
372
|
pear_pro: "pear_pro";
|
|
257
373
|
base_mini: "base_mini";
|
|
258
|
-
tg_dm: "tg_dm";
|
|
259
|
-
tg_group: "tg_group";
|
|
260
374
|
web: "web";
|
|
261
375
|
}>;
|
|
262
376
|
type ChatSurface = z.infer<typeof ChatSurfaceSchema>;
|
|
@@ -377,6 +491,11 @@ declare class AgentChatClient {
|
|
|
377
491
|
code?: string;
|
|
378
492
|
}): Promise<SelfLinkResult>;
|
|
379
493
|
unlinkWallet(): Promise<SelfUnlinkResult>;
|
|
494
|
+
getOnboardingState(surface: ChatSurface): Promise<OnboardingStateResponse>;
|
|
495
|
+
getOnboardingQuestions(surface: ChatSurface): Promise<OnboardingQuestion[]>;
|
|
496
|
+
submitOnboardingAnswer(surface: ChatSurface, body: OnboardingAnswerRequest): Promise<OnboardingStateResponse>;
|
|
497
|
+
skipOnboarding(surface: ChatSurface): Promise<OnboardingStateResponse>;
|
|
498
|
+
resetOnboarding(): Promise<OnboardingStateResponse>;
|
|
380
499
|
}
|
|
381
500
|
|
|
382
|
-
export {
|
|
501
|
+
export { StatusEventSchema as $, AgentChatClient as A, OnboardingQuestionSchema as B, type CancelResult as C, type OnboardingState as D, ErrorEventSchema as E, type OnboardingStateResponse as F, OnboardingStateResponseSchema as G, OnboardingStateSchema as H, PendingActionSchema as I, SelfLinkResultSchema as J, type SelfUnlinkResult as K, type LinkStatus as L, SelfUnlinkResultSchema as M, type Session as N, type OnboardingAnswerRequest as O, type PendingAction as P, type SessionListItem as Q, SessionListItemSchema as R, type SelfLinkResult as S, SessionSchema as T, type SessionSummary as U, SessionSummarySchema as V, type SetConfirmationsResult as W, SetConfirmationsResultSchema as X, type SetExecutionResult as Y, SetExecutionResultSchema as Z, SourcesEventSchema as _, type AgentChatClientConfig as a, type StreamEvent as a0, type SuggestedAction as a1, SuggestedActionSchema as a2, ThinkingEventSchema as a3, type TicketAction as a4, TicketActionSchema as a5, type TicketStatus as a6, TicketStatusSchema as a7, TokenEventSchema as a8, type TradeLink as a9, TradeLinkSchema as aa, type TradeSettings as ab, TradeSettingsSchema as ac, type TwitterSource as ad, TwitterSourceSchema as ae, type AgentChatMessage as b, AgentChatMessageSchema as c, type AgentEvent as d, type AgentWireEvent as e, AgentWireEventSchema as f, CancelResultSchema as g, type ChatMode as h, ChatModeSchema as i, type ChatResult as j, ChatResultSchema as k, type ChatSurface as l, ChatSurfaceSchema as m, type CitationSource as n, CitationSourceSchema as o, type ConfirmResult as p, ConfirmResultSchema as q, LinkStatusSchema as r, OnboardingAnswerRequestSchema as s, type OnboardingOption as t, OnboardingOptionSchema as u, type OnboardingProfile as v, OnboardingProfileSchema as w, type OnboardingQuestion as x, type OnboardingQuestionId as y, OnboardingQuestionIdSchema as z };
|
package/dist/index.cjs
CHANGED
|
@@ -99,8 +99,6 @@ var ChatSurfaceSchema = zod.z.enum([
|
|
|
99
99
|
"pear_v3",
|
|
100
100
|
"pear_pro",
|
|
101
101
|
"base_mini",
|
|
102
|
-
"tg_dm",
|
|
103
|
-
"tg_group",
|
|
104
102
|
"web"
|
|
105
103
|
]);
|
|
106
104
|
var TicketActionSchema = zod.z.enum([
|
|
@@ -250,6 +248,49 @@ var AgentChatMessageSchema = zod.z.looseObject({
|
|
|
250
248
|
images: zod.z.array(zod.z.string()).nullish(),
|
|
251
249
|
suggestedAction: SuggestedActionSchema.nullish()
|
|
252
250
|
});
|
|
251
|
+
var OnboardingQuestionIdSchema = zod.z.enum([
|
|
252
|
+
"experience",
|
|
253
|
+
"trading_style",
|
|
254
|
+
"risk_appetite",
|
|
255
|
+
"note"
|
|
256
|
+
]);
|
|
257
|
+
var OnboardingStateSchema = zod.z.enum([
|
|
258
|
+
"not_started",
|
|
259
|
+
"skipped",
|
|
260
|
+
"completed"
|
|
261
|
+
]);
|
|
262
|
+
var OnboardingOptionSchema = zod.z.object({
|
|
263
|
+
value: zod.z.string(),
|
|
264
|
+
label: zod.z.string(),
|
|
265
|
+
description: zod.z.string().optional()
|
|
266
|
+
});
|
|
267
|
+
var OnboardingQuestionSchema = zod.z.object({
|
|
268
|
+
id: OnboardingQuestionIdSchema,
|
|
269
|
+
prompt: zod.z.string(),
|
|
270
|
+
options: zod.z.array(OnboardingOptionSchema).optional(),
|
|
271
|
+
freeform: zod.z.boolean()
|
|
272
|
+
});
|
|
273
|
+
var OnboardingProfileSchema = zod.z.object({
|
|
274
|
+
experience: zod.z.enum(["new", "intermediate", "seasoned"]).optional(),
|
|
275
|
+
tradingStyle: zod.z.enum(["scalper", "swing", "position", "passive"]).optional(),
|
|
276
|
+
riskAppetite: zod.z.enum(["conservative", "balanced", "aggressive"]).optional(),
|
|
277
|
+
favoriteSectors: zod.z.array(zod.z.string()).optional(),
|
|
278
|
+
avoidAssets: zod.z.array(zod.z.string()).optional(),
|
|
279
|
+
note: zod.z.string().optional()
|
|
280
|
+
});
|
|
281
|
+
var OnboardingStateResponseSchema = zod.z.object({
|
|
282
|
+
needsOnboarding: zod.z.boolean(),
|
|
283
|
+
onboardingState: OnboardingStateSchema,
|
|
284
|
+
nextQuestion: OnboardingQuestionSchema.nullable(),
|
|
285
|
+
isLast: zod.z.boolean(),
|
|
286
|
+
answered: zod.z.number(),
|
|
287
|
+
total: zod.z.number(),
|
|
288
|
+
profile: OnboardingProfileSchema
|
|
289
|
+
});
|
|
290
|
+
var OnboardingAnswerRequestSchema = zod.z.object({
|
|
291
|
+
questionId: OnboardingQuestionIdSchema,
|
|
292
|
+
value: zod.z.string()
|
|
293
|
+
});
|
|
253
294
|
|
|
254
295
|
// src/stream.ts
|
|
255
296
|
async function* parseSseStream(body) {
|
|
@@ -457,6 +498,48 @@ var AgentChatClient = class {
|
|
|
457
498
|
unlinkWallet() {
|
|
458
499
|
return this.http.json("DELETE", "/auth/link-wallet/self").then((raw) => SelfUnlinkResultSchema.parse(raw));
|
|
459
500
|
}
|
|
501
|
+
// ── Onboarding (deterministic, FE-controlled) ──────────────────────
|
|
502
|
+
// Drive a wizard: read state, render `nextQuestion`, POST an answer (get the
|
|
503
|
+
// same shape back), or skip/reset. `surface` is the client surface — drives
|
|
504
|
+
// per-surface question phrasing server-side. The userId is the JWT caller,
|
|
505
|
+
// never sent in the body.
|
|
506
|
+
/** Current onboarding state for the caller on this surface (gate + next
|
|
507
|
+
* question + progress + current `profile` picks). Returns the same shape
|
|
508
|
+
* submitOnboardingAnswer/skip do. */
|
|
509
|
+
getOnboardingState(surface) {
|
|
510
|
+
return this.http.json(
|
|
511
|
+
"GET",
|
|
512
|
+
`/onboarding/state?surface=${encodeURIComponent(surface)}`
|
|
513
|
+
).then((raw) => OnboardingStateResponseSchema.parse(raw));
|
|
514
|
+
}
|
|
515
|
+
/** Ordered onboarding questions for the surface (surface-static; no per-user
|
|
516
|
+
* state). Closed questions carry `options`; the free-text note has none. */
|
|
517
|
+
getOnboardingQuestions(surface) {
|
|
518
|
+
return this.http.json(
|
|
519
|
+
"GET",
|
|
520
|
+
`/onboarding/questions?surface=${encodeURIComponent(surface)}`
|
|
521
|
+
).then((raw) => raw.map((q) => OnboardingQuestionSchema.parse(q)));
|
|
522
|
+
}
|
|
523
|
+
/** Record one answer, then get the new state shape (next question or done). */
|
|
524
|
+
submitOnboardingAnswer(surface, body) {
|
|
525
|
+
return this.http.json(
|
|
526
|
+
"POST",
|
|
527
|
+
`/onboarding/answer?surface=${encodeURIComponent(surface)}`,
|
|
528
|
+
body
|
|
529
|
+
).then((raw) => OnboardingStateResponseSchema.parse(raw));
|
|
530
|
+
}
|
|
531
|
+
/** Smart skip (parity with TG): skipping the optional last note step COMPLETES
|
|
532
|
+
* onboarding with style+risk captured; skipping earlier bails the whole flow. */
|
|
533
|
+
skipOnboarding(surface) {
|
|
534
|
+
return this.http.json(
|
|
535
|
+
"POST",
|
|
536
|
+
`/onboarding/skip?surface=${encodeURIComponent(surface)}`
|
|
537
|
+
).then((raw) => OnboardingStateResponseSchema.parse(raw));
|
|
538
|
+
}
|
|
539
|
+
/** Retake — clears persona + resets to not_started so the flow re-runs. */
|
|
540
|
+
resetOnboarding() {
|
|
541
|
+
return this.http.json("POST", "/onboarding/reset").then((raw) => OnboardingStateResponseSchema.parse(raw));
|
|
542
|
+
}
|
|
460
543
|
};
|
|
461
544
|
|
|
462
545
|
exports.AgentChatClient = AgentChatClient;
|
|
@@ -474,6 +557,13 @@ exports.ConflictError = ConflictError;
|
|
|
474
557
|
exports.ErrorEventSchema = ErrorEventSchema;
|
|
475
558
|
exports.ForbiddenError = ForbiddenError;
|
|
476
559
|
exports.LinkStatusSchema = LinkStatusSchema;
|
|
560
|
+
exports.OnboardingAnswerRequestSchema = OnboardingAnswerRequestSchema;
|
|
561
|
+
exports.OnboardingOptionSchema = OnboardingOptionSchema;
|
|
562
|
+
exports.OnboardingProfileSchema = OnboardingProfileSchema;
|
|
563
|
+
exports.OnboardingQuestionIdSchema = OnboardingQuestionIdSchema;
|
|
564
|
+
exports.OnboardingQuestionSchema = OnboardingQuestionSchema;
|
|
565
|
+
exports.OnboardingStateResponseSchema = OnboardingStateResponseSchema;
|
|
566
|
+
exports.OnboardingStateSchema = OnboardingStateSchema;
|
|
477
567
|
exports.PendingActionSchema = PendingActionSchema;
|
|
478
568
|
exports.RateLimitError = RateLimitError;
|
|
479
569
|
exports.SelfLinkResultSchema = SelfLinkResultSchema;
|