mirror of
https://github.com/openclaw/openclaw.git
synced 2026-04-19 11:48:38 +00:00
fix: boot-md hook + exec approvals parsing (#1164) (thanks @ngutman)
This commit is contained in:
@@ -25,6 +25,7 @@ Docs: https://docs.clawd.bot
|
|||||||
- macOS: add approvals socket UI server + node exec lifecycle events.
|
- macOS: add approvals socket UI server + node exec lifecycle events.
|
||||||
- Nodes: add headless node host (`clawdbot node start`) for `system.run`/`system.which`.
|
- Nodes: add headless node host (`clawdbot node start`) for `system.run`/`system.which`.
|
||||||
- Nodes: add node daemon service install/status/start/stop/restart.
|
- Nodes: add node daemon service install/status/start/stop/restart.
|
||||||
|
- Hooks: run `BOOT.md` on gateway startup with the boot-md hook. (#1164) — thanks @ngutman.
|
||||||
- Bridge: add `skills.bins` RPC to support node host auto-allow skill bins.
|
- Bridge: add `skills.bins` RPC to support node host auto-allow skill bins.
|
||||||
- Slash commands: replace `/cost` with `/usage off|tokens|full` to control per-response usage footer; `/usage` no longer aliases `/status`. (Supersedes #1140) — thanks @Nachx639.
|
- Slash commands: replace `/cost` with `/usage off|tokens|full` to control per-response usage footer; `/usage` no longer aliases `/status`. (Supersedes #1140) — thanks @Nachx639.
|
||||||
- Sessions: add daily reset policy with per-type overrides and idle windows (default 4am local), preserving legacy idle-only configs. (#1146) — thanks @austinm911.
|
- Sessions: add daily reset policy with per-type overrides and idle windows (default 4am local), preserving legacy idle-only configs. (#1146) — thanks @austinm911.
|
||||||
@@ -47,6 +48,7 @@ Docs: https://docs.clawd.bot
|
|||||||
- Memory: index atomically so failed reindex preserves the previous memory database. (#1151)
|
- Memory: index atomically so failed reindex preserves the previous memory database. (#1151)
|
||||||
- Memory: avoid sqlite-vec unique constraint failures when reindexing duplicate chunk ids. (#1151)
|
- Memory: avoid sqlite-vec unique constraint failures when reindexing duplicate chunk ids. (#1151)
|
||||||
- Exec approvals: enforce allowlist when ask is off; prefer raw command for node approvals/events.
|
- Exec approvals: enforce allowlist when ask is off; prefer raw command for node approvals/events.
|
||||||
|
- Exec approvals: parse command tokens correctly for PATH and relative resolution.
|
||||||
- Tools: return a companion-app-required message when node exec is requested with no paired node.
|
- Tools: return a companion-app-required message when node exec is requested with no paired node.
|
||||||
- Streaming: emit assistant deltas for OpenAI-compatible SSE chunks. (#1147) — thanks @alauppe.
|
- Streaming: emit assistant deltas for OpenAI-compatible SSE chunks. (#1147) — thanks @alauppe.
|
||||||
- Model fallback: treat timeout aborts as failover while preserving user aborts. (#1137) — thanks @cheeeee.
|
- Model fallback: treat timeout aborts as failover while preserving user aborts. (#1137) — thanks @cheeeee.
|
||||||
|
|||||||
@@ -185,7 +185,7 @@ export function registerExecApprovalsCli(program: Command) {
|
|||||||
}
|
}
|
||||||
allowlistEntries.push({ pattern: trimmed, lastUsedAt: Date.now() });
|
allowlistEntries.push({ pattern: trimmed, lastUsedAt: Date.now() });
|
||||||
agent.allowlist = allowlistEntries;
|
agent.allowlist = allowlistEntries;
|
||||||
file.agents = { ...(file.agents ?? {}), [agentKey]: agent };
|
file.agents = { ...file.agents, [agentKey]: agent };
|
||||||
const next = await saveSnapshot(opts, nodeId, file, snapshot.hash);
|
const next = await saveSnapshot(opts, nodeId, file, snapshot.hash);
|
||||||
const payload = opts.json ? JSON.stringify(next) : JSON.stringify(next, null, 2);
|
const payload = opts.json ? JSON.stringify(next) : JSON.stringify(next, null, 2);
|
||||||
defaultRuntime.log(payload);
|
defaultRuntime.log(payload);
|
||||||
@@ -229,11 +229,11 @@ export function registerExecApprovalsCli(program: Command) {
|
|||||||
agent.allowlist = nextEntries;
|
agent.allowlist = nextEntries;
|
||||||
}
|
}
|
||||||
if (isEmptyAgent(agent)) {
|
if (isEmptyAgent(agent)) {
|
||||||
const agents = { ...(file.agents ?? {}) };
|
const agents = { ...file.agents };
|
||||||
delete agents[agentKey];
|
delete agents[agentKey];
|
||||||
file.agents = Object.keys(agents).length > 0 ? agents : undefined;
|
file.agents = Object.keys(agents).length > 0 ? agents : undefined;
|
||||||
} else {
|
} else {
|
||||||
file.agents = { ...(file.agents ?? {}), [agentKey]: agent };
|
file.agents = { ...file.agents, [agentKey]: agent };
|
||||||
}
|
}
|
||||||
const next = await saveSnapshot(opts, nodeId, file, snapshot.hash);
|
const next = await saveSnapshot(opts, nodeId, file, snapshot.hash);
|
||||||
const payload = opts.json ? JSON.stringify(next) : JSON.stringify(next, null, 2);
|
const payload = opts.json ? JSON.stringify(next) : JSON.stringify(next, null, 2);
|
||||||
|
|||||||
@@ -242,7 +242,7 @@ function parseFirstToken(command: string): string | null {
|
|||||||
if (end > 1) return trimmed.slice(1, end);
|
if (end > 1) return trimmed.slice(1, end);
|
||||||
return trimmed.slice(1);
|
return trimmed.slice(1);
|
||||||
}
|
}
|
||||||
const match = /^[^\\s]+/.exec(trimmed);
|
const match = /^[^\s]+/.exec(trimmed);
|
||||||
return match ? match[0] : null;
|
return match ? match[0] : null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user