diff --git a/src/headless-events.ts b/src/headless-events.ts index 4710db020..272fb9843 100644 --- a/src/headless-events.ts +++ b/src/headless-events.ts @@ -43,6 +43,8 @@ export function mapStatusToExitCode(status: string): number { return EXIT_BLOCKED; case "cancelled": return EXIT_CANCELLED; + case "reload": + return EXIT_RELOAD; default: return EXIT_ERROR; } diff --git a/src/resources/extensions/sf/definition-loader.ts b/src/resources/extensions/sf/definition-loader.ts index c18718567..f7c7b911e 100644 --- a/src/resources/extensions/sf/definition-loader.ts +++ b/src/resources/extensions/sf/definition-loader.ts @@ -19,6 +19,9 @@ import { parse } from "yaml"; // ─── Public TypeScript Types (camelCase) ───────────────────────────────── +/** + * Step verification policy: content-heuristic, shell-command, prompt-verify, or human-review. + */ export type VerifyPolicy = | { policy: "content-heuristic"; minSize?: number; pattern?: string } | { policy: "shell-command"; command: string } @@ -32,6 +35,9 @@ export interface IterateConfig { pattern: string; } +/** + * Workflow step definition with prompt, dependencies, produced artifacts, and optional verification. + */ export interface StepDefinition { /** Unique step identifier within the workflow. */ id: string; diff --git a/src/resources/extensions/sf/notification-store.ts b/src/resources/extensions/sf/notification-store.ts index ed740f233..a1a9da0f2 100644 --- a/src/resources/extensions/sf/notification-store.ts +++ b/src/resources/extensions/sf/notification-store.ts @@ -106,7 +106,7 @@ export function appendNotification( : `${_basePath}:${severity}:${source}:${persistedMessage}`; const now = Date.now(); const lastSeen = _recentMessageTimestamps.get(dedupKey); - if (lastSeen !== undefined && now - lastSeen < DEDUP_WINDOW_MS) return; + if (lastSeen !== undefined && now - lastSeen <= DEDUP_WINDOW_MS) return; _recentMessageTimestamps.set(dedupKey, now); if (_recentMessageTimestamps.size > DEDUP_PRUNE_THRESHOLD) { for (const [key, ts] of _recentMessageTimestamps) { @@ -347,7 +347,7 @@ function _withLock(basePath: string, fn: () => T): T { try { const stat = readFileSync(lockPath, "utf-8"); const lockTime = parseInt(stat, 10); - if (Date.now() - lockTime > 5000) { + if (Number.isFinite(lockTime) && Date.now() - lockTime > 5000) { try { unlinkSync(lockPath); } catch {