summaryrefslogtreecommitdiffhomepage
path: root/packages/api/src/agent-manager.ts
diff options
context:
space:
mode:
authorAdam Malczewski <[email protected]>2026-05-21 20:26:07 +0900
committerAdam Malczewski <[email protected]>2026-05-21 20:26:07 +0900
commit13b670e5e93dc0243f970832673385e9855a1df6 (patch)
tree0d252be4410b04e28867efa569064bf9608840d3 /packages/api/src/agent-manager.ts
parent4ba2673557c7cfd0bc31b03e2c35ab5e1efe60e7 (diff)
downloaddispatch-13b670e5e93dc0243f970832673385e9855a1df6.tar.gz
dispatch-13b670e5e93dc0243f970832673385e9855a1df6.zip
feat: tool permission toggles, settings improvements, UI polish
- Tool permissions (read, edit, bash) stored in DB and control Agent tool registration - Agent invalidated when permissions change; cache warning in Permissions panel - Default: read=allow, edit=ask, bash=ask (matches UI checkboxes) - Settings: auto-save title model on selection (removed save button) - Settings: auto-expand thinking checkbox with shared reactive store - Permissions panel: renamed from Permission Log, shows tool toggles + collapsible log - Sidebar: renamed Current Model to Model Choice - Chat input: allow typing while agent runs (just disable send) - Chat cursor: fix doubled rectangle (removed unicode char) - Generic GET/PUT /tabs/settings/:key endpoints for key-value settings
Diffstat (limited to 'packages/api/src/agent-manager.ts')
-rw-r--r--packages/api/src/agent-manager.ts21
1 files changed, 15 insertions, 6 deletions
diff --git a/packages/api/src/agent-manager.ts b/packages/api/src/agent-manager.ts
index 07af249..9d222fa 100644
--- a/packages/api/src/agent-manager.ts
+++ b/packages/api/src/agent-manager.ts
@@ -24,6 +24,7 @@ import {
refreshAccountCredentials,
refreshAccountCredentialsAsync,
resolveApiKey,
+ getSetting,
} from "@dispatch/core";
import type { PermissionManager } from "./permission-manager.js";
import { setConfigGetter } from "./routes/config.js";
@@ -47,6 +48,7 @@ interface TabAgent {
keyId: string | null;
modelId: string | null;
taskList: TaskList;
+ _lastPermKey?: string;
}
export class AgentManager {
@@ -193,10 +195,16 @@ export class AgentManager {
const effectiveKeyId = keyId ?? tabAgent.keyId;
const effectiveModelId = modelId ?? tabAgent.modelId;
- // If the override differs from what the current agent was built with, invalidate the cache
+ // Read tool permission settings from DB (default: read=allow, edit=ask, bash=ask)
+ const permRead = getSetting("perm_read") !== "ask";
+ const permEdit = getSetting("perm_edit") === "allow";
+ const permBash = getSetting("perm_bash") === "allow";
+ const permKey = `${permRead}:${permEdit}:${permBash}`;
+
+ // If the override differs or permissions changed, invalidate the cached agent
if (
tabAgent.agent &&
- (effectiveKeyId !== tabAgent.keyId || effectiveModelId !== tabAgent.modelId)
+ (effectiveKeyId !== tabAgent.keyId || effectiveModelId !== tabAgent.modelId || permKey !== tabAgent._lastPermKey)
) {
tabAgent.agent = null;
}
@@ -204,13 +212,14 @@ export class AgentManager {
if (!tabAgent.agent) {
const workingDirectory = process.env.DISPATCH_WORKING_DIR ?? process.cwd();
+ // Build tools list based on permission settings
const tools = [
- createReadFileTool(workingDirectory),
- createWriteFileTool(workingDirectory),
- createListFilesTool(workingDirectory),
- createRunShellTool(workingDirectory),
+ ...(permRead ? [createReadFileTool(workingDirectory), createListFilesTool(workingDirectory)] : []),
+ ...(permEdit ? [createWriteFileTool(workingDirectory)] : []),
+ ...(permBash ? [createRunShellTool(workingDirectory)] : []),
createTaskListTool(tabAgent.taskList),
];
+ tabAgent._lastPermKey = permKey;
const ruleset = configToRuleset(this.config);