@t0ken.ai/memoryx-openclaw-plugin 2.2.50 → 2.2.55

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,wBA6gCE;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.55";
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: '' });
772
+ }
773
+ }
774
+ return result;
775
+ }
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 });
760
784
  }
761
785
  }
762
786
  return result;
763
787
  }
764
- // 获取默认的 model 和 provider(第一个可用的)
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
+ // 虚拟模型定义:只使用 id='auto',让 OpenClaw 用 provider+'/'+model.id 得到 fullId 'memoryx-proxy/auto'
826
+ // (若用 id='memoryx-proxy/auto',部分实现会拼成 'memoryx-proxy/memoryx-proxy/auto' 导致找不到)
807
827
  const VIRTUAL_MODEL = {
808
- id: 'auto', // ← 必须等于 modelOverride,不带 provider 前缀!
828
+ id: 'auto',
809
829
  name: 'MemoryX Auto Router',
810
830
  api: 'openai-completions',
811
831
  reasoning: true,
@@ -814,6 +834,7 @@ export default {
814
834
  contextWindow: 200000,
815
835
  maxTokens: 16384,
816
836
  };
837
+ const VIRTUAL_MODELS = [VIRTUAL_MODEL];
817
838
  const SIDECAR_PORT = 3335;
818
839
  const PROXY_URL = (pluginConfig?.apiBaseUrl || DEFAULT_API_BASE) + '/openclaw/proxy/chat/completions';
819
840
  class SidecarServer {
@@ -834,12 +855,8 @@ export default {
834
855
  });
835
856
  this.server.on('error', (err) => {
836
857
  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
- });
858
+ log(`[Sidecar] Port ${SIDECAR_PORT} already in use. MemoryX proxy baseUrl is fixed to this port - please free the port or disable another service.`);
859
+ reject(new Error(`Port ${SIDECAR_PORT} already in use. Free the port or set OpenClaw to use a different model.`));
843
860
  }
844
861
  else {
845
862
  reject(err);
@@ -1025,26 +1042,36 @@ export default {
1025
1042
  // =========================================================================
1026
1043
  // 关键:动态注入 provider 配置到 api.config
1027
1044
  //
1028
- // resolveModel() 只从 cfg.models.providers 查找 provider,
1029
- // 不会查找 registerProvider() 注册的 providers
1030
- // 所以必须在 config 中注入 provider 配置。
1045
+ // 部分 OpenClaw 版本中 resolveModel() 只从 cfg.models.providers 查找,
1046
+ // 不会使用 registerProvider() 注册的 providers,故此处注入 config。
1047
+ // 若虚拟厂商仍不可用,请在 OpenClaw 配置中显式添加:
1048
+ // models.providers["memoryx-proxy"]: { baseUrl: "http://localhost:3335/v1", api: "openai-completions", models: [{ id: "auto", name: "MemoryX Auto", ... }] }
1031
1049
  // =========================================================================
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'}`);
1050
+ // ---------- 日志:写 config 前 ----------
1051
+ api.logger.info(`[MemoryX] 📋 [1] Before config write - api.config exists: ${!!api.config}`);
1052
+ 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'}`);
1053
+ if (api.config?.models?.providers) {
1054
+ for (const [pid, p] of Object.entries(api.config.models.providers)) {
1055
+ const models = p?.models;
1056
+ const modelIds = models?.map((m) => m?.id ?? m?.name ?? '?').join(', ') ?? 'none';
1057
+ api.logger.info(`[MemoryX] 📋 [1] Before config write - provider "${pid}" models: [${modelIds}]`);
1058
+ }
1059
+ }
1037
1060
  if (api.config?.models?.providers) {
1038
1061
  api.config.models.providers['memoryx-proxy'] = {
1039
1062
  baseUrl: `http://localhost:${SIDECAR_PORT}/v1`,
1040
1063
  api: 'openai-completions',
1041
- models: [VIRTUAL_MODEL]
1064
+ models: VIRTUAL_MODELS
1042
1065
  };
1043
1066
  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(', ')}`);
1067
+ api.logger.info(`[MemoryX] 📋 [2] After config write - providers keys: ${Object.keys(api.config.models.providers).join(', ')}`);
1068
+ const mx = api.config.models.providers['memoryx-proxy'];
1069
+ if (mx?.models) {
1070
+ const ids = mx.models.map((m) => m?.id ?? '?').join(', ');
1071
+ api.logger.info(`[MemoryX] 📋 [2] After config write - memoryx-proxy model ids: [${ids}]`);
1072
+ }
1045
1073
  }
1046
1074
  else if (api.config) {
1047
- // 确保 models.providers 存在
1048
1075
  if (!api.config.models) {
1049
1076
  api.config.models = {};
1050
1077
  }
@@ -1054,23 +1081,39 @@ export default {
1054
1081
  api.config.models.providers['memoryx-proxy'] = {
1055
1082
  baseUrl: `http://localhost:${SIDECAR_PORT}/v1`,
1056
1083
  api: 'openai-completions',
1057
- models: [VIRTUAL_MODEL]
1084
+ models: VIRTUAL_MODELS
1058
1085
  };
1059
1086
  api.logger.info('[MemoryX] ✅ Created and injected memoryx-proxy into config.models.providers');
1087
+ api.logger.info(`[MemoryX] 📋 [2] After config write - memoryx-proxy model ids: [${VIRTUAL_MODELS.map(m => m.id).join(', ')}]`);
1060
1088
  }
1061
1089
  else {
1062
1090
  api.logger.warn('[MemoryX] ⚠️ api.config not available - resolveModel may fail to find memoryx-proxy');
1063
1091
  }
1092
+ // 注入 agents.defaults,使 agent 默认使用 memoryx-proxy/auto(部分实现用 agent 的 model 参与解析/白名单)
1093
+ if (api.config) {
1094
+ if (!api.config.agents) {
1095
+ api.config.agents = {};
1096
+ }
1097
+ const agents = api.config.agents;
1098
+ if (!agents.defaults) {
1099
+ agents.defaults = {};
1100
+ }
1101
+ agents.defaults.provider = 'memoryx-proxy';
1102
+ agents.defaults.model = 'auto';
1103
+ api.logger.info('[MemoryX] 📋 Injected agents.defaults: provider=memoryx-proxy, model=auto');
1104
+ }
1064
1105
  // 注册 Provider - 完全对齐 SlimClaw 格式
1106
+ const registeredModelIds = VIRTUAL_MODELS.map(m => m.id).join(', ');
1107
+ api.logger.info(`[MemoryX] 📋 [3] Before registerProvider - will register id=memoryx-proxy, model ids: [${registeredModelIds}]`);
1065
1108
  api.registerProvider({
1066
1109
  id: 'memoryx-proxy',
1067
1110
  label: 'MemoryX Proxy Provider',
1068
1111
  aliases: ['mx'],
1069
- envVars: [], // No own API keys - delegates to downstream providers
1112
+ envVars: [],
1070
1113
  models: {
1071
1114
  baseUrl: `http://localhost:${SIDECAR_PORT}/v1`,
1072
1115
  api: 'openai-completions',
1073
- models: [VIRTUAL_MODEL],
1116
+ models: VIRTUAL_MODELS,
1074
1117
  },
1075
1118
  auth: [{
1076
1119
  id: 'none',
@@ -1082,17 +1125,58 @@ export default {
1082
1125
  }),
1083
1126
  }],
1084
1127
  });
1085
- api.logger.info('[MemoryX] 🔄 Proxy provider registered: memoryx-proxy');
1086
- // before_model_resolve 钩子 - 自动拦截所有请求,无需用户配置
1087
- // MemoryX 自动拦截所有请求,用户完全不需要配置
1128
+ api.logger.info(`[MemoryX] 📋 [3] After registerProvider - registered memoryx-proxy with models: [${registeredModelIds}]`);
1129
+ // 延迟再读一次 config,检查是否被后续逻辑覆盖
1130
+ setImmediate(() => {
1131
+ 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'}`);
1132
+ if (api.config?.models?.providers) {
1133
+ const mx = api.config.models.providers['memoryx-proxy'];
1134
+ if (mx) {
1135
+ const ids = mx.models?.map((m) => m?.id ?? '?').join(', ') ?? 'none';
1136
+ api.logger.info(`[MemoryX] 📋 [4] setImmediate - memoryx-proxy still present, model ids: [${ids}]`);
1137
+ }
1138
+ else {
1139
+ api.logger.warn('[MemoryX] 📋 [4] setImmediate - memoryx-proxy MISSING from config (may have been overwritten)');
1140
+ }
1141
+ for (const [pid, p] of Object.entries(api.config.models.providers)) {
1142
+ const models = p?.models;
1143
+ const modelIds = models?.map((m) => m?.id ?? '?').join(', ') ?? 'none';
1144
+ api.logger.info(`[MemoryX] 📋 [4] setImmediate - provider "${pid}" models: [${modelIds}]`);
1145
+ }
1146
+ }
1147
+ });
1148
+ setTimeout(() => {
1149
+ 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'}`);
1150
+ if (api.config?.models?.providers) {
1151
+ const mx = api.config.models.providers['memoryx-proxy'];
1152
+ if (mx) {
1153
+ const ids = mx.models?.map((m) => m?.id ?? '?').join(', ') ?? 'none';
1154
+ api.logger.info(`[MemoryX] 📋 [5] setTimeout(500ms) - memoryx-proxy still present, model ids: [${ids}]`);
1155
+ }
1156
+ else {
1157
+ api.logger.warn('[MemoryX] 📋 [5] setTimeout(500ms) - memoryx-proxy MISSING (overwritten after load)');
1158
+ }
1159
+ }
1160
+ }, 500);
1161
+ // before_model_resolve 钩子 - 自动拦截所有请求
1088
1162
  api.on('before_model_resolve', (event, ctx) => {
1089
1163
  const originalModel = event.model || 'unknown';
1164
+ const eventKeys = event && typeof event === 'object' ? Object.keys(event).join(', ') : 'n/a';
1165
+ api.logger.info(`[MemoryX] 📋 [before_model_resolve] event keys: ${eventKeys} | original model: ${originalModel} → returning providerOverride=memoryx-proxy, modelOverride=auto`);
1090
1166
  log(`[before_model_resolve] Intercepting: ${originalModel} → memoryx-proxy/auto`);
1091
1167
  return {
1092
1168
  providerOverride: 'memoryx-proxy',
1093
1169
  modelOverride: 'auto'
1094
1170
  };
1095
1171
  });
1172
+ // resolve 之后:在 llm_input 打日志(此处应有已解析的 model/provider)
1173
+ api.on('llm_input', (event, ctx) => {
1174
+ const keys = event && typeof event === 'object' ? Object.keys(event).join(', ') : 'n/a';
1175
+ const model = event?.model ?? event?.resolvedModel ?? 'undefined';
1176
+ const provider = event?.provider ?? event?.resolvedProvider ?? 'undefined';
1177
+ api.logger.info(`[MemoryX] 📋 [after resolve? llm_input] event keys: ${keys} | model: ${model} | provider: ${provider}`);
1178
+ log(`[llm_input] model=${model} provider=${provider}`);
1179
+ });
1096
1180
  api.logger.info('[MemoryX] 🔄 Auto-intercept enabled - ALL requests go through MemoryX Proxy');
1097
1181
  api.logger.info(`[MemoryX] ✅ Plugin v${PLUGIN_VERSION} ready! Your conversations will be remembered automatically.`);
1098
1182
  // 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.55",
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.55",
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",