{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../../src/core/workspace/events.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;CAoBzB,CAAC;AAEX,MAAM,MAAM,uBAAuB,GAAG,CAAC,OAAO,sBAAsB,CAAC,CAAC,MAAM,OAAO,sBAAsB,CAAC,CAAC;AAE3G,MAAM,WAAW,0BAA0B;IAC1C,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACnB;AAED,qFAAqF;AACrF,wBAAgB,oBAAoB,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAQ3G;AAED,MAAM,WAAW,SAAS;IACzB,IAAI,CAAC,OAAO,EAAE,0BAA0B,GAAG,IAAI,CAAC;CAChD;AAED,uDAAuD;AACvD,eAAO,MAAM,QAAQ,EAAE,SAA8B,CAAC;AAEtD,gFAAgF;AAChF,wBAAgB,eAAe,CAAC,MAAM,EAAE,0BAA0B,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAI5F","sourcesContent":["/**\n * Durable workspace-index events. Bounded, sanitized, replayable and free of\n * source-code dumps and secrets.\n */\n\nexport const WORKSPACE_INDEX_EVENTS = {\n\tDISCOVERED: \"WORKSPACE_INDEX_DISCOVERED\",\n\tBUILD_STARTED: \"WORKSPACE_INDEX_BUILD_STARTED\",\n\tFILE_CLASSIFIED: \"WORKSPACE_INDEX_FILE_CLASSIFIED\",\n\tFILE_UPDATED: \"WORKSPACE_INDEX_FILE_UPDATED\",\n\tFILE_REMOVED: \"WORKSPACE_INDEX_FILE_REMOVED\",\n\tCHUNK_CREATED: \"WORKSPACE_INDEX_CHUNK_CREATED\",\n\tSYMBOLS_UPDATED: \"WORKSPACE_INDEX_SYMBOLS_UPDATED\",\n\tEMBEDDING_CREATED: \"WORKSPACE_INDEX_EMBEDDING_CREATED\",\n\tGENERATION_READY: \"WORKSPACE_INDEX_GENERATION_READY\",\n\tBUILD_FAILED: \"WORKSPACE_INDEX_BUILD_FAILED\",\n\tBUILD_CANCELLED: \"WORKSPACE_INDEX_BUILD_CANCELLED\",\n\tCORRUPTION_DETECTED: \"WORKSPACE_INDEX_CORRUPTION_DETECTED\",\n\tREBUILD_STARTED: \"WORKSPACE_INDEX_REBUILD_STARTED\",\n\tREBUILD_COMPLETED: \"WORKSPACE_INDEX_REBUILD_COMPLETED\",\n\tRETRIEVAL_PLANNED: \"WORKSPACE_RETRIEVAL_PLANNED\",\n\tRETRIEVAL_EXECUTED: \"WORKSPACE_RETRIEVAL_EXECUTED\",\n\tRESULT_SELECTED: \"WORKSPACE_RETRIEVAL_RESULT_SELECTED\",\n\tRESULT_REVALIDATED: \"WORKSPACE_RETRIEVAL_RESULT_REVALIDATED\",\n\tRESULT_STALE: \"WORKSPACE_RETRIEVAL_RESULT_STALE\",\n} as const;\n\nexport type WorkspaceIndexEventName = (typeof WORKSPACE_INDEX_EVENTS)[keyof typeof WORKSPACE_INDEX_EVENTS];\n\nexport interface WorkspaceIndexDurableEvent {\n\teventType: string;\n\tworkspaceId: string;\n\tgenerationId?: string;\n\tpath?: string;\n\tcounts?: Record<string, number>;\n\tmodelId?: string;\n\treasonCode?: string;\n\toccurredAt: string;\n}\n\n/** Sanitize an event payload: never leak source content or secret-bearing values. */\nexport function sanitizeEventPayload(payload?: Record<string, unknown>): Record<string, unknown> | undefined {\n\tif (!payload) return undefined;\n\tconst out: Record<string, unknown> = {};\n\tfor (const [k, v] of Object.entries(payload)) {\n\t\tif (typeof v === \"string\" && /(secret|token|key|password|credential)/i.test(k)) continue;\n\t\tout[k] = v;\n\t}\n\treturn out;\n}\n\nexport interface EventSink {\n\temit(payload: WorkspaceIndexDurableEvent): void;\n}\n\n/** No-op sink used when no session/bus is attached. */\nexport const nullSink: EventSink = { emit: () => {} };\n\n/** Aggregates boring per-item events so we don't emit one event per posting. */\nexport function aggregateCounts(events: WorkspaceIndexDurableEvent[]): Record<string, number> {\n\tconst counts: Record<string, number> = {};\n\tfor (const e of events) counts[e.eventType] = (counts[e.eventType] ?? 0) + 1;\n\treturn counts;\n}\n"]}