{"version":3,"sources":["/Users/shyun/comcom/ain-enterprise/ain-adk/dist/cjs/chunk-HVLSBELX.cjs","../../src/controllers/api/document.api.controller.ts"],"names":["items","total"],"mappings":"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","file":"/Users/shyun/comcom/ain-enterprise/ain-adk/dist/cjs/chunk-HVLSBELX.cjs","sourcesContent":[null,"import { randomUUID } from \"node:crypto\";\nimport type { NextFunction, Request, Response } from \"express\";\nimport { StatusCodes } from \"http-status-codes\";\nimport type { MemoryModule } from \"@/modules/index.js\";\nimport type { DocumentAdviceService } from \"@/services/document-advice.service.js\";\nimport type { SchedulerService } from \"@/services/scheduler.service.js\";\nimport type { WorkflowExecutionService } from \"@/services/workflow-execution.service.js\";\nimport { AinHttpError } from \"@/types/agent.js\";\nimport {\n\ttype Document,\n\ttype DocumentAutoRefresh,\n\ttype DocumentFilter,\n\ttype DocumentFilterSet,\n\tDocumentFormat,\n\ttype DocumentListOptions,\n\ttype DocumentSlot,\n\tDocumentSource,\n} from \"@/types/document.js\";\nimport type { PaginatedResult } from \"@/types/list.js\";\nimport { parseAutoRefreshPayload } from \"@/utils/auto-refresh-payload.js\";\nimport { parseListOptions } from \"@/utils/parse-list-options.js\";\nimport { streamEventsToSSE } from \"@/utils/sse-stream.js\";\n\nexport class DocumentApiController {\n\tprivate memoryModule: MemoryModule;\n\tprivate workflowExecutionService: WorkflowExecutionService;\n\tprivate documentAdviceService: DocumentAdviceService;\n\tprivate schedulerService: SchedulerService;\n\n\tconstructor(\n\t\tmemoryModule: MemoryModule,\n\t\tworkflowExecutionService: WorkflowExecutionService,\n\t\tdocumentAdviceService: DocumentAdviceService,\n\t\tschedulerService: SchedulerService,\n\t) {\n\t\tthis.memoryModule = memoryModule;\n\t\tthis.workflowExecutionService = workflowExecutionService;\n\t\tthis.documentAdviceService = documentAdviceService;\n\t\tthis.schedulerService = schedulerService;\n\t}\n\n\tprivate async getAuthorizedDocument(\n\t\tuserId: string,\n\t\tdocumentId: string,\n\t\tauthzChecked = false,\n\t): Promise<Document> {\n\t\tconst documentMemory = this.memoryModule.getDocumentMemory();\n\t\tconst document = await documentMemory?.getDocument(documentId);\n\t\tif (!document) {\n\t\t\tthrow new AinHttpError(StatusCodes.NOT_FOUND, \"Document not found\");\n\t\t}\n\t\t// When the authorize middleware already granted access, skip the\n\t\t// per-owner check (enables cross-user logbook read/write by role).\n\t\t// Otherwise this is an authorization failure, not a missing record: the\n\t\t// document exists (reads are open) but the caller may not write it.\n\t\tif (!authzChecked && document.userId !== userId) {\n\t\t\tthrow new AinHttpError(\n\t\t\t\tStatusCodes.FORBIDDEN,\n\t\t\t\t\"You do not have permission for this document\",\n\t\t\t);\n\t\t}\n\t\treturn document;\n\t}\n\n\tpublic handleGetAllDocuments = async (\n\t\treq: Request,\n\t\tres: Response,\n\t\tnext: NextFunction,\n\t) => {\n\t\ttry {\n\t\t\tconst userId = res.locals.userId || \"\";\n\t\t\tconst documentMemory = this.memoryModule.getDocumentMemory();\n\t\t\tconst {\n\t\t\t\tworkflowId,\n\t\t\t\tthreadId,\n\t\t\t\tsource,\n\t\t\t\tlabels,\n\t\t\t\tdateFrom,\n\t\t\t\tdateTo,\n\t\t\t\tview,\n\t\t\t\tmine,\n\t\t\t} = req.query as {\n\t\t\t\tworkflowId?: string;\n\t\t\t\tthreadId?: string;\n\t\t\t\tsource?: DocumentSource;\n\t\t\t\tlabels?: Record<string, string>;\n\t\t\t\tdateFrom?: string;\n\t\t\t\tdateTo?: string;\n\t\t\t\tview?: string;\n\t\t\t\tmine?: string;\n\t\t\t};\n\t\t\tconst baseFilter: DocumentFilter = {\n\t\t\t\tworkflowId,\n\t\t\t\tthreadId,\n\t\t\t\tsource,\n\t\t\t\tlabels,\n\t\t\t\tdateFrom: typeof dateFrom === \"string\" ? dateFrom : undefined,\n\t\t\t\tdateTo: typeof dateTo === \"string\" ? dateTo : undefined,\n\t\t\t};\n\t\t\tconst listOptions = parseListOptions(\n\t\t\t\treq.query as Record<string, unknown>,\n\t\t\t);\n\t\t\tconst options: DocumentListOptions = {\n\t\t\t\t...(listOptions ?? {}),\n\t\t\t\tsummary: view === \"summary\",\n\t\t\t};\n\n\t\t\t// RBAC scopes as an OR-set of (userId, filter) pairs. Single query\n\t\t\t// (when the provider supports it) keeps skip/limit/count correct.\n\t\t\tconst authzFilters = res.locals.authzFilters as\n\t\t\t\t| DocumentFilter[]\n\t\t\t\t| undefined;\n\t\t\tlet filterSets: DocumentFilterSet[];\n\t\t\tif (mine === \"1\" || mine === \"true\") {\n\t\t\t\t// Caller-requested narrowing to its own rows (e.g. a \"my documents\"\n\t\t\t\t// page). Always narrower than the read policy allows, so it needs no\n\t\t\t\t// authz of its own.\n\t\t\t\tfilterSets = [{ userId, filter: baseFilter }];\n\t\t\t} else if (res.locals.authzListAll) {\n\t\t\t\tfilterSets = [{ filter: baseFilter }];\n\t\t\t} else if (authzFilters?.length) {\n\t\t\t\tfilterSets = [\n\t\t\t\t\t{ userId, filter: baseFilter },\n\t\t\t\t\t...authzFilters.map((f) => ({\n\t\t\t\t\t\tfilter: {\n\t\t\t\t\t\t\t...baseFilter,\n\t\t\t\t\t\t\tlabels: { ...(labels ?? {}), ...(f.labels ?? {}) },\n\t\t\t\t\t\t},\n\t\t\t\t\t})),\n\t\t\t\t];\n\t\t\t} else {\n\t\t\t\tfilterSets = [{ userId, filter: baseFilter }];\n\t\t\t}\n\n\t\t\tconst { items, total } = await this.listDocumentsBySets(\n\t\t\t\tdocumentMemory,\n\t\t\t\tfilterSets,\n\t\t\t\toptions,\n\t\t\t);\n\n\t\t\tif (listOptions) {\n\t\t\t\tconst body: PaginatedResult<Document> = {\n\t\t\t\t\titems,\n\t\t\t\t\ttotal,\n\t\t\t\t\tlimit: listOptions.limit,\n\t\t\t\t\toffset: listOptions.offset,\n\t\t\t\t};\n\t\t\t\tres.json(body);\n\t\t\t} else {\n\t\t\t\tres.json(items);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tnext(error);\n\t\t}\n\t};\n\n\t/**\n\t * Union of the filter sets via the provider's single-query method when\n\t * available; otherwise per-set fetch merged in memory. The fallback also\n\t * emulates date range, summary and offset/limit so old providers stay\n\t * correct (just slower).\n\t */\n\tprivate async listDocumentsBySets(\n\t\tmemory: ReturnType<MemoryModule[\"getDocumentMemory\"]>,\n\t\tfilterSets: DocumentFilterSet[],\n\t\toptions: DocumentListOptions,\n\t): Promise<{ items: Document[]; total: number }> {\n\t\tif (!memory) return { items: [], total: 0 };\n\n\t\tif (memory.listDocumentsAny) {\n\t\t\tconst items = await memory.listDocumentsAny(filterSets, options);\n\t\t\tconst total =\n\t\t\t\toptions.limit !== undefined && memory.countDocumentsAny\n\t\t\t\t\t? await memory.countDocumentsAny(filterSets)\n\t\t\t\t\t: items.length;\n\t\t\treturn { items, total };\n\t\t}\n\n\t\tconst sets = await Promise.all(\n\t\t\tfilterSets.map((s) => memory.listDocuments(s.userId, s.filter)),\n\t\t);\n\t\tconst byId = new Map<string, Document>();\n\t\tfor (const d of sets.flat()) byId.set(d.documentId, d);\n\n\t\tconst { dateFrom, dateTo } = filterSets[0]?.filter ?? {};\n\t\tlet items = [...byId.values()];\n\t\tif (dateFrom || dateTo) {\n\t\t\titems = items.filter((d) => {\n\t\t\t\tconst date = d.labels?.date;\n\t\t\t\tif (!date) return false;\n\t\t\t\tif (dateFrom && date < dateFrom) return false;\n\t\t\t\tif (dateTo && date > dateTo) return false;\n\t\t\t\treturn true;\n\t\t\t});\n\t\t}\n\t\titems.sort(\n\t\t\t(a, b) =>\n\t\t\t\tString(b.updatedAt ?? \"\").localeCompare(String(a.updatedAt ?? \"\")) ||\n\t\t\t\tb.documentId.localeCompare(a.documentId),\n\t\t);\n\t\tconst total = items.length;\n\t\tif (options.limit !== undefined || options.offset) {\n\t\t\tconst start = options.offset ?? 0;\n\t\t\titems = items.slice(\n\t\t\t\tstart,\n\t\t\t\toptions.limit !== undefined ? start + options.limit : undefined,\n\t\t\t);\n\t\t}\n\t\tif (options.summary) {\n\t\t\titems = items.map(({ slots: _slots, ...rest }) => rest as Document);\n\t\t}\n\t\treturn { items, total };\n\t}\n\n\tpublic handleGetDocument = async (\n\t\treq: Request,\n\t\tres: Response,\n\t\tnext: NextFunction,\n\t) => {\n\t\ttry {\n\t\t\tconst userId = res.locals.userId || \"\";\n\t\t\tconst { id } = req.params as { id: string };\n\t\t\tconst document = await this.getAuthorizedDocument(\n\t\t\t\tuserId,\n\t\t\t\tid,\n\t\t\t\tres.locals.authzChecked === true,\n\t\t\t);\n\t\t\tres.json(document);\n\t\t} catch (error) {\n\t\t\tnext(error);\n\t\t}\n\t};\n\n\tpublic handleUpdateDocument = async (\n\t\treq: Request,\n\t\tres: Response,\n\t\tnext: NextFunction,\n\t) => {\n\t\ttry {\n\t\t\tconst userId = res.locals.userId || \"\";\n\t\t\tconst { id } = req.params as { id: string };\n\t\t\tconst existing = await this.getAuthorizedDocument(\n\t\t\t\tuserId,\n\t\t\t\tid,\n\t\t\t\tres.locals.authzChecked === true,\n\t\t\t);\n\n\t\t\tconst { title, content, slots, labels } = req.body as {\n\t\t\t\ttitle?: string;\n\t\t\t\tcontent?: string;\n\t\t\t\tslots?: DocumentSlot[];\n\t\t\t\tlabels?: Record<string, string>;\n\t\t\t};\n\n\t\t\tconst updates: Partial<Document> = {\n\t\t\t\tversion: existing.version + 1,\n\t\t\t\teditedManually: true,\n\t\t\t\tupdatedAt: new Date().toISOString(),\n\t\t\t};\n\t\t\tif (title !== undefined) {\n\t\t\t\tupdates.title = title;\n\t\t\t}\n\t\t\tif (content !== undefined) {\n\t\t\t\tupdates.content = content;\n\t\t\t}\n\t\t\tif (slots !== undefined) {\n\t\t\t\tupdates.slots = slots;\n\t\t\t}\n\t\t\tif (labels !== undefined) {\n\t\t\t\tupdates.labels = labels;\n\t\t\t}\n\n\t\t\tawait this.memoryModule.getDocumentMemory()?.updateDocument(id, updates);\n\t\t\tres.status(StatusCodes.OK).send();\n\t\t} catch (error) {\n\t\t\tnext(error);\n\t\t}\n\t};\n\n\t/**\n\t * Updates only a single slot's workflow executionVariables (merge, not\n\t * replace). Exists as a separate endpoint so variable edits don't have to\n\t * round-trip the whole document — full-document update payloads can be\n\t * blocked by customer-side network policies (WAF) inspecting the body.\n\t */\n\tpublic handleUpdateSlotVariables = async (\n\t\treq: Request,\n\t\tres: Response,\n\t\tnext: NextFunction,\n\t) => {\n\t\ttry {\n\t\t\tconst userId = res.locals.userId || \"\";\n\t\t\tconst { id, slotId } = req.params as { id: string; slotId: string };\n\t\t\tconst document = await this.getAuthorizedDocument(\n\t\t\t\tuserId,\n\t\t\t\tid,\n\t\t\t\tres.locals.authzChecked === true,\n\t\t\t);\n\n\t\t\tconst slot = document.slots?.find((s) => s.slotId === slotId);\n\t\t\tif (!slot) {\n\t\t\t\tthrow new AinHttpError(\n\t\t\t\t\tStatusCodes.NOT_FOUND,\n\t\t\t\t\t\"Document slot not found\",\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (slot.binding?.type !== \"WORKFLOW\") {\n\t\t\t\tthrow new AinHttpError(\n\t\t\t\t\tStatusCodes.BAD_REQUEST,\n\t\t\t\t\t\"Slot has no workflow binding\",\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst { executionVariables } = req.body as {\n\t\t\t\texecutionVariables?: Record<string, unknown>;\n\t\t\t};\n\t\t\tif (\n\t\t\t\t!executionVariables ||\n\t\t\t\ttypeof executionVariables !== \"object\" ||\n\t\t\t\tArray.isArray(executionVariables) ||\n\t\t\t\tObject.values(executionVariables).some((v) => typeof v !== \"string\")\n\t\t\t) {\n\t\t\t\tthrow new AinHttpError(\n\t\t\t\t\tStatusCodes.BAD_REQUEST,\n\t\t\t\t\t\"executionVariables must be a string-valued object\",\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Atomic single-slot patch (not a whole-slots rewrite): a concurrent\n\t\t\t// fill of another slot must not be clobbered by this edit's snapshot.\n\t\t\t// updateDocumentSlot bumps version/updatedAt in the same write.\n\t\t\tawait this.memoryModule\n\t\t\t\t.getDocumentMemory()\n\t\t\t\t?.updateDocumentSlot(id, slotId, {\n\t\t\t\t\tbinding: {\n\t\t\t\t\t\t...slot.binding,\n\t\t\t\t\t\texecutionVariables: {\n\t\t\t\t\t\t\t...slot.binding.executionVariables,\n\t\t\t\t\t\t\t...(executionVariables as Record<string, string>),\n\t\t\t\t\t\t},\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\tres.status(StatusCodes.OK).send();\n\t\t} catch (error) {\n\t\t\tnext(error);\n\t\t}\n\t};\n\n\tpublic handleDeleteDocument = async (\n\t\treq: Request,\n\t\tres: Response,\n\t\tnext: NextFunction,\n\t) => {\n\t\ttry {\n\t\t\tconst userId = res.locals.userId || \"\";\n\t\t\tconst { id } = req.params as { id: string };\n\t\t\tawait this.getAuthorizedDocument(\n\t\t\t\tuserId,\n\t\t\t\tid,\n\t\t\t\tres.locals.authzChecked === true,\n\t\t\t);\n\n\t\t\tawait this.memoryModule.getDocumentMemory()?.deleteDocument(id);\n\t\t\tthis.schedulerService.removeDocumentAutoRefresh(id);\n\t\t\tres.status(StatusCodes.OK).send();\n\t\t} catch (error) {\n\t\t\tnext(error);\n\t\t}\n\t};\n\n\t/**\n\t * Soft delete: marks the document hidden instead of removing it. Hidden\n\t * documents drop out of every read path (the provider filters them), so\n\t * this is what user-facing \"delete\" buttons call. Hard delete stays on\n\t * `delete/:id` for admin tooling.\n\t */\n\tpublic handleHideDocument = async (\n\t\treq: Request,\n\t\tres: Response,\n\t\tnext: NextFunction,\n\t) => {\n\t\ttry {\n\t\t\tconst userId = res.locals.userId || \"\";\n\t\t\tconst { id } = req.params as { id: string };\n\t\t\tawait this.getAuthorizedDocument(\n\t\t\t\tuserId,\n\t\t\t\tid,\n\t\t\t\tres.locals.authzChecked === true,\n\t\t\t);\n\n\t\t\tawait this.memoryModule\n\t\t\t\t.getDocumentMemory()\n\t\t\t\t?.updateDocument(id, { hidden: true });\n\t\t\tthis.schedulerService.removeDocumentAutoRefresh(id);\n\t\t\tres.status(StatusCodes.OK).send();\n\t\t} catch (error) {\n\t\t\tnext(error);\n\t\t}\n\t};\n\n\tpublic handleCreateDocument = async (\n\t\treq: Request,\n\t\tres: Response,\n\t\tnext: NextFunction,\n\t) => {\n\t\ttry {\n\t\t\tconst userId = res.locals.userId || \"\";\n\t\t\tconst documentMemory = this.memoryModule.getDocumentMemory();\n\t\t\tconst { title, content, slots, labels, format, autoRefresh } =\n\t\t\t\treq.body as {\n\t\t\t\t\ttitle?: string;\n\t\t\t\t\tcontent?: string;\n\t\t\t\t\tslots?: DocumentSlot[];\n\t\t\t\t\tlabels?: Record<string, string>;\n\t\t\t\t\tformat?: DocumentFormat;\n\t\t\t\t\tautoRefresh?: unknown;\n\t\t\t\t};\n\n\t\t\tconst now = new Date().toISOString();\n\t\t\tconst document: Document = {\n\t\t\t\tdocumentId: randomUUID(),\n\t\t\t\tuserId,\n\t\t\t\ttitle: title ?? \"Untitled\",\n\t\t\t\tformat: format ?? DocumentFormat.MARKDOWN,\n\t\t\t\tcontent: content ?? \"\",\n\t\t\t\tslots,\n\t\t\t\tlabels,\n\t\t\t\tsource: DocumentSource.MANUAL,\n\t\t\t\tversion: 1,\n\t\t\t\tcreatedAt: now,\n\t\t\t\tupdatedAt: now,\n\t\t\t};\n\t\t\tif (autoRefresh !== undefined) {\n\t\t\t\ttry {\n\t\t\t\t\tdocument.autoRefresh = parseAutoRefreshPayload({ autoRefresh });\n\t\t\t\t} catch (error) {\n\t\t\t\t\tthrow new AinHttpError(\n\t\t\t\t\t\tStatusCodes.BAD_REQUEST,\n\t\t\t\t\t\t(error as Error).message,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst created = await documentMemory?.createDocument(document);\n\t\t\t// Only notify when an auto-refresh was actually set: skip the\n\t\t\t// scheduler call on the (default) create-without-autoRefresh path,\n\t\t\t// since removeDocumentAutoRefresh's no-op branch would otherwise run\n\t\t\t// on every single document creation for no reason.\n\t\t\tif (document.autoRefresh) {\n\t\t\t\tthis.schedulerService.notifyDocumentAutoRefresh(created ?? document);\n\t\t\t}\n\t\t\tres.status(StatusCodes.CREATED).json(created ?? document);\n\t\t} catch (error) {\n\t\t\tnext(error);\n\t\t}\n\t};\n\n\tpublic handleSetAutoRefresh = async (\n\t\treq: Request,\n\t\tres: Response,\n\t\tnext: NextFunction,\n\t) => {\n\t\ttry {\n\t\t\tconst userId = res.locals.userId || \"\";\n\t\t\tconst { id } = req.params as { id: string };\n\t\t\tawait this.getAuthorizedDocument(\n\t\t\t\tuserId,\n\t\t\t\tid,\n\t\t\t\tres.locals.authzChecked === true,\n\t\t\t);\n\n\t\t\tlet autoRefresh: DocumentAutoRefresh | null;\n\t\t\ttry {\n\t\t\t\tautoRefresh = parseAutoRefreshPayload(req.body);\n\t\t\t} catch (error) {\n\t\t\t\tthrow new AinHttpError(\n\t\t\t\t\tStatusCodes.BAD_REQUEST,\n\t\t\t\t\t(error as Error).message,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst documentMemory = this.memoryModule.getDocumentMemory();\n\t\t\tawait documentMemory?.updateDocument(id, {\n\t\t\t\tautoRefresh,\n\t\t\t} as Partial<Document>);\n\t\t\tconst updated = await documentMemory?.getDocument(id);\n\t\t\tif (updated) {\n\t\t\t\tthis.schedulerService.notifyDocumentAutoRefresh(updated);\n\t\t\t}\n\t\t\tres.status(StatusCodes.OK).json(updated?.autoRefresh ?? null);\n\t\t} catch (error) {\n\t\t\tnext(error);\n\t\t}\n\t};\n\n\tpublic handleFillSlot = async (\n\t\treq: Request,\n\t\tres: Response,\n\t\tnext: NextFunction,\n\t) => {\n\t\ttry {\n\t\t\tconst userId = res.locals.userId || \"\";\n\t\t\tconst { id, slotId } = req.params as { id: string; slotId: string };\n\t\t\tawait this.getAuthorizedDocument(\n\t\t\t\tuserId,\n\t\t\t\tid,\n\t\t\t\tres.locals.authzChecked === true,\n\t\t\t);\n\n\t\t\tconst { workflowId, executionVariables } = req.body as {\n\t\t\t\tworkflowId?: string;\n\t\t\t\texecutionVariables?: Record<string, string>;\n\t\t\t};\n\t\t\tconst result = await this.workflowExecutionService.fillDocumentSlot(\n\t\t\t\tid,\n\t\t\t\tslotId,\n\t\t\t\t{\n\t\t\t\t\tworkflowId,\n\t\t\t\t\texecutionVariables,\n\t\t\t\t\tinitiator: { type: \"manual\", userId },\n\t\t\t\t},\n\t\t\t);\n\t\t\t// fillDocumentSlot throws on failure, so resolving here means the\n\t\t\t// manual fill succeeded — reconcile it into the auto-refresh ledger\n\t\t\t// (never throws) so the badge and boot catch-up stay in sync.\n\t\t\tawait this.schedulerService.reconcileManualSlotFill(id, slotId);\n\t\t\tres.status(StatusCodes.OK).json(result);\n\t\t} catch (error) {\n\t\t\tnext(error);\n\t\t}\n\t};\n\n\tpublic handleFillSlotStream = async (req: Request, res: Response) => {\n\t\tconst userId = res.locals.userId || \"\";\n\t\tconst { id, slotId } = req.params as { id: string; slotId: string };\n\n\t\tawait streamEventsToSSE(req, res, {\n\t\t\tlogLabel: \"Document slot fill stream\",\n\t\t\tuserId,\n\t\t\tlogContext: { documentId: id, slotId },\n\t\t\t// Same reconciliation as the non-stream fill path, wired to the\n\t\t\t// stream's successful completion instead of promise resolution.\n\t\t\tonComplete: () =>\n\t\t\t\tthis.schedulerService.reconcileManualSlotFill(id, slotId),\n\t\t\tsetup: async (signal) => {\n\t\t\t\tawait this.getAuthorizedDocument(\n\t\t\t\t\tuserId,\n\t\t\t\t\tid,\n\t\t\t\t\tres.locals.authzChecked === true,\n\t\t\t\t);\n\t\t\t\tconst { workflowId, executionVariables } = req.body as {\n\t\t\t\t\tworkflowId?: string;\n\t\t\t\t\texecutionVariables?: Record<string, string>;\n\t\t\t\t};\n\t\t\t\treturn this.workflowExecutionService.fillDocumentSlotStream(\n\t\t\t\t\tid,\n\t\t\t\t\tslotId,\n\t\t\t\t\t{\n\t\t\t\t\t\tworkflowId,\n\t\t\t\t\t\texecutionVariables,\n\t\t\t\t\t\tinitiator: { type: \"manual\", userId },\n\t\t\t\t\t},\n\t\t\t\t\tsignal,\n\t\t\t\t);\n\t\t\t},\n\t\t});\n\t};\n\n\tpublic handleGenerateAdviceStream = async (req: Request, res: Response) => {\n\t\tconst userId = res.locals.userId || \"\";\n\t\tconst { id } = req.params as { id: string };\n\n\t\tawait streamEventsToSSE(req, res, {\n\t\t\tlogLabel: \"Document advice stream\",\n\t\t\tuserId,\n\t\t\tlogContext: { documentId: id },\n\t\t\tsetup: async (signal) => {\n\t\t\t\tawait this.getAuthorizedDocument(\n\t\t\t\t\tuserId,\n\t\t\t\t\tid,\n\t\t\t\t\tres.locals.authzChecked === true,\n\t\t\t\t);\n\t\t\t\tconst { advicePrompt, adviceWorkflowId, executionVariables } =\n\t\t\t\t\treq.body as {\n\t\t\t\t\t\tadvicePrompt?: string;\n\t\t\t\t\t\tadviceWorkflowId?: string;\n\t\t\t\t\t\texecutionVariables?: Record<string, string>;\n\t\t\t\t\t};\n\t\t\t\tif (adviceWorkflowId) {\n\t\t\t\t\treturn this.workflowExecutionService.generateDocumentAdviceStream(\n\t\t\t\t\t\tid,\n\t\t\t\t\t\t{ workflowId: adviceWorkflowId, executionVariables },\n\t\t\t\t\t\tsignal,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\treturn this.documentAdviceService.generateAdviceStream(\n\t\t\t\t\tid,\n\t\t\t\t\t{ advicePrompt },\n\t\t\t\t\tsignal,\n\t\t\t\t);\n\t\t\t},\n\t\t});\n\t};\n}\n"]}