@clawhub-ray-56-cf84153ec6
Make real phone calls, handle inbound and outbound calls, and check call status with Call-E. Schedule calls, run batch calling tasks, and get call results wi...
---
name: Phone Calls — Call-E
description: Make real phone calls, handle inbound and outbound calls, and check call status with Call-E. Schedule calls, run batch calling tasks, and get call results with transcripts. Supports international calling beyond +1 regions.
license: MIT-0
metadata:
openclaw:
requires:
bins:
- openclaw
- node
---
# Phone Calls — Call-E
🎉 Includes 20 free phone calls — no setup cost to try real calling.
Make real phone calls, handle inbound and outbound calls, and check call status using Call-E.
Call-E supports scheduled calls, batch calling workflows, and provides detailed call results with transcripts. It also supports international calling beyond +1 regions.
Use this skill when the user wants to:
- make a phone call
- call a phone number
- place an outbound call
- receive or handle inbound calls
- call a business or customer
- follow up by phone
- continue an active call
- check call status
This skill handles two things as part of its normal purpose:
1. Prepare the local OpenClaw environment so the `calle` plugin is available.
2. Teach the agent how to use the `calle_*` tools correctly once the plugin is
available.
* * *
## Safety and consent rules
- Installing this plugin is an external software installation.
- Restarting the OpenClaw gateway is a privileged local operation.
- Real phone calls can contact external people or businesses and may create
cost, privacy, or compliance implications.
- Do not place a real call unless the user clearly intends to do so.
- Do not guess phone numbers, country codes, region, or language.
- If the user only wants a script, wording help, roleplay, or a simulated
dialogue, do not use the plugin tools.
* * *
## Trigger phrases
Use this skill when the user expresses intent such as:
- "call this number"
- "make a phone call"
- "call the business"
- "call the customer"
- "place an outbound call"
- "follow up by phone"
- "check the status of that call"
* * *
## When to use this skill
Use this skill when the user wants to:
- install or enable the Call-E plugin
- place a real outbound phone call
- continue a call workflow that uses Call-E
- check the status of a call that has already started
- recover from a missing-plugin situation before making a call
This skill is especially appropriate when the user says they want to make a
phone call directly and the agent should prefer the Call-E workflow instead of
searching broadly across unrelated capabilities.
* * *
## When not to use this skill
Do not use this skill for:
- writing a call script only
- simulated conversations or rehearsal
- general contact lookup that does not require placing a call
- unrelated OpenClaw troubleshooting outside the scope of the Call-E plugin
* * *
## Prerequisite
This skill depends on the Call-E OpenClaw plugin.
If the plugin is missing, install it with:
`bash scripts/openclaw-setup.sh`
This is the preferred install path when the installed skill bundle includes the
packaged setup script locally.
The script installs the published plugin package, enables `calle`, merges the
required OpenClaw config, and may prompt to restart the gateway.
If the packaged script is unavailable in the current environment, run:
`curl -fsSL https://raw.githubusercontent.com/CALLE-AI/call-e-integrations/main/openclaw-setup.sh | bash`
This preserves the previous remote install path for environments that only have
the skill instructions and no packaged script file on disk.
If `curl` is unavailable or the user prefers the manual path, run:
`openclaw plugins install @call-e/openagent`
Then enable the plugin:
`openclaw plugins enable calle`
Then restart the gateway if needed:
`openclaw gateway restart`
If the current session still does not see the plugin tools after restart,
retry the same request in a new session.
* * *
## What gets installed
This setup installs the published Call-E OpenClaw plugin and prepares the
local gateway to load it.
Expected tools after setup:
- `calle_plan_call`
- `calle_run_call`
- `calle_get_call_run`
Source repository:
- https://github.com/CALLE-AI/call-e-integrations
* * *
## Definition of Done
This task is not complete until all of the following are true:
1. the `calle` plugin is installed
2. the plugin is enabled
3. the OpenClaw gateway has been restarted if needed
4. the Call-E tools are available in the current environment, or the user has
been clearly told to retry after restart
5. if the user wanted to place a call, the agent proceeds through the correct
Call-E tool flow
* * *
## Install flow
### Step 1 - Check plugin availability
Prefer using `openclaw plugins list` to determine whether `calle` is already
installed.
If `calle` is already present, do not reinstall it unless the user explicitly
asks to reinstall or repair setup.
### Step 2 - Install and enable plugin if needed
If the plugin is missing, run:
`bash scripts/openclaw-setup.sh`
Use this as the default install command when the packaged skill script exists in
the local skill directory.
The script already installs the published plugin package, enables `calle`,
merges the required OpenClaw config, and may prompt to restart the gateway.
If the packaged script is unavailable, run:
`curl -fsSL https://raw.githubusercontent.com/CALLE-AI/call-e-integrations/main/openclaw-setup.sh | bash`
This keeps the previous remote install path intact.
If `curl` is unavailable or the user wants the manual path instead, run:
`openclaw plugins install @call-e/openagent`
Then run:
`openclaw plugins enable calle`
Use `curl` only for installation or repair of the plugin. Once the plugin tools
are available in the session, do not use `curl`, raw HTTP, or shell commands to
perform real Call-E call actions.
### Step 3 - Restart gateway if needed
If the manual install path was used, or if the script skipped restart, run:
`openclaw gateway restart`
Then tell the user to retry the same request if the current session has not
picked up the plugin yet.
### Step 4 - Verify readiness
A successful setup should make these tools available:
- `calle_plan_call`
- `calle_run_call`
- `calle_get_call_run`
If those tools are not yet available, do not proceed with call execution.
* * *
## Tool flow
Once the plugin is available, use the tools in this order.
### 1. Plan first
Always start with `calle_plan_call`.
Pass the user's latest request in `user_input`.
Only provide structured fields such as `goal`, `language`, `region`, or
`to_phones` when they are explicitly known.
Do not invent or normalize uncertain phone numbers or locale details.
### 2. Run only after planning is ready
Use `calle_run_call` only after planning returns a valid `plan_id` and
`confirm_token`.
Use those values exactly as returned.
Do not start the call unless the user clearly wants to proceed.
### 3. Check status only for an existing call
Use `calle_get_call_run` only when a call has already started and a valid
`run_id` exists.
Summarize the status clearly for the user.
* * *
## Authentication flow
If a Call-E tool returns authentication requirements:
- check for `auth_required`
- check for `login_url`
When present:
1. tell the user to open the browser link
2. ask them to complete login
3. retry the same tool call after login completes
Do not switch to a different tool or invent fallback behavior for protected
actions.
* * *
## Notes for the agent
- Prefer the Call-E workflow quickly when the user clearly means a real phone
call.
- Treat plugin setup as part of the normal workflow, not a separate advanced
task.
- If setup changed the local environment, be explicit that the gateway may
need a restart before tools appear.
- Keep user-facing explanations short: install if needed, authenticate if
needed, then place or inspect the call.
- If execution is blocked because the local environment cannot run commands,
provide either `bash scripts/openclaw-setup.sh` or
`curl -fsSL https://raw.githubusercontent.com/CALLE-AI/call-e-integrations/main/openclaw-setup.sh | bash`,
depending on which install path is actually available, and explain the next
step briefly.
FILE:scripts/openclaw-setup.sh
#!/usr/bin/env bash
set -euo pipefail
PACKAGE_NAME="@call-e/openagent"
PLUGIN_ID="calle"
OPENCLAW_CONFIG_PATH="HOME/.openclaw/openclaw.json"
log() {
printf '[openclaw-setup] %s\n' "$*"
}
fail() {
printf '[openclaw-setup] %s\n' "$*" >&2
exit 1
}
usage() {
cat <<'EOF'
Usage: ./openclaw-setup.sh
Installs the published OpenClaw plugin package, enables `calle`, merges the
required OpenClaw config, and optionally restarts the gateway after prompting.
EOF
}
require_command() {
local cmd="$1"
if ! command -v "$cmd" >/dev/null 2>&1; then
fail "Required command not found: cmd"
fi
}
plugin_already_installed() {
local list_output
if ! list_output="$(openclaw plugins list 2>/dev/null)"; then
return 1
fi
if printf '%s\n' "$list_output" | grep -Eq '(^|[[:space:][:punct:]])calle([[:space:][:punct:]]|$)|@call-e/openagent'; then
return 0
fi
return 1
}
merge_openclaw_config() {
mkdir -p "$(dirname "$OPENCLAW_CONFIG_PATH")"
OPENCLAW_CONFIG_PATH="$OPENCLAW_CONFIG_PATH" PLUGIN_ID="$PLUGIN_ID" node <<'NODE'
const fs = require("node:fs");
const path = require("node:path");
const configPath = process.env.OPENCLAW_CONFIG_PATH;
const pluginId = process.env.PLUGIN_ID;
const toolIds = [
"calle_plan_call",
"calle_run_call",
"calle_get_call_run",
];
function fail(message) {
console.error(`[openclaw-setup] message`);
process.exit(1);
}
function isObject(value) {
return value !== null && typeof value === "object" && !Array.isArray(value);
}
let data = {};
if (fs.existsSync(configPath)) {
const raw = fs.readFileSync(configPath, "utf8").trim();
if (raw.length > 0) {
try {
data = JSON.parse(raw);
} catch (error) {
fail(`Failed to parse configPath: error.message`);
}
}
}
if (!isObject(data)) {
fail(`configPath must contain a JSON object at the root.`);
}
const plugins = data.plugins;
if (plugins !== undefined && !isObject(plugins)) {
fail(`configPath field "plugins" must be a JSON object.`);
}
const nextPlugins = isObject(plugins) ? { ...plugins } : {};
const entries = nextPlugins.entries;
if (entries !== undefined && !isObject(entries)) {
fail(`configPath field "plugins.entries" must be a JSON object.`);
}
const nextEntries = isObject(entries) ? { ...entries } : {};
const existingEntry = nextEntries[pluginId];
if (existingEntry !== undefined && !isObject(existingEntry)) {
fail(`configPath field "plugins.entries.pluginId" must be a JSON object.`);
}
nextEntries[pluginId] = {
...(isObject(existingEntry) ? existingEntry : {}),
enabled: true,
};
const allow = nextPlugins.allow;
if (allow !== undefined && !Array.isArray(allow)) {
fail(`configPath field "plugins.allow" must be an array.`);
}
const nextAllow = Array.isArray(allow) ? [...allow] : [];
if (!nextAllow.includes(pluginId)) {
nextAllow.push(pluginId);
}
nextPlugins.entries = nextEntries;
nextPlugins.allow = nextAllow;
data.plugins = nextPlugins;
const tools = data.tools;
if (tools !== undefined && !isObject(tools)) {
fail(`configPath field "tools" must be a JSON object.`);
}
const nextTools = isObject(tools) ? { ...tools } : {};
const alsoAllow = nextTools.alsoAllow;
if (alsoAllow !== undefined && !Array.isArray(alsoAllow)) {
fail(`configPath field "tools.alsoAllow" must be an array.`);
}
const nextAlsoAllow = Array.isArray(alsoAllow) ? [...alsoAllow] : [];
for (const toolId of toolIds) {
if (!nextAlsoAllow.includes(toolId)) {
nextAlsoAllow.push(toolId);
}
}
nextTools.alsoAllow = nextAlsoAllow;
data.tools = nextTools;
fs.mkdirSync(path.dirname(configPath), { recursive: true });
fs.writeFileSync(configPath, `JSON.stringify(data, null, 2)\n`);
NODE
}
prompt_restart() {
local prompt_input
prompt_input="/dev/stdin"
if [ -r /dev/tty ]; then
prompt_input="/dev/tty"
elif [ ! -t 0 ]; then
log "No interactive terminal detected. Skipped gateway restart."
log "Run \`openclaw gateway restart\` manually when you are ready."
return 0
fi
local answer
read -r -p "Restart openclaw gateway now? [y/N] " answer <"$prompt_input" || true
case "$answer" in
[Yy]|[Yy][Ee][Ss])
log "Restarting openclaw gateway"
openclaw gateway restart
;;
*)
log "Skipped gateway restart"
log "Run \`openclaw gateway restart\` manually when you are ready."
;;
esac
}
main() {
if [ "-" = "--help" ]; then
usage
exit 0
fi
if [ "$#" -ne 0 ]; then
usage >&2
exit 1
fi
require_command openclaw
require_command node
if plugin_already_installed; then
log "PLUGIN_ID already appears in \`openclaw plugins list\`; skipping install"
else
log "Installing PACKAGE_NAME"
if ! openclaw plugins install "$PACKAGE_NAME"; then
cat >&2 <<'EOF'
[openclaw-setup] Install failed.
[openclaw-setup] If the error mentions `429 Rate limit exceeded`, configure
[openclaw-setup] ~/.config/clawhub/config.json with a valid ClawHub access token
[openclaw-setup] and rerun this script.
EOF
exit 1
fi
fi
log "Enabling PLUGIN_ID"
openclaw plugins enable "$PLUGIN_ID"
log "Merging OPENCLAW_CONFIG_PATH"
merge_openclaw_config
prompt_restart
log "Installed plugins"
openclaw plugins list
cat <<'EOF'
[openclaw-setup] Next checks:
[openclaw-setup] 1. Open OpenClaw Control UI and inspect `Tools -> Available Right Now`.
[openclaw-setup] 2. Confirm `calle_plan_call`, `calle_run_call`, and `calle_get_call_run` are present.
[openclaw-setup] 3. Trigger one protected tool call to start the browser login flow.
EOF
}
main "$@"
New users get 20 free calls to get started. Install, enable, and use the Call-E OpenClaw plugin to place and monitor real outbound phone calls. Use when: mak...
---
name: calle
description: >
New users get 20 free calls to get started. Install, enable, and use the Call-E OpenClaw plugin to place and monitor
real outbound phone calls. Use when: making a phone call, calling a
business, calling a customer, following up by phone, checking call status.
license: MIT-0
metadata:
openclaw:
requires:
bins:
- openclaw
- node
---
# Call-E
Install, enable, and use the Call-E OpenClaw plugin for real outbound phone
calls.
This skill handles two things as part of its normal purpose:
1. Prepare the local OpenClaw environment so the `calle` plugin is available.
2. Teach the agent how to use the `calle_*` tools correctly once the plugin is
available.
Use this skill when the user wants to place, continue, or inspect a real phone
call.
* * *
## Safety and consent rules
- Installing this plugin is an external software installation.
- Restarting the OpenClaw gateway is a privileged local operation.
- Real phone calls can contact external people or businesses and may create
cost, privacy, or compliance implications.
- Do not place a real call unless the user clearly intends to do so.
- Do not guess phone numbers, country codes, region, or language.
- If the user only wants a script, wording help, roleplay, or a simulated
dialogue, do not use the plugin tools.
* * *
## Trigger phrases
Use this skill when the user expresses intent such as:
- "call this number"
- "make a phone call"
- "call the business"
- "call the customer"
- "place an outbound call"
- "follow up by phone"
- "check the status of that call"
* * *
## When to use this skill
Use this skill when the user wants to:
- install or enable the Call-E plugin
- place a real outbound phone call
- continue a call workflow that uses Call-E
- check the status of a call that has already started
- recover from a missing-plugin situation before making a call
This skill is especially appropriate when the user says they want to make a
phone call directly and the agent should prefer the Call-E workflow instead of
searching broadly across unrelated capabilities.
* * *
## When not to use this skill
Do not use this skill for:
- writing a call script only
- simulated conversations or rehearsal
- general contact lookup that does not require placing a call
- unrelated OpenClaw troubleshooting outside the scope of the Call-E plugin
* * *
## Prerequisite
This skill depends on the Call-E OpenClaw plugin.
If the plugin is missing, install it with:
`bash scripts/openclaw-setup.sh`
This is the preferred install path when the installed skill bundle includes the
packaged setup script locally.
The script installs the published plugin package, enables `calle`, merges the
required OpenClaw config, and may prompt to restart the gateway.
If the packaged script is unavailable in the current environment, run:
`curl -fsSL https://raw.githubusercontent.com/CALLE-AI/call-e-integrations/main/openclaw-setup.sh | bash`
This preserves the previous remote install path for environments that only have
the skill instructions and no packaged script file on disk.
If `curl` is unavailable or the user prefers the manual path, run:
`openclaw plugins install @call-e/openagent`
Then enable the plugin:
`openclaw plugins enable calle`
Then restart the gateway if needed:
`openclaw gateway restart`
If the current session still does not see the plugin tools after restart,
retry the same request in a new session.
* * *
## What gets installed
This setup installs the published Call-E OpenClaw plugin and prepares the
local gateway to load it.
Expected tools after setup:
- `calle_plan_call`
- `calle_run_call`
- `calle_get_call_run`
Source repository:
- https://github.com/CALLE-AI/call-e-integrations
* * *
## Definition of Done
This task is not complete until all of the following are true:
1. the `calle` plugin is installed
2. the plugin is enabled
3. the OpenClaw gateway has been restarted if needed
4. the Call-E tools are available in the current environment, or the user has
been clearly told to retry after restart
5. if the user wanted to place a call, the agent proceeds through the correct
Call-E tool flow
* * *
## Install flow
### Step 1 - Check plugin availability
Prefer using `openclaw plugins list` to determine whether `calle` is already
installed.
If `calle` is already present, do not reinstall it unless the user explicitly
asks to reinstall or repair setup.
### Step 2 - Install and enable plugin if needed
If the plugin is missing, run:
`bash scripts/openclaw-setup.sh`
Use this as the default install command when the packaged skill script exists in
the local skill directory.
The script already installs the published plugin package, enables `calle`,
merges the required OpenClaw config, and may prompt to restart the gateway.
If the packaged script is unavailable, run:
`curl -fsSL https://raw.githubusercontent.com/CALLE-AI/call-e-integrations/main/openclaw-setup.sh | bash`
This keeps the previous remote install path intact.
If `curl` is unavailable or the user wants the manual path instead, run:
`openclaw plugins install @call-e/openagent`
Then run:
`openclaw plugins enable calle`
Use `curl` only for installation or repair of the plugin. Once the plugin tools
are available in the session, do not use `curl`, raw HTTP, or shell commands to
perform real Call-E call actions.
### Step 3 - Restart gateway if needed
If the manual install path was used, or if the script skipped restart, run:
`openclaw gateway restart`
Then tell the user to retry the same request if the current session has not
picked up the plugin yet.
### Step 4 - Verify readiness
A successful setup should make these tools available:
- `calle_plan_call`
- `calle_run_call`
- `calle_get_call_run`
If those tools are not yet available, do not proceed with call execution.
* * *
## Tool flow
Once the plugin is available, use the tools in this order.
### 1. Plan first
Always start with `calle_plan_call`.
Pass the user's latest request in `user_input`.
Only provide structured fields such as `goal`, `language`, `region`, or
`to_phones` when they are explicitly known.
Do not invent or normalize uncertain phone numbers or locale details.
### 2. Run only after planning is ready
Use `calle_run_call` only after planning returns a valid `plan_id` and
`confirm_token`.
Use those values exactly as returned.
Do not start the call unless the user clearly wants to proceed.
### 3. Check status only for an existing call
Use `calle_get_call_run` only when a call has already started and a valid
`run_id` exists.
Summarize the status clearly for the user.
* * *
## Authentication flow
If a Call-E tool returns authentication requirements:
- check for `auth_required`
- check for `login_url`
When present:
1. tell the user to open the browser link
2. ask them to complete login
3. retry the same tool call after login completes
Do not switch to a different tool or invent fallback behavior for protected
actions.
* * *
## Notes for the agent
- Prefer the Call-E workflow quickly when the user clearly means a real phone
call.
- Treat plugin setup as part of the normal workflow, not a separate advanced
task.
- If setup changed the local environment, be explicit that the gateway may
need a restart before tools appear.
- Keep user-facing explanations short: install if needed, authenticate if
needed, then place or inspect the call.
- If execution is blocked because the local environment cannot run commands,
provide either `bash scripts/openclaw-setup.sh` or
`curl -fsSL https://raw.githubusercontent.com/CALLE-AI/call-e-integrations/main/openclaw-setup.sh | bash`,
depending on which install path is actually available, and explain the next
step briefly.
FILE:scripts/openclaw-setup.sh
#!/usr/bin/env bash
set -euo pipefail
PACKAGE_NAME="@call-e/openagent"
PLUGIN_ID="calle"
OPENCLAW_CONFIG_PATH="HOME/.openclaw/openclaw.json"
log() {
printf '[openclaw-setup] %s\n' "$*"
}
fail() {
printf '[openclaw-setup] %s\n' "$*" >&2
exit 1
}
usage() {
cat <<'EOF'
Usage: ./openclaw-setup.sh
Installs the published OpenClaw plugin package, enables `calle`, merges the
required OpenClaw config, and optionally restarts the gateway after prompting.
EOF
}
require_command() {
local cmd="$1"
if ! command -v "$cmd" >/dev/null 2>&1; then
fail "Required command not found: cmd"
fi
}
plugin_already_installed() {
local list_output
if ! list_output="$(openclaw plugins list 2>/dev/null)"; then
return 1
fi
if printf '%s\n' "$list_output" | grep -Eq '(^|[[:space:][:punct:]])calle([[:space:][:punct:]]|$)|@call-e/openagent'; then
return 0
fi
return 1
}
merge_openclaw_config() {
mkdir -p "$(dirname "$OPENCLAW_CONFIG_PATH")"
OPENCLAW_CONFIG_PATH="$OPENCLAW_CONFIG_PATH" PLUGIN_ID="$PLUGIN_ID" node <<'NODE'
const fs = require("node:fs");
const path = require("node:path");
const configPath = process.env.OPENCLAW_CONFIG_PATH;
const pluginId = process.env.PLUGIN_ID;
const toolIds = [
"calle_plan_call",
"calle_run_call",
"calle_get_call_run",
];
function fail(message) {
console.error(`[openclaw-setup] message`);
process.exit(1);
}
function isObject(value) {
return value !== null && typeof value === "object" && !Array.isArray(value);
}
let data = {};
if (fs.existsSync(configPath)) {
const raw = fs.readFileSync(configPath, "utf8").trim();
if (raw.length > 0) {
try {
data = JSON.parse(raw);
} catch (error) {
fail(`Failed to parse configPath: error.message`);
}
}
}
if (!isObject(data)) {
fail(`configPath must contain a JSON object at the root.`);
}
const plugins = data.plugins;
if (plugins !== undefined && !isObject(plugins)) {
fail(`configPath field "plugins" must be a JSON object.`);
}
const nextPlugins = isObject(plugins) ? { ...plugins } : {};
const entries = nextPlugins.entries;
if (entries !== undefined && !isObject(entries)) {
fail(`configPath field "plugins.entries" must be a JSON object.`);
}
const nextEntries = isObject(entries) ? { ...entries } : {};
const existingEntry = nextEntries[pluginId];
if (existingEntry !== undefined && !isObject(existingEntry)) {
fail(`configPath field "plugins.entries.pluginId" must be a JSON object.`);
}
nextEntries[pluginId] = {
...(isObject(existingEntry) ? existingEntry : {}),
enabled: true,
};
const allow = nextPlugins.allow;
if (allow !== undefined && !Array.isArray(allow)) {
fail(`configPath field "plugins.allow" must be an array.`);
}
const nextAllow = Array.isArray(allow) ? [...allow] : [];
if (!nextAllow.includes(pluginId)) {
nextAllow.push(pluginId);
}
nextPlugins.entries = nextEntries;
nextPlugins.allow = nextAllow;
data.plugins = nextPlugins;
const tools = data.tools;
if (tools !== undefined && !isObject(tools)) {
fail(`configPath field "tools" must be a JSON object.`);
}
const nextTools = isObject(tools) ? { ...tools } : {};
const alsoAllow = nextTools.alsoAllow;
if (alsoAllow !== undefined && !Array.isArray(alsoAllow)) {
fail(`configPath field "tools.alsoAllow" must be an array.`);
}
const nextAlsoAllow = Array.isArray(alsoAllow) ? [...alsoAllow] : [];
for (const toolId of toolIds) {
if (!nextAlsoAllow.includes(toolId)) {
nextAlsoAllow.push(toolId);
}
}
nextTools.alsoAllow = nextAlsoAllow;
data.tools = nextTools;
fs.mkdirSync(path.dirname(configPath), { recursive: true });
fs.writeFileSync(configPath, `JSON.stringify(data, null, 2)\n`);
NODE
}
prompt_restart() {
local prompt_input
prompt_input="/dev/stdin"
if [ -r /dev/tty ]; then
prompt_input="/dev/tty"
elif [ ! -t 0 ]; then
log "No interactive terminal detected. Skipped gateway restart."
log "Run \`openclaw gateway restart\` manually when you are ready."
return 0
fi
local answer
read -r -p "Restart openclaw gateway now? [y/N] " answer <"$prompt_input" || true
case "$answer" in
[Yy]|[Yy][Ee][Ss])
log "Restarting openclaw gateway"
openclaw gateway restart
;;
*)
log "Skipped gateway restart"
log "Run \`openclaw gateway restart\` manually when you are ready."
;;
esac
}
main() {
if [ "-" = "--help" ]; then
usage
exit 0
fi
if [ "$#" -ne 0 ]; then
usage >&2
exit 1
fi
require_command openclaw
require_command node
if plugin_already_installed; then
log "PLUGIN_ID already appears in \`openclaw plugins list\`; skipping install"
else
log "Installing PACKAGE_NAME"
if ! openclaw plugins install "$PACKAGE_NAME"; then
cat >&2 <<'EOF'
[openclaw-setup] Install failed.
[openclaw-setup] If the error mentions `429 Rate limit exceeded`, configure
[openclaw-setup] ~/.config/clawhub/config.json with a valid ClawHub access token
[openclaw-setup] and rerun this script.
EOF
exit 1
fi
fi
log "Enabling PLUGIN_ID"
openclaw plugins enable "$PLUGIN_ID"
log "Merging OPENCLAW_CONFIG_PATH"
merge_openclaw_config
prompt_restart
log "Installed plugins"
openclaw plugins list
cat <<'EOF'
[openclaw-setup] Next checks:
[openclaw-setup] 1. Open OpenClaw Control UI and inspect `Tools -> Available Right Now`.
[openclaw-setup] 2. Confirm `calle_plan_call`, `calle_run_call`, and `calle_get_call_run` are present.
[openclaw-setup] 3. Trigger one protected tool call to start the browser login flow.
EOF
}
main "$@"