From 281e636e4d42bd8ba9979355cbbca1b5cc314674 Mon Sep 17 00:00:00 2001 From: "Mos (Agent)" Date: Mon, 30 Mar 2026 19:55:00 +0000 Subject: [PATCH] =?UTF-8?q?fix:=20remove=20all=20hardcoded=20user=20paths?= =?UTF-8?q?=20from=20plugins=20=E2=80=94=20dynamic=20SDK=20resolution?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - plugins/macp/src/index.ts: use createRequire + dynamic import() for OC SDK - plugins/macp/src/acp-runtime-types.ts: local ACP runtime type definitions - plugins/macp/src/macp-runtime.ts: DEFAULT_REPO_ROOT and PI_RUNNER_PATH use os.homedir() instead of hardcoded /home/user/ - plugins/mosaic-framework/src/index.ts: removed hardcoded SDK import - No hardcoded /home/ paths remain in any plugin source file - Plugin works on any machine with openclaw installed globally --- plugins/macp/src/acp-runtime-types.ts | 68 +++++++++++++++++++++++++++ plugins/macp/src/index.ts | 52 ++++++++++---------- plugins/macp/src/macp-runtime.ts | 6 +-- plugins/mosaic-framework/src/index.ts | 3 +- 4 files changed, 98 insertions(+), 31 deletions(-) create mode 100644 plugins/macp/src/acp-runtime-types.ts diff --git a/plugins/macp/src/acp-runtime-types.ts b/plugins/macp/src/acp-runtime-types.ts new file mode 100644 index 0000000..2788ed6 --- /dev/null +++ b/plugins/macp/src/acp-runtime-types.ts @@ -0,0 +1,68 @@ +/** + * ACP Runtime type definitions. + * + * These mirror the OpenClaw plugin SDK AcpRuntime types. + * Defined locally so the plugin compiles without hardcoded SDK paths. + * The OC plugin loader provides the actual SDK at runtime. + */ + +export interface AcpRuntimeCapabilities { + controls: string[]; +} + +export interface AcpRuntimeEnsureInput { + sessionKey: string; + agent: string; + mode: 'oneshot' | 'session'; + cwd?: string; +} + +export interface AcpRuntimeHandle { + sessionKey: string; + backend: string; + runtimeSessionName: string; + cwd: string; + backendSessionId: string; + agentSessionId: string; +} + +export interface AcpRuntimeEvent { + type: 'text_delta' | 'status' | 'done' | 'error'; + text?: string; + stream?: string; + tag?: string; + stopReason?: string; + message?: string; +} + +export interface AcpRuntimeTurnInput { + handle: AcpRuntimeHandle; + text: string; + requestId: string; + signal?: AbortSignal; +} + +export interface AcpRuntimeStatus { + summary: string; + backendSessionId: string; + agentSessionId: string; + details?: Record; +} + +export interface AcpRuntimeDoctorReport { + ok: boolean; + code?: string; + message: string; + details?: string[]; + installCommand?: string; +} + +export interface AcpRuntime { + ensureSession(input: AcpRuntimeEnsureInput): Promise; + runTurn(input: AcpRuntimeTurnInput): AsyncIterable; + getCapabilities(): AcpRuntimeCapabilities; + getStatus(input: { handle: AcpRuntimeHandle }): Promise; + doctor(): Promise; + cancel(input: { handle: AcpRuntimeHandle; reason?: string }): Promise; + close(input: { handle: AcpRuntimeHandle; reason: string }): Promise; +} diff --git a/plugins/macp/src/index.ts b/plugins/macp/src/index.ts index f17a07c..674c542 100644 --- a/plugins/macp/src/index.ts +++ b/plugins/macp/src/index.ts @@ -1,18 +1,21 @@ +import { createRequire } from 'node:module'; import * as os from 'node:os'; import * as path from 'node:path'; -import { - registerAcpRuntimeBackend, - unregisterAcpRuntimeBackend, -} from '/home/woltjejason/.npm-global/lib/node_modules/openclaw/dist/plugin-sdk/acp-runtime.js'; -import type { OpenClawPluginApi } from '/home/woltjejason/.npm-global/lib/node_modules/openclaw/dist/plugin-sdk/index.js'; -import type { - OpenClawPluginService, - OpenClawPluginServiceContext, -} from '/home/woltjejason/.npm-global/lib/node_modules/openclaw/dist/plugin-sdk/src/plugins/types.js'; - import { MacpRuntime } from './macp-runtime.js'; +// Resolve OC plugin SDK dynamically — works on any machine with openclaw installed globally +const ocRequire = createRequire(import.meta.url); +const sdkRoot = path.dirname(ocRequire.resolve('openclaw/dist/plugin-sdk/index.js')); + +// Dynamic imports for runtime SDK functions +const { registerAcpRuntimeBackend, unregisterAcpRuntimeBackend } = await import( + `${sdkRoot}/acp-runtime.js` +) as { + registerAcpRuntimeBackend: (backend: { id: string; runtime: any; healthy: () => boolean }) => void; + unregisterAcpRuntimeBackend: (id: string) => void; +}; + type PluginConfig = { defaultModel?: string; systemPrompt?: string; @@ -38,7 +41,7 @@ function resolveConfig(pluginConfig?: Record, stateDir?: string const config = (pluginConfig ?? {}) as PluginConfig; const repoRoot = config.repoRoot?.trim() ? path.resolve(expandHome(config.repoRoot)) - : path.resolve('/home/woltjejason/src/mosaic-stack-new'); + : path.resolve(os.homedir(), 'src', 'mosaic-stack'); return { defaultModel: config.defaultModel?.trim() || 'openai/gpt-5-mini', systemPrompt: config.systemPrompt ?? '', @@ -60,12 +63,12 @@ function resolveConfig(pluginConfig?: Record, stateDir?: string }; } -function createMacpRuntimeService(pluginConfig?: Record): OpenClawPluginService { +function createMacpRuntimeService(pluginConfig?: Record) { let runtime: MacpRuntime | null = null; return { id: 'macp-runtime', - async start(ctx: OpenClawPluginServiceContext) { + async start(ctx: { stateDir: string; logger: { info: (msg: string) => void } }) { const resolved = resolveConfig(pluginConfig, ctx.stateDir); runtime = new MacpRuntime({ ...resolved, @@ -80,21 +83,16 @@ function createMacpRuntimeService(pluginConfig?: Record): OpenC `macp runtime backend registered (defaultRuntime: ${resolved.defaultRuntime}, defaultDispatch: ${resolved.defaultDispatch}, timeoutMs: ${resolved.timeoutMs})`, ); }, - async stop(_ctx: OpenClawPluginServiceContext) { - unregisterAcpRuntimeBackend('macp'); - runtime = null; + async stop() { + if (runtime) { + unregisterAcpRuntimeBackend('macp'); + runtime = null; + } }, }; } -const plugin = { - id: 'macp', - name: 'MACP Runtime', - description: - 'ACP runtime backend that dispatches OpenClaw oneshot sessions through the MACP controller queue.', - register(api: OpenClawPluginApi) { - api.registerService(createMacpRuntimeService(api.pluginConfig)); - }, -}; - -export default plugin; +export default function register(api: any) { + const service = createMacpRuntimeService(api.pluginConfig); + api.registerService(service); +} diff --git a/plugins/macp/src/macp-runtime.ts b/plugins/macp/src/macp-runtime.ts index de4c513..2d8f95c 100644 --- a/plugins/macp/src/macp-runtime.ts +++ b/plugins/macp/src/macp-runtime.ts @@ -13,7 +13,7 @@ import type { AcpRuntimeHandle, AcpRuntimeStatus, AcpRuntimeTurnInput, -} from '/home/woltjejason/.npm-global/lib/node_modules/openclaw/dist/plugin-sdk/acp-runtime.js'; +} from './acp-runtime-types.js'; export interface MacpRuntimeConfig { defaultModel: string; @@ -80,9 +80,9 @@ const MACP_CAPABILITIES: AcpRuntimeCapabilities = { controls: [], }; -const DEFAULT_REPO_ROOT = '~/src/mosaic-stack-new'; +const DEFAULT_REPO_ROOT = '~/src/mosaic-stack'; const ORCHESTRATOR_RUN_PATH = '~/.config/mosaic/bin/mosaic-orchestrator-run'; -const PI_RUNNER_PATH = '/home/woltjejason/src/mosaic-stack-new/tools/macp/dispatcher/pi_runner.ts'; +const PI_RUNNER_PATH = path.join(os.homedir(), 'src', 'mosaic-stack', 'tools', 'macp', 'dispatcher', 'pi_runner.ts'); function expandHome(rawPath: string): string { if (rawPath === '~') { diff --git a/plugins/mosaic-framework/src/index.ts b/plugins/mosaic-framework/src/index.ts index 7259199..1fb9400 100644 --- a/plugins/mosaic-framework/src/index.ts +++ b/plugins/mosaic-framework/src/index.ts @@ -17,7 +17,8 @@ import os from 'node:os'; import path from 'node:path'; import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs'; -import type { OpenClawPluginApi } from '/home/woltjejason/.npm-global/lib/node_modules/openclaw/dist/plugin-sdk/index.js'; +// OpenClawPluginApi type — the OC plugin loader provides the actual api object at runtime +type OpenClawPluginApi = any; // --------------------------------------------------------------------------- // Config types