feat(FN-1524): add POST /routines/:id/trigger endpoint

- Add POST /routines/:id/trigger as canonical endpoint for manual routine triggers
- Keep POST /routines/:id/run as backward-compatible alias
- Remove duplicate recordRun calls from routine route handlers (persistence handled by RoutineRunner)
- Update webhook auth to return 401 instead of 403 for signature failures
- Fix TypeScript types for promptOverrides to support null values (delete semantics)
- Fix API endpoint to return empty diff stats when worktree doesn't exist
This commit is contained in:
gsxdsm
2026-04-14 09:28:05 -07:00
parent 817f5eae90
commit bc74460340
6 changed files with 22 additions and 23 deletions

View File

@@ -303,10 +303,9 @@ export function AgentPromptsManager({
// Handle prompt override change
const handlePromptOverrideChange = useCallback(
(key: PromptKey, value: string) => {
onPromptOverridesChange({
...promptOverrides,
[key]: value || null,
});
const newOverrides = { ...promptOverrides } as Record<PromptKey, string | null>;
newOverrides[key] = value || null;
onPromptOverridesChange(newOverrides);
},
[promptOverrides, onPromptOverridesChange],
);
@@ -314,10 +313,9 @@ export function AgentPromptsManager({
// Handle reset (set to null) for a prompt override
const handleResetOverride = useCallback(
(key: PromptKey) => {
onPromptOverridesChange({
...promptOverrides,
[key]: null,
});
const newOverrides = { ...promptOverrides } as Record<PromptKey, string | null>;
newOverrides[key] = null;
onPromptOverridesChange(newOverrides);
},
[promptOverrides, onPromptOverridesChange],
);

View File

@@ -2104,10 +2104,10 @@ export function SettingsModal({
}));
}}
promptOverrides={form.promptOverrides}
onPromptOverridesChange={(promptOverrides: Record<PromptKey, string | null> | undefined) => {
onPromptOverridesChange={(overrides) => {
setForm((f) => ({
...f,
promptOverrides,
promptOverrides: overrides,
}));
}}
/>

View File

@@ -15,9 +15,9 @@
import { randomUUID } from "node:crypto";
// Dynamic import for @fusion/core to get prompt override resolution
type PromptOverrideMap = Record<string, string | undefined>;
type PromptOverrideMap = Record<string, string | null>;
type ResolvePromptFn = (key: string, overrides?: PromptOverrideMap) => string;
let resolvePrompt: ResolvePromptFn = () => "";
let promptCatalogReady = false;
@@ -414,7 +414,7 @@ export function parseGenerationResponse(text: string): AgentGenerationSpec {
*
* @param ip - Client IP for rate limiting
* @param roleDescription - The user's description of the desired agent role
* @returns Session object (without spec call generateAgentSpec to populate)
* @returns Session object (without spec - call generateAgentSpec to populate)
*/
export async function startAgentGeneration(
ip: string,

View File

@@ -116,15 +116,15 @@ export function __setCreateKbAgentForRefine(mock: typeof createKbAgentForRefine)
}
// Default system prompt for workflow step refinement (fallback when overrides unavailable)
let resolveWorkflowStepRefinePrompt: (key: string, overrides?: Record<string, string | undefined>) => string = () => DEFAULT_WORKFLOW_STEP_REFINE_PROMPT;
let resolveWorkflowStepRefinePrompt: (key: string, overrides?: Record<string, string | null>) => string = () => DEFAULT_WORKFLOW_STEP_REFINE_PROMPT;
let promptOverridesReady = false;
async function initPromptOverrides() {
if (promptOverridesReady) return;
try {
const core = await import("@fusion/core");
resolveWorkflowStepRefinePrompt = (key: string, overrides?: Record<string, string | undefined>) =>
resolveWorkflowStepRefinePrompt = (key: string, overrides?: Record<string, string | null>) =>
core.resolvePrompt(key as keyof typeof core.PROMPT_KEY_CATALOG, overrides);
promptOverridesReady = true;
} catch {