opencode-mastra-om 0.1.4 → 0.1.5

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 (2) hide show
  1. package/dist/index.js +103 -11
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -179825,38 +179825,75 @@ var MastraPlugin = async (ctx) => {
179825
179825
  }
179826
179826
  const om = new ObservationalMemory(omOptions);
179827
179827
  omLog(`[init] ObservationalMemory created, model=${config2.model ?? "default"}`);
179828
- const backupObservations = async (threadId, label) => {
179828
+ const backupObservations = async (threadId, trigger) => {
179829
179829
  try {
179830
179830
  const record3 = await om.getRecord(threadId);
179831
179831
  const observations = record3?.activeObservations;
179832
179832
  if (!observations)
179833
179833
  return;
179834
- const generationCount = record3?.generationCount ?? 0;
179835
- const lookupKey = threadId;
179836
- const savedAt = new Date().toISOString();
179837
179834
  const db = store.turso;
179838
179835
  if (!db)
179839
179836
  return;
179837
+ const snap = {
179838
+ lookupKey: threadId,
179839
+ generationCount: record3.generationCount ?? 0,
179840
+ observations,
179841
+ observationTokenCount: record3.observationTokenCount ?? 0,
179842
+ lastObservedAt: record3.lastObservedAt ?? null,
179843
+ lastReflectionAt: record3.lastReflectionAt ?? null,
179844
+ pendingMessageTokens: record3.pendingMessageTokens ?? 0,
179845
+ observedMessageIds: record3.observedMessageIds ?? "[]",
179846
+ trigger,
179847
+ savedAt: new Date().toISOString()
179848
+ };
179840
179849
  await db.execute({
179841
- sql: `INSERT INTO mastra_om_backups (id, lookupKey, slot, generationCount, observations, savedAt)
179842
- SELECT hex(randomblob(16)), lookupKey, 2, generationCount, observations, savedAt
179850
+ sql: `INSERT INTO mastra_om_backups
179851
+ (id, lookupKey, slot, generationCount, observations, observationTokenCount,
179852
+ lastObservedAt, lastReflectionAt, pendingMessageTokens, observedMessageIds, trigger, savedAt)
179853
+ SELECT hex(randomblob(16)), lookupKey, 2, generationCount, observations, observationTokenCount,
179854
+ lastObservedAt, lastReflectionAt, pendingMessageTokens, observedMessageIds, trigger, savedAt
179843
179855
  FROM mastra_om_backups WHERE lookupKey = ? AND slot = 1
179844
179856
  ON CONFLICT(lookupKey, slot) DO UPDATE SET
179845
179857
  generationCount = excluded.generationCount,
179846
179858
  observations = excluded.observations,
179859
+ observationTokenCount = excluded.observationTokenCount,
179860
+ lastObservedAt = excluded.lastObservedAt,
179861
+ lastReflectionAt = excluded.lastReflectionAt,
179862
+ pendingMessageTokens = excluded.pendingMessageTokens,
179863
+ observedMessageIds = excluded.observedMessageIds,
179864
+ trigger = excluded.trigger,
179847
179865
  savedAt = excluded.savedAt`,
179848
- args: [lookupKey]
179866
+ args: [threadId]
179849
179867
  });
179850
179868
  await db.execute({
179851
- sql: `INSERT INTO mastra_om_backups (id, lookupKey, slot, generationCount, observations, savedAt)
179852
- VALUES (hex(randomblob(16)), ?, 1, ?, ?, ?)
179869
+ sql: `INSERT INTO mastra_om_backups
179870
+ (id, lookupKey, slot, generationCount, observations, observationTokenCount,
179871
+ lastObservedAt, lastReflectionAt, pendingMessageTokens, observedMessageIds, trigger, savedAt)
179872
+ VALUES (hex(randomblob(16)), ?, 1, ?, ?, ?, ?, ?, ?, ?, ?, ?)
179853
179873
  ON CONFLICT(lookupKey, slot) DO UPDATE SET
179854
179874
  generationCount = excluded.generationCount,
179855
179875
  observations = excluded.observations,
179876
+ observationTokenCount = excluded.observationTokenCount,
179877
+ lastObservedAt = excluded.lastObservedAt,
179878
+ lastReflectionAt = excluded.lastReflectionAt,
179879
+ pendingMessageTokens = excluded.pendingMessageTokens,
179880
+ observedMessageIds = excluded.observedMessageIds,
179881
+ trigger = excluded.trigger,
179856
179882
  savedAt = excluded.savedAt`,
179857
- args: [lookupKey, generationCount, observations, savedAt]
179883
+ args: [
179884
+ threadId,
179885
+ snap.generationCount,
179886
+ snap.observations,
179887
+ snap.observationTokenCount,
179888
+ snap.lastObservedAt,
179889
+ snap.lastReflectionAt,
179890
+ snap.pendingMessageTokens,
179891
+ snap.observedMessageIds,
179892
+ snap.trigger,
179893
+ snap.savedAt
179894
+ ]
179858
179895
  });
179859
- omLog(`[backup] ${label} — saved gen ${generationCount} to slot 1, rotated old slot 1 → slot 2`);
179896
+ omLog(`[backup] ${trigger} — saved gen ${snap.generationCount} to slot 1, rotated old slot 1 → slot 2`);
179860
179897
  } catch (err) {
179861
179898
  omLog(`[backup] failed: ${err instanceof Error ? err.message : String(err)}`);
179862
179899
  }
@@ -180063,6 +180100,61 @@ ${OBSERVATION_CONTINUATION_HINT}`);
180063
180100
  }
180064
180101
  }
180065
180102
  }),
180103
+ om_restore: tool5({
180104
+ description: "Restore observational memory from backup slot 1 (most recent) or slot 2 (one generation older).",
180105
+ args: { slot: { type: "number", description: "1 = most recent backup, 2 = one generation older" } },
180106
+ async execute(args, context2) {
180107
+ const threadId = context2.sessionID;
180108
+ const slot = args.slot === 2 ? 2 : 1;
180109
+ try {
180110
+ const db = store.turso;
180111
+ if (!db)
180112
+ return "Raw DB access unavailable.";
180113
+ const result = await db.execute({
180114
+ sql: `SELECT * FROM mastra_om_backups WHERE lookupKey = ? AND slot = ?`,
180115
+ args: [threadId, slot]
180116
+ });
180117
+ const row = result.rows?.[0];
180118
+ if (!row)
180119
+ return `No backup found in slot ${slot}.`;
180120
+ await db.execute({
180121
+ sql: `UPDATE mastra_observational_memory SET
180122
+ activeObservations = ?,
180123
+ generationCount = ?,
180124
+ observationTokenCount = ?,
180125
+ lastObservedAt = ?,
180126
+ lastReflectionAt = ?,
180127
+ pendingMessageTokens = ?,
180128
+ observedMessageIds = ?
180129
+ WHERE lookupKey = ?`,
180130
+ args: [
180131
+ row.observations,
180132
+ row.generationCount,
180133
+ row.observationTokenCount,
180134
+ row.lastObservedAt,
180135
+ row.lastReflectionAt,
180136
+ row.pendingMessageTokens,
180137
+ row.observedMessageIds,
180138
+ threadId
180139
+ ]
180140
+ });
180141
+ omLog(`[restore] restored slot ${slot} — gen ${row.generationCount}, saved at ${row.savedAt}, trigger=${row.trigger}`);
180142
+ return [
180143
+ `✅ Restored from slot ${slot}`,
180144
+ ` Generation: ${row.generationCount}`,
180145
+ ` Saved at: ${row.savedAt}`,
180146
+ ` Trigger: ${row.trigger}`,
180147
+ ` Observation tokens: ${row.observationTokenCount}`,
180148
+ ` Last observed: ${row.lastObservedAt ?? "never"}`,
180149
+ ` Last reflection: ${row.lastReflectionAt ?? "never"}`
180150
+ ].join(`
180151
+ `);
180152
+ } catch (err) {
180153
+ const msg = err instanceof Error ? err.message : String(err);
180154
+ return `Restore failed: ${msg}`;
180155
+ }
180156
+ }
180157
+ }),
180066
180158
  om_config: tool5({
180067
180159
  description: "Show the current Mastra Observational Memory configuration.",
180068
180160
  args: {},
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://json.schemastore.org/package.json",
3
3
  "name": "opencode-mastra-om",
4
- "version": "0.1.4",
4
+ "version": "0.1.5",
5
5
  "type": "module",
6
6
  "license": "MIT",
7
7
  "description": "Enhanced Mastra Observational Memory plugin for OpenCode — persistent cross-session memory with observation, reflection, and manual trigger tools",