@rlabs-inc/memory 0.5.10 → 0.5.12
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/package.json +1 -1
- package/src/cli/commands/migrate.ts +2 -1
- package/src/core/curator.ts +85 -0
- package/src/core/retrieval.ts +7 -0
package/package.json
CHANGED
|
@@ -275,8 +275,9 @@ async function migrateFile(
|
|
|
275
275
|
}
|
|
276
276
|
|
|
277
277
|
const hasNullEmbedding = !parsed.frontmatter.embedding || parsed.frontmatter.embedding === null
|
|
278
|
+
const hasWrongDimensions = !hasNullEmbedding && Array.isArray(parsed.frontmatter.embedding) && parsed.frontmatter.embedding.length !== 384
|
|
278
279
|
const needsSchema = needsV3Migration(parsed.frontmatter)
|
|
279
|
-
const needsEmbedding = options.embeddings && hasNullEmbedding
|
|
280
|
+
const needsEmbedding = options.embeddings && (hasNullEmbedding || hasWrongDimensions)
|
|
280
281
|
|
|
281
282
|
// Nothing to do
|
|
282
283
|
if (!needsSchema && !needsEmbedding) {
|
package/src/core/curator.ts
CHANGED
|
@@ -818,6 +818,62 @@ This session has ended. Please curate the memories from this conversation accord
|
|
|
818
818
|
"curator",
|
|
819
819
|
);
|
|
820
820
|
|
|
821
|
+
// Temporarily disable hooks in project's .gemini/settings.json
|
|
822
|
+
// This prevents recursive hook triggering (env vars don't propagate to hook subprocesses)
|
|
823
|
+
const projectGeminiDir = cwd ? join(cwd, ".gemini") : null;
|
|
824
|
+
const projectSettingsPath = projectGeminiDir
|
|
825
|
+
? join(projectGeminiDir, "settings.json")
|
|
826
|
+
: null;
|
|
827
|
+
const backupSettingsPath = projectSettingsPath
|
|
828
|
+
? `${projectSettingsPath}.memory-backup`
|
|
829
|
+
: null;
|
|
830
|
+
let hadExistingSettings = false;
|
|
831
|
+
|
|
832
|
+
if (projectSettingsPath && projectGeminiDir) {
|
|
833
|
+
try {
|
|
834
|
+
// Backup existing settings if present
|
|
835
|
+
if (existsSync(projectSettingsPath)) {
|
|
836
|
+
hadExistingSettings = true;
|
|
837
|
+
const existingContent = await Bun.file(projectSettingsPath).text();
|
|
838
|
+
await Bun.write(backupSettingsPath!, existingContent);
|
|
839
|
+
logger.debug(
|
|
840
|
+
`Curator Gemini: Backed up existing settings to ${backupSettingsPath}`,
|
|
841
|
+
"curator",
|
|
842
|
+
);
|
|
843
|
+
}
|
|
844
|
+
|
|
845
|
+
// Ensure .gemini directory exists
|
|
846
|
+
if (!existsSync(projectGeminiDir)) {
|
|
847
|
+
const { mkdirSync } = await import("fs");
|
|
848
|
+
mkdirSync(projectGeminiDir, { recursive: true });
|
|
849
|
+
}
|
|
850
|
+
|
|
851
|
+
// Create temporary settings with hooks disabled
|
|
852
|
+
const tempSettings = {
|
|
853
|
+
hooks: {
|
|
854
|
+
disabled: [
|
|
855
|
+
"inject-memories",
|
|
856
|
+
"load-session-primer",
|
|
857
|
+
"curate-memories",
|
|
858
|
+
],
|
|
859
|
+
},
|
|
860
|
+
};
|
|
861
|
+
await Bun.write(
|
|
862
|
+
projectSettingsPath,
|
|
863
|
+
JSON.stringify(tempSettings, null, 2),
|
|
864
|
+
);
|
|
865
|
+
logger.debug(
|
|
866
|
+
`Curator Gemini: Created temporary settings with hooks disabled`,
|
|
867
|
+
"curator",
|
|
868
|
+
);
|
|
869
|
+
} catch (err: any) {
|
|
870
|
+
logger.debug(
|
|
871
|
+
`Curator Gemini: Could not manage settings file: ${err.message}`,
|
|
872
|
+
"curator",
|
|
873
|
+
);
|
|
874
|
+
}
|
|
875
|
+
}
|
|
876
|
+
|
|
821
877
|
// Execute CLI with system prompt via environment variable
|
|
822
878
|
// Must run from original project directory so --resume latest finds correct session
|
|
823
879
|
const proc = Bun.spawn(["gemini", ...args], {
|
|
@@ -839,6 +895,35 @@ This session has ended. Please curate the memories from this conversation accord
|
|
|
839
895
|
]);
|
|
840
896
|
const exitCode = await proc.exited;
|
|
841
897
|
|
|
898
|
+
// Cleanup: Restore original settings file
|
|
899
|
+
if (projectSettingsPath && backupSettingsPath) {
|
|
900
|
+
try {
|
|
901
|
+
const { unlinkSync } = await import("fs");
|
|
902
|
+
if (hadExistingSettings && existsSync(backupSettingsPath)) {
|
|
903
|
+
// Restore backup
|
|
904
|
+
const backupContent = await Bun.file(backupSettingsPath).text();
|
|
905
|
+
await Bun.write(projectSettingsPath, backupContent);
|
|
906
|
+
unlinkSync(backupSettingsPath);
|
|
907
|
+
logger.debug(
|
|
908
|
+
`Curator Gemini: Restored original settings from backup`,
|
|
909
|
+
"curator",
|
|
910
|
+
);
|
|
911
|
+
} else if (existsSync(projectSettingsPath)) {
|
|
912
|
+
// Delete temporary settings (there was no original)
|
|
913
|
+
unlinkSync(projectSettingsPath);
|
|
914
|
+
logger.debug(
|
|
915
|
+
`Curator Gemini: Removed temporary settings file`,
|
|
916
|
+
"curator",
|
|
917
|
+
);
|
|
918
|
+
}
|
|
919
|
+
} catch (err: any) {
|
|
920
|
+
logger.debug(
|
|
921
|
+
`Curator Gemini: Could not cleanup settings: ${err.message}`,
|
|
922
|
+
"curator",
|
|
923
|
+
);
|
|
924
|
+
}
|
|
925
|
+
}
|
|
926
|
+
|
|
842
927
|
logger.debug(`Curator Gemini: Exit code ${exitCode}`, "curator");
|
|
843
928
|
if (stderr && stderr.trim()) {
|
|
844
929
|
logger.debug(`Curator Gemini - stderr: ${stderr}`, "curator");
|
package/src/core/retrieval.ts
CHANGED
|
@@ -288,6 +288,13 @@ export class SmartVectorRetrieval {
|
|
|
288
288
|
}
|
|
289
289
|
const v1 = vec1 instanceof Float32Array ? vec1 : new Float32Array(vec1)
|
|
290
290
|
const v2 = vec2 instanceof Float32Array ? vec2 : new Float32Array(vec2)
|
|
291
|
+
|
|
292
|
+
// Skip mismatched dimensions instead of crashing
|
|
293
|
+
if (v1.length !== v2.length) {
|
|
294
|
+
logger.debug(`Vector dimension mismatch: ${v1.length} vs ${v2.length}, skipping`, 'retrieval')
|
|
295
|
+
return 0.0
|
|
296
|
+
}
|
|
297
|
+
|
|
291
298
|
const similarity = cosineSimilarity(v1, v2)
|
|
292
299
|
|
|
293
300
|
// Collect samples to understand similarity range
|