docs: recommend tools.alsoAllow for optional plugin tools
This commit is contained in:
committed by
Pocket Clawd
parent
d62b7c0d1e
commit
3497be2963
@@ -201,7 +201,7 @@ For ad-hoc workflows, call Lobster directly.
|
|||||||
|
|
||||||
- Lobster runs as a **local subprocess** (`lobster` CLI) in tool mode and returns a **JSON envelope**.
|
- Lobster runs as a **local subprocess** (`lobster` CLI) in tool mode and returns a **JSON envelope**.
|
||||||
- If the tool returns `needs_approval`, you resume with a `resumeToken` and `approve` flag.
|
- If the tool returns `needs_approval`, you resume with a `resumeToken` and `approve` flag.
|
||||||
- The tool is an **optional plugin**; you must allowlist `lobster` in `tools.allow`.
|
- The tool is an **optional plugin**; enable it additively via `tools.alsoAllow: ["lobster"]` (recommended).
|
||||||
- If you pass `lobsterPath`, it must be an **absolute path**.
|
- If you pass `lobsterPath`, it must be an **absolute path**.
|
||||||
|
|
||||||
See [Lobster](/tools/lobster) for full usage and examples.
|
See [Lobster](/tools/lobster) for full usage and examples.
|
||||||
|
|||||||
@@ -158,7 +158,19 @@ If you want to use a custom binary location, pass an **absolute** `lobsterPath`
|
|||||||
|
|
||||||
## Enable the tool
|
## Enable the tool
|
||||||
|
|
||||||
Lobster is an **optional** plugin tool (not enabled by default). Allow it per agent:
|
Lobster is an **optional** plugin tool (not enabled by default).
|
||||||
|
|
||||||
|
Recommended (additive, safe):
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"tools": {
|
||||||
|
"alsoAllow": ["lobster"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Or per-agent:
|
||||||
|
|
||||||
```json
|
```json
|
||||||
{
|
{
|
||||||
@@ -167,7 +179,7 @@ Lobster is an **optional** plugin tool (not enabled by default). Allow it per ag
|
|||||||
{
|
{
|
||||||
"id": "main",
|
"id": "main",
|
||||||
"tools": {
|
"tools": {
|
||||||
"allow": ["lobster"]
|
"alsoAllow": ["lobster"]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
@@ -175,7 +187,7 @@ Lobster is an **optional** plugin tool (not enabled by default). Allow it per ag
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
You can also allow it globally with `tools.allow` if every agent should see it.
|
Avoid using `tools.allow: ["lobster"]` unless you intend to run in restrictive allowlist mode.
|
||||||
|
|
||||||
Note: allowlists are opt-in for optional plugins. If your allowlist only names
|
Note: allowlists are opt-in for optional plugins. If your allowlist only names
|
||||||
plugin tools (like `lobster`), Clawdbot keeps core tools enabled. To restrict core
|
plugin tools (like `lobster`), Clawdbot keeps core tools enabled. To restrict core
|
||||||
|
|||||||
@@ -346,7 +346,7 @@ export function createClawdbotCodingTools(options?: {
|
|||||||
if (resolved.unknownAllowlist.length > 0) {
|
if (resolved.unknownAllowlist.length > 0) {
|
||||||
const entries = resolved.unknownAllowlist.join(", ");
|
const entries = resolved.unknownAllowlist.join(", ");
|
||||||
const suffix = resolved.strippedAllowlist
|
const suffix = resolved.strippedAllowlist
|
||||||
? "Ignoring allowlist so core tools remain available."
|
? "Ignoring allowlist so core tools remain available. Use tools.alsoAllow for additive plugin tool enablement."
|
||||||
: "These entries won't match any tool unless the plugin is enabled.";
|
: "These entries won't match any tool unless the plugin is enabled.";
|
||||||
logWarn(`tools: ${label} allowlist contains unknown entries (${entries}). ${suffix}`);
|
logWarn(`tools: ${label} allowlist contains unknown entries (${entries}). ${suffix}`);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -209,6 +209,12 @@ export function stripPluginOnlyAllowlist(
|
|||||||
if (!isCoreEntry && !isPluginEntry) unknownAllowlist.push(entry);
|
if (!isCoreEntry && !isPluginEntry) unknownAllowlist.push(entry);
|
||||||
}
|
}
|
||||||
const strippedAllowlist = !hasCoreEntry;
|
const strippedAllowlist = !hasCoreEntry;
|
||||||
|
// When an allowlist contains only plugin tools, we strip it to avoid accidentally
|
||||||
|
// disabling core tools. Users who want additive behavior should prefer `tools.alsoAllow`.
|
||||||
|
if (strippedAllowlist) {
|
||||||
|
// Note: logging happens in the caller (pi-tools/tools-invoke) after this function returns.
|
||||||
|
// We keep this note here for future maintainers.
|
||||||
|
}
|
||||||
return {
|
return {
|
||||||
policy: strippedAllowlist ? { ...policy, allow: undefined } : policy,
|
policy: strippedAllowlist ? { ...policy, allow: undefined } : policy,
|
||||||
unknownAllowlist: Array.from(new Set(unknownAllowlist)),
|
unknownAllowlist: Array.from(new Set(unknownAllowlist)),
|
||||||
|
|||||||
@@ -189,7 +189,7 @@ export async function handleToolsInvokeHttpRequest(
|
|||||||
if (resolved.unknownAllowlist.length > 0) {
|
if (resolved.unknownAllowlist.length > 0) {
|
||||||
const entries = resolved.unknownAllowlist.join(", ");
|
const entries = resolved.unknownAllowlist.join(", ");
|
||||||
const suffix = resolved.strippedAllowlist
|
const suffix = resolved.strippedAllowlist
|
||||||
? "Ignoring allowlist so core tools remain available."
|
? "Ignoring allowlist so core tools remain available. Use tools.alsoAllow for additive plugin tool enablement."
|
||||||
: "These entries won't match any tool unless the plugin is enabled.";
|
: "These entries won't match any tool unless the plugin is enabled.";
|
||||||
logWarn(`tools: ${label} allowlist contains unknown entries (${entries}). ${suffix}`);
|
logWarn(`tools: ${label} allowlist contains unknown entries (${entries}). ${suffix}`);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user