diff --git a/apps/presentation/dashboard/src/data/chat.ts b/apps/presentation/dashboard/src/data/chat.ts
index 6cf91db0a7..10a26c7f27 100644
--- a/apps/presentation/dashboard/src/data/chat.ts
+++ b/apps/presentation/dashboard/src/data/chat.ts
@@ -269,6 +269,7 @@ export const todoApplyResultSchema = z.object({
const goalSubagentOrchestrationSchema = z.object({
model_config: z.object({ model: z.string(), reasoning_effort: z.string().optional() }).optional(),
+ execution_config: z.string().optional(),
mode: z.string(),
spawn_allowed: z.boolean(),
@@ -302,6 +303,7 @@ export type GoalSubagentConfigurationResult = z.infer;
+ settings: Partial & { execution_config?: string };
native: { status: string; tokenBudget?: number; tokensUsed?: number };
registered_agents: string[]; paused: boolean; recovery_required: boolean;
members: Array<{id: string; agent_id: string; todo_id: string}>;
@@ -1025,6 +1027,7 @@ function goalSubagentConfigurationBody(request: GoalSubagentConfigurationRequest
goal_id: request.goalId,
enabled: request.enabled,
...(request.modelConfig !== undefined ? { model_config: request.modelConfig } : {}),
+ ...(request.executionConfig !== undefined ? { execution_config: request.executionConfig } : {}),
...(request.enabled ? {
max_children: request.maxChildren,
allowed_domains: request.allowedDomains,
@@ -1042,6 +1045,7 @@ function verifyGoalSubagentConfigurationResult(
const matchesRequest = result.goal_id === request.goalId
&& enabled === request.enabled
&& (request.modelConfig === undefined || JSON.stringify(orchestration.model_config ?? null) === JSON.stringify(request.modelConfig))
+ && (request.executionConfig === undefined || (orchestration.execution_config ?? "") === request.executionConfig)
&& (request.enabled
? orchestration.max_children === request.maxChildren
&& JSON.stringify(orchestration.allowed_domains) === JSON.stringify(expectedDomains)
diff --git a/apps/presentation/dashboard/src/data/status.ts b/apps/presentation/dashboard/src/data/status.ts
index ea50e3255d..aa22bec717 100644
--- a/apps/presentation/dashboard/src/data/status.ts
+++ b/apps/presentation/dashboard/src/data/status.ts
@@ -44,6 +44,7 @@ export const controlPlaneSchema = z.object({
export const orchestrationPolicySchema = z.object({
model_config: z.object({ model: z.string(), reasoning_effort: z.string().optional() }).optional(),
+ execution_config: z.string().optional(),
mode: z.string().optional().default("default"),
orchestration_mode: z.string().optional().nullable(),
diff --git a/apps/presentation/dashboard/src/features/personal-workspace/context-drawer.tsx b/apps/presentation/dashboard/src/features/personal-workspace/context-drawer.tsx
index d1c99643db..cc3a96fa25 100644
--- a/apps/presentation/dashboard/src/features/personal-workspace/context-drawer.tsx
+++ b/apps/presentation/dashboard/src/features/personal-workspace/context-drawer.tsx
@@ -64,6 +64,7 @@ type TodoOperation = "block" | "complete" | "defer" | "successor_create";
type GoalSubagentPreview = {
modelConfig?: { model: string; reasoning_effort?: string } | null;
+ executionConfig?: string;
allowedDomains: string[];
changed: boolean;
enabled: boolean;
@@ -97,6 +98,7 @@ function subagentConfigurationsMatch(
return left.enabled === right.enabled
&& left.maxChildren === right.maxChildren
&& JSON.stringify(left.modelConfig ?? null) === JSON.stringify(right.modelConfig ?? null)
+ && (left.executionConfig ?? "") === (right.executionConfig ?? "")
&& [...left.allowedDomains].sort((a, b) => a.localeCompare(b)).join("\u0000")
=== [...right.allowedDomains].sort((a, b) => a.localeCompare(b)).join("\u0000");
}
@@ -128,6 +130,7 @@ export function ContextDrawer({ agents, attentionHistory = [], onSelectAttention
const [subagentMaxChildren, setSubagentMaxChildren] = useState(2);
const [subagentModel, setSubagentModel] = useState("");
const [subagentEffort, setSubagentEffort] = useState("");
+ const [subagentExecutionConfig, setSubagentExecutionConfig] = useState("");
const [subagentMutationState, setSubagentMutationState] = useState<"idle" | "previewing" | "ready" | "applying" | "success" | "warning" | "error">("idle");
const [subagentPreview, setSubagentPreview] = useState(null);
const [verifiedSubagentConfiguration, setVerifiedSubagentConfiguration] = useState(null);
@@ -156,6 +159,7 @@ export function ContextDrawer({ agents, attentionHistory = [], onSelectAttention
setSubagentAllowedDomains(configuration?.allowedDomains ?? []);
setSubagentModel(configuration?.modelConfig?.model ?? "");
setSubagentEffort(configuration?.modelConfig?.reasoning_effort ?? "");
+ setSubagentExecutionConfig(configuration?.executionConfig ?? "");
setSubagentMaxChildren(configuration?.maxChildren ? Math.min(configuration.maxChildren, 32) : 2);
setSubagentFeedback(null);
setSubagentMutationState("idle");
@@ -185,6 +189,7 @@ export function ContextDrawer({ agents, attentionHistory = [], onSelectAttention
setSubagentAllowedDomains(authoritativeSubagentConfiguration.allowedDomains);
setSubagentModel(authoritativeSubagentConfiguration.modelConfig?.model ?? "");
setSubagentEffort(authoritativeSubagentConfiguration.modelConfig?.reasoning_effort ?? "");
+ setSubagentExecutionConfig(authoritativeSubagentConfiguration.executionConfig ?? "");
setSubagentMaxChildren(authoritativeSubagentConfiguration.maxChildren || 2);
setSubagentFeedback(null);
setSubagentMutationState("idle");
@@ -210,6 +215,7 @@ export function ContextDrawer({ agents, attentionHistory = [], onSelectAttention
setSubagentAllowedDomains(authoritativeSubagentConfiguration.allowedDomains);
setSubagentModel(authoritativeSubagentConfiguration.modelConfig?.model ?? "");
setSubagentEffort(authoritativeSubagentConfiguration.modelConfig?.reasoning_effort ?? "");
+ setSubagentExecutionConfig(authoritativeSubagentConfiguration.executionConfig ?? "");
setSubagentMaxChildren(
authoritativeSubagentConfiguration.maxChildren || 2,
);
@@ -382,6 +388,7 @@ export function ContextDrawer({ agents, attentionHistory = [], onSelectAttention
setSubagentAllowedDomains(currentSubagentConfiguration.allowedDomains);
setSubagentModel(currentSubagentConfiguration.modelConfig?.model ?? "");
setSubagentEffort(currentSubagentConfiguration.modelConfig?.reasoning_effort ?? "");
+ setSubagentExecutionConfig(currentSubagentConfiguration.executionConfig ?? "");
setSubagentMaxChildren(currentSubagentConfiguration.maxChildren || 2);
setSubagentFeedback(null);
setSubagentMutationState("idle");
@@ -421,6 +428,7 @@ export function ContextDrawer({ agents, attentionHistory = [], onSelectAttention
enabled,
goalId: selection.item.goalId,
maxChildren: enabled ? subagentMaxChildren : 0,
+ executionConfig: subagentExecutionConfig.trim(),
...subagentModelRequest(includeModel, subagentModel, subagentEffort),
};
setSubagentMutationState("previewing");
@@ -438,6 +446,7 @@ export function ContextDrawer({ agents, attentionHistory = [], onSelectAttention
setSubagentAllowedDomains(preview.configuration.allowedDomains);
setSubagentModel(preview.configuration.modelConfig?.model ?? "");
setSubagentEffort(preview.configuration.modelConfig?.reasoning_effort ?? "");
+ setSubagentExecutionConfig(preview.configuration.executionConfig ?? "");
setSubagentMaxChildren(preview.configuration.maxChildren || 2);
setSubagentMutationState("success");
setSubagentFeedback(t("drawer.subagentNoChange"));
@@ -463,6 +472,7 @@ export function ContextDrawer({ agents, attentionHistory = [], onSelectAttention
goalId: subagentPreview.goalId,
maxChildren: subagentPreview.maxChildren,
modelConfig: subagentPreview.modelConfig,
+ executionConfig: subagentPreview.executionConfig,
previewId: subagentPreview.previewId,
});
verifiedSubagentBaselineRef.current = authoritativeSubagentConfiguration
@@ -474,6 +484,7 @@ export function ContextDrawer({ agents, attentionHistory = [], onSelectAttention
setSubagentAllowedDomains(verifiedConfiguration.allowedDomains);
setSubagentModel(verifiedConfiguration.modelConfig?.model ?? "");
setSubagentEffort(verifiedConfiguration.modelConfig?.reasoning_effort ?? "");
+ setSubagentExecutionConfig(verifiedConfiguration.executionConfig ?? "");
setSubagentMaxChildren(verifiedConfiguration.maxChildren || 2);
setSubagentMutationState("success");
setSubagentFeedback(t("drawer.subagentApplied"));
@@ -730,6 +741,7 @@ export function ContextDrawer({ agents, attentionHistory = [], onSelectAttention
})
: t("drawer.subagentDisableSummary")}
{subagentPreview.modelConfig !== undefined ? {t("drawer.subagentModel")}: {subagentPreview.modelConfig?.model || t("drawer.subagentModelDefault")} · {subagentPreview.modelConfig?.reasoning_effort || t("drawer.subagentModelDefault")}
: null}
+ {t("drawer.subagentExecutionConfig")}: {subagentPreview.executionConfig || t("drawer.subagentExecutionConfigNone")}
void applyGoalSubagentConfiguration()} type="button">{t("common.confirm")}
{t("common.cancel")}
@@ -747,6 +759,7 @@ export function ContextDrawer({ agents, attentionHistory = [], onSelectAttention
{t("drawer.subagentEffort")} {currentSubagentConfiguration.modelConfig?.reasoning_effort || t("drawer.subagentModelDefault")}
{t("drawer.subagentCurrentBoundary")} {currentSubagentConfiguration.allowedDomains.join(" · ") || t("drawer.subagentDomainsUnrestricted")}
{t("drawer.subagentChildLimit")} {currentSubagentConfiguration.maxChildren || 0}
+
{t("drawer.subagentExecutionConfig")} {currentSubagentConfiguration.executionConfig || t("drawer.subagentExecutionConfigNone")}
{readOnly ? (
{t("drawer.subagentRemoteReadOnly")}
@@ -793,6 +806,17 @@ export function ContextDrawer({ agents, attentionHistory = [], onSelectAttention
{ setSubagentModel("gpt-5.6-luna"); setSubagentEffort("max"); setSubagentPreview(null); setSubagentMutationState("idle"); setSubagentFeedback(null); }}>{t("drawer.subagentLunaPreset")}
{ setSubagentModel(""); setSubagentEffort(""); setSubagentPreview(null); setSubagentMutationState("idle"); setSubagentFeedback(null); }}>{t("drawer.subagentClearModel")}
{t("drawer.subagentModelHint")}
+
+ {t("drawer.subagentExecutionConfig")}
+ { setSubagentExecutionConfig(event.target.value); setSubagentPreview(null); setSubagentMutationState("idle"); setSubagentFeedback(null); }}
+ placeholder=".loopx/config/delegations.json"
+ value={subagentExecutionConfig}
+ />
+
+
{t("drawer.subagentExecutionConfigHint")}
{t("drawer.subagentMaxChildren")}
({agent_id: "", token_budget: 0, execution_config: ".loopx/config/delegations.json"});
+ const [settings, setSettings] = useState({agent_id: "", token_budget: 0});
useEffect(() => {
let alive = true;
let refreshing = false;
@@ -38,10 +38,10 @@ export function GoalLoopXMode({sessionId, onPrepare, onExecute, onChange}: {
const active = Boolean(snapshot?.enabled && snapshot.active_turn_id);
const native = snapshot?.native.status ?? "absent";
const resume = !["absent", "complete"].includes(native);
- const configured = Boolean(snapshot?.settings.agent_id && snapshot.settings.token_budget);
+ const configured = Boolean(snapshot?.settings.agent_id && snapshot.settings.token_budget
+ && snapshot.settings.execution_config);
const editSettings = (current: LoopXModeSnapshot) => {
- setSettings({agent_id: current.settings.agent_id ?? "", token_budget: current.settings.token_budget ?? 0,
- execution_config: current.settings.execution_config ?? ".loopx/config/delegations.json"});
+ setSettings({agent_id: current.settings.agent_id ?? "", token_budget: current.settings.token_budget ?? 0});
setEditing(true);
};
const status = !snapshot?.enabled ? (zh ? "普通对话" : "Conversation")
@@ -92,9 +92,9 @@ export function GoalLoopXMode({sessionId, onPrepare, onExecute, onChange}: {
{editing ? {zh ? "绑定文件由 Goal 子代理设置统一管理;额度包含协调员历史用量,成员授权不会因开启模式而扩大。" : "Manage the binding file in Goal sub-agent settings. The allowance includes coordinator history; enabling this mode does not expand member grants."}
+ {zh ? "协调员累计用量" : "Coordinator usage"} {snapshot.native.tokensUsed.toLocaleString()} / {snapshot.native.tokenBudget?.toLocaleString() ?? "—"} tokens
: null}
{snapshot?.enabled && snapshot.ingress.some(row => row.status !== "delivered") ? {zh ? "待处理消息:" : "Pending messages: "}{snapshot.ingress.filter(row => row.status !== "delivered").map(row => `${row.mode === "loopx_queue" ? "queue" : "inbox"} · ${row.status}`).join(" / ")}
: null}
{snapshot?.enabled && snapshot.deliveries.length ?