@mastra/convex 0.0.0-new-button-export-20251219133013 → 0.0.0-salesman-20260127182805

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.
@@ -0,0 +1,113 @@
1
+ 'use strict';
2
+
3
+ var constants = require('@mastra/core/storage/constants');
4
+ var server = require('convex/server');
5
+ var values = require('convex/values');
6
+
7
+ // src/schema.ts
8
+ function columnToValidator(column) {
9
+ let validator;
10
+ switch (column.type) {
11
+ case "text":
12
+ validator = values.v.string();
13
+ break;
14
+ case "integer":
15
+ case "float":
16
+ validator = values.v.number();
17
+ break;
18
+ case "bigint":
19
+ validator = values.v.int64();
20
+ break;
21
+ case "boolean":
22
+ validator = values.v.boolean();
23
+ break;
24
+ case "timestamp":
25
+ validator = values.v.string();
26
+ break;
27
+ case "jsonb":
28
+ case "json":
29
+ validator = values.v.any();
30
+ break;
31
+ default:
32
+ validator = values.v.any();
33
+ }
34
+ return column.nullable ? values.v.optional(validator) : validator;
35
+ }
36
+ function buildTableFromSchema(schema) {
37
+ const fields = {};
38
+ for (const [key, column] of Object.entries(schema)) {
39
+ fields[key] = columnToValidator(column);
40
+ }
41
+ return fields;
42
+ }
43
+ var mastraThreadsTable = server.defineTable(buildTableFromSchema(constants.TABLE_SCHEMAS[constants.TABLE_THREADS])).index("by_record_id", ["id"]).index("by_resource", ["resourceId"]).index("by_created", ["createdAt"]).index("by_updated", ["updatedAt"]);
44
+ var mastraMessagesTable = server.defineTable(buildTableFromSchema(constants.TABLE_SCHEMAS[constants.TABLE_MESSAGES])).index("by_record_id", ["id"]).index("by_thread", ["thread_id"]).index("by_thread_created", ["thread_id", "createdAt"]).index("by_resource", ["resourceId"]);
45
+ var mastraResourcesTable = server.defineTable(buildTableFromSchema(constants.TABLE_SCHEMAS[constants.TABLE_RESOURCES])).index("by_record_id", ["id"]).index("by_updated", ["updatedAt"]);
46
+ var mastraWorkflowSnapshotsTable = server.defineTable({
47
+ id: values.v.optional(values.v.string()),
48
+ // Synthetic ID for Convex index, generated at runtime
49
+ workflow_name: values.v.string(),
50
+ run_id: values.v.string(),
51
+ resourceId: values.v.optional(values.v.string()),
52
+ snapshot: values.v.any(),
53
+ createdAt: values.v.string(),
54
+ updatedAt: values.v.string()
55
+ }).index("by_record_id", ["id"]).index("by_workflow_run", ["workflow_name", "run_id"]).index("by_workflow", ["workflow_name"]).index("by_resource", ["resourceId"]).index("by_created", ["createdAt"]);
56
+ var mastraScoresTable = server.defineTable(buildTableFromSchema(constants.TABLE_SCHEMAS[constants.TABLE_SCORERS])).index("by_record_id", ["id"]).index("by_scorer", ["scorerId"]).index("by_entity", ["entityId", "entityType"]).index("by_run", ["runId"]).index("by_created", ["createdAt"]);
57
+ var mastraVectorIndexesTable = server.defineTable({
58
+ id: values.v.string(),
59
+ // Mastra record ID (same as indexName)
60
+ indexName: values.v.string(),
61
+ dimension: values.v.number(),
62
+ metric: values.v.string(),
63
+ createdAt: values.v.string()
64
+ }).index("by_record_id", ["id"]).index("by_name", ["indexName"]);
65
+ var mastraVectorsTable = server.defineTable({
66
+ id: values.v.string(),
67
+ // Mastra record ID
68
+ indexName: values.v.string(),
69
+ embedding: values.v.array(values.v.float64()),
70
+ metadata: values.v.optional(values.v.any())
71
+ }).index("by_index_id", ["indexName", "id"]).index("by_index", ["indexName"]);
72
+ var mastraDocumentsTable = server.defineTable({
73
+ table: values.v.string(),
74
+ primaryKey: values.v.string(),
75
+ record: values.v.any()
76
+ }).index("by_table", ["table"]).index("by_table_primary", ["table", "primaryKey"]);
77
+ var TABLE_VECTOR_INDEXES = "mastra_vector_indexes";
78
+ var TABLE_VECTORS = "mastra_vectors";
79
+ var TABLE_DOCUMENTS = "mastra_documents";
80
+
81
+ Object.defineProperty(exports, "TABLE_MESSAGES", {
82
+ enumerable: true,
83
+ get: function () { return constants.TABLE_MESSAGES; }
84
+ });
85
+ Object.defineProperty(exports, "TABLE_RESOURCES", {
86
+ enumerable: true,
87
+ get: function () { return constants.TABLE_RESOURCES; }
88
+ });
89
+ Object.defineProperty(exports, "TABLE_SCORERS", {
90
+ enumerable: true,
91
+ get: function () { return constants.TABLE_SCORERS; }
92
+ });
93
+ Object.defineProperty(exports, "TABLE_THREADS", {
94
+ enumerable: true,
95
+ get: function () { return constants.TABLE_THREADS; }
96
+ });
97
+ Object.defineProperty(exports, "TABLE_WORKFLOW_SNAPSHOT", {
98
+ enumerable: true,
99
+ get: function () { return constants.TABLE_WORKFLOW_SNAPSHOT; }
100
+ });
101
+ exports.TABLE_DOCUMENTS = TABLE_DOCUMENTS;
102
+ exports.TABLE_VECTORS = TABLE_VECTORS;
103
+ exports.TABLE_VECTOR_INDEXES = TABLE_VECTOR_INDEXES;
104
+ exports.mastraDocumentsTable = mastraDocumentsTable;
105
+ exports.mastraMessagesTable = mastraMessagesTable;
106
+ exports.mastraResourcesTable = mastraResourcesTable;
107
+ exports.mastraScoresTable = mastraScoresTable;
108
+ exports.mastraThreadsTable = mastraThreadsTable;
109
+ exports.mastraVectorIndexesTable = mastraVectorIndexesTable;
110
+ exports.mastraVectorsTable = mastraVectorsTable;
111
+ exports.mastraWorkflowSnapshotsTable = mastraWorkflowSnapshotsTable;
112
+ //# sourceMappingURL=chunk-FTVDAP6U.cjs.map
113
+ //# sourceMappingURL=chunk-FTVDAP6U.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/schema.ts"],"names":["v","defineTable","TABLE_SCHEMAS","TABLE_THREADS","TABLE_MESSAGES","TABLE_RESOURCES","TABLE_SCORERS"],"mappings":";;;;;;;AAwBA,SAAS,kBAAkB,MAAA,EAA8C;AACvE,EAAA,IAAI,SAAA;AACJ,EAAA,QAAQ,OAAO,IAAA;AAAM,IACnB,KAAK,MAAA;AACH,MAAA,SAAA,GAAYA,SAAE,MAAA,EAAO;AACrB,MAAA;AAAA,IACF,KAAK,SAAA;AAAA,IACL,KAAK,OAAA;AACH,MAAA,SAAA,GAAYA,SAAE,MAAA,EAAO;AACrB,MAAA;AAAA,IACF,KAAK,QAAA;AACH,MAAA,SAAA,GAAYA,SAAE,KAAA,EAAM;AACpB,MAAA;AAAA,IACF,KAAK,SAAA;AACH,MAAA,SAAA,GAAYA,SAAE,OAAA,EAAQ;AACtB,MAAA;AAAA,IACF,KAAK,WAAA;AACH,MAAA,SAAA,GAAYA,SAAE,MAAA,EAAO;AACrB,MAAA;AAAA,IACF,KAAK,OAAA;AAAA,IACL,KAAK,MAAA;AACH,MAAA,SAAA,GAAYA,SAAE,GAAA,EAAI;AAClB,MAAA;AAAA,IACF;AACE,MAAA,SAAA,GAAYA,SAAE,GAAA,EAAI;AAAA;AAEtB,EAAA,OAAO,MAAA,CAAO,QAAA,GAAWA,QAAA,CAAE,QAAA,CAAS,SAAS,CAAA,GAAI,SAAA;AACnD;AAMA,SAAS,qBAAqB,MAAA,EAAoF;AAChH,EAAA,MAAM,SAA8B,EAAC;AACrC,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,MAAM,KAAK,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,EAAG;AAClD,IAAA,MAAA,CAAO,GAAG,CAAA,GAAI,iBAAA,CAAkB,MAAM,CAAA;AAAA,EACxC;AACA,EAAA,OAAO,MAAA;AACT;AAUO,IAAM,kBAAA,GAAqBC,kBAAA,CAAY,oBAAA,CAAqBC,uBAAA,CAAcC,uBAAa,CAAC,CAAC,CAAA,CAC7F,KAAA,CAAM,cAAA,EAAgB,CAAC,IAAI,CAAC,CAAA,CAC5B,KAAA,CAAM,aAAA,EAAe,CAAC,YAAY,CAAC,CAAA,CACnC,KAAA,CAAM,YAAA,EAAc,CAAC,WAAW,CAAC,CAAA,CACjC,KAAA,CAAM,YAAA,EAAc,CAAC,WAAW,CAAC;AAM7B,IAAM,mBAAA,GAAsBF,kBAAA,CAAY,oBAAA,CAAqBC,uBAAA,CAAcE,wBAAc,CAAC,CAAC,CAAA,CAC/F,KAAA,CAAM,cAAA,EAAgB,CAAC,IAAI,CAAC,CAAA,CAC5B,KAAA,CAAM,WAAA,EAAa,CAAC,WAAW,CAAC,CAAA,CAChC,KAAA,CAAM,qBAAqB,CAAC,WAAA,EAAa,WAAW,CAAC,CAAA,CACrD,KAAA,CAAM,aAAA,EAAe,CAAC,YAAY,CAAC;AAM/B,IAAM,uBAAuBH,kBAAA,CAAY,oBAAA,CAAqBC,wBAAcG,yBAAe,CAAC,CAAC,CAAA,CACjG,KAAA,CAAM,cAAA,EAAgB,CAAC,IAAI,CAAC,CAAA,CAC5B,MAAM,YAAA,EAAc,CAAC,WAAW,CAAC;AAc7B,IAAM,+BAA+BJ,kBAAA,CAAY;AAAA,EACtD,EAAA,EAAID,QAAA,CAAE,QAAA,CAASA,QAAA,CAAE,QAAQ,CAAA;AAAA;AAAA,EACzB,aAAA,EAAeA,SAAE,MAAA,EAAO;AAAA,EACxB,MAAA,EAAQA,SAAE,MAAA,EAAO;AAAA,EACjB,UAAA,EAAYA,QAAA,CAAE,QAAA,CAASA,QAAA,CAAE,QAAQ,CAAA;AAAA,EACjC,QAAA,EAAUA,SAAE,GAAA,EAAI;AAAA,EAChB,SAAA,EAAWA,SAAE,MAAA,EAAO;AAAA,EACpB,SAAA,EAAWA,SAAE,MAAA;AACf,CAAC,CAAA,CACE,KAAA,CAAM,cAAA,EAAgB,CAAC,IAAI,CAAC,CAAA,CAC5B,KAAA,CAAM,iBAAA,EAAmB,CAAC,eAAA,EAAiB,QAAQ,CAAC,CAAA,CACpD,KAAA,CAAM,aAAA,EAAe,CAAC,eAAe,CAAC,CAAA,CACtC,KAAA,CAAM,aAAA,EAAe,CAAC,YAAY,CAAC,CAAA,CACnC,KAAA,CAAM,YAAA,EAAc,CAAC,WAAW,CAAC;AAM7B,IAAM,oBAAoBC,kBAAA,CAAY,oBAAA,CAAqBC,uBAAA,CAAcI,uBAAa,CAAC,CAAC,CAAA,CAC5F,KAAA,CAAM,cAAA,EAAgB,CAAC,IAAI,CAAC,CAAA,CAC5B,KAAA,CAAM,aAAa,CAAC,UAAU,CAAC,CAAA,CAC/B,MAAM,WAAA,EAAa,CAAC,UAAA,EAAY,YAAY,CAAC,CAAA,CAC7C,KAAA,CAAM,QAAA,EAAU,CAAC,OAAO,CAAC,CAAA,CACzB,MAAM,YAAA,EAAc,CAAC,WAAW,CAAC;AAS7B,IAAM,2BAA2BL,kBAAA,CAAY;AAAA,EAClD,EAAA,EAAID,SAAE,MAAA,EAAO;AAAA;AAAA,EACb,SAAA,EAAWA,SAAE,MAAA,EAAO;AAAA,EACpB,SAAA,EAAWA,SAAE,MAAA,EAAO;AAAA,EACpB,MAAA,EAAQA,SAAE,MAAA,EAAO;AAAA,EACjB,SAAA,EAAWA,SAAE,MAAA;AACf,CAAC,CAAA,CACE,KAAA,CAAM,cAAA,EAAgB,CAAC,IAAI,CAAC,CAAA,CAC5B,KAAA,CAAM,SAAA,EAAW,CAAC,WAAW,CAAC;AAM1B,IAAM,qBAAqBC,kBAAA,CAAY;AAAA,EAC5C,EAAA,EAAID,SAAE,MAAA,EAAO;AAAA;AAAA,EACb,SAAA,EAAWA,SAAE,MAAA,EAAO;AAAA,EACpB,SAAA,EAAWA,QAAA,CAAE,KAAA,CAAMA,QAAA,CAAE,SAAS,CAAA;AAAA,EAC9B,QAAA,EAAUA,QAAA,CAAE,QAAA,CAASA,QAAA,CAAE,KAAK;AAC9B,CAAC,CAAA,CACE,KAAA,CAAM,aAAA,EAAe,CAAC,WAAA,EAAa,IAAI,CAAC,CAAA,CACxC,KAAA,CAAM,UAAA,EAAY,CAAC,WAAW,CAAC;AAS3B,IAAM,uBAAuBC,kBAAA,CAAY;AAAA,EAC9C,KAAA,EAAOD,SAAE,MAAA,EAAO;AAAA,EAChB,UAAA,EAAYA,SAAE,MAAA,EAAO;AAAA,EACrB,MAAA,EAAQA,SAAE,GAAA;AACZ,CAAC,CAAA,CACE,KAAA,CAAM,UAAA,EAAY,CAAC,OAAO,CAAC,CAAA,CAC3B,KAAA,CAAM,kBAAA,EAAoB,CAAC,OAAA,EAAS,YAAY,CAAC;AAS7C,IAAM,oBAAA,GAAuB;AAC7B,IAAM,aAAA,GAAgB;AACtB,IAAM,eAAA,GAAkB","file":"chunk-FTVDAP6U.cjs","sourcesContent":["/**\n * Convex schema definitions for Mastra tables.\n *\n * This file dynamically builds Convex table definitions from the canonical\n * TABLE_SCHEMAS in @mastra/core/storage/constants to ensure they stay in sync.\n *\n * The import path @mastra/core/storage/constants is specifically designed to\n * avoid pulling in Node.js dependencies, making it safe to use in Convex's\n * sandboxed schema evaluation environment.\n */\nimport {\n TABLE_SCHEMAS,\n TABLE_WORKFLOW_SNAPSHOT,\n TABLE_MESSAGES,\n TABLE_THREADS,\n TABLE_RESOURCES,\n TABLE_SCORERS,\n} from '@mastra/core/storage/constants';\nimport { defineTable } from 'convex/server';\nimport { v } from 'convex/values';\n\n/**\n * Helper to convert Mastra StorageColumn type to Convex validator\n */\nfunction columnToValidator(column: { type: string; nullable?: boolean }) {\n let validator;\n switch (column.type) {\n case 'text':\n validator = v.string();\n break;\n case 'integer':\n case 'float':\n validator = v.number();\n break;\n case 'bigint':\n validator = v.int64();\n break;\n case 'boolean':\n validator = v.boolean();\n break;\n case 'timestamp':\n validator = v.string(); // Store as ISO string\n break;\n case 'jsonb':\n case 'json':\n validator = v.any();\n break;\n default:\n validator = v.any();\n }\n return column.nullable ? v.optional(validator) : validator;\n}\n\n/**\n * Build Convex table definition from Mastra schema.\n * Includes the `id` field as a regular field (Convex auto-generates _id).\n */\nfunction buildTableFromSchema(schema: Record<string, { type: string; nullable?: boolean; primaryKey?: boolean }>) {\n const fields: Record<string, any> = {};\n for (const [key, column] of Object.entries(schema)) {\n fields[key] = columnToValidator(column);\n }\n return fields;\n}\n\n// ============================================================================\n// Table Definitions - Built from @mastra/core TABLE_SCHEMAS\n// ============================================================================\n\n/**\n * Threads table - stores conversation threads\n * Schema: TABLE_SCHEMAS[TABLE_THREADS]\n */\nexport const mastraThreadsTable = defineTable(buildTableFromSchema(TABLE_SCHEMAS[TABLE_THREADS]))\n .index('by_record_id', ['id'])\n .index('by_resource', ['resourceId'])\n .index('by_created', ['createdAt'])\n .index('by_updated', ['updatedAt']);\n\n/**\n * Messages table - stores conversation messages\n * Schema: TABLE_SCHEMAS[TABLE_MESSAGES]\n */\nexport const mastraMessagesTable = defineTable(buildTableFromSchema(TABLE_SCHEMAS[TABLE_MESSAGES]))\n .index('by_record_id', ['id'])\n .index('by_thread', ['thread_id'])\n .index('by_thread_created', ['thread_id', 'createdAt'])\n .index('by_resource', ['resourceId']);\n\n/**\n * Resources table - stores resource/user working memory\n * Schema: TABLE_SCHEMAS[TABLE_RESOURCES]\n */\nexport const mastraResourcesTable = defineTable(buildTableFromSchema(TABLE_SCHEMAS[TABLE_RESOURCES]))\n .index('by_record_id', ['id'])\n .index('by_updated', ['updatedAt']);\n\n/**\n * Workflow snapshots table - stores workflow execution state\n * Schema: TABLE_SCHEMAS[TABLE_WORKFLOW_SNAPSHOT]\n *\n * Note: The `id` field is added explicitly for Convex's by_record_id index.\n * The core schema uses (workflow_name, run_id) as a composite key, but Convex\n * requires a single-column index. The id value is generated at runtime as\n * `${workflow_name}-${run_id}` by the Convex storage adapter's normalizeRecord().\n *\n * Fields are defined explicitly (not using buildTableFromSchema) because TypeScript's\n * type inference doesn't work well with spread operators in Convex's defineTable.\n */\nexport const mastraWorkflowSnapshotsTable = defineTable({\n id: v.optional(v.string()), // Synthetic ID for Convex index, generated at runtime\n workflow_name: v.string(),\n run_id: v.string(),\n resourceId: v.optional(v.string()),\n snapshot: v.any(),\n createdAt: v.string(),\n updatedAt: v.string(),\n})\n .index('by_record_id', ['id'])\n .index('by_workflow_run', ['workflow_name', 'run_id'])\n .index('by_workflow', ['workflow_name'])\n .index('by_resource', ['resourceId'])\n .index('by_created', ['createdAt']);\n\n/**\n * Scores table - stores evaluation scores\n * Schema: TABLE_SCHEMAS[TABLE_SCORERS]\n */\nexport const mastraScoresTable = defineTable(buildTableFromSchema(TABLE_SCHEMAS[TABLE_SCORERS]))\n .index('by_record_id', ['id'])\n .index('by_scorer', ['scorerId'])\n .index('by_entity', ['entityId', 'entityType'])\n .index('by_run', ['runId'])\n .index('by_created', ['createdAt']);\n\n// ============================================================================\n// Vector Tables - Not in core schemas (vector-specific)\n// ============================================================================\n\n/**\n * Vector indexes table - stores metadata about vector indexes\n */\nexport const mastraVectorIndexesTable = defineTable({\n id: v.string(), // Mastra record ID (same as indexName)\n indexName: v.string(),\n dimension: v.number(),\n metric: v.string(),\n createdAt: v.string(),\n})\n .index('by_record_id', ['id'])\n .index('by_name', ['indexName']);\n\n/**\n * Vectors table - stores vector embeddings\n * Uses indexName field to support multiple indexes with different dimensions\n */\nexport const mastraVectorsTable = defineTable({\n id: v.string(), // Mastra record ID\n indexName: v.string(),\n embedding: v.array(v.float64()),\n metadata: v.optional(v.any()),\n})\n .index('by_index_id', ['indexName', 'id']) // Composite for scoped lookups per index\n .index('by_index', ['indexName']);\n\n// ============================================================================\n// Fallback Table - For unknown/custom tables\n// ============================================================================\n\n/**\n * Generic documents table - fallback for unknown table types\n */\nexport const mastraDocumentsTable = defineTable({\n table: v.string(),\n primaryKey: v.string(),\n record: v.any(),\n})\n .index('by_table', ['table'])\n .index('by_table_primary', ['table', 'primaryKey']);\n\n// ============================================================================\n// Re-export table name constants for convenience\n// ============================================================================\n\nexport { TABLE_WORKFLOW_SNAPSHOT, TABLE_MESSAGES, TABLE_THREADS, TABLE_RESOURCES, TABLE_SCORERS };\n\n// Additional table name constants for vector tables (not in core)\nexport const TABLE_VECTOR_INDEXES = 'mastra_vector_indexes';\nexport const TABLE_VECTORS = 'mastra_vectors';\nexport const TABLE_DOCUMENTS = 'mastra_documents';\n"]}
@@ -0,0 +1,82 @@
1
+ import { TABLE_SCHEMAS, TABLE_THREADS, TABLE_MESSAGES, TABLE_RESOURCES, TABLE_SCORERS } from '@mastra/core/storage/constants';
2
+ export { TABLE_MESSAGES, TABLE_RESOURCES, TABLE_SCORERS, TABLE_THREADS, TABLE_WORKFLOW_SNAPSHOT } from '@mastra/core/storage/constants';
3
+ import { defineTable } from 'convex/server';
4
+ import { v } from 'convex/values';
5
+
6
+ // src/schema.ts
7
+ function columnToValidator(column) {
8
+ let validator;
9
+ switch (column.type) {
10
+ case "text":
11
+ validator = v.string();
12
+ break;
13
+ case "integer":
14
+ case "float":
15
+ validator = v.number();
16
+ break;
17
+ case "bigint":
18
+ validator = v.int64();
19
+ break;
20
+ case "boolean":
21
+ validator = v.boolean();
22
+ break;
23
+ case "timestamp":
24
+ validator = v.string();
25
+ break;
26
+ case "jsonb":
27
+ case "json":
28
+ validator = v.any();
29
+ break;
30
+ default:
31
+ validator = v.any();
32
+ }
33
+ return column.nullable ? v.optional(validator) : validator;
34
+ }
35
+ function buildTableFromSchema(schema) {
36
+ const fields = {};
37
+ for (const [key, column] of Object.entries(schema)) {
38
+ fields[key] = columnToValidator(column);
39
+ }
40
+ return fields;
41
+ }
42
+ var mastraThreadsTable = defineTable(buildTableFromSchema(TABLE_SCHEMAS[TABLE_THREADS])).index("by_record_id", ["id"]).index("by_resource", ["resourceId"]).index("by_created", ["createdAt"]).index("by_updated", ["updatedAt"]);
43
+ var mastraMessagesTable = defineTable(buildTableFromSchema(TABLE_SCHEMAS[TABLE_MESSAGES])).index("by_record_id", ["id"]).index("by_thread", ["thread_id"]).index("by_thread_created", ["thread_id", "createdAt"]).index("by_resource", ["resourceId"]);
44
+ var mastraResourcesTable = defineTable(buildTableFromSchema(TABLE_SCHEMAS[TABLE_RESOURCES])).index("by_record_id", ["id"]).index("by_updated", ["updatedAt"]);
45
+ var mastraWorkflowSnapshotsTable = defineTable({
46
+ id: v.optional(v.string()),
47
+ // Synthetic ID for Convex index, generated at runtime
48
+ workflow_name: v.string(),
49
+ run_id: v.string(),
50
+ resourceId: v.optional(v.string()),
51
+ snapshot: v.any(),
52
+ createdAt: v.string(),
53
+ updatedAt: v.string()
54
+ }).index("by_record_id", ["id"]).index("by_workflow_run", ["workflow_name", "run_id"]).index("by_workflow", ["workflow_name"]).index("by_resource", ["resourceId"]).index("by_created", ["createdAt"]);
55
+ var mastraScoresTable = defineTable(buildTableFromSchema(TABLE_SCHEMAS[TABLE_SCORERS])).index("by_record_id", ["id"]).index("by_scorer", ["scorerId"]).index("by_entity", ["entityId", "entityType"]).index("by_run", ["runId"]).index("by_created", ["createdAt"]);
56
+ var mastraVectorIndexesTable = defineTable({
57
+ id: v.string(),
58
+ // Mastra record ID (same as indexName)
59
+ indexName: v.string(),
60
+ dimension: v.number(),
61
+ metric: v.string(),
62
+ createdAt: v.string()
63
+ }).index("by_record_id", ["id"]).index("by_name", ["indexName"]);
64
+ var mastraVectorsTable = defineTable({
65
+ id: v.string(),
66
+ // Mastra record ID
67
+ indexName: v.string(),
68
+ embedding: v.array(v.float64()),
69
+ metadata: v.optional(v.any())
70
+ }).index("by_index_id", ["indexName", "id"]).index("by_index", ["indexName"]);
71
+ var mastraDocumentsTable = defineTable({
72
+ table: v.string(),
73
+ primaryKey: v.string(),
74
+ record: v.any()
75
+ }).index("by_table", ["table"]).index("by_table_primary", ["table", "primaryKey"]);
76
+ var TABLE_VECTOR_INDEXES = "mastra_vector_indexes";
77
+ var TABLE_VECTORS = "mastra_vectors";
78
+ var TABLE_DOCUMENTS = "mastra_documents";
79
+
80
+ export { TABLE_DOCUMENTS, TABLE_VECTORS, TABLE_VECTOR_INDEXES, mastraDocumentsTable, mastraMessagesTable, mastraResourcesTable, mastraScoresTable, mastraThreadsTable, mastraVectorIndexesTable, mastraVectorsTable, mastraWorkflowSnapshotsTable };
81
+ //# sourceMappingURL=chunk-G5FLGAPE.js.map
82
+ //# sourceMappingURL=chunk-G5FLGAPE.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/schema.ts"],"names":[],"mappings":"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","file":"chunk-G5FLGAPE.js","sourcesContent":["/**\n * Convex schema definitions for Mastra tables.\n *\n * This file dynamically builds Convex table definitions from the canonical\n * TABLE_SCHEMAS in @mastra/core/storage/constants to ensure they stay in sync.\n *\n * The import path @mastra/core/storage/constants is specifically designed to\n * avoid pulling in Node.js dependencies, making it safe to use in Convex's\n * sandboxed schema evaluation environment.\n */\nimport {\n TABLE_SCHEMAS,\n TABLE_WORKFLOW_SNAPSHOT,\n TABLE_MESSAGES,\n TABLE_THREADS,\n TABLE_RESOURCES,\n TABLE_SCORERS,\n} from '@mastra/core/storage/constants';\nimport { defineTable } from 'convex/server';\nimport { v } from 'convex/values';\n\n/**\n * Helper to convert Mastra StorageColumn type to Convex validator\n */\nfunction columnToValidator(column: { type: string; nullable?: boolean }) {\n let validator;\n switch (column.type) {\n case 'text':\n validator = v.string();\n break;\n case 'integer':\n case 'float':\n validator = v.number();\n break;\n case 'bigint':\n validator = v.int64();\n break;\n case 'boolean':\n validator = v.boolean();\n break;\n case 'timestamp':\n validator = v.string(); // Store as ISO string\n break;\n case 'jsonb':\n case 'json':\n validator = v.any();\n break;\n default:\n validator = v.any();\n }\n return column.nullable ? v.optional(validator) : validator;\n}\n\n/**\n * Build Convex table definition from Mastra schema.\n * Includes the `id` field as a regular field (Convex auto-generates _id).\n */\nfunction buildTableFromSchema(schema: Record<string, { type: string; nullable?: boolean; primaryKey?: boolean }>) {\n const fields: Record<string, any> = {};\n for (const [key, column] of Object.entries(schema)) {\n fields[key] = columnToValidator(column);\n }\n return fields;\n}\n\n// ============================================================================\n// Table Definitions - Built from @mastra/core TABLE_SCHEMAS\n// ============================================================================\n\n/**\n * Threads table - stores conversation threads\n * Schema: TABLE_SCHEMAS[TABLE_THREADS]\n */\nexport const mastraThreadsTable = defineTable(buildTableFromSchema(TABLE_SCHEMAS[TABLE_THREADS]))\n .index('by_record_id', ['id'])\n .index('by_resource', ['resourceId'])\n .index('by_created', ['createdAt'])\n .index('by_updated', ['updatedAt']);\n\n/**\n * Messages table - stores conversation messages\n * Schema: TABLE_SCHEMAS[TABLE_MESSAGES]\n */\nexport const mastraMessagesTable = defineTable(buildTableFromSchema(TABLE_SCHEMAS[TABLE_MESSAGES]))\n .index('by_record_id', ['id'])\n .index('by_thread', ['thread_id'])\n .index('by_thread_created', ['thread_id', 'createdAt'])\n .index('by_resource', ['resourceId']);\n\n/**\n * Resources table - stores resource/user working memory\n * Schema: TABLE_SCHEMAS[TABLE_RESOURCES]\n */\nexport const mastraResourcesTable = defineTable(buildTableFromSchema(TABLE_SCHEMAS[TABLE_RESOURCES]))\n .index('by_record_id', ['id'])\n .index('by_updated', ['updatedAt']);\n\n/**\n * Workflow snapshots table - stores workflow execution state\n * Schema: TABLE_SCHEMAS[TABLE_WORKFLOW_SNAPSHOT]\n *\n * Note: The `id` field is added explicitly for Convex's by_record_id index.\n * The core schema uses (workflow_name, run_id) as a composite key, but Convex\n * requires a single-column index. The id value is generated at runtime as\n * `${workflow_name}-${run_id}` by the Convex storage adapter's normalizeRecord().\n *\n * Fields are defined explicitly (not using buildTableFromSchema) because TypeScript's\n * type inference doesn't work well with spread operators in Convex's defineTable.\n */\nexport const mastraWorkflowSnapshotsTable = defineTable({\n id: v.optional(v.string()), // Synthetic ID for Convex index, generated at runtime\n workflow_name: v.string(),\n run_id: v.string(),\n resourceId: v.optional(v.string()),\n snapshot: v.any(),\n createdAt: v.string(),\n updatedAt: v.string(),\n})\n .index('by_record_id', ['id'])\n .index('by_workflow_run', ['workflow_name', 'run_id'])\n .index('by_workflow', ['workflow_name'])\n .index('by_resource', ['resourceId'])\n .index('by_created', ['createdAt']);\n\n/**\n * Scores table - stores evaluation scores\n * Schema: TABLE_SCHEMAS[TABLE_SCORERS]\n */\nexport const mastraScoresTable = defineTable(buildTableFromSchema(TABLE_SCHEMAS[TABLE_SCORERS]))\n .index('by_record_id', ['id'])\n .index('by_scorer', ['scorerId'])\n .index('by_entity', ['entityId', 'entityType'])\n .index('by_run', ['runId'])\n .index('by_created', ['createdAt']);\n\n// ============================================================================\n// Vector Tables - Not in core schemas (vector-specific)\n// ============================================================================\n\n/**\n * Vector indexes table - stores metadata about vector indexes\n */\nexport const mastraVectorIndexesTable = defineTable({\n id: v.string(), // Mastra record ID (same as indexName)\n indexName: v.string(),\n dimension: v.number(),\n metric: v.string(),\n createdAt: v.string(),\n})\n .index('by_record_id', ['id'])\n .index('by_name', ['indexName']);\n\n/**\n * Vectors table - stores vector embeddings\n * Uses indexName field to support multiple indexes with different dimensions\n */\nexport const mastraVectorsTable = defineTable({\n id: v.string(), // Mastra record ID\n indexName: v.string(),\n embedding: v.array(v.float64()),\n metadata: v.optional(v.any()),\n})\n .index('by_index_id', ['indexName', 'id']) // Composite for scoped lookups per index\n .index('by_index', ['indexName']);\n\n// ============================================================================\n// Fallback Table - For unknown/custom tables\n// ============================================================================\n\n/**\n * Generic documents table - fallback for unknown table types\n */\nexport const mastraDocumentsTable = defineTable({\n table: v.string(),\n primaryKey: v.string(),\n record: v.any(),\n})\n .index('by_table', ['table'])\n .index('by_table_primary', ['table', 'primaryKey']);\n\n// ============================================================================\n// Re-export table name constants for convenience\n// ============================================================================\n\nexport { TABLE_WORKFLOW_SNAPSHOT, TABLE_MESSAGES, TABLE_THREADS, TABLE_RESOURCES, TABLE_SCORERS };\n\n// Additional table name constants for vector tables (not in core)\nexport const TABLE_VECTOR_INDEXES = 'mastra_vector_indexes';\nexport const TABLE_VECTORS = 'mastra_vectors';\nexport const TABLE_DOCUMENTS = 'mastra_documents';\n"]}
@@ -0,0 +1,32 @@
1
+ # @mastra/convex Documentation
2
+
3
+ > Embedded documentation for coding agents
4
+
5
+ ## Quick Start
6
+
7
+ ```bash
8
+ # Read the skill overview
9
+ cat docs/SKILL.md
10
+
11
+ # Get the source map
12
+ cat docs/SOURCE_MAP.json
13
+
14
+ # Read topic documentation
15
+ cat docs/<topic>/01-overview.md
16
+ ```
17
+
18
+ ## Structure
19
+
20
+ ```
21
+ docs/
22
+ ├── SKILL.md # Entry point
23
+ ├── README.md # This file
24
+ ├── SOURCE_MAP.json # Export index
25
+ ├── storage/ (1 files)
26
+ ├── vectors/ (1 files)
27
+ ```
28
+
29
+ ## Version
30
+
31
+ Package: @mastra/convex
32
+ Version: 1.0.0
@@ -0,0 +1,46 @@
1
+ ---
2
+ name: mastra-convex-docs
3
+ description: Documentation for @mastra/convex. Includes links to type definitions and readable implementation code in dist/.
4
+ ---
5
+
6
+ # @mastra/convex Documentation
7
+
8
+ > **Version**: 1.0.0
9
+ > **Package**: @mastra/convex
10
+
11
+ ## Quick Navigation
12
+
13
+ Use SOURCE_MAP.json to find any export:
14
+
15
+ ```bash
16
+ cat docs/SOURCE_MAP.json
17
+ ```
18
+
19
+ Each export maps to:
20
+ - **types**: `.d.ts` file with JSDoc and API signatures
21
+ - **implementation**: `.js` chunk file with readable source
22
+ - **docs**: Conceptual documentation in `docs/`
23
+
24
+ ## Top Exports
25
+
26
+ - mastraStorage: dist/index.d.ts
27
+ - TABLE_MESSAGES: dist/index.d.ts
28
+ - TABLE_RESOURCES: dist/index.d.ts
29
+ - TABLE_SCORERS: dist/index.d.ts
30
+ - TABLE_THREADS: dist/index.d.ts
31
+ - TABLE_WORKFLOW_SNAPSHOT: dist/index.d.ts
32
+ - mastraDocumentsTable: dist/index.d.ts
33
+ - mastraMessagesTable: dist/index.d.ts
34
+ - mastraResourcesTable: dist/index.d.ts
35
+ - mastraScoresTable: dist/index.d.ts
36
+ - mastraThreadsTable: dist/index.d.ts
37
+ - mastraVectorIndexesTable: dist/index.d.ts
38
+ - mastraVectorsTable: dist/index.d.ts
39
+ - mastraWorkflowSnapshotsTable: dist/index.d.ts
40
+
41
+ See SOURCE_MAP.json for the complete list.
42
+
43
+ ## Available Topics
44
+
45
+ - [Storage](storage/) - 1 file(s)
46
+ - [Vectors](vectors/) - 1 file(s)
@@ -0,0 +1,63 @@
1
+ {
2
+ "version": "1.0.0",
3
+ "package": "@mastra/convex",
4
+ "exports": {
5
+ "mastraStorage": {
6
+ "types": "dist/index.d.ts",
7
+ "implementation": "dist/chunk-KSAPIIEJ.js"
8
+ },
9
+ "TABLE_MESSAGES": {
10
+ "types": "dist/index.d.ts",
11
+ "implementation": "dist/chunk-G5FLGAPE.js"
12
+ },
13
+ "TABLE_RESOURCES": {
14
+ "types": "dist/index.d.ts",
15
+ "implementation": "dist/chunk-G5FLGAPE.js"
16
+ },
17
+ "TABLE_SCORERS": {
18
+ "types": "dist/index.d.ts",
19
+ "implementation": "dist/chunk-G5FLGAPE.js"
20
+ },
21
+ "TABLE_THREADS": {
22
+ "types": "dist/index.d.ts",
23
+ "implementation": "dist/chunk-G5FLGAPE.js"
24
+ },
25
+ "TABLE_WORKFLOW_SNAPSHOT": {
26
+ "types": "dist/index.d.ts",
27
+ "implementation": "dist/chunk-G5FLGAPE.js"
28
+ },
29
+ "mastraDocumentsTable": {
30
+ "types": "dist/index.d.ts",
31
+ "implementation": "dist/chunk-G5FLGAPE.js"
32
+ },
33
+ "mastraMessagesTable": {
34
+ "types": "dist/index.d.ts",
35
+ "implementation": "dist/chunk-G5FLGAPE.js"
36
+ },
37
+ "mastraResourcesTable": {
38
+ "types": "dist/index.d.ts",
39
+ "implementation": "dist/chunk-G5FLGAPE.js"
40
+ },
41
+ "mastraScoresTable": {
42
+ "types": "dist/index.d.ts",
43
+ "implementation": "dist/chunk-G5FLGAPE.js"
44
+ },
45
+ "mastraThreadsTable": {
46
+ "types": "dist/index.d.ts",
47
+ "implementation": "dist/chunk-G5FLGAPE.js"
48
+ },
49
+ "mastraVectorIndexesTable": {
50
+ "types": "dist/index.d.ts",
51
+ "implementation": "dist/chunk-G5FLGAPE.js"
52
+ },
53
+ "mastraVectorsTable": {
54
+ "types": "dist/index.d.ts",
55
+ "implementation": "dist/chunk-G5FLGAPE.js"
56
+ },
57
+ "mastraWorkflowSnapshotsTable": {
58
+ "types": "dist/index.d.ts",
59
+ "implementation": "dist/chunk-G5FLGAPE.js"
60
+ }
61
+ },
62
+ "modules": {}
63
+ }
@@ -0,0 +1,143 @@
1
+ # Storage API Reference
2
+
3
+ > API reference for storage - 1 entries
4
+
5
+
6
+ ---
7
+
8
+ ## Reference: Convex Storage
9
+
10
+ > Documentation for the Convex storage implementation in Mastra.
11
+
12
+ The Convex storage implementation provides a serverless storage solution using [Convex](https://convex.dev), a full-stack TypeScript development platform with real-time sync and automatic caching.
13
+
14
+ > **Observability Not Supported**
15
+ Convex storage **does not support the observability domain**. Traces from the `DefaultExporter` cannot be persisted to Convex, and Mastra Studio's observability features won't work with Convex as your only storage provider. To enable observability, use [composite storage](https://mastra.ai/reference/storage/composite#specialized-storage-for-observability-recommended-for-production) to route observability data to a supported provider like ClickHouse or PostgreSQL.
16
+
17
+ ## Installation
18
+
19
+ ```bash npm2yarn
20
+ npm install @mastra/convex@latest
21
+ ```
22
+
23
+ ## Convex Setup
24
+
25
+ Before using `ConvexStore`, you need to set up the Convex schema and storage handler in your Convex project.
26
+
27
+ ### 1. Set up Convex Schema
28
+
29
+ In `convex/schema.ts`:
30
+
31
+ ```typescript
32
+ import { defineSchema } from 'convex/server';
33
+ import {
34
+ mastraThreadsTable,
35
+ mastraMessagesTable,
36
+ mastraResourcesTable,
37
+ mastraWorkflowSnapshotsTable,
38
+ mastraScoresTable,
39
+ mastraVectorIndexesTable,
40
+ mastraVectorsTable,
41
+ mastraDocumentsTable,
42
+ } from '@mastra/convex/schema';
43
+
44
+ export default defineSchema({
45
+ mastra_threads: mastraThreadsTable,
46
+ mastra_messages: mastraMessagesTable,
47
+ mastra_resources: mastraResourcesTable,
48
+ mastra_workflow_snapshots: mastraWorkflowSnapshotsTable,
49
+ mastra_scorers: mastraScoresTable,
50
+ mastra_vector_indexes: mastraVectorIndexesTable,
51
+ mastra_vectors: mastraVectorsTable,
52
+ mastra_documents: mastraDocumentsTable,
53
+ });
54
+ ```
55
+
56
+ ### 2. Create the Storage Handler
57
+
58
+ In `convex/mastra/storage.ts`:
59
+
60
+ ```typescript
61
+ import { mastraStorage } from '@mastra/convex/server';
62
+
63
+ export const handle = mastraStorage;
64
+ ```
65
+
66
+ ### 3. Deploy to Convex
67
+
68
+ ```bash
69
+ npx convex dev
70
+ # or for production
71
+ npx convex deploy
72
+ ```
73
+
74
+ ## Usage
75
+
76
+ ```typescript
77
+ import { ConvexStore } from "@mastra/convex";
78
+
79
+ const storage = new ConvexStore({
80
+ id: 'convex-storage',
81
+ deploymentUrl: process.env.CONVEX_URL!,
82
+ adminAuthToken: process.env.CONVEX_ADMIN_KEY!,
83
+ });
84
+ ```
85
+
86
+ ## Parameters
87
+
88
+ ## Constructor Examples
89
+
90
+ ```ts
91
+ import { ConvexStore } from "@mastra/convex";
92
+
93
+ // Basic configuration
94
+ const store = new ConvexStore({
95
+ id: 'convex-storage',
96
+ deploymentUrl: "https://your-project.convex.cloud",
97
+ adminAuthToken: "your-admin-token",
98
+ });
99
+
100
+ // With custom storage function path
101
+ const storeCustom = new ConvexStore({
102
+ id: 'convex-storage',
103
+ deploymentUrl: "https://your-project.convex.cloud",
104
+ adminAuthToken: "your-admin-token",
105
+ storageFunction: "custom/path:handler",
106
+ });
107
+ ```
108
+
109
+ ## Additional Notes
110
+
111
+ ### Schema Management
112
+
113
+ The storage implementation uses typed Convex tables for each Mastra domain:
114
+
115
+ | Domain | Convex Table | Purpose |
116
+ | -------------- | --------------------------- | -------------------- |
117
+ | Threads | `mastra_threads` | Conversation threads |
118
+ | Messages | `mastra_messages` | Chat messages |
119
+ | Resources | `mastra_resources` | User working memory |
120
+ | Workflows | `mastra_workflow_snapshots` | Workflow state |
121
+ | Scorers | `mastra_scorers` | Evaluation data |
122
+ | Fallback | `mastra_documents` | Unknown tables |
123
+
124
+ ### Architecture
125
+
126
+ All typed tables include:
127
+
128
+ - An `id` field for Mastra's record ID (distinct from Convex's auto-generated `_id`)
129
+ - A `by_record_id` index for efficient lookups by Mastra ID
130
+
131
+ This design ensures compatibility with Mastra's storage contract while leveraging Convex's automatic indexing and real-time capabilities.
132
+
133
+ ### Environment Variables
134
+
135
+ Set these environment variables for your deployment:
136
+
137
+ - `CONVEX_URL` – Your Convex deployment URL
138
+ - `CONVEX_ADMIN_KEY` – Admin authentication token (get from Convex dashboard)
139
+
140
+ ## Related
141
+
142
+ - [Convex Vector Store](../vectors/convex)
143
+ - [Convex Documentation](https://docs.convex.dev/)