@case-framework/survey-assistant 0.1.0 → 0.2.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 (113) hide show
  1. package/README.md +71 -11
  2. package/dist/{authoring-references-X6uRaWuf.mjs → authoring-references-DYuOAdVx.mjs} +26 -2
  3. package/dist/authoring-references-DYuOAdVx.mjs.map +1 -0
  4. package/dist/{capabilities-B6tvE7fK.mjs → capabilities-DZ0a_o2y.mjs} +2 -2
  5. package/dist/{capabilities-B6tvE7fK.mjs.map → capabilities-DZ0a_o2y.mjs.map} +1 -1
  6. package/dist/{capabilities-DvSKtjAw.d.mts → capabilities-DlC1l6qy.d.mts} +4 -1
  7. package/dist/capabilities-DlC1l6qy.d.mts.map +1 -0
  8. package/dist/capabilities-default.d.mts +1 -1
  9. package/dist/capabilities-default.d.mts.map +1 -1
  10. package/dist/capabilities-default.mjs +6 -3
  11. package/dist/capabilities-default.mjs.map +1 -1
  12. package/dist/{constants-Jw0k8ojS.d.mts → constants-56jf_4ls.d.mts} +36 -9
  13. package/dist/constants-56jf_4ls.d.mts.map +1 -0
  14. package/dist/{controller-proxy-BRDusFiO.d.mts → controller-proxy-2VH0b_5E.d.mts} +29 -4
  15. package/dist/controller-proxy-2VH0b_5E.d.mts.map +1 -0
  16. package/dist/{controller-proxy-Duxo2IFE.mjs → controller-proxy-ClsY4lFI.mjs} +74 -5
  17. package/dist/controller-proxy-ClsY4lFI.mjs.map +1 -0
  18. package/dist/{digest-BsoVq49o.d.mts → digest-BvXpeWcR.d.mts} +2 -2
  19. package/dist/{digest-BsoVq49o.d.mts.map → digest-BvXpeWcR.d.mts.map} +1 -1
  20. package/dist/digest.d.mts +1 -1
  21. package/dist/{engine-sPvuixWg.mjs → engine-DQrCO_ur.mjs} +392 -50
  22. package/dist/engine-DQrCO_ur.mjs.map +1 -0
  23. package/dist/engine.d.mts +2 -2
  24. package/dist/engine.mjs +2 -2
  25. package/dist/{index-MpEMQzTm.d.mts → index-B_x2IYi7.d.mts} +5 -1
  26. package/dist/index-B_x2IYi7.d.mts.map +1 -0
  27. package/dist/{index-BWNHkpkh.d.mts → index-C_x686M7.d.mts} +27 -5
  28. package/dist/index-C_x686M7.d.mts.map +1 -0
  29. package/dist/{index-TFtvBiSQ.d.mts → index-DVxVyhAu.d.mts} +31 -9
  30. package/dist/index-DVxVyhAu.d.mts.map +1 -0
  31. package/dist/{index-CUqbBjkc.d.mts → index-DZ6KBwVR.d.mts} +16 -3
  32. package/dist/index-DZ6KBwVR.d.mts.map +1 -0
  33. package/dist/{memory-thread-repository-CJkkVE2-.mjs → memory-thread-repository-Cm1BJyRw.mjs} +110 -41
  34. package/dist/memory-thread-repository-Cm1BJyRw.mjs.map +1 -0
  35. package/dist/{protocol-DV0ka9WT.mjs → protocol-7EEgcYja.mjs} +70 -97
  36. package/dist/protocol-7EEgcYja.mjs.map +1 -0
  37. package/dist/protocol.d.mts +3 -3
  38. package/dist/protocol.mjs +2 -2
  39. package/dist/{react-VuYe-cPh.mjs → react-B_5smfiK.mjs} +145 -38
  40. package/dist/react-B_5smfiK.mjs.map +1 -0
  41. package/dist/react-integration.d.mts +2 -2
  42. package/dist/react-integration.mjs +2 -2
  43. package/dist/react.d.mts +3 -3
  44. package/dist/react.mjs +3 -3
  45. package/dist/references/assistant-operations.md +6 -0
  46. package/dist/references/core-rules.md +6 -0
  47. package/dist/references/embedded-forms.md +21 -14
  48. package/dist/references/expressions.md +3 -0
  49. package/dist/references/item-types.md +37 -10
  50. package/dist/references/source-material-surveys.md +9 -1
  51. package/dist/references/survey-data-model.md +13 -0
  52. package/dist/request-context-BDBw4-Gw.mjs +79 -0
  53. package/dist/request-context-BDBw4-Gw.mjs.map +1 -0
  54. package/dist/request-guardrails-h4t6u8mP.mjs +129 -0
  55. package/dist/request-guardrails-h4t6u8mP.mjs.map +1 -0
  56. package/dist/server-agent.d.mts +6 -2
  57. package/dist/server-agent.d.mts.map +1 -1
  58. package/dist/server-agent.mjs +39 -24
  59. package/dist/server-agent.mjs.map +1 -1
  60. package/dist/server-runtime.d.mts +21 -5
  61. package/dist/server-runtime.d.mts.map +1 -1
  62. package/dist/server-runtime.mjs +98 -32
  63. package/dist/server-runtime.mjs.map +1 -1
  64. package/dist/server-tasks.d.mts +2 -78
  65. package/dist/server-tasks.mjs +103 -46
  66. package/dist/server-tasks.mjs.map +1 -1
  67. package/dist/server-tools.d.mts +1 -1
  68. package/dist/server-tools.mjs +1 -1
  69. package/dist/server.d.mts +89 -21
  70. package/dist/server.d.mts.map +1 -1
  71. package/dist/server.mjs +136 -5
  72. package/dist/server.mjs.map +1 -0
  73. package/dist/storage-postgres.d.mts +12 -2
  74. package/dist/storage-postgres.d.mts.map +1 -1
  75. package/dist/storage-postgres.mjs +11 -6
  76. package/dist/storage-postgres.mjs.map +1 -1
  77. package/dist/tasks-COQnhSeT.d.mts +140 -0
  78. package/dist/tasks-COQnhSeT.d.mts.map +1 -0
  79. package/dist/{thread-documents-DamIq9Od.d.mts → thread-documents-BlxNjc7S.d.mts} +21 -5
  80. package/dist/thread-documents-BlxNjc7S.d.mts.map +1 -0
  81. package/dist/{thread-handlers-DpynUc64.d.mts → thread-handlers-l79JBl5m.d.mts} +38 -5
  82. package/dist/thread-handlers-l79JBl5m.d.mts.map +1 -0
  83. package/dist/{tools-Hz2p7vyv.mjs → tools-DDXaJ8Za.mjs} +257 -38
  84. package/dist/tools-DDXaJ8Za.mjs.map +1 -0
  85. package/dist/ui.d.mts +5 -3
  86. package/dist/ui.d.mts.map +1 -1
  87. package/dist/ui.mjs +91 -12
  88. package/dist/ui.mjs.map +1 -1
  89. package/docs/integration.md +234 -0
  90. package/package.json +9 -7
  91. package/dist/authoring-references-Cy8J-DWt.d.mts +0 -48
  92. package/dist/authoring-references-Cy8J-DWt.d.mts.map +0 -1
  93. package/dist/authoring-references-X6uRaWuf.mjs.map +0 -1
  94. package/dist/capabilities-DvSKtjAw.d.mts.map +0 -1
  95. package/dist/constants-Jw0k8ojS.d.mts.map +0 -1
  96. package/dist/controller-proxy-BRDusFiO.d.mts.map +0 -1
  97. package/dist/controller-proxy-Duxo2IFE.mjs.map +0 -1
  98. package/dist/engine-sPvuixWg.mjs.map +0 -1
  99. package/dist/index-BWNHkpkh.d.mts.map +0 -1
  100. package/dist/index-CUqbBjkc.d.mts.map +0 -1
  101. package/dist/index-MpEMQzTm.d.mts.map +0 -1
  102. package/dist/index-TFtvBiSQ.d.mts.map +0 -1
  103. package/dist/memory-thread-repository-CJkkVE2-.mjs.map +0 -1
  104. package/dist/protocol-DV0ka9WT.mjs.map +0 -1
  105. package/dist/react-VuYe-cPh.mjs.map +0 -1
  106. package/dist/request-context-jcmXT_Q2.mjs +0 -44
  107. package/dist/request-context-jcmXT_Q2.mjs.map +0 -1
  108. package/dist/request-guardrails-C59IWnH8.mjs +0 -73
  109. package/dist/request-guardrails-C59IWnH8.mjs.map +0 -1
  110. package/dist/server-tasks.d.mts.map +0 -1
  111. package/dist/thread-documents-DamIq9Od.d.mts.map +0 -1
  112. package/dist/thread-handlers-DpynUc64.d.mts.map +0 -1
  113. package/dist/tools-Hz2p7vyv.mjs.map +0 -1
package/dist/server.mjs CHANGED
@@ -1,6 +1,137 @@
1
1
  import { n as SURVEY_ASSISTANT_TASK_AGENT_ID, t as SURVEY_ASSISTANT_AGENT_ID } from "./constants-CFUWrRtl.mjs";
2
- import { n as parseSurveyAssistantSnapshot, r as requireSurveyAssistantTurnState, t as buildSurveyAssistantRequestContext } from "./request-context-jcmXT_Q2.mjs";
3
- import { a as SURVEY_ASSISTANT_MAX_REQUEST_BYTES, c as SurveyAssistantRequestError, i as SURVEY_ASSISTANT_MAX_MESSAGES, l as readSurveyAssistantRequestJson, n as SURVEY_ASSISTANT_MAX_ATTACHMENTS, o as SURVEY_ASSISTANT_MAX_TEXT_PART_CHARS, r as SURVEY_ASSISTANT_MAX_ATTACHMENT_BYTES, s as SURVEY_ASSISTANT_MAX_TOTAL_ATTACHMENT_BYTES, t as SURVEY_ASSISTANT_ACCEPTED_ATTACHMENT_TYPES, u as validateSurveyAssistantMessages } from "./request-guardrails-C59IWnH8.mjs";
4
- import { a as describeSurveyAssistantStreamError, c as loadSurveyAssistantDocuments, d as removeHistoricalSurveyAssistantAttachments, f as createSurveyAssistantTurnStream, i as createSurveyAssistantChatHandler, l as loadSurveyAssistantThreadAttachments, n as createSurveyAssistantThreadHandlers, o as formatSurveyAssistantStreamError, r as SurveyAssistantAuthorizationError, s as getSurveyAssistantReplayableDocuments, t as createMastraMemoryThreadRepository, u as registerSurveyAssistantThreadAttachments } from "./memory-thread-repository-CJkkVE2-.mjs";
5
- import { n as surveyAuthoringReferences, t as surveyAuthoringReferenceTopics } from "./authoring-references-X6uRaWuf.mjs";
6
- export { SURVEY_ASSISTANT_ACCEPTED_ATTACHMENT_TYPES, SURVEY_ASSISTANT_AGENT_ID, SURVEY_ASSISTANT_MAX_ATTACHMENTS, SURVEY_ASSISTANT_MAX_ATTACHMENT_BYTES, SURVEY_ASSISTANT_MAX_MESSAGES, SURVEY_ASSISTANT_MAX_REQUEST_BYTES, SURVEY_ASSISTANT_MAX_TEXT_PART_CHARS, SURVEY_ASSISTANT_MAX_TOTAL_ATTACHMENT_BYTES, SURVEY_ASSISTANT_TASK_AGENT_ID, SurveyAssistantAuthorizationError, SurveyAssistantRequestError, buildSurveyAssistantRequestContext, createMastraMemoryThreadRepository, createSurveyAssistantChatHandler, createSurveyAssistantThreadHandlers, createSurveyAssistantTurnStream, describeSurveyAssistantStreamError, formatSurveyAssistantStreamError, getSurveyAssistantReplayableDocuments, loadSurveyAssistantDocuments, loadSurveyAssistantThreadAttachments, parseSurveyAssistantSnapshot, readSurveyAssistantRequestJson, registerSurveyAssistantThreadAttachments, removeHistoricalSurveyAssistantAttachments, requireSurveyAssistantTurnState, surveyAuthoringReferenceTopics, surveyAuthoringReferences, validateSurveyAssistantMessages };
2
+ import { a as requireSurveyAssistantTurnState, i as parseSurveyAssistantSnapshot, n as deriveSurveyAssistantDocumentTransition, r as parseSurveyAssistantPreviousSettledVersion, t as buildSurveyAssistantRequestContext } from "./request-context-BDBw4-Gw.mjs";
3
+ import { a as SURVEY_ASSISTANT_MAX_ATTACHMENT_NAME_CHARS, c as SURVEY_ASSISTANT_MAX_TEXT_PART_CHARS, d as readSurveyAssistantRequestJson, f as validateSurveyAssistantMessages, i as SURVEY_ASSISTANT_MAX_ATTACHMENT_BYTES, l as SURVEY_ASSISTANT_MAX_TOTAL_ATTACHMENT_BYTES, n as SURVEY_ASSISTANT_DEFAULT_REQUEST_LIMITS, o as SURVEY_ASSISTANT_MAX_MESSAGES, r as SURVEY_ASSISTANT_MAX_ATTACHMENTS, s as SURVEY_ASSISTANT_MAX_REQUEST_BYTES, t as SURVEY_ASSISTANT_ACCEPTED_ATTACHMENT_TYPES, u as SurveyAssistantRequestError } from "./request-guardrails-h4t6u8mP.mjs";
4
+ import { a as describeSurveyAssistantStreamError, c as loadSurveyAssistantDocuments, d as removeHistoricalSurveyAssistantAttachments, f as replaceCurrentSurveyAssistantAttachmentsWithReferences, i as createSurveyAssistantChatHandler, l as loadSurveyAssistantThreadAttachments, n as createSurveyAssistantThreadHandlers, o as formatSurveyAssistantStreamError, p as createSurveyAssistantTurnStream, r as SurveyAssistantAuthorizationError, s as getSurveyAssistantReplayableDocuments, t as createMastraMemoryThreadRepository, u as registerSurveyAssistantThreadAttachments } from "./memory-thread-repository-Cm1BJyRw.mjs";
5
+ import { n as surveyAuthoringReferenceTopics, r as surveyAuthoringReferences } from "./authoring-references-DYuOAdVx.mjs";
6
+ //#region src/server/survey-lifecycle.ts
7
+ const SURVEY_ASSISTANT_SURVEY_ID_METADATA_KEY = "surveyId";
8
+ const normalizeIdentifier = (value, label) => {
9
+ const normalized = value.trim();
10
+ if (!normalized || normalized.length > 240) throw new Error(`${label} must contain between 1 and 240 characters.`);
11
+ return normalized;
12
+ };
13
+ const normalizeScopeMetadata = (metadata) => {
14
+ const entries = Object.entries(metadata);
15
+ if (entries.length === 0) throw new Error("Survey assistant lifecycle scope metadata must not be empty.");
16
+ if ("surveyId" in metadata) throw new Error(`Survey assistant lifecycle scope metadata must not contain "${SURVEY_ASSISTANT_SURVEY_ID_METADATA_KEY}".`);
17
+ return Object.fromEntries(entries.map(([key, value]) => [normalizeIdentifier(key, "Survey assistant lifecycle metadata key"), normalizeIdentifier(value, `Survey assistant lifecycle metadata "${key}"`)]));
18
+ };
19
+ const hasMetadata = (threadMetadata, expected) => Object.entries(expected).every(([key, value]) => threadMetadata?.[key] === value);
20
+ const createSurveyAssistantSurveyThreadMetadata = ({ scopeMetadata, surveyId }) => ({
21
+ ...normalizeScopeMetadata(scopeMetadata),
22
+ [SURVEY_ASSISTANT_SURVEY_ID_METADATA_KEY]: normalizeIdentifier(surveyId, "Survey assistant survey id")
23
+ });
24
+ /**
25
+ * Creates an idempotent, server-only lifecycle service for removing every
26
+ * assistant thread owned by a survey. Hosts should call this after preventing
27
+ * new assistant activity and before completing (or from a durable retry of)
28
+ * survey deletion.
29
+ */
30
+ const createSurveyAssistantSurveyLifecycle = ({ getMemory, getThreadApi, scopeMetadata, threadDocuments }) => {
31
+ const normalizedScopeMetadata = Object.freeze(normalizeScopeMetadata(scopeMetadata));
32
+ const repository = createMastraMemoryThreadRepository({
33
+ getMemory,
34
+ threadDocuments: threadDocuments || void 0
35
+ });
36
+ const deleteMatchingThreads = async ({ metadata, resourceId }) => {
37
+ const memory = await getMemory();
38
+ const matchedThreads = (await memory.listThreads({
39
+ filter: {
40
+ metadata,
41
+ ...resourceId ? { resourceId } : {}
42
+ },
43
+ orderBy: {
44
+ field: "createdAt",
45
+ direction: "ASC"
46
+ },
47
+ perPage: false
48
+ })).threads.filter((thread) => (!resourceId || thread.resourceId === resourceId) && hasMetadata(thread.metadata, metadata));
49
+ const deletedThreadIds = [];
50
+ for (const listedThread of matchedThreads) {
51
+ const currentThread = await memory.getThreadById({ threadId: listedThread.id });
52
+ if (!currentThread || resourceId && currentThread.resourceId !== resourceId || !hasMetadata(currentThread.metadata, metadata)) continue;
53
+ await repository.delete(currentThread.id);
54
+ deletedThreadIds.push(currentThread.id);
55
+ }
56
+ return {
57
+ deletedThreadIds,
58
+ matchedThreadCount: matchedThreads.length
59
+ };
60
+ };
61
+ const deleteSurveyThreads = async ({ resourceId, surveyId }) => {
62
+ const normalizedResourceId = resourceId ? normalizeIdentifier(resourceId, "Survey assistant resource id") : void 0;
63
+ return deleteMatchingThreads({
64
+ metadata: createSurveyAssistantSurveyThreadMetadata({
65
+ scopeMetadata: normalizedScopeMetadata,
66
+ surveyId
67
+ }),
68
+ resourceId: normalizedResourceId
69
+ });
70
+ };
71
+ const deleteSurvey = (surveyId) => deleteSurveyThreads({ surveyId });
72
+ const deleteResource = (resourceId) => deleteMatchingThreads({
73
+ metadata: normalizedScopeMetadata,
74
+ resourceId: normalizeIdentifier(resourceId, "Survey assistant resource id")
75
+ });
76
+ const forSurvey = (surveyId, resourceId) => {
77
+ const normalizedSurveyId = normalizeIdentifier(surveyId, "Survey assistant survey id");
78
+ const normalizedResourceId = normalizeIdentifier(resourceId, "Survey assistant resource id");
79
+ const metadata = Object.freeze(createSurveyAssistantSurveyThreadMetadata({
80
+ scopeMetadata: normalizedScopeMetadata,
81
+ surveyId: normalizedSurveyId
82
+ }));
83
+ const threadApi = getThreadApi?.(normalizedSurveyId)?.trim();
84
+ if (getThreadApi && !threadApi) throw new Error("Survey assistant thread API must not be empty.");
85
+ const panelProps = Object.freeze({
86
+ resourceId: normalizedResourceId,
87
+ surveyId: normalizedSurveyId,
88
+ ...threadApi ? { threadApi } : {}
89
+ });
90
+ const threadIdentity = Object.freeze({
91
+ metadata,
92
+ resourceId: normalizedResourceId
93
+ });
94
+ const ownsThread = (thread) => Boolean(thread && thread.resourceId === normalizedResourceId && hasMetadata(thread.metadata, metadata));
95
+ const authorizeChat = async ({ requestedResourceId, requestedSurveyId, requestedThreadId }) => {
96
+ if (requestedResourceId !== normalizedResourceId || requestedSurveyId !== normalizedSurveyId || !requestedThreadId) throw new SurveyAssistantAuthorizationError("Survey assistant chat not found.", 404);
97
+ const thread = await (await getMemory()).getThreadById({ threadId: requestedThreadId });
98
+ if (!ownsThread(thread)) throw new SurveyAssistantAuthorizationError("Survey assistant chat not found.", 404);
99
+ return {
100
+ authority: "authenticated-host",
101
+ resourceId: normalizedResourceId,
102
+ surveyId: normalizedSurveyId,
103
+ threadId: thread.id
104
+ };
105
+ };
106
+ const authorizeTask = ({ requestedResourceId, requestedSurveyId }) => {
107
+ if (requestedResourceId !== normalizedResourceId || requestedSurveyId !== normalizedSurveyId) throw new SurveyAssistantAuthorizationError("Survey assistant task not found.", 404);
108
+ return {
109
+ resourceId: normalizedResourceId,
110
+ surveyId: normalizedSurveyId
111
+ };
112
+ };
113
+ return Object.freeze({
114
+ authorizeChat,
115
+ authorizeTask,
116
+ deleteThreads: () => deleteSurveyThreads({
117
+ resourceId: normalizedResourceId,
118
+ surveyId: normalizedSurveyId
119
+ }),
120
+ ownsThread,
121
+ panelProps,
122
+ resourceId: normalizedResourceId,
123
+ surveyId: normalizedSurveyId,
124
+ threadIdentity
125
+ });
126
+ };
127
+ return Object.freeze({
128
+ deleteResource,
129
+ deleteSurvey,
130
+ deleteSurveyThreads,
131
+ forSurvey
132
+ });
133
+ };
134
+ //#endregion
135
+ export { SURVEY_ASSISTANT_ACCEPTED_ATTACHMENT_TYPES, SURVEY_ASSISTANT_AGENT_ID, SURVEY_ASSISTANT_DEFAULT_REQUEST_LIMITS, SURVEY_ASSISTANT_MAX_ATTACHMENTS, SURVEY_ASSISTANT_MAX_ATTACHMENT_BYTES, SURVEY_ASSISTANT_MAX_ATTACHMENT_NAME_CHARS, SURVEY_ASSISTANT_MAX_MESSAGES, SURVEY_ASSISTANT_MAX_REQUEST_BYTES, SURVEY_ASSISTANT_MAX_TEXT_PART_CHARS, SURVEY_ASSISTANT_MAX_TOTAL_ATTACHMENT_BYTES, SURVEY_ASSISTANT_SURVEY_ID_METADATA_KEY, SURVEY_ASSISTANT_TASK_AGENT_ID, SurveyAssistantAuthorizationError, SurveyAssistantRequestError, buildSurveyAssistantRequestContext, createMastraMemoryThreadRepository, createSurveyAssistantChatHandler, createSurveyAssistantSurveyLifecycle, createSurveyAssistantSurveyThreadMetadata, createSurveyAssistantThreadHandlers, createSurveyAssistantTurnStream, deriveSurveyAssistantDocumentTransition, describeSurveyAssistantStreamError, formatSurveyAssistantStreamError, getSurveyAssistantReplayableDocuments, loadSurveyAssistantDocuments, loadSurveyAssistantThreadAttachments, parseSurveyAssistantPreviousSettledVersion, parseSurveyAssistantSnapshot, readSurveyAssistantRequestJson, registerSurveyAssistantThreadAttachments, removeHistoricalSurveyAssistantAttachments, replaceCurrentSurveyAssistantAttachmentsWithReferences, requireSurveyAssistantTurnState, surveyAuthoringReferenceTopics, surveyAuthoringReferences, validateSurveyAssistantMessages };
136
+
137
+ //# sourceMappingURL=server.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.mjs","names":[],"sources":["../src/server/survey-lifecycle.ts"],"sourcesContent":["import type { MastraMemory } from \"@mastra/core/memory\";\nimport {\n SurveyAssistantAuthorizationError,\n type SurveyAssistantAuthorizationInput,\n type SurveyAssistantAuthorizedIdentity,\n type SurveyAssistantAuthorize,\n} from \"./handler\";\nimport { createMastraMemoryThreadRepository } from \"./memory-thread-repository\";\nimport type { SurveyAssistantThreadDocumentRepository } from \"./thread-documents\";\nimport type { SurveyAssistantStoredThread, SurveyAssistantThreadIdentity } from \"./thread-handlers\";\nimport type {\n SurveyAssistantTaskAuthorizationInput,\n SurveyAssistantTaskAuthorizedIdentity,\n} from \"./tasks\";\n\nexport const SURVEY_ASSISTANT_SURVEY_ID_METADATA_KEY = \"surveyId\";\n\ntype SurveyLifecycleMemory = Pick<\n MastraMemory,\n \"deleteThread\" | \"getThreadById\" | \"listThreads\" | \"recall\" | \"createThread\" | \"updateThread\"\n>;\n\nexport interface CreateSurveyAssistantSurveyLifecycleOptions {\n getMemory(): SurveyLifecycleMemory | Promise<SurveyLifecycleMemory>;\n /** Optionally derives the survey-scoped thread endpoint exposed in `panelProps`. */\n getThreadApi?(surveyId: string): string;\n /**\n * Stable host metadata that separates this assistant deployment from any\n * other application using the same Mastra storage.\n */\n scopeMetadata: Record<string, string>;\n /**\n * Pass the same repository used by the chat handler, or explicitly use\n * `false` when cross-turn attachment persistence/replay is disabled.\n */\n threadDocuments: SurveyAssistantThreadDocumentRepository | false;\n}\n\nexport interface DeleteSurveyAssistantSurveyThreadsInput {\n surveyId: string;\n /** Restrict cleanup to one user. Omit this when the survey itself is deleted. */\n resourceId?: string;\n}\n\nexport interface SurveyAssistantThreadCleanupResult {\n deletedThreadIds: string[];\n matchedThreadCount: number;\n}\n\nexport type DeleteSurveyAssistantSurveyThreadsResult = SurveyAssistantThreadCleanupResult;\n\nexport interface SurveyAssistantSurveyPanelProps {\n resourceId: string;\n surveyId: string;\n threadApi?: string;\n}\n\nexport interface SurveyAssistantScopedSurvey {\n /** Validates the requested ids and returns a trusted identity for the chat handler. */\n authorizeChat: SurveyAssistantAuthorize;\n /** Validates the requested survey/resource ids for the bounded task handler. */\n authorizeTask(\n input: SurveyAssistantTaskAuthorizationInput,\n ): SurveyAssistantTaskAuthorizedIdentity;\n /** Deletes this user's threads for the survey. */\n deleteThreads(): Promise<DeleteSurveyAssistantSurveyThreadsResult>;\n /** Returns true only for a thread in this exact deployment, survey, and user scope. */\n ownsThread(\n thread: SurveyAssistantStoredThread | null | undefined,\n ): thread is SurveyAssistantStoredThread;\n /** Props that can be passed directly to ConnectedSurveyAssistantPanel. */\n panelProps: SurveyAssistantSurveyPanelProps;\n resourceId: string;\n surveyId: string;\n /** Identity returned by the thread handler's authorize callback. */\n threadIdentity: SurveyAssistantThreadIdentity;\n}\n\nexport interface SurveyAssistantSurveyLifecycle {\n /** Deletes this resource's threads across every survey in this deployment scope. */\n deleteResource(resourceId: string): Promise<SurveyAssistantThreadCleanupResult>;\n /** Deletes every user's threads for a survey. */\n deleteSurvey(surveyId: string): Promise<SurveyAssistantThreadCleanupResult>;\n deleteSurveyThreads(\n input: DeleteSurveyAssistantSurveyThreadsInput,\n ): Promise<SurveyAssistantThreadCleanupResult>;\n forSurvey(surveyId: string, resourceId: string): SurveyAssistantScopedSurvey;\n}\n\nconst normalizeIdentifier = (value: string, label: string) => {\n const normalized = value.trim();\n if (!normalized || normalized.length > 240) {\n throw new Error(`${label} must contain between 1 and 240 characters.`);\n }\n return normalized;\n};\n\nconst normalizeScopeMetadata = (metadata: Record<string, string>) => {\n const entries = Object.entries(metadata);\n if (entries.length === 0) {\n throw new Error(\"Survey assistant lifecycle scope metadata must not be empty.\");\n }\n if (SURVEY_ASSISTANT_SURVEY_ID_METADATA_KEY in metadata) {\n throw new Error(\n `Survey assistant lifecycle scope metadata must not contain \"${SURVEY_ASSISTANT_SURVEY_ID_METADATA_KEY}\".`,\n );\n }\n\n return Object.fromEntries(\n entries.map(([key, value]) => [\n normalizeIdentifier(key, \"Survey assistant lifecycle metadata key\"),\n normalizeIdentifier(value, `Survey assistant lifecycle metadata \"${key}\"`),\n ]),\n );\n};\n\nconst hasMetadata = (\n threadMetadata: Record<string, unknown> | undefined,\n expected: Record<string, string>,\n) => Object.entries(expected).every(([key, value]) => threadMetadata?.[key] === value);\n\nexport const createSurveyAssistantSurveyThreadMetadata = ({\n scopeMetadata,\n surveyId,\n}: {\n scopeMetadata: Record<string, string>;\n surveyId: string;\n}): Record<string, string> => ({\n ...normalizeScopeMetadata(scopeMetadata),\n [SURVEY_ASSISTANT_SURVEY_ID_METADATA_KEY]: normalizeIdentifier(\n surveyId,\n \"Survey assistant survey id\",\n ),\n});\n\n/**\n * Creates an idempotent, server-only lifecycle service for removing every\n * assistant thread owned by a survey. Hosts should call this after preventing\n * new assistant activity and before completing (or from a durable retry of)\n * survey deletion.\n */\nexport const createSurveyAssistantSurveyLifecycle = ({\n getMemory,\n getThreadApi,\n scopeMetadata,\n threadDocuments,\n}: CreateSurveyAssistantSurveyLifecycleOptions): SurveyAssistantSurveyLifecycle => {\n const normalizedScopeMetadata = Object.freeze(normalizeScopeMetadata(scopeMetadata));\n const repository = createMastraMemoryThreadRepository({\n getMemory,\n threadDocuments: threadDocuments || undefined,\n });\n\n const deleteMatchingThreads = async ({\n metadata,\n resourceId,\n }: {\n metadata: Record<string, string>;\n resourceId?: string;\n }): Promise<DeleteSurveyAssistantSurveyThreadsResult> => {\n const memory = await getMemory();\n const result = await memory.listThreads({\n filter: {\n metadata,\n ...(resourceId ? { resourceId } : {}),\n },\n orderBy: { field: \"createdAt\", direction: \"ASC\" },\n perPage: false,\n });\n const matchedThreads = result.threads.filter(\n (thread) =>\n (!resourceId || thread.resourceId === resourceId) && hasMetadata(thread.metadata, metadata),\n );\n const deletedThreadIds: string[] = [];\n\n for (const listedThread of matchedThreads) {\n // Re-check the current record so a concurrently reassigned thread is not\n // deleted from a stale list result.\n const currentThread = await memory.getThreadById({ threadId: listedThread.id });\n if (\n !currentThread ||\n (resourceId && currentThread.resourceId !== resourceId) ||\n !hasMetadata(currentThread.metadata, metadata)\n ) {\n continue;\n }\n await repository.delete(currentThread.id);\n deletedThreadIds.push(currentThread.id);\n }\n\n return {\n deletedThreadIds,\n matchedThreadCount: matchedThreads.length,\n };\n };\n\n const deleteSurveyThreads = async ({\n resourceId,\n surveyId,\n }: DeleteSurveyAssistantSurveyThreadsInput): Promise<DeleteSurveyAssistantSurveyThreadsResult> => {\n const normalizedResourceId = resourceId\n ? normalizeIdentifier(resourceId, \"Survey assistant resource id\")\n : undefined;\n return deleteMatchingThreads({\n metadata: createSurveyAssistantSurveyThreadMetadata({\n scopeMetadata: normalizedScopeMetadata,\n surveyId,\n }),\n resourceId: normalizedResourceId,\n });\n };\n\n const deleteSurvey = (surveyId: string) => deleteSurveyThreads({ surveyId });\n const deleteResource = (resourceId: string) =>\n deleteMatchingThreads({\n metadata: normalizedScopeMetadata,\n resourceId: normalizeIdentifier(resourceId, \"Survey assistant resource id\"),\n });\n\n const forSurvey = (surveyId: string, resourceId: string): SurveyAssistantScopedSurvey => {\n const normalizedSurveyId = normalizeIdentifier(surveyId, \"Survey assistant survey id\");\n const normalizedResourceId = normalizeIdentifier(resourceId, \"Survey assistant resource id\");\n const metadata = Object.freeze(\n createSurveyAssistantSurveyThreadMetadata({\n scopeMetadata: normalizedScopeMetadata,\n surveyId: normalizedSurveyId,\n }),\n );\n const threadApi = getThreadApi?.(normalizedSurveyId)?.trim();\n if (getThreadApi && !threadApi) {\n throw new Error(\"Survey assistant thread API must not be empty.\");\n }\n const panelProps: SurveyAssistantSurveyPanelProps = Object.freeze({\n resourceId: normalizedResourceId,\n surveyId: normalizedSurveyId,\n ...(threadApi ? { threadApi } : {}),\n });\n const threadIdentity: SurveyAssistantThreadIdentity = Object.freeze({\n metadata,\n resourceId: normalizedResourceId,\n });\n const ownsThread = (\n thread: SurveyAssistantStoredThread | null | undefined,\n ): thread is SurveyAssistantStoredThread =>\n Boolean(\n thread &&\n thread.resourceId === normalizedResourceId &&\n hasMetadata(thread.metadata, metadata),\n );\n const authorizeChat = async ({\n requestedResourceId,\n requestedSurveyId,\n requestedThreadId,\n }: SurveyAssistantAuthorizationInput): Promise<SurveyAssistantAuthorizedIdentity> => {\n if (\n requestedResourceId !== normalizedResourceId ||\n requestedSurveyId !== normalizedSurveyId ||\n !requestedThreadId\n ) {\n throw new SurveyAssistantAuthorizationError(\"Survey assistant chat not found.\", 404);\n }\n const memory = await getMemory();\n const thread = await memory.getThreadById({ threadId: requestedThreadId });\n if (!ownsThread(thread)) {\n throw new SurveyAssistantAuthorizationError(\"Survey assistant chat not found.\", 404);\n }\n return {\n authority: \"authenticated-host\",\n resourceId: normalizedResourceId,\n surveyId: normalizedSurveyId,\n threadId: thread.id,\n };\n };\n const authorizeTask = ({\n requestedResourceId,\n requestedSurveyId,\n }: SurveyAssistantTaskAuthorizationInput): SurveyAssistantTaskAuthorizedIdentity => {\n if (\n requestedResourceId !== normalizedResourceId ||\n requestedSurveyId !== normalizedSurveyId\n ) {\n throw new SurveyAssistantAuthorizationError(\"Survey assistant task not found.\", 404);\n }\n return {\n resourceId: normalizedResourceId,\n surveyId: normalizedSurveyId,\n };\n };\n\n return Object.freeze({\n authorizeChat,\n authorizeTask,\n deleteThreads: () =>\n deleteSurveyThreads({\n resourceId: normalizedResourceId,\n surveyId: normalizedSurveyId,\n }),\n ownsThread,\n panelProps,\n resourceId: normalizedResourceId,\n surveyId: normalizedSurveyId,\n threadIdentity,\n });\n };\n\n return Object.freeze({ deleteResource, deleteSurvey, deleteSurveyThreads, forSurvey });\n};\n"],"mappings":"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"}
@@ -1,7 +1,9 @@
1
- import { a as SurveyAssistantThreadDocumentRepository } from "./thread-documents-DamIq9Od.mjs";
1
+ import { a as SurveyAssistantThreadDocumentRepository } from "./thread-documents-BlxNjc7S.mjs";
2
2
  import { PostgresStore, PostgresStoreConfig } from "@mastra/pg";
3
3
 
4
4
  //#region src/storage/postgres.d.ts
5
+ declare const SURVEY_ASSISTANT_DEFAULT_MAX_STORED_ATTACHMENTS_PER_THREAD = 100;
6
+ declare const SURVEY_ASSISTANT_DEFAULT_MAX_STORED_ATTACHMENT_BYTES_PER_THREAD: number;
5
7
  interface InitializeSurveyAssistantPostgresStorageOptions {
6
8
  ensureObservationalMemory?: boolean;
7
9
  schemaName?: string;
@@ -12,19 +14,27 @@ declare const initializeSurveyAssistantPostgresStorage: (storage: PostgresStore,
12
14
  }?: InitializeSurveyAssistantPostgresStorageOptions) => Promise<PostgresStore>;
13
15
  interface CreateSurveyAssistantPostgresThreadDocumentRepositoryOptions {
14
16
  getStorage(): PostgresStore | Promise<PostgresStore>;
17
+ maxStoredAttachmentsPerThread?: number;
18
+ maxStoredBytesPerThread?: number;
15
19
  schemaName?: string;
16
20
  }
17
21
  declare const createSurveyAssistantPostgresThreadDocumentRepository: ({
18
22
  getStorage,
23
+ maxStoredAttachmentsPerThread,
24
+ maxStoredBytesPerThread,
19
25
  schemaName
20
26
  }: CreateSurveyAssistantPostgresThreadDocumentRepositoryOptions) => SurveyAssistantThreadDocumentRepository;
21
27
  interface CreateSurveyAssistantPostgresRuntimeOptions {
22
28
  ensureObservationalMemory?: boolean;
29
+ maxStoredAttachmentsPerThread?: number;
30
+ maxStoredBytesPerThread?: number;
23
31
  schemaName?: string;
24
32
  store: PostgresStore | PostgresStoreConfig;
25
33
  }
26
34
  declare const createSurveyAssistantPostgresRuntime: ({
27
35
  ensureObservationalMemory,
36
+ maxStoredAttachmentsPerThread,
37
+ maxStoredBytesPerThread,
28
38
  schemaName,
29
39
  store: storeOrConfig
30
40
  }: CreateSurveyAssistantPostgresRuntimeOptions) => {
@@ -33,5 +43,5 @@ declare const createSurveyAssistantPostgresRuntime: ({
33
43
  threadDocuments: SurveyAssistantThreadDocumentRepository;
34
44
  };
35
45
  //#endregion
36
- export { CreateSurveyAssistantPostgresRuntimeOptions, CreateSurveyAssistantPostgresThreadDocumentRepositoryOptions, InitializeSurveyAssistantPostgresStorageOptions, createSurveyAssistantPostgresRuntime, createSurveyAssistantPostgresThreadDocumentRepository, initializeSurveyAssistantPostgresStorage };
46
+ export { CreateSurveyAssistantPostgresRuntimeOptions, CreateSurveyAssistantPostgresThreadDocumentRepositoryOptions, InitializeSurveyAssistantPostgresStorageOptions, SURVEY_ASSISTANT_DEFAULT_MAX_STORED_ATTACHMENTS_PER_THREAD, SURVEY_ASSISTANT_DEFAULT_MAX_STORED_ATTACHMENT_BYTES_PER_THREAD, createSurveyAssistantPostgresRuntime, createSurveyAssistantPostgresThreadDocumentRepository, initializeSurveyAssistantPostgresStorage };
37
47
  //# sourceMappingURL=storage-postgres.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"storage-postgres.d.mts","names":[],"sources":["../src/storage/postgres.ts"],"mappings":";;;;UAwHiB,+CAAA;EACf,yBAAA;EACA,UAAA;AAAA;AAAA,cAGW,wCAAA,GACX,OAAA,EAAS,aAAA;EACT,yBAAA;EAAA;AAAA,IAGG,+CAAA,KAAoD,OAAA,CAAA,aAAA;AAAA,UAwBxC,4DAAA;EACf,UAAA,IAAc,aAAA,GAAgB,OAAA,CAAQ,aAAA;EACtC,UAAA;AAAA;AAAA,cAGW,qDAAA;EAAyD,UAAA;EAAA;AAAA,GAGnE,4DAAA,KAA+D,uCAAA;AAAA,UAmFjD,2CAAA;EACf,yBAAA;EACA,UAAA;EACA,KAAA,EAAO,aAAA,GAAgB,mBAAA;AAAA;AAAA,cAGZ,oCAAA;EAAwC,yBAAA;EAAA,UAAA;EAAA,KAAA,EAAA;AAAA,GAIlD,2CAAA"}
1
+ {"version":3,"file":"storage-postgres.d.mts","names":[],"sources":["../src/storage/postgres.ts"],"mappings":";;;;cAWa,0DAAA;AAAA,cACA,+DAAA;AAAA,UA0GI,+CAAA;EACf,yBAAA;EACA,UAAA;AAAA;AAAA,cAGW,wCAAA,GACX,OAAA,EAAS,aAAA;EACT,yBAAA;EAAA;AAAA,IAGG,+CAAA,KAAoD,OAAA,CAAA,aAAA;AAAA,UAwBxC,4DAAA;EACf,UAAA,IAAc,aAAA,GAAgB,OAAA,CAAQ,aAAA;EACtC,6BAAA;EACA,uBAAA;EACA,UAAA;AAAA;AAAA,cAGW,qDAAA;EAAyD,UAAA;EAAA,6BAAA;EAAA,uBAAA;EAAA;AAAA,GAKnE,4DAAA,KAA+D,uCAAA;AAAA,UA2FjD,2CAAA;EACf,yBAAA;EACA,6BAAA;EACA,uBAAA;EACA,UAAA;EACA,KAAA,EAAO,aAAA,GAAgB,mBAAA;AAAA;AAAA,cAGZ,oCAAA;EAAwC,yBAAA;EAAA,6BAAA;EAAA,uBAAA;EAAA,UAAA;EAAA,KAAA,EAAA;AAAA,GAMlD,2CAAA"}
@@ -1,10 +1,12 @@
1
- import { c as SurveyAssistantRequestError } from "./request-guardrails-C59IWnH8.mjs";
1
+ import { u as SurveyAssistantRequestError } from "./request-guardrails-h4t6u8mP.mjs";
2
2
  import { createHash, randomUUID } from "node:crypto";
3
3
  import { OBSERVATIONAL_MEMORY_TABLE_SCHEMA } from "@mastra/core/storage";
4
4
  import { PostgresStore } from "@mastra/pg";
5
5
  //#region src/storage/postgres.ts
6
6
  const OBSERVATIONAL_MEMORY_TABLE = "mastra_observational_memory";
7
7
  const THREAD_DOCUMENTS_TABLE = "survey_assistant_thread_documents";
8
+ const SURVEY_ASSISTANT_DEFAULT_MAX_STORED_ATTACHMENTS_PER_THREAD = 100;
9
+ const SURVEY_ASSISTANT_DEFAULT_MAX_STORED_ATTACHMENT_BYTES_PER_THREAD = 200 * 1024 * 1024;
8
10
  const quoteIdentifier = (value) => `"${value.replaceAll("\"", "\"\"")}"`;
9
11
  const postgresType = (column) => {
10
12
  switch (column.type) {
@@ -82,7 +84,8 @@ const toThreadDocument = (row) => ({
82
84
  contentHash: row.content_hash,
83
85
  createdAt: new Date(row.created_at).toISOString()
84
86
  });
85
- const createSurveyAssistantPostgresThreadDocumentRepository = ({ getStorage, schemaName = "public" }) => {
87
+ const createSurveyAssistantPostgresThreadDocumentRepository = ({ getStorage, maxStoredAttachmentsPerThread = 100, maxStoredBytesPerThread = SURVEY_ASSISTANT_DEFAULT_MAX_STORED_ATTACHMENT_BYTES_PER_THREAD, schemaName = "public" }) => {
88
+ if (!Number.isSafeInteger(maxStoredAttachmentsPerThread) || maxStoredAttachmentsPerThread <= 0 || !Number.isSafeInteger(maxStoredBytesPerThread) || maxStoredBytesPerThread <= 0) throw new Error("Survey assistant stored attachment limits must be positive integers.");
86
89
  const tableName = `${quoteIdentifier(schemaName)}.${quoteIdentifier(THREAD_DOCUMENTS_TABLE)}`;
87
90
  return {
88
91
  async put({ bytes, data, mediaType, name, resourceId, threadId }) {
@@ -99,8 +102,8 @@ const createSurveyAssistantPostgresThreadDocumentRepository = ({ getStorage, sch
99
102
  if (existing) return existing;
100
103
  const usage = await transaction.one(`SELECT COUNT(*) AS count, COALESCE(SUM(byte_size), 0) AS bytes FROM ${tableName}
101
104
  WHERE resource_id = $1 AND thread_id = $2`, [resourceId, threadId]);
102
- if (Number(usage.count) >= 4) throw new SurveyAssistantRequestError(`A chat can contain up to 4 attachments.`);
103
- if (Number(usage.bytes) + bytes > 12582912) throw new SurveyAssistantRequestError("The attachments stored for this chat are too large in total.");
105
+ if (Number(usage.count) >= maxStoredAttachmentsPerThread) throw new SurveyAssistantRequestError(`A chat can contain up to ${maxStoredAttachmentsPerThread} stored attachments.`);
106
+ if (Number(usage.bytes) + bytes > maxStoredBytesPerThread) throw new SurveyAssistantRequestError("The attachments stored for this chat are too large in total.");
104
107
  return transaction.one(`INSERT INTO ${tableName}
105
108
  (id, resource_id, thread_id, name, media_type, byte_size, content_hash, data)
106
109
  VALUES
@@ -142,7 +145,7 @@ const createSurveyAssistantPostgresThreadDocumentRepository = ({ getStorage, sch
142
145
  }
143
146
  };
144
147
  };
145
- const createSurveyAssistantPostgresRuntime = ({ ensureObservationalMemory, schemaName = "public", store: storeOrConfig }) => {
148
+ const createSurveyAssistantPostgresRuntime = ({ ensureObservationalMemory, maxStoredAttachmentsPerThread, maxStoredBytesPerThread, schemaName = "public", store: storeOrConfig }) => {
146
149
  const storage = storeOrConfig instanceof PostgresStore ? storeOrConfig : new PostgresStore(storeOrConfig);
147
150
  let initialization;
148
151
  const getStorage = () => {
@@ -157,11 +160,13 @@ const createSurveyAssistantPostgresRuntime = ({ ensureObservationalMemory, schem
157
160
  getStorage,
158
161
  threadDocuments: createSurveyAssistantPostgresThreadDocumentRepository({
159
162
  getStorage,
163
+ maxStoredAttachmentsPerThread,
164
+ maxStoredBytesPerThread,
160
165
  schemaName
161
166
  })
162
167
  };
163
168
  };
164
169
  //#endregion
165
- export { createSurveyAssistantPostgresRuntime, createSurveyAssistantPostgresThreadDocumentRepository, initializeSurveyAssistantPostgresStorage };
170
+ export { SURVEY_ASSISTANT_DEFAULT_MAX_STORED_ATTACHMENTS_PER_THREAD, SURVEY_ASSISTANT_DEFAULT_MAX_STORED_ATTACHMENT_BYTES_PER_THREAD, createSurveyAssistantPostgresRuntime, createSurveyAssistantPostgresThreadDocumentRepository, initializeSurveyAssistantPostgresStorage };
166
171
 
167
172
  //# sourceMappingURL=storage-postgres.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"storage-postgres.mjs","names":[],"sources":["../src/storage/postgres.ts"],"sourcesContent":["import { OBSERVATIONAL_MEMORY_TABLE_SCHEMA, type StorageColumn } from \"@mastra/core/storage\";\nimport { PostgresStore, type PostgresStoreConfig } from \"@mastra/pg\";\nimport { createHash, randomUUID } from \"node:crypto\";\nimport {\n SURVEY_ASSISTANT_MAX_ATTACHMENTS,\n SURVEY_ASSISTANT_MAX_TOTAL_ATTACHMENT_BYTES,\n SurveyAssistantRequestError,\n} from \"../server/request-guardrails\";\nimport type {\n SurveyAssistantThreadDocument,\n SurveyAssistantThreadDocumentRepository,\n} from \"../server/thread-documents\";\n\nconst OBSERVATIONAL_MEMORY_TABLE = \"mastra_observational_memory\";\nconst THREAD_DOCUMENTS_TABLE = \"survey_assistant_thread_documents\";\n\nconst quoteIdentifier = (value: string) => `\"${value.replaceAll('\"', '\"\"')}\"`;\n\nconst postgresType = (column: StorageColumn) => {\n switch (column.type) {\n case \"text\":\n return \"TEXT\";\n case \"timestamp\":\n return \"TIMESTAMP\";\n case \"jsonb\":\n return \"JSONB\";\n case \"integer\":\n return \"INTEGER\";\n case \"float\":\n return \"DOUBLE PRECISION\";\n case \"bigint\":\n return \"BIGINT\";\n case \"boolean\":\n return \"BOOLEAN\";\n case \"uuid\":\n return \"UUID\";\n }\n};\n\nconst migrationDefault = (column: StorageColumn) => {\n switch (column.type) {\n case \"boolean\":\n return \"FALSE\";\n case \"integer\":\n case \"bigint\":\n case \"float\":\n return \"0\";\n case \"jsonb\":\n return \"'{}'::jsonb\";\n case \"timestamp\":\n return \"NOW()\";\n case \"text\":\n return \"''\";\n case \"uuid\":\n return \"gen_random_uuid()\";\n }\n};\n\nconst columnSql = (name: string, column: StorageColumn, includeMigrationDefault = false) => {\n const constraints = [\n column.primaryKey ? \"PRIMARY KEY\" : undefined,\n column.nullable === false ? \"NOT NULL\" : undefined,\n includeMigrationDefault && column.nullable === false\n ? `DEFAULT ${migrationDefault(column)}`\n : undefined,\n ]\n .filter(Boolean)\n .join(\" \");\n return `${quoteIdentifier(name)} ${postgresType(column)}${constraints ? ` ${constraints}` : \"\"}`;\n};\n\nconst ensureObservationalMemorySchema = async (storage: PostgresStore, schemaName: string) => {\n const tableSchema = OBSERVATIONAL_MEMORY_TABLE_SCHEMA[OBSERVATIONAL_MEMORY_TABLE];\n if (!tableSchema) throw new Error(\"Mastra observational memory schema is unavailable.\");\n\n const tableName = `${quoteIdentifier(schemaName)}.${quoteIdentifier(OBSERVATIONAL_MEMORY_TABLE)}`;\n const columns = Object.entries(tableSchema).flatMap(([name, column]) => [\n columnSql(name, column),\n ...(column.type === \"timestamp\"\n ? [`${quoteIdentifier(`${name}Z`)} TIMESTAMPTZ DEFAULT NOW()`]\n : []),\n ]);\n\n await storage.db.none(`CREATE TABLE IF NOT EXISTS ${tableName} (${columns.join(\", \")})`);\n for (const [name, column] of Object.entries(tableSchema)) {\n await storage.db.none(\n `ALTER TABLE ${tableName} ADD COLUMN IF NOT EXISTS ${columnSql(name, column, true)}`,\n );\n if (column.type === \"timestamp\") {\n await storage.db.none(\n `ALTER TABLE ${tableName} ADD COLUMN IF NOT EXISTS ${quoteIdentifier(`${name}Z`)} TIMESTAMPTZ DEFAULT NOW()`,\n );\n }\n }\n await storage.db.none(\n `CREATE INDEX IF NOT EXISTS idx_om_lookup_key ON ${tableName} (${quoteIdentifier(\"lookupKey\")})`,\n );\n};\n\nconst ensureThreadDocumentsSchema = async (storage: PostgresStore, schemaName: string) => {\n const tableName = `${quoteIdentifier(schemaName)}.${quoteIdentifier(THREAD_DOCUMENTS_TABLE)}`;\n await storage.db.none(`\n CREATE TABLE IF NOT EXISTS ${tableName} (\n id TEXT PRIMARY KEY,\n resource_id TEXT NOT NULL,\n thread_id TEXT NOT NULL,\n name TEXT NOT NULL,\n media_type TEXT NOT NULL,\n byte_size INTEGER NOT NULL,\n content_hash TEXT NOT NULL,\n data BYTEA NOT NULL,\n created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),\n UNIQUE (resource_id, thread_id, content_hash)\n )\n `);\n await storage.db.none(\n `CREATE INDEX IF NOT EXISTS idx_survey_assistant_thread_documents_thread ON ${tableName} (resource_id, thread_id, created_at)`,\n );\n};\n\nexport interface InitializeSurveyAssistantPostgresStorageOptions {\n ensureObservationalMemory?: boolean;\n schemaName?: string;\n}\n\nexport const initializeSurveyAssistantPostgresStorage = async (\n storage: PostgresStore,\n {\n ensureObservationalMemory = true,\n schemaName = \"public\",\n }: InitializeSurveyAssistantPostgresStorageOptions = {},\n) => {\n await storage.init();\n if (ensureObservationalMemory) await ensureObservationalMemorySchema(storage, schemaName);\n await ensureThreadDocumentsSchema(storage, schemaName);\n return storage;\n};\n\nconst toThreadDocument = (row: {\n id: string;\n name: string;\n media_type: string;\n byte_size: number;\n content_hash: string;\n created_at: Date | string;\n}): SurveyAssistantThreadDocument => ({\n id: row.id,\n name: row.name,\n mediaType: row.media_type,\n bytes: row.byte_size,\n contentHash: row.content_hash,\n createdAt: new Date(row.created_at).toISOString(),\n});\n\nexport interface CreateSurveyAssistantPostgresThreadDocumentRepositoryOptions {\n getStorage(): PostgresStore | Promise<PostgresStore>;\n schemaName?: string;\n}\n\nexport const createSurveyAssistantPostgresThreadDocumentRepository = ({\n getStorage,\n schemaName = \"public\",\n}: CreateSurveyAssistantPostgresThreadDocumentRepositoryOptions): SurveyAssistantThreadDocumentRepository => {\n const tableName = `${quoteIdentifier(schemaName)}.${quoteIdentifier(THREAD_DOCUMENTS_TABLE)}`;\n return {\n async put({ bytes, data, mediaType, name, resourceId, threadId }) {\n const storage = await getStorage();\n const contentHash = createHash(\"sha256\").update(data).digest(\"hex\");\n const row = await storage.db.tx(async (transaction) => {\n await transaction.none(\"SELECT pg_advisory_xact_lock(hashtext($1), hashtext($2))\", [\n resourceId,\n threadId,\n ]);\n const existing = await transaction.oneOrNone(\n `SELECT id, name, media_type, byte_size, content_hash, created_at FROM ${tableName}\n WHERE resource_id = $1 AND thread_id = $2 AND content_hash = $3`,\n [resourceId, threadId, contentHash],\n );\n if (existing) return existing;\n\n const usage = await transaction.one<{ count: string; bytes: string }>(\n `SELECT COUNT(*) AS count, COALESCE(SUM(byte_size), 0) AS bytes FROM ${tableName}\n WHERE resource_id = $1 AND thread_id = $2`,\n [resourceId, threadId],\n );\n if (Number(usage.count) >= SURVEY_ASSISTANT_MAX_ATTACHMENTS) {\n throw new SurveyAssistantRequestError(\n `A chat can contain up to ${SURVEY_ASSISTANT_MAX_ATTACHMENTS} attachments.`,\n );\n }\n if (Number(usage.bytes) + bytes > SURVEY_ASSISTANT_MAX_TOTAL_ATTACHMENT_BYTES) {\n throw new SurveyAssistantRequestError(\n \"The attachments stored for this chat are too large in total.\",\n );\n }\n\n return transaction.one(\n `INSERT INTO ${tableName}\n (id, resource_id, thread_id, name, media_type, byte_size, content_hash, data)\n VALUES\n ($1, $2, $3, $4, $5, $6, $7, decode($8, 'base64'))\n RETURNING id, name, media_type, byte_size, content_hash, created_at`,\n [randomUUID(), resourceId, threadId, name, mediaType, bytes, contentHash, data],\n );\n });\n return toThreadDocument(row);\n },\n async list({ resourceId, threadId }) {\n const storage = await getStorage();\n const rows = await storage.db.manyOrNone(\n `SELECT id, name, media_type, byte_size, content_hash, created_at\n FROM ${tableName}\n WHERE resource_id = $1 AND thread_id = $2\n ORDER BY created_at ASC`,\n [resourceId, threadId],\n );\n return rows.map(toThreadDocument);\n },\n async read({ documentId, resourceId, threadId }) {\n const storage = await getStorage();\n const row = await storage.db.oneOrNone(\n `SELECT id, name, media_type, byte_size, content_hash, created_at,\n encode(data, 'base64') AS data\n FROM ${tableName}\n WHERE id = $1 AND resource_id = $2 AND thread_id = $3`,\n [documentId, resourceId, threadId],\n );\n return row\n ? {\n ...toThreadDocument(row),\n // PostgreSQL wraps encoded BYTEA output at 76 characters.\n data: String(row.data).replace(/\\s+/g, \"\"),\n }\n : null;\n },\n async deleteThread({ resourceId, threadId }) {\n const storage = await getStorage();\n await storage.db.none(`DELETE FROM ${tableName} WHERE resource_id = $1 AND thread_id = $2`, [\n resourceId,\n threadId,\n ]);\n },\n };\n};\n\nexport interface CreateSurveyAssistantPostgresRuntimeOptions {\n ensureObservationalMemory?: boolean;\n schemaName?: string;\n store: PostgresStore | PostgresStoreConfig;\n}\n\nexport const createSurveyAssistantPostgresRuntime = ({\n ensureObservationalMemory,\n schemaName = \"public\",\n store: storeOrConfig,\n}: CreateSurveyAssistantPostgresRuntimeOptions) => {\n const storage =\n storeOrConfig instanceof PostgresStore ? storeOrConfig : new PostgresStore(storeOrConfig);\n let initialization: Promise<PostgresStore> | undefined;\n const getStorage = () => {\n initialization ??= initializeSurveyAssistantPostgresStorage(storage, {\n ensureObservationalMemory,\n schemaName,\n });\n return initialization;\n };\n\n return {\n storage,\n getStorage,\n threadDocuments: createSurveyAssistantPostgresThreadDocumentRepository({\n getStorage,\n schemaName,\n }),\n };\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"storage-postgres.mjs","names":[],"sources":["../src/storage/postgres.ts"],"sourcesContent":["import { OBSERVATIONAL_MEMORY_TABLE_SCHEMA, type StorageColumn } from \"@mastra/core/storage\";\nimport { PostgresStore, type PostgresStoreConfig } from \"@mastra/pg\";\nimport { createHash, randomUUID } from \"node:crypto\";\nimport { SurveyAssistantRequestError } from \"../server/request-guardrails\";\nimport type {\n SurveyAssistantThreadDocument,\n SurveyAssistantThreadDocumentRepository,\n} from \"../server/thread-documents\";\n\nconst OBSERVATIONAL_MEMORY_TABLE = \"mastra_observational_memory\";\nconst THREAD_DOCUMENTS_TABLE = \"survey_assistant_thread_documents\";\nexport const SURVEY_ASSISTANT_DEFAULT_MAX_STORED_ATTACHMENTS_PER_THREAD = 100;\nexport const SURVEY_ASSISTANT_DEFAULT_MAX_STORED_ATTACHMENT_BYTES_PER_THREAD = 200 * 1024 * 1024;\n\nconst quoteIdentifier = (value: string) => `\"${value.replaceAll('\"', '\"\"')}\"`;\n\nconst postgresType = (column: StorageColumn) => {\n switch (column.type) {\n case \"text\":\n return \"TEXT\";\n case \"timestamp\":\n return \"TIMESTAMP\";\n case \"jsonb\":\n return \"JSONB\";\n case \"integer\":\n return \"INTEGER\";\n case \"float\":\n return \"DOUBLE PRECISION\";\n case \"bigint\":\n return \"BIGINT\";\n case \"boolean\":\n return \"BOOLEAN\";\n case \"uuid\":\n return \"UUID\";\n }\n};\n\nconst migrationDefault = (column: StorageColumn) => {\n switch (column.type) {\n case \"boolean\":\n return \"FALSE\";\n case \"integer\":\n case \"bigint\":\n case \"float\":\n return \"0\";\n case \"jsonb\":\n return \"'{}'::jsonb\";\n case \"timestamp\":\n return \"NOW()\";\n case \"text\":\n return \"''\";\n case \"uuid\":\n return \"gen_random_uuid()\";\n }\n};\n\nconst columnSql = (name: string, column: StorageColumn, includeMigrationDefault = false) => {\n const constraints = [\n column.primaryKey ? \"PRIMARY KEY\" : undefined,\n column.nullable === false ? \"NOT NULL\" : undefined,\n includeMigrationDefault && column.nullable === false\n ? `DEFAULT ${migrationDefault(column)}`\n : undefined,\n ]\n .filter(Boolean)\n .join(\" \");\n return `${quoteIdentifier(name)} ${postgresType(column)}${constraints ? ` ${constraints}` : \"\"}`;\n};\n\nconst ensureObservationalMemorySchema = async (storage: PostgresStore, schemaName: string) => {\n const tableSchema = OBSERVATIONAL_MEMORY_TABLE_SCHEMA[OBSERVATIONAL_MEMORY_TABLE];\n if (!tableSchema) throw new Error(\"Mastra observational memory schema is unavailable.\");\n\n const tableName = `${quoteIdentifier(schemaName)}.${quoteIdentifier(OBSERVATIONAL_MEMORY_TABLE)}`;\n const columns = Object.entries(tableSchema).flatMap(([name, column]) => [\n columnSql(name, column),\n ...(column.type === \"timestamp\"\n ? [`${quoteIdentifier(`${name}Z`)} TIMESTAMPTZ DEFAULT NOW()`]\n : []),\n ]);\n\n await storage.db.none(`CREATE TABLE IF NOT EXISTS ${tableName} (${columns.join(\", \")})`);\n for (const [name, column] of Object.entries(tableSchema)) {\n await storage.db.none(\n `ALTER TABLE ${tableName} ADD COLUMN IF NOT EXISTS ${columnSql(name, column, true)}`,\n );\n if (column.type === \"timestamp\") {\n await storage.db.none(\n `ALTER TABLE ${tableName} ADD COLUMN IF NOT EXISTS ${quoteIdentifier(`${name}Z`)} TIMESTAMPTZ DEFAULT NOW()`,\n );\n }\n }\n await storage.db.none(\n `CREATE INDEX IF NOT EXISTS idx_om_lookup_key ON ${tableName} (${quoteIdentifier(\"lookupKey\")})`,\n );\n};\n\nconst ensureThreadDocumentsSchema = async (storage: PostgresStore, schemaName: string) => {\n const tableName = `${quoteIdentifier(schemaName)}.${quoteIdentifier(THREAD_DOCUMENTS_TABLE)}`;\n await storage.db.none(`\n CREATE TABLE IF NOT EXISTS ${tableName} (\n id TEXT PRIMARY KEY,\n resource_id TEXT NOT NULL,\n thread_id TEXT NOT NULL,\n name TEXT NOT NULL,\n media_type TEXT NOT NULL,\n byte_size INTEGER NOT NULL,\n content_hash TEXT NOT NULL,\n data BYTEA NOT NULL,\n created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),\n UNIQUE (resource_id, thread_id, content_hash)\n )\n `);\n await storage.db.none(\n `CREATE INDEX IF NOT EXISTS idx_survey_assistant_thread_documents_thread ON ${tableName} (resource_id, thread_id, created_at)`,\n );\n};\n\nexport interface InitializeSurveyAssistantPostgresStorageOptions {\n ensureObservationalMemory?: boolean;\n schemaName?: string;\n}\n\nexport const initializeSurveyAssistantPostgresStorage = async (\n storage: PostgresStore,\n {\n ensureObservationalMemory = true,\n schemaName = \"public\",\n }: InitializeSurveyAssistantPostgresStorageOptions = {},\n) => {\n await storage.init();\n if (ensureObservationalMemory) await ensureObservationalMemorySchema(storage, schemaName);\n await ensureThreadDocumentsSchema(storage, schemaName);\n return storage;\n};\n\nconst toThreadDocument = (row: {\n id: string;\n name: string;\n media_type: string;\n byte_size: number;\n content_hash: string;\n created_at: Date | string;\n}): SurveyAssistantThreadDocument => ({\n id: row.id,\n name: row.name,\n mediaType: row.media_type,\n bytes: row.byte_size,\n contentHash: row.content_hash,\n createdAt: new Date(row.created_at).toISOString(),\n});\n\nexport interface CreateSurveyAssistantPostgresThreadDocumentRepositoryOptions {\n getStorage(): PostgresStore | Promise<PostgresStore>;\n maxStoredAttachmentsPerThread?: number;\n maxStoredBytesPerThread?: number;\n schemaName?: string;\n}\n\nexport const createSurveyAssistantPostgresThreadDocumentRepository = ({\n getStorage,\n maxStoredAttachmentsPerThread = SURVEY_ASSISTANT_DEFAULT_MAX_STORED_ATTACHMENTS_PER_THREAD,\n maxStoredBytesPerThread = SURVEY_ASSISTANT_DEFAULT_MAX_STORED_ATTACHMENT_BYTES_PER_THREAD,\n schemaName = \"public\",\n}: CreateSurveyAssistantPostgresThreadDocumentRepositoryOptions): SurveyAssistantThreadDocumentRepository => {\n if (\n !Number.isSafeInteger(maxStoredAttachmentsPerThread) ||\n maxStoredAttachmentsPerThread <= 0 ||\n !Number.isSafeInteger(maxStoredBytesPerThread) ||\n maxStoredBytesPerThread <= 0\n ) {\n throw new Error(\"Survey assistant stored attachment limits must be positive integers.\");\n }\n const tableName = `${quoteIdentifier(schemaName)}.${quoteIdentifier(THREAD_DOCUMENTS_TABLE)}`;\n return {\n async put({ bytes, data, mediaType, name, resourceId, threadId }) {\n const storage = await getStorage();\n const contentHash = createHash(\"sha256\").update(data).digest(\"hex\");\n const row = await storage.db.tx(async (transaction) => {\n await transaction.none(\"SELECT pg_advisory_xact_lock(hashtext($1), hashtext($2))\", [\n resourceId,\n threadId,\n ]);\n const existing = await transaction.oneOrNone(\n `SELECT id, name, media_type, byte_size, content_hash, created_at FROM ${tableName}\n WHERE resource_id = $1 AND thread_id = $2 AND content_hash = $3`,\n [resourceId, threadId, contentHash],\n );\n if (existing) return existing;\n\n const usage = await transaction.one<{ count: string; bytes: string }>(\n `SELECT COUNT(*) AS count, COALESCE(SUM(byte_size), 0) AS bytes FROM ${tableName}\n WHERE resource_id = $1 AND thread_id = $2`,\n [resourceId, threadId],\n );\n if (Number(usage.count) >= maxStoredAttachmentsPerThread) {\n throw new SurveyAssistantRequestError(\n `A chat can contain up to ${maxStoredAttachmentsPerThread} stored attachments.`,\n );\n }\n if (Number(usage.bytes) + bytes > maxStoredBytesPerThread) {\n throw new SurveyAssistantRequestError(\n \"The attachments stored for this chat are too large in total.\",\n );\n }\n\n return transaction.one(\n `INSERT INTO ${tableName}\n (id, resource_id, thread_id, name, media_type, byte_size, content_hash, data)\n VALUES\n ($1, $2, $3, $4, $5, $6, $7, decode($8, 'base64'))\n RETURNING id, name, media_type, byte_size, content_hash, created_at`,\n [randomUUID(), resourceId, threadId, name, mediaType, bytes, contentHash, data],\n );\n });\n return toThreadDocument(row);\n },\n async list({ resourceId, threadId }) {\n const storage = await getStorage();\n const rows = await storage.db.manyOrNone(\n `SELECT id, name, media_type, byte_size, content_hash, created_at\n FROM ${tableName}\n WHERE resource_id = $1 AND thread_id = $2\n ORDER BY created_at ASC`,\n [resourceId, threadId],\n );\n return rows.map(toThreadDocument);\n },\n async read({ documentId, resourceId, threadId }) {\n const storage = await getStorage();\n const row = await storage.db.oneOrNone(\n `SELECT id, name, media_type, byte_size, content_hash, created_at,\n encode(data, 'base64') AS data\n FROM ${tableName}\n WHERE id = $1 AND resource_id = $2 AND thread_id = $3`,\n [documentId, resourceId, threadId],\n );\n return row\n ? {\n ...toThreadDocument(row),\n // PostgreSQL wraps encoded BYTEA output at 76 characters.\n data: String(row.data).replace(/\\s+/g, \"\"),\n }\n : null;\n },\n async deleteThread({ resourceId, threadId }) {\n const storage = await getStorage();\n await storage.db.none(`DELETE FROM ${tableName} WHERE resource_id = $1 AND thread_id = $2`, [\n resourceId,\n threadId,\n ]);\n },\n };\n};\n\nexport interface CreateSurveyAssistantPostgresRuntimeOptions {\n ensureObservationalMemory?: boolean;\n maxStoredAttachmentsPerThread?: number;\n maxStoredBytesPerThread?: number;\n schemaName?: string;\n store: PostgresStore | PostgresStoreConfig;\n}\n\nexport const createSurveyAssistantPostgresRuntime = ({\n ensureObservationalMemory,\n maxStoredAttachmentsPerThread,\n maxStoredBytesPerThread,\n schemaName = \"public\",\n store: storeOrConfig,\n}: CreateSurveyAssistantPostgresRuntimeOptions) => {\n const storage =\n storeOrConfig instanceof PostgresStore ? storeOrConfig : new PostgresStore(storeOrConfig);\n let initialization: Promise<PostgresStore> | undefined;\n const getStorage = () => {\n initialization ??= initializeSurveyAssistantPostgresStorage(storage, {\n ensureObservationalMemory,\n schemaName,\n });\n return initialization;\n };\n\n return {\n storage,\n getStorage,\n threadDocuments: createSurveyAssistantPostgresThreadDocumentRepository({\n getStorage,\n maxStoredAttachmentsPerThread,\n maxStoredBytesPerThread,\n schemaName,\n }),\n };\n};\n"],"mappings":";;;;;AASA,MAAM,6BAA6B;AACnC,MAAM,yBAAyB;AAC/B,MAAa,6DAA6D;AAC1E,MAAa,kEAAkE,MAAM,OAAO;AAE5F,MAAM,mBAAmB,UAAkB,IAAI,MAAM,WAAW,MAAK,OAAK,CAAC;AAE3E,MAAM,gBAAgB,WAA0B;AAC9C,SAAQ,OAAO,MAAf;EACE,KAAK,OACH,QAAO;EACT,KAAK,YACH,QAAO;EACT,KAAK,QACH,QAAO;EACT,KAAK,UACH,QAAO;EACT,KAAK,QACH,QAAO;EACT,KAAK,SACH,QAAO;EACT,KAAK,UACH,QAAO;EACT,KAAK,OACH,QAAO;;;AAIb,MAAM,oBAAoB,WAA0B;AAClD,SAAQ,OAAO,MAAf;EACE,KAAK,UACH,QAAO;EACT,KAAK;EACL,KAAK;EACL,KAAK,QACH,QAAO;EACT,KAAK,QACH,QAAO;EACT,KAAK,YACH,QAAO;EACT,KAAK,OACH,QAAO;EACT,KAAK,OACH,QAAO;;;AAIb,MAAM,aAAa,MAAc,QAAuB,0BAA0B,UAAU;CAC1F,MAAM,cAAc;EAClB,OAAO,aAAa,gBAAgB,KAAA;EACpC,OAAO,aAAa,QAAQ,aAAa,KAAA;EACzC,2BAA2B,OAAO,aAAa,QAC3C,WAAW,iBAAiB,OAAO,KACnC,KAAA;EACL,CACE,OAAO,QAAQ,CACf,KAAK,IAAI;AACZ,QAAO,GAAG,gBAAgB,KAAK,CAAC,GAAG,aAAa,OAAO,GAAG,cAAc,IAAI,gBAAgB;;AAG9F,MAAM,kCAAkC,OAAO,SAAwB,eAAuB;CAC5F,MAAM,cAAc,kCAAkC;AACtD,KAAI,CAAC,YAAa,OAAM,IAAI,MAAM,qDAAqD;CAEvF,MAAM,YAAY,GAAG,gBAAgB,WAAW,CAAC,GAAG,gBAAgB,2BAA2B;CAC/F,MAAM,UAAU,OAAO,QAAQ,YAAY,CAAC,SAAS,CAAC,MAAM,YAAY,CACtE,UAAU,MAAM,OAAO,EACvB,GAAI,OAAO,SAAS,cAChB,CAAC,GAAG,gBAAgB,GAAG,KAAK,GAAG,CAAC,4BAA4B,GAC5D,EAAE,CACP,CAAC;AAEF,OAAM,QAAQ,GAAG,KAAK,8BAA8B,UAAU,IAAI,QAAQ,KAAK,KAAK,CAAC,GAAG;AACxF,MAAK,MAAM,CAAC,MAAM,WAAW,OAAO,QAAQ,YAAY,EAAE;AACxD,QAAM,QAAQ,GAAG,KACf,eAAe,UAAU,4BAA4B,UAAU,MAAM,QAAQ,KAAK,GACnF;AACD,MAAI,OAAO,SAAS,YAClB,OAAM,QAAQ,GAAG,KACf,eAAe,UAAU,4BAA4B,gBAAgB,GAAG,KAAK,GAAG,CAAC,4BAClF;;AAGL,OAAM,QAAQ,GAAG,KACf,mDAAmD,UAAU,IAAI,gBAAgB,YAAY,CAAC,GAC/F;;AAGH,MAAM,8BAA8B,OAAO,SAAwB,eAAuB;CACxF,MAAM,YAAY,GAAG,gBAAgB,WAAW,CAAC,GAAG,gBAAgB,uBAAuB;AAC3F,OAAM,QAAQ,GAAG,KAAK;iCACS,UAAU;;;;;;;;;;;;IAYvC;AACF,OAAM,QAAQ,GAAG,KACf,8EAA8E,UAAU,uCACzF;;AAQH,MAAa,2CAA2C,OACtD,SACA,EACE,4BAA4B,MAC5B,aAAa,aACsC,EAAE,KACpD;AACH,OAAM,QAAQ,MAAM;AACpB,KAAI,0BAA2B,OAAM,gCAAgC,SAAS,WAAW;AACzF,OAAM,4BAA4B,SAAS,WAAW;AACtD,QAAO;;AAGT,MAAM,oBAAoB,SAOY;CACpC,IAAI,IAAI;CACR,MAAM,IAAI;CACV,WAAW,IAAI;CACf,OAAO,IAAI;CACX,aAAa,IAAI;CACjB,WAAW,IAAI,KAAK,IAAI,WAAW,CAAC,aAAa;CAClD;AASD,MAAa,yDAAyD,EACpE,YACA,gCAAA,KACA,0BAA0B,iEAC1B,aAAa,eAC8F;AAC3G,KACE,CAAC,OAAO,cAAc,8BAA8B,IACpD,iCAAiC,KACjC,CAAC,OAAO,cAAc,wBAAwB,IAC9C,2BAA2B,EAE3B,OAAM,IAAI,MAAM,uEAAuE;CAEzF,MAAM,YAAY,GAAG,gBAAgB,WAAW,CAAC,GAAG,gBAAgB,uBAAuB;AAC3F,QAAO;EACL,MAAM,IAAI,EAAE,OAAO,MAAM,WAAW,MAAM,YAAY,YAAY;GAChE,MAAM,UAAU,MAAM,YAAY;GAClC,MAAM,cAAc,WAAW,SAAS,CAAC,OAAO,KAAK,CAAC,OAAO,MAAM;AAsCnE,UAAO,iBAAiB,MArCN,QAAQ,GAAG,GAAG,OAAO,gBAAgB;AACrD,UAAM,YAAY,KAAK,4DAA4D,CACjF,YACA,SACD,CAAC;IACF,MAAM,WAAW,MAAM,YAAY,UACjC,yEAAyE,UAAU;6EAEnF;KAAC;KAAY;KAAU;KAAY,CACpC;AACD,QAAI,SAAU,QAAO;IAErB,MAAM,QAAQ,MAAM,YAAY,IAC9B,uEAAuE,UAAU;uDAEjF,CAAC,YAAY,SAAS,CACvB;AACD,QAAI,OAAO,MAAM,MAAM,IAAI,8BACzB,OAAM,IAAI,4BACR,4BAA4B,8BAA8B,sBAC3D;AAEH,QAAI,OAAO,MAAM,MAAM,GAAG,QAAQ,wBAChC,OAAM,IAAI,4BACR,+DACD;AAGH,WAAO,YAAY,IACjB,eAAe,UAAU;;;;iFAKzB;KAAC,YAAY;KAAE;KAAY;KAAU;KAAM;KAAW;KAAO;KAAa;KAAK,CAChF;KACD,CAC0B;;EAE9B,MAAM,KAAK,EAAE,YAAY,YAAY;AASnC,WAAO,OAPY,MADG,YAAY,EACP,GAAG,WAC5B;gBACQ,UAAU;;mCAGlB,CAAC,YAAY,SAAS,CACvB,EACW,IAAI,iBAAiB;;EAEnC,MAAM,KAAK,EAAE,YAAY,YAAY,YAAY;GAE/C,MAAM,MAAM,OAAM,MADI,YAAY,EACR,GAAG,UAC3B;;gBAEQ,UAAU;iEAElB;IAAC;IAAY;IAAY;IAAS,CACnC;AACD,UAAO,MACH;IACE,GAAG,iBAAiB,IAAI;IAExB,MAAM,OAAO,IAAI,KAAK,CAAC,QAAQ,QAAQ,GAAG;IAC3C,GACD;;EAEN,MAAM,aAAa,EAAE,YAAY,YAAY;AAE3C,UAAM,MADgB,YAAY,EACpB,GAAG,KAAK,eAAe,UAAU,6CAA6C,CAC1F,YACA,SACD,CAAC;;EAEL;;AAWH,MAAa,wCAAwC,EACnD,2BACA,+BACA,yBACA,aAAa,UACb,OAAO,oBAC0C;CACjD,MAAM,UACJ,yBAAyB,gBAAgB,gBAAgB,IAAI,cAAc,cAAc;CAC3F,IAAI;CACJ,MAAM,mBAAmB;AACvB,qBAAmB,yCAAyC,SAAS;GACnE;GACA;GACD,CAAC;AACF,SAAO;;AAGT,QAAO;EACL;EACA;EACA,iBAAiB,sDAAsD;GACrE;GACA;GACA;GACA;GACD,CAAC;EACH"}
@@ -0,0 +1,140 @@
1
+ import { A as SurveyAssistantSuggestItemKeyResult, B as SurveyAssistantTranslateContentResult, F as SurveyAssistantTaskInvocationMode, M as SurveyAssistantSuggestItemLabelResult, P as SurveyAssistantTaskContext, j as SurveyAssistantSuggestItemLabelInput, k as SurveyAssistantSuggestItemKeyInput, z as SurveyAssistantTranslateContentInput } from "./index-DVxVyhAu.mjs";
2
+ import { a as SurveyAssistantModelSelection, n as SURVEY_ASSISTANT_TASK_AGENT_ID, o as SurveyAssistantRequestContext } from "./constants-56jf_4ls.mjs";
3
+ import { z } from "zod";
4
+ import { RequestContext } from "@mastra/core/request-context";
5
+ import * as _$_mastra_core_agent0 from "@mastra/core/agent";
6
+ import { Agent, AgentConfig, AgentExecutionOptions } from "@mastra/core/agent";
7
+
8
+ //#region src/server/authoring-references.d.ts
9
+ declare const surveyAuthoringReferenceTopics: readonly ["core-rules", "survey-data-model", "source-material-surveys", "localization", "rich-text-content", "item-types", "embedded-forms", "expressions", "assistant-operations", "survey-quality"];
10
+ type SurveyAuthoringReferenceTopic = (typeof surveyAuthoringReferenceTopics)[number];
11
+ declare const surveyAuthoringReferences: {
12
+ readonly "core-rules": {
13
+ readonly title: "Core authoring rules";
14
+ readonly content: string;
15
+ };
16
+ readonly "survey-data-model": {
17
+ readonly title: "Survey data model";
18
+ readonly content: string;
19
+ };
20
+ readonly "source-material-surveys": {
21
+ readonly title: "Source-material survey implementation";
22
+ readonly content: string;
23
+ };
24
+ readonly localization: {
25
+ readonly title: "Survey localization";
26
+ readonly content: string;
27
+ };
28
+ readonly "rich-text-content": {
29
+ readonly title: "Rich text content";
30
+ readonly content: string;
31
+ };
32
+ readonly "item-types": {
33
+ readonly title: "Item types";
34
+ readonly content: string;
35
+ };
36
+ readonly "embedded-forms": {
37
+ readonly title: "Choice option embedded forms";
38
+ readonly content: string;
39
+ };
40
+ readonly expressions: {
41
+ readonly title: "Expressions";
42
+ readonly content: string;
43
+ };
44
+ readonly "assistant-operations": {
45
+ readonly title: "Assistant operations";
46
+ readonly content: string;
47
+ };
48
+ readonly "survey-quality": {
49
+ readonly title: "Survey quality review";
50
+ readonly content: string;
51
+ };
52
+ };
53
+ //#endregion
54
+ //#region src/server/tasks.d.ts
55
+ type SurveyAssistantTaskAgentConfig = AgentConfig<typeof SURVEY_ASSISTANT_TASK_AGENT_ID, Record<string, never>, undefined, SurveyAssistantRequestContext>;
56
+ interface CreateSurveyAssistantTaskAgentOptions {
57
+ model: SurveyAssistantTaskAgentConfig["model"];
58
+ }
59
+ declare const createSurveyAssistantTaskAgent: ({
60
+ model
61
+ }: CreateSurveyAssistantTaskAgentOptions) => Agent<"survey-assistant-task-agent", Record<string, never>, undefined, SurveyAssistantRequestContext, _$_mastra_core_agent0.AgentEditorConfig | undefined>;
62
+ interface RunSurveyAssistantTaskOptions<TSchema extends z.ZodType> {
63
+ agent: Pick<Agent, "generate">;
64
+ taskId: string;
65
+ input: unknown;
66
+ context: SurveyAssistantTaskContext;
67
+ schema: TSchema;
68
+ instructions: readonly string[];
69
+ referenceTopics?: readonly SurveyAuthoringReferenceTopic[];
70
+ requestContext?: RequestContext<SurveyAssistantRequestContext>;
71
+ providerOptions?: AgentExecutionOptions["providerOptions"];
72
+ abortSignal?: AbortSignal;
73
+ }
74
+ declare const runSurveyAssistantTask: <TSchema extends z.ZodType>({
75
+ agent,
76
+ taskId,
77
+ input,
78
+ context,
79
+ schema,
80
+ instructions,
81
+ referenceTopics,
82
+ requestContext,
83
+ providerOptions,
84
+ abortSignal
85
+ }: RunSurveyAssistantTaskOptions<TSchema>) => Promise<z.output<TSchema>>;
86
+ interface RunSurveyAssistantBuiltInTaskOptions {
87
+ agent: Pick<Agent, "generate">;
88
+ context: SurveyAssistantTaskContext;
89
+ mode?: SurveyAssistantTaskInvocationMode;
90
+ requestContext?: RequestContext<SurveyAssistantRequestContext>;
91
+ providerOptions?: AgentExecutionOptions["providerOptions"];
92
+ abortSignal?: AbortSignal;
93
+ }
94
+ declare const runSurveyAssistantSuggestItemKeyTask: (input: SurveyAssistantSuggestItemKeyInput, options: RunSurveyAssistantBuiltInTaskOptions) => Promise<SurveyAssistantSuggestItemKeyResult>;
95
+ declare const runSurveyAssistantSuggestItemLabelTask: (input: SurveyAssistantSuggestItemLabelInput, options: RunSurveyAssistantBuiltInTaskOptions) => Promise<SurveyAssistantSuggestItemLabelResult>;
96
+ declare const runSurveyAssistantTranslateContentTask: (input: SurveyAssistantTranslateContentInput, options: RunSurveyAssistantBuiltInTaskOptions) => Promise<SurveyAssistantTranslateContentResult>;
97
+ interface SurveyAssistantTaskAuthorizedIdentity {
98
+ resourceId: string;
99
+ surveyId?: string;
100
+ }
101
+ interface SurveyAssistantTaskAuthorizationInput {
102
+ request: Request;
103
+ requestedResourceId?: string;
104
+ requestedSurveyId?: string;
105
+ }
106
+ interface SurveyAssistantTaskModelResolutionInput {
107
+ identity: SurveyAssistantTaskAuthorizedIdentity;
108
+ request: Request;
109
+ requestedModelId?: string;
110
+ }
111
+ interface CreateSurveyAssistantTaskHandlerOptions {
112
+ agent: Pick<Agent, "generate"> | (() => Pick<Agent, "generate"> | Promise<Pick<Agent, "generate">>);
113
+ authorize(input: SurveyAssistantTaskAuthorizationInput): SurveyAssistantTaskAuthorizedIdentity | Promise<SurveyAssistantTaskAuthorizedIdentity>;
114
+ getReadinessError?(request: Request): string | null | Promise<string | null>;
115
+ isEnabled?(request: Request): boolean | Promise<boolean>;
116
+ maxConcurrentRequests?: number;
117
+ maxDurationMs?: number;
118
+ onTaskMetrics?(input: {
119
+ durationMs: number;
120
+ identity: SurveyAssistantTaskAuthorizedIdentity;
121
+ status: "completed" | "failed";
122
+ taskId: string;
123
+ }): void;
124
+ providerOptions?: AgentExecutionOptions["providerOptions"];
125
+ resolveModel?(input: SurveyAssistantTaskModelResolutionInput): SurveyAssistantModelSelection | null | undefined | Promise<SurveyAssistantModelSelection | null | undefined>;
126
+ }
127
+ declare const createSurveyAssistantTaskHandler: ({
128
+ agent,
129
+ authorize,
130
+ getReadinessError,
131
+ isEnabled,
132
+ maxConcurrentRequests,
133
+ maxDurationMs,
134
+ onTaskMetrics,
135
+ providerOptions,
136
+ resolveModel
137
+ }: CreateSurveyAssistantTaskHandlerOptions) => (request: Request) => Promise<Response>;
138
+ //#endregion
139
+ export { SurveyAssistantTaskAuthorizationInput as a, createSurveyAssistantTaskAgent as c, runSurveyAssistantSuggestItemLabelTask as d, runSurveyAssistantTask as f, surveyAuthoringReferences as g, surveyAuthoringReferenceTopics as h, RunSurveyAssistantTaskOptions as i, createSurveyAssistantTaskHandler as l, SurveyAuthoringReferenceTopic as m, CreateSurveyAssistantTaskHandlerOptions as n, SurveyAssistantTaskAuthorizedIdentity as o, runSurveyAssistantTranslateContentTask as p, RunSurveyAssistantBuiltInTaskOptions as r, SurveyAssistantTaskModelResolutionInput as s, CreateSurveyAssistantTaskAgentOptions as t, runSurveyAssistantSuggestItemKeyTask as u };
140
+ //# sourceMappingURL=tasks-COQnhSeT.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tasks-COQnhSeT.d.mts","names":[],"sources":["../src/server/authoring-references.ts","../src/server/tasks.ts"],"mappings":";;;;;;;;cAMa,8BAAA;AAAA,KAaD,6BAAA,WAAwC,8BAAA;AAAA,cAyBvC,yBAAA;EAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KClBR,8BAAA,GAAiC,WAAA,QAC7B,8BAAA,EACP,MAAA,4BAEA,6BAAA;AAAA,UAGe,qCAAA;EACf,KAAA,EAAO,8BAAA;AAAA;AAAA,cAGI,8BAAA;EAAkC;AAAA,GAAW,qCAAA,KAAqC,KAAA,gCAAA,MAAA,4BAAA,6BAAA,EAAA,qBAAA,CAAA,iBAAA;AAAA,UAc9E,6BAAA,iBAA8C,CAAA,CAAE,OAAA;EAC/D,KAAA,EAAO,IAAA,CAAK,KAAA;EACZ,MAAA;EACA,KAAA;EACA,OAAA,EAAS,0BAAA;EACT,MAAA,EAAQ,OAAA;EACR,YAAA;EACA,eAAA,YAA2B,6BAAA;EAC3B,cAAA,GAAiB,cAAA,CAAe,6BAAA;EAChC,eAAA,GAAkB,qBAAA;EAClB,WAAA,GAAc,WAAA;AAAA;AAAA,cAUH,sBAAA,mBAAgD,CAAA,CAAE,OAAA;EAAS,KAAA;EAAA,MAAA;EAAA,KAAA;EAAA,OAAA;EAAA,MAAA;EAAA,YAAA;EAAA,eAAA;EAAA,cAAA;EAAA,eAAA;EAAA;AAAA,GAWrE,6BAAA,CAA8B,OAAA,MAAW,OAAA,CAAQ,CAAA,CAAE,MAAA,CAAO,OAAA;AAAA,UAiF5C,oCAAA;EACf,KAAA,EAAO,IAAA,CAAK,KAAA;EACZ,OAAA,EAAS,0BAAA;EACT,IAAA,GAAO,iCAAA;EACP,cAAA,GAAiB,cAAA,CAAe,6BAAA;EAChC,eAAA,GAAkB,qBAAA;EAClB,WAAA,GAAc,WAAA;AAAA;AAAA,cA8CH,oCAAA,GACX,KAAA,EAAO,kCAAA,EACP,OAAA,EAAS,oCAAA,KACR,OAAA,CAAQ,mCAAA;AAAA,cA6DE,sCAAA,GACX,KAAA,EAAO,oCAAA,EACP,OAAA,EAAS,oCAAA,KACR,OAAA,CAAQ,qCAAA;AAAA,cA6CE,sCAAA,GACX,KAAA,EAAO,oCAAA,EACP,OAAA,EAAS,oCAAA,KACR,OAAA,CAAQ,qCAAA;AAAA,UA8CM,qCAAA;EACf,UAAA;EACA,QAAA;AAAA;AAAA,UAGe,qCAAA;EACf,OAAA,EAAS,OAAA;EACT,mBAAA;EACA,iBAAA;AAAA;AAAA,UAGe,uCAAA;EACf,QAAA,EAAU,qCAAA;EACV,OAAA,EAAS,OAAA;EACT,gBAAA;AAAA;AAAA,UAGe,uCAAA;EACf,KAAA,EACI,IAAA,CAAK,KAAA,uBACE,IAAA,CAAK,KAAA,gBAAqB,OAAA,CAAQ,IAAA,CAAK,KAAA;EAClD,SAAA,CACE,KAAA,EAAO,qCAAA,GACN,qCAAA,GAAwC,OAAA,CAAQ,qCAAA;EACnD,iBAAA,EAAmB,OAAA,EAAS,OAAA,mBAA0B,OAAA;EACtD,SAAA,EAAW,OAAA,EAAS,OAAA,aAAoB,OAAA;EACxC,qBAAA;EACA,aAAA;EACA,aAAA,EAAe,KAAA;IACb,UAAA;IACA,QAAA,EAAU,qCAAA;IACV,MAAA;IACA,MAAA;EAAA;EAEF,eAAA,GAAkB,qBAAA;EAClB,YAAA,EACE,KAAA,EAAO,uCAAA,GAEL,6BAAA,sBAGA,OAAA,CAAQ,6BAAA;AAAA;AAAA,cAmCD,gCAAA;EAAoC,KAAA;EAAA,SAAA;EAAA,iBAAA;EAAA,SAAA;EAAA,qBAAA;EAAA,aAAA;EAAA,aAAA;EAAA,eAAA;EAAA;AAAA,GAU9C,uCAAA,MAWa,OAAA,EAAS,OAAA,KAAU,OAAA,CAAQ,QAAA"}
@@ -49,6 +49,18 @@ interface SurveyAssistantThreadDocumentRepository {
49
49
  threadId: string;
50
50
  }): Promise<void>;
51
51
  }
52
+ /**
53
+ * Replaces current-turn file data with small repository references before the
54
+ * message is handed to Mastra for persistence. The provider-bound attachment
55
+ * processor re-injects the authorized repository copy transiently.
56
+ */
57
+ declare const replaceCurrentSurveyAssistantAttachmentsWithReferences: ({
58
+ documents,
59
+ messages
60
+ }: {
61
+ documents: SurveyAssistantThreadDocument[];
62
+ messages: UIMessage[];
63
+ }) => UIMessage[];
52
64
  declare const registerSurveyAssistantThreadAttachments: ({
53
65
  messages,
54
66
  repository,
@@ -61,16 +73,20 @@ declare const registerSurveyAssistantThreadAttachments: ({
61
73
  threadId: string;
62
74
  }) => Promise<SurveyAssistantThreadDocument[]>;
63
75
  declare const removeHistoricalSurveyAssistantAttachments: (messages: UIMessage[]) => UIMessage<unknown, _$ai.UIDataTypes, _$ai.UITools>[];
64
- declare const getSurveyAssistantReplayableDocuments: (documents: SurveyAssistantThreadDocument[], messages: UIMessage[]) => SurveyAssistantThreadDocument[];
76
+ /**
77
+ * Excludes the exact repository documents already loaded for the current turn.
78
+ * Message parts are references by this stage and are not a deduplication source.
79
+ */
80
+ declare const getSurveyAssistantReplayableDocuments: (documents: SurveyAssistantThreadDocument[], currentDocumentIds: ReadonlySet<string>) => SurveyAssistantThreadDocument[];
65
81
  declare const loadSurveyAssistantThreadAttachments: ({
82
+ currentDocumentIds,
66
83
  documents,
67
- messages,
68
84
  repository,
69
85
  resourceId,
70
86
  threadId
71
87
  }: {
88
+ currentDocumentIds?: ReadonlySet<string>;
72
89
  documents: SurveyAssistantThreadDocument[];
73
- messages: UIMessage[];
74
90
  repository: SurveyAssistantThreadDocumentRepository;
75
91
  resourceId: string;
76
92
  threadId: string;
@@ -87,5 +103,5 @@ declare const loadSurveyAssistantDocuments: ({
87
103
  threadId: string;
88
104
  }) => Promise<SurveyAssistantModelAttachment[]>;
89
105
  //#endregion
90
- export { SurveyAssistantThreadDocumentRepository as a, loadSurveyAssistantThreadAttachments as c, SurveyAssistantThreadDocumentContent as i, registerSurveyAssistantThreadAttachments as l, SurveyAssistantModelAttachment as n, getSurveyAssistantReplayableDocuments as o, SurveyAssistantThreadDocument as r, loadSurveyAssistantDocuments as s, SurveyAssistantAttachmentAccess as t, removeHistoricalSurveyAssistantAttachments as u };
91
- //# sourceMappingURL=thread-documents-DamIq9Od.d.mts.map
106
+ export { SurveyAssistantThreadDocumentRepository as a, loadSurveyAssistantThreadAttachments as c, replaceCurrentSurveyAssistantAttachmentsWithReferences as d, SurveyAssistantThreadDocumentContent as i, registerSurveyAssistantThreadAttachments as l, SurveyAssistantModelAttachment as n, getSurveyAssistantReplayableDocuments as o, SurveyAssistantThreadDocument as r, loadSurveyAssistantDocuments as s, SurveyAssistantAttachmentAccess as t, removeHistoricalSurveyAssistantAttachments as u };
107
+ //# sourceMappingURL=thread-documents-BlxNjc7S.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"thread-documents-BlxNjc7S.d.mts","names":[],"sources":["../src/server/thread-documents.ts"],"mappings":";;;;UAOiB,6BAAA;EACf,EAAA;EACA,IAAA;EACA,SAAA;EACA,KAAA;EACA,WAAA;EACA,SAAA;AAAA;AAAA,UAGe,oCAAA,SAA6C,6BAAA;EAC5D,IAAA;AAAA;AAAA,UAGe,8BAAA;EACf,QAAA;EACA,SAAA;EACA,IAAA;EACA,WAAA;AAAA;AAAA,UAGe,+BAAA;EACf,SAAA,EAAW,6BAAA;EAXP;EAaJ,kBAAA;EACA,mBAAA,EAAqB,8BAAA;EACrB,IAAA,CAAK,WAAA,aAAwB,OAAA,CAAQ,8BAAA;AAAA;AAAA,UAGtB,uCAAA;EACf,GAAA,CAAI,KAAA;IACF,UAAA;IACA,QAAA;IACA,IAAA;IACA,SAAA;IACA,IAAA;IACA,KAAA;EAAA,IACE,OAAA,CAAQ,6BAAA;EACZ,IAAA,CAAK,KAAA;IAAS,UAAA;IAAoB,QAAA;EAAA,IAAqB,OAAA,CAAQ,6BAAA;EAC/D,IAAA,CAAK,KAAA;IACH,UAAA;IACA,QAAA;IACA,UAAA;EAAA,IACE,OAAA,CAAQ,oCAAA;EACZ,YAAA,CAAa,KAAA;IAAS,UAAA;IAAoB,QAAA;EAAA,IAAqB,OAAA;AAAA;;;;AAfjE;;cAgEa,sDAAA;EAA0D,SAAA;EAAA;AAAA;EAIrE,SAAA,EAAW,6BAAA;EACX,QAAA,EAAU,SAAA;AAAA,MACR,SAAA;AAAA,cA2BS,wCAAA;EAAkD,QAAA;EAAA,UAAA;EAAA,UAAA;EAAA;AAAA;EAM7D,QAAA,EAAU,SAAA;EACV,UAAA,EAAY,uCAAA;EACZ,UAAA;EACA,QAAA;AAAA,MACD,OAAA,CAAA,6BAAA;AAAA,cAkCY,0CAAA,GAA8C,QAAA,EAAU,SAAA,OAAW,SAAA,UAAF,IAAA,CAAE,WAAA,EAAA,IAAA,CAAA,OAAA;;;;;cAanE,qCAAA,GACX,SAAA,EAAW,6BAAA,IACX,kBAAA,EAAoB,WAAA,aAAmB,6BAAA;AAAA,cAG5B,oCAAA;EAA8C,kBAAA;EAAA,SAAA;EAAA,UAAA;EAAA,UAAA;EAAA;AAAA;EAOzD,kBAAA,GAAqB,WAAA;EACrB,SAAA,EAAW,6BAAA;EACX,UAAA,EAAY,uCAAA;EACZ,UAAA;EACA,QAAA;AAAA,MACE,OAAA,CAAQ,8BAAA;AAAA,cAcC,4BAAA;EAAsC,SAAA;EAAA,UAAA;EAAA,UAAA;EAAA;AAAA;EAMjD,SAAA,EAAW,6BAAA;EACX,UAAA,EAAY,uCAAA;EACZ,UAAA;EACA,QAAA;AAAA,MACE,OAAA,CAAQ,8BAAA"}