From 2c27b72221a747863bed5461c4ef28c34a1295cb Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Sun, 23 Nov 2025 02:43:38 +0000 Subject: [PATCH 1/2] Implement note history system for meeting context tracking - Add note_history table to database schema with session_id, content, created_at_ms, and transcript_id fields - Update TinyBase client-side schema to include note_history table - Install diff library for text diffing between note snapshots - Implement change detection in main.ts to capture note history when raw_md changes - Add temporal context processing in enhance-transform.ts to categorize notes by beforeMeeting, duringMeeting, and afterMeeting - Update AI prompt template to display temporal note history sections - Update enhance-workflow.ts to pass note_history data to template - Compute diffs between consecutive note snapshots to show what was added over time Co-Authored-By: yujonglee --- apps/desktop/package.json | 1 + apps/desktop/src/store/tinybase/main.ts | 30 ++++ .../src/store/tinybase/schema-external.ts | 22 +++ .../ai-task/task-configs/enhance-transform.ts | 152 ++++++++++++++++++ .../ai-task/task-configs/enhance-workflow.ts | 4 +- crates/template/assets/enhance.user.jinja | 20 +++ packages/db/src/schema.ts | 18 +++ pnpm-lock.yaml | 119 ++++++++++++-- 8 files changed, 351 insertions(+), 15 deletions(-) diff --git a/apps/desktop/package.json b/apps/desktop/package.json index 4f54bf170d..78c059f426 100644 --- a/apps/desktop/package.json +++ b/apps/desktop/package.json @@ -76,6 +76,7 @@ "chroma-js": "^3.1.2", "clsx": "^2.1.1", "date-fns": "^4.1.0", + "diff": "^8.0.2", "dompurify": "^3.3.0", "effect": "^3.19.4", "json5": "^2.2.3", diff --git a/apps/desktop/src/store/tinybase/main.ts b/apps/desktop/src/store/tinybase/main.ts index aac997a7bc..91353ac8d6 100644 --- a/apps/desktop/src/store/tinybase/main.ts +++ b/apps/desktop/src/store/tinybase/main.ts @@ -98,6 +98,36 @@ export const StoreComponent = ({ persist = true }: { persist?: boolean }) => { deleted: !cells, updated: !!cells, }); + + if (tableId === TABLE_SESSIONS && cells && "raw_md" in cells) { + const rawMd = store.getCell("sessions", rowId, "raw_md"); + if (typeof rawMd === "string") { + const userId = store.getCell("sessions", rowId, "user_id"); + const createdAtMs = Date.now(); + + let transcriptId: string | undefined; + store.forEachRow("transcripts", (tId, _forEachCell) => { + const tSessionId = store.getCell( + "transcripts", + tId, + "session_id", + ); + if (tSessionId === rowId) { + transcriptId = tId; + } + }); + + const historyId = crypto.randomUUID(); + store.setRow("note_history", historyId, { + user_id: typeof userId === "string" ? userId : DEFAULT_USER_ID, + created_at: new Date().toISOString(), + session_id: rowId, + content: rawMd, + created_at_ms: createdAtMs, + transcript_id: transcriptId, + }); + } + } }); }); }, diff --git a/apps/desktop/src/store/tinybase/schema-external.ts b/apps/desktop/src/store/tinybase/schema-external.ts index 0c33e1ec95..5ad75b473c 100644 --- a/apps/desktop/src/store/tinybase/schema-external.ts +++ b/apps/desktop/src/store/tinybase/schema-external.ts @@ -11,6 +11,7 @@ import { mappingSessionParticipantSchema as baseMappingSessionParticipantSchema, mappingTagSessionSchema as baseMappingTagSessionSchema, memorySchema as baseMemorySchema, + noteHistorySchema as baseNoteHistorySchema, organizationSchema as baseOrganizationSchema, sessionSchema as baseSessionSchema, speakerHintSchema as baseSpeakerHintSchema, @@ -116,6 +117,17 @@ export const memorySchema = baseMemorySchema.omit({ id: true }).extend({ created_at: z.string(), }); +export const noteHistorySchema = baseNoteHistorySchema + .omit({ id: true }) + .extend({ + created_at: z.string(), + created_at_ms: z.number(), + transcript_id: z.preprocess( + (val) => val ?? undefined, + z.string().optional(), + ), + }); + export const enhancedNoteSchema = z.object({ user_id: z.string(), created_at: z.string(), @@ -165,6 +177,7 @@ export type TemplateSection = z.infer; export type ChatGroup = z.infer; export type ChatMessage = z.infer; export type Memory = z.infer; +export type NoteHistory = z.infer; export type EnhancedNote = z.infer; export type SessionStorage = ToStorageType; @@ -176,6 +189,7 @@ export type SpeakerHintStorage = ToStorageType< export type TemplateStorage = ToStorageType; export type ChatMessageStorage = ToStorageType; export type MemoryStorage = ToStorageType; +export type NoteHistoryStorage = ToStorageType; export type EnhancedNoteStorage = ToStorageType; export const externalTableSchemaForTinybase = { @@ -296,6 +310,14 @@ export const externalTableSchemaForTinybase = { type: { type: "string" }, text: { type: "string" }, } satisfies InferTinyBaseSchema, + note_history: { + user_id: { type: "string" }, + created_at: { type: "string" }, + session_id: { type: "string" }, + content: { type: "string" }, + created_at_ms: { type: "number" }, + transcript_id: { type: "string" }, + } satisfies InferTinyBaseSchema, enhanced_notes: { user_id: { type: "string" }, created_at: { type: "string" }, diff --git a/apps/desktop/src/store/zustand/ai-task/task-configs/enhance-transform.ts b/apps/desktop/src/store/zustand/ai-task/task-configs/enhance-transform.ts index ce9f0500c4..34ee6f3459 100644 --- a/apps/desktop/src/store/zustand/ai-task/task-configs/enhance-transform.ts +++ b/apps/desktop/src/store/zustand/ai-task/task-configs/enhance-transform.ts @@ -1,3 +1,5 @@ +import * as Diff from "diff"; + import type { TaskArgsMap, TaskArgsMapTransformed, TaskConfig } from "."; import { buildSegments, @@ -54,16 +56,21 @@ async function transformArgs( sessionData: sessionContext.sessionData, participants: sessionContext.participants, segments: sessionContext.segments, + noteHistory: sessionContext.noteHistory, template, }; } function getSessionContext(sessionId: string, store: MainStore) { + const transcripts = collectTranscripts(sessionId, store); + const noteHistory = getNoteHistory(sessionId, transcripts, store); + return { rawMd: getStringCell(store, "sessions", sessionId, "raw_md"), sessionData: getSessionData(sessionId, store), participants: getParticipants(sessionId, store), segments: getTranscriptSegments(sessionId, store), + noteHistory, }; } @@ -377,3 +384,148 @@ function getNumberCell( const value = store.getCell(tableId, rowId, columnId); return typeof value === "number" ? value : undefined; } + +type NoteHistoryEntry = { + content: string; + created_at_ms: number; + transcript_id?: string; +}; + +type TemporalNoteHistory = { + beforeMeeting?: string; + duringMeeting?: string; + afterMeeting?: string; +}; + +function getNoteHistory( + sessionId: string, + transcripts: readonly TranscriptMeta[], + store: MainStore, +): TemporalNoteHistory | undefined { + const historyEntries: NoteHistoryEntry[] = []; + + store.forEachRow("note_history", (historyId, _forEachCell) => { + const historySessionId = getOptionalStringCell( + store, + "note_history", + historyId, + "session_id", + ); + if (historySessionId !== sessionId) { + return; + } + + const content = getStringCell(store, "note_history", historyId, "content"); + const createdAtMs = getNumberCell( + store, + "note_history", + historyId, + "created_at_ms", + ); + const transcriptId = getOptionalStringCell( + store, + "note_history", + historyId, + "transcript_id", + ); + + if (content && createdAtMs !== undefined) { + historyEntries.push({ + content, + created_at_ms: createdAtMs, + transcript_id: transcriptId, + }); + } + }); + + if (historyEntries.length === 0) { + return undefined; + } + + historyEntries.sort((a, b) => a.created_at_ms - b.created_at_ms); + + if (transcripts.length === 0) { + const diffs = computeDiffs(historyEntries); + return { + beforeMeeting: diffs.length > 0 ? diffs.join("\n\n") : undefined, + }; + } + + const firstTranscriptStart = Math.min(...transcripts.map((t) => t.startedAt)); + const lastTranscriptStart = Math.max(...transcripts.map((t) => t.startedAt)); + + const beforeEntries = historyEntries.filter( + (entry) => entry.created_at_ms < firstTranscriptStart, + ); + const duringEntries = historyEntries.filter( + (entry) => + entry.created_at_ms >= firstTranscriptStart && + entry.created_at_ms <= lastTranscriptStart, + ); + const afterEntries = historyEntries.filter( + (entry) => entry.created_at_ms > lastTranscriptStart, + ); + + const result: TemporalNoteHistory = {}; + + if (beforeEntries.length > 0) { + const diffs = computeDiffs(beforeEntries); + if (diffs.length > 0) { + result.beforeMeeting = diffs.join("\n\n"); + } + } + + if (duringEntries.length > 0) { + const diffs = computeDiffs(duringEntries); + if (diffs.length > 0) { + result.duringMeeting = diffs.join("\n\n"); + } + } + + if (afterEntries.length > 0) { + const diffs = computeDiffs(afterEntries); + if (diffs.length > 0) { + result.afterMeeting = diffs.join("\n\n"); + } + } + + if (!result.beforeMeeting && !result.duringMeeting && !result.afterMeeting) { + return undefined; + } + + return result; +} + +function computeDiffs(entries: readonly NoteHistoryEntry[]): string[] { + if (entries.length === 0) { + return []; + } + + const diffs: string[] = []; + + for (let i = 0; i < entries.length; i++) { + if (i === 0) { + if (entries[i].content.trim()) { + diffs.push(`Initial notes:\n${entries[i].content}`); + } + } else { + const prevContent = entries[i - 1].content; + const currentContent = entries[i].content; + + const changes = Diff.diffLines(prevContent, currentContent); + const addedLines: string[] = []; + + for (const change of changes) { + if (change.added) { + addedLines.push(change.value.trim()); + } + } + + if (addedLines.length > 0) { + diffs.push(`Added:\n${addedLines.join("\n")}`); + } + } + } + + return diffs; +} diff --git a/apps/desktop/src/store/zustand/ai-task/task-configs/enhance-workflow.ts b/apps/desktop/src/store/zustand/ai-task/task-configs/enhance-workflow.ts index b32165cd91..10cc6ca8be 100644 --- a/apps/desktop/src/store/zustand/ai-task/task-configs/enhance-workflow.ts +++ b/apps/desktop/src/store/zustand/ai-task/task-configs/enhance-workflow.ts @@ -80,7 +80,8 @@ async function getSystemPrompt(args: TaskArgsMapTransformed["enhance"]) { } async function getUserPrompt(args: TaskArgsMapTransformed["enhance"]) { - const { rawMd, sessionData, participants, template, segments } = args; + const { rawMd, sessionData, participants, template, segments, noteHistory } = + args; const result = await templateCommands.render("enhance.user", { content: rawMd, @@ -88,6 +89,7 @@ async function getUserPrompt(args: TaskArgsMapTransformed["enhance"]) { participants, template, segments, + note_history: noteHistory, }); if (result.status === "error") { diff --git a/crates/template/assets/enhance.user.jinja b/crates/template/assets/enhance.user.jinja index 80bcb9fc17..58fe79feea 100644 --- a/crates/template/assets/enhance.user.jinja +++ b/crates/template/assets/enhance.user.jinja @@ -36,4 +36,24 @@ Sections to cover: {% endif %} +{%- if note_history %} +{%- if note_history.beforeMeeting %} + +Notes written before the meeting (research, planning): +{{ note_history.beforeMeeting }} +{%- endif %} + +{%- if note_history.duringMeeting %} + +Notes written during the meeting: +{{ note_history.duringMeeting }} +{%- endif %} + +{%- if note_history.afterMeeting %} + +Notes written after the meeting: +{{ note_history.afterMeeting }} +{%- endif %} +{%- endif %} + {{ segments | transcript }} diff --git a/packages/db/src/schema.ts b/packages/db/src/schema.ts index a66a7b5078..ecbfb0acdd 100644 --- a/packages/db/src/schema.ts +++ b/packages/db/src/schema.ts @@ -302,6 +302,23 @@ export const memories = pgTable( (table) => createPolicies(TABLE_MEMORIES, table.user_id), ).enableRLS(); +export const TABLE_NOTE_HISTORY = "note_history"; +export const noteHistory = pgTable( + TABLE_NOTE_HISTORY, + { + ...SHARED, + session_id: uuid("session_id") + .notNull() + .references(() => sessions.id, { onDelete: "cascade" }), + content: text("content").notNull(), + created_at_ms: integer("created_at_ms").notNull(), + transcript_id: uuid("transcript_id").references(() => transcripts.id, { + onDelete: "set null", + }), + }, + (table) => createPolicies(TABLE_NOTE_HISTORY, table.user_id), +).enableRLS(); + export const humanSchema = createSelectSchema(humans); export const organizationSchema = createSelectSchema(organizations); export const folderSchema = createSelectSchema(folders); @@ -320,6 +337,7 @@ export const templateSchema = createSelectSchema(templates); export const chatGroupSchema = createSelectSchema(chatGroups); export const chatMessageSchema = createSelectSchema(chatMessages); export const memorySchema = createSelectSchema(memories); +export const noteHistorySchema = createSelectSchema(noteHistory); export const providerSpeakerIndexSchema = z.object({ speaker_index: z.number(), diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 541383fab2..65d0492173 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -243,6 +243,9 @@ importers: date-fns: specifier: ^4.1.0 version: 4.1.0 + diff: + specifier: ^8.0.2 + version: 8.0.2 dompurify: specifier: ^3.3.0 version: 3.3.0 @@ -333,10 +336,10 @@ importers: version: 10.1.0 '@tanstack/react-router-devtools': specifier: ^1.136.8 - version: 1.136.8(@tanstack/react-router@1.136.8(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@tanstack/router-core@1.136.8)(@types/node@24.10.1)(csstype@3.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(solid-js@1.9.10)(tsx@4.20.6)(yaml@2.8.1) + version: 1.136.8(@tanstack/react-router@1.136.8(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@tanstack/router-core@1.136.8)(@types/node@24.10.1)(csstype@3.2.3)(jiti@1.21.7)(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(solid-js@1.9.10)(tsx@4.20.6)(yaml@2.8.1) '@tanstack/router-plugin': specifier: ^1.136.8 - version: 1.136.8(@tanstack/react-router@1.136.8(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1)) + version: 1.136.8(@tanstack/react-router@1.136.8(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(vite@7.2.2(@types/node@24.10.1)(jiti@1.21.7)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1)) '@tauri-apps/cli': specifier: ^2.9.4 version: 2.9.4 @@ -360,7 +363,7 @@ importers: version: 2.0.3 '@vitejs/plugin-react': specifier: ^4.7.0 - version: 4.7.0(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1)) + version: 4.7.0(vite@7.2.2(@types/node@24.10.1)(jiti@1.21.7)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1)) autoprefixer: specifier: ^10.4.22 version: 10.4.22(postcss@8.5.6) @@ -384,10 +387,10 @@ importers: version: 5.8.3 vite: specifier: ^7.2.2 - version: 7.2.2(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1) + version: 7.2.2(@types/node@24.10.1)(jiti@1.21.7)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1) vitest: specifier: ^3.2.4 - version: 3.2.4(@types/debug@4.1.12)(@types/node@24.10.1)(jiti@2.6.1)(jsdom@27.2.0)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1) + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.10.1)(jiti@1.21.7)(jsdom@27.2.0)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1) apps/pro: dependencies: @@ -16826,13 +16829,13 @@ snapshots: - tsx - yaml - '@tanstack/react-router-devtools@1.136.8(@tanstack/react-router@1.136.8(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@tanstack/router-core@1.136.8)(@types/node@24.10.1)(csstype@3.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(solid-js@1.9.10)(tsx@4.20.6)(yaml@2.8.1)': + '@tanstack/react-router-devtools@1.136.8(@tanstack/react-router@1.136.8(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@tanstack/router-core@1.136.8)(@types/node@24.10.1)(csstype@3.2.3)(jiti@1.21.7)(lightningcss@1.30.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(solid-js@1.9.10)(tsx@4.20.6)(yaml@2.8.1)': dependencies: '@tanstack/react-router': 1.136.8(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@tanstack/router-devtools-core': 1.136.8(@tanstack/router-core@1.136.8)(@types/node@24.10.1)(csstype@3.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(solid-js@1.9.10)(tsx@4.20.6)(yaml@2.8.1) + '@tanstack/router-devtools-core': 1.136.8(@tanstack/router-core@1.136.8)(@types/node@24.10.1)(csstype@3.2.3)(jiti@1.21.7)(lightningcss@1.30.2)(solid-js@1.9.10)(tsx@4.20.6)(yaml@2.8.1) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) - vite: 7.2.2(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1) + vite: 7.2.2(@types/node@24.10.1)(jiti@1.21.7)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1) optionalDependencies: '@tanstack/router-core': 1.136.8 transitivePeerDependencies: @@ -16961,14 +16964,14 @@ snapshots: - tsx - yaml - '@tanstack/router-devtools-core@1.136.8(@tanstack/router-core@1.136.8)(@types/node@24.10.1)(csstype@3.2.3)(jiti@2.6.1)(lightningcss@1.30.2)(solid-js@1.9.10)(tsx@4.20.6)(yaml@2.8.1)': + '@tanstack/router-devtools-core@1.136.8(@tanstack/router-core@1.136.8)(@types/node@24.10.1)(csstype@3.2.3)(jiti@1.21.7)(lightningcss@1.30.2)(solid-js@1.9.10)(tsx@4.20.6)(yaml@2.8.1)': dependencies: '@tanstack/router-core': 1.136.8 clsx: 2.1.1 goober: 2.1.18(csstype@3.2.3) solid-js: 1.9.10 tiny-invariant: 1.3.3 - vite: 7.2.2(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1) + vite: 7.2.2(@types/node@24.10.1)(jiti@1.21.7)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1) optionalDependencies: csstype: 3.2.3 transitivePeerDependencies: @@ -17019,7 +17022,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@tanstack/router-plugin@1.136.8(@tanstack/react-router@1.136.8(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1))': + '@tanstack/router-plugin@1.136.8(@tanstack/react-router@1.136.8(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(vite@7.2.2(@types/node@24.10.1)(jiti@1.21.7)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1))': dependencies: '@babel/core': 7.28.5 '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.5) @@ -17037,7 +17040,7 @@ snapshots: zod: 3.25.76 optionalDependencies: '@tanstack/react-router': 1.136.8(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - vite: 7.2.2(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1) + vite: 7.2.2(@types/node@24.10.1)(jiti@1.21.7)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1) transitivePeerDependencies: - supports-color @@ -17923,7 +17926,7 @@ snapshots: '@vercel/oidc@3.0.3': {} - '@vitejs/plugin-react@4.7.0(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1))': + '@vitejs/plugin-react@4.7.0(vite@7.2.2(@types/node@24.10.1)(jiti@1.21.7)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1))': dependencies: '@babel/core': 7.28.5 '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.5) @@ -17931,7 +17934,7 @@ snapshots: '@rolldown/pluginutils': 1.0.0-beta.27 '@types/babel__core': 7.20.5 react-refresh: 0.17.0 - vite: 7.2.2(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1) + vite: 7.2.2(@types/node@24.10.1)(jiti@1.21.7)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1) transitivePeerDependencies: - supports-color @@ -17963,6 +17966,14 @@ snapshots: optionalDependencies: vite: 7.2.2(@types/node@22.19.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1) + '@vitest/mocker@3.2.4(vite@7.2.2(@types/node@24.10.1)(jiti@1.21.7)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1))': + dependencies: + '@vitest/spy': 3.2.4 + estree-walker: 3.0.3 + magic-string: 0.30.21 + optionalDependencies: + vite: 7.2.2(@types/node@24.10.1)(jiti@1.21.7)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1) + '@vitest/mocker@3.2.4(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1))': dependencies: '@vitest/spy': 3.2.4 @@ -25569,6 +25580,27 @@ snapshots: - tsx - yaml + vite-node@3.2.4(@types/node@24.10.1)(jiti@1.21.7)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1): + dependencies: + cac: 6.7.14 + debug: 4.4.3(supports-color@10.2.2) + es-module-lexer: 1.7.0 + pathe: 2.0.3 + vite: 7.2.2(@types/node@24.10.1)(jiti@1.21.7)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1) + transitivePeerDependencies: + - '@types/node' + - jiti + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + vite-node@3.2.4(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1): dependencies: cac: 6.7.14 @@ -25617,6 +25649,22 @@ snapshots: tsx: 4.20.6 yaml: 2.8.1 + vite@7.2.2(@types/node@24.10.1)(jiti@1.21.7)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1): + dependencies: + esbuild: 0.25.11 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + postcss: 8.5.6 + rollup: 4.53.2 + tinyglobby: 0.2.15 + optionalDependencies: + '@types/node': 24.10.1 + fsevents: 2.3.3 + jiti: 1.21.7 + lightningcss: 1.30.2 + tsx: 4.20.6 + yaml: 2.8.1 + vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1): dependencies: esbuild: 0.25.11 @@ -25680,6 +25728,49 @@ snapshots: - tsx - yaml + vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.10.1)(jiti@1.21.7)(jsdom@27.2.0)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1): + dependencies: + '@types/chai': 5.2.3 + '@vitest/expect': 3.2.4 + '@vitest/mocker': 3.2.4(vite@7.2.2(@types/node@24.10.1)(jiti@1.21.7)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1)) + '@vitest/pretty-format': 3.2.4 + '@vitest/runner': 3.2.4 + '@vitest/snapshot': 3.2.4 + '@vitest/spy': 3.2.4 + '@vitest/utils': 3.2.4 + chai: 5.3.3 + debug: 4.4.3(supports-color@10.2.2) + expect-type: 1.2.2 + magic-string: 0.30.21 + pathe: 2.0.3 + picomatch: 4.0.3 + std-env: 3.10.0 + tinybench: 2.9.0 + tinyexec: 0.3.2 + tinyglobby: 0.2.15 + tinypool: 1.1.1 + tinyrainbow: 2.0.0 + vite: 7.2.2(@types/node@24.10.1)(jiti@1.21.7)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1) + vite-node: 3.2.4(@types/node@24.10.1)(jiti@1.21.7)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/debug': 4.1.12 + '@types/node': 24.10.1 + jsdom: 27.2.0 + transitivePeerDependencies: + - jiti + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.10.1)(jiti@2.6.1)(jsdom@27.2.0)(lightningcss@1.30.2)(tsx@4.20.6)(yaml@2.8.1): dependencies: '@types/chai': 5.2.3 From 448412540aaba46550ee6939e14eee8df7a9bb7a Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Sun, 23 Nov 2025 02:47:21 +0000 Subject: [PATCH 2/2] Fix TypeScript type definition for noteHistory field Add noteHistory field to TaskArgsMapTransformed['enhance'] type definition to resolve TypeScript errors in CI Co-Authored-By: yujonglee --- apps/desktop/src/store/zustand/ai-task/task-configs/index.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/apps/desktop/src/store/zustand/ai-task/task-configs/index.ts b/apps/desktop/src/store/zustand/ai-task/task-configs/index.ts index a987b2fb12..19db0afaa8 100644 --- a/apps/desktop/src/store/zustand/ai-task/task-configs/index.ts +++ b/apps/desktop/src/store/zustand/ai-task/task-configs/index.ts @@ -43,6 +43,11 @@ export interface TaskArgsMapTransformed { end_ms: number; }>; }>; + noteHistory?: { + beforeMeeting?: string; + duringMeeting?: string; + afterMeeting?: string; + }; template?: Pick; }; title: {