Publish Claude Code Binaries / Stage and publish binaries (push) Canceled after 0s
Publish Tutti App Runtime / Build darwin-arm64 (push) Canceled after 0s
Publish Tutti App Runtime / Build darwin-amd64 (push) Canceled after 0s
Publish Tutti App Runtime / Build linux-amd64 (push) Canceled after 0s
Publish Tutti App Runtime / Build windows-amd64 (push) Canceled after 0s
Sync Tutti Agent Skills / sync (push) Canceled after 0s
Windows Agent Adapters / Test Windows agent adapters (push) Canceled after 0s
Windows Daemon Adapters / Test Windows daemon adapters (push) Canceled after 0s
Publish Tutti App Runtime / Publish runtime catalog (push) Canceled after 0s
75 lines
2.5 KiB
TypeScript
75 lines
2.5 KiB
TypeScript
import {
|
|
type AgentActivityGoalControlAction,
|
|
type AgentSessionEngine
|
|
} from "@tutti-os/agent-activity-core";
|
|
import type { Dispatch, RefObject, SetStateAction } from "react";
|
|
import { useCallback, useRef } from "react";
|
|
import { translate } from "../../../i18n/index";
|
|
import type { AgentComposerDraft } from "../model/agentGuiNodeTypes";
|
|
import {
|
|
emptyAgentComposerDraft,
|
|
snapshotAgentComposerDraft
|
|
} from "../model/agentComposerDraft";
|
|
import type { AgentGUIGoalControlPendingSettlement } from "./AgentGUIEngineSettlementController";
|
|
|
|
interface UseAgentGUIGoalControlActionsInput {
|
|
activeConversationIdRef: RefObject<string | null>;
|
|
draftByScopeKeyRef: RefObject<Record<string, AgentComposerDraft>>;
|
|
goalControlSettlementsRef: RefObject<
|
|
Record<string, AgentGUIGoalControlPendingSettlement>
|
|
>;
|
|
sessionEngine: AgentSessionEngine;
|
|
setDetailError: Dispatch<SetStateAction<string | null>>;
|
|
}
|
|
|
|
export function useAgentGUIGoalControlActions(
|
|
input: UseAgentGUIGoalControlActionsInput
|
|
) {
|
|
const requestSequenceRef = useRef(0);
|
|
const goalControl = useCallback(
|
|
(
|
|
action: AgentActivityGoalControlAction,
|
|
objective?: string,
|
|
submittedDraftScopeKey?: string
|
|
) => {
|
|
const agentSessionId = input.activeConversationIdRef.current;
|
|
if (!agentSessionId) return;
|
|
const clientSubmitId = `goal-control:${Date.now()}:${++requestSequenceRef.current}`;
|
|
const submittedDraftSnapshot = submittedDraftScopeKey
|
|
? {
|
|
sourceScopeKey: submittedDraftScopeKey,
|
|
content: snapshotAgentComposerDraft(
|
|
input.draftByScopeKeyRef.current[submittedDraftScopeKey] ??
|
|
emptyAgentComposerDraft()
|
|
),
|
|
targetAgentSessionId: agentSessionId
|
|
}
|
|
: null;
|
|
input.setDetailError(null);
|
|
const admission = input.sessionEngine.controlGoal({
|
|
action,
|
|
agentSessionId,
|
|
clientSubmitId,
|
|
...(objective !== undefined ? { objective } : {})
|
|
});
|
|
if (!admission.accepted) {
|
|
input.setDetailError(translate("agentHost.agentGui.goalControlFailed"));
|
|
return;
|
|
}
|
|
input.goalControlSettlementsRef.current[agentSessionId] = {
|
|
action,
|
|
clientSubmitId: admission.clientSubmitId,
|
|
submittedDraftSnapshot
|
|
};
|
|
},
|
|
[
|
|
input.activeConversationIdRef,
|
|
input.draftByScopeKeyRef,
|
|
input.goalControlSettlementsRef,
|
|
input.sessionEngine,
|
|
input.setDetailError
|
|
]
|
|
);
|
|
return { goalControl };
|
|
}
|