@t0ken.ai/memoryx-openclaw-plugin 2.2.49 → 2.2.53

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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAmDH,UAAU,YAAY;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mCAAmC;IACnC,aAAa,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,UAAU,YAAY;IAClB,QAAQ,EAAE,KAAK,CAAC;QACZ,EAAE,EAAE,MAAM,CAAC;QACX,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,MAAM,CAAC;KACjB,CAAC,CAAC;IACH,eAAe,EAAE,KAAK,CAAC;QACnB,EAAE,EAAE,MAAM,CAAC;QACX,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,MAAM,CAAC;KACjB,CAAC,CAAC;IACH,SAAS,EAAE,OAAO,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;CACxB;AAqDD,cAAM,aAAa;IACf,OAAO,CAAC,YAAY,CAA2B;IAC/C,OAAO,CAAC,WAAW,CAAkB;IACrC,OAAO,CAAC,aAAa,CAAkB;gBAE3B,YAAY,CAAC,EAAE,YAAY;IAIjC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAad,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC;IAUpC,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IA6B1D,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,GAAE,MAAU,GAAG,OAAO,CAAC,YAAY,CAAC;IAyC/D,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;IAYhC,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAc1C,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAcvE,IAAI,CAAC,KAAK,GAAE,MAAW,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAiBxC,cAAc,IAAI,OAAO,CAAC;QACnC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;QACtB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;QACvB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;QACzB,WAAW,EAAE,OAAO,CAAC;QACrB,KAAK,CAAC,EAAE,GAAG,CAAC;KACf,CAAC;IAwBW,cAAc,IAAI,OAAO,CAAC;QACnC,OAAO,EAAE,OAAO,CAAC;QACjB,IAAI,CAAC,EAAE;YACH,QAAQ,EAAE,MAAM,CAAC;YACjB,IAAI,EAAE,MAAM,CAAC;YACb,UAAU,EAAE,MAAM,CAAC;YACnB,YAAY,EAAE,MAAM,CAAC;YACrB,iBAAiB,EAAE,MAAM,CAAC;YAC1B,gBAAgB,EAAE,MAAM,CAAC;YACzB,mBAAmB,EAAE,MAAM,CAAC;YAC5B,MAAM,EAAE,MAAM,CAAC;YACf,OAAO,EAAE,MAAM,CAAC;SACnB,CAAC;QACF,KAAK,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;CAcL;;;;;;kBAUiB,GAAG,iBAAiB,YAAY,GAAG,IAAI;;AANzD,wBAm7BE;AAEF,OAAO,EAAE,aAAa,EAAE,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAmDH,UAAU,YAAY;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mCAAmC;IACnC,aAAa,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,UAAU,YAAY;IAClB,QAAQ,EAAE,KAAK,CAAC;QACZ,EAAE,EAAE,MAAM,CAAC;QACX,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,MAAM,CAAC;KACjB,CAAC,CAAC;IACH,eAAe,EAAE,KAAK,CAAC;QACnB,EAAE,EAAE,MAAM,CAAC;QACX,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,MAAM,CAAC;KACjB,CAAC,CAAC;IACH,SAAS,EAAE,OAAO,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;CACxB;AAqDD,cAAM,aAAa;IACf,OAAO,CAAC,YAAY,CAA2B;IAC/C,OAAO,CAAC,WAAW,CAAkB;IACrC,OAAO,CAAC,aAAa,CAAkB;gBAE3B,YAAY,CAAC,EAAE,YAAY;IAIjC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAad,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC;IAUpC,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IA6B1D,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,GAAE,MAAU,GAAG,OAAO,CAAC,YAAY,CAAC;IAyC/D,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;IAYhC,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAc1C,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAcvE,IAAI,CAAC,KAAK,GAAE,MAAW,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAiBxC,cAAc,IAAI,OAAO,CAAC;QACnC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;QACtB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;QACvB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;QACzB,WAAW,EAAE,OAAO,CAAC;QACrB,KAAK,CAAC,EAAE,GAAG,CAAC;KACf,CAAC;IAwBW,cAAc,IAAI,OAAO,CAAC;QACnC,OAAO,EAAE,OAAO,CAAC;QACjB,IAAI,CAAC,EAAE;YACH,QAAQ,EAAE,MAAM,CAAC;YACjB,IAAI,EAAE,MAAM,CAAC;YACb,UAAU,EAAE,MAAM,CAAC;YACnB,YAAY,EAAE,MAAM,CAAC;YACrB,iBAAiB,EAAE,MAAM,CAAC;YAC1B,gBAAgB,EAAE,MAAM,CAAC;YACzB,mBAAmB,EAAE,MAAM,CAAC;YAC5B,MAAM,EAAE,MAAM,CAAC;YACf,OAAO,EAAE,MAAM,CAAC;SACnB,CAAC;QACF,KAAK,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;CAcL;;;;;;kBAUiB,GAAG,iBAAiB,YAAY,GAAG,IAAI;;AANzD,wBAmgCE;AAEF,OAAO,EAAE,aAAa,EAAE,CAAC"}
package/dist/index.js CHANGED
@@ -27,7 +27,7 @@ import * as path from "path";
27
27
  import * as os from "os";
28
28
  import * as http from "http";
29
29
  // 插件版本号 - 由 prebuild 脚本自动从 package.json 同步
30
- const PLUGIN_VERSION = "2.2.49";
30
+ const PLUGIN_VERSION = "2.2.53";
31
31
  const DEFAULT_API_BASE = "https://t0ken.ai/api";
32
32
  const PLUGIN_DIR = path.join(os.homedir(), ".openclaw", "extensions", "memoryx-openclaw-plugin");
33
33
  let logStream = null;
@@ -661,6 +661,11 @@ export default {
661
661
  // IMPORTANT: 对话流走的是 before_agent_start 事件,不是 message_received!
662
662
  // message_received 只在 auto-reply 功能中触发
663
663
  api.on("before_agent_start", async (event, ctx) => {
664
+ const keys = event && typeof event === 'object' ? Object.keys(event).join(', ') : 'n/a';
665
+ const model = event?.model ?? event?.resolvedModel ?? 'undefined';
666
+ const provider = event?.provider ?? event?.resolvedProvider ?? 'undefined';
667
+ api.logger.info(`[MemoryX] 📋 [after resolve? before_agent_start] event keys: ${keys} | model: ${model} | provider: ${provider}`);
668
+ log(`[before_agent_start] model=${model} provider=${provider}`);
664
669
  const { prompt } = event;
665
670
  if (!prompt || prompt.length < 2 || !plugin)
666
671
  return;
@@ -748,27 +753,47 @@ export default {
748
753
  }
749
754
  return credentials;
750
755
  }
751
- // 获取所有可用的 provider 列表(按优先级排序)
756
+ // 获取所有可用的 provider/model 列表(用于服务端回落与重试)
757
+ // 把所有配置了的 provider 及其所有 model 都传给服务端,服务端可按顺序 fallback
752
758
  function getAvailableProviders(credentials) {
753
759
  const result = [];
754
760
  for (const [providerId, creds] of credentials) {
755
761
  if (creds.models && creds.models.length > 0) {
756
- result.push({
757
- provider: providerId,
758
- model: creds.models[0].id,
759
- });
762
+ for (const m of creds.models) {
763
+ const id = m.id || m.name;
764
+ if (id) {
765
+ result.push({ provider: providerId, model: id });
766
+ }
767
+ }
768
+ }
769
+ else {
770
+ // 无 models 列表时仍传该 provider,用空 model 占位,服务端可忽略或按 provider 默认处理
771
+ result.push({ provider: providerId, model: '' });
760
772
  }
761
773
  }
762
774
  return result;
763
775
  }
764
- // 获取默认的 model provider(第一个可用的)
776
+ // 用于默认首选:每个 provider 只取第一个 model,保证 default 有效
777
+ function getDefaultProviderModelList(credentials) {
778
+ const result = [];
779
+ for (const [providerId, creds] of credentials) {
780
+ if (creds.models?.length) {
781
+ const id = creds.models[0].id || creds.models[0].name;
782
+ if (id)
783
+ result.push({ provider: providerId, model: id });
784
+ }
785
+ }
786
+ return result;
787
+ }
788
+ // 获取默认的 model 和 provider(第一个可用的),以及完整列表供服务端 fallback
765
789
  const getDefaultModelAndProvider = (credentials) => {
766
- const available = getAvailableProviders(credentials);
767
- if (available.length > 0) {
790
+ const defaultList = getDefaultProviderModelList(credentials);
791
+ const availableAll = getAvailableProviders(credentials);
792
+ if (defaultList.length > 0) {
768
793
  return {
769
- model: available[0].model,
770
- provider: available[0].provider,
771
- availableProviders: available
794
+ model: defaultList[0].model,
795
+ provider: defaultList[0].provider,
796
+ availableProviders: availableAll // 全部可用的 provider/model 供服务端回落
772
797
  };
773
798
  }
774
799
  // 回退到 agents.defaults
@@ -797,15 +822,10 @@ export default {
797
822
  log(`[Proxy] Found ${providerCredentials.size} providers in config`);
798
823
  const defaultProvider = getDefaultModelAndProvider(providerCredentials);
799
824
  log(`[Proxy] Default: ${defaultProvider.provider}/${defaultProvider.model}`);
800
- // 虚拟模型定义
801
- //
802
- // OpenClaw 的 resolveModel 查找逻辑:
803
- // inlineModels.find(entry => entry.provider === provider && entry.id === modelId)
804
- //
805
- // before_model_resolve 返回 { providerOverride: 'memoryx-proxy', modelOverride: 'auto' }
806
- // 所以 modelId = 'auto',VIRTUAL_MODEL.id 必须是 'auto'!
825
+ // 虚拟模型定义(与 SlimClaw 一致:主 id 用完整 "provider/model" 字符串)
826
+ // OpenClaw 报错 "Unknown model: memoryx-proxy/auto" 说明按完整 id 查找,故主 id 为 memoryx-proxy/auto
807
827
  const VIRTUAL_MODEL = {
808
- id: 'auto', // ← 必须等于 modelOverride,不带 provider 前缀!
828
+ id: 'memoryx-proxy/auto',
809
829
  name: 'MemoryX Auto Router',
810
830
  api: 'openai-completions',
811
831
  reasoning: true,
@@ -814,6 +834,11 @@ export default {
814
834
  contextWindow: 200000,
815
835
  maxTokens: 16384,
816
836
  };
837
+ // 兼容按 provider+model 拆开查找的版本:同时注册 id=auto,便于 entry.id === modelOverride 匹配
838
+ const VIRTUAL_MODELS = [
839
+ VIRTUAL_MODEL,
840
+ { ...VIRTUAL_MODEL, id: 'auto' },
841
+ ];
817
842
  const SIDECAR_PORT = 3335;
818
843
  const PROXY_URL = (pluginConfig?.apiBaseUrl || DEFAULT_API_BASE) + '/openclaw/proxy/chat/completions';
819
844
  class SidecarServer {
@@ -834,12 +859,8 @@ export default {
834
859
  });
835
860
  this.server.on('error', (err) => {
836
861
  if (err.code === 'EADDRINUSE') {
837
- log(`[Sidecar] Port ${SIDECAR_PORT} already in use, trying next...`);
838
- // Try next port
839
- this.server.listen(SIDECAR_PORT + 1, () => {
840
- log(`[Sidecar] Started on port ${SIDECAR_PORT + 1}`);
841
- resolve();
842
- });
862
+ log(`[Sidecar] Port ${SIDECAR_PORT} already in use. MemoryX proxy baseUrl is fixed to this port - please free the port or disable another service.`);
863
+ reject(new Error(`Port ${SIDECAR_PORT} already in use. Free the port or set OpenClaw to use a different model.`));
843
864
  }
844
865
  else {
845
866
  reject(err);
@@ -1025,20 +1046,36 @@ export default {
1025
1046
  // =========================================================================
1026
1047
  // 关键:动态注入 provider 配置到 api.config
1027
1048
  //
1028
- // resolveModel() 只从 cfg.models.providers 查找 provider,
1029
- // 不会查找 registerProvider() 注册的 providers
1030
- // 所以必须在 config 中注入 provider 配置。
1049
+ // 部分 OpenClaw 版本中 resolveModel() 只从 cfg.models.providers 查找,
1050
+ // 不会使用 registerProvider() 注册的 providers,故此处注入 config。
1051
+ // 若虚拟厂商仍不可用,请在 OpenClaw 配置中显式添加:
1052
+ // models.providers["memoryx-proxy"]: { baseUrl: "http://localhost:3335/v1", api: "openai-completions", models: [{ id: "memoryx-proxy/auto", name: "MemoryX Auto", ... }] }
1031
1053
  // =========================================================================
1054
+ // ---------- 日志:写 config 前 ----------
1055
+ api.logger.info(`[MemoryX] 📋 [1] Before config write - api.config exists: ${!!api.config}`);
1056
+ api.logger.info(`[MemoryX] 📋 [1] Before config write - api.config?.models?.providers keys: ${api.config?.models?.providers ? Object.keys(api.config.models.providers).join(', ') : 'N/A'}`);
1057
+ if (api.config?.models?.providers) {
1058
+ for (const [pid, p] of Object.entries(api.config.models.providers)) {
1059
+ const models = p?.models;
1060
+ const modelIds = models?.map((m) => m?.id ?? m?.name ?? '?').join(', ') ?? 'none';
1061
+ api.logger.info(`[MemoryX] 📋 [1] Before config write - provider "${pid}" models: [${modelIds}]`);
1062
+ }
1063
+ }
1032
1064
  if (api.config?.models?.providers) {
1033
1065
  api.config.models.providers['memoryx-proxy'] = {
1034
1066
  baseUrl: `http://localhost:${SIDECAR_PORT}/v1`,
1035
1067
  api: 'openai-completions',
1036
- models: [VIRTUAL_MODEL]
1068
+ models: VIRTUAL_MODELS
1037
1069
  };
1038
1070
  api.logger.info('[MemoryX] ✅ Injected memoryx-proxy into config.models.providers');
1071
+ api.logger.info(`[MemoryX] 📋 [2] After config write - providers keys: ${Object.keys(api.config.models.providers).join(', ')}`);
1072
+ const mx = api.config.models.providers['memoryx-proxy'];
1073
+ if (mx?.models) {
1074
+ const ids = mx.models.map((m) => m?.id ?? '?').join(', ');
1075
+ api.logger.info(`[MemoryX] 📋 [2] After config write - memoryx-proxy model ids: [${ids}]`);
1076
+ }
1039
1077
  }
1040
1078
  else if (api.config) {
1041
- // 确保 models.providers 存在
1042
1079
  if (!api.config.models) {
1043
1080
  api.config.models = {};
1044
1081
  }
@@ -1048,23 +1085,26 @@ export default {
1048
1085
  api.config.models.providers['memoryx-proxy'] = {
1049
1086
  baseUrl: `http://localhost:${SIDECAR_PORT}/v1`,
1050
1087
  api: 'openai-completions',
1051
- models: [VIRTUAL_MODEL]
1088
+ models: VIRTUAL_MODELS
1052
1089
  };
1053
1090
  api.logger.info('[MemoryX] ✅ Created and injected memoryx-proxy into config.models.providers');
1091
+ api.logger.info(`[MemoryX] 📋 [2] After config write - memoryx-proxy model ids: [${VIRTUAL_MODELS.map(m => m.id).join(', ')}]`);
1054
1092
  }
1055
1093
  else {
1056
1094
  api.logger.warn('[MemoryX] ⚠️ api.config not available - resolveModel may fail to find memoryx-proxy');
1057
1095
  }
1058
1096
  // 注册 Provider - 完全对齐 SlimClaw 格式
1097
+ const registeredModelIds = VIRTUAL_MODELS.map(m => m.id).join(', ');
1098
+ api.logger.info(`[MemoryX] 📋 [3] Before registerProvider - will register id=memoryx-proxy, model ids: [${registeredModelIds}]`);
1059
1099
  api.registerProvider({
1060
1100
  id: 'memoryx-proxy',
1061
1101
  label: 'MemoryX Proxy Provider',
1062
1102
  aliases: ['mx'],
1063
- envVars: [], // No own API keys - delegates to downstream providers
1103
+ envVars: [],
1064
1104
  models: {
1065
1105
  baseUrl: `http://localhost:${SIDECAR_PORT}/v1`,
1066
1106
  api: 'openai-completions',
1067
- models: [VIRTUAL_MODEL],
1107
+ models: VIRTUAL_MODELS,
1068
1108
  },
1069
1109
  auth: [{
1070
1110
  id: 'none',
@@ -1076,17 +1116,58 @@ export default {
1076
1116
  }),
1077
1117
  }],
1078
1118
  });
1079
- api.logger.info('[MemoryX] 🔄 Proxy provider registered: memoryx-proxy');
1080
- // before_model_resolve 钩子 - 自动拦截所有请求,无需用户配置
1081
- // MemoryX 自动拦截所有请求,用户完全不需要配置
1119
+ api.logger.info(`[MemoryX] 📋 [3] After registerProvider - registered memoryx-proxy with models: [${registeredModelIds}]`);
1120
+ // 延迟再读一次 config,检查是否被后续逻辑覆盖
1121
+ setImmediate(() => {
1122
+ api.logger.info(`[MemoryX] 📋 [4] setImmediate(after register) - api.config?.models?.providers keys: ${api.config?.models?.providers ? Object.keys(api.config.models.providers).join(', ') : 'N/A'}`);
1123
+ if (api.config?.models?.providers) {
1124
+ const mx = api.config.models.providers['memoryx-proxy'];
1125
+ if (mx) {
1126
+ const ids = mx.models?.map((m) => m?.id ?? '?').join(', ') ?? 'none';
1127
+ api.logger.info(`[MemoryX] 📋 [4] setImmediate - memoryx-proxy still present, model ids: [${ids}]`);
1128
+ }
1129
+ else {
1130
+ api.logger.warn('[MemoryX] 📋 [4] setImmediate - memoryx-proxy MISSING from config (may have been overwritten)');
1131
+ }
1132
+ for (const [pid, p] of Object.entries(api.config.models.providers)) {
1133
+ const models = p?.models;
1134
+ const modelIds = models?.map((m) => m?.id ?? '?').join(', ') ?? 'none';
1135
+ api.logger.info(`[MemoryX] 📋 [4] setImmediate - provider "${pid}" models: [${modelIds}]`);
1136
+ }
1137
+ }
1138
+ });
1139
+ setTimeout(() => {
1140
+ api.logger.info(`[MemoryX] 📋 [5] setTimeout(500ms) - api.config?.models?.providers keys: ${api.config?.models?.providers ? Object.keys(api.config.models.providers).join(', ') : 'N/A'}`);
1141
+ if (api.config?.models?.providers) {
1142
+ const mx = api.config.models.providers['memoryx-proxy'];
1143
+ if (mx) {
1144
+ const ids = mx.models?.map((m) => m?.id ?? '?').join(', ') ?? 'none';
1145
+ api.logger.info(`[MemoryX] 📋 [5] setTimeout(500ms) - memoryx-proxy still present, model ids: [${ids}]`);
1146
+ }
1147
+ else {
1148
+ api.logger.warn('[MemoryX] 📋 [5] setTimeout(500ms) - memoryx-proxy MISSING (overwritten after load)');
1149
+ }
1150
+ }
1151
+ }, 500);
1152
+ // before_model_resolve 钩子 - 自动拦截所有请求
1082
1153
  api.on('before_model_resolve', (event, ctx) => {
1083
1154
  const originalModel = event.model || 'unknown';
1155
+ const eventKeys = event && typeof event === 'object' ? Object.keys(event).join(', ') : 'n/a';
1156
+ api.logger.info(`[MemoryX] 📋 [before_model_resolve] event keys: ${eventKeys} | original model: ${originalModel} → returning providerOverride=memoryx-proxy, modelOverride=auto`);
1084
1157
  log(`[before_model_resolve] Intercepting: ${originalModel} → memoryx-proxy/auto`);
1085
1158
  return {
1086
1159
  providerOverride: 'memoryx-proxy',
1087
1160
  modelOverride: 'auto'
1088
1161
  };
1089
1162
  });
1163
+ // resolve 之后:在 llm_input 打日志(此处应有已解析的 model/provider)
1164
+ api.on('llm_input', (event, ctx) => {
1165
+ const keys = event && typeof event === 'object' ? Object.keys(event).join(', ') : 'n/a';
1166
+ const model = event?.model ?? event?.resolvedModel ?? 'undefined';
1167
+ const provider = event?.provider ?? event?.resolvedProvider ?? 'undefined';
1168
+ api.logger.info(`[MemoryX] 📋 [after resolve? llm_input] event keys: ${keys} | model: ${model} | provider: ${provider}`);
1169
+ log(`[llm_input] model=${model} provider=${provider}`);
1170
+ });
1090
1171
  api.logger.info('[MemoryX] 🔄 Auto-intercept enabled - ALL requests go through MemoryX Proxy');
1091
1172
  api.logger.info(`[MemoryX] ✅ Plugin v${PLUGIN_VERSION} ready! Your conversations will be remembered automatically.`);
1092
1173
  // Async check and show portal link after SDK initializes
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "id": "memoryx-openclaw-plugin",
3
3
  "name": "MemoryX Real-time Plugin",
4
- "version": "2.2.18",
4
+ "version": "2.2.53",
5
5
  "description": "Real-time memory capture and recall for OpenClaw",
6
6
  "kind": "memory",
7
7
  "main": "./dist/index.js",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@t0ken.ai/memoryx-openclaw-plugin",
3
- "version": "2.2.49",
3
+ "version": "2.2.53",
4
4
  "description": "MemoryX real-time memory capture and recall plugin for OpenClaw (powered by @t0ken.ai/memoryx-sdk)",
5
5
  "type": "module",
6
6
  "author": "MemoryX Team",