@case-framework/survey-assistant 0.1.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.
Files changed (98) hide show
  1. package/README.md +212 -0
  2. package/dist/authoring-references-Cy8J-DWt.d.mts +48 -0
  3. package/dist/authoring-references-Cy8J-DWt.d.mts.map +1 -0
  4. package/dist/authoring-references-X6uRaWuf.mjs +68 -0
  5. package/dist/authoring-references-X6uRaWuf.mjs.map +1 -0
  6. package/dist/capabilities-B6tvE7fK.mjs +66 -0
  7. package/dist/capabilities-B6tvE7fK.mjs.map +1 -0
  8. package/dist/capabilities-DvSKtjAw.d.mts +182 -0
  9. package/dist/capabilities-DvSKtjAw.d.mts.map +1 -0
  10. package/dist/capabilities-default.d.mts +15 -0
  11. package/dist/capabilities-default.d.mts.map +1 -0
  12. package/dist/capabilities-default.mjs +347 -0
  13. package/dist/capabilities-default.mjs.map +1 -0
  14. package/dist/constants-CFUWrRtl.mjs +7 -0
  15. package/dist/constants-CFUWrRtl.mjs.map +1 -0
  16. package/dist/constants-Jw0k8ojS.d.mts +67 -0
  17. package/dist/constants-Jw0k8ojS.d.mts.map +1 -0
  18. package/dist/controller-proxy-BRDusFiO.d.mts +57 -0
  19. package/dist/controller-proxy-BRDusFiO.d.mts.map +1 -0
  20. package/dist/controller-proxy-Duxo2IFE.mjs +92 -0
  21. package/dist/controller-proxy-Duxo2IFE.mjs.map +1 -0
  22. package/dist/digest-BsoVq49o.d.mts +9 -0
  23. package/dist/digest-BsoVq49o.d.mts.map +1 -0
  24. package/dist/digest.d.mts +2 -0
  25. package/dist/digest.mjs +20 -0
  26. package/dist/digest.mjs.map +1 -0
  27. package/dist/engine-sPvuixWg.mjs +4857 -0
  28. package/dist/engine-sPvuixWg.mjs.map +1 -0
  29. package/dist/engine.d.mts +3 -0
  30. package/dist/engine.mjs +4 -0
  31. package/dist/index-BWNHkpkh.d.mts +187 -0
  32. package/dist/index-BWNHkpkh.d.mts.map +1 -0
  33. package/dist/index-CUqbBjkc.d.mts +641 -0
  34. package/dist/index-CUqbBjkc.d.mts.map +1 -0
  35. package/dist/index-MpEMQzTm.d.mts +123 -0
  36. package/dist/index-MpEMQzTm.d.mts.map +1 -0
  37. package/dist/index-TFtvBiSQ.d.mts +1149 -0
  38. package/dist/index-TFtvBiSQ.d.mts.map +1 -0
  39. package/dist/memory-thread-repository-CJkkVE2-.mjs +718 -0
  40. package/dist/memory-thread-repository-CJkkVE2-.mjs.map +1 -0
  41. package/dist/protocol-DV0ka9WT.mjs +1032 -0
  42. package/dist/protocol-DV0ka9WT.mjs.map +1 -0
  43. package/dist/protocol.d.mts +3 -0
  44. package/dist/protocol.mjs +2 -0
  45. package/dist/react-VuYe-cPh.mjs +521 -0
  46. package/dist/react-VuYe-cPh.mjs.map +1 -0
  47. package/dist/react-integration.d.mts +2 -0
  48. package/dist/react-integration.mjs +3 -0
  49. package/dist/react.d.mts +3 -0
  50. package/dist/react.mjs +4 -0
  51. package/dist/references/assistant-operations.md +287 -0
  52. package/dist/references/core-rules.md +11 -0
  53. package/dist/references/embedded-forms.md +80 -0
  54. package/dist/references/expressions.md +301 -0
  55. package/dist/references/item-types.md +364 -0
  56. package/dist/references/localization.md +25 -0
  57. package/dist/references/rich-text-content.md +193 -0
  58. package/dist/references/source-material-surveys.md +60 -0
  59. package/dist/references/survey-data-model.md +109 -0
  60. package/dist/references/survey-quality.md +23 -0
  61. package/dist/request-context-jcmXT_Q2.mjs +44 -0
  62. package/dist/request-context-jcmXT_Q2.mjs.map +1 -0
  63. package/dist/request-guardrails-C59IWnH8.mjs +73 -0
  64. package/dist/request-guardrails-C59IWnH8.mjs.map +1 -0
  65. package/dist/server-agent.d.mts +131 -0
  66. package/dist/server-agent.d.mts.map +1 -0
  67. package/dist/server-agent.mjs +229 -0
  68. package/dist/server-agent.mjs.map +1 -0
  69. package/dist/server-runtime.d.mts +123 -0
  70. package/dist/server-runtime.d.mts.map +1 -0
  71. package/dist/server-runtime.mjs +296 -0
  72. package/dist/server-runtime.mjs.map +1 -0
  73. package/dist/server-tasks.d.mts +78 -0
  74. package/dist/server-tasks.d.mts.map +1 -0
  75. package/dist/server-tasks.mjs +253 -0
  76. package/dist/server-tasks.mjs.map +1 -0
  77. package/dist/server-tools.d.mts +2 -0
  78. package/dist/server-tools.mjs +2 -0
  79. package/dist/server.d.mts +52 -0
  80. package/dist/server.d.mts.map +1 -0
  81. package/dist/server.mjs +6 -0
  82. package/dist/storage-postgres.d.mts +37 -0
  83. package/dist/storage-postgres.d.mts.map +1 -0
  84. package/dist/storage-postgres.mjs +167 -0
  85. package/dist/storage-postgres.mjs.map +1 -0
  86. package/dist/thread-documents-DamIq9Od.d.mts +91 -0
  87. package/dist/thread-documents-DamIq9Od.d.mts.map +1 -0
  88. package/dist/thread-handlers-DpynUc64.d.mts +112 -0
  89. package/dist/thread-handlers-DpynUc64.d.mts.map +1 -0
  90. package/dist/tools-Hz2p7vyv.mjs +1879 -0
  91. package/dist/tools-Hz2p7vyv.mjs.map +1 -0
  92. package/dist/ui.css +2 -0
  93. package/dist/ui.d.mts +63 -0
  94. package/dist/ui.d.mts.map +1 -0
  95. package/dist/ui.mjs +2238 -0
  96. package/dist/ui.mjs.map +1 -0
  97. package/package.json +166 -0
  98. package/ui.css.d.ts +3 -0
@@ -0,0 +1,521 @@
1
+ import { A as surveyAssistantThreadTranscriptSchema, O as surveyAssistantThreadListSchema, c as surveyAssistantTurnFinalSchema, d as surveyAssistantModelCatalogSchema, k as surveyAssistantThreadSchema, n as SURVEY_ASSISTANT_TURN_FINAL_PART_TYPE, r as applyReceiptSchema, u as surveyChangeSetSchema } from "./protocol-DV0ka9WT.mjs";
2
+ import { o as readSurveyAssistantJson } from "./controller-proxy-Duxo2IFE.mjs";
3
+ import { DefaultChatTransport } from "ai";
4
+ import { useCallback, useEffect, useEffectEvent, useMemo, useReducer, useRef, useState } from "react";
5
+ import { useChat } from "@ai-sdk/react";
6
+ //#region src/react/session-state.ts
7
+ const isSurveyAssistantTurnActive = ({ isStreaming, state }) => state !== "aborted" && (isStreaming || state === "submitting" || state === "streaming" || state === "applying");
8
+ const reduceSurveyAssistantSessionState = (_state, event) => {
9
+ switch (event.type) {
10
+ case "submit": return "submitting";
11
+ case "stream-started": return "streaming";
12
+ case "completed": return "completed";
13
+ case "apply-started": return "applying";
14
+ case "applied": return "applied";
15
+ case "failed": return "failed";
16
+ case "aborted": return "aborted";
17
+ case "reset": return event.hasTranscript ? "completed" : "idle";
18
+ }
19
+ };
20
+ //#endregion
21
+ //#region src/react/turn-authorization.ts
22
+ const isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
23
+ const isCompletedToolPart = (part) => (part.type === "dynamic-tool" || part.type.startsWith("tool-")) && "state" in part && part.state === "output-available" && "output" in part;
24
+ const unwrapSurveyAssistantToolOutput = (output) => {
25
+ if (isRecord(output) && "output" in output && output.output !== void 0) return output.output;
26
+ return output;
27
+ };
28
+ const parseSurveyChangeSet = (output) => {
29
+ const parsed = surveyChangeSetSchema.safeParse(unwrapSurveyAssistantToolOutput(output));
30
+ return parsed.success ? parsed.data : null;
31
+ };
32
+ const collectSurveyChangeSets = (messages) => {
33
+ const changes = [];
34
+ for (const message of messages) for (const part of message.parts) {
35
+ if (!isCompletedToolPart(part)) continue;
36
+ const change = parseSurveyChangeSet(part.output);
37
+ if (change) changes.push(change);
38
+ }
39
+ return changes;
40
+ };
41
+ const findLastUserMessageIndex$1 = (messages) => {
42
+ for (let index = messages.length - 1; index >= 0; index -= 1) if (messages[index]?.role === "user") return index;
43
+ return -1;
44
+ };
45
+ const resolveLatestSurveyTurnAuthorization = (messages) => {
46
+ const lastUserIndex = findLastUserMessageIndex$1(messages);
47
+ if (lastUserIndex < 0) return { status: "pending" };
48
+ const turnMessages = messages.slice(lastUserIndex + 1);
49
+ const finalParts = turnMessages.flatMap((message) => message.parts).filter((part) => part.type === SURVEY_ASSISTANT_TURN_FINAL_PART_TYPE);
50
+ if (finalParts.length === 0) return { status: "pending" };
51
+ if (finalParts.length !== 1) return {
52
+ status: "invalid",
53
+ reason: "The assistant returned multiple turn finals."
54
+ };
55
+ const finalPart = finalParts[0];
56
+ const finalParse = surveyAssistantTurnFinalSchema.safeParse(finalPart && "data" in finalPart ? finalPart.data : void 0);
57
+ if (!finalParse.success) return {
58
+ status: "invalid",
59
+ reason: "The assistant returned an invalid turn final."
60
+ };
61
+ const turnFinal = finalParse.data;
62
+ if (turnFinal.status !== "completed") return {
63
+ status: turnFinal.status,
64
+ turnFinal,
65
+ changeSets: []
66
+ };
67
+ const candidates = collectSurveyChangeSets(turnMessages).filter((change) => change.turnId === turnFinal.turnId);
68
+ const candidatesById = /* @__PURE__ */ new Map();
69
+ for (const candidate of candidates) {
70
+ if (candidatesById.has(candidate.id)) return {
71
+ status: "invalid",
72
+ turnId: turnFinal.turnId,
73
+ reason: `The assistant returned duplicate change set "${candidate.id}".`
74
+ };
75
+ candidatesById.set(candidate.id, candidate);
76
+ }
77
+ for (const blockedChangeSetId of turnFinal.blockedChangeSetIds ?? []) {
78
+ const candidate = candidatesById.get(blockedChangeSetId);
79
+ if (!candidate || candidate.status !== "rejected" || candidate.validation.valid) return {
80
+ status: "invalid",
81
+ turnId: turnFinal.turnId,
82
+ reason: `The assistant did not provide blocked change set "${blockedChangeSetId}".`
83
+ };
84
+ }
85
+ const changeSets = [];
86
+ for (const changeSetId of turnFinal.executableChangeSetIds) {
87
+ const candidate = candidatesById.get(changeSetId);
88
+ if (!candidate || candidate.status !== "validated" || !candidate.validation.valid) return {
89
+ status: "invalid",
90
+ turnId: turnFinal.turnId,
91
+ reason: `The assistant did not provide authorized change set "${changeSetId}".`
92
+ };
93
+ changeSets.push(candidate);
94
+ }
95
+ return {
96
+ status: "completed",
97
+ turnFinal,
98
+ changeSets
99
+ };
100
+ };
101
+ const resolveSurveyTurnOutcome = ({ applyResultsByChangeId, authorization }) => {
102
+ if (authorization.status !== "completed") return null;
103
+ const blockedChangeSetCount = authorization.turnFinal.blockedChangeSetIds?.length ?? 0;
104
+ if (blockedChangeSetCount > 0) return {
105
+ status: "blocked",
106
+ blockedChangeSetCount
107
+ };
108
+ if (authorization.changeSets.length === 0) return null;
109
+ const results = authorization.changeSets.map((change) => applyResultsByChangeId[change.id]);
110
+ if (results.some((result) => result === void 0)) return null;
111
+ const failedChangeSetCount = results.filter((result) => result.status !== "applied").length;
112
+ if (failedChangeSetCount === 0) return null;
113
+ return {
114
+ status: "apply-failed",
115
+ appliedChangeSetCount: results.length - failedChangeSetCount,
116
+ failedChangeSetCount
117
+ };
118
+ };
119
+ const getSurveyDocumentVersionFromSnapshot = (snapshot) => ({ ...snapshot.version });
120
+ const createApplyReceipts = ({ afterSnapshot, beforeSnapshot, changeSets, results, turnFinal, createdAt = (/* @__PURE__ */ new Date()).toISOString() }) => {
121
+ const beforeVersion = getSurveyDocumentVersionFromSnapshot(beforeSnapshot);
122
+ const afterVersion = afterSnapshot ? getSurveyDocumentVersionFromSnapshot(afterSnapshot) : void 0;
123
+ const resultsByChangeId = new Map(results.map((result) => [result.changeId, result]));
124
+ return changeSets.map((changeSet) => {
125
+ const result = resultsByChangeId.get(changeSet.id);
126
+ const status = result?.status ?? "failed";
127
+ return applyReceiptSchema.parse({
128
+ protocolVersion: 1,
129
+ turnId: turnFinal.turnId,
130
+ changeSetId: changeSet.id,
131
+ beforeVersion,
132
+ ...status === "applied" && afterVersion ? { afterVersion } : {},
133
+ status,
134
+ operationCount: changeSet.operations.length,
135
+ ...status === "applied" && afterVersion?.historyIndex !== void 0 ? { commit: { index: afterVersion.historyIndex } } : {},
136
+ ...result?.issues ? { issues: result.issues } : {},
137
+ createdAt
138
+ });
139
+ });
140
+ };
141
+ //#endregion
142
+ //#region src/react/transport.ts
143
+ const findLastUserMessage = (messages) => {
144
+ for (let index = messages.length - 1; index >= 0; index -= 1) if (messages[index]?.role === "user") return messages[index];
145
+ };
146
+ const createSurveyAssistantTransport = ({ api = "/api/survey-assistant/chat", resourceId, threadId }) => new DefaultChatTransport({
147
+ api,
148
+ body: {
149
+ resourceId,
150
+ threadId
151
+ },
152
+ prepareSendMessagesRequest: ({ api, body, credentials, headers, id, messageId, messages, trigger }) => {
153
+ const latestUserMessage = findLastUserMessage(messages);
154
+ return {
155
+ api,
156
+ credentials,
157
+ headers,
158
+ body: {
159
+ ...body,
160
+ id,
161
+ messages: latestUserMessage ? [latestUserMessage] : [],
162
+ trigger,
163
+ messageId
164
+ }
165
+ };
166
+ }
167
+ });
168
+ //#endregion
169
+ //#region src/react/thread-client.ts
170
+ const createSurveyAssistantThreadClient = (api = "/api/survey-assistant/threads") => ({
171
+ async delete(threadId) {
172
+ const response = await fetch(`${api}/${encodeURIComponent(threadId)}`, { method: "DELETE" });
173
+ if (!response.ok) await readSurveyAssistantJson(response);
174
+ },
175
+ async create(title) {
176
+ const body = await readSurveyAssistantJson(await fetch(api, {
177
+ body: JSON.stringify(title ? { title } : {}),
178
+ headers: { "content-type": "application/json" },
179
+ method: "POST"
180
+ }));
181
+ return surveyAssistantThreadSchema.parse(body.thread);
182
+ },
183
+ async list() {
184
+ const body = await readSurveyAssistantJson(await fetch(api, { cache: "no-store" }));
185
+ return surveyAssistantThreadListSchema.parse(body).threads;
186
+ },
187
+ async read(threadId) {
188
+ const body = await readSurveyAssistantJson(await fetch(`${api}/${encodeURIComponent(threadId)}`, { cache: "no-store" }));
189
+ return surveyAssistantThreadTranscriptSchema.parse(body);
190
+ },
191
+ async rename(threadId, title) {
192
+ const body = await readSurveyAssistantJson(await fetch(`${api}/${encodeURIComponent(threadId)}`, {
193
+ body: JSON.stringify({
194
+ mode: "manual",
195
+ title
196
+ }),
197
+ headers: { "content-type": "application/json" },
198
+ method: "PATCH"
199
+ }));
200
+ return surveyAssistantThreadSchema.parse(body.thread);
201
+ },
202
+ async setAutomaticTitle(threadId, title) {
203
+ const body = await readSurveyAssistantJson(await fetch(`${api}/${encodeURIComponent(threadId)}`, {
204
+ body: JSON.stringify({
205
+ mode: "automatic",
206
+ ...title ? { title } : {}
207
+ }),
208
+ headers: { "content-type": "application/json" },
209
+ method: "PATCH"
210
+ }));
211
+ return surveyAssistantThreadSchema.parse(body.thread);
212
+ }
213
+ });
214
+ //#endregion
215
+ //#region src/react/model-catalog.ts
216
+ const DEFAULT_MODEL_STORAGE_KEY = "survey-assistant-selected-model";
217
+ const createSurveyAssistantModelCatalogClient = (api = "/api/survey-assistant/models") => ({ async get() {
218
+ const body = await readSurveyAssistantJson(await fetch(api, { cache: "no-store" }), "The assistant model catalog could not be loaded.");
219
+ return surveyAssistantModelCatalogSchema.parse(body);
220
+ } });
221
+ const useSurveyAssistantModelCatalog = ({ api, client: providedClient, onModelChange, storageKey = DEFAULT_MODEL_STORAGE_KEY } = {}) => {
222
+ const [models, setModels] = useState([]);
223
+ const [modelId, setModelId] = useState();
224
+ const [error, setError] = useState(null);
225
+ const [loading, setLoading] = useState(true);
226
+ const [reloadToken, setReloadToken] = useState(0);
227
+ useEffect(() => {
228
+ let cancelled = false;
229
+ const client = providedClient ?? createSurveyAssistantModelCatalogClient(api);
230
+ setLoading(true);
231
+ setError(null);
232
+ client.get().then((catalog) => {
233
+ if (cancelled) return;
234
+ const rememberedId = storageKey && typeof window !== "undefined" ? window.localStorage.getItem(storageKey) ?? void 0 : void 0;
235
+ const selectedId = rememberedId && catalog.models.some((model) => model.id === rememberedId) ? rememberedId : catalog.defaultModelId;
236
+ setModels(catalog.models);
237
+ setModelId(selectedId);
238
+ onModelChange?.(selectedId);
239
+ }).catch((reason) => {
240
+ if (!cancelled) setError(reason instanceof Error ? reason : new Error(String(reason)));
241
+ }).finally(() => {
242
+ if (!cancelled) setLoading(false);
243
+ });
244
+ return () => {
245
+ cancelled = true;
246
+ };
247
+ }, [
248
+ api,
249
+ onModelChange,
250
+ providedClient,
251
+ reloadToken,
252
+ storageKey
253
+ ]);
254
+ const selectModel = useCallback((nextModelId) => {
255
+ if (!models.some((model) => model.id === nextModelId)) return;
256
+ setModelId(nextModelId);
257
+ if (storageKey && typeof window !== "undefined") window.localStorage.setItem(storageKey, nextModelId);
258
+ onModelChange?.(nextModelId);
259
+ }, [
260
+ models,
261
+ onModelChange,
262
+ storageKey
263
+ ]);
264
+ return {
265
+ error,
266
+ loading,
267
+ modelId,
268
+ models,
269
+ reload: useCallback(() => setReloadToken((current) => current + 1), []),
270
+ selectModel
271
+ };
272
+ };
273
+ //#endregion
274
+ //#region src/react/use-survey-assistant-session.ts
275
+ const createLocalId = (prefix) => {
276
+ return `${prefix}-${globalThis.crypto?.randomUUID?.() ?? Math.random().toString(36).slice(2)}`;
277
+ };
278
+ const getAssistantTextParts = (message) => message.parts.filter((part) => part.type === "text" && part.text.trim().length > 0);
279
+ const findLastAssistantTextMessageIndex = (messages, endExclusive = messages.length) => {
280
+ for (let index = Math.min(messages.length, endExclusive) - 1; index >= 0; index -= 1) {
281
+ const message = messages[index];
282
+ if (message?.role === "assistant" && getAssistantTextParts(message).length > 0) return index;
283
+ }
284
+ return -1;
285
+ };
286
+ const findLastUserMessageIndex = (messages) => {
287
+ for (let index = messages.length - 1; index >= 0; index -= 1) if (messages[index]?.role === "user") return index;
288
+ return -1;
289
+ };
290
+ const pruneFailedMessagesForDisplay = (messages) => {
291
+ const lastUserIndex = findLastUserMessageIndex(messages);
292
+ const lastCompletedAssistantIndex = findLastAssistantTextMessageIndex(messages);
293
+ if (lastUserIndex > lastCompletedAssistantIndex) return messages.slice(0, lastUserIndex + 1);
294
+ return lastCompletedAssistantIndex >= 0 ? messages.slice(0, lastCompletedAssistantIndex + 1) : [];
295
+ };
296
+ const hasCompletedAssistantResponseAfterLastUser = (messages) => {
297
+ const lastUserIndex = findLastUserMessageIndex(messages);
298
+ return lastUserIndex >= 0 && findLastAssistantTextMessageIndex(messages) > lastUserIndex;
299
+ };
300
+ const collectChangeSetsAfterLastUser = (messages) => {
301
+ const lastUserIndex = findLastUserMessageIndex(messages);
302
+ return lastUserIndex < 0 ? [] : collectSurveyChangeSets(messages.slice(lastUserIndex + 1));
303
+ };
304
+ const useSurveyAssistantSession = ({ api, applyPolicy = "auto", controller, initialMessages = [], modelId, onApplyReceipts, onReviewChangeSets, onTurnActiveChange, resourceId: controlledResourceId, threadId: controlledThreadId }) => {
305
+ const [localResourceId] = useState(() => createLocalId("survey-assistant-local-user"));
306
+ const [localThreadId] = useState(() => createLocalId("survey-assistant-local-thread"));
307
+ const resourceId = controlledResourceId ?? localResourceId;
308
+ const threadId = controlledThreadId ?? localThreadId;
309
+ const [state, dispatch] = useReducer(reduceSurveyAssistantSessionState, "idle");
310
+ const [applyResultsByChangeId, setApplyResultsByChangeId] = useState({});
311
+ const [authorizationError, setAuthorizationError] = useState(null);
312
+ const handledTurnIdsRef = useRef(/* @__PURE__ */ new Set());
313
+ const localTurnAwaitingApplyRef = useRef(false);
314
+ const localTurnStreamStartedRef = useRef(false);
315
+ const { messages, setMessages, sendMessage, status, stop: stopChat, error, clearError, regenerate } = useChat({
316
+ id: threadId,
317
+ messages: initialMessages,
318
+ transport: useMemo(() => createSurveyAssistantTransport({
319
+ api,
320
+ resourceId,
321
+ threadId
322
+ }), [
323
+ api,
324
+ resourceId,
325
+ threadId
326
+ ])
327
+ });
328
+ const isStreaming = status === "submitted" || status === "streaming";
329
+ const isTurnActive = isSurveyAssistantTurnActive({
330
+ isStreaming,
331
+ state
332
+ });
333
+ const notifyTurnActiveChange = useEffectEvent((active) => {
334
+ onTurnActiveChange?.(active);
335
+ });
336
+ const turnAuthorization = useMemo(() => resolveLatestSurveyTurnAuthorization(messages), [messages]);
337
+ const latestTurnOutcome = useMemo(() => resolveSurveyTurnOutcome({
338
+ applyResultsByChangeId,
339
+ authorization: turnAuthorization
340
+ }), [applyResultsByChangeId, turnAuthorization]);
341
+ const hasUsefulLatestAssistantResponse = useMemo(() => hasCompletedAssistantResponseAfterLastUser(messages) || collectChangeSetsAfterLastUser(messages).length > 0, [messages]);
342
+ const reportAuthorizationError = useCallback((message) => {
343
+ queueMicrotask(() => {
344
+ setAuthorizationError(message);
345
+ dispatch({ type: "failed" });
346
+ });
347
+ }, []);
348
+ useEffect(() => {
349
+ if (status === "submitted") dispatch({ type: "submit" });
350
+ if (status === "streaming") dispatch({ type: "stream-started" });
351
+ }, [status]);
352
+ useEffect(() => {
353
+ notifyTurnActiveChange(isTurnActive);
354
+ return () => {
355
+ if (isTurnActive) notifyTurnActiveChange(false);
356
+ };
357
+ }, [isTurnActive]);
358
+ useEffect(() => {
359
+ if (isStreaming) {
360
+ localTurnStreamStartedRef.current = true;
361
+ return;
362
+ }
363
+ if (!localTurnAwaitingApplyRef.current) return;
364
+ if (turnAuthorization.status === "pending") {
365
+ if (!localTurnStreamStartedRef.current) return;
366
+ const timeoutId = window.setTimeout(() => {
367
+ localTurnAwaitingApplyRef.current = false;
368
+ localTurnStreamStartedRef.current = false;
369
+ reportAuthorizationError("The assistant response ended without a valid turn final.");
370
+ }, 100);
371
+ return () => window.clearTimeout(timeoutId);
372
+ }
373
+ localTurnAwaitingApplyRef.current = false;
374
+ localTurnStreamStartedRef.current = false;
375
+ if (turnAuthorization.status === "invalid") {
376
+ reportAuthorizationError(turnAuthorization.reason);
377
+ return;
378
+ }
379
+ const { turnFinal } = turnAuthorization;
380
+ if (handledTurnIdsRef.current.has(turnFinal.turnId)) return;
381
+ handledTurnIdsRef.current.add(turnFinal.turnId);
382
+ if (turnAuthorization.status !== "completed" || turnAuthorization.changeSets.length === 0) {
383
+ dispatch({ type: "completed" });
384
+ return;
385
+ }
386
+ if (applyPolicy === "deny") {
387
+ dispatch({ type: "completed" });
388
+ return;
389
+ }
390
+ if (applyPolicy === "review") {
391
+ onReviewChangeSets?.(turnAuthorization.changeSets, turnFinal);
392
+ dispatch({ type: "completed" });
393
+ return;
394
+ }
395
+ if (!controller?.applyAssistantChange && !controller?.applyAssistantChanges) {
396
+ reportAuthorizationError("No survey editor apply adapter is available.");
397
+ return;
398
+ }
399
+ const beforeSnapshot = controller.getSnapshot();
400
+ if (!beforeSnapshot) {
401
+ reportAuthorizationError("The editor state was unavailable when applying the assistant change.");
402
+ return;
403
+ }
404
+ dispatch({ type: "apply-started" });
405
+ const result = controller.applyAssistantChanges?.(turnAuthorization.changeSets) ?? { results: turnAuthorization.changeSets.map((change) => controller.applyAssistantChange?.(change)).filter((applyResult) => Boolean(applyResult)) };
406
+ queueMicrotask(() => setApplyResultsByChangeId((current) => ({
407
+ ...current,
408
+ ...Object.fromEntries(result.results.map((applyResult) => [applyResult.changeId, applyResult]))
409
+ })));
410
+ const receipts = createApplyReceipts({
411
+ beforeSnapshot,
412
+ afterSnapshot: controller.getSnapshot(),
413
+ changeSets: turnAuthorization.changeSets,
414
+ results: result.results,
415
+ turnFinal
416
+ });
417
+ onApplyReceipts?.(receipts);
418
+ dispatch({ type: result.results.every((applyResult) => applyResult.status === "applied") ? "applied" : "completed" });
419
+ }, [
420
+ applyPolicy,
421
+ controller,
422
+ isStreaming,
423
+ onApplyReceipts,
424
+ onReviewChangeSets,
425
+ reportAuthorizationError,
426
+ turnAuthorization
427
+ ]);
428
+ useEffect(() => {
429
+ if (!error) return;
430
+ localTurnAwaitingApplyRef.current = false;
431
+ localTurnStreamStartedRef.current = false;
432
+ dispatch({ type: "failed" });
433
+ if (!hasUsefulLatestAssistantResponse) setMessages(pruneFailedMessagesForDisplay);
434
+ }, [
435
+ error,
436
+ hasUsefulLatestAssistantResponse,
437
+ setMessages
438
+ ]);
439
+ const submit = useCallback(({ files, text: rawText }) => {
440
+ const text = rawText.trim();
441
+ if (!text && files.length === 0) return false;
442
+ if (isStreaming || localTurnAwaitingApplyRef.current) return false;
443
+ localTurnAwaitingApplyRef.current = true;
444
+ localTurnStreamStartedRef.current = false;
445
+ setAuthorizationError(null);
446
+ if (authorizationError || error) setMessages(pruneFailedMessagesForDisplay);
447
+ clearError();
448
+ dispatch({ type: "submit" });
449
+ sendMessage(files.length > 0 ? text ? {
450
+ text,
451
+ files
452
+ } : { files } : { text }, { body: {
453
+ snapshot: controller?.getSnapshot() ?? null,
454
+ ...modelId ? { modelId } : {}
455
+ } });
456
+ return true;
457
+ }, [
458
+ authorizationError,
459
+ clearError,
460
+ controller,
461
+ error,
462
+ isStreaming,
463
+ modelId,
464
+ sendMessage,
465
+ setMessages
466
+ ]);
467
+ const stop = useCallback(() => {
468
+ localTurnAwaitingApplyRef.current = false;
469
+ localTurnStreamStartedRef.current = false;
470
+ dispatch({ type: "aborted" });
471
+ stopChat();
472
+ }, [stopChat]);
473
+ const retry = useCallback(() => {
474
+ localTurnAwaitingApplyRef.current = true;
475
+ localTurnStreamStartedRef.current = false;
476
+ setAuthorizationError(null);
477
+ clearError();
478
+ dispatch({ type: "submit" });
479
+ regenerate({ body: {
480
+ snapshot: controller?.getSnapshot() ?? null,
481
+ ...modelId ? { modelId } : {}
482
+ } });
483
+ }, [
484
+ clearError,
485
+ controller,
486
+ modelId,
487
+ regenerate
488
+ ]);
489
+ return {
490
+ applyResultsByChangeId,
491
+ authorizationError,
492
+ dismissError: useCallback(() => {
493
+ localTurnAwaitingApplyRef.current = false;
494
+ localTurnStreamStartedRef.current = false;
495
+ setMessages(pruneFailedMessagesForDisplay);
496
+ setAuthorizationError(null);
497
+ clearError();
498
+ dispatch({
499
+ type: "reset",
500
+ hasTranscript: messages.length > 0
501
+ });
502
+ }, [
503
+ clearError,
504
+ messages.length,
505
+ setMessages
506
+ ]),
507
+ error,
508
+ isStreaming,
509
+ latestTurnOutcome,
510
+ messages,
511
+ state,
512
+ status,
513
+ stop,
514
+ submit,
515
+ retry
516
+ };
517
+ };
518
+ //#endregion
519
+ export { createSurveyAssistantTransport as a, getSurveyDocumentVersionFromSnapshot as c, resolveSurveyTurnOutcome as d, unwrapSurveyAssistantToolOutput as f, createSurveyAssistantThreadClient as i, parseSurveyChangeSet as l, reduceSurveyAssistantSessionState as m, createSurveyAssistantModelCatalogClient as n, collectSurveyChangeSets as o, isSurveyAssistantTurnActive as p, useSurveyAssistantModelCatalog as r, createApplyReceipts as s, useSurveyAssistantSession as t, resolveLatestSurveyTurnAuthorization as u };
520
+
521
+ //# sourceMappingURL=react-VuYe-cPh.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"react-VuYe-cPh.mjs","names":["findLastUserMessageIndex"],"sources":["../src/react/session-state.ts","../src/react/turn-authorization.ts","../src/react/transport.ts","../src/react/thread-client.ts","../src/react/model-catalog.ts","../src/react/use-survey-assistant-session.ts"],"sourcesContent":["export type SurveyAssistantSessionState =\n | \"idle\"\n | \"submitting\"\n | \"streaming\"\n | \"completed\"\n | \"failed\"\n | \"aborted\"\n | \"applying\"\n | \"applied\";\n\nexport type SurveyAssistantSessionEvent =\n | { type: \"submit\" }\n | { type: \"stream-started\" }\n | { type: \"completed\" }\n | { type: \"apply-started\" }\n | { type: \"applied\" }\n | { type: \"failed\" }\n | { type: \"aborted\" }\n | { type: \"reset\"; hasTranscript: boolean };\n\nexport const isSurveyAssistantTurnActive = ({\n isStreaming,\n state,\n}: {\n isStreaming: boolean;\n state: SurveyAssistantSessionState;\n}): boolean =>\n state !== \"aborted\" &&\n (isStreaming || state === \"submitting\" || state === \"streaming\" || state === \"applying\");\n\nexport const reduceSurveyAssistantSessionState = (\n _state: SurveyAssistantSessionState,\n event: SurveyAssistantSessionEvent,\n): SurveyAssistantSessionState => {\n switch (event.type) {\n case \"submit\":\n return \"submitting\";\n case \"stream-started\":\n return \"streaming\";\n case \"completed\":\n return \"completed\";\n case \"apply-started\":\n return \"applying\";\n case \"applied\":\n return \"applied\";\n case \"failed\":\n return \"failed\";\n case \"aborted\":\n return \"aborted\";\n case \"reset\":\n return event.hasTranscript ? \"completed\" : \"idle\";\n }\n};\n","import {\n SURVEY_ASSISTANT_PROTOCOL_VERSION,\n SURVEY_ASSISTANT_TURN_FINAL_PART_TYPE,\n applyReceiptSchema,\n surveyAssistantTurnFinalSchema,\n surveyChangeSetSchema,\n type ApplyReceipt,\n type SurveyAssistantSnapshot,\n type SurveyAssistantTurnFinal,\n type SurveyApplyResult,\n type SurveyChangeSet,\n type SurveyDocumentVersion,\n} from \"../protocol\";\nimport type { UIMessage } from \"ai\";\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n typeof value === \"object\" && value !== null && !Array.isArray(value);\n\nconst isCompletedToolPart = (\n part: UIMessage[\"parts\"][number],\n): part is UIMessage[\"parts\"][number] & { state: \"output-available\"; output: unknown } =>\n (part.type === \"dynamic-tool\" || part.type.startsWith(\"tool-\")) &&\n \"state\" in part &&\n part.state === \"output-available\" &&\n \"output\" in part;\n\nexport const unwrapSurveyAssistantToolOutput = (output: unknown) => {\n if (isRecord(output) && \"output\" in output && output.output !== undefined) {\n return output.output;\n }\n return output;\n};\n\nexport const parseSurveyChangeSet = (output: unknown): SurveyChangeSet | null => {\n const parsed = surveyChangeSetSchema.safeParse(unwrapSurveyAssistantToolOutput(output));\n return parsed.success ? parsed.data : null;\n};\n\nexport const collectSurveyChangeSets = (messages: UIMessage[]): SurveyChangeSet[] => {\n const changes: SurveyChangeSet[] = [];\n for (const message of messages) {\n for (const part of message.parts) {\n if (!isCompletedToolPart(part)) {\n continue;\n }\n const change = parseSurveyChangeSet(part.output);\n if (change) {\n changes.push(change);\n }\n }\n }\n return changes;\n};\n\nconst findLastUserMessageIndex = (messages: UIMessage[]) => {\n for (let index = messages.length - 1; index >= 0; index -= 1) {\n if (messages[index]?.role === \"user\") return index;\n }\n return -1;\n};\n\nexport type SurveyTurnAuthorization =\n | { status: \"pending\" }\n | { status: \"invalid\"; reason: string; turnId?: string }\n | {\n status: \"failed\" | \"aborted\";\n turnFinal: SurveyAssistantTurnFinal;\n changeSets: [];\n }\n | {\n status: \"completed\";\n turnFinal: SurveyAssistantTurnFinal;\n changeSets: SurveyChangeSet[];\n };\n\nexport type SurveyTurnOutcome =\n | {\n status: \"blocked\";\n blockedChangeSetCount: number;\n }\n | {\n status: \"apply-failed\";\n appliedChangeSetCount: number;\n failedChangeSetCount: number;\n };\n\nexport const resolveLatestSurveyTurnAuthorization = (\n messages: UIMessage[],\n): SurveyTurnAuthorization => {\n const lastUserIndex = findLastUserMessageIndex(messages);\n if (lastUserIndex < 0) {\n return { status: \"pending\" };\n }\n\n const turnMessages = messages.slice(lastUserIndex + 1);\n const finalParts = turnMessages\n .flatMap((message) => message.parts)\n .filter((part) => part.type === SURVEY_ASSISTANT_TURN_FINAL_PART_TYPE);\n if (finalParts.length === 0) {\n return { status: \"pending\" };\n }\n if (finalParts.length !== 1) {\n return { status: \"invalid\", reason: \"The assistant returned multiple turn finals.\" };\n }\n\n const finalPart = finalParts[0];\n const finalParse = surveyAssistantTurnFinalSchema.safeParse(\n finalPart && \"data\" in finalPart ? finalPart.data : undefined,\n );\n if (!finalParse.success) {\n return { status: \"invalid\", reason: \"The assistant returned an invalid turn final.\" };\n }\n const turnFinal = finalParse.data;\n if (turnFinal.status !== \"completed\") {\n return { status: turnFinal.status, turnFinal, changeSets: [] };\n }\n\n const candidates = collectSurveyChangeSets(turnMessages).filter(\n (change) => change.turnId === turnFinal.turnId,\n );\n const candidatesById = new Map<string, SurveyChangeSet>();\n for (const candidate of candidates) {\n if (candidatesById.has(candidate.id)) {\n return {\n status: \"invalid\",\n turnId: turnFinal.turnId,\n reason: `The assistant returned duplicate change set \"${candidate.id}\".`,\n };\n }\n candidatesById.set(candidate.id, candidate);\n }\n\n for (const blockedChangeSetId of turnFinal.blockedChangeSetIds ?? []) {\n const candidate = candidatesById.get(blockedChangeSetId);\n if (!candidate || candidate.status !== \"rejected\" || candidate.validation.valid) {\n return {\n status: \"invalid\",\n turnId: turnFinal.turnId,\n reason: `The assistant did not provide blocked change set \"${blockedChangeSetId}\".`,\n };\n }\n }\n\n const changeSets: SurveyChangeSet[] = [];\n for (const changeSetId of turnFinal.executableChangeSetIds) {\n const candidate = candidatesById.get(changeSetId);\n if (!candidate || candidate.status !== \"validated\" || !candidate.validation.valid) {\n return {\n status: \"invalid\",\n turnId: turnFinal.turnId,\n reason: `The assistant did not provide authorized change set \"${changeSetId}\".`,\n };\n }\n changeSets.push(candidate);\n }\n\n return { status: \"completed\", turnFinal, changeSets };\n};\n\nexport const resolveSurveyTurnOutcome = ({\n applyResultsByChangeId,\n authorization,\n}: {\n applyResultsByChangeId: Record<string, SurveyApplyResult>;\n authorization: SurveyTurnAuthorization;\n}): SurveyTurnOutcome | null => {\n if (authorization.status !== \"completed\") {\n return null;\n }\n\n const blockedChangeSetCount = authorization.turnFinal.blockedChangeSetIds?.length ?? 0;\n if (blockedChangeSetCount > 0) {\n return { status: \"blocked\", blockedChangeSetCount };\n }\n\n if (authorization.changeSets.length === 0) {\n return null;\n }\n\n const results = authorization.changeSets.map((change) => applyResultsByChangeId[change.id]);\n if (results.some((result) => result === undefined)) {\n return null;\n }\n\n const failedChangeSetCount = results.filter((result) => result.status !== \"applied\").length;\n if (failedChangeSetCount === 0) {\n return null;\n }\n\n return {\n status: \"apply-failed\",\n appliedChangeSetCount: results.length - failedChangeSetCount,\n failedChangeSetCount,\n };\n};\n\nexport const getSurveyDocumentVersionFromSnapshot = (\n snapshot: SurveyAssistantSnapshot,\n): SurveyDocumentVersion => ({ ...snapshot.version });\n\nexport const createApplyReceipts = ({\n afterSnapshot,\n beforeSnapshot,\n changeSets,\n results,\n turnFinal,\n createdAt = new Date().toISOString(),\n}: {\n afterSnapshot: SurveyAssistantSnapshot | null;\n beforeSnapshot: SurveyAssistantSnapshot;\n changeSets: SurveyChangeSet[];\n results: SurveyApplyResult[];\n turnFinal: SurveyAssistantTurnFinal;\n createdAt?: string;\n}): ApplyReceipt[] => {\n const beforeVersion = getSurveyDocumentVersionFromSnapshot(beforeSnapshot);\n const afterVersion = afterSnapshot\n ? getSurveyDocumentVersionFromSnapshot(afterSnapshot)\n : undefined;\n const resultsByChangeId = new Map(results.map((result) => [result.changeId, result]));\n\n return changeSets.map((changeSet) => {\n const result = resultsByChangeId.get(changeSet.id);\n const status = result?.status ?? \"failed\";\n return applyReceiptSchema.parse({\n protocolVersion: SURVEY_ASSISTANT_PROTOCOL_VERSION,\n turnId: turnFinal.turnId,\n changeSetId: changeSet.id,\n beforeVersion,\n ...(status === \"applied\" && afterVersion ? { afterVersion } : {}),\n status,\n operationCount: changeSet.operations.length,\n ...(status === \"applied\" && afterVersion?.historyIndex !== undefined\n ? { commit: { index: afterVersion.historyIndex } }\n : {}),\n ...(result?.issues ? { issues: result.issues } : {}),\n createdAt,\n });\n });\n};\n","import { DefaultChatTransport, type UIMessage } from \"ai\";\n\nconst findLastUserMessage = (messages: UIMessage[]): UIMessage | undefined => {\n for (let index = messages.length - 1; index >= 0; index -= 1) {\n if (messages[index]?.role === \"user\") return messages[index];\n }\n return undefined;\n};\n\nexport const createSurveyAssistantTransport = ({\n api = \"/api/survey-assistant/chat\",\n resourceId,\n threadId,\n}: {\n api?: string;\n resourceId: string;\n threadId: string;\n}) =>\n new DefaultChatTransport({\n api,\n body: { resourceId, threadId },\n prepareSendMessagesRequest: ({\n api,\n body,\n credentials,\n headers,\n id,\n messageId,\n messages,\n trigger,\n }) => {\n const latestUserMessage = findLastUserMessage(messages);\n return {\n api,\n credentials,\n headers,\n body: {\n ...body,\n id,\n messages: latestUserMessage ? [latestUserMessage] : [],\n trigger,\n messageId,\n },\n };\n },\n });\n","import {\n surveyAssistantThreadListSchema,\n surveyAssistantThreadSchema,\n surveyAssistantThreadTranscriptSchema,\n type SurveyAssistantThread,\n type SurveyAssistantThreadTranscript,\n} from \"../protocol\";\nimport { readSurveyAssistantJson } from \"./client-error\";\n\nexport interface SurveyAssistantThreadClient {\n delete(threadId: string): Promise<void>;\n create(title?: string): Promise<SurveyAssistantThread>;\n list(): Promise<SurveyAssistantThread[]>;\n read(threadId: string): Promise<SurveyAssistantThreadTranscript>;\n rename(threadId: string, title: string): Promise<SurveyAssistantThread>;\n setAutomaticTitle(threadId: string, title?: string): Promise<SurveyAssistantThread>;\n}\n\nexport const createSurveyAssistantThreadClient = (\n api = \"/api/survey-assistant/threads\",\n): SurveyAssistantThreadClient => ({\n async delete(threadId) {\n const response = await fetch(`${api}/${encodeURIComponent(threadId)}`, { method: \"DELETE\" });\n if (!response.ok) await readSurveyAssistantJson(response);\n },\n async create(title) {\n const body = await readSurveyAssistantJson(\n await fetch(api, {\n body: JSON.stringify(title ? { title } : {}),\n headers: { \"content-type\": \"application/json\" },\n method: \"POST\",\n }),\n );\n return surveyAssistantThreadSchema.parse(body.thread);\n },\n async list() {\n const body = await readSurveyAssistantJson(await fetch(api, { cache: \"no-store\" }));\n return surveyAssistantThreadListSchema.parse(body).threads;\n },\n async read(threadId) {\n const body = await readSurveyAssistantJson(\n await fetch(`${api}/${encodeURIComponent(threadId)}`, { cache: \"no-store\" }),\n );\n return surveyAssistantThreadTranscriptSchema.parse(body);\n },\n async rename(threadId, title) {\n const body = await readSurveyAssistantJson(\n await fetch(`${api}/${encodeURIComponent(threadId)}`, {\n body: JSON.stringify({ mode: \"manual\", title }),\n headers: { \"content-type\": \"application/json\" },\n method: \"PATCH\",\n }),\n );\n return surveyAssistantThreadSchema.parse(body.thread);\n },\n async setAutomaticTitle(threadId, title) {\n const body = await readSurveyAssistantJson(\n await fetch(`${api}/${encodeURIComponent(threadId)}`, {\n body: JSON.stringify({ mode: \"automatic\", ...(title ? { title } : {}) }),\n headers: { \"content-type\": \"application/json\" },\n method: \"PATCH\",\n }),\n );\n return surveyAssistantThreadSchema.parse(body.thread);\n },\n});\n","import { useCallback, useEffect, useState } from \"react\";\nimport {\n surveyAssistantModelCatalogSchema,\n type SurveyAssistantModelCatalog,\n type SurveyAssistantModelOption,\n} from \"../protocol\";\nimport { readSurveyAssistantJson } from \"./client-error\";\n\nconst DEFAULT_MODEL_STORAGE_KEY = \"survey-assistant-selected-model\";\n\nexport interface SurveyAssistantModelCatalogClient {\n get(): Promise<SurveyAssistantModelCatalog>;\n}\n\nexport const createSurveyAssistantModelCatalogClient = (\n api = \"/api/survey-assistant/models\",\n): SurveyAssistantModelCatalogClient => ({\n async get() {\n const body = await readSurveyAssistantJson(\n await fetch(api, { cache: \"no-store\" }),\n \"The assistant model catalog could not be loaded.\",\n );\n return surveyAssistantModelCatalogSchema.parse(body);\n },\n});\n\nexport interface UseSurveyAssistantModelCatalogOptions {\n api?: string;\n client?: SurveyAssistantModelCatalogClient;\n onModelChange?(modelId: string): void;\n storageKey?: string | false;\n}\n\nexport interface SurveyAssistantModelCatalogState {\n error: Error | null;\n loading: boolean;\n modelId?: string;\n models: SurveyAssistantModelOption[];\n reload(): void;\n selectModel(modelId: string): void;\n}\n\nexport const useSurveyAssistantModelCatalog = ({\n api,\n client: providedClient,\n onModelChange,\n storageKey = DEFAULT_MODEL_STORAGE_KEY,\n}: UseSurveyAssistantModelCatalogOptions = {}): SurveyAssistantModelCatalogState => {\n const [models, setModels] = useState<SurveyAssistantModelOption[]>([]);\n const [modelId, setModelId] = useState<string>();\n const [error, setError] = useState<Error | null>(null);\n const [loading, setLoading] = useState(true);\n const [reloadToken, setReloadToken] = useState(0);\n\n useEffect(() => {\n let cancelled = false;\n const client = providedClient ?? createSurveyAssistantModelCatalogClient(api);\n setLoading(true);\n setError(null);\n void client\n .get()\n .then((catalog) => {\n if (cancelled) return;\n const rememberedId =\n storageKey && typeof window !== \"undefined\"\n ? (window.localStorage.getItem(storageKey) ?? undefined)\n : undefined;\n const selectedId =\n rememberedId && catalog.models.some((model) => model.id === rememberedId)\n ? rememberedId\n : catalog.defaultModelId;\n setModels(catalog.models);\n setModelId(selectedId);\n onModelChange?.(selectedId);\n })\n .catch((reason: unknown) => {\n if (!cancelled) setError(reason instanceof Error ? reason : new Error(String(reason)));\n })\n .finally(() => {\n if (!cancelled) setLoading(false);\n });\n return () => {\n cancelled = true;\n };\n }, [api, onModelChange, providedClient, reloadToken, storageKey]);\n\n const selectModel = useCallback(\n (nextModelId: string) => {\n if (!models.some((model) => model.id === nextModelId)) return;\n setModelId(nextModelId);\n if (storageKey && typeof window !== \"undefined\") {\n window.localStorage.setItem(storageKey, nextModelId);\n }\n onModelChange?.(nextModelId);\n },\n [models, onModelChange, storageKey],\n );\n\n const reload = useCallback(() => setReloadToken((current) => current + 1), []);\n\n return { error, loading, modelId, models, reload, selectModel };\n};\n","\"use client\";\n\nimport { useChat } from \"@ai-sdk/react\";\nimport type {\n ApplyReceipt,\n SurveyApplyResult,\n SurveyAssistantApplyPolicy,\n SurveyAssistantTurnFinal,\n SurveyChangeSet,\n} from \"../protocol\";\nimport type { ChatStatus, FileUIPart, UIMessage } from \"ai\";\nimport {\n useCallback,\n useEffect,\n useEffectEvent,\n useMemo,\n useReducer,\n useRef,\n useState,\n} from \"react\";\nimport {\n collectSurveyChangeSets,\n createApplyReceipts,\n resolveLatestSurveyTurnAuthorization,\n resolveSurveyTurnOutcome,\n} from \"./turn-authorization\";\nimport { isSurveyAssistantTurnActive, reduceSurveyAssistantSessionState } from \"./session-state\";\nimport type { SurveyAssistantSessionState } from \"./session-state\";\nimport type { SurveyTurnOutcome } from \"./turn-authorization\";\nimport { createSurveyAssistantTransport } from \"./transport\";\nimport type { SurveyAssistantController } from \"./controller\";\n\nconst createLocalId = (prefix: string) => {\n const id = globalThis.crypto?.randomUUID?.() ?? Math.random().toString(36).slice(2);\n return `${prefix}-${id}`;\n};\n\ntype AssistantTextPart = Extract<UIMessage[\"parts\"][number], { type: \"text\" }>;\n\nconst getAssistantTextParts = (message: UIMessage) =>\n message.parts.filter(\n (part): part is AssistantTextPart => part.type === \"text\" && part.text.trim().length > 0,\n );\n\nconst findLastAssistantTextMessageIndex = (\n messages: UIMessage[],\n endExclusive = messages.length,\n) => {\n for (let index = Math.min(messages.length, endExclusive) - 1; index >= 0; index -= 1) {\n const message = messages[index];\n if (message?.role === \"assistant\" && getAssistantTextParts(message).length > 0) return index;\n }\n return -1;\n};\n\nconst findLastUserMessageIndex = (messages: UIMessage[]) => {\n for (let index = messages.length - 1; index >= 0; index -= 1) {\n if (messages[index]?.role === \"user\") return index;\n }\n return -1;\n};\n\nconst pruneFailedMessagesForDisplay = (messages: UIMessage[]): UIMessage[] => {\n const lastUserIndex = findLastUserMessageIndex(messages);\n const lastCompletedAssistantIndex = findLastAssistantTextMessageIndex(messages);\n\n if (lastUserIndex > lastCompletedAssistantIndex) return messages.slice(0, lastUserIndex + 1);\n return lastCompletedAssistantIndex >= 0 ? messages.slice(0, lastCompletedAssistantIndex + 1) : [];\n};\n\nconst hasCompletedAssistantResponseAfterLastUser = (messages: UIMessage[]) => {\n const lastUserIndex = findLastUserMessageIndex(messages);\n return lastUserIndex >= 0 && findLastAssistantTextMessageIndex(messages) > lastUserIndex;\n};\n\nconst collectChangeSetsAfterLastUser = (messages: UIMessage[]) => {\n const lastUserIndex = findLastUserMessageIndex(messages);\n return lastUserIndex < 0 ? [] : collectSurveyChangeSets(messages.slice(lastUserIndex + 1));\n};\n\nexport interface SurveyAssistantSessionOptions {\n api?: string;\n applyPolicy?: SurveyAssistantApplyPolicy;\n controller?: SurveyAssistantController | null;\n initialMessages?: UIMessage[];\n modelId?: string;\n onApplyReceipts?: (receipts: ApplyReceipt[]) => void;\n onReviewChangeSets?: (changeSets: SurveyChangeSet[], turnFinal: SurveyAssistantTurnFinal) => void;\n /** Reports when a turn owns the editor state, including submission, streaming, and apply. */\n onTurnActiveChange?: (active: boolean) => void;\n resourceId?: string;\n threadId?: string;\n}\n\nexport interface SurveyAssistantSubmitMessage {\n text: string;\n files: FileUIPart[];\n}\n\nexport interface SurveyAssistantSession {\n applyResultsByChangeId: Record<string, SurveyApplyResult>;\n authorizationError: string | null;\n dismissError(): void;\n error: Error | undefined;\n isStreaming: boolean;\n latestTurnOutcome: SurveyTurnOutcome | null;\n messages: UIMessage[];\n state: SurveyAssistantSessionState;\n status: ChatStatus;\n stop(): void;\n submit(message: SurveyAssistantSubmitMessage): boolean;\n retry(): void;\n}\n\nexport const useSurveyAssistantSession = ({\n api,\n applyPolicy = \"auto\",\n controller,\n initialMessages = [],\n modelId,\n onApplyReceipts,\n onReviewChangeSets,\n onTurnActiveChange,\n resourceId: controlledResourceId,\n threadId: controlledThreadId,\n}: SurveyAssistantSessionOptions): SurveyAssistantSession => {\n const [localResourceId] = useState(() => createLocalId(\"survey-assistant-local-user\"));\n const [localThreadId] = useState(() => createLocalId(\"survey-assistant-local-thread\"));\n const resourceId = controlledResourceId ?? localResourceId;\n const threadId = controlledThreadId ?? localThreadId;\n const [state, dispatch] = useReducer(reduceSurveyAssistantSessionState, \"idle\");\n const [applyResultsByChangeId, setApplyResultsByChangeId] = useState<\n Record<string, SurveyApplyResult>\n >({});\n const [authorizationError, setAuthorizationError] = useState<string | null>(null);\n const handledTurnIdsRef = useRef<Set<string>>(new Set());\n const localTurnAwaitingApplyRef = useRef(false);\n const localTurnStreamStartedRef = useRef(false);\n\n const transport = useMemo(\n () => createSurveyAssistantTransport({ api, resourceId, threadId }),\n [api, resourceId, threadId],\n );\n const {\n messages,\n setMessages,\n sendMessage,\n status,\n stop: stopChat,\n error,\n clearError,\n regenerate,\n } = useChat({ id: threadId, messages: initialMessages, transport });\n const isStreaming = status === \"submitted\" || status === \"streaming\";\n const isTurnActive = isSurveyAssistantTurnActive({ isStreaming, state });\n const notifyTurnActiveChange = useEffectEvent((active: boolean) => {\n onTurnActiveChange?.(active);\n });\n const turnAuthorization = useMemo(\n () => resolveLatestSurveyTurnAuthorization(messages),\n [messages],\n );\n const latestTurnOutcome = useMemo(\n () => resolveSurveyTurnOutcome({ applyResultsByChangeId, authorization: turnAuthorization }),\n [applyResultsByChangeId, turnAuthorization],\n );\n const hasUsefulLatestAssistantResponse = useMemo(\n () =>\n hasCompletedAssistantResponseAfterLastUser(messages) ||\n collectChangeSetsAfterLastUser(messages).length > 0,\n [messages],\n );\n\n const reportAuthorizationError = useCallback((message: string) => {\n queueMicrotask(() => {\n setAuthorizationError(message);\n dispatch({ type: \"failed\" });\n });\n }, []);\n\n useEffect(() => {\n if (status === \"submitted\") dispatch({ type: \"submit\" });\n if (status === \"streaming\") dispatch({ type: \"stream-started\" });\n }, [status]);\n\n useEffect(() => {\n notifyTurnActiveChange(isTurnActive);\n\n return () => {\n if (isTurnActive) notifyTurnActiveChange(false);\n };\n }, [isTurnActive]);\n\n useEffect(() => {\n if (isStreaming) {\n localTurnStreamStartedRef.current = true;\n return;\n }\n if (!localTurnAwaitingApplyRef.current) return;\n\n if (turnAuthorization.status === \"pending\") {\n if (!localTurnStreamStartedRef.current) return;\n const timeoutId = window.setTimeout(() => {\n localTurnAwaitingApplyRef.current = false;\n localTurnStreamStartedRef.current = false;\n reportAuthorizationError(\"The assistant response ended without a valid turn final.\");\n }, 100);\n return () => window.clearTimeout(timeoutId);\n }\n\n localTurnAwaitingApplyRef.current = false;\n localTurnStreamStartedRef.current = false;\n if (turnAuthorization.status === \"invalid\") {\n reportAuthorizationError(turnAuthorization.reason);\n return;\n }\n\n const { turnFinal } = turnAuthorization;\n if (handledTurnIdsRef.current.has(turnFinal.turnId)) return;\n handledTurnIdsRef.current.add(turnFinal.turnId);\n\n if (turnAuthorization.status !== \"completed\" || turnAuthorization.changeSets.length === 0) {\n dispatch({ type: \"completed\" });\n return;\n }\n if (applyPolicy === \"deny\") {\n dispatch({ type: \"completed\" });\n return;\n }\n if (applyPolicy === \"review\") {\n onReviewChangeSets?.(turnAuthorization.changeSets, turnFinal);\n dispatch({ type: \"completed\" });\n return;\n }\n if (!controller?.applyAssistantChange && !controller?.applyAssistantChanges) {\n reportAuthorizationError(\"No survey editor apply adapter is available.\");\n return;\n }\n\n const beforeSnapshot = controller.getSnapshot();\n if (!beforeSnapshot) {\n reportAuthorizationError(\n \"The editor state was unavailable when applying the assistant change.\",\n );\n return;\n }\n\n dispatch({ type: \"apply-started\" });\n const result = controller.applyAssistantChanges?.(turnAuthorization.changeSets) ?? {\n results: turnAuthorization.changeSets\n .map((change) => controller.applyAssistantChange?.(change))\n .filter((applyResult): applyResult is SurveyApplyResult => Boolean(applyResult)),\n };\n queueMicrotask(() =>\n setApplyResultsByChangeId((current) => ({\n ...current,\n ...Object.fromEntries(\n result.results.map((applyResult) => [applyResult.changeId, applyResult]),\n ),\n })),\n );\n const receipts = createApplyReceipts({\n beforeSnapshot,\n afterSnapshot: controller.getSnapshot(),\n changeSets: turnAuthorization.changeSets,\n results: result.results,\n turnFinal,\n });\n onApplyReceipts?.(receipts);\n dispatch({\n type: result.results.every((applyResult) => applyResult.status === \"applied\")\n ? \"applied\"\n : \"completed\",\n });\n }, [\n applyPolicy,\n controller,\n isStreaming,\n onApplyReceipts,\n onReviewChangeSets,\n reportAuthorizationError,\n turnAuthorization,\n ]);\n\n useEffect(() => {\n if (!error) return;\n localTurnAwaitingApplyRef.current = false;\n localTurnStreamStartedRef.current = false;\n dispatch({ type: \"failed\" });\n if (!hasUsefulLatestAssistantResponse) setMessages(pruneFailedMessagesForDisplay);\n }, [error, hasUsefulLatestAssistantResponse, setMessages]);\n\n const submit = useCallback(\n ({ files, text: rawText }: SurveyAssistantSubmitMessage) => {\n const text = rawText.trim();\n if (!text && files.length === 0) return false;\n if (isStreaming || localTurnAwaitingApplyRef.current) return false;\n\n localTurnAwaitingApplyRef.current = true;\n localTurnStreamStartedRef.current = false;\n setAuthorizationError(null);\n if (authorizationError || error) setMessages(pruneFailedMessagesForDisplay);\n clearError();\n dispatch({ type: \"submit\" });\n\n void sendMessage(files.length > 0 ? (text ? { text, files } : { files }) : { text }, {\n body: { snapshot: controller?.getSnapshot() ?? null, ...(modelId ? { modelId } : {}) },\n });\n return true;\n },\n [\n authorizationError,\n clearError,\n controller,\n error,\n isStreaming,\n modelId,\n sendMessage,\n setMessages,\n ],\n );\n\n const stop = useCallback(() => {\n localTurnAwaitingApplyRef.current = false;\n localTurnStreamStartedRef.current = false;\n dispatch({ type: \"aborted\" });\n void stopChat();\n }, [stopChat]);\n\n const retry = useCallback(() => {\n localTurnAwaitingApplyRef.current = true;\n localTurnStreamStartedRef.current = false;\n setAuthorizationError(null);\n clearError();\n dispatch({ type: \"submit\" });\n void regenerate({\n body: { snapshot: controller?.getSnapshot() ?? null, ...(modelId ? { modelId } : {}) },\n });\n }, [clearError, controller, modelId, regenerate]);\n\n const dismissError = useCallback(() => {\n localTurnAwaitingApplyRef.current = false;\n localTurnStreamStartedRef.current = false;\n setMessages(pruneFailedMessagesForDisplay);\n setAuthorizationError(null);\n clearError();\n dispatch({ type: \"reset\", hasTranscript: messages.length > 0 });\n }, [clearError, messages.length, setMessages]);\n\n return {\n applyResultsByChangeId,\n authorizationError,\n dismissError,\n error,\n isStreaming,\n latestTurnOutcome,\n messages,\n state,\n status,\n stop,\n submit,\n retry,\n };\n};\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { a as SurveyAssistantController, c as SurveyAssistantTaskExecutionOptions, d as SurveyAssistantTaskExecutorRequestOptions, f as createSurveyAssistantTaskClient, i as createSurveyAssistantControllerProxy, l as SurveyAssistantTaskExecutor, n as SurveyAssistantControllerBridge, o as SurveyAssistantTaskClient, p as createSurveyAssistantTaskExecutor, r as createSurveyAssistantControllerBridge, s as SurveyAssistantTaskClientOptions, t as CreateSurveyAssistantControllerProxyOptions, u as SurveyAssistantTaskExecutorCacheContext } from "./controller-proxy-BRDusFiO.mjs";
2
+ export { type CreateSurveyAssistantControllerProxyOptions, type SurveyAssistantController, type SurveyAssistantControllerBridge, type SurveyAssistantTaskClient, type SurveyAssistantTaskClientOptions, type SurveyAssistantTaskExecutionOptions, type SurveyAssistantTaskExecutor, type SurveyAssistantTaskExecutorCacheContext, type SurveyAssistantTaskExecutorRequestOptions, createSurveyAssistantControllerBridge, createSurveyAssistantControllerProxy, createSurveyAssistantTaskClient, createSurveyAssistantTaskExecutor };
@@ -0,0 +1,3 @@
1
+ "use client";
2
+ import { i as createSurveyAssistantTaskExecutor, n as createSurveyAssistantControllerProxy, r as createSurveyAssistantTaskClient, t as createSurveyAssistantControllerBridge } from "./controller-proxy-Duxo2IFE.mjs";
3
+ export { createSurveyAssistantControllerBridge, createSurveyAssistantControllerProxy, createSurveyAssistantTaskClient, createSurveyAssistantTaskExecutor };
@@ -0,0 +1,3 @@
1
+ import { C as SurveyAssistantSessionEvent, E as reduceSurveyAssistantSessionState, S as unwrapSurveyAssistantToolOutput, T as isSurveyAssistantTurnActive, _ as createApplyReceipts, a as SurveyAssistantModelCatalogClient, b as resolveLatestSurveyTurnAuthorization, c as createSurveyAssistantModelCatalogClient, d as SurveyAssistantThreadClient, f as createSurveyAssistantThreadClient, g as collectSurveyChangeSets, h as SurveyTurnOutcome, i as useSurveyAssistantSession, l as useSurveyAssistantModelCatalog, m as SurveyTurnAuthorization, n as SurveyAssistantSessionOptions, o as SurveyAssistantModelCatalogState, p as createSurveyAssistantTransport, r as SurveyAssistantSubmitMessage, s as UseSurveyAssistantModelCatalogOptions, t as SurveyAssistantSession, u as SurveyAssistantClientError, v as getSurveyDocumentVersionFromSnapshot, w as SurveyAssistantSessionState, x as resolveSurveyTurnOutcome, y as parseSurveyChangeSet } from "./index-BWNHkpkh.mjs";
2
+ import { a as SurveyAssistantController, c as SurveyAssistantTaskExecutionOptions, d as SurveyAssistantTaskExecutorRequestOptions, f as createSurveyAssistantTaskClient, i as createSurveyAssistantControllerProxy, l as SurveyAssistantTaskExecutor, n as SurveyAssistantControllerBridge, o as SurveyAssistantTaskClient, p as createSurveyAssistantTaskExecutor, r as createSurveyAssistantControllerBridge, s as SurveyAssistantTaskClientOptions, t as CreateSurveyAssistantControllerProxyOptions, u as SurveyAssistantTaskExecutorCacheContext } from "./controller-proxy-BRDusFiO.mjs";
3
+ export { CreateSurveyAssistantControllerProxyOptions, SurveyAssistantClientError, SurveyAssistantController, SurveyAssistantControllerBridge, SurveyAssistantModelCatalogClient, SurveyAssistantModelCatalogState, SurveyAssistantSession, SurveyAssistantSessionEvent, SurveyAssistantSessionOptions, SurveyAssistantSessionState, SurveyAssistantSubmitMessage, SurveyAssistantTaskClient, SurveyAssistantTaskClientOptions, SurveyAssistantTaskExecutionOptions, SurveyAssistantTaskExecutor, SurveyAssistantTaskExecutorCacheContext, SurveyAssistantTaskExecutorRequestOptions, SurveyAssistantThreadClient, SurveyTurnAuthorization, SurveyTurnOutcome, UseSurveyAssistantModelCatalogOptions, collectSurveyChangeSets, createApplyReceipts, createSurveyAssistantControllerBridge, createSurveyAssistantControllerProxy, createSurveyAssistantModelCatalogClient, createSurveyAssistantTaskClient, createSurveyAssistantTaskExecutor, createSurveyAssistantThreadClient, createSurveyAssistantTransport, getSurveyDocumentVersionFromSnapshot, isSurveyAssistantTurnActive, parseSurveyChangeSet, reduceSurveyAssistantSessionState, resolveLatestSurveyTurnAuthorization, resolveSurveyTurnOutcome, unwrapSurveyAssistantToolOutput, useSurveyAssistantModelCatalog, useSurveyAssistantSession };
package/dist/react.mjs ADDED
@@ -0,0 +1,4 @@
1
+ "use client";
2
+ import { a as createSurveyAssistantTransport, c as getSurveyDocumentVersionFromSnapshot, d as resolveSurveyTurnOutcome, f as unwrapSurveyAssistantToolOutput, i as createSurveyAssistantThreadClient, l as parseSurveyChangeSet, m as reduceSurveyAssistantSessionState, n as createSurveyAssistantModelCatalogClient, o as collectSurveyChangeSets, p as isSurveyAssistantTurnActive, r as useSurveyAssistantModelCatalog, s as createApplyReceipts, t as useSurveyAssistantSession, u as resolveLatestSurveyTurnAuthorization } from "./react-VuYe-cPh.mjs";
3
+ import { a as SurveyAssistantClientError, i as createSurveyAssistantTaskExecutor, n as createSurveyAssistantControllerProxy, r as createSurveyAssistantTaskClient, t as createSurveyAssistantControllerBridge } from "./controller-proxy-Duxo2IFE.mjs";
4
+ export { SurveyAssistantClientError, collectSurveyChangeSets, createApplyReceipts, createSurveyAssistantControllerBridge, createSurveyAssistantControllerProxy, createSurveyAssistantModelCatalogClient, createSurveyAssistantTaskClient, createSurveyAssistantTaskExecutor, createSurveyAssistantThreadClient, createSurveyAssistantTransport, getSurveyDocumentVersionFromSnapshot, isSurveyAssistantTurnActive, parseSurveyChangeSet, reduceSurveyAssistantSessionState, resolveLatestSurveyTurnAuthorization, resolveSurveyTurnOutcome, unwrapSurveyAssistantToolOutput, useSurveyAssistantModelCatalog, useSurveyAssistantSession };