refactor: dedupe media generation action helpers

This commit is contained in:
Peter Steinberger
2026-04-06 16:51:47 +01:00
parent c88870ac93
commit 93338ffbcc
3 changed files with 101 additions and 108 deletions

View File

@@ -0,0 +1,59 @@
type MediaGenerateActionResult = {
content: Array<{ type: "text"; text: string }>;
details: Record<string, unknown>;
};
type TaskStatusTextBuilder<Task> = (task: Task, params?: { duplicateGuard?: boolean }) => string;
export type { MediaGenerateActionResult };
export function createMediaGenerateStatusActionResult<Task>(params: {
sessionKey?: string;
inactiveText: string;
findActiveTask: (sessionKey?: string) => Task | undefined;
buildStatusText: TaskStatusTextBuilder<Task>;
buildStatusDetails: (task: Task) => Record<string, unknown>;
}): MediaGenerateActionResult {
const activeTask = params.findActiveTask(params.sessionKey);
if (!activeTask) {
return {
content: [{ type: "text", text: params.inactiveText }],
details: {
action: "status",
active: false,
},
};
}
return {
content: [{ type: "text", text: params.buildStatusText(activeTask) }],
details: {
action: "status",
...params.buildStatusDetails(activeTask),
},
};
}
export function createMediaGenerateDuplicateGuardResult<Task>(params: {
sessionKey?: string;
findActiveTask: (sessionKey?: string) => Task | undefined;
buildStatusText: TaskStatusTextBuilder<Task>;
buildStatusDetails: (task: Task) => Record<string, unknown>;
}): MediaGenerateActionResult | null {
const activeTask = params.findActiveTask(params.sessionKey);
if (!activeTask) {
return null;
}
return {
content: [
{
type: "text",
text: params.buildStatusText(activeTask, { duplicateGuard: true }),
},
],
details: {
action: "status",
duplicateGuard: true,
...params.buildStatusDetails(activeTask),
},
};
}

View File

@@ -7,15 +7,13 @@ import {
buildMusicGenerationTaskStatusText,
findActiveMusicGenerationTaskForSession,
} from "../music-generation-task-status.js";
import {
createMediaGenerateDuplicateGuardResult,
createMediaGenerateStatusActionResult,
type MediaGenerateActionResult,
} from "./media-generate-tool-actions-shared.js";
type MusicGenerateActionResult = {
content: Array<{ type: "text"; text: string }>;
details: Record<string, unknown>;
};
function getMusicGenerationProviderAuthEnvVars(providerId: string): string[] {
return getProviderEnvVars(providerId);
}
type MusicGenerateActionResult = MediaGenerateActionResult;
function summarizeMusicGenerationCapabilities(
provider: ReturnType<typeof listRuntimeMusicGenerationProviders>[number],
@@ -57,7 +55,7 @@ export function createMusicGenerateListActionResult(
};
}
const lines = providers.map((provider) => {
const authHints = getMusicGenerationProviderAuthEnvVars(provider.id);
const authHints = getProviderEnvVars(provider.id);
const capabilities = summarizeMusicGenerationCapabilities(provider);
return [
`${provider.id}: default=${provider.defaultModel ?? "none"}`,
@@ -76,7 +74,7 @@ export function createMusicGenerateListActionResult(
defaultModel: provider.defaultModel,
models: provider.models ?? [],
modes: listSupportedMusicGenerationModes(provider),
authEnvVars: getMusicGenerationProviderAuthEnvVars(provider.id),
authEnvVars: getProviderEnvVars(provider.id),
capabilities: provider.capabilities,
})),
},
@@ -86,53 +84,22 @@ export function createMusicGenerateListActionResult(
export function createMusicGenerateStatusActionResult(
sessionKey?: string,
): MusicGenerateActionResult {
const activeTask = findActiveMusicGenerationTaskForSession(sessionKey);
if (!activeTask) {
return {
content: [
{
type: "text",
text: "No active music generation task is currently running for this session.",
},
],
details: {
action: "status",
active: false,
},
};
}
return {
content: [
{
type: "text",
text: buildMusicGenerationTaskStatusText(activeTask),
},
],
details: {
action: "status",
...buildMusicGenerationTaskStatusDetails(activeTask),
},
};
return createMediaGenerateStatusActionResult({
sessionKey,
inactiveText: "No active music generation task is currently running for this session.",
findActiveTask: findActiveMusicGenerationTaskForSession,
buildStatusText: buildMusicGenerationTaskStatusText,
buildStatusDetails: buildMusicGenerationTaskStatusDetails,
});
}
export function createMusicGenerateDuplicateGuardResult(
sessionKey?: string,
): MusicGenerateActionResult | null {
const activeTask = findActiveMusicGenerationTaskForSession(sessionKey);
if (!activeTask) {
return null;
}
return {
content: [
{
type: "text",
text: buildMusicGenerationTaskStatusText(activeTask, { duplicateGuard: true }),
},
],
details: {
action: "status",
duplicateGuard: true,
...buildMusicGenerationTaskStatusDetails(activeTask),
},
};
return createMediaGenerateDuplicateGuardResult({
sessionKey,
findActiveTask: findActiveMusicGenerationTaskForSession,
buildStatusText: buildMusicGenerationTaskStatusText,
buildStatusDetails: buildMusicGenerationTaskStatusDetails,
});
}

View File

@@ -7,15 +7,13 @@ import {
buildVideoGenerationTaskStatusText,
findActiveVideoGenerationTaskForSession,
} from "../video-generation-task-status.js";
import {
createMediaGenerateDuplicateGuardResult,
createMediaGenerateStatusActionResult,
type MediaGenerateActionResult,
} from "./media-generate-tool-actions-shared.js";
type VideoGenerateActionResult = {
content: Array<{ type: "text"; text: string }>;
details: Record<string, unknown>;
};
function getVideoGenerationProviderAuthEnvVars(providerId: string): string[] {
return getProviderEnvVars(providerId);
}
type VideoGenerateActionResult = MediaGenerateActionResult;
function summarizeVideoGenerationCapabilities(
provider: ReturnType<typeof listRuntimeVideoGenerationProviders>[number],
@@ -61,7 +59,7 @@ export function createVideoGenerateListActionResult(
};
}
const lines = providers.map((provider) => {
const authHints = getVideoGenerationProviderAuthEnvVars(provider.id);
const authHints = getProviderEnvVars(provider.id);
const capabilities = summarizeVideoGenerationCapabilities(provider);
return [
`${provider.id}: default=${provider.defaultModel ?? "none"}`,
@@ -80,7 +78,7 @@ export function createVideoGenerateListActionResult(
defaultModel: provider.defaultModel,
models: provider.models ?? [],
modes: listSupportedVideoGenerationModes(provider),
authEnvVars: getVideoGenerationProviderAuthEnvVars(provider.id),
authEnvVars: getProviderEnvVars(provider.id),
capabilities: provider.capabilities,
})),
},
@@ -90,53 +88,22 @@ export function createVideoGenerateListActionResult(
export function createVideoGenerateStatusActionResult(
sessionKey?: string,
): VideoGenerateActionResult {
const activeTask = findActiveVideoGenerationTaskForSession(sessionKey);
if (!activeTask) {
return {
content: [
{
type: "text",
text: "No active video generation task is currently running for this session.",
},
],
details: {
action: "status",
active: false,
},
};
}
return {
content: [
{
type: "text",
text: buildVideoGenerationTaskStatusText(activeTask),
},
],
details: {
action: "status",
...buildVideoGenerationTaskStatusDetails(activeTask),
},
};
return createMediaGenerateStatusActionResult({
sessionKey,
inactiveText: "No active video generation task is currently running for this session.",
findActiveTask: findActiveVideoGenerationTaskForSession,
buildStatusText: buildVideoGenerationTaskStatusText,
buildStatusDetails: buildVideoGenerationTaskStatusDetails,
});
}
export function createVideoGenerateDuplicateGuardResult(
sessionKey?: string,
): VideoGenerateActionResult | null {
const activeTask = findActiveVideoGenerationTaskForSession(sessionKey);
if (!activeTask) {
return null;
}
return {
content: [
{
type: "text",
text: buildVideoGenerationTaskStatusText(activeTask, { duplicateGuard: true }),
},
],
details: {
action: "status",
duplicateGuard: true,
...buildVideoGenerationTaskStatusDetails(activeTask),
},
};
return createMediaGenerateDuplicateGuardResult({
sessionKey,
findActiveTask: findActiveVideoGenerationTaskForSession,
buildStatusText: buildVideoGenerationTaskStatusText,
buildStatusDetails: buildVideoGenerationTaskStatusDetails,
});
}