diff --git a/capabilities.mjs b/capabilities.mjs index 1f33fc2..1344ce7 100644 --- a/capabilities.mjs +++ b/capabilities.mjs @@ -183,6 +183,15 @@ export function resolveExcelMcpServerPath(overridePath, runtimeRoot) { ); } +/** Prefer explicit env overrides; TKMIND_* matches search MCP naming on 103/.env. */ +export function resolveExcelMcpOverridePath(env = process.env) { + return String( + env.GOOSED_EXCEL_MCP_SERVER_PATH + ?? env.TKMIND_EXCEL_MCP_SERVER_PATH + ?? '', + ).trim(); +} + function isGoosedMcpContainerized(sandboxMcp = null) { const containerFlag = String(process.env.GOOSED_MCP_CONTAINERIZED ?? '').trim(); if (containerFlag) return containerFlag === '1'; @@ -852,7 +861,7 @@ export function buildAgentExtensionPolicy( cmd: resolveSandboxMcpNodeExecPath(sandboxMcp?.nodeExecPath), args: [ resolveExcelMcpServerPath( - process.env.GOOSED_EXCEL_MCP_SERVER_PATH, + resolveExcelMcpOverridePath(), bundledMcpRuntimeRoot, ), excelWorkspaceRoot, diff --git a/capabilities.test.mjs b/capabilities.test.mjs index a0faab1..d4d06d1 100644 --- a/capabilities.test.mjs +++ b/capabilities.test.mjs @@ -10,6 +10,7 @@ import { normalizeCapabilityPatch, resolveMindSearchMcpEndpoint, resolveExcelMcpServerPath, + resolveExcelMcpOverridePath, resolveMindSearchMcpServerPath, resolveSandboxMcpNodeExecPath, resolveSandboxMcpServerPath, @@ -710,3 +711,43 @@ test('Excel analyst uses the container-visible bundled MCP directory', () => { const extension = policy.extensionOverrides.find((ext) => ext.name === 'tkmind-excel'); assert.equal(extension.args[0], '/opt/portal/tkmind-excel-mcp.mjs'); }); + +test('resolveExcelMcpOverridePath prefers GOOSED then TKMIND env', () => { + assert.equal( + resolveExcelMcpOverridePath({ + GOOSED_EXCEL_MCP_SERVER_PATH: '/opt/goosed/tkmind-excel-mcp.mjs', + TKMIND_EXCEL_MCP_SERVER_PATH: '/opt/tkmind/tkmind-excel-mcp.mjs', + }), + '/opt/goosed/tkmind-excel-mcp.mjs', + ); + assert.equal( + resolveExcelMcpOverridePath({ + TKMIND_EXCEL_MCP_SERVER_PATH: '/Users/john/Project/Memind/tkmind-excel-mcp.mjs', + }), + '/Users/john/Project/Memind/tkmind-excel-mcp.mjs', + ); +}); + +test('Excel analyst honors TKMIND_EXCEL_MCP_SERVER_PATH override', () => { + const previous = process.env.TKMIND_EXCEL_MCP_SERVER_PATH; + process.env.TKMIND_EXCEL_MCP_SERVER_PATH = '/srv/memind/tkmind-excel-mcp.mjs'; + try { + const policy = buildAgentExtensionPolicy( + { + ...DEFAULT_USER_CAPABILITIES, + excel_analysis: true, + }, + { + sandboxMcp: { + serverPath: '/Users/john/Project/Memind/mindspace-sandbox-mcp.mjs', + workspaceRoot: '/Users/john/Project/Memind/MindSpace/user-1', + }, + }, + ); + const extension = policy.extensionOverrides.find((ext) => ext.name === 'tkmind-excel'); + assert.equal(extension.args[0], '/srv/memind/tkmind-excel-mcp.mjs'); + } finally { + if (previous === undefined) delete process.env.TKMIND_EXCEL_MCP_SERVER_PATH; + else process.env.TKMIND_EXCEL_MCP_SERVER_PATH = previous; + } +}); diff --git a/scripts/agent-run-worker.mjs b/scripts/agent-run-worker.mjs index fdafcc3..7e240cf 100644 --- a/scripts/agent-run-worker.mjs +++ b/scripts/agent-run-worker.mjs @@ -95,6 +95,11 @@ function printHelp() { loadEnvFile(process.env.MEMIND_ENV_FILE || path.join(root, '.env')); loadEnvFile(path.join(root, '.env.local')); +// Bundled worker lives under scripts/; MCP path resolution must not use that +// directory as the portal runtime root (see resolveBundledMcpServerPath). +if (!String(process.env.MEMIND_PORTAL_H5_ROOT ?? '').trim()) { + process.env.MEMIND_PORTAL_H5_ROOT = root; +} const args = parseArgs(process.argv.slice(2)); if (args.help) {