@mastra/libsql 1.9.1 → 1.10.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import { createClient } from '@libsql/client';
2
2
  import { MastraError, ErrorCategory, ErrorDomain } from '@mastra/core/error';
3
- import { createVectorErrorId, AgentsStorage, AGENTS_SCHEMA, TABLE_AGENTS, AGENT_VERSIONS_SCHEMA, TABLE_AGENT_VERSIONS, createStorageErrorId, normalizePerPage, calculatePagination, BackgroundTasksStorage, TABLE_SCHEMAS, TABLE_BACKGROUND_TASKS, BlobStore, TABLE_SKILL_BLOBS, SKILL_BLOBS_SCHEMA, ChannelsStorage, TABLE_CHANNEL_INSTALLATIONS, TABLE_CHANNEL_CONFIG, DatasetsStorage, DATASETS_SCHEMA, TABLE_DATASETS, DATASET_ITEMS_SCHEMA, TABLE_DATASET_ITEMS, DATASET_VERSIONS_SCHEMA, TABLE_DATASET_VERSIONS, ensureDate, safelyParseJSON, TABLE_EXPERIMENT_RESULTS, TABLE_EXPERIMENTS, ExperimentsStorage, EXPERIMENTS_SCHEMA, EXPERIMENT_RESULTS_SCHEMA, MCPClientsStorage, MCP_CLIENTS_SCHEMA, TABLE_MCP_CLIENTS, MCP_CLIENT_VERSIONS_SCHEMA, TABLE_MCP_CLIENT_VERSIONS, MCPServersStorage, MCP_SERVERS_SCHEMA, TABLE_MCP_SERVERS, MCP_SERVER_VERSIONS_SCHEMA, TABLE_MCP_SERVER_VERSIONS, MemoryStorage, TABLE_THREADS, TABLE_MESSAGES, TABLE_RESOURCES, ObservabilityStorage, SPAN_SCHEMA, TABLE_SPANS, listTracesArgsSchema, toTraceSpans, PromptBlocksStorage, PROMPT_BLOCKS_SCHEMA, TABLE_PROMPT_BLOCKS, PROMPT_BLOCK_VERSIONS_SCHEMA, TABLE_PROMPT_BLOCK_VERSIONS, ScorerDefinitionsStorage, SCORER_DEFINITIONS_SCHEMA, TABLE_SCORER_DEFINITIONS, SCORER_DEFINITION_VERSIONS_SCHEMA, TABLE_SCORER_DEFINITION_VERSIONS, ScoresStorage, SCORERS_SCHEMA, TABLE_SCORERS, transformScoreRow, SkillsStorage, SKILLS_SCHEMA, TABLE_SKILLS, SKILL_VERSIONS_SCHEMA, TABLE_SKILL_VERSIONS, WorkflowsStorage, TABLE_WORKFLOW_SNAPSHOT, WorkspacesStorage, WORKSPACES_SCHEMA, TABLE_WORKSPACES, WORKSPACE_VERSIONS_SCHEMA, TABLE_WORKSPACE_VERSIONS, MastraCompositeStore, getSqlType, TraceStatus } from '@mastra/core/storage';
3
+ import { createVectorErrorId, AgentsStorage, AGENTS_SCHEMA, TABLE_AGENTS, AGENT_VERSIONS_SCHEMA, TABLE_AGENT_VERSIONS, createStorageErrorId, normalizePerPage, calculatePagination, BackgroundTasksStorage, TABLE_SCHEMAS, TABLE_BACKGROUND_TASKS, BlobStore, TABLE_SKILL_BLOBS, SKILL_BLOBS_SCHEMA, ChannelsStorage, TABLE_CHANNEL_INSTALLATIONS, TABLE_CHANNEL_CONFIG, DatasetsStorage, DATASETS_SCHEMA, TABLE_DATASETS, DATASET_ITEMS_SCHEMA, TABLE_DATASET_ITEMS, DATASET_VERSIONS_SCHEMA, TABLE_DATASET_VERSIONS, ensureDate, safelyParseJSON, TABLE_EXPERIMENT_RESULTS, TABLE_EXPERIMENTS, ExperimentsStorage, EXPERIMENTS_SCHEMA, EXPERIMENT_RESULTS_SCHEMA, MCPClientsStorage, MCP_CLIENTS_SCHEMA, TABLE_MCP_CLIENTS, MCP_CLIENT_VERSIONS_SCHEMA, TABLE_MCP_CLIENT_VERSIONS, MCPServersStorage, MCP_SERVERS_SCHEMA, TABLE_MCP_SERVERS, MCP_SERVER_VERSIONS_SCHEMA, TABLE_MCP_SERVER_VERSIONS, MemoryStorage, TABLE_THREADS, TABLE_MESSAGES, TABLE_RESOURCES, ObservabilityStorage, SPAN_SCHEMA, TABLE_SPANS, listTracesArgsSchema, toTraceSpans, PromptBlocksStorage, PROMPT_BLOCKS_SCHEMA, TABLE_PROMPT_BLOCKS, PROMPT_BLOCK_VERSIONS_SCHEMA, TABLE_PROMPT_BLOCK_VERSIONS, SchedulesStorage, TABLE_SCHEDULES, TABLE_SCHEDULE_TRIGGERS, ScorerDefinitionsStorage, SCORER_DEFINITIONS_SCHEMA, TABLE_SCORER_DEFINITIONS, SCORER_DEFINITION_VERSIONS_SCHEMA, TABLE_SCORER_DEFINITION_VERSIONS, ScoresStorage, SCORERS_SCHEMA, TABLE_SCORERS, transformScoreRow, SkillsStorage, SKILLS_SCHEMA, TABLE_SKILLS, SKILL_VERSIONS_SCHEMA, TABLE_SKILL_VERSIONS, WorkflowsStorage, TABLE_WORKFLOW_SNAPSHOT, WorkspacesStorage, WORKSPACES_SCHEMA, TABLE_WORKSPACES, WORKSPACE_VERSIONS_SCHEMA, TABLE_WORKSPACE_VERSIONS, MastraCompositeStore, getSqlType, TraceStatus } from '@mastra/core/storage';
4
4
  import { parseSqlIdentifier, parseFieldKey } from '@mastra/core/utils';
5
5
  import { MastraVector, validateTopK, validateUpsertInput } from '@mastra/core/vector';
6
6
  import { BaseFilterTranslator } from '@mastra/core/vector/filter';
@@ -8894,6 +8894,271 @@ var PromptBlocksLibSQL = class extends PromptBlocksStorage {
8894
8894
  };
8895
8895
  }
8896
8896
  };
8897
+ function parseJson2(val) {
8898
+ if (val == null) return void 0;
8899
+ if (typeof val === "string") {
8900
+ try {
8901
+ return JSON.parse(val);
8902
+ } catch {
8903
+ return val;
8904
+ }
8905
+ }
8906
+ return val;
8907
+ }
8908
+ function toNumber(val) {
8909
+ if (typeof val === "bigint") return Number(val);
8910
+ return Number(val);
8911
+ }
8912
+ function rowToSchedule(row) {
8913
+ const target = parseJson2(row.target);
8914
+ if (!target) {
8915
+ throw new Error(`Schedule row ${row.id} has invalid target`);
8916
+ }
8917
+ const schedule = {
8918
+ id: String(row.id),
8919
+ target,
8920
+ cron: String(row.cron),
8921
+ status: String(row.status),
8922
+ nextFireAt: toNumber(row.next_fire_at),
8923
+ createdAt: toNumber(row.created_at),
8924
+ updatedAt: toNumber(row.updated_at)
8925
+ };
8926
+ if (row.timezone != null) schedule.timezone = String(row.timezone);
8927
+ if (row.last_fire_at != null) schedule.lastFireAt = toNumber(row.last_fire_at);
8928
+ if (row.last_run_id != null) schedule.lastRunId = String(row.last_run_id);
8929
+ const metadata = parseJson2(row.metadata);
8930
+ if (metadata !== void 0) schedule.metadata = metadata;
8931
+ if (row.owner_type != null) schedule.ownerType = String(row.owner_type);
8932
+ if (row.owner_id != null) schedule.ownerId = String(row.owner_id);
8933
+ return schedule;
8934
+ }
8935
+ function rowToTrigger(row) {
8936
+ const trigger = {
8937
+ id: row.id != null ? String(row.id) : void 0,
8938
+ scheduleId: String(row.schedule_id),
8939
+ runId: row.run_id != null ? String(row.run_id) : null,
8940
+ scheduledFireAt: toNumber(row.scheduled_fire_at),
8941
+ actualFireAt: toNumber(row.actual_fire_at),
8942
+ outcome: String(row.outcome),
8943
+ triggerKind: row.trigger_kind != null ? String(row.trigger_kind) : "schedule-fire"
8944
+ };
8945
+ if (row.error != null) trigger.error = String(row.error);
8946
+ if (row.parent_trigger_id != null) trigger.parentTriggerId = String(row.parent_trigger_id);
8947
+ const metadata = parseJson2(row.metadata);
8948
+ if (metadata !== void 0) trigger.metadata = metadata;
8949
+ return trigger;
8950
+ }
8951
+ var SchedulesLibSQL = class extends SchedulesStorage {
8952
+ #db;
8953
+ #client;
8954
+ constructor(config) {
8955
+ super();
8956
+ const client = resolveClient(config);
8957
+ this.#client = client;
8958
+ this.#db = new LibSQLDB({ client, maxRetries: config.maxRetries, initialBackoffMs: config.initialBackoffMs });
8959
+ }
8960
+ async init() {
8961
+ await this.#db.createTable({
8962
+ tableName: TABLE_SCHEDULES,
8963
+ schema: TABLE_SCHEMAS[TABLE_SCHEDULES]
8964
+ });
8965
+ await this.#db.createTable({
8966
+ tableName: TABLE_SCHEDULE_TRIGGERS,
8967
+ schema: TABLE_SCHEMAS[TABLE_SCHEDULE_TRIGGERS]
8968
+ });
8969
+ }
8970
+ async dangerouslyClearAll() {
8971
+ await this.#db.deleteData({ tableName: TABLE_SCHEDULE_TRIGGERS });
8972
+ await this.#db.deleteData({ tableName: TABLE_SCHEDULES });
8973
+ }
8974
+ async createSchedule(schedule) {
8975
+ const existing = await this.getSchedule(schedule.id);
8976
+ if (existing) {
8977
+ throw new Error(`Schedule with id "${schedule.id}" already exists`);
8978
+ }
8979
+ await this.#db.insert({
8980
+ tableName: TABLE_SCHEDULES,
8981
+ record: {
8982
+ id: schedule.id,
8983
+ target: schedule.target,
8984
+ cron: schedule.cron,
8985
+ timezone: schedule.timezone ?? null,
8986
+ status: schedule.status,
8987
+ next_fire_at: schedule.nextFireAt,
8988
+ last_fire_at: schedule.lastFireAt ?? null,
8989
+ last_run_id: schedule.lastRunId ?? null,
8990
+ created_at: schedule.createdAt,
8991
+ updated_at: schedule.updatedAt,
8992
+ metadata: schedule.metadata ?? null,
8993
+ owner_type: schedule.ownerType ?? null,
8994
+ owner_id: schedule.ownerId ?? null
8995
+ }
8996
+ });
8997
+ return schedule;
8998
+ }
8999
+ async getSchedule(id) {
9000
+ const result = await this.#client.execute({
9001
+ sql: `SELECT ${buildSelectColumns(TABLE_SCHEDULES)} FROM ${TABLE_SCHEDULES} WHERE id = ?`,
9002
+ args: [id]
9003
+ });
9004
+ const row = result.rows[0];
9005
+ return row ? rowToSchedule(row) : null;
9006
+ }
9007
+ async listSchedules(filter) {
9008
+ const conditions = [];
9009
+ const params = [];
9010
+ if (filter?.status) {
9011
+ conditions.push("status = ?");
9012
+ params.push(filter.status);
9013
+ }
9014
+ if (filter?.workflowId) {
9015
+ conditions.push("json_extract(target, '$.workflowId') = ?");
9016
+ params.push(filter.workflowId);
9017
+ }
9018
+ if (filter?.ownerType !== void 0) {
9019
+ if (filter.ownerType === null) {
9020
+ conditions.push("owner_type IS NULL");
9021
+ } else {
9022
+ conditions.push("owner_type = ?");
9023
+ params.push(filter.ownerType);
9024
+ }
9025
+ }
9026
+ if (filter?.ownerId !== void 0) {
9027
+ if (filter.ownerId === null) {
9028
+ conditions.push("owner_id IS NULL");
9029
+ } else {
9030
+ conditions.push("owner_id = ?");
9031
+ params.push(filter.ownerId);
9032
+ }
9033
+ }
9034
+ const where = conditions.length > 0 ? `WHERE ${conditions.join(" AND ")}` : "";
9035
+ const result = await this.#client.execute({
9036
+ sql: `SELECT ${buildSelectColumns(TABLE_SCHEDULES)} FROM ${TABLE_SCHEDULES} ${where} ORDER BY created_at ASC`,
9037
+ args: params
9038
+ });
9039
+ return result.rows.map((r) => rowToSchedule(r));
9040
+ }
9041
+ async listDueSchedules(now, limit) {
9042
+ const cap = limit ?? 100;
9043
+ const result = await this.#client.execute({
9044
+ sql: `SELECT ${buildSelectColumns(TABLE_SCHEDULES)} FROM ${TABLE_SCHEDULES}
9045
+ WHERE status = ? AND next_fire_at <= ?
9046
+ ORDER BY next_fire_at ASC
9047
+ LIMIT ?`,
9048
+ args: ["active", now, cap]
9049
+ });
9050
+ return result.rows.map((r) => rowToSchedule(r));
9051
+ }
9052
+ async updateSchedule(id, patch) {
9053
+ const setClauses = [];
9054
+ const params = [];
9055
+ if ("cron" in patch && patch.cron !== void 0) {
9056
+ setClauses.push("cron = ?");
9057
+ params.push(patch.cron);
9058
+ }
9059
+ if ("timezone" in patch) {
9060
+ setClauses.push("timezone = ?");
9061
+ params.push(patch.timezone ?? null);
9062
+ }
9063
+ if ("status" in patch && patch.status !== void 0) {
9064
+ setClauses.push("status = ?");
9065
+ params.push(patch.status);
9066
+ }
9067
+ if ("nextFireAt" in patch && patch.nextFireAt !== void 0) {
9068
+ setClauses.push("next_fire_at = ?");
9069
+ params.push(patch.nextFireAt);
9070
+ }
9071
+ if ("target" in patch && patch.target !== void 0) {
9072
+ setClauses.push("target = jsonb(?)");
9073
+ params.push(JSON.stringify(patch.target));
9074
+ }
9075
+ if ("metadata" in patch) {
9076
+ setClauses.push("metadata = jsonb(?)");
9077
+ params.push(patch.metadata != null ? JSON.stringify(patch.metadata) : null);
9078
+ }
9079
+ if ("ownerType" in patch) {
9080
+ setClauses.push("owner_type = ?");
9081
+ params.push(patch.ownerType ?? null);
9082
+ }
9083
+ if ("ownerId" in patch) {
9084
+ setClauses.push("owner_id = ?");
9085
+ params.push(patch.ownerId ?? null);
9086
+ }
9087
+ setClauses.push("updated_at = ?");
9088
+ params.push(Date.now());
9089
+ params.push(id);
9090
+ if (setClauses.length === 1) {
9091
+ const existing = await this.getSchedule(id);
9092
+ if (!existing) throw new Error(`Schedule ${id} not found`);
9093
+ return existing;
9094
+ }
9095
+ await this.#client.execute({
9096
+ sql: `UPDATE ${TABLE_SCHEDULES} SET ${setClauses.join(", ")} WHERE id = ?`,
9097
+ args: params
9098
+ });
9099
+ const updated = await this.getSchedule(id);
9100
+ if (!updated) throw new Error(`Schedule ${id} not found`);
9101
+ return updated;
9102
+ }
9103
+ async updateScheduleNextFire(id, expectedNextFireAt, newNextFireAt, lastFireAt, lastRunId) {
9104
+ const result = await this.#client.execute({
9105
+ sql: `UPDATE ${TABLE_SCHEDULES}
9106
+ SET next_fire_at = ?, last_fire_at = ?, last_run_id = ?, updated_at = ?
9107
+ WHERE id = ? AND next_fire_at = ? AND status = ?`,
9108
+ args: [newNextFireAt, lastFireAt, lastRunId, Date.now(), id, expectedNextFireAt, "active"]
9109
+ });
9110
+ return (result.rowsAffected ?? 0) > 0;
9111
+ }
9112
+ async deleteSchedule(id) {
9113
+ await this.#client.execute({
9114
+ sql: `DELETE FROM ${TABLE_SCHEDULE_TRIGGERS} WHERE schedule_id = ?`,
9115
+ args: [id]
9116
+ });
9117
+ await this.#client.execute({
9118
+ sql: `DELETE FROM ${TABLE_SCHEDULES} WHERE id = ?`,
9119
+ args: [id]
9120
+ });
9121
+ }
9122
+ async recordTrigger(trigger) {
9123
+ const id = trigger.id ?? crypto.randomUUID();
9124
+ await this.#db.insert({
9125
+ tableName: TABLE_SCHEDULE_TRIGGERS,
9126
+ record: {
9127
+ id,
9128
+ schedule_id: trigger.scheduleId,
9129
+ run_id: trigger.runId,
9130
+ scheduled_fire_at: trigger.scheduledFireAt,
9131
+ actual_fire_at: trigger.actualFireAt,
9132
+ outcome: trigger.outcome,
9133
+ error: trigger.error ?? null,
9134
+ trigger_kind: trigger.triggerKind ?? "schedule-fire",
9135
+ parent_trigger_id: trigger.parentTriggerId ?? null,
9136
+ metadata: trigger.metadata ?? null
9137
+ }
9138
+ });
9139
+ }
9140
+ async listTriggers(scheduleId, opts) {
9141
+ const conditions = ["schedule_id = ?"];
9142
+ const params = [scheduleId];
9143
+ if (opts?.fromActualFireAt != null) {
9144
+ conditions.push("actual_fire_at >= ?");
9145
+ params.push(opts.fromActualFireAt);
9146
+ }
9147
+ if (opts?.toActualFireAt != null) {
9148
+ conditions.push("actual_fire_at < ?");
9149
+ params.push(opts.toActualFireAt);
9150
+ }
9151
+ const limitClause = opts?.limit != null ? `LIMIT ${Math.floor(opts.limit)}` : "";
9152
+ const result = await this.#client.execute({
9153
+ sql: `SELECT ${buildSelectColumns(TABLE_SCHEDULE_TRIGGERS)} FROM ${TABLE_SCHEDULE_TRIGGERS}
9154
+ WHERE ${conditions.join(" AND ")}
9155
+ ORDER BY actual_fire_at DESC
9156
+ ${limitClause}`,
9157
+ args: params
9158
+ });
9159
+ return result.rows.map((r) => rowToTrigger(r));
9160
+ }
9161
+ };
8897
9162
  var ScorerDefinitionsLibSQL = class extends ScorerDefinitionsStorage {
8898
9163
  #db;
8899
9164
  #client;
@@ -11125,6 +11390,7 @@ var LibSQLStore = class extends MastraCompositeStore {
11125
11390
  const skills = new SkillsLibSQL(domainConfig);
11126
11391
  const blobs = new BlobsLibSQL(domainConfig);
11127
11392
  const backgroundTasks = new BackgroundTasksLibSQL(domainConfig);
11393
+ const schedules = new SchedulesLibSQL(domainConfig);
11128
11394
  this.stores = {
11129
11395
  scores,
11130
11396
  workflows,
@@ -11141,7 +11407,8 @@ var LibSQLStore = class extends MastraCompositeStore {
11141
11407
  workspaces,
11142
11408
  skills,
11143
11409
  blobs,
11144
- backgroundTasks
11410
+ backgroundTasks,
11411
+ schedules
11145
11412
  };
11146
11413
  }
11147
11414
  };
@@ -11245,6 +11512,6 @@ Example Complex Query:
11245
11512
  ]
11246
11513
  }`;
11247
11514
 
11248
- export { AgentsLibSQL, BackgroundTasksLibSQL, BlobsLibSQL, ChannelsLibSQL, DatasetsLibSQL, LibSQLStore as DefaultStorage, ExperimentsLibSQL, LIBSQL_PROMPT, LibSQLStore, LibSQLVector, MCPClientsLibSQL, MCPServersLibSQL, MemoryLibSQL, ObservabilityLibSQL, PromptBlocksLibSQL, ScorerDefinitionsLibSQL, ScoresLibSQL, SkillsLibSQL, WorkflowsLibSQL, WorkspacesLibSQL };
11515
+ export { AgentsLibSQL, BackgroundTasksLibSQL, BlobsLibSQL, ChannelsLibSQL, DatasetsLibSQL, LibSQLStore as DefaultStorage, ExperimentsLibSQL, LIBSQL_PROMPT, LibSQLStore, LibSQLVector, MCPClientsLibSQL, MCPServersLibSQL, MemoryLibSQL, ObservabilityLibSQL, PromptBlocksLibSQL, SchedulesLibSQL, ScorerDefinitionsLibSQL, ScoresLibSQL, SkillsLibSQL, WorkflowsLibSQL, WorkspacesLibSQL };
11249
11516
  //# sourceMappingURL=index.js.map
11250
11517
  //# sourceMappingURL=index.js.map