@agent-vm/openclaw-mcp-portal-plugin 0.0.69 → 0.0.70
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.
- package/README.md +11 -14
- package/dist/index.d.ts +27 -57
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +213 -443
- package/dist/index.js.map +1 -1
- package/dist/openclaw.plugin.json +10 -2
- package/package.json +4 -4
package/README.md
CHANGED
|
@@ -1,26 +1,24 @@
|
|
|
1
1
|
# @agent-vm/openclaw-mcp-portal-plugin
|
|
2
2
|
|
|
3
|
-
OpenClaw plugin that
|
|
4
|
-
into the OpenClaw agent loop.
|
|
3
|
+
OpenClaw plugin that registers native MCP Portal tools and wires portal calls
|
|
4
|
+
directly into the OpenClaw agent loop.
|
|
5
5
|
|
|
6
6
|
## What This Package Owns
|
|
7
7
|
|
|
8
|
-
-
|
|
9
|
-
|
|
10
|
-
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
approval tokens to approved calls.
|
|
8
|
+
- Registers native OpenClaw tools for `mcp_portal_list`,
|
|
9
|
+
`mcp_portal_search`, `mcp_portal_describe`, and `mcp_portal_call`.
|
|
10
|
+
- Loads `/core` from the controller-materialized effective config directory.
|
|
11
|
+
- Registers `before_tool_call` to deny disallowed portal calls and request
|
|
12
|
+
OpenClaw approval when policy requires it.
|
|
14
13
|
- Registers `before_prompt_build` to inject scoped progressive-disclosure hints.
|
|
15
14
|
|
|
16
15
|
## Runtime Config
|
|
17
16
|
|
|
18
|
-
The OpenClaw plugin config should only carry
|
|
17
|
+
The OpenClaw plugin config should only carry the effective config directory:
|
|
19
18
|
|
|
20
19
|
```json
|
|
21
20
|
{
|
|
22
|
-
"configDir": "/home/openclaw/.openclaw/
|
|
23
|
-
"binPath": "/opt/agent-vm/portal/bin/agent-vm-mcp-portal-server"
|
|
21
|
+
"configDir": "/home/openclaw/.openclaw/cache/mcp-portal-effective"
|
|
24
22
|
}
|
|
25
23
|
```
|
|
26
24
|
|
|
@@ -29,7 +27,6 @@ Namespace/tool policy does not live in OpenClaw plugin config. It lives in
|
|
|
29
27
|
|
|
30
28
|
## Start Reading
|
|
31
29
|
|
|
32
|
-
- `src/plugin-registration.ts` for
|
|
33
|
-
- `src/
|
|
34
|
-
- `src/before-tool-call-handler.ts` for policy and approval-token behavior.
|
|
30
|
+
- `src/plugin-registration.ts` for native tool and hook registration.
|
|
31
|
+
- `src/before-tool-call-handler.ts` for policy and approval behavior.
|
|
35
32
|
- `src/before-prompt-build-handler.ts` for prompt context injection.
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { McpPortalConfig, ResolvedMcpPortalProfile } from "@agent-vm/config-contracts";
|
|
2
2
|
import { z } from "zod";
|
|
3
|
-
import { ChildProcess, SpawnOptions } from "node:child_process";
|
|
4
3
|
import { IncomingMessage, ServerResponse } from "node:http";
|
|
5
4
|
|
|
6
5
|
//#region src/openclaw-plugin-api.d.ts
|
|
@@ -8,6 +7,24 @@ interface OpenClawPromptHookContext {
|
|
|
8
7
|
readonly agentId?: string;
|
|
9
8
|
readonly appendPrompt?: (content: string) => void;
|
|
10
9
|
}
|
|
10
|
+
interface OpenClawPluginToolContext {
|
|
11
|
+
readonly agentId?: string;
|
|
12
|
+
readonly sessionId?: string;
|
|
13
|
+
readonly sessionKey?: string;
|
|
14
|
+
}
|
|
15
|
+
type OpenClawToolUpdateCallback = (update: unknown) => Promise<void> | void;
|
|
16
|
+
interface OpenClawToolRegistrationResult {
|
|
17
|
+
readonly content: string;
|
|
18
|
+
readonly details?: unknown;
|
|
19
|
+
}
|
|
20
|
+
interface OpenClawToolRegistration {
|
|
21
|
+
readonly description: string;
|
|
22
|
+
readonly execute: (toolCallId: string, params: unknown, signal?: AbortSignal, onUpdate?: OpenClawToolUpdateCallback) => Promise<OpenClawToolRegistrationResult>;
|
|
23
|
+
readonly label?: string;
|
|
24
|
+
readonly name: string;
|
|
25
|
+
readonly parameters: unknown;
|
|
26
|
+
}
|
|
27
|
+
type OpenClawToolFactory = (context: OpenClawPluginToolContext) => OpenClawToolRegistration | readonly OpenClawToolRegistration[] | null | undefined;
|
|
11
28
|
interface OpenClawPluginHookContext {
|
|
12
29
|
readonly agentId?: string;
|
|
13
30
|
readonly sessionId?: string;
|
|
@@ -98,6 +115,11 @@ interface OpenClawPortalPluginApi {
|
|
|
98
115
|
};
|
|
99
116
|
readonly pluginConfig?: unknown;
|
|
100
117
|
readonly registrationMode?: string;
|
|
118
|
+
readonly registerTool?: (tool: OpenClawToolRegistration | OpenClawToolFactory, options?: {
|
|
119
|
+
readonly name?: string;
|
|
120
|
+
readonly names?: readonly string[];
|
|
121
|
+
readonly optional?: boolean;
|
|
122
|
+
}) => void;
|
|
101
123
|
readonly registerRuntimeLifecycle?: OpenClawRuntimeLifecycleRegistrar;
|
|
102
124
|
readonly registerService?: (service: OpenClawPluginService) => void;
|
|
103
125
|
readonly on?: <THookName extends keyof OpenClawPluginHookEventMap>(hookName: THookName, handler: (event: OpenClawPluginHookEventMap[THookName], context: OpenClawPluginHookContext) => OpenClawPluginHookResultMap[THookName] | Promise<OpenClawPluginHookResultMap[THookName] | void> | void, options?: OpenClawPluginHookOptions) => void;
|
|
@@ -110,11 +132,6 @@ interface TcpPoolConfig {
|
|
|
110
132
|
readonly basePort: number;
|
|
111
133
|
readonly size: number;
|
|
112
134
|
}
|
|
113
|
-
declare function createPortalSubprocessConfigEnv(props: {
|
|
114
|
-
readonly env?: NodeJS.ProcessEnv;
|
|
115
|
-
readonly mcpConfig: McpConfig;
|
|
116
|
-
readonly mcpPortalConfig: McpPortalConfig;
|
|
117
|
-
}): Readonly<Record<string, string>>;
|
|
118
135
|
declare function validatePortalPortAgainstTcpPool(props: {
|
|
119
136
|
readonly port: number;
|
|
120
137
|
readonly tcpPool: TcpPoolConfig | null;
|
|
@@ -128,26 +145,14 @@ declare const pluginEntry: {
|
|
|
128
145
|
register: typeof registerMcpPortalPlugin;
|
|
129
146
|
};
|
|
130
147
|
//#endregion
|
|
131
|
-
//#region src/hmac-key-registry.d.ts
|
|
132
|
-
interface CreateHmacKeyRegistryProps {
|
|
133
|
-
readonly agentIds: readonly string[];
|
|
134
|
-
}
|
|
135
|
-
interface HmacKeyRegistry {
|
|
136
|
-
readonly agentIds: readonly string[];
|
|
137
|
-
readonly getKey: (agentId: string) => Buffer;
|
|
138
|
-
readonly serializeForEnv: () => Readonly<Record<string, string>>;
|
|
139
|
-
}
|
|
140
|
-
declare function createHmacKeyRegistry(props: CreateHmacKeyRegistryProps): HmacKeyRegistry;
|
|
141
|
-
//#endregion
|
|
142
148
|
//#region src/portal-plugin-runtime-state.d.ts
|
|
143
149
|
interface PortalPluginRuntimeState {
|
|
144
150
|
readonly configDir: string;
|
|
151
|
+
readonly getLoadedPortalConfig: () => McpPortalConfig | null;
|
|
145
152
|
readonly getPortalUnavailableReason: () => string | null;
|
|
146
|
-
readonly getKeyRegistry: () => HmacKeyRegistry;
|
|
147
153
|
readonly loadPortalConfig: () => Promise<McpPortalConfig>;
|
|
148
154
|
readonly markPortalAvailable: () => void;
|
|
149
155
|
readonly markPortalUnavailable: (reason: string) => void;
|
|
150
|
-
readonly setKeyRegistry: (registry: HmacKeyRegistry) => void;
|
|
151
156
|
}
|
|
152
157
|
declare function createPortalPluginRuntimeState(props: {
|
|
153
158
|
readonly configDir: string;
|
|
@@ -170,45 +175,12 @@ interface CreateBeforeToolCallHandlerProps {
|
|
|
170
175
|
declare function createBeforeToolCallHandler(props: CreateBeforeToolCallHandlerProps): (event: OpenClawBeforeToolCallEvent, context: OpenClawPluginHookContext) => Promise<OpenClawBeforeToolCallResult | undefined>;
|
|
171
176
|
//#endregion
|
|
172
177
|
//#region src/portal-config.d.ts
|
|
173
|
-
declare const defaultPortalBinPath = "/opt/agent-vm/portal/bin/agent-vm-mcp-portal-server";
|
|
174
178
|
declare const portalPluginConfigSchema: z.ZodObject<{
|
|
175
|
-
|
|
176
|
-
configDir: z.ZodOptional<z.ZodString>;
|
|
179
|
+
configDir: z.ZodString;
|
|
177
180
|
}, z.core.$strict>;
|
|
178
181
|
type PortalPluginConfig = z.infer<typeof portalPluginConfigSchema>;
|
|
179
182
|
declare function parsePortalConfig(value: unknown): PortalPluginConfig;
|
|
180
183
|
//#endregion
|
|
181
|
-
//#region src/portal-subprocess-supervisor.d.ts
|
|
182
|
-
interface PortalSubprocessLogger {
|
|
183
|
-
readonly error: (message: string) => void;
|
|
184
|
-
readonly info: (message: string) => void;
|
|
185
|
-
readonly warn: (message: string) => void;
|
|
186
|
-
}
|
|
187
|
-
type PortalSubprocessSpawnFunction = (command: string, args: readonly string[], options: SpawnOptions) => ChildProcess;
|
|
188
|
-
interface CreatePortalSubprocessSupervisorProps {
|
|
189
|
-
readonly backoffSteps?: readonly number[];
|
|
190
|
-
readonly binPath: string;
|
|
191
|
-
readonly configDir: string;
|
|
192
|
-
readonly fetchFn?: typeof fetch;
|
|
193
|
-
readonly healthPollIntervalMs?: number;
|
|
194
|
-
readonly healthTimeoutMs?: number;
|
|
195
|
-
readonly host: string;
|
|
196
|
-
readonly hmacEnv: Readonly<Record<string, string>>;
|
|
197
|
-
readonly logger: PortalSubprocessLogger;
|
|
198
|
-
readonly maxRestarts?: number;
|
|
199
|
-
readonly onFatal?: (reason: string) => void;
|
|
200
|
-
readonly port: number;
|
|
201
|
-
readonly portalEnv?: Readonly<Record<string, string>>;
|
|
202
|
-
readonly spawnFn?: PortalSubprocessSpawnFunction;
|
|
203
|
-
readonly stopGraceMs?: number;
|
|
204
|
-
}
|
|
205
|
-
interface PortalSubprocessSupervisor {
|
|
206
|
-
readonly isAlive: () => boolean;
|
|
207
|
-
readonly start: () => Promise<void>;
|
|
208
|
-
readonly stop: () => Promise<void>;
|
|
209
|
-
}
|
|
210
|
-
declare function createPortalSubprocessSupervisor(props: CreatePortalSubprocessSupervisorProps): PortalSubprocessSupervisor;
|
|
211
|
-
//#endregion
|
|
212
184
|
//#region src/portal-tool-policy.d.ts
|
|
213
185
|
interface PortalCallRequest {
|
|
214
186
|
readonly arguments: Record<string, unknown>;
|
|
@@ -216,8 +188,6 @@ interface PortalCallRequest {
|
|
|
216
188
|
readonly namespace: string;
|
|
217
189
|
readonly toolName: string;
|
|
218
190
|
}
|
|
219
|
-
declare function portalServerNameForAgent(agentId: string): string;
|
|
220
|
-
declare function materializedPortalToolNames(serverName: string): readonly string[];
|
|
221
191
|
declare function profileAllowsPortalCall(profile: ResolvedMcpPortalProfile, call: {
|
|
222
192
|
readonly namespace: string;
|
|
223
193
|
readonly toolName: string;
|
|
@@ -247,5 +217,5 @@ declare function redactPortalSecrets(text: string, secretValues?: readonly strin
|
|
|
247
217
|
//#region src/index.d.ts
|
|
248
218
|
declare const OPENCLAW_MCP_PORTAL_PLUGIN_PACKAGE_NAME = "@agent-vm/openclaw-mcp-portal-plugin";
|
|
249
219
|
//#endregion
|
|
250
|
-
export { CreateBeforePromptBuildHandlerProps, CreateBeforeToolCallHandlerProps,
|
|
220
|
+
export { CreateBeforePromptBuildHandlerProps, CreateBeforeToolCallHandlerProps, OPENCLAW_MCP_PORTAL_PLUGIN_PACKAGE_NAME, OpenClawAgentTurnPrepareEvent, OpenClawApprovalResolution, OpenClawBeforePromptBuildEvent, OpenClawBeforeToolCallEvent, OpenClawBeforeToolCallResult, OpenClawHttpRouteRegistration, OpenClawPluginHookContext, OpenClawPluginHookEventMap, OpenClawPluginHookOptions, OpenClawPluginHookResultMap, OpenClawPluginHostCleanupReason, OpenClawPluginService, OpenClawPluginToolContext, OpenClawPortalPluginApi, OpenClawPromptHookContext, OpenClawPromptHookResult, OpenClawRuntimeLifecycleRegistrar, OpenClawRuntimeLifecycleRegistration, OpenClawToolFactory, OpenClawToolRegistration, OpenClawToolRegistrationResult, OpenClawToolUpdateCallback, PortalCallRequest, PortalPluginConfig, PortalPluginRuntimeState, PortalPromptDiagnostic, PortalPromptNamespaceSummary, createBeforePromptBuildHandler, createBeforeToolCallHandler, createPortalPluginRuntimeState, createPortalPromptContext, pluginEntry as default, parsePortalConfig, portalPluginConfigSchema, profileAllowsPortalCall, profileRequiresPortalApproval, redactPortalSecrets, registerMcpPortalPlugin, validatePortalPluginApi, validatePortalPortAgainstTcpPool };
|
|
251
221
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/openclaw-plugin-api.ts","../src/plugin-registration.ts","../src/
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/openclaw-plugin-api.ts","../src/plugin-registration.ts","../src/portal-plugin-runtime-state.ts","../src/before-prompt-build-handler.ts","../src/before-tool-call-handler.ts","../src/portal-config.ts","../src/portal-tool-policy.ts","../src/portal-prompt-context.ts","../src/redaction.ts","../src/index.ts"],"mappings":"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"}
|