multicorn-shield 0.9.0 → 0.10.0
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/CHANGELOG.md +365 -0
- package/LICENSE +1 -1
- package/README.md +29 -1
- package/dist/index.cjs +295 -27
- package/dist/index.d.cts +105 -1
- package/dist/index.d.ts +105 -1
- package/dist/index.js +293 -28
- package/dist/shield-extension.js +1 -1
- package/package.json +8 -2
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,365 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to this project will be documented in this file.
|
|
4
|
+
|
|
5
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
|
+
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
|
+
|
|
8
|
+
## [0.10.0] - 2026-04-21
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
|
|
12
|
+
- `requestContentReview()` and supporting types (`ContentReviewResult`, `ContentReviewRequestPayload`, `ContentReviewStatusResponse`) for submitting public-content actions to the Content Review queue and awaiting the human decision.
|
|
13
|
+
- `waitForReviewDecision` opt-in flag on `McpAdapterConfig`. When true, the MCP adapter blocks until a human approves or blocks the action (5 minute ceiling) and forwards the call if approved. Default false preserves existing block-fast behaviour.
|
|
14
|
+
- Public exports of `requiresContentReview` and `isPublicContentAction` from `src/scopes/content-review-detector.ts`.
|
|
15
|
+
- SDK-side mapping of backend `PLAN_TIER_INSUFFICIENT` responses to a distinct `plan_tier_insufficient` reason code with the "Content review requires an Enterprise plan" user message.
|
|
16
|
+
|
|
17
|
+
### Changed
|
|
18
|
+
|
|
19
|
+
- `pollContentReviewStatus` fast-fails on 404 (maps to `review_not_found`) instead of retrying, diverging from `pollApprovalStatus` which treats 404 as transient. Content reviews can be hard-deleted by admin action in a way approvals cannot.
|
|
20
|
+
|
|
21
|
+
## [0.9.0] - 2026-04-15
|
|
22
|
+
|
|
23
|
+
### Added
|
|
24
|
+
|
|
25
|
+
- Windsurf native integration via Cascade Hooks (`pre_*` / `post_*` for reads, writes, terminal, and MCP). Hook scripts install to `~/.multicorn/windsurf-hooks/` and add entries to `~/.codeium/windsurf/hooks.json`.
|
|
26
|
+
- `npx multicorn-proxy init`: when you pick Windsurf, choose Native plugin (recommended) or Hosted proxy. Native path registers Shield hooks and reminds you to restart Windsurf.
|
|
27
|
+
|
|
28
|
+
## [0.8.0] - 2026-04-12
|
|
29
|
+
|
|
30
|
+
### Added
|
|
31
|
+
|
|
32
|
+
- Windsurf IDE as a supported platform in `npx multicorn-proxy init`. Generates a proxy config and prints an `~/.codeium/windsurf/mcp_config.json` snippet using the Windsurf `mcpServers` / `serverUrl` schema.
|
|
33
|
+
- Auto-detection of existing Windsurf proxy entries (shows "● detected locally" in the platform selection list).
|
|
34
|
+
|
|
35
|
+
### Changed
|
|
36
|
+
|
|
37
|
+
- Next Steps block for Cursor and Windsurf rewritten as clear three-step numbered actions: download the IDE if needed, paste the config snippet, restart. Previous copy ("Config file: ...", "Restart Cursor to pick up MCP config changes") gave no guidance to first-time users.
|
|
38
|
+
|
|
39
|
+
## [0.7.0] - 2026-04-11
|
|
40
|
+
|
|
41
|
+
### Added
|
|
42
|
+
|
|
43
|
+
- New `--api-key <key>` CLI flag on `multicorn-proxy --wrap`. Lets users run the proxy without first creating a config file.
|
|
44
|
+
- New `MULTICORN_API_KEY` environment variable support. Resolves with priority `--api-key` flag > `MULTICORN_API_KEY` env var > `~/.multicorn/config.json`.
|
|
45
|
+
- New "Local MCP / Other" option in the `multicorn-proxy init` wizard. Skips the platform-specific setup steps and writes a minimal config suitable for wrapping any local MCP server with `--wrap`.
|
|
46
|
+
- SDK constructor now validates the API key format and rejects invalid keys (empty, wrong prefix, too short, or the literal placeholder `mcs_your_key_here`) with a clear error pointing at the settings page.
|
|
47
|
+
|
|
48
|
+
### Changed
|
|
49
|
+
|
|
50
|
+
- `multicorn-proxy init` platform menu now labels detected platforms as "detected locally" instead of "connected", with a dimmed dot icon instead of a green checkmark. The previous label implied account-level connection state, but the underlying detection only checks for local config files.
|
|
51
|
+
- Error message when no API key is configured now mentions all three sources: the `--api-key` flag, the `MULTICORN_API_KEY` environment variable, and the `npx multicorn-proxy init` config file path.
|
|
52
|
+
- All references to the API keys settings page now use the fragment URL `https://app.multicorn.ai/settings#api-keys` instead of the previous `/settings/api-keys` path which did not exist.
|
|
53
|
+
|
|
54
|
+
### Fixed
|
|
55
|
+
|
|
56
|
+
- `multicorn-proxy --wrap` now fails immediately at startup with a clear error if the configured API key is rejected by the Multicorn service. Previously the proxy logged "Agent resolved" and "Proxy ready" with empty agent state and only blocked tool calls at runtime, leaving users confused about why their setup was not working.
|
|
57
|
+
- `multicorn-proxy --wrap` now correctly accepts proxy flags (`--api-key`, `--base-url`, `--log-level`, `--dashboard-url`, `--agent-name`) when they appear between `--wrap` and the wrap command. Previously the parser bailed with "requires a command to run" because the early-exit guard rejected any flag-shaped token in that position before the stripping logic ran.
|
|
58
|
+
- `multicorn-proxy init` exit summary no longer renders a trailing dash for the "Local MCP / Other" option (which has no agent name). The summary line now reads `✓ Local MCP / Other` instead of `✓ Local MCP / Other -`.
|
|
59
|
+
- `multicorn-proxy init` no longer prints a misleading "Next steps" block referencing "Other MCP Agent" and `--agent-name` after the "Local MCP / Other" option. The "Try it" example printed inside the option 4 branch is sufficient guidance.
|
|
60
|
+
|
|
61
|
+
## [0.6.2] - 2026-04-09
|
|
62
|
+
|
|
63
|
+
### Fixed
|
|
64
|
+
|
|
65
|
+
- Proxy CLI `init` command now reads `baseUrl` from `~/.multicorn/config.json` on the new-key path, not just the reuse-key path. Previously required `--base-url` flag as a workaround.
|
|
66
|
+
- `--base-url` CLI flag correctly overrides config file value (previously indistinguishable from the default).
|
|
67
|
+
|
|
68
|
+
### Added
|
|
69
|
+
|
|
70
|
+
- `readBaseUrlFromConfig()` helper for reading base URL from partial config files.
|
|
71
|
+
- `parseConfigFile()` shared helper eliminating duplicated file read/parse logic between `loadConfig` and `readBaseUrlFromConfig`.
|
|
72
|
+
- `isAllowedShieldApiBaseUrl()` exported validator for HTTPS/localhost scheme checks.
|
|
73
|
+
- `DEFAULT_SHIELD_API_BASE_URL` named constant replacing hardcoded fallback string.
|
|
74
|
+
- HTTPS scheme validation in `runInit()` init flow (previously only enforced in wrap flow).
|
|
75
|
+
|
|
76
|
+
### Changed
|
|
77
|
+
|
|
78
|
+
- `runInit` parameter changed from `baseUrl = "https://api.multicorn.ai"` to `explicitBaseUrl?: string` to distinguish "no flag" from "explicitly passed default."
|
|
79
|
+
- Base URL resolution priority: explicit flag > full config > partial config > env var > default.
|
|
80
|
+
- HTTPS validation error messages no longer include the actual URL value.
|
|
81
|
+
- Wrap flow validates `--base-url` before loading config when the flag is present.
|
|
82
|
+
|
|
83
|
+
## [0.6.1] - 2026-04-08
|
|
84
|
+
|
|
85
|
+
### Fixed
|
|
86
|
+
|
|
87
|
+
- Updated README badges and npm package metadata to reflect current branding.
|
|
88
|
+
|
|
89
|
+
## [0.6.0] - 2026-04-08
|
|
90
|
+
|
|
91
|
+
### Added
|
|
92
|
+
|
|
93
|
+
- Multi-agent config support: `~/.multicorn/config.json` now stores an `agents` array with per-platform entries instead of a single `agentName`
|
|
94
|
+
- New CLI commands: `npx multicorn-proxy agents` (list configured agents) and `npx multicorn-proxy delete-agent <name>` (remove an agent)
|
|
95
|
+
- New exported helpers: `getAgentByPlatform()`, `getDefaultAgent()`, `collectAgentsFromConfig()`, `deleteAgentByName()`
|
|
96
|
+
- `AgentEntry` interface exported from the SDK
|
|
97
|
+
- Automatic migration: legacy single-agent configs are upgraded to the new format on first read and written back to disk
|
|
98
|
+
- Platform-based agent lookup in Claude Code hooks (`pre-tool-use.cjs`, `post-tool-use.cjs`), OpenClaw plugin, and Claude Desktop extension
|
|
99
|
+
- CLI agent name sanitisation: `delete-agent` strips non-printable characters before echoing to terminal
|
|
100
|
+
|
|
101
|
+
### Changed
|
|
102
|
+
|
|
103
|
+
- `ProxyConfig` interface now includes optional `agents` (readonly `AgentEntry[]`) and `defaultAgent` fields
|
|
104
|
+
- `agentName` and `platform` fields on `ProxyConfig` are deprecated (kept for backward compatibility during migration)
|
|
105
|
+
- `runInit()` appends to the agents array instead of overwriting; detects duplicate platforms and prompts to replace
|
|
106
|
+
- Restored inline OpenClaw setup flow with version detection, auto-config of `~/.openclaw/openclaw.json`, and "Next steps" instructions (`openclaw gateway restart`, `openclaw tui`)
|
|
107
|
+
- Restored inline Claude Code setup instructions (marketplace add, plugin install, start claude, `/plugin` verification)
|
|
108
|
+
- "Next steps" summary restored at end of init wizard with per-platform instructions
|
|
109
|
+
- Help text clarified for non-technical users ("List configured agents and show which is the default", "Remove a saved agent")
|
|
110
|
+
- CJS hook duplication comment updated to explain why shared modules are not possible
|
|
111
|
+
|
|
112
|
+
### Fixed
|
|
113
|
+
|
|
114
|
+
- Running `npx multicorn-proxy init` for a second platform no longer overwrites the first agent's config
|
|
115
|
+
- `delete-agent` clears `defaultAgent` when deleting the default agent instead of leaving a dangling reference
|
|
116
|
+
|
|
117
|
+
### Security
|
|
118
|
+
|
|
119
|
+
- Agent names from CLI input are sanitised before echoing to stdout/stderr to prevent terminal escape sequence injection
|
|
120
|
+
|
|
121
|
+
## [0.5.0] - 2026-04-08
|
|
122
|
+
|
|
123
|
+
Version number skipped. The `release:minor` script double-bumped from 0.4.0 to 0.5.0 (manual) then to 0.6.0 (automated). No separate 0.5.0 release exists on npm.
|
|
124
|
+
|
|
125
|
+
## [0.4.0] - 2026-04-08
|
|
126
|
+
|
|
127
|
+
### Changed
|
|
128
|
+
|
|
129
|
+
- CLI rewrite: extracted platform selection, agent naming, and proxy config prompts into separate helper functions
|
|
130
|
+
- Reduced platform options from 4 (OpenClaw, Claude Code, Claude Desktop, Other MCP Agent) to 3 (OpenClaw, Claude Code, Cursor)
|
|
131
|
+
- Cursor connection detection via `~/.cursor/mcp.json`
|
|
132
|
+
- Claude Code connection detection via `~/.claude/plugins/cache/multicorn-shield`
|
|
133
|
+
- Cursor (selection 3) now prompts for target MCP server URL and creates a hosted proxy config via the Shield API
|
|
134
|
+
- Platform-specific MCP config snippets shown after proxy config creation
|
|
135
|
+
- "Connect another agent?" prompt changed from `(y/N)` default-no to `(Y/n)` default-yes
|
|
136
|
+
- Setup complete summary now shows agent names and proxy URLs alongside platform labels
|
|
137
|
+
|
|
138
|
+
### Removed
|
|
139
|
+
|
|
140
|
+
- Claude Desktop as a standalone platform option (now handled via Cursor/Other MCP path)
|
|
141
|
+
- "Next steps" grouped summary at end of init (replaced by inline instructions per platform)
|
|
142
|
+
- OpenClaw version detection and `updateOpenClawConfigIfPresent()` auto-config during init
|
|
143
|
+
|
|
144
|
+
## [0.3.0] - 2026-04-08
|
|
145
|
+
|
|
146
|
+
Version number skipped. No 0.3.0 release exists on npm.
|
|
147
|
+
|
|
148
|
+
## [0.2.2] - 2026-04-04
|
|
149
|
+
|
|
150
|
+
### Added
|
|
151
|
+
|
|
152
|
+
- Claude Desktop Extension (.mcpb) for one-click install. Packages Shield as a Desktop Extension that wraps existing MCP servers, enforces permissions via the Shield API, and logs all tool calls.
|
|
153
|
+
- `npx multicorn-shield restore` command to recover original MCP server config after disabling the extension.
|
|
154
|
+
- `multicorn-shield/proxy` subpath export with interceptor helpers, consent utilities, logger, scope validator, and tool mapper for hosted proxy consumers.
|
|
155
|
+
- HTTP client for hosted proxy URLs (`proxy-client`) supporting Streamable HTTP transport, session management, and JSON-RPC error handling.
|
|
156
|
+
- Optional extension setting `base_url` (env `MULTICORN_BASE_URL`) for enterprise or self-hosted Shield API endpoints. Defaults to `https://api.multicorn.ai` when empty.
|
|
157
|
+
|
|
158
|
+
### Changed
|
|
159
|
+
|
|
160
|
+
- Desktop Extension routes tool calls to hosted proxy URLs over Streamable HTTP instead of spawning child MCP processes locally. Permission enforcement and audit logging now run server-side, avoiding sandbox limits in Claude Desktop.
|
|
161
|
+
- `runInit` base URL resolution checks config file and `MULTICORN_BASE_URL` env var before falling back to the default API endpoint.
|
|
162
|
+
- `platform` field threaded through proxy config and CLI init flow for connection method tracking in the dashboard.
|
|
163
|
+
|
|
164
|
+
## [0.2.1] - 2026-03-23
|
|
165
|
+
|
|
166
|
+
### Security
|
|
167
|
+
|
|
168
|
+
- Claude Code PreToolUse hook now fails closed when the Shield API is unreachable or returns an error. Previously, all error paths exited with code 0 (allow). Now, any error after config is successfully loaded exits with code 2 (block). This matches the fail-closed behaviour of the OpenClaw plugin and MCP proxy since v0.1.15.
|
|
169
|
+
|
|
170
|
+
## [0.2.0] - 2026-03-22
|
|
171
|
+
|
|
172
|
+
### Added
|
|
173
|
+
|
|
174
|
+
- Claude Code plugin: PreToolUse hook intercepts tool calls and checks permissions via Shield API before allowing execution
|
|
175
|
+
- Claude Code plugin: PostToolUse hook logs completed tool calls to Shield audit trail
|
|
176
|
+
- Claude Code plugin: consent screen opens in browser on first tool call for new agents, polls for approval
|
|
177
|
+
- Claude Code plugin: consent marker file prevents repeated browser opens after initial consent
|
|
178
|
+
- Claude Desktop: CLI wizard auto-writes `claude_desktop_config.json` with MCP proxy config (macOS, Linux, Windows paths)
|
|
179
|
+
- Claude Desktop: wizard prompts for MCP server command and merges config without clobbering existing entries
|
|
180
|
+
- MCP proxy: comprehensive tool name mapper with explicit mappings for filesystem, git, web, terminal, email, and calendar MCP servers
|
|
181
|
+
- CLI wizard: "connected" checkmark for Claude Code and Claude Desktop in platform selection menu
|
|
182
|
+
- CLI wizard: Step 3 added to Claude Code output ("Start Claude Code: claude")
|
|
183
|
+
- Agent name validation: must match /^[a-zA-Z0-9_-]+$/ before use in config files
|
|
184
|
+
- `shell` tool name mapping to terminal:execute in Claude Code hook (covers Claude Code's Shell tool variant)
|
|
185
|
+
|
|
186
|
+
### Changed
|
|
187
|
+
|
|
188
|
+
- Claude Desktop wizard path now auto-writes config instead of showing manual JSON snippet (falls back to manual on invalid JSON or user skip)
|
|
189
|
+
- MCP proxy tool mapping replaced: `extractServiceFromToolName`/`extractActionFromToolName` underscore-split replaced with explicit `mapMcpToolToScope` lookup table
|
|
190
|
+
- `isClaudeDesktopConnected` uses proper args array inspection instead of substring match on serialized JSON
|
|
191
|
+
|
|
192
|
+
### Fixed
|
|
193
|
+
|
|
194
|
+
- Claude Code plugin install: removed `skills` array from plugin.json that caused validation error on `claude plugin install`
|
|
195
|
+
- Claude Code consent flow: consent screen only opens once per agent (not per scope), subsequent permission requests block with approvals link
|
|
196
|
+
- Claude Code hook: localhost:8080 API base URL correctly maps to localhost:5173 dashboard URL for consent and approvals links
|
|
197
|
+
- MCP proxy: filesystem server tools (read_file, write_file, list_directory, etc.) now correctly map to filesystem:read/write instead of garbage service names
|
|
198
|
+
|
|
199
|
+
## [0.1.16] - 2026-03-21
|
|
200
|
+
|
|
201
|
+
### Added
|
|
202
|
+
|
|
203
|
+
- Claude Code marketplace manifest at `.claude-plugin/marketplace.json`
|
|
204
|
+
- Claude Code plugin structure at `plugins/multicorn-shield/` with plugin.json and shield-governance skill
|
|
205
|
+
- Repository field added to marketplace.json linking to GitHub source
|
|
206
|
+
|
|
207
|
+
## [0.1.15] - 2026-03-13
|
|
208
|
+
|
|
209
|
+
### Changed
|
|
210
|
+
|
|
211
|
+
- All proxy and plugin failure modes now fail closed (block action when Shield cannot verify permissions)
|
|
212
|
+
- `handleHttpError` returns `shouldBlock: true` for 429 (rate limit) and 5xx (server error), matching the existing `checkActionPermission` behavior and fixing misleading comments
|
|
213
|
+
- Service-unreachable, auth-error, and internal-error responses use distinct JSON-RPC error codes: -32000 (permission denied), -32002 (internal error), -32003 (service unreachable), -32004 (auth error)
|
|
214
|
+
- Plugin output filename changed from `index.js` to `multicorn-shield.js` to fix OpenClaw plugin ID mismatch warning
|
|
215
|
+
|
|
216
|
+
### Added
|
|
217
|
+
|
|
218
|
+
- `ShieldAuthError` class for clean 401/403 error propagation through `resolveAgentRecord`
|
|
219
|
+
- `buildInternalErrorResponse`, `buildServiceUnreachableResponse`, and `buildAuthErrorResponse` in interceptor module
|
|
220
|
+
- Early auth-invalid and offline-mode guards at the top of `handleToolCall` (before scope validation)
|
|
221
|
+
- `authInvalid` flag on `AgentRecord` for propagating auth failures from consent module to proxy
|
|
222
|
+
- `proxy.fail-closed.test.ts` covering service-down, timeout, 500, malformed JSON, 401, 403, and internal error scenarios
|
|
223
|
+
- `plugin.fail-closed.test.ts` covering exception handling, 5xx responses, and malformed response blocking
|
|
224
|
+
|
|
225
|
+
### Fixed
|
|
226
|
+
|
|
227
|
+
- Proxy `handleToolCall` no longer hangs or returns wrong error code when service is unreachable at startup
|
|
228
|
+
- `findAgentByName` wraps `response.json()` in try/catch so malformed responses flow through the offline path instead of throwing unhandled rejections
|
|
229
|
+
- Existing test assertions updated to match new error codes (-32003 for service unreachable, -32004 for auth errors)
|
|
230
|
+
|
|
231
|
+
## [0.1.14] - 2026-03-12
|
|
232
|
+
|
|
233
|
+
### Fixed
|
|
234
|
+
|
|
235
|
+
- Audit log payload column uses `text` instead of `jsonb` to preserve SHA-256 hash chain integrity (PostgreSQL `jsonb` normalizes key ordering and whitespace)
|
|
236
|
+
- `Instant.toString()` timestamp precision preserved using `DateTimeFormatter` with `SSSSSS` pattern in `AuditHasher.formatTimestamp()`
|
|
237
|
+
- All 40 integration tests passing after audit log migration (V030)
|
|
238
|
+
|
|
239
|
+
## [0.1.13] - 2026-03-10
|
|
240
|
+
|
|
241
|
+
### Fixed
|
|
242
|
+
|
|
243
|
+
- Consent screen now pre-selects the permission level the agent actually requested (e.g. terminal:execute pre-selects the Execute button)
|
|
244
|
+
- Scope param parsing supports both formats: service:permission (terminal:execute) and permission:service (execute:terminal)
|
|
245
|
+
- deriveDashboardUrl respects MULTICORN_BASE_URL env var for local development instead of always resolving to production
|
|
246
|
+
- Plugin re-checks permission after consent completes in the blocked path, so the user doesn't have to trigger a second tool call
|
|
247
|
+
|
|
248
|
+
## [0.1.12] - 2026-03-10
|
|
249
|
+
|
|
250
|
+
(version bump only - failed publish on 0.1.11)
|
|
251
|
+
|
|
252
|
+
## [0.1.11] - 2026-03-10
|
|
253
|
+
|
|
254
|
+
### Fixed
|
|
255
|
+
|
|
256
|
+
- Approval flow: plugin correctly handles consent-then-permission-check sequence
|
|
257
|
+
- Flaky tests stabilised across handler, plugin, proxy blocking, and edge-case suites
|
|
258
|
+
|
|
259
|
+
## [0.1.10] - 2026-03-05
|
|
260
|
+
|
|
261
|
+
### Fixed
|
|
262
|
+
|
|
263
|
+
- Plugin fail mode now defaults to closed (block on API error, never fail open)
|
|
264
|
+
- approval_id field name corrected from camelCase to snake_case to match backend API
|
|
265
|
+
- Plugin beforeToolCall wrapped in try/catch so errors block instead of crashing silently
|
|
266
|
+
- Config cascade documented: ~/.multicorn/config.json takes priority over openclaw.json plugin env
|
|
267
|
+
|
|
268
|
+
## [0.1.9] - 2026-03-04
|
|
269
|
+
|
|
270
|
+
### Fixed
|
|
271
|
+
|
|
272
|
+
- API key resolution from config.json when openclaw.json env block is not available
|
|
273
|
+
|
|
274
|
+
## [0.1.8] - 2026-03-04
|
|
275
|
+
|
|
276
|
+
### Fixed
|
|
277
|
+
|
|
278
|
+
- Plugin correctly maps destructive exec commands (rm, mv, sudo, chmod) to terminal:write instead of terminal:execute
|
|
279
|
+
- Approval descriptions now show human-readable summaries instead of raw shell commands
|
|
280
|
+
- Agent polling removed in favour of immediate block with dashboard redirect (OpenClaw hook timeout was shorter than human approval time)
|
|
281
|
+
|
|
282
|
+
## [0.1.7] - 2026-03-04
|
|
283
|
+
|
|
284
|
+
### Added
|
|
285
|
+
|
|
286
|
+
- README header SVG banner
|
|
287
|
+
|
|
288
|
+
### Changed
|
|
289
|
+
|
|
290
|
+
- Consent flow updated for OpenClaw Plugin API (replaces deprecated gateway hook approach)
|
|
291
|
+
|
|
292
|
+
### Fixed
|
|
293
|
+
|
|
294
|
+
- Handler and plugin consent test alignment with new Plugin API structure
|
|
295
|
+
|
|
296
|
+
## [0.1.6] - 2026-03-04
|
|
297
|
+
|
|
298
|
+
### Added
|
|
299
|
+
|
|
300
|
+
- Comprehensive plugin test suite for beforeToolCall and afterToolCall hooks
|
|
301
|
+
|
|
302
|
+
### Fixed
|
|
303
|
+
|
|
304
|
+
- Plugin registration and lifecycle handling with OpenClaw Plugin API
|
|
305
|
+
|
|
306
|
+
## [0.1.5] - 2026-03-04
|
|
307
|
+
|
|
308
|
+
### Fixed
|
|
309
|
+
|
|
310
|
+
- Test stability improvements across the full suite
|
|
311
|
+
|
|
312
|
+
### Changed
|
|
313
|
+
|
|
314
|
+
- Package metadata updates for npm listing
|
|
315
|
+
|
|
316
|
+
## [0.1.4] - 2026-03-04
|
|
317
|
+
|
|
318
|
+
### Changed
|
|
319
|
+
|
|
320
|
+
- MCP proxy improved for edge cases in tool call interception
|
|
321
|
+
|
|
322
|
+
### Fixed
|
|
323
|
+
|
|
324
|
+
- Proxy test reliability
|
|
325
|
+
|
|
326
|
+
## [0.1.3] - 2026-03-04
|
|
327
|
+
|
|
328
|
+
### Added
|
|
329
|
+
|
|
330
|
+
- Shield API client (shield-client.ts) for permission checks and action logging from the plugin
|
|
331
|
+
- Consent flow module with browser-open and polling for user authorization
|
|
332
|
+
- OpenClaw Plugin API integration (beforeToolCall/afterToolCall hooks)
|
|
333
|
+
- Tool name mapper: OpenClaw tools (exec, read, write, browser, message) mapped to Shield service scopes
|
|
334
|
+
- Hook documentation (HOOK.md)
|
|
335
|
+
|
|
336
|
+
### Fixed
|
|
337
|
+
|
|
338
|
+
- OpenClaw integration issues discovered during end-to-end testing
|
|
339
|
+
|
|
340
|
+
## [0.1.2] - 2026-03-04
|
|
341
|
+
|
|
342
|
+
(version bump only - testing OIDC trusted publishing workflow)
|
|
343
|
+
|
|
344
|
+
## [0.1.1] - 2026-03-04
|
|
345
|
+
|
|
346
|
+
### Fixed
|
|
347
|
+
|
|
348
|
+
- Plugin loading path resolution for OpenClaw
|
|
349
|
+
|
|
350
|
+
### Changed
|
|
351
|
+
|
|
352
|
+
- Publish workflow switched to OIDC trusted publishing via GitHub Actions
|
|
353
|
+
|
|
354
|
+
## [0.1.0] - 2026-02-18
|
|
355
|
+
|
|
356
|
+
### Added
|
|
357
|
+
|
|
358
|
+
- Consent screen web component with Shadow DOM isolation, focus trapping, and keyboard navigation
|
|
359
|
+
- Scope system with hierarchical definitions, parsing, and validation
|
|
360
|
+
- Action logger for audit-trail recording of agent activity
|
|
361
|
+
- Spending controls with per-agent and per-scope limit checking
|
|
362
|
+
- MCP protocol adapter for Model Context Protocol integration
|
|
363
|
+
- TypeScript strict mode with full type safety across all modules
|
|
364
|
+
- ESM and CJS dual-format builds via tsup
|
|
365
|
+
- Full test suite with >85% coverage thresholds
|
package/LICENSE
CHANGED
package/README.md
CHANGED
|
@@ -584,10 +584,38 @@ multicorn-shield/
|
|
|
584
584
|
└── eslint.config.ts # Linting rules
|
|
585
585
|
```
|
|
586
586
|
|
|
587
|
+
## Publishing & ownership
|
|
588
|
+
|
|
589
|
+
Releases are published from a single GitHub Actions workflow (.github/workflows/publish.yml). It is manually dispatched (workflow_dispatch) with a patch/minor/major input. Each run installs dependencies, runs lint, typecheck, tests, and build, then bumps the package version with npm version (which creates a version commit and tag locally), publishes to npm with pnpm publish --no-git-checks --access public --provenance, and pushes the commit and tag with git push --follow-tags. After that, the same run may POST to a Vercel deploy hook (repository secret) to refresh the learn site. That hook does not publish to npm. No other workflow publishes this package.
|
|
590
|
+
|
|
591
|
+
The npm publish step uses a scoped automation token stored as one repository secret (`NPM_TOKEN`), only for this workflow, with npm provenance enabled on the publish command.
|
|
592
|
+
|
|
593
|
+
The npm package has a single publisher account (`multicorn-ai`). If you see a Socket.dev "unstable ownership" warning after an earlier publish-identity change, it often clears as the registry history stabilizes across the next few releases.
|
|
594
|
+
|
|
595
|
+
For compromised-package or supply-chain concerns, see [SECURITY.md](SECURITY.md).
|
|
596
|
+
|
|
597
|
+
## Network behaviour
|
|
598
|
+
|
|
599
|
+
The SDK and CLI make outbound requests to the following hosts:
|
|
600
|
+
|
|
601
|
+
**api.multicorn.ai** (control plane; default)
|
|
602
|
+
|
|
603
|
+
- Consent creation and approval polling
|
|
604
|
+
- Action audit submission
|
|
605
|
+
- Spending checks
|
|
606
|
+
- Invoked only when the host application calls SDK or CLI methods, or when the proxy or extension runs its control-plane logic. There is no import-time network activity.
|
|
607
|
+
|
|
608
|
+
**127.0.0.1 / localhost** (local proxy, when running in proxy mode)
|
|
609
|
+
|
|
610
|
+
- IPC between the CLI wrapper and the local proxy process
|
|
611
|
+
- Never leaves the user's machine
|
|
612
|
+
|
|
613
|
+
No telemetry, analytics, or phone-home calls. Outbound API URLs use fixed paths under a single configurable base URL: the SDK `baseUrl` option (default `https://api.multicorn.ai`), the `MULTICORN_BASE_URL` environment variable, or `baseUrl` in `~/.multicorn/config.json` for the proxy and related tooling. Hosts and paths are not built from agent tool parameters or request bodies.
|
|
614
|
+
|
|
587
615
|
## Contributing
|
|
588
616
|
|
|
589
617
|
Contributions are welcome. Please read [CONTRIBUTING.md](CONTRIBUTING.md) before opening a pull request.
|
|
590
618
|
|
|
591
619
|
## License
|
|
592
620
|
|
|
593
|
-
[MIT](LICENSE) © Multicorn AI
|
|
621
|
+
[MIT](LICENSE) © Multicorn AI Pty Ltd
|