@case-framework/survey-assistant 0.3.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (79) hide show
  1. package/README.md +20 -4
  2. package/dist/capabilities-default.d.mts +1 -1
  3. package/dist/capabilities-default.mjs +1 -1
  4. package/dist/{constants-DrGZXtQf.d.mts → constants-DbrJxxOh.d.mts} +5 -2
  5. package/dist/constants-DbrJxxOh.d.mts.map +1 -0
  6. package/dist/{controller-proxy-DmBdzqKs.d.mts → controller-proxy-BdKF2yrq.d.mts} +2 -2
  7. package/dist/{controller-proxy-DmBdzqKs.d.mts.map → controller-proxy-BdKF2yrq.d.mts.map} +1 -1
  8. package/dist/{controller-proxy-CpkQRezb.mjs → controller-proxy-jWIPOZAv.mjs} +17 -8
  9. package/dist/controller-proxy-jWIPOZAv.mjs.map +1 -0
  10. package/dist/{engine-CWTuN3o2.mjs → engine-DcSdLRle.mjs} +172 -12
  11. package/dist/engine-DcSdLRle.mjs.map +1 -0
  12. package/dist/engine.d.mts +2 -2
  13. package/dist/engine.mjs +3 -3
  14. package/dist/{form-authoring-DCd9XfXf.mjs → form-authoring-BQh40yDb.mjs} +2 -2
  15. package/dist/{form-authoring-DCd9XfXf.mjs.map → form-authoring-BQh40yDb.mjs.map} +1 -1
  16. package/dist/{index-D4OitUg4.d.mts → index-BApnIiCI.d.mts} +7 -4
  17. package/dist/index-BApnIiCI.d.mts.map +1 -0
  18. package/dist/{index-Bo4dHAo8.d.mts → index-Da_Hb9-1.d.mts} +28 -4
  19. package/dist/index-Da_Hb9-1.d.mts.map +1 -0
  20. package/dist/{index-DZk20e3k.d.mts → index-DhNQKOwr.d.mts} +9 -5
  21. package/dist/index-DhNQKOwr.d.mts.map +1 -0
  22. package/dist/{index-Dxgg0-D_.d.mts → index-dV6df0W3.d.mts} +11 -5
  23. package/dist/index-dV6df0W3.d.mts.map +1 -0
  24. package/dist/{memory-thread-repository-acbz6HZJ.mjs → memory-thread-repository-CvYZwni6.mjs} +87 -28
  25. package/dist/memory-thread-repository-CvYZwni6.mjs.map +1 -0
  26. package/dist/{protocol-DATvkr1S.mjs → protocol-DJUP4gc0.mjs} +10 -4
  27. package/dist/protocol-DJUP4gc0.mjs.map +1 -0
  28. package/dist/protocol.d.mts +1 -1
  29. package/dist/protocol.mjs +1 -1
  30. package/dist/{react-Br5YE8H-.mjs → react-CY6N7lVi.mjs} +25 -5
  31. package/dist/react-CY6N7lVi.mjs.map +1 -0
  32. package/dist/react-integration.d.mts +1 -1
  33. package/dist/react-integration.mjs +1 -1
  34. package/dist/react.d.mts +2 -2
  35. package/dist/react.mjs +2 -2
  36. package/dist/{request-context-BEjnaaFr.mjs → request-context-D1sC54ZA.mjs} +3 -3
  37. package/dist/request-context-D1sC54ZA.mjs.map +1 -0
  38. package/dist/server-agent.d.mts +8 -6
  39. package/dist/server-agent.d.mts.map +1 -1
  40. package/dist/server-agent.mjs +4 -3
  41. package/dist/server-agent.mjs.map +1 -1
  42. package/dist/server-runtime.d.mts +354 -7
  43. package/dist/server-runtime.d.mts.map +1 -1
  44. package/dist/server-runtime.mjs +361 -24
  45. package/dist/server-runtime.mjs.map +1 -1
  46. package/dist/server-tasks.d.mts +1 -1
  47. package/dist/server-tasks.mjs +5 -4
  48. package/dist/server-tasks.mjs.map +1 -1
  49. package/dist/server-tools.d.mts +1 -1
  50. package/dist/server-tools.mjs +1 -1
  51. package/dist/server.d.mts +7 -7
  52. package/dist/server.d.mts.map +1 -1
  53. package/dist/server.mjs +2 -2
  54. package/dist/storage-postgres.mjs +3 -0
  55. package/dist/storage-postgres.mjs.map +1 -1
  56. package/dist/{tasks-DQgL449A.d.mts → tasks-CCtxjhwh.d.mts} +3 -3
  57. package/dist/{tasks-DQgL449A.d.mts.map → tasks-CCtxjhwh.d.mts.map} +1 -1
  58. package/dist/{thread-handlers-CeYl45xG.d.mts → thread-handlers-Bt9cDo-F.d.mts} +21 -6
  59. package/dist/{thread-handlers-CeYl45xG.d.mts.map → thread-handlers-Bt9cDo-F.d.mts.map} +1 -1
  60. package/dist/{tools-Dg9HZrYU.mjs → tools-3tq-XqI0.mjs} +31 -6
  61. package/dist/{tools-Dg9HZrYU.mjs.map → tools-3tq-XqI0.mjs.map} +1 -1
  62. package/dist/ui.css +1 -1
  63. package/dist/ui.d.mts +3 -3
  64. package/dist/ui.d.mts.map +1 -1
  65. package/dist/ui.mjs +438 -140
  66. package/dist/ui.mjs.map +1 -1
  67. package/docs/integration.md +113 -58
  68. package/package.json +3 -3
  69. package/dist/constants-DrGZXtQf.d.mts.map +0 -1
  70. package/dist/controller-proxy-CpkQRezb.mjs.map +0 -1
  71. package/dist/engine-CWTuN3o2.mjs.map +0 -1
  72. package/dist/index-Bo4dHAo8.d.mts.map +0 -1
  73. package/dist/index-D4OitUg4.d.mts.map +0 -1
  74. package/dist/index-DZk20e3k.d.mts.map +0 -1
  75. package/dist/index-Dxgg0-D_.d.mts.map +0 -1
  76. package/dist/memory-thread-repository-acbz6HZJ.mjs.map +0 -1
  77. package/dist/protocol-DATvkr1S.mjs.map +0 -1
  78. package/dist/react-Br5YE8H-.mjs.map +0 -1
  79. package/dist/request-context-BEjnaaFr.mjs.map +0 -1
@@ -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 { 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":"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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 }).catch((error: unknown) => {\n initialization = undefined;\n throw error;\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":"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"}
@@ -1,5 +1,5 @@
1
- import { c as SurveyAssistantSuggestItemKeyInput, d as SurveyAssistantSuggestItemLabelResult, l as SurveyAssistantSuggestItemKeyResult, m as SurveyAssistantTaskInvocationMode, p as SurveyAssistantTaskContext, u as SurveyAssistantSuggestItemLabelInput, v as SurveyAssistantTranslateContentInput, y as SurveyAssistantTranslateContentResult } from "./index-D4OitUg4.mjs";
2
- import { a as SurveyAssistantModelSelection, n as SURVEY_ASSISTANT_TASK_AGENT_ID, o as SurveyAssistantRequestContext } from "./constants-DrGZXtQf.mjs";
1
+ import { c as SurveyAssistantSuggestItemKeyInput, d as SurveyAssistantSuggestItemLabelResult, l as SurveyAssistantSuggestItemKeyResult, m as SurveyAssistantTaskInvocationMode, p as SurveyAssistantTaskContext, u as SurveyAssistantSuggestItemLabelInput, v as SurveyAssistantTranslateContentInput, y as SurveyAssistantTranslateContentResult } from "./index-BApnIiCI.mjs";
2
+ import { a as SurveyAssistantModelSelection, n as SURVEY_ASSISTANT_TASK_AGENT_ID, o as SurveyAssistantRequestContext } from "./constants-DbrJxxOh.mjs";
3
3
  import { z } from "zod";
4
4
  import { RequestContext } from "@mastra/core/request-context";
5
5
  import * as _$_mastra_core_agent0 from "@mastra/core/agent";
@@ -141,4 +141,4 @@ declare const createSurveyAssistantTaskHandler: ({
141
141
  }: CreateSurveyAssistantTaskHandlerOptions) => (request: Request) => Promise<Response>;
142
142
  //#endregion
143
143
  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 };
144
- //# sourceMappingURL=tasks-DQgL449A.d.mts.map
144
+ //# sourceMappingURL=tasks-CCtxjhwh.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tasks-DQgL449A.d.mts","names":[],"sources":["../src/server/authoring-references.ts","../src/server/tasks.ts"],"mappings":";;;;;;;;cAMa,8BAAA;AAAA,KAcD,6BAAA,WAAwC,8BAAA;AAAA,cA6BvC,yBAAA;EAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KCtBR,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,cAWH,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"}
1
+ {"version":3,"file":"tasks-CCtxjhwh.d.mts","names":[],"sources":["../src/server/authoring-references.ts","../src/server/tasks.ts"],"mappings":";;;;;;;;cAMa,8BAAA;AAAA,KAcD,6BAAA,WAAwC,8BAAA;AAAA,cA6BvC,yBAAA;EAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KCtBR,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,cAWH,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"}
@@ -1,7 +1,7 @@
1
1
  import { p as SurveyAssistantTurnTerminationReason } from "./lifecycle-DWv5CiSu.mjs";
2
- import { Bt as SurveyAssistantCapabilitySet } from "./index-Bo4dHAo8.mjs";
2
+ import { Ut as SurveyAssistantCapabilitySet } from "./index-Da_Hb9-1.mjs";
3
3
  import { a as SurveyAssistantThreadDocumentRepository } from "./thread-documents-Dvo6XS7o.mjs";
4
- import { a as SurveyAssistantModelSelection, i as SurveyAssistantIdentityContext } from "./constants-DrGZXtQf.mjs";
4
+ import { a as SurveyAssistantModelSelection, i as SurveyAssistantIdentityContext } from "./constants-DbrJxxOh.mjs";
5
5
  import { UIMessage } from "ai";
6
6
  import { AgentExecutionOptions } from "@mastra/core/agent";
7
7
  import { Mastra } from "@mastra/core/mastra";
@@ -109,8 +109,14 @@ interface SurveyAssistantThreadIdentity {
109
109
  }
110
110
  interface CreateSurveyAssistantThreadHandlersOptions {
111
111
  authorize(request: Request): SurveyAssistantThreadIdentity | Promise<SurveyAssistantThreadIdentity>;
112
+ onError?(error: unknown, context: SurveyAssistantThreadErrorContext): void;
112
113
  repository: SurveyAssistantThreadRepository;
113
114
  }
115
+ interface SurveyAssistantThreadErrorContext {
116
+ operation: "create" | "delete" | "list" | "read" | "update";
117
+ request: Request;
118
+ threadId?: string;
119
+ }
114
120
  interface SurveyAssistantStoredThread {
115
121
  id: string;
116
122
  title?: string;
@@ -126,8 +132,16 @@ interface SurveyAssistantThreadRepository {
126
132
  metadata: Record<string, unknown>;
127
133
  }): Promise<SurveyAssistantStoredThread>;
128
134
  get(threadId: string): Promise<SurveyAssistantStoredThread | null>;
129
- list(resourceId: string, metadata: Record<string, string>): Promise<SurveyAssistantStoredThread[]>;
130
- readMessages(threadId: string, resourceId: string): Promise<unknown[]>;
135
+ list(resourceId: string, metadata: Record<string, string>, options?: {
136
+ cursor?: string;
137
+ }): Promise<SurveyAssistantStoredThread[] | {
138
+ threads: SurveyAssistantStoredThread[];
139
+ nextCursor?: string;
140
+ }>;
141
+ readMessages(threadId: string, resourceId: string, cursor?: string): Promise<unknown[] | {
142
+ messages: unknown[];
143
+ nextCursor?: string;
144
+ }>;
131
145
  delete(threadId: string): Promise<void>;
132
146
  update(input: {
133
147
  id: string;
@@ -137,6 +151,7 @@ interface SurveyAssistantThreadRepository {
137
151
  }
138
152
  declare const createSurveyAssistantThreadHandlers: ({
139
153
  authorize,
154
+ onError,
140
155
  repository
141
156
  }: CreateSurveyAssistantThreadHandlersOptions) => {
142
157
  create: (request: Request) => Promise<Response>;
@@ -146,5 +161,5 @@ declare const createSurveyAssistantThreadHandlers: ({
146
161
  update: (request: Request, threadId: string) => Promise<Response>;
147
162
  };
148
163
  //#endregion
149
- export { validateSurveyAssistantMessages as A, SURVEY_ASSISTANT_MAX_MESSAGES as C, SurveyAssistantRequestError as D, SURVEY_ASSISTANT_MAX_TOTAL_ATTACHMENT_BYTES as E, SurveyAssistantRequestLimits as O, SURVEY_ASSISTANT_MAX_ATTACHMENT_NAME_CHARS as S, SURVEY_ASSISTANT_MAX_TEXT_PART_CHARS as T, formatSurveyAssistantStreamError as _, createSurveyAssistantThreadHandlers as a, SURVEY_ASSISTANT_MAX_ATTACHMENTS as b, SurveyAssistantAuthorize as c, SurveyAssistantModelResolutionInput as d, SurveyAssistantResolveModel as f, describeSurveyAssistantStreamError as g, createSurveyAssistantChatHandler as h, SurveyAssistantThreadRepository as i, readSurveyAssistantRequestJson as k, SurveyAssistantAuthorizedIdentity as l, SurveyAssistantTurnMetrics as m, SurveyAssistantStoredThread as n, SurveyAssistantAuthorizationError as o, SurveyAssistantStreamErrorContext as p, SurveyAssistantThreadIdentity as r, SurveyAssistantAuthorizationInput as s, CreateSurveyAssistantThreadHandlersOptions as t, SurveyAssistantChatHandlerOptions as u, SURVEY_ASSISTANT_ACCEPTED_ATTACHMENT_TYPES as v, SURVEY_ASSISTANT_MAX_REQUEST_BYTES as w, SURVEY_ASSISTANT_MAX_ATTACHMENT_BYTES as x, SURVEY_ASSISTANT_DEFAULT_REQUEST_LIMITS as y };
150
- //# sourceMappingURL=thread-handlers-CeYl45xG.d.mts.map
164
+ export { readSurveyAssistantRequestJson as A, SURVEY_ASSISTANT_MAX_ATTACHMENT_NAME_CHARS as C, SURVEY_ASSISTANT_MAX_TOTAL_ATTACHMENT_BYTES as D, SURVEY_ASSISTANT_MAX_TEXT_PART_CHARS as E, SurveyAssistantRequestError as O, SURVEY_ASSISTANT_MAX_ATTACHMENT_BYTES as S, SURVEY_ASSISTANT_MAX_REQUEST_BYTES as T, describeSurveyAssistantStreamError as _, SurveyAssistantThreadRepository as a, SURVEY_ASSISTANT_DEFAULT_REQUEST_LIMITS as b, SurveyAssistantAuthorizationInput as c, SurveyAssistantChatHandlerOptions as d, SurveyAssistantModelResolutionInput as f, createSurveyAssistantChatHandler as g, SurveyAssistantTurnMetrics as h, SurveyAssistantThreadIdentity as i, validateSurveyAssistantMessages as j, SurveyAssistantRequestLimits as k, SurveyAssistantAuthorize as l, SurveyAssistantStreamErrorContext as m, SurveyAssistantStoredThread as n, createSurveyAssistantThreadHandlers as o, SurveyAssistantResolveModel as p, SurveyAssistantThreadErrorContext as r, SurveyAssistantAuthorizationError as s, CreateSurveyAssistantThreadHandlersOptions as t, SurveyAssistantAuthorizedIdentity as u, formatSurveyAssistantStreamError as v, SURVEY_ASSISTANT_MAX_MESSAGES as w, SURVEY_ASSISTANT_MAX_ATTACHMENTS as x, SURVEY_ASSISTANT_ACCEPTED_ATTACHMENT_TYPES as y };
165
+ //# sourceMappingURL=thread-handlers-Bt9cDo-F.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"thread-handlers-CeYl45xG.d.mts","names":[],"sources":["../src/server/request-guardrails.ts","../src/server/handler.ts","../src/server/thread-handlers.ts"],"mappings":"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"}
1
+ {"version":3,"file":"thread-handlers-Bt9cDo-F.d.mts","names":[],"sources":["../src/server/request-guardrails.ts","../src/server/handler.ts","../src/server/thread-handlers.ts"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
- import { X as SURVEY_OPERATION_KINDS, bt as surveyOperationSchemasByKind, f as surveyChangeSetSchema, q as assistantItemTypeManifestSchema, yt as surveyOperationSchema } from "./protocol-DATvkr1S.mjs";
2
- import { d as getDeterministicCreateItemTypes, f as inspectAssistantItem, p as resolveAssistantCapabilityReference } from "./form-authoring-DCd9XfXf.mjs";
3
- import { A as getRawSurvey, B as resolveItemSummary, C as clampLimit, F as mapKeyIndexById, H as summarizeFocusItemNode, I as mapOutlineById, J as translationEntrySchema, K as summarizeOutlineNode, L as mapRawItemsById, M as itemConfigDetailsSchema, N as itemMatchesQuery, P as itemSummarySchema, R as normalizeText, U as summarizeItemById, V as sliceWithCursor, W as summarizeKeyIndexEntries, Y as unique, _ as buildConfigSearchText, b as buildItemTranslationEntries, d as normalizeSurveyChangeOperations, f as buildExpressionMutationPatches, i as auditSurvey, j as getRawSurveyItems, k as getKeyIndexEntries, l as createSurveyChangeSet, p as expressionMutationSchema, q as summarizeRawItem, v as buildEmbeddedFormDetails, w as findDirectChildrenByFullKey, y as buildItemConfigDetails } from "./engine-CWTuN3o2.mjs";
4
- import { r as getSurveyAssistantEngineContext, s as requireSurveyAssistantTurnState } from "./request-context-BEjnaaFr.mjs";
1
+ import { X as SURVEY_OPERATION_KINDS, bt as surveyOperationSchemasByKind, f as surveyChangeSetSchema, q as assistantItemTypeManifestSchema, yt as surveyOperationSchema } from "./protocol-DJUP4gc0.mjs";
2
+ import { d as getDeterministicCreateItemTypes, f as inspectAssistantItem, p as resolveAssistantCapabilityReference } from "./form-authoring-BQh40yDb.mjs";
3
+ import { A as getRawSurvey, B as resolveItemSummary, C as clampLimit, F as mapKeyIndexById, H as summarizeFocusItemNode, I as mapOutlineById, J as translationEntrySchema, K as summarizeOutlineNode, L as mapRawItemsById, M as itemConfigDetailsSchema, N as itemMatchesQuery, P as itemSummarySchema, R as normalizeText, U as summarizeItemById, V as sliceWithCursor, W as summarizeKeyIndexEntries, X as analyzeSurveyAssistantExpressionReferences, Y as unique, _ as buildConfigSearchText, b as buildItemTranslationEntries, d as normalizeSurveyChangeOperations, f as buildExpressionMutationPatches, i as auditSurvey, j as getRawSurveyItems, k as getKeyIndexEntries, l as createSurveyChangeSet, p as expressionMutationSchema, q as summarizeRawItem, v as buildEmbeddedFormDetails, w as findDirectChildrenByFullKey, y as buildItemConfigDetails } from "./engine-DcSdLRle.mjs";
4
+ import { r as getSurveyAssistantEngineContext, s as requireSurveyAssistantTurnState } from "./request-context-D1sC54ZA.mjs";
5
5
  import { i as surveyAuthoringReferences, n as getBuiltInItemTypeAuthoringReference, r as surveyAuthoringReferenceTopics, t as builtInSurveyAuthoringItemTypes } from "./authoring-references-yyYC4Ydi.mjs";
6
6
  import { z } from "zod";
7
7
  import { JsonPatchError, SURVEY_EDITOR_ITEM_COLORS, encodeJsonPointerSegment, getAssetUsagesFromContent, getContentPlainText, getValueAtJsonPointer } from "@case-framework/survey-core";
@@ -1681,6 +1681,7 @@ const inspectActionSchema = z.enum([
1681
1681
  "item-details",
1682
1682
  "localization",
1683
1683
  "assets",
1684
+ "expression-diagnostics",
1684
1685
  "raw-json"
1685
1686
  ]);
1686
1687
  const outlineModeSchema = z.enum([
@@ -1975,6 +1976,24 @@ const surveyInspectTool = createTool({
1975
1976
  result
1976
1977
  };
1977
1978
  }
1979
+ if (input.action === "expression-diagnostics") {
1980
+ const allDiagnostics = analyzeSurveyAssistantExpressionReferences(snapshot.survey, snapshot.trustedCapabilities);
1981
+ const itemId = input.itemRef ? resolveItemRef(input, snapshot) : void 0;
1982
+ const diagnostics = itemId ? allDiagnostics.filter((diagnostic) => diagnostic.ownerItemId === itemId) : allDiagnostics;
1983
+ const limit = input.limit ?? 50;
1984
+ const result = {
1985
+ valid: diagnostics.length === 0,
1986
+ count: diagnostics.length,
1987
+ diagnostics: diagnostics.slice(0, limit),
1988
+ truncated: diagnostics.length > limit
1989
+ };
1990
+ return {
1991
+ ok: true,
1992
+ action: input.action,
1993
+ modelSummary: diagnostics.length === 0 ? "No broken expression references were found in the current survey draft." : `${diagnostics.length} broken expression reference${diagnostics.length === 1 ? " was" : "s were"} found. Repair every listed location, then run expression-diagnostics again before claiming completion.\n${stringifyForModel(result)}`,
1994
+ result
1995
+ };
1996
+ }
1978
1997
  if (input.action === "localization") {
1979
1998
  if (!input.targetLocale) return {
1980
1999
  ok: false,
@@ -2137,6 +2156,8 @@ const inputSchema$1 = z.object({
2137
2156
  sourceLocale: z.string().min(1).optional().describe("Locale treated as the source when checking translation completeness."),
2138
2157
  targetLocales: z.array(z.string().min(1)).max(20).optional(),
2139
2158
  maxFindings: z.number().int().min(1).max(300).default(120).optional(),
2159
+ keyReviewOffset: z.number().int().nonnegative().default(0).optional().describe("Zero-based offset for the qualitative key/content review evidence."),
2160
+ keyReviewLimit: z.number().int().min(1).max(50).default(30).optional().describe("Number of item, choice-option, and form-field key/content pairs to return."),
2140
2161
  reason: z.string().max(500).optional()
2141
2162
  });
2142
2163
  const outputSchema = z.object({
@@ -2184,13 +2205,17 @@ const formatAuditForModel = (output) => {
2184
2205
  return `- ${finding.code}${location ? ` (${location})` : ""}: ${previewAuditMessage(finding.message)}`;
2185
2206
  }).join("\n")}` : void 0,
2186
2207
  report.qualityReviewPrinciples.length > 0 ? `Qualitative review rubric:\n${report.qualityReviewPrinciples.map((principle) => `- ${principle.id}: ${principle.prompt}`).join("\n")}` : void 0,
2208
+ report.keyReview.entries.length > 0 ? `Key/content review evidence (${report.keyReview.offset + 1}-${report.keyReview.offset + report.keyReview.returnedEntryCount} of ${report.keyReview.entryCount}, source locale ${report.keyReview.sourceLocale ?? "unavailable"}${report.keyReview.truncated ? "; more pages available" : ""}):\n${report.keyReview.entries.map((entry) => {
2209
+ const content = entry.content ? `; current content=${JSON.stringify(previewAuditMessage(entry.content))}` : "; current content unavailable";
2210
+ return `- ${entry.kind} item=${entry.itemId} itemKey=${JSON.stringify(entry.itemKey)} key=${JSON.stringify(entry.key)} (${entry.keySource})${entry.contentKey ? ` contentKey=${entry.contentKey}` : ""}${content}`;
2211
+ }).join("\n")}\n${report.keyReview.note}` : `Key/content review evidence: none returned (${report.keyReview.entryCount} total entries).`,
2187
2212
  report.note,
2188
2213
  "This audit checks the current survey deterministically. It does not compare the draft with an attached source document, so a clean audit does not establish source fidelity or completeness."
2189
2214
  ].filter((line) => Boolean(line)).join("\n\n");
2190
2215
  };
2191
2216
  const surveyAuditTool = createTool({
2192
2217
  id: TOOL_ID$1,
2193
- description: "Audit the current survey for deterministic structural, content, localization, response, and asset issues, and return a research-informed questionnaire-quality review rubric for qualitative critique. This is read-only and is not psychometric validation.",
2218
+ description: "Audit the current survey for deterministic structural, content, localization, expression-reference, response, and asset issues, and return a questionnaire-quality rubric plus paged key/content evidence for qualitative consistency review. This is read-only and is not psychometric validation.",
2194
2219
  inputSchema: inputSchema$1,
2195
2220
  outputSchema,
2196
2221
  mcp: { annotations: {
@@ -2415,4 +2440,4 @@ const surveyAssistantTools = Object.freeze({
2415
2440
  //#endregion
2416
2441
  export { surveyAuditTool as i, surveyAssistantTools as n, surveyAssetTool as r, SURVEY_ASSISTANT_TOOL_IDS as t };
2417
2442
 
2418
- //# sourceMappingURL=tools-Dg9HZrYU.mjs.map
2443
+ //# sourceMappingURL=tools-3tq-XqI0.mjs.map