@t0ken.ai/memoryx-openclaw-plugin 2.2.50 → 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,wBA27BE;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.50";
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,26 +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
  // =========================================================================
1032
- // 调试:检查 api.config 结构
1033
- api.logger.info(`[MemoryX] 🔍 api.config exists: ${!!api.config}`);
1034
- api.logger.info(`[MemoryX] 🔍 api.config.models exists: ${!!api.config?.models}`);
1035
- api.logger.info(`[MemoryX] 🔍 api.config.models.providers exists: ${!!api.config?.models?.providers}`);
1036
- api.logger.info(`[MemoryX] 🔍 api.config.models.providers keys: ${api.config?.models?.providers ? Object.keys(api.config.models.providers).join(', ') : 'N/A'}`);
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
+ }
1037
1064
  if (api.config?.models?.providers) {
1038
1065
  api.config.models.providers['memoryx-proxy'] = {
1039
1066
  baseUrl: `http://localhost:${SIDECAR_PORT}/v1`,
1040
1067
  api: 'openai-completions',
1041
- models: [VIRTUAL_MODEL]
1068
+ models: VIRTUAL_MODELS
1042
1069
  };
1043
1070
  api.logger.info('[MemoryX] ✅ Injected memoryx-proxy into config.models.providers');
1044
- api.logger.info(`[MemoryX] 🔍 After injection keys: ${Object.keys(api.config.models.providers).join(', ')}`);
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
+ }
1045
1077
  }
1046
1078
  else if (api.config) {
1047
- // 确保 models.providers 存在
1048
1079
  if (!api.config.models) {
1049
1080
  api.config.models = {};
1050
1081
  }
@@ -1054,23 +1085,26 @@ export default {
1054
1085
  api.config.models.providers['memoryx-proxy'] = {
1055
1086
  baseUrl: `http://localhost:${SIDECAR_PORT}/v1`,
1056
1087
  api: 'openai-completions',
1057
- models: [VIRTUAL_MODEL]
1088
+ models: VIRTUAL_MODELS
1058
1089
  };
1059
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(', ')}]`);
1060
1092
  }
1061
1093
  else {
1062
1094
  api.logger.warn('[MemoryX] ⚠️ api.config not available - resolveModel may fail to find memoryx-proxy');
1063
1095
  }
1064
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}]`);
1065
1099
  api.registerProvider({
1066
1100
  id: 'memoryx-proxy',
1067
1101
  label: 'MemoryX Proxy Provider',
1068
1102
  aliases: ['mx'],
1069
- envVars: [], // No own API keys - delegates to downstream providers
1103
+ envVars: [],
1070
1104
  models: {
1071
1105
  baseUrl: `http://localhost:${SIDECAR_PORT}/v1`,
1072
1106
  api: 'openai-completions',
1073
- models: [VIRTUAL_MODEL],
1107
+ models: VIRTUAL_MODELS,
1074
1108
  },
1075
1109
  auth: [{
1076
1110
  id: 'none',
@@ -1082,17 +1116,58 @@ export default {
1082
1116
  }),
1083
1117
  }],
1084
1118
  });
1085
- api.logger.info('[MemoryX] 🔄 Proxy provider registered: memoryx-proxy');
1086
- // before_model_resolve 钩子 - 自动拦截所有请求,无需用户配置
1087
- // 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 钩子 - 自动拦截所有请求
1088
1153
  api.on('before_model_resolve', (event, ctx) => {
1089
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`);
1090
1157
  log(`[before_model_resolve] Intercepting: ${originalModel} → memoryx-proxy/auto`);
1091
1158
  return {
1092
1159
  providerOverride: 'memoryx-proxy',
1093
1160
  modelOverride: 'auto'
1094
1161
  };
1095
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
+ });
1096
1171
  api.logger.info('[MemoryX] 🔄 Auto-intercept enabled - ALL requests go through MemoryX Proxy');
1097
1172
  api.logger.info(`[MemoryX] ✅ Plugin v${PLUGIN_VERSION} ready! Your conversations will be remembered automatically.`);
1098
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.50",
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",