import { VersionInfo } from '@start9labs/start-sdk' export const v_0_2_60 = VersionInfo.of({ version: '0.2.60:0', releaseNotes: { en_US: 'Two fixes after a third "still doesn\'t work" iteration on the title bug. (1) ACTUAL root cause of the "Untitled" library entry persistence: jobs.js#markComplete() was double-nesting the SSE done event. Callers pass `{result: {title, transcript, ...inner}, credit_charged, tier}` as the envelope; markComplete then did `appendEvent(jobId, "done", { result: envelope })` which produced `data.result = envelope` on the SSE side — so the actual fields lived at `data.result.result.title`, not `data.result.title`. Recap-app\'s SSE handler reads `finalResult = data.result` then accesses `finalResult.title`, which was undefined every time. That\'s why the audit log showed the correct title (recorded from the relay\'s local `title` variable, not from this SSE path) while Recap\'s library showed "Untitled". Fixed by unwrapping inside markComplete: SSE done event now emits `data: {result: , credit_charged, tier}` so subscribers can read `data.result.title` directly. Internal consumers (job.result on the in-memory job record) still see the full envelope shape. Backwards-compatible with older Recap clients that read the same nested location — they\'ll just get undefined where they already got undefined. (2) New "view raw response" button on the Discovery diagnostic strip. Shows what /admin/jobs actually returned on the last poll: total entries count, breakdown by kind, breakdown by status, and the 5 most recent jobs (any status) with id/kind/status/age/progress. Critical for diagnosing "Discovery ON, found: 0 running" when the operator KNOWS a job is in flight — operator can immediately see whether the relay\'s jobs map is empty (routing / cookie issue), whether the job has a kind the filter doesn\'t recognize, or whether the job status flipped to something unexpected.', }, migrations: { up: async ({ effects }) => {}, down: async ({ effects }) => {}, }, })