open-mem 0.11.0 → 0.12.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 (54) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/README.md +73 -565
  3. package/dist/adapters/http/loopback.d.ts +3 -0
  4. package/dist/adapters/http/loopback.d.ts.map +1 -0
  5. package/dist/adapters/http/server.d.ts.map +1 -1
  6. package/dist/adapters/mcp/server.d.ts +0 -2
  7. package/dist/adapters/mcp/server.d.ts.map +1 -1
  8. package/dist/adapters/opencode/tools.d.ts.map +1 -1
  9. package/dist/ai/fallback-policy.d.ts +18 -0
  10. package/dist/ai/fallback-policy.d.ts.map +1 -0
  11. package/dist/ai/fallback.d.ts +3 -1
  12. package/dist/ai/fallback.d.ts.map +1 -1
  13. package/dist/ai/provider.d.ts +2 -1
  14. package/dist/ai/provider.d.ts.map +1 -1
  15. package/dist/claude-code.js +87 -87
  16. package/dist/config/store.d.ts.map +1 -1
  17. package/dist/config.d.ts.map +1 -1
  18. package/dist/contracts/api.d.ts +2 -120
  19. package/dist/contracts/api.d.ts.map +1 -1
  20. package/dist/contracts/schemas.d.ts +134 -0
  21. package/dist/contracts/schemas.d.ts.map +1 -0
  22. package/dist/cursor.js +87 -87
  23. package/dist/daemon.js +70 -70
  24. package/dist/db/observations.d.ts.map +1 -1
  25. package/dist/doctor.d.ts +3 -0
  26. package/dist/doctor.d.ts.map +1 -0
  27. package/dist/doctor.js +5 -0
  28. package/dist/index.d.ts.map +1 -1
  29. package/dist/index.js +122 -122
  30. package/dist/maintenance.js +43 -43
  31. package/dist/mcp.js +73 -73
  32. package/dist/modes/loader.d.ts.map +1 -1
  33. package/dist/modes/resolver.d.ts +21 -0
  34. package/dist/modes/resolver.d.ts.map +1 -0
  35. package/dist/platform-worker.d.ts.map +1 -1
  36. package/dist/search/orchestrator.d.ts +4 -13
  37. package/dist/search/orchestrator.d.ts.map +1 -1
  38. package/dist/search/registry.d.ts +19 -0
  39. package/dist/search/registry.d.ts.map +1 -0
  40. package/dist/search/strategies/filter-only.d.ts +4 -0
  41. package/dist/search/strategies/filter-only.d.ts.map +1 -0
  42. package/dist/search/strategies/hybrid.d.ts +3 -0
  43. package/dist/search/strategies/hybrid.d.ts.map +1 -0
  44. package/dist/search/strategies/semantic.d.ts +4 -0
  45. package/dist/search/strategies/semantic.d.ts.map +1 -0
  46. package/dist/search/strategies/types.d.ts +22 -0
  47. package/dist/search/strategies/types.d.ts.map +1 -0
  48. package/dist/services/readiness.d.ts +26 -0
  49. package/dist/services/readiness.d.ts.map +1 -0
  50. package/dist/services/setup-diagnostics.d.ts +23 -0
  51. package/dist/services/setup-diagnostics.d.ts.map +1 -0
  52. package/dist/types.d.ts +3 -1
  53. package/dist/types.d.ts.map +1 -1
  54. package/package.json +8 -9
package/dist/doctor.js ADDED
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env bun
2
+ // @bun
3
+ import{parseArgs as W}from"util";import{existsSync as E,readFileSync as B}from"fs";import{join as x}from"path";import{existsSync as S,readdirSync as M,readFileSync as O}from"fs";import{join as P}from"path";var p={id:"code",name:"Code",description:"Default coding workflow mode",observationTypes:["decision","bugfix","feature","refactor","discovery","change"],conceptVocabulary:["how-it-works","why-it-exists","what-changed","problem-solution","gotcha","pattern","trade-off"],entityTypes:["technology","library","pattern","concept","file","person","project","other"],relationshipTypes:["uses","depends_on","implements","extends","related_to","replaces","configures"]};function n(e){return{...e,observationTypes:[...e.observationTypes],conceptVocabulary:[...e.conceptVocabulary],entityTypes:[...e.entityTypes],relationshipTypes:[...e.relationshipTypes],promptOverrides:e.promptOverrides?{...e.promptOverrides}:void 0}}function w(e){if(!e||typeof e!=="object")return!1;let s=e,r=(t)=>Array.isArray(t)&&t.every((a)=>typeof a==="string"),i=(t)=>typeof t==="object"&&t!==null&&!Array.isArray(t)&&Object.values(t).every((a)=>typeof a==="string");return typeof s.id==="string"&&(s.extends===void 0||typeof s.extends==="string")&&(s.locale===void 0||typeof s.locale==="string")&&(s.name===void 0||typeof s.name==="string")&&(s.description===void 0||typeof s.description==="string")&&(s.observationTypes===void 0||r(s.observationTypes))&&(s.conceptVocabulary===void 0||r(s.conceptVocabulary))&&(s.entityTypes===void 0||r(s.entityTypes))&&(s.relationshipTypes===void 0||r(s.relationshipTypes))&&(s.promptOverrides===void 0||i(s.promptOverrides))}function A(e){return typeof e.name==="string"&&typeof e.description==="string"&&Array.isArray(e.observationTypes)&&Array.isArray(e.conceptVocabulary)&&Array.isArray(e.entityTypes)&&Array.isArray(e.relationshipTypes)}function b(e,s){return{...e,...s,id:s.id,name:s.name??e.name,description:s.description??e.description,observationTypes:s.observationTypes??e.observationTypes,conceptVocabulary:s.conceptVocabulary??e.conceptVocabulary,entityTypes:s.entityTypes??e.entityTypes,relationshipTypes:s.relationshipTypes??e.relationshipTypes,promptOverrides:{...e.promptOverrides??{},...s.promptOverrides??{}}}}class l{modesDir;constructor(e){this.modesDir=e}loadAllRaw(){let e=new Map;if(!S(this.modesDir))return e;for(let s of M(this.modesDir)){if(!s.endsWith(".json"))continue;let r=P(this.modesDir,s);try{let i=O(r,"utf-8"),t=JSON.parse(i);if(!w(t))continue;if(e.has(t.id))console.warn(`[open-mem] Duplicate mode id "${t.id}" in ${r}; overriding previous definition.`);e.set(t.id,t)}catch{}}return e}resolveById(e,s){let r=new Set,i=!1,t=(d)=>{if(r.has(d))return i=!0,n(p);r.add(d);let o=s.get(d);if(!o)return n(p);if(!o.extends){if(!A(o))return n(p);return b(n(p),o)}let T=t(o.extends);if(i)return n(p);return b(T,o)},a=t(e);return i?n(p):n(a)}}var V=x(import.meta.dir,"."),D=new l(V),u=null;function $(){if(u)return u;return u=D.loadAllRaw(),u}function h(){return[...$().keys()].sort()}var J={dbPath:".open-mem/memory.db",provider:"google",apiKey:void 0,model:"gemini-2.5-flash-lite",maxTokensPerCompression:1024,compressionEnabled:!0,contextInjectionEnabled:!0,maxContextTokens:4000,batchSize:5,batchIntervalMs:30000,ignoredTools:[],minOutputLength:50,maxIndexEntries:20,sensitivePatterns:[],retentionDays:90,maxDatabaseSizeMb:500,logLevel:"warn",contextShowTokenCosts:!0,contextObservationTypes:"all",contextFullObservationCount:3,maxObservations:50,contextShowLastSummary:!0,rateLimitingEnabled:!0,folderContextEnabled:!0,folderContextMaxDepth:5,folderContextMode:"dispersed",folderContextFilename:"AGENTS.md",daemonEnabled:!1,dashboardEnabled:!1,dashboardPort:3737,platformOpenCodeEnabled:!0,platformClaudeCodeEnabled:!1,platformCursorEnabled:!1,mcpProtocolVersion:"2024-11-05",mcpSupportedProtocolVersions:["2024-11-05"],embeddingDimension:void 0,conflictResolutionEnabled:!1,conflictSimilarityBandLow:0.7,conflictSimilarityBandHigh:0.92,userMemoryEnabled:!1,userMemoryDbPath:"~/.config/open-mem/user-memory.db",userMemoryMaxContextTokens:1000,rerankingEnabled:!1,rerankingMaxCandidates:20,entityExtractionEnabled:!1,fallbackProviders:void 0,mode:"code"};function N(){let e={};if(process.env.OPEN_MEM_DB_PATH)e.dbPath=process.env.OPEN_MEM_DB_PATH;if(process.env.OPEN_MEM_PROVIDER)e.provider=process.env.OPEN_MEM_PROVIDER;if(process.env.OPEN_MEM_MODEL)e.model=process.env.OPEN_MEM_MODEL;if(process.env.OPEN_MEM_MAX_CONTEXT_TOKENS)e.maxContextTokens=Number.parseInt(process.env.OPEN_MEM_MAX_CONTEXT_TOKENS,10);if(process.env.OPEN_MEM_COMPRESSION==="false")e.compressionEnabled=!1;if(process.env.OPEN_MEM_CONTEXT_INJECTION==="false")e.contextInjectionEnabled=!1;if(process.env.OPEN_MEM_IGNORED_TOOLS)e.ignoredTools=process.env.OPEN_MEM_IGNORED_TOOLS.split(",").map((s)=>s.trim());if(process.env.OPEN_MEM_BATCH_SIZE)e.batchSize=Number.parseInt(process.env.OPEN_MEM_BATCH_SIZE,10);if(process.env.OPEN_MEM_RETENTION_DAYS)e.retentionDays=Number.parseInt(process.env.OPEN_MEM_RETENTION_DAYS,10);if(process.env.OPEN_MEM_LOG_LEVEL)e.logLevel=process.env.OPEN_MEM_LOG_LEVEL;if(process.env.OPEN_MEM_CONTEXT_SHOW_TOKEN_COSTS==="false")e.contextShowTokenCosts=!1;if(process.env.OPEN_MEM_CONTEXT_TYPES)e.contextObservationTypes=process.env.OPEN_MEM_CONTEXT_TYPES==="all"?"all":process.env.OPEN_MEM_CONTEXT_TYPES.split(",").map((s)=>s.trim());if(process.env.OPEN_MEM_CONTEXT_FULL_COUNT)e.contextFullObservationCount=Number.parseInt(process.env.OPEN_MEM_CONTEXT_FULL_COUNT,10);if(process.env.OPEN_MEM_MAX_OBSERVATIONS)e.maxObservations=Number.parseInt(process.env.OPEN_MEM_MAX_OBSERVATIONS,10);if(process.env.OPEN_MEM_CONTEXT_SHOW_LAST_SUMMARY==="false")e.contextShowLastSummary=!1;if(process.env.OPEN_MEM_RATE_LIMITING==="false")e.rateLimitingEnabled=!1;if(process.env.OPEN_MEM_FOLDER_CONTEXT==="false")e.folderContextEnabled=!1;if(process.env.OPEN_MEM_FOLDER_CONTEXT_MAX_DEPTH)e.folderContextMaxDepth=Number.parseInt(process.env.OPEN_MEM_FOLDER_CONTEXT_MAX_DEPTH,10);if(process.env.OPEN_MEM_FOLDER_CONTEXT_MODE==="single")e.folderContextMode="single";if(process.env.OPEN_MEM_FOLDER_CONTEXT_MODE==="dispersed")e.folderContextMode="dispersed";if(process.env.OPEN_MEM_FOLDER_CONTEXT_FILENAME)e.folderContextFilename=process.env.OPEN_MEM_FOLDER_CONTEXT_FILENAME;if(process.env.OPEN_MEM_DAEMON==="true")e.daemonEnabled=!0;if(process.env.OPEN_MEM_DASHBOARD==="true")e.dashboardEnabled=!0;if(process.env.OPEN_MEM_DASHBOARD_PORT)e.dashboardPort=Number.parseInt(process.env.OPEN_MEM_DASHBOARD_PORT,10);if(process.env.OPEN_MEM_PLATFORM_OPENCODE==="false")e.platformOpenCodeEnabled=!1;if(process.env.OPEN_MEM_PLATFORM_CLAUDE_CODE==="true")e.platformClaudeCodeEnabled=!0;if(process.env.OPEN_MEM_PLATFORM_CURSOR==="true")e.platformCursorEnabled=!0;if(process.env.OPEN_MEM_MCP_PROTOCOL_VERSION)e.mcpProtocolVersion=process.env.OPEN_MEM_MCP_PROTOCOL_VERSION;if(process.env.OPEN_MEM_MCP_SUPPORTED_PROTOCOLS)e.mcpSupportedProtocolVersions=process.env.OPEN_MEM_MCP_SUPPORTED_PROTOCOLS.split(",").map((s)=>s.trim()).filter(Boolean);if(process.env.OPEN_MEM_EMBEDDING_DIMENSION)e.embeddingDimension=Number.parseInt(process.env.OPEN_MEM_EMBEDDING_DIMENSION,10);if(process.env.OPEN_MEM_CONFLICT_RESOLUTION==="true")e.conflictResolutionEnabled=!0;if(process.env.OPEN_MEM_CONFLICT_BAND_LOW){let s=Number.parseFloat(process.env.OPEN_MEM_CONFLICT_BAND_LOW);if(!Number.isNaN(s))e.conflictSimilarityBandLow=s}if(process.env.OPEN_MEM_CONFLICT_BAND_HIGH){let s=Number.parseFloat(process.env.OPEN_MEM_CONFLICT_BAND_HIGH);if(!Number.isNaN(s))e.conflictSimilarityBandHigh=s}if(process.env.OPEN_MEM_USER_MEMORY==="true")e.userMemoryEnabled=!0;if(process.env.OPEN_MEM_USER_MEMORY_DB_PATH)e.userMemoryDbPath=process.env.OPEN_MEM_USER_MEMORY_DB_PATH;if(process.env.OPEN_MEM_USER_MEMORY_MAX_TOKENS)e.userMemoryMaxContextTokens=Number.parseInt(process.env.OPEN_MEM_USER_MEMORY_MAX_TOKENS,10);if(process.env.OPEN_MEM_RERANKING==="true")e.rerankingEnabled=!0;if(process.env.OPEN_MEM_RERANKING_MAX_CANDIDATES)e.rerankingMaxCandidates=Number.parseInt(process.env.OPEN_MEM_RERANKING_MAX_CANDIDATES,10);if(process.env.OPEN_MEM_ENTITY_EXTRACTION==="true")e.entityExtractionEnabled=!0;if(process.env.OPEN_MEM_FALLBACK_PROVIDERS)e.fallbackProviders=process.env.OPEN_MEM_FALLBACK_PROVIDERS.split(",").map((s)=>s.trim()).filter(Boolean);if(process.env.OPEN_MEM_MODE)e.mode=process.env.OPEN_MEM_MODE;return e}function q(e){let s=`${e}/.open-mem/config.json`;if(!E(s))return{};try{let r=B(s,"utf-8"),i=JSON.parse(r);if(!i||typeof i!=="object"||Array.isArray(i))return{};return i}catch{return{}}}function z(e){switch(e){case"google":return 768;case"openai":return 1536;case"bedrock":return 1024;case"anthropic":return 0;case"openrouter":return 0;default:return 768}}function g(e,s){let r=q(e),i=N(),t={...J,...r,...i,...s};if(!t.dbPath.startsWith("/"))t.dbPath=`${e}/${t.dbPath}`;if(!process.env.OPEN_MEM_PROVIDER&&!s?.provider){if(process.env.GOOGLE_GENERATIVE_AI_API_KEY||process.env.GEMINI_API_KEY)t.provider="google";else if(process.env.ANTHROPIC_API_KEY)t.provider="anthropic";else if(process.env.AWS_BEARER_TOKEN_BEDROCK||process.env.AWS_ACCESS_KEY_ID||process.env.AWS_PROFILE)t.provider="bedrock";else if(process.env.OPENROUTER_API_KEY)t.provider="openrouter"}if(!t.apiKey)switch(t.provider){case"google":t.apiKey=process.env.GOOGLE_GENERATIVE_AI_API_KEY||process.env.GEMINI_API_KEY;break;case"anthropic":t.apiKey=process.env.ANTHROPIC_API_KEY;break;case"openai":t.apiKey=process.env.OPENAI_API_KEY;break;case"openrouter":t.apiKey=process.env.OPENROUTER_API_KEY;break;case"bedrock":break}if(t.provider==="openrouter"&&t.model==="gemini-2.5-flash-lite")t.model="google/gemini-2.5-flash-lite";if(t.embeddingDimension===void 0)t.embeddingDimension=z(t.provider);if(t.mode&&!h().includes(t.mode))t.mode="code";return t}import{existsSync as H}from"fs";import{dirname as I}from"path";class y{run(e){let s=[];return s.push(this.checkDbDir(e)),s.push(this.checkProviderConfig(e)),s.push(this.checkVectorSupport(e)),s.push(this.checkAdapters(e)),s.push(this.checkDashboardPort(e)),{ok:s.every((i)=>i.status!=="fail"),checks:s}}checkDbDir(e){let s=I(e.dbPath);return H(s)?{id:"db-dir",status:"pass",message:"Database directory exists.",details:{dir:s}}:{id:"db-dir",status:"warn",message:"Database directory does not exist yet. It will be created on first run.",details:{dir:s}}}checkProviderConfig(e){if(!e.compressionEnabled)return{id:"provider-config",status:"pass",message:"Compression is disabled; provider API key is optional."};if(e.provider==="bedrock")return{id:"provider-config",status:"pass",message:"Bedrock provider selected; API key is not required."};if(!e.apiKey)return{id:"provider-config",status:"fail",message:"Compression is enabled but no provider API key is configured.",details:{provider:e.provider}};return{id:"provider-config",status:"pass",message:"Provider API key is configured.",details:{provider:e.provider}}}checkVectorSupport(e){if(!(e.provider==="google"||e.provider==="openai"||e.provider==="bedrock"))return{id:"vector-support",status:"warn",message:"Provider does not support embeddings; search will use FTS-only fallback.",details:{provider:e.provider}};return{id:"vector-support",status:"pass",message:"Provider supports embeddings.",details:{provider:e.provider,dimension:e.embeddingDimension}}}checkAdapters(e){let s=[["opencode",e.platformOpenCodeEnabled!==!1],["claude-code",e.platformClaudeCodeEnabled===!0],["cursor",e.platformCursorEnabled===!0]].filter(([,r])=>r);if(s.length===0)return{id:"adapters",status:"fail",message:"No platform adapters are enabled."};return{id:"adapters",status:"pass",message:`Enabled adapters: ${s.map(([r])=>r).join(", ")}`}}checkDashboardPort(e){if(!e.dashboardEnabled)return{id:"dashboard",status:"pass",message:"Dashboard is disabled."};if(e.dashboardPort<1||e.dashboardPort>65535)return{id:"dashboard",status:"fail",message:"Dashboard port is outside the valid range (1-65535).",details:{dashboardPort:e.dashboardPort}};return{id:"dashboard",status:"pass",message:"Dashboard port configuration looks valid.",details:{dashboardPort:e.dashboardPort}}}}import{spawnSync as m}from"child_process";import{dirname as K,resolve as k}from"path";function Q(e){try{let s=m("git",["rev-parse","--git-common-dir"],{cwd:e,encoding:"utf-8",timeout:5000});if(s.status!==0||!s.stdout)return null;let r=s.stdout.trim();if(r===".git")return null;let i=m("git",["rev-parse","--git-dir"],{cwd:e,encoding:"utf-8",timeout:5000});if(i.status!==0||!i.stdout)return null;let t=i.stdout.trim(),a=k(e,r),d=k(e,t);if(a===d)return null;let o=K(a);if(o===a||o==="/")return null;return o}catch{return null}}function C(e){return Q(e)??e}var{values:f}=W({args:Bun.argv.slice(2),options:{project:{type:"string",short:"p"},json:{type:"boolean",default:!1}},allowPositionals:!1}),X=typeof f.project==="string"?f.project:process.cwd(),Y=C(X),Z=g(Y),c=new y().run(Z);if(f.json)console.log(JSON.stringify(c,null,2)),process.exit(c.ok?0:1);for(let e of c.checks){let s=e.status==="pass"?"\u2705":e.status==="warn"?"\u26A0\uFE0F":"\u274C";if(console.log(`${s} ${e.id}: ${e.message}`),e.details)console.log(` ${JSON.stringify(e.details)}`)}if(!c.ok)console.error(`
4
+ open-mem doctor found blocking issues.`),process.exit(1);console.log(`
5
+ open-mem doctor: all critical checks passed.`);
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AA+CA,OAAO,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AA2ClD;;;GAGG;AACH,wBAA8B,MAAM,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,CA0RvE"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAgDA,OAAO,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AA2ClD;;;GAGG;AACH,wBAA8B,MAAM,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,CA4RvE"}