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
46 lines
1.4 KiB
TypeScript
46 lines
1.4 KiB
TypeScript
import {
|
|
selectSessionMessagesById,
|
|
type AgentSessionEngineState
|
|
} from "@tutti-os/agent-activity-core";
|
|
import { resolveAgentGUIFirstUserMessageDisplayPrompt } from "./agentConversationTitleProjection.ts";
|
|
|
|
export type AgentGUIConversationRailTitlePromptsBySessionId = Readonly<
|
|
Record<string, string>
|
|
>;
|
|
|
|
export function createAgentGUIConversationRailTitlePromptSelector(): (
|
|
state: AgentSessionEngineState
|
|
) => AgentGUIConversationRailTitlePromptsBySessionId {
|
|
let previous: AgentGUIConversationRailTitlePromptsBySessionId = {};
|
|
|
|
return (state) => {
|
|
const next: Record<string, string> = {};
|
|
for (const [agentSessionId, messages] of Object.entries(
|
|
selectSessionMessagesById(state)
|
|
)) {
|
|
const displayPrompt =
|
|
resolveAgentGUIFirstUserMessageDisplayPrompt(messages);
|
|
if (displayPrompt) {
|
|
next[agentSessionId] = displayPrompt;
|
|
}
|
|
}
|
|
if (agentGUIConversationRailTitlePromptsEqual(previous, next)) {
|
|
return previous;
|
|
}
|
|
previous = next;
|
|
return previous;
|
|
};
|
|
}
|
|
|
|
function agentGUIConversationRailTitlePromptsEqual(
|
|
left: AgentGUIConversationRailTitlePromptsBySessionId,
|
|
right: AgentGUIConversationRailTitlePromptsBySessionId
|
|
): boolean {
|
|
const leftKeys = Object.keys(left);
|
|
const rightKeys = Object.keys(right);
|
|
return (
|
|
leftKeys.length === rightKeys.length &&
|
|
leftKeys.every((key) => left[key] === right[key])
|
|
);
|
|
}
|